Консультация № 178570
22.05.2010, 19:46
0.00 руб.
0 10 1
Дороги эксперты,помогите мне исправить программку.
Немогли вы бы мне исправить..нахождения суммы чисел?

Приложение:
program pr1;
type cifra=0..9;
chislo=array [1..1000] of cifra;
VAR m,m1,m2,m3,m4,m5:chislo;n,i,j,g,p,k,c:integer;

begin
{vvod chisel}
writeln('vvedi n');
readln(n);
writeln('vvedi 1oe chislo');
for i:=1 to n do
read(m[i]);
writeln('vvedi 2oe chislo');
for i:=1 to n do
read(m1[i]);
{summa chisel}
p:=0;c:=0;
for i:=1 to n do begin
k:=m[i]+m1[i]+p;
if (k>=0) and (k<=9) then begin p:=0; m3[i]:=k; end
else begin p:=1; m3[i]:=k mod 10; end;
end;
if p>0 then begin
for i:=1 to n do begin
m4[1]:=p; m4[i+1]:=m3[i];c:=n+1;
end; end
else begin
for i:=1 to n do begin
m4[i]:=m3[i]; c:=n;
end;end;

writeln('summa=');
for i:=1 to c do
write(' ',m4[i]);
{vichitanie}
p:=0;k:=0;

if m[1]>m1[1] then


for i:=n downto 1 do begin
k:=m[i]-m1[i];
if k<0 then begin m[i-1]:=m[i-1]-1;m5[i]:=(m[i]+10)-m1[i];end
else m5[i]:=m[i]-m1[i];
k:=0;

writeln(' raznots=');
for i:=1 to n do
write(' ',m5[i]);

end
else
for i:=n downto 1 do begin
k:=m1[i]-m[i];
if k<0 then begin m1[i-1]:=m1[i-1]-1;m5[i]:=(m1[i]+10)-m[i];end
else m5[i]:=m1[i]-m[i];
k:=0;
end;
write(' raznots= -');
for i:=1 to n do
write(' ',m5[i]);
end.

Обсуждение

давно
Академик
320937
2216
23.05.2010, 00:26
общий
Сергей Маринин:
Добрый вечер! Немножко "пошерстил" программу в части сложения, вычитание не смотрел, так как в вопросе не было. То, что Вы хотели видеть?
Код:
program pr1;
type cifra=0..9;
chislo=array [1..1000] of cifra;
VAR
m,m1,m2,m3,m5:chislo;n,i,j,g,p,k,c:integer;

begin

{vvod chisel}
write('vvedi n ');
readln(n);

write('vvedi 1oe chislo ');
for i:=1 to n do
read(m[i]);

write('vvedi 2oe chislo ');
for i:=1 to n do
read(m1[i]);

{summa chisel}
p:=0;
for i:=n downto 1 do begin
k:=m[i]+m1[i]+p;
p := k div 10;
m3[i] := k mod 10;
end;

if p>0 then begin
n:= n+1;
for i:= n downto 2 do
m3[i] := m3[i-1];
m3[1] := 1;
end;

write('summa=');
for i:=1 to n do
write(m3[i]);
writeln;

(*
{vichitanie}
p:=0;
k:=0;

if m[1]>m1[1] then


for i:=n downto 1 do begin
k:=m[i]-m1[i];
if k<0 then begin m[i-1]:=m[i-1]-1;m5[i]:=(m[i]+10)-m1[i];end
else m5[i]:=m[i]-m1[i];
k:=0;

writeln(' raznots=');
for i:=1 to n do
write(' ',m5[i]);

end
else
for i:=n downto 1 do begin
k:=m1[i]-m[i];
if k<0 then begin m1[i-1]:=m1[i-1]-1;m5[i]:=(m1[i]+10)-m[i];end
else m5[i]:=m1[i]-m[i];
k:=0;
end;
write(' raznots= -');
for i:=1 to n do
write(' ',m5[i]);
*)
end.

Неизвестный
23.05.2010, 10:51
общий
lamed:
ну в принципе да,но когда я ввожу двузнвчное чило,например 14+14 то результат у меня выводит 18. почему так?
давно
Академик
320937
2216
23.05.2010, 11:25
общий
Сергей Маринин:
Код:

