Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Cтроковый калькулятор на чистом С 
:(
    Опции темы
SLAVAN
Дата 23.3.2008, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 23.3.2008

Репутация: нет
Всего: нет



Здравствуйте, уважаемые господа!
Помогите пожалуйста, решить задачу:   нужно напистать строковый арифметический калькулятор на языке С который бы учитывал приоритеты операций () :/*-+ . Подскажите пожалуйста каким методом или алгоритмом ее решеть. И если Вам не трудно, набросайте исходничек ...

У меня некоторый нобросок уже есть - проверка баланса скобок и ошибок в операциях, теперь осталось вычислить выражение!  

Код

#include "conio.h"
#include "stdlib.h"
#include "stdio.h"
#include "process.h"
#include "math.h"
struct viraz{
char s;                                     // dlya   znakov
int c,c1;                                   //c - dlya znakov i cifr   c1-dlya cifr
}cifri[200],znaki[200];
    char kom[31]={"+-+**++/+-*-/*/--^-+^+/^//*^*^^"},
    operac[5]={"^*/+-"}, vir[200], k, skoba;
    int i,j,kol_simv,t,y1,y2 ;
    int rez, dc[200],dz[200];
    int pol=-1;
    char stack[10];
    int push (char c);
    int push (char c, int l);
    char pop ();
void main() {

textcolor(YELLOW);
textbackground(BLACK);
clrscr();

printf("\n\t\t\t <====  STROKOVOI  KALKYLATOR  ====>\n");
printf("\n   V v e d i t e   v i r a g e n i e :  \n   ");

scanf("%s",&vir[0]);
for(i=0;vir[i]!='\0';i++); kol_simv=i;
printf("\n\t %d  simvol- (a),(ov) \n",kol_simv);
for(j=0;j<kol_simv;j++){
    if(((vir[j]>=':')&&(vir[j]<=']'))||((vir[j]>='_')&&(vir[j]<='~'))){
    printf("\n\t INCORRECT \n");
    t=1;  break;
    }
    for(i=0;i<4;i++){
    if ((vir[kol_simv-1]==operac[i])||(vir[kol_simv-1]==operac[4])) {
    printf("\t Ne pravilno!\n\t Pownimatelnee, pogalyista! Viragenie zakan4ivaetsa znakom  %c \n ",vir[kol_simv-1]); t=1; break;
    }

    if (vir[0]==operac[i]) {
    printf("\t Ne pravilno!\n\t Pownimatelnee, pogalyista! Viragenie na4inaetsa znakom  %c \n  \n ",vir[0]); t=1; break;
    }
    }
    if(t==1) break;
}

        if(t==0){ int g=0;
        for(i=0;i<kol_simv;i++){

        for(i=0;i<kol_simv;i++){
          if((vir[i]==')'&&vir[i+1]=='(')||(vir[i]==')'&&(vir[i+1]>='0'&&vir[i+1]<='9'))||(vir[i]>='0'&&vir[i]<='9')&&(vir[i+1]=='(')){
        printf("\n\t ERROR! Nety znakov megdy skobkoi i 4islom, libo megdy skobkami");t=1; break;
        }
        if(t==1) break;
          }
        g=0;                          //esl li znaki
        for(j=0;j<5;j++){
        if(vir[i]==operac[j]){g=i; break;}
        }
        }

        if(t==0){
        for(i=0;i<kol_simv-1;i++){                               //para znakov
        for(j=0;j<30;j++){
        if((vir[i]==kom[j])&&(vir[i+1]==kom[j+1])){
        printf("\t Error!  Neskolko arifm znakov! \n" );
        i=kol_simv; j=30; t=1;    break;
}
}
}
}
if(t!=1) {  printf("\n\t A L L R I G H T po znakam !    \n");
}
if(vir[0]==')') printf("\n\t  E R R O R !  - %c ",vir[0]); else{
for(j=i=0;vir[i]!='\0';i++){
if (vir[i]=='(') { pol=push(vir[i]); skoba=vir[i];           }
if (vir[i]==')')  k=pop();
if ((k=='(')&&(vir[i]!=')'))  { printf("  E R R O R3 !  ");  vir[i+1]='\0';
}
if (k=='E')  { printf("\n\t E R R O R4 !  zaiva zakriv. skobka, %d",j+1); vir[i+1]='\0'; t=1; }
k='0';
}
if (pol!=-1&&t!=1){ printf("\n\t E R R O R5 !  ne zakrili skobky %d ",pol+1);  abort;
}
if(pol==-1&&t!=1&&skoba=='('){ printf("\n\t A L L R I G H T po skobkam !    \n\n");
}
}
}

if(t==0){
for(i=0;i<kol_simv;i++){                           // zanos cifr y struct cifri
if(vir[i]>='0'&&vir[i]<='9'){
cifri[i].c1=vir[i]-'0'; cifri[i].c=i+1;
}
for(j=0;j<5;j++){                                     // zanos znakov y struct znaki
if((vir[i]=='(')||(vir[i]==')')||(vir[i]==operac[j])){
znaki[i].s=vir[i]; znaki[i].c=i+1;
}
}
}

printf("\n   ");
for(i=0;i<kol_simv;i++){
if(cifri[i].c>0){
dc[y1++]=cifri[i].c;
printf("%d",cifri[i].c1); }
else printf(" ");
}
printf("\n   ");
for(i=0;i<kol_simv;i++){
if(znaki[i].c>0)
dc[y2++]=znaki[i].c;
printf("%c",znaki[i].s);
}

           int p=1, h=0, kil[200];  j=0;
           for(i=0;i<y1;i++){  kil[j]=0;

           while((znaki[dz[i]++].c==0)&&(znaki[dz[i+1]].c==0)) { kil[j]++; }
         j++; i++;
           }   for(i=0;i<j;i++)
           printf("\n 4islo - %d   ",kil[i]);


}

getch();
}

    int push(char c){
    pol++,j++;
    stack[pol]=c;
    return pol;
    }

    char pop (){
    char c;
    if (pol>=0) {j++; c=stack[pol]; pol--;
    }
    else return 'E';
    return c;
    }

    int push(char c, int l){
    pol++;
    stack[pol]=c;
    return pol;
    }



За любую помощь буду очень признателен!

Это сообщение отредактировал(а) SLAVAN - 23.3.2008, 14:04
PM MAIL   Вверх
korian
Дата 23.3.2008, 16:10 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 2
Всего: 17



PM   Вверх
jonie
Дата 23.3.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



algolist.manual.ru по тойже направленности


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
xvr
Дата 24.3.2008, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(SLAVAN @ 23.3.2008,  14:01)
Здравствуйте, уважаемые господа!
Помогите пожалуйста, решить задачу:   нужно напистать строковый арифметический калькулятор на языке С который бы учитывал приоритеты операций () :/*-+ . Подскажите пожалуйста каким методом или алгоритмом ее решеть. И если Вам не трудно, набросайте исходничек ...

У меня некоторый нобросок уже есть - проверка баланса скобок и ошибок в операциях, теперь осталось вычислить выражение!  

Тот ужас, который вы 'набросали' советую распечатать и повесить на стену под надписью Так писать нельзя!
Что касается калькулятора, то советую взять пару bison + flex у них в документации есть пример калькулятора, и хотя генерируемый ими текст на С предназначен для компилятора, он все же будет именно 'программой на С' (и наверное более читаемым, чем ваш вариант  smile ) 
Если же хочется понятного текста на С, то советую взять ANTLR (www.antlr.org) - он генерирует парсер, построенный методом рекурсивного спуска, это вполне читаемо.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0457 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.