Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.04;
Скачать: CL | DM;

Вниз

Счетчик итерации цикла не меняется...   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.035 c
3-1078378722
user
2004-03-04 08:38
2004.04.04
Как отобразить данные возвращаемые TADOStoredProc


9-1063291856
AlexT1000
2003-09-11 18:50
2004.04.04
FullScreen in DirectX9 ?


6-1074946940
ASTARD
2004-01-24 15:22
2004.04.04
По поводу ФТП!!!???


1-1079354927
Mim
2004-03-15 15:48
2004.04.04
Не появляются полосы прокрутки клиентской облисти MDI form в CLX


7-1075148330
Djon007
2004-01-26 23:18
2004.04.04
Ctrl+Alt+Delete Старый вопрос..................