Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > C/C++/С#


Ответ
 
Опции темы Опции просмотра
Старый 14.05.2009, 01:46   #31 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
По умолчанию

Цитата:
Сообщение от Fonochka Посмотреть сообщение
У меня снова вопрос....Там в проге перепутана очередь, по которой стек извлекает элементы..... То есть, например, он сначала извлекает первый, а потом второй....а нужно наоборот....как это исправить?? То есть, если вводить например польской записью 4 2 / то результатом получается 0, т.к. он 2 делит на 4....
А, ну да, потому что он извлекает сначала последний...
Для сложения и умножения это не имеет значения, оно все работает как надо, а вычетание и деление нужно подправить:
Код:
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.
csbwalker вне форума   Ответить с цитированием
Старый 14.05.2009, 15:57   #32 (permalink)
Fonochka
Новичок
 
Регистрация: 26.04.2009
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Благодарю))))
Fonochka вне форума   Ответить с цитированием
Старый 11.10.2009, 14:39   #33 (permalink)
Fonochka
Новичок
 
Регистрация: 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
Fonochka вне форума   Ответить с цитированием
Старый 11.10.2009, 22:39   #34 (permalink)
csbwalker
Member
 
Аватар для csbwalker
 
Регистрация: 03.03.2009
Сообщений: 87
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 187
Question

Цитата:
Сообщение от Fonochka Посмотреть сообщение
Всем привет)) Снова я...Теперь уже с задачей на С++...
Вот такое условие:
Написать программу, которая:
1) читает из выбранного файла числа,
2) выводит их на экран,
3) подсчитывает заданное выражение: среднее из (Ак-Аср_м)2 (двойка после скобки значит квадрат) для неотрицательных Ак,
4) выводит в тот же файл и на экран полученное значение под колонкой чисел через разделительную черту.
Например, в файле должно быть так:
1,1
2,2
3
-------
6,3

Числа в файле действительные, разделитель целой и дробной части – запятая.
Количество чисел может быть любым.
Программа должна содержать главное меню, панель инструментов и возможность вызова окна «О программе».
Выбор файла с числами – с помощью стандартного диалога открытия файла.
Предполагается, что Ак – к-ое число в файле, Аср_м – среднее среди отрицательных.

Буду признательна за помощь))
Какая среда программирования используется? (Вопрос в основном из-за графического интерфейса.)
csbwalker вне форума   Ответить с цитированием
Старый 13.10.2009, 00:01   #35 (permalink)
Fonochka
Новичок
 
Регистрация: 26.04.2009
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Borland C++ Builder 5
Fonochka вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 12.04.2012, 23:09   #36 (permalink)
Detsle
Новичок
 
Регистрация: 12.04.2012
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Arrow 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
Detsle вне форума   Ответить с цитированием
Старый 16.04.2012, 16:12   #37 (permalink)
Detsle
Новичок
 
Регистрация: 12.04.2012
Сообщений: 11
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Что прям никто не знает?((
Detsle вне форума   Ответить с цитированием
Старый 21.04.2012, 20:17   #38 (permalink)
Detsle
Новичок
 
Регистрация: 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);
    }
    
}
Detsle вне форума   Ответить с цитированием
Старый 09.05.2013, 22:02   #39 (permalink)
ana27
Новичок
 
Регистрация: 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; }
ana27 вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 01:04.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.