-9

Нестандартная задачка по информатике

Задача :
Сложите два n-значных числа ( n не больше 255) используя переменную string .
Вот что я написал , вроде схема рабочая , но не работает . Помогите найти где ошибка , заранее благодарен .

program two;
uses crt ;
var a,b,x,y,k,s:string;
pr,sm,ca,cb,i,z,v:integer ;



Begin
clrscr;
writeln (' vvedite stroku');
readln(a);
writeln (' vvedite stroku');
readln(b);
k:='';
x:='';
y:='';
pr:=0;
sm:=0;

for i:=1 to length(a) do
x:=x+a[i];
y:='';
for i:=1 to length(b) do
y:=y+b[i];
while (y='') or (x='') do
begin
val(x[1],ca,z);
val(y[1],cb,v);
sm:=(ca+cb)mod 10 ;
pr:=(ca+cb)div 10 + sm;
str(sm,s);
k:=s+k;
end;
writeln (k) ;
readkey;
end .

Дубликаты не найдены

+1
обожаю читать неформатированные коды
+1
Заминусовали меня - топорика в программирование
раскрыть ветку 1
0
бля, ты хотел в топ выйти или задачу решить?
0
Ээ.
Пробелы между скобками и названиями функции. Wtf
0
вроде схема рабочая , но не работает
0
Почему бы не попробовать использовать type
раскрыть ветку 1
+1
Это то да , но задание видите сами какое)
0
Я, честно говоря, паскаль уже плохо помню, но непонятно назначение двух циклов со счетчиком. И почему нельзя сразу переменную a и b преобразовать в числа и просто сложить их? Ну и собственно, когда вы в цикле while вызываете функцию Val, то почему x[1], а не x[итератор]?
раскрыть ветку 1
+1
1) Нельзя преобразовать так как integer не может в 225 знаков .
2)Цикл начинается с for , и каждый раз берется следующая переменная , то есть для i первого (1) берем 1 , а дальше цикл будет повторяться
0
Давно в руки не брал паскаль, уже не помню что делает val(), но меня смущает использование неинициализированных переменных z,v, плюс ты используешь цикл, но условие выхода из него недостижим, так как внутри цикла переменные x,y не меняются (На самом деле я вообще сомневаюсь, что в цикл можно зайти, строки то не пустые). К тому же, почему берется всегда только первый элемент val(x[1],ca,z)? Может там должна быть какая то переменная или на каждой итерации цикла должны "откусываться" элементы строк?

Плюс вот этот момент
for i:=1 to length(a) do
x:=x+a[i];
по факту он ничего не делает. Мне кажется вы таким образом пытались реверсировать строку, наверное тогда правильнее было бы написать так:
for i:=1 to length(a) do
x:=a[i] + x;
раскрыть ветку 12
+1
Насчет реверса - да Вы правы . Возможно вы правы , но я не понимаю , ведь перестановка слагаемых не меняет результат?
раскрыть ветку 3
0
а="пупкин";
б="иван"
в=а+б
г=б+а
имеем В равное "пупкин иван", Г равное иван пупкин
0
Это не сложение, а конкатенация, это разные операции и конкатенация не обладает коммутативностью.
раскрыть ветку 1
0
Просто на заметку, есть такая штука как дебаггер, если что то не работает, всегда можно посмотреть значения переменных в любой (почти в любой) точке выполнения программы. Ну или понатыкать логов, самый простой вариант writeln ('x=' + x) или как там это в паскале делалось, хз.
раскрыть ветку 7
+1
Где можно найти такое?
раскрыть ветку 6
0
первое и САМОЕ ГЛАВНОЕ: называй переменные ОСМЫСЛЕННО. что такое "k,s:string;" и "pr,sm,ca,cb,z,v:integer ;"???

замечания:

for i:=1 to length(a) do _____________/вот от седава
x:=x+a[i];
y:='';____________________________/дублирование операции
for i:=1 to length(b) do
y:=y+b[i];________________________/и до седава ты что делаешь? для чего отображать зеркально числа?
while (y='') or (x='') do
begin
val(x[1],ca,z);
val(y[1],cb,v);
sm:=(ca+cb)mod 10 ;
pr:=(ca+cb)div 10 + sm;
str(sm,s);
k:=s+k;
end;
writeln (k) ;
readkey;
end .

