IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Калькулятор, длинная арифметика
сообщение
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 346
Пол: Мужской
Реальное имя: Иван

Репутация: -  7  +


Вот решил написать прогу "калькулятор".
Вчера ночью еще написал функции на "+" и "-", проверил, всё работало железобетонно, но то что писал не сохранилось mega_chok.gif злой рок и електричество...
Начал сегодня писать, вроде написал снова на + и -, плюс работает, но с минусом возникла какаято проблема которую я просто немогу осознать rolleyes.gif
Вот код:

program Kalkyl;

uses Crt;

var
A,B,rez:string;

S1,S2:string;

C:char;

E_e:char;

Dalee:boolean;


function Suma(A,B:string):string; <============ работает правильно

var
I,sub:integer;

L1,L2:integer;

S1,S2,S3:string;

begin

S1:=A;

S2:=B;

L1:=Length(S1);

L2:=Length(S2);

For I:=L2 to L1 do

insert('0',S2,1);

insert('0',S1,1);


S3:='';

Sub:=0;

For I:=L1+1 downto 1 do

If (ORD(S1[I])-48+ORD(S2[I])-48+sub)>9 then begin

S3:=CHR(ORD(S1[I])+ORD(S2[I])-48+sub-10)+S3;

sub:=1;

end

else

begin

S3:=CHR(ORD(S1[I])+ORD(S2[I])-48+sub)+S3;

sub:=0;

end;

if S3[1]='0' then delete(S3,1,1);

Suma:=S3;

end;

function Raznica(A,B:string):string; <==========работает неправильно

var
I,sub:integer;

L1,L2:integer;

S1,S2,S3:string;

begin

S1:=A;

S2:=B;

L1:=Length(S1);

L2:=Length(S2);

for I:=L2 to L1 do

insert('0',S2,1);

insert('0',S1,1);


S3:='';

Sub:=0;

For I:=L1+1 downto 1 do

If (ORD(S1[I])-48-ORD(S2[I])-48-sub)<0 then begin

S3:=CHR(ORD(S1[I])-ORD(S2[I])-sub+10+48)+S3;

sub:=1;

end

else
begin

S3:=CHR(ORD(S1[I])-ORD(S2[I])+48-sub)+S3;

sub:=0;

end;

if S3[1]='0' then delete(S3,1,1);

Raznica:=S3;

end;

procedure Logo;

begin

clrscr;

gotoxy(15,1);

textcolor(lightblue);

Writeln('Калькулятор');

gotoxy(15,2);

textcolor(white);

end;

function Opr_d(C:char):string;

begin

case C of

'+':Opr_d:='сложение';
'-':Opr_d:='вычитание';
'*':Opr_d:='произведение';
'/':Opr_d:='деление'

else Opr_d:='Некоректные данные';
end;

end;

procedure Vvod;

begin

gotoxy(2,6);

writeln('Введите первое число и нажмите "Enter".');

gotoxy(2,8);

textcolor(red);

write('Первое число: ');

textcolor(white);

readln(A);

gotoxy(2,10);

write('Введите необходимое действие и нажмите "Enter: ');

readln©;

gotoxy(2,12);

textcolor(red);

write('Необходимо выполнить : ');

textcolor(white);

write(Opr_d©);

gotoxy(2,14);

writeln('Введите второе число и нажмите "Enter"');

gotoxy(2,16);

textcolor(red);

write('Второе число: ');

textcolor(white);

readln(B);

end;

procedure Rezultat;

begin

case C of

'+':rez:=Suma(A,B);

'-':rez:=Raznica(A,B);
end;

gotoxy(10,20);

writeln('Решение: ');

write(A,' ',C,' ',B,' = ',rez);

end;

BEGIN

logo;

gotoxy(2,4);

write('Нажмите "Enter" чтобы продолжить, или "Escape" чтобы выйти');

Dalee:=false;

while Dalee=false do

begin

E_e:=readkey;

if E_e=chr(27) then exit;

if E_e=char(13)then Dalee:=true;

delline;

end;

Vvod;

Rezultat;

readln;

END.


помогите найти ошибку в функции Raznica rolleyes.gif

и еще... я когда запускаю программу прямо с Fpc 2.2.2. то сначала всё что на екране пишет иероглифами, а после первого нажатия - нормально, а после последнего нажатия, когда должно вывести результат, выводит результат и снова всё слова становятся иероглифами, причом происходит это только в полноекранном режиме, если в окне всё норм, и когда запускаю програму с ексешника, в окне, тоже всё норм

И вообще был бы рад выслушать замечания какие есть, как было бы лучше организовать программу...

Сообщение отредактировано: RathaR -


--------------------
Считающий себя единственым здравомыслящим человеком сумасшедший? Если да, возможно я псих...
Пусть умолкнет всякий критик!
Я - системный аналитик!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Значит, твоя функция имеет побочный эффект, и, что самое ужасное, работает ТОЛЬКО за счет побочного эффекта. А при работе Factorial этот эффект не проявляется, вот тебе и неправильный результат.

Корректно написанная функция должна выдавать правильный результат и при таком вызове, как я показал.
 К началу страницы 
+ Ответить 

Сообщений в этой теме
RathaR   Калькулятор   25.07.2009 20:29
volvo   Как минимум - нужно заменить на более правильный в…   26.07.2009 1:04
RathaR   Как минимум - нужно заменить на более правильный …   26.07.2009 2:00
volvo   Во-первых: function O_gen(K:integer):string; var …   26.07.2009 2:14
RathaR   Доделал программу, всё работает :) volvo большое …   26.07.2009 2:55
RathaR   И снова я со всё темеже проблемами, на этот раз та…   27.07.2009 0:05
volvo   Показывай реализацию функции Proizvedenie.   27.07.2009 0:36
RathaR   Показывай реализацию функции Proizvedenie. Funct…   27.07.2009 0:46
volvo   Неправда: writeln(Proizvedenie('12', …   27.07.2009 0:55
RathaR   Неправда: writeln(Proizvedenie('12', …   27.07.2009 1:16
volvo   Значит, твоя функция имеет побочный эффект, и, что…   27.07.2009 1:30
RathaR   Значит, твоя функция имеет побочный эффект, и, чт…   27.07.2009 1:53
volvo   Внутри функции Proizvedenie очищай массив M: for i…   27.07.2009 2:06
RathaR   Внутри функции Proizvedenie очищай массив M: [cod…   27.07.2009 2:27
volvo   Нормальный результат: 362880 (видно при пошаговом …   27.07.2009 3:30


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 26.01.2021 1:06
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name