Помощь - Поиск - Пользователи - Календарь
Полная версия: разбиение числа
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
medved777
Пожалуйста, помогите исправить программу. Очень прошу.
Условия задачи

Дано число. Удалить минимальную цифру


 program pract7_2;
const nm=100;
type tmasm=array[1..nm] of longint;
var i,col,k,n:byte; ch,p:longint; z,kol:tmasm;m:real;
procedure razb(ch:longint;var k:byte;var z:tmasm);
begin
k:=0;
while ch<>0 do begin
inc(k);
z[k]:=ch mod 10;
ch:=ch div 10;end;
end;
function min(n:byte;kol:tmasm):real;
var i:byte;mn,m:real;
begin
mn:=kol[1];
for i:=1 to n do
if kol[i]<mn then mn:=kol[i];
if kol[i]=mn then min:=mn;
m:=min(n,kol);
end;
begin
writeln;
writeln('vvedite chiclo');
read(ch);
razb(ch,col,z);
k:=0;
z[i]:=z[n-i+1];
for i:=1 to col do
if z[i]<>m then begin inc(k);z[k]:=z[i];end;
p:=z[k];
case z[i] of
0..9:p:=p*10+z[i];
10..99:p:=p*100+z[i];
end;
writeln('preobrazovanoe chiclo:');
writeln(p);
end.

мисс_граффити
function min(n:byte;kol:tmasm):real;
var i:byte;mn,m:real;
begin
mn:=kol[1];
for i:=1 to n do
if kol[i]<mn then mn:=kol[i];
if kol[i]=mn then min:=mn; {вот это выполняется не в цикле. так и задумано?}
m:=min(n,kol);
end;


begin
writeln;
writeln('vvedite chiclo');
read(ch);
razb(ch,col,z);
k:=0;
z[i]:=z[n-i+1]; {что такое i? типа тут должен быть цикл? и вообще, что эта строка должна делать?}
for i:=1 to col do
if z[i]<>m then {что такое m и чему оно равно? на real может дать "не равно", даже если тебе кажется, что "равно"}
begin inc(k);z[k]:=z[i];end;
p:=z[k];
case z[i] of {опять же - что за i?}
0..9:p:=p*10+z[i];
10..99:p:=p*100+z[i];
end;
writeln('preobrazovanoe chiclo:');
writeln(p);
end.

разберись с границами циклов...
+если не сложно, поясни, что ты делаешь...
по-моему, много лишнего - если задача именно такая, как здесь написано.
Гость
Для начала, функция min должна выглядеть либо так:
function min(n:byte;kol:tmasm):byte;
var i:byte;mn,m:byte;
begin
mn:=kol[1];
for i:=2 to n do
if kol[i]<mn then mn:=kol[i];
min:=mn;
end;
либо так:
function min(n:byte;kol:tmasm):byte;
var i:byte;
begin
if n=1 then min:=kol[1] else begin
i:=min (n-1,kol);
if kol[n]<i then min:=kol[n] else min:=i;
end;
end;

У тебя что-то среднее, да и не вызывается она нигде.. пропустил наверное m:=min (col,z); И real везде убери - ни к чему он.
volvo
Цитата
Дано число. Удалить минимальную цифру
Введено число 121...

Что будешь удалять?
medved777
Вероятно, предполагается, что минимальная цифра одна.
volvo
Я бы делал без перевода в строку... Если дано число - работаем с числом:

function min(X: integer): integer;
var T: integer;
begin
if X < 10 then min := X
else begin

T := min(X div 10);

if X mod 10 < T then min := X mod 10
else min := T;

end;
end;

function delete_digit(X, digit: integer): integer;
var T, ten: integer;
begin
T := 0; ten := 1;
while X > 0 do begin

if X mod 10 <> digit then begin
T := T + ten * (X mod 10);
ten := ten * 10;
end;

X := X div 10;

end;
delete_digit := T;
end;

var
X: integer;
begin
write('X = '); readln(X);
writeln('result = ', delete_digit(X, min(X)));
end.
(убирает как одну, так и несколько минимальных цифр)...
medved777
Огромное преогромное спасибо!
klem4
Что-то вспомнил я про эту задау, перед тем как запостить решение, смотрю, 1 в 1 как у Volvo smile.gif Щас подумал и вот еще одно решение, с одним циклом, но только для чисел с одной минимальной цифрой

function _delete(const n: LongInt): LongInt;
var
_result, temp, tenPower: LongInt;
min: Byte;

begin

temp := n; tenPower := 10;

min := 255;

while temp > 0 do begin

if temp mod 10 < min then begin
min := temp mod 10;
_result := (n div tenPower) * tenPower div 10;
if tenPower > 10 then
_result := _result + n mod (tenPower div 10);
end;

temp := temp div 10; tenPower := tenPower * 10;
end;

_delete := _result;
end;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.