Форум: "Основная";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
ВнизСчетчик итерации цикла не меняется... Найти похожие ветки
← →
Troy © (2004-03-05 21:45) [0]во вложенном цикле - счетчик - var1.
проходит 2 итерации - и фиг с ним - как был 1 так и остается. чушь какая-то !!! по вачпоинту сморел. хелп плиз. :(((
program calcul;
uses crt;
label beg,ex1,ex2;
var a,b,result:real;
i:byte;
c:char;
position,var1,var4,ub:integer;
var2,strmatch,_pl,_ot,_div,_pr,term:string;
zifr2,zifr:array[1..25] of string;
begin
_pl:="+";
_ot:="-";
_div:="/";
_pr:="*";
beg:
write(" > ");
readln(term);clrscr;
if pos(_pl,term)>0 then
begin
c:="+";
position:=pos(_pl,term);
end;
if pos(_ot,term)>0 then
begin
c:="-";
position:=pos(_ot,term);
end;
if pos(_pr,term)>0 then
begin
c:="*";
position:=pos(_pr,term);
end;
if pos(_div,term)>0 then
begin
c:="/";
position:=pos(_div,term);
end;
a:=0;b:=0;
for i:=1 to position-1 do
zifr[i]:=copy(term,i,1);
ub:=length(term)-position;
for i:=1 to ub do
zifr2[i]:=copy(term,i,1);
for i:=1 to position-1 do
for var1:=1 to 9 do
begin
str(var1,strmatch);
if zifr[i]=strmatch then a:=a+Exp(i*Ln(10))*var1;goto ex1;
end;
ex1:
for i:=position-1 to length(term)-position do
for var1:=1 to 9 do
begin
str(var1,strmatch);
if zifr2[i]=strmatch then b:=b+Exp(i*Ln(10))*var1;goto ex2;
end;
ex2:
case c of
"+":result:=a+b;
"-":result:=a-b;
"*":result:=a*b;
"/":result:=a/b;
end;
writeln(term,"=",result:10:5);
goto beg;
end.
← →
Troy © (2004-03-05 22:15) [1]короче это goto =)
проблема решена. сам допёр %)))
← →
Gero © (2004-03-05 22:27) [2]Совет: забудь про goto и никогда его не используй. Разве что в крайних случаях.
← →
Mihey © (2004-03-05 22:28) [3]Удалено модератором
Примечание: Оффтоп...
← →
Gero © (2004-03-05 22:35) [4]Удалено модератором
Примечание: Оффтоп...
← →
TButton © (2004-03-05 22:39) [5]Удалено модератором
Примечание: Оффтоп...
← →
Troy © (2004-03-05 22:56) [6]
program calcul;
uses crt;
label beg,ex1,ex2;
var a,b,result:real;
i:byte;
c:char;
position,var1,var4,ub:integer;
var2,strmatch,_pl,_ot,_div,_pr,term:string;
zifr2,zifr:array[1..25] of string;
begin
_pl:="+";
_ot:="-";
_div:="/";
_pr:="*";
beg:
write(" > ");
readln(term);clrscr;
if pos(_pl,term)>0 then
begin
c:="+";
position:=pos(_pl,term);
end;
if pos(_ot,term)>0 then
begin
c:="-";
position:=pos(_ot,term);
end;
if pos(_pr,term)>0 then
begin
c:="*";
position:=pos(_pr,term);
end;
if pos(_div,term)>0 then
begin
c:="/";
position:=pos(_div,term);
end;
a:=0;b:=0;
for i:=1 to position-1 do
zifr[i]:=copy(term,i,1);
ub:=length(term)-position;
for i:=1 to ub do
zifr2[i]:=copy(term,i+position,1);
for i:=1 to position-1 do
for var1:=1 to 9 do
begin
var4:=var1;
str(var4,strmatch);
if zifr[i]=strmatch then a:=a+Exp(i*Ln(10))*var1;
end;
for i:=position-1 to length(term)-position do
for var1:=1 to 9 do
begin
var4:=var1;
str(var4,strmatch);
if zifr2[i]=strmatch then b:=b+Exp(i*Ln(10))*var1;
end;
case c of
"+":result:=a+b;
"-":result:=a-b;
"*":result:=a*b;
"/":result:=a/b;
end;
writeln(term,"=",result:10:5);
goto beg;
end.
почему оно через попу всё делает? :(
← →
Troy © (2004-03-05 22:57) [7]неправильно считает арифм. действия.
← →
olookin © (2004-03-05 23:03) [8][3] Mihey © (05.03.04 22:28)
>Совет: забудь про goto и никогда его не используй. Разве что в крайних случаях.
Совет: Программируй и забудь росказни всяких Очень Умных Программистов.
Совет: а что еще посоветовать кроме как первый вариант. Забудь про Goto и программи как есть.
← →
TButton © (2004-03-05 23:03) [9]ты бы комментариями разбавил
по твоей проге
1. ищешь в строке знак действия?
2. ищешь первое число и второе?
3. считаешь?
по второму могу предолжить алгоритм
первое число - копируешь с начала строки до знака действия
второе число - после знака действия до конца строки
фильтруешь оба числа отбрасывая не цифровые символы
если ошибка в case - попробуй с заменить на integer и условно обозначить действия цифрами.
← →
Troy © (2004-03-06 12:58) [10]не. короче там он толи числа из символов строки делает. то ли формула возведения в степень неправильная... :(
← →
TUser © (2004-03-06 13:39) [11]goto - в архив !!!!!!!
Давно уже им не пользовался, если к этому привыкнуть - то он как бы и не нужен ...
← →
TButton © (2004-03-06 17:40) [12]ты по breakpoint"ам посмотри числа правильно извлекаются (первое, второе).... короче поду проверю твою прогу...
← →
TButton © (2004-03-06 23:14) [13]
program calcul;
uses crt;
label beg,ex1,ex2;
var a,b,result:real;
i:byte;
c:char;
position,var1,var4,ub:integer;
var2,strmatch,_pl,_ot,_div,_pr,term:string;
zifr2,zifr:string;
err: integer;
begin
_pl:="+";
_ot:="-";
_div:="/";
_pr:="*";
beg:
write(" > ");
readln(term);
clrscr;
if term="exit" then Halt(0);
if pos(_pl,term)>0 then
begin
c:="+";
position:=pos(_pl,term);
end;
if pos(_ot,term)>0 then
begin
c:="-";
position:=pos(_ot,term);
end;
if pos(_pr,term)>0 then
begin
c:="*";
position:=pos(_pr,term);
end;
if pos(_div,term)>0 then
begin
c:="/";
position:=pos(_div,term);
end;
a:=0;
b:=0;
zifr:=Copy(term,1,position-1);
zifr2:=Copy(term,position+1,length(term));
Val(zifr,a,err);
Val(zifr2,b,err);
{
for i:=1 to position-1 do
zifr[i]:=copy(term,i,1);
ub:=length(term)-position;
for i:=1 to ub do
zifr2[i]:=copy(term,i+position,1);
for i:=1 to position-1 do
for var1:=1 to 9 do
begin
var4:=var1;
str(var4,strmatch);
if zifr[i]=strmatch then a:=a+Exp(i*Ln(10))*var1;
end;
for i:=position-1 to length(term)-position do
for var1:=1 to 9 do
begin
var4:=var1;
str(var4,strmatch);
if zifr2[i]=strmatch then b:=b+Exp(i*Ln(10))*var1;
end;}
case c of
"+":result:=a+b;
"-":result:=a-b;
"*":result:=a*b;
"/":result:=a/b;
end;
writeln(term,"=",result:10:5);
goto beg;
end.
вот в этих двух циклах (подчеркнуто) у тебя ошибка. незнаю зачем ты взялся преобразовывать строку в число руками, когда для этого есть функция. если хочешь - попытайся объяснить мне принцип перевода строки в число, а я набросаю код. а вообще вот тот код что я привел абсолютно работоспособен. если удалить комментарии и кое-что оптимизировать будет раза в три меньше исходного)
← →
Troy © (2004-03-07 22:59) [14]дали задачку с условием что нельзя юзать val() =(
вообщем алгоритм преобразования такой:
1345+978
записываем элементы массива a[1]=1 a[2]=3 a[3]=4 ит.д.
ищем + и гоняем цикл
с 1 до "позицции арифм знака -1"
вкладываем внутрь этого цилка еще один с 1 до 9.
и сравниваем счетчик внутреннего цикла с элементом массива. если равно - тогда a:=a+x
причем x равно 10 в степени позиция цифры в строке при данной итерации помноженной на прошедший проверку счетчик итерации внутреннего цикла . то есть будет так (там var4 для дебага был...):
for i:=1 to position-1 do
for var1:=1 to 9 do begin
if zifr[i]=var1 then a:=a+10^i*var1;end;
и a - первое слагаемое.
потом также только для второго слагаемого...
← →
TButton © (2004-03-07 23:43) [15]т.е. преобразовать строку "1234" в число 1234, если число всегда целое. поду попробую.
← →
Troy © (2004-03-07 23:47) [16]угу. пасиба что хоть пытаешься помочь :)
← →
YurikGl © (2004-03-08 00:00) [17]> что нельзя юзать val() =(
А strToInt или StrToFloat ?
что-то вроде
out:=0;
for i:=1 to lenght(st) do
out:=out+pow((char(st[i])-..{код символа "1"+1}..),lenght(st)-i)
писал без проверки
← →
Troy © (2004-03-08 13:53) [18]нельзя. короче над свой метод придумать. я придумал сча вот воплощаю...
← →
YurikGl © (2004-03-08 14:34) [19]Написал, проверил. Работает для integer и real
function pow(a,b:real):real;
Begin
pow:=exp(ln(a)*b);
End;
function MY(st:string):real;
var
i,p:integer;
out:real;
Begin
out:=0;
p:=pos(".",st);
if p=0 then p:=length(st)+1;
for i:=1 to length(st) do
if st[i]<>"." then
if i>p then out:=out+(integer(st[i])-48)*pow(10,p-i)
else out:=out+(integer(st[i])-48)*pow(10,p-i-1);
my:=out;
End;
BEGIN
writeln(my("32123"));
writeln(my("13.45"));
END.
← →
Юрий Зотов © (2004-03-08 17:07) [20]Вот cтандартное преобразование строки в беззнаковое целое.
function Str2Int(S: string): integer;
var
i: integer;
begin
if S = "" then raise ...
Result := 0;
for i := 1 to Length(S) do
if S[i] in ["0".."9"] then
Result := Result * 10 + Ord(S[i]) - Ord("0")
else raise ...
end;
Это - базовая функция. Прочие числа (отрицательтные, нецелые и пр.) надо расписывать через БНФ. Примерно так:
<цифра> ::= 0|1|2|3|4|5|6|7|8|9
<знак> ::= +|-
<символ_точки> ::= .
<символ_экспоненты> ::= e|E
<умн_дел> ::= *|/
<беззнаковое_целое> ::= <цифра>
<цифра> <беззнаковое_целое>
<знаковое_целое> ::= <знак> <беззнаковое_целое>
<целое> ::= <беззнаковое_целое>
<знаковое_целое>
<мантисса> ::= <целое>
<символ_точки> <беззнаковое_целое>
<знак> <символ_точки> <беззнаковое_целое>
<целое> <символ_точки>
<целое> <символ_точки> <беззнаковое_целое>
<число> ::= <мантисса>
<мантисса> <символ_экспоненты> <целое>
<слагаемое> ::= <число>
<число> <умн_дел> <число>
<выражение> ::= <слагаемое>
<слагаемое> <знак> <выражение>
Это - пример определения входного языка простейшего калькулятора, поддерживающего целые и дробные числа и четыре арифметические операции (с учетом их приоритетов, но без скобок).
Входная строка просматривается посимвольно и разбивается на лексемы (пробелы игнорируются везде, но не внутри лексемы <беззнаковое_целое>) - см. приведенное выше преобразование строки в целое. Одновременно строится дерево разбора и уже по нему производятся сами вычисления.
Подобным образом строятся все парсеры, калькуляторы, интерпретаторы и компиляторы.
← →
YurikGl © (2004-03-08 17:46) [21]Точно [19] не работает для отрицательных. Можно дописать. Это - не сложно.
← →
Troy © (2004-03-09 21:57) [22]хм. че-то не понял. а в raise что должно быть...
← →
Troy © (2004-03-09 23:28) [23]Совершенно неоптимизированный и просто ужасный код можете лицезреть ниже :)
Огромное спасибо всем кто в этом участвовал. БОЛЬШОЕ ПРОГРАММЕРСКОЕ ПАСИБА! :)
Лень уже че-то с ним возится. еще дофига задачек. но они уже попроще :)
program calcul;
uses crt;
label beg,endd;
var a,b,result:real;
i:byte;
c:char;
position,var1,var4,ub:integer;
leftvar,rightvar,var2,strmatch,_pl,_ot,_div,_pr,term:string;
function pow(a,b:real):real; {Vozvedenie v stepen"}
Begin
pow:=exp(ln(a)*b);
End;
function StrToVal(st:string):real; {String to Val}
var
i,p:integer;
out:real;
Begin
out:=0;
p:=pos(".",st);
if p=0 then p:=length(st)+1;
for i:=1 to length(st) do
if st[i]<>"." then
if i>p then out:=out+(integer(st[i])-48)*pow(10,p-i)
else out:=out+(integer(st[i])-48)*pow(10,p-i-1);
StrToVal:=out;
End;
begin
_pl:="+";
_ot:="-";
_div:="/";
_pr:="*";
beg:
writeln("Press Q to exit or press Enter to continue...");
if readkey="q" then goto endd;
write(" > ");
readln(term);
if (term="exit") or (term="quit") then goto endd;
clrscr;
if pos(_pl,term)>0 then
begin
c:="+";
position:=pos(_pl,term);
end;
if pos(_ot,term)>0 then
begin
c:="-";
position:=pos(_ot,term);
end;
if pos(_pr,term)>0 then
begin
c:="*";
position:=pos(_pr,term);
end;
if pos(_div,term)>0 then
begin
c:="/";
position:=pos(_div,term);
end;
rightvar:=copy(term,position+1,length(term)-position);
leftvar:=copy(term,1,position-1);
a:=StrToVal(leftvar);
b:=StrToVal(rightvar);
case c of
"+":result:=a+b;
"-":result:=a-b;
"*":result:=a*b;
"/":result:=a/b;
end;
writeln(term,"=",result:10:5);
goto beg;
endd:
end.
← →
Германн © (2004-03-10 02:50) [24]И дался же тебе этот GoTo!
Ну совершенно не Паскалевская конструкция.
Нет, чтобы написАть:repeat
writeln("Press Q to exit or press any key to continue...");
Ch:=readkey;
if Ch = 0 then ReadKey
else if (Ch = "q") or (Ch = "Q") then Break;
...
что-то там
...
until false;
И, кстати, не забудь, что нажатие спец. клавиши нужно обработать двумя вызовами ReadKey.
← →
Германн © (2004-03-10 02:52) [25]Пардон.
if Ch = Chr(0) then ReadKey
← →
Германн © (2004-03-10 03:02) [26]Во блин. Только сейчас заметил, что в сабже [D1, D2, D3, D4, D5, D6, D7, Win95/98, WinME, NT4, Win2k, WinXP]
!
О каком readkey идет речь!
Ну написал бы ТР. Это ни в коем случае не оскорбительно. И ответили бы тоже. Но точнее.
И Юрий Зотов бы уже не написАл бы "raise..." и ты бы не переспрашивал, "в raise что должно быть..."
← →
Кщд (2004-03-10 09:58) [27]case в паскале работает с char?
← →
Anatoly Podgoretsky © (2004-03-10 10:02) [28]case в паскале работает с перечислимыми типа (ordinal)
← →
Кщд (2004-03-10 10:51) [29]спасибо
действительно, недопрочитал хелп
← →
Troy © (2004-03-15 01:03) [30]out:=out+(integer(st[i])-48)*pow(10,p-i)
можешь вот это объяснитЬ?
зачем мы от st[i] отнимаем 48 ?
← →
Германн © (2004-03-15 01:55) [31]2 Troy © (15.03.04 01:03) [30]
А ты понимаешь смысл записи Integer(st[i])?
Если понимаешь, то должен знать, что такое ASCII коды. Если про ASCII не знаешь - узнай. Иначе не решишь задачу без Val(), StrToInt и иже с ними.
← →
Troy © (2004-03-15 10:02) [32]понимаю. всё. вопрос решён. всем спасибо. :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.04;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.033 c