добавь в текст камменты что и где ты делаешь
раскрыть ветку 7
+1
Спасибо за такие подробные ответы конечно)
1) Переменные , что не так? Если вас смущает pr,sm,ca и т.д. , то так просто удобно , например sm -сумма , pr - перенос
2) Хорошо , добавлю
раскрыть ветку 4
+1
это для тебя ПР это перенос, а для меня - процент :)
переменные необходимо называть осмысленно в первую очередь для себя, ибо это сейчас у тебя 10 переменных и ты все можешь держать в голове, а представь код в пару десятков переменных и все 2-х символьные
0
pr вообще нигде в программе не участвует. Зачем ее обсчитывать?
0
вместо

for i:=1 to length(a) do
x:=x+a[i];
y:='';
for i:=1 to length(b) do
y:=y+b[i];
while (y='') or (x='') do
begin
val(x[1],ca,z);
val(y[1],cb,v);

я бы написан:

x,y:integer ;

x:= length(a);
y:= length(b);
if x<y then x:=y; ____/если строка А короче строки Б, за икс принимаем длину строки Б
while x>0 do
begin
val(a[x],ca,z);
val(b[x],cb,v);
x:=x-1;

как-то так
раскрыть ветку 1
0
Я бы еще про пунктуацию добавил. Пробел между END и точкой должен мозолить глаза.
0
Еще можно отладочные writeln'ы напихать, чтобы было видно результаты каждой итерации
0
короче, прогу объясняю на пальцах:

переменные:
стринг: строка1, строка2, строка_сумма, итн_в_стр
интегер: длина1, длина2, перенос, сумма, і перевод1, перевод2

вводим строку1
вводим строку2

вычисляем длина1
вычисляем длина2
если длина1<длина2 то длина1:=длина2
перенос:=0

цикл по длина1:
ВАЛ (строка1[длина1], перевод1)
ВАЛ (строка2[длина1], перевод2)
сумма:= перевод1+перевод2+перенос
если сумма>9 то (сумма:= сумма-10; перенос:=1)
СТР(сумма, инт_в_стр)
строка_сумма:= инт_в_стр + строка_сумма
раскрыть ветку 1
0
ну и вывод в конце :)
0
program two;
uses crt ;
var a,b,c,summ,tmp:string;
i,j,aa,bb,sum,err,v_ume:integer;

Begin

clrscr;

writeln (' vvedite stroku');
readln(a);
writeln (' vvedite stroku');
readln(b);

i:=length(a);
j:=length(b);
v_ume:=0;
while (i>0) and (j>0) do
begin
val(a[i],aa,err);
val(b[j],bb,err);
sum:=aa+bb;
str(sum mod 10+v_ume,tmp);
v_ume:=sum div 10;
summ:=tmp+summ;
i:=i-1;
j:=j-1;
end;
c:='';
for aa:=abs(i-j) downto 1 do begin
if i>j then val(a[aa],bb,err) else val(b[aa],bb,err);
bb:=bb+v_ume;
v_ume:=bb div 10;
str(bb,tmp);
c:=tmp+c;
end;
summ:=c+summ;
writeln (summ);
readkey;
end .
раскрыть ветку 2
0
Короче, правильно будет так:
program two;
uses crt ;
var a,b,c,summ,tmp:string;
i,j,aa,bb,sum,err,v_ume:integer;

Begin

clrscr;

writeln (' vvedite stroku');
readln(a);
writeln (' vvedite stroku');
readln(b);

i:=length(a);
j:=length(b);
v_ume:=0;
while (i>0) and (j>0) do
begin
val(a[i],aa,err);
val(b[j],bb,err);
sum:=aa+bb;
str(sum mod 10+v_ume,tmp);
v_ume:=sum div 10;
summ:=tmp+summ;
i:=i-1;
j:=j-1;
end;
c:='';
for aa:=abs(i-j) downto 1 do begin
if i>j then val(a[aa],bb,err) else val(b[aa],bb,err);
bb:=bb+v_ume;
v_ume:=bb div 10;
str(bb mod 10,tmp);
c:=tmp+c;
end;
if v_ume>0 then
begin
str(v_ume,tmp);
c:=tmp+c;
end;
summ:=c+summ;
writeln (summ);
readkey;
end .
раскрыть ветку 1
+1
Спасибо ) Заработало!111))0
0
о боже .... =)
-1
А почему бы строку в integer не перевести? StrToINt();
раскрыть ветку 4
+2
Integer не сможет в 225 знаков
раскрыть ветку 3
0
while (y='') or (x='') do Не совсем понимаю этот момент.
раскрыть ветку 2
Похожие посты
Похожие посты не найдены. Возможно, вас заинтересуют другие посты по тегам: