Помощь - Поиск - Пользователи - Календарь
Полная версия: Псевдокалькулятор
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
Rocket
С помощью разбора строки, вводимой с клавиатуры создать калькулятор, вычисляющий простейшие выражения типа: "1 + 7 - 3 * 2 =" результатом такого выражения будет 10 (приоритет операций не учитывается). Использовать только функци strtok. В дальнейшем модифицировать калькулятор так, чтобы он разбирал строки "1+7-3*2=", т.е. знаки операций искать с помощью strpbrk.

Пока я только разбиваю строку на фрагменты:

#include<stdio.h>
#include<string.h>
#include<conio.h>

int main()
{
 char s[255];
 char *p;
 int i;

  clrscr();

  fgets(s,254,stdin);

   i=0;
    p=strtok(s,"+,-,*,/");
     while(p)
      {
       printf("%d : %s\n",i,p);
       i++;
       p=strtok(NULL,"+,-,*,/");

      }
   return 0;
}


Вопрос в том, как получать сами числа в выражении и знаки операций?
volvo
Так?

#include<stdio.h>
#include<string.h>
#include<conio.h>

int main(){
    char s[255];
    char *p, *temp;
    int i, len;

    // clrscr();
    fgets(s,254,stdin);
    temp = strdup(s);

    len = i = 0;
    p = strtok(temp,"+-*/=");
    while(p && *p != '\n') {
        len += strlen(p);
        printf("%d : %3d; sign : %c\n",i++, atoi(p), s[len++]);
        p = strtok(NULL,"+-*/=");
    }
    free(temp);
    return 0;
}
atoi(p) дает тебе число, хранящееся в p, а s с заданным индексом - знак операции...

(запятая не нужна в строке для strtok - только сами символы)
Rocket
А как тогда произвести вычисление заданного выражения? Числа переводим с помощью atoi(p), а со знаками операций как поступать?
volvo
Например, так:

#include<stdio.h>
#include<string.h>
#include<conio.h>

int main(){
    char s[255];
    char *p, *temp, sign;
    int i, len;
    float result;

    // clrscr();
    fgets(s,254,stdin);
    temp = strdup(s);

    len = i = 0;
    result = 0; sign = '\0';
    p = strtok(temp,"+-*/=");
    while(p && *p != '\n') {
        len += strlen(p);
        switch(sign) {
            case '\0':
                result = atoi(p); break;
            case '+':
                result += atoi(p); break;
            case '-':
                result -= atoi(p); break;
            case '*':
                result *= atoi(p); break;
            case '/':
                result /= atoi(p); break;
        }
        printf("%d : %3d; sign : %c\n",i++, atoi(p), (sign = s[len++]));
        p = strtok(NULL,"+-*/=");
    }
    free(temp);
    printf("\nresult = %5.2f\n", result);
    return 0;
}

Rocket
Цитата(volvo @ 1.12.2007 17:27) *

Например, так:

#include<stdio.h>
#include<string.h>
#include<conio.h>

int main(){
    char s[255];
    char *p, *temp, sign;
    int i, len;
    float result;

    // clrscr();
    fgets(s,254,stdin);
    temp = strdup(s);

    len = i = 0;
    result = 0; sign = '\0';
    p = strtok(temp,"+-*/=");
    while(p && *p != '\n') {
        len += strlen(p);
        switch(sign) {
            case '\0':
                result = atoi(p); break;
            case '+':
                result += atoi(p); break;
            case '-':
                result -= atoi(p); break;
            case '*':
                result *= atoi(p); break;
            case '/':
                result /= atoi(p); break;
        }
        printf("%d : %3d; sign : %c\n",i++, atoi(p), (sign = s[len++]));
        p = strtok(NULL,"+-*/=");
    }
    free(temp);
    printf("\nresult = %5.2f\n", result);
    return 0;
}



Круто! Спасибо за помощь!
Rocket
А как модифицировать программу с помощью strpbrk, не используя strtok?
volvo
Вот так:

#include<stdio.h>
#include<string.h>
#include<conio.h>

int main(){
    char s[255];
    char *p, *temp, sign;
    int val;
    float result;

    // clrscr();
    fgets(s,254,stdin);
    temp = p = s;

    // i = 0;
    result = 0; sign = '\0';
    while(p && *p != '\n') {
        p = strpbrk(temp,"+-*/=");

        switch(sign) {
            case '\0':
                sscanf(temp, "%d", &val);
                result = val;
                break;
            case '+':
                sscanf(temp, "%d", &val);
                result += val; break;

            case '-':
                sscanf(temp, "%d", &val);
                result -= val; break;

            case '*':
                sscanf(temp, "%d", &val);
                result *= val; break;

            case '/':
                sscanf(temp, "%d", &val);
                result /= val; break;

        }
        sign = *p++;
        temp = p;
    }
    printf("\nresult = %5.2f\n", result);
    return 0;
}

Rocket
Цитата(volvo @ 3.12.2007 22:40) *
Вот так:

А что мы реализуем функцией sscanf(temp, "%d", &val)?
volvo
Чтение числа из строки мы реализуем...
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.