14.05.2009, 01:46 | #31 (permalink) | |
Member
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
|
Цитата:
Для сложения и умножения это не имеет значения, оно все работает как надо, а вычетание и деление нужно подправить: Код:
void stack_sub() /* Вычетание */ { int a = stack_pop(); stack_push( stack_pop() - a ); } void stack_div() /* Деление */ { int a = stack_pop(); stack_push( stack_pop() / a ); } Так 4 2 / даст 2. |
|
11.10.2009, 14:39 | #33 (permalink) |
Новичок
Регистрация: 26.04.2009
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Всем привет)) Снова я...Теперь уже с задачей на С++...
Вот такое условие: Написать программу, которая: 1) читает из выбранного файла числа, 2) выводит их на экран, 3) подсчитывает заданное выражение: среднее из (Ак-Аср_м)2 (двойка после скобки значит квадрат) для неотрицательных Ак, 4) выводит в тот же файл и на экран полученное значение под колонкой чисел через разделительную черту. Например, в файле должно быть так: 1,1 2,2 3 ------- 6,3 Числа в файле действительные, разделитель целой и дробной части – запятая. Количество чисел может быть любым. Программа должна содержать главное меню, панель инструментов и возможность вызова окна «О программе». Выбор файла с числами – с помощью стандартного диалога открытия файла. Предполагается, что Ак – к-ое число в файле, Аср_м – среднее среди отрицательных. Буду признательна за помощь)) Последний раз редактировалось Fonochka; 11.10.2009 в 14:43 |
11.10.2009, 22:39 | #34 (permalink) | |
Member
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
|
Цитата:
|
|
13.10.2009, 00:01 | #35 (permalink) |
Новичок
Регистрация: 26.04.2009
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Borland C++ Builder 5
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
12.04.2012, 23:09 | #36 (permalink) |
Новичок
Регистрация: 12.04.2012
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Help Me
Здравствуйте! Мне жутко нужна помощь...экзамен....что б его)))
Нужно написать программу стековый калькулятор на С Вот условия задачи: Код:
Стековый калькулятор На входе - строка, содержащая выражение в постфиксной записи. На выходе - результат вычислений. Пример: вход: 1 23 + 4 - 5 1 - * выход: 80 Должны поддерживаться следующие двухместные арифметические операции: + - * / Каждая из них берет аргументы со стека, сначала первый, потом - второй, выполняет над ними действие и результат помещает на вершину стека. В качестве операндов допустимы как целочисленные константы, так и имена переменных. Имя переменной может содержать символы A-Z,a-z,0-9,_, но начинаться с цифры не может. Решение оформить в виде отдельного .c модуля, .h файл приведен ниже. Предусмотреть корректную обработку ошибок. Снабдить модульными тестами (unit-tests). #ifndef EXEC_POSTFIX_H #define EXEC_POSTFIX_H /* типы лексем: константы, операции, имена переменных */ typedef enum { tt_CONST, tt_OPER, tt_ID } TokenType; /* виды операций: сложение, вычитание, умножение, деление */ typedef enum { op_ADD, op_SUB, op_MUL, op_DIV } OperType; /* максимальная длина имени переменной */ #define MAX_ID_LEN 40 typedef struct { TokenType ttype; union Value { /* с лексемой связано одно из следующих значений */ int inum; OperType otype; char id[MAX_ID_LEN + 1]; } tvalue; } Token; typedef struct { char id[MAX_ID_LEN + 1]; int value; } Variable; /* перевести текстовую строку (s) в массив лексем (*tokens). получается массив длиной (*len). память под выходной массив выделяется внутри функции, а освобождается вызывающей стороной. в случае успеха вернуть 0, иначе какой-либо код ошибки. */ int tokenize(const char *s, Token **tokens, int *len); /* вычислить переданное постфиксное выражение (postfix, длина - len), с использованем массива именованных переменных (vlist, длина vlen), результат записать в *result. в случае успеха вернуть 0, иначе какой-либо код ошибки. */ int execute_postfix(const Token *postfix, int len, const Variable *vlist, int vlen, int *result); #endif |
21.04.2012, 20:17 | #38 (permalink) |
Новичок
Регистрация: 12.04.2012
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Вообщем, мало ли кому пригодится, всякое бывает, вот стековый калькулятор с функцией записи стека в линейный односвязный список на Си.
Код:
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> using namespace std; #define BUFFER_LENGTH 81 //Структура, которая будет хранить один элемент списка struct Node { int value; //Значение элемента списка Node* next; //Ссылка на следующее значение }; /* Функции самого стека */ void stack_push(Node * beg, int key) /* Добавить элемент в стек */ { //Берем начальный элемент Node *tec = beg; //проходим все элементы списка до последнего... while (tec->next != NULL) tec = tec->next; //Создаем новый элемент Node * T = new Node; T->value = key; T->next = NULL; //Подключаем элемент в список в конец... tec->next = T; } int stack_pop(Node * beg) /* Извлечь элемент из стека */ { Node *tec = beg; if (tec->next == NULL) return -1; else { Node *prev = tec; while (tec->next != NULL) { prev = tec; tec = tec->next; } int a = tec->value; prev->next = NULL; return a; } } Node * stack_init() /* Начальная инициализация стека*/ { Node * T = new Node; T->next = NULL; T->value = -1; return T; } void Print(Node * beg) { //Берем первый элемент списка Node *tec = beg; while (tec->next != NULL) { //Переходим на следующий элемент tec = tec->next; //Печатаем значение текущего элемента cout << tec->value << " "; } cout << endl; } /* Функции стекового калькулятора */ void stack_add(Node * beg) /* Сложение */ { int a = stack_pop(beg); int b = stack_pop(beg); stack_push(beg, a + b); } void stack_sub(Node * beg) /* Вычетание */ { int a = stack_pop(beg); int b = stack_pop(beg); stack_push(beg, b - a ); } void stack_mul(Node * beg) /* Умножение */ { int a = stack_pop(beg); int b = stack_pop(beg); stack_push(beg, a * b ); } void stack_div(Node * beg) /* Деление */ { int a = stack_pop(beg); int b = stack_pop(beg); stack_push(beg, b / a ); } /* Функции работы с пользователем */ void parse(Node *stack, char *str) /* Функция распознавания строки */ { char *st; st = strtok(str, " "); while (st != NULL) { switch(st[0]) { case '.': Print(stack); break; case '+': stack_add(stack); break; case '-': stack_sub(stack); break; case '*': stack_mul(stack); break; case '/': stack_div(stack); break; default: stack_push(stack, atoi(st)); break; } st = strtok(NULL, " "); } } /* Главная функция */ int main() { char buf[BUFFER_LENGTH]; Node * stack = stack_init(); printf( "Введите строки для вычисления:\n" ); printf( "(для выхода введите строку, начинающуюся с символа '#')\n" ); gets(buf); while (1) { if ((strlen(buf) > 0) && (buf[0] != '#')) { parse(stack, buf); cout << stack_pop(stack) << endl; } else return 0; gets(buf); } } |
09.05.2013, 22:02 | #39 (permalink) |
Новичок
Регистрация: 09.05.2013
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
как сделать возведение в степень, чтобы было **
в коде: #include <stdio.h> #include <stdlib.h> #include <string.h> #define STACK_LENGTH 80 #define BUFFER_LENGTH 81 /* Переменные для хранения стека */ int Stack_Count; int Stack_Array[STACK_LENGTH]; /* Функции самого стека */ void stack_push(int n) /* Добавить элемент в стек */ { if( Stack_Count < STACK_LENGTH ) Stack_Array[Stack_Count++] = n; } int stack_pop() /* Извлечь элемент из стека */ { if(Stack_Count != 0) return Stack_Array[--Stack_Count]; else return 0; } void stack_init() /* Начальная инициализация стека*/ { Stack_Count = 0; } /* Функции стекового калькулятора */ void stack_add() /* Сложение */ { stack_push( stack_pop() + stack_pop() ); } void stack_sub() /* Вычетание */ { stack_push( stack_pop() - stack_pop() ); } void stack_mul() /* Умножение */ { stack_push( stack_pop() * stack_pop() ); } void stack_div() /* Деление */ { stack_push( stack_pop() / stack_pop() ); } void stack_print() /* Печать последнего элемента */ { printf( "Last: %d\n", stack_pop() ); } /* Функции работы с пользователем */ void parse(char *str) /* Функция распознавания строки */ { char *st; for(st = strtok(str, " "); st != NULL; st = strtok(NULL, " ")) { switch(*st) { case '+': stack_add(); break; case '-': stack_sub(); break; case '*': stack_mul(); break; case '/': stack_div(); break; case '.': stack_print(); break; default: stack_push(atoi(st)); break; } } } /* Главная функция */ int main() { char buf[BUFFER_LENGTH]; stack_init(); // Инициализируем стек printf( "Введите строки для вычисления:\n" ); printf( "(для выхода введите строку, начинающуюся с символа '#')\n" ); for( scanf("%s", buf); (strlen(buf) > 0) && (buf[0] != '#'); scanf("%s", buf) ) // Запрашиваем строки и выполняем их parse(buf); return 0; } |
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|