Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1079192406
Vilux
2004-03-13 18:40
2004.04.04
Помогите с потоками


11-1059120388
Armaniak
2003-07-25 12:06
2004.04.04
Что за параметры требуются для выполнения Execute в KOLSLQuery


7-1072072538
Ilkhom
2003-12-22 08:55
2004.04.04
Лицинзионные программы


1-1079358474
snake1977
2004-03-15 16:47
2004.04.04
Определение кодировки


4-1075408472
Forxet
2004-01-29 23:34
2004.04.04
Изменение цвета progress bar ???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский