Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.03.2009, 08:04   #1
Buratino
Пользователь
 
Аватар для Buratino
 
Регистрация: 07.03.2009
Сообщений: 10
По умолчанию Калькулятор на паскале

Пишу калькулятор на паскале. Помогите найти ошибки!


Код:
program calculator;
var stroka,stroka0,stroka00: string;
    d,lens,i,N,len1,len2:integer;
    chisla:array[1..255]of real;
    chisla0:array[1..255]of real;
    chisla00:array[1..255]of real;



     procedure sortirovka;
     var i,s,cifra,N,len1,len2:integer;
      begin
       len1:=ord('0');
       len2:=ord('9');
       s:=1; N:=length(stroka00); cifra:=0;
       for i:=1 to N do
        begin
          if ((len1-ord(stroka00[i]))*(len2-ord(stroka00[i]))<= 0) then
           begin
               // write(ord(stroka00[i]),' ');
             chisla0[s]:=chisla0[s]*10+(ord(stroka00[s])-len1);
              if cifra=0 then
                begin
                cifra:=1;
                stroka0[s]:='#';
                s:=s+1;
              end;
           end;

          if ((len1-ord(stroka00[i]))*(len2-ord(stroka00[i]))> 0)  then
           begin
            stroka0[s]:=stroka00[i];
            s:=s+1;
            cifra:=0;
           end;
        end;

      end;
     

function schet(len1,len2:integer;symb:char):integer;
 var i,N:integer;
 begin
  i:=len1+1;                                  //len1 и len2 - координаты скобок
  N:=0;
  while (i<len2) do                                             //Подсчёт кол-ва знаков
   begin
   if stroka[i]=symb then N:=N+1;
   i:=i+1;
   end;
   Result:=N;
 end;
 

 procedure func(len1,len2:integer;symbol:char);                             //подсчёт всех функций в заданном интервале
  var k,d,i,N:integer;
      symbol0:char;
  begin
  case symbol of
  '+': begin symbol0:='-'; N:=schet(len1,len2,symbol)+schet(len1,len2,symbol0); end;
  '*': begin symbol0:='/'; N:=schet(len1,len2,symbol)+schet(len1,len2,symbol0); end;
  '^': begin symbol0:='^'; N:=schet(len1,len2,symbol); end;
  end;


  for d:=1 to N do
   begin
      if stroka='#' then break;
       i:=len1+1;
       while ((stroka[i])<>symbol)and((stroka[i])<>symbol0) do i:=i+1;
       case stroka[i] of
       '+': chisla[i-1]:=chisla[i-1]+chisla[i+1];
       '-': chisla[i-1]:=chisla[i-1]-chisla[i+1];
       '*': chisla[i-1]:=chisla[i-1]*chisla[i+1];
       '/': chisla[i-1]:=chisla[i-1]/chisla[i+1];
       '^': chisla[i-1]:=power(chisla[i-1],chisla[i+1]);
       end;
       for k:=i to (length(stroka)-2) do
        begin
        stroka[k]:=stroka[k+2];
        chisla[k]:=chisla[k+2];
        end;

      delete(stroka,length(stroka)-1,2);
   end;

  end;

Begin

for i:=1 to 255 do
begin
chisla[i]:=0;
chisla0[i]:=0;
end;

  readln(stroka00);
  sortirovka();

  
   for i:=1 to 255 do
begin
chisla[i]:=chisla0[i];
end;

  stroka:=stroka0;
  
  //stroka:='#*#/#+#+(#-#)^#';
  //chisla[1]:=1; chisla[3]:=12; chisla[5]:=6; chisla[7]:=2; chisla[10]:=7; chisla[12]:=6; chisla[15]:=2;

  lens:=length(stroka);
  
  N:=schet(0,lens+1,'(');
   i:=0;
  while(i<N) do
  begin
   d:=1;
   while stroka[d]<>')' do d:=d+1;
   len2:=d;
   while stroka[d]<>'(' do d:=d-1;
   len1:=d;
   func(len1,len2,'^');
   func(len1,len2,'*');
   func(len1,len2,'+');
   stroka[len1]:='#';
   chisla[len1]:=chisla[len1+1];
   for d:=(len1+1) to (length(stroka)-2) do
      begin
      stroka[d]:=stroka[d+2];
      chisla[d]:=chisla[d+2];
      end;
    delete(stroka,length(stroka)-1,2);
   i:=i+1;
  end  ;
  
  
   len1:=0; len2:=length(stroka)+1;
   func(len1,len2,'^');
   func(len1,len2,'*');
   func(len1,len2,'+');

  
  writeln(chisla[1],' ');
 End.

Последний раз редактировалось Buratino; 08.03.2009 в 09:06.
Buratino вне форума Ответить с цитированием
Старый 08.03.2009, 08:42   #2
KingOfNothing
Пользователь
 
Регистрация: 06.02.2009
Сообщений: 89
По умолчанию

Присваивать массивы вот так нельзя:
Код:
Var
chisla:array[1..255]of real;
chisla0:array[1..255]of real;
chisla:=chisla0;
У меня программа не компилируется.
Если вдруг захотите сказать мне спасибо - воспользуйтесь кнопкой "Добавить отзыв"
KingOfNothing вне форума Ответить с цитированием
Старый 08.03.2009, 08:55   #3
Buratino
Пользователь
 
Аватар для Buratino
 
Регистрация: 07.03.2009
Сообщений: 10
По умолчанию

А как надо? Я на PascalABC это писал...
Buratino вне форума Ответить с цитированием
Старый 08.03.2009, 08:58   #4
KingOfNothing
Пользователь
 
Регистрация: 06.02.2009
Сообщений: 89
По умолчанию

А у тебя компилируется в PascalABC?
массивы обычно копируется поэлементно
Если вдруг захотите сказать мне спасибо - воспользуйтесь кнопкой "Добавить отзыв"
KingOfNothing вне форума Ответить с цитированием
Старый 08.03.2009, 08:59   #5
Buratino
Пользователь
 
Аватар для Buratino
 
Регистрация: 07.03.2009
Сообщений: 10
По умолчанию

Скопировал поэлементно, всё равно не работает.

Компилируется.

Последний раз редактировалось Stilet; 10.10.2010 в 13:22.
Buratino вне форума Ответить с цитированием
Старый 08.03.2009, 09:04   #6
KingOfNothing
Пользователь
 
Регистрация: 06.02.2009
Сообщений: 89
По умолчанию

Я не могу посмотреть, что не работает, пока не могу запустить программу. Исправь, пожалуйста, код в первом сообщении, чтобы он компилировался на Turbo Pascal 7.0. У меня нет ABC, не смогу помочь иначе
Если вдруг захотите сказать мне спасибо - воспользуйтесь кнопкой "Добавить отзыв"
KingOfNothing вне форума Ответить с цитированием
Старый 08.03.2009, 09:17   #7
Buratino
Пользователь
 
Аватар для Buratino
 
Регистрация: 07.03.2009
Сообщений: 10
По умолчанию

Я вроде бы уже исправил..
Buratino вне форума Ответить с цитированием
Старый 08.03.2009, 09:20   #8
KingOfNothing
Пользователь
 
Регистрация: 06.02.2009
Сообщений: 89
По умолчанию

ага, компилируется, а теперь скажи, что программа ожидает на ввод, какие выражения?
например, 10 + 20? или как?
Если вдруг захотите сказать мне спасибо - воспользуйтесь кнопкой "Добавить отзыв"
KingOfNothing вне форума Ответить с цитированием
Старый 08.03.2009, 09:28   #9
Buratino
Пользователь
 
Аватар для Buratino
 
Регистрация: 07.03.2009
Сообщений: 10
По умолчанию

Ну да. Ошибка, скорее всего в начале. В коде написан пример, и, если закомментировать всё, что в теле программы выше, то считает правильно
Buratino вне форума Ответить с цитированием
Старый 08.03.2009, 09:33   #10
KingOfNothing
Пользователь
 
Регистрация: 06.02.2009
Сообщений: 89
По умолчанию

И что именно должно читать, какой формат ввода?
Если вдруг захотите сказать мне спасибо - воспользуйтесь кнопкой "Добавить отзыв"
KingOfNothing вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
калькулятор FARGO Общие вопросы Delphi 1 14.12.2008 23:01
Калькулятор ViNcHeStEr Помощь студентам 5 23.11.2008 15:39
Калькулятор Димарик Общие вопросы Delphi 1 04.10.2008 15:52
Калькулятор Nixtone Помощь студентам 7 03.07.2008 23:17
Калькулятор! HAMMAN Помощь студентам 15 04.03.2007 13:25