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


Гость






Цитата
помогите найти ошибку в функции Raznica
Как минимум - нужно
Цитата
  If (ORD(S1[I])-48-ORD(S2[I])-48-sub)<0 then begin
заменить на более правильный вариант:
  If ((ORD(S1[I])-48)-(ORD(S2[I])-48)-sub)<0 then begin
Если теперь открыть скобки, то увидишь, что перед вторым числом 48 будет плюс, а не минус, как у тебя... Но я бы оставил именно в скобках.

Цитата
И вообще был бы рад выслушать замечания какие есть, как было бы лучше организовать программу...
Программу надо для начала нормально отформатировать, чтобы ее можно было читать. То, что ты привел - нечитаемо абсолютно. Где отступы? Зачем пустые строки? Зачем оформление, перемешанное с логикой? Сначала отладь логику, потом добавляй "рюшечки".
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Знаток
****

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

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


Цитата(volvo @ 25.07.2009 21:04) *

Как минимум - нужно
заменить на более правильный вариант:
  If ((ORD(S1[I])-48)-(ORD(S2[I])-48)-sub)<0 then begin
Если теперь открыть скобки, то увидишь, что перед вторым числом 48 будет плюс, а не минус, как у тебя... Но я бы оставил именно в скобках.

действительно rolleyes.gif исправил, работает
Цитата(volvo @ 25.07.2009 21:04) *

Программу надо для начала нормально отформатировать, чтобы ее можно было читать. То, что ты привел - нечитаемо абсолютно. Где отступы? Зачем пустые строки? Зачем оформление, перемешанное с логикой? Сначала отладь логику, потом добавляй "рюшечки".

пустые строки ставлю когда во FPC работаю... без них мне текст кажется слишком слитным... ну, плохие привычки еще практика исправит smile.gif
И возник еще один вопрос, на этот раз по поводу умножения...
Я думаю следующим образом:
в функцию Proizvedenie передаю две строки - числа, функция записывает их следующим образом:
0125
0025
затем вызываеться функция Syma которая находит сумму 5кратного сумирования большего числа, и результат записываеться в первый елемент масива М, далее функция Syma находит результат 2кратного сумирования числа 125, и записывает его во второй елемент масива М, и тд по розрядам, а после этого к каждому елементу масива М дописываеться еше (І-1) ноль, где І - номер елемента масива М.
А потом все елементы сумируються всё той же функцией.

Но в реализации допустил ошибки, ибо функция Proizvedenie просто вылитает
вот эта функция:
Function Proizvedenie(A,B:string):string;

var
M:array[1..256] of string;
I,J,N:integer;
S1,S2,S3:string;
L1,L2,L3:integer;

begin

S1:=A;
S2:=B;

L1:=Length(S1);
L2:=Length(S2);

if L1<L2 then begin
L3:=L1;
L1:=L2;
L2:=L3;
S3:=S1;
S1:=S2;
S2:=S3;
end;
for I:=L2 to L1 do
insert('0',S2,1);

insert('0',S1,1);
S3:='';
N:=0;

For I:=L1+1 downto 1 do
begin
For J:=1 to (ORD(S2[I])-48) do
M[N]:=Suma(M[N],S1);
M[N]:=M[N]+O_gen(N-1);
inc(N);
end;
For J:=1 to I do
begin
S3:=Suma(M[J],S3);
end;
end;


а эта функция генерирует нужное кол-во нулей которые надо добавить:

function O_gen(K:integer):string;
var
I:integer;
begin
O_gen:='';
For I:=1 to K do
O_gen:=O_gen+'0';
end;



просидел довольно долго, но полного успеха над умножением так и не удалось добиться...

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


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

Сообщений в этой теме
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

 





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