vvedi n 2
vvedi 1oe chislo 1 4
vvedi 2oe chislo 1 4
summa=28
Неизвестный
23.05.2010, 12:19
общий
lamed:
а можно как то сделать,чтобы норм вводить?(нечерез пробел)
давно
Академик
320937
2216
23.05.2010, 12:32
общий
Сергей Маринин:
Можно, например, читать строку цифр, потом "перегонять" в массив.
Можно читать каждое нажатие клавиши
Можно GotoXY.
Неизвестный
24.05.2010, 16:09
общий
Сергей Маринин:
То есть, например, перед каждым Read(m[i]) написать GotoXY(WhereX-1, WhereY); Про операторные скобки не забудьте (begin ... end)
Естественно, что надо подключить модуль CRT (uses CRT).
Справитесь?
Неизвестный
24.05.2010, 16:46
общий
lamed:
Не знаю даже.может и да..Не могли бы сами добавить,просто я могу запутаться.


А вычитание,правильно?
Заранее благодарен
давно
Академик
320937
2216
24.05.2010, 18:27
общий
Сергей Маринин:
Добрый день. Завтра сделаю.
давно
Академик
320937
2216
25.05.2010, 20:46
общий
это ответ
Здравствуйте, Сергей Маринин! Немножко упростил программу, старался не менять стиль, поэтому, в частности, функции не использовал. Чтобы упростить вычитание, пришлось пойти на побочный эффект, если второе число больше первого, меняем их местами.
Если требуются комментарии - пожалуйста, в мини-форум.
Код:
program pr1;
{ программа работает только с неотрицательными числами одинаковой длины }
{ порядок работы:
1. ввести число цифр n
2. ввести n цифр первого числа: цифра, ввод, цифра, ввод, и т.д.
3. ввести n цифр второго числа: цифра, ввод, цифра, ввод, и т.д.
Если одно из чисел должно быть короче другого, вставляем впереди
необходимое количество нулей, например, чтобы сложить 1+22,
вводим
длину числа 2,
0, ввод, 1, ввод
2, ввод, 2, ввод
}

uses
crt;
type cifra=0..9;
chislo=array [1..1000] of cifra;
VAR
minus : boolean;
m1,m2,sum,razn, vrem : chislo;
n, i, p, k : integer;
X,Y : integer;

begin

{vvod chisel}
write('vvedi n ');
readln(n);

write('vvedi 1oe chislo ');
(* после каждой цифры набираете Enter *)
X:= WhereX;
Y:= WhereY;
for i:=1 to n do
begin
GotoXY(X+i, Y);
readln(m1[i]);
end;

write('vvedi 2oe chislo ');
X:= WhereX;
Y:= WhereY;
for i:=1 to n do
begin
GotoXY(X+i, Y);
readln(m2[i]);
end;

{summa chisel}
p:=0;
for i:=n downto 1 do begin
k:=m1[i]+m2[i]+p;
p := k div 10;
sum[i] := k mod 10;
end;

if p>0 then begin
n:= n+1;
for i:= n downto 2 do
sum[i] := sum[i-1];
sum[1] := 1;
end;

write('summa=');
for i:=1 to n do
write(sum[i]);
writeln;

{sravnenie}
minus := false; (* пока счмтаем разность неотрицательной *)
for i:= 1 to n do
if m1[i] > m2[i] then
break
else if m1[i]<m2[i] then
begin
minus := true;
break;
end;

if minus then (* обмен m1 и m2 *)
begin
vrem := m1;
m1 := m2;
m2 := vrem;
end;

{vichitanie}
p:=1;
for i:=n downto 1 do begin
k:=m1[i]-m2[i]-(1-p);
if k>=0 then
p:= 1
else
begin
k:= k+10;
p := 0;
end;
razn[i] := k;
end;

write('raznost=');
i:= 1;
while (i<=n) and (razn[i]=0) do
i := i+1;
if (i=n+1) then
write('0')
else
begin
if minus then
write('-');
while (i<=n) do
begin
write(razn[i]);
i:= i+1;
end;
end;
writeln;

end.

Неизвестный
07.06.2010, 20:10
общий
Да! Сергей Маринин - еще одно исправление: "Не" пишется отдельно
Форма ответа