Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/12: Рейтинг темы: голосов - 12, средняя оценка - 4.83
spirit_trapper

Распознать и вычислить математическое выражение, указанное в текстовом файле

17.01.2010, 23:45. Показов 2576. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется строковый калькулятор и текстовый файл message.txt Нужно чтобы калькулятор распознавал и вычислял математическое выражение, указанное в текстовом файле. т.е., грубо говоря, нужно чтобы при запуске калькулятор выдавал ответ на выражение, указанное в текстовом файле,а после этого мог работать в обычном режиме.

Проблема вот в чем: калькулятор не только не распознает выражение, но вообще не видит функций , связанных с текстовым файлом.

Вот что у меня получилось (точнее не получилось):

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
 
int tok;
double tokval;
int ReadFile(char *fname);
 
int next() 
{
    for(;;)
    {  
        int c = getchar();
        if (c == EOF || strchr("+-*/^()\n", c) != NULL) return tok = c;
        if (isspace(c)) continue;
        if (isdigit(c) || c == '.') 
        {
            ungetc(c, stdin);
            scanf(" %lf", &tokval);
            return tok = 'n';
        }
        fprintf(stdout, "Некорректный ввод: %c\n", c); abort();
    }
    // return 0;
}
 
void skip(int t) 
 
    {if (tok == t) next();}
 
double expr();
 
double numpar() 
{
    if (tok == 'n') 
    { double x = tokval; skip('n'); return x; }
    skip('('); double x = expr(); skip(')'); 
    return x;
}
 
double factor() 
{
    double x = numpar();
    if (tok == '^') 
    { skip('^'); x = pow(x, factor()); }
    return x;
}
 
double term() 
{
    double x = factor();
    for (;;) 
    {
        if (tok == '*') { skip('*'); x *= factor(); }
        else 
        if (tok == '/') { skip('/'); x /= factor(); }
        else 
        return x;
    }
}
 
double expr() 
{
     double x = term();
     for (;;) 
     {
        if (tok == '+') { skip('+'); x += term(); }
        else 
        if (tok == '-') { skip('-'); x -= term(); }
        else 
        return x;
     }
}
 
int ReadFile(char *fname)
{
    FILE *fo;
    int z;
    
    if((fo=fopen(fname,"rf"))==NULL)
    {
        printf("\nОшибка: ");
        perror(fname);
        return 1;
    }
    else
    fscanf(fo,"%d\n", &z);
    fclose(fo);
    return 0;
}
 
int main() 
{    
     char *fname= "message.txt";
     int r=ReadFile(fname);
     
     if (r == 0)
     {
     next();
        while (tok != EOF) 
        for (;;)
        {
            if (tok == r) 
            {skip(r);continue;}
            printf("%.9g\n", expr()); continue;
        }
     }
     else
     next();
        while (tok != EOF) 
        for (;;)
        {
            if (tok == '\n') 
            {skip('\n');continue;}
            printf("%.9g\n", expr());
        }
     return 0;
}
Мне кажется, я чего-то где-то не дописал. Вот где - понять не могу. Помогите.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.01.2010, 23:45
Ответы с готовыми решениями:

Удалить в текстовом файле 1.txt все строки, которые встречаются в текстовом файле 2.txt
например имеется текстовый файл 1.txt c таким содержанием 111 222 333 444 555 и имеется...

В заданном текстовом файле нужно перечислить в обратном словарном порядке все различные слова из латинких букв которые содержат указанное сочетание бу
В заданном текстовом файле нужно перечислить в обратном словарном порядке все различные слова из...

Как распознать математическую функцию cos, sin с ячейки StringGrid?
Возникла такая проблема. Например в какой - то ячейке StringGrid написано cos(60), как мне именно...

1
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
18.01.2010, 10:08
В примере не вижу ни одного обращения к файлу

Почитай вот этот пост Пишем свой интерпретатор языка BASIC
И, если что-то непонятно (о чём там речь), то немного назад и немного вперёд. Там описана теория того, как должен работать парсер
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.01.2010, 10:08
Помогаю со студенческими работами здесь

Распознавание формулы со сложными математическими функциями в строке
Задание курсовика - распознать формулу функции введенную с клавиатуры и построить ее график...

Как перевести это математическое выражение в выражение понятное для компилятора?
вот пример: a=5*atan(x)-(1/4)*acos(x); b=(x+3*abs(x-y)+pow(x,2))/(abs(x-y)*z+pow(x,2));

Написать парсер математических выражений с функцией упрощения этих выражений
Люди, здравствуйте. Есть такая задача: написать упроститель выражений. На вход подается строка...

Ошибка "указанный параметр команды не распознан драйвером" (mciSendString)
Господа столкнулся со следующей проблемой если я пытаюсь открыть файл с название &quot; 1 а &quot; то при...

Правильно ли с математической точки зрения программа на С++ вычислит значение выражения 5 / 2 * 1.3?
Народ помогите пожалуйста с заданиями,буду очень благодарен. Сам не силен в программировании,но это...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru