Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/16: Рейтинг темы: голосов - 16, средняя оценка - 4.63
0 / 0 / 0
Регистрация: 26.02.2011
Сообщений: 3

Калькулятор для основных действий

26.02.2011, 13:50. Показов 3265. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите написать програму-калькулятор на С, долна уметь выполнять действия + - * / ^(степень) по приоритетам и расспознавать ( ), ответ выводить на экран. Желательно канешно на голом С.

Уже нашел програму но оч плохо в ней соображаю

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <assert.h>
int tok;
double tokval;
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(stderr, "Bad character: %c\n", c); abort();
     }
}
 
void skip(int t) { assert(tok == t); next(); }
 
double expr();
  
// numpar ::= number | '(' expr ')'
double numpar() {
    if (tok == 'n') { double x = tokval; skip('n'); return x; }
    skip('('); double x = expr(); skip(')'); return x;
}
 
// factor ::= numpar | numpar '^' factor
double factor() {
    double x = numpar();
    if (tok == '^') { skip('^'); x = pow(x, factor()); }
     return x;
}
 
// term ::= factor | term '*' factor | term '/' factor
double term() {
    double x = factor();
    for (;;) {
        if (tok == '*') { skip('*'); x *= factor(); }
        else if (tok == '/') { skip('/'); x /= factor(); }
        else return x;
    }
}
 
// expr ::= term | expr '+' term | expr '-' term
double expr() {
    double x = term();
    for (;;) {
        if (tok == '+') { skip('+'); x += term(); }
        else if (tok == '-') { skip('-'); x -= term(); }
        else return x;
    }
}
  
int main() {
    next();
    while (tok != EOF) {
        if (tok == '\n') { skip('\n'); continue; }
        printf("%.9g\n", expr());
    }
    return 0;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.02.2011, 13:50
Ответы с готовыми решениями:

Разработать программу для реализации основных действий с линейным динамическим списком
Здравствуйте, помогите пожалуйста с заданием. Горю через 2 дня здавать работу. Заданее следующее: Разработать программу для реализации...

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

Создать программу для реализации основных действий с двунаправленным динамическим списком
Помогите пожалуйста разобраться в программе Visual Studio 2010!!! Что нужно сделать ? что бы создать программу для реализации основных...

7
Freelance
Эксперт С++
 Аватар для asics
2891 / 1826 / 356
Регистрация: 09.09.2010
Сообщений: 3,841
26.02.2011, 13:58
Цитата Сообщение от mementoMORE Посмотреть сообщение
Уже нашел програму но оч плохо в ней соображаю
А в каком Вы хорошо будете соображать ?
0
0 / 0 / 0
Регистрация: 26.02.2011
Сообщений: 3
26.02.2011, 14:38  [ТС]
с алгоритмом пропроще этой, просто я не могу понять как работают несколько из функций этой программы
0
0 / 0 / 0
Регистрация: 25.10.2010
Сообщений: 17
26.02.2011, 18:36
Вот программа калькулятора, только без возведения в степень, но на С++. Если постараться, можно переделать под С и добавить еще одну операцию.
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
#include <iostream>
 
using namespace std;
 
int main()
{ 
    setlocale(LC_ALL,"rus");
    cout << "Простейший калькулятор \n\n";
    cout << "Для того,чтобы складывать,нажмите + \n";
    cout << "Для того,чтобы вычитать,нажмите - \n";
    cout << "Для того,чтобы умножать,нажмите * \n";
    cout << "Для того,чтобы делить,нажмите / \n\n";
    char Operation;
    cout << "Введите знак операции: \n";
    cin >> Operation;
    double A, B, Result;
    bool Ok = Operation == '+' || Operation == '-' || Operation == '*' || Operation == '/';
    if (Ok)
    {
        cout << "Введите А и В : ";
        cin >> A >> B;
    }
    else 
    {
        cout << "Неверный знак операции" << endl;
        system ("pause");
        return 0;
    }
    switch(Operation)
    {
        case '+':
            Result = A + B;
            break;
        case '-' :
            Result = A - B;
            break;
        case '/' :
            if (B)
                Ok = false;
            else
                Result = A / B;
                break;
        case '*' :
            Result = A * B;
            break;
    }
    if (Ok)
        cout << "\n\t" << A << " " << Operation << " " << B << " = " << Result << endl;
    else
        cout << "Деление на ноль!\n";
    system ("pause");
    return 0;
}
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
26.02.2011, 18:45
innuska, Не покатит. Приоритет не учитывается. Посчитайте на нем
2+2*2/5-10.

Должно выйти - 2+0.8-10=-7.2 (вроде так).
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
26.02.2011, 23:53
Цитата Сообщение от mementoMORE Посмотреть сообщение
я не могу понять как работают несколько из функций
Каких? Задавайте уже вопросы, а не жалуйтесь на непонимание логики! У вас есть готовая программа (с ужасным оформлением кода), так спрашивайте по ней. Из-за того, что вам такой код не нравится и вы хотите другой, никто писать за вас лабу не побежит.
0
0 / 0 / 0
Регистрация: 26.02.2011
Сообщений: 3
27.02.2011, 12:08  [ТС]
для начала интересует вот этот кусок, ну какбэ я понял что он вмето целого числа забирает дисятичную дробь, только вот каким образом
C
1
2
3
4
5
if (isdigit(c) || c == '.') {
                ungetc(c, stdin);
                scanf(" %lf", &tokval);
                return tok = 'n';
                }
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
27.02.2011, 17:11
mementoMORE, Если считанный символ - цифра или же десятичная точка, тогда, возвращаем символ в поток. Считываем число double из потока. Возвращаем токен = 'n' (судя по всему, что считано число).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.02.2011, 17:11
Помогаю со студенческими работами здесь

Разработать программу для реализации основных действий с двунаправленным динамическим списком (я правильно составила код?)
Разработать программу для реализации основных действий с двунаправленным динамическим списком: проход по списку в ПРЯМОМ направлении с...

Калькулятор для выполнения арифметических действий с обыкновенными дробями
Создать web-форму (aspx) Задание:создать дробный калькулятор. Калькулятор для выполнения арифметических действий с обыкновенными дробями.

Как создать калькулятор, использующий для выбора арифметических действий переключатели
и с учетом коэффицента,

Создайте программу – калькулятор на четыре арифметический действий для вводимых чисел любого знака в диапазоне от 10-10 до 1010
Здравствуйте уважаемые форумчане. Не могу понять постановку некоторых задач, прошу помощи не в написании пока что этой программы, ибо я ее...

Напишите программу «калькулятор» на четыре основных арифметических операции
Напишите программу «калькулятор», позволяющую вычислять по выбору одну из четырех основных арифметических операций. Снабдите программу...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru