Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2010, 21:19   #1
Blad47
Пользователь
 
Регистрация: 10.11.2008
Сообщений: 93
По умолчанию Строковый калькулятор

Привет.
Мне нужно написать строковый калькулятор на языке С++
Цитата:
написать программу, производящую вычисление значений вводимого пользователем выражения произвольного размера формата X1OP1X2OP2X3…OPN-1XN, где X1,…,XN – целые числа, а OP1,…,OPN-1 – арифметические операции (сложения, умножения, деления, вычитания) с учетом приоритета операций.

Пример:
Вводимое выражение: (1+2)*3/4
Результат: 2.25

Примечания:
• Алгоритм анализа выражений построить на основе польской обратной нотации
• Предусмотреть использование скобок для управления приоритетом операций в выражении
Так как я в данной среде совсем зеленый, прошу подсказать сперва стоящий самоучитель по с++ в электронном виде ( и лучше посоветовать автора,чтобы купить книгу для обучения).
Так же просьба подсказать алгоритм и шаги реализации программы.
Спасибо большое.

З.Ы. про обратную нотациую почитал, вроде понял смысл
Blad47 вне форума Ответить с цитированием
Старый 16.09.2010, 19:57   #2
RHuman
 
Регистрация: 22.03.2010
Сообщений: 3
По умолчанию

C учебником подскажу: классный учебник - Т.А. Павловская "С/С++ программирование на языках высокого уровня". Сам по ней учусь! Но с калькулятором пока помочь не могу (сам зеленый!), учусь на первом курсе!

Последний раз редактировалось RHuman; 16.09.2010 в 20:07.
RHuman вне форума Ответить с цитированием
Старый 16.09.2010, 20:23   #3
Blad47
Пользователь
 
Регистрация: 10.11.2008
Сообщений: 93
По умолчанию

Спасибо за учебник, так вот я тоже )) Это первая лаба
Blad47 вне форума Ответить с цитированием
Старый 16.09.2010, 21:24   #4
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Пользуйтесь поиском: http://programmersforum.ru/showthread.php?t=33111
Только она на паскале. Я даже на ассемблере ее переписывал
Могу и на С++
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 17.09.2010, 00:01   #5
Blad47
Пользователь
 
Регистрация: 10.11.2008
Сообщений: 93
По умолчанию

Спасибо, мне код не обязателен. Обычным языком поясните алгоритм. Вот я перевел числа в ОПН, а дальше что?
Blad47 вне форума Ответить с цитированием
Старый 17.09.2010, 10:13   #6
RHuman
 
Регистрация: 22.03.2010
Сообщений: 3
По умолчанию

Ты хочешь сказать, это первая лаба на первом курсе?? Ты в каком универе то учишься??
RHuman вне форума Ответить с цитированием
Старый 17.09.2010, 18:25   #7
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

а дальше просто выполняешь по порядку действия. т.е (1+2)*3/4 в польской нотации будет: 1 2 + 3 4 / * Здесь желательно организовать стек для выполнения операций. Логика такая: если встречается число, оно заносится в стек, а если знак операции, то (операнд предшествующий вершине стека)_операция_(операнд в вершине стека). Т.е. операция всегда проводится между вершиной стека и операндом, находящимся за ней. После выполнения эти два операнда удаляются из стека, а на их место записывается один результат. Если не понятно, то почитай про стек сопроцессора х86. Там именно такая реализация, заточенная под обратную польскую запись.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 20.09.2010, 14:15   #8
Blad47
Пользователь
 
Регистрация: 10.11.2008
Сообщений: 93
По умолчанию

Цитата:
Сообщение от RHuman Посмотреть сообщение
Ты хочешь сказать, это первая лаба на первом курсе?? Ты в каком универе то учишься??
Я не хочу Я говорю, что это первая лаба на втором курсе. У нас только начался предмет языки программирования, вот так и учимся, только дома
Политех

На вики букс нашел следующий код.
Код:
#include <stdio.h>
 #include <malloc.h>
 
 int sp = 0;
 int stack[1000];
 int pop(void) {
     if (sp > 0) {
          return stack[--sp];
     } else { 
          fprintf(stderr, "Невозможно выполнить POP для пустого стека.\n");
          return 0;
     }
 };
 void push(int a) {
     stack[sp++] = a;
 };
 int empty() {
     return (sp == 0);
 }
 
 int main() {
     int i;
     while (!feof(stdin)) {
         int c = getchar();
         int x;
         switch (c) {
             case '\n':
             case ' ' : break;
             case '=' : printf("Result = %d\n", s.pop()); break;
             case 27  : goto RESULT;
             case '+' : push(pop() + pop()); break;
             case '-' : push(-pop() + pop()); break;
             case '*' : push(pop() * pop()); break;
             default:
                 ungetc(c, stdin);
                 if (scanf("%d", &x) != 1) {
                     fprintf(stderr, "Can't read integer\n");
                     return -1;
                 } else {
                     s.push(x);
                 }
                 break;
          }
    }
 RESULT:
     i = 0;
     while ( !empty() ){
         printf("Stack[%d] = %d\n", i,  s.pop());
         i++;
     }
     return 0;
 }
оригинал тут вики

Пытаюсь разобраться с кодом. Не совсем понятно это
Код:
int pop(void) {
     if (sp > 0) {
          return stack[--sp];
     } else { 
          fprintf(stderr, "Невозможно выполнить POP для пустого стека.\n");
          return 0;
     }
Поясните, пожалуйста.

Так же хочу спросить.( не относится к коду, который выше)
Я пытаюсь ввести выражение с клавиатуры. Для этого использую цикл for и посимвольно считываю выражение, заполняя ячейки массива. Но если массив типа int , то он не считает мои операнды. А если я сделаю массив типа char, то не смогу оперировать переменными как числами. Поясните, пожалуйста, мне

Последний раз редактировалось Stilet; 20.09.2010 в 14:38.
Blad47 вне форума Ответить с цитированием
Старый 07.10.2010, 23:23   #9
Blad47
Пользователь
 
Регистрация: 10.11.2008
Сообщений: 93
По умолчанию

Подскажите, пожалуйста, где можно наиболее подробно почитать про стеки с примерами?
Blad47 вне форума Ответить с цитированием
Старый 08.10.2010, 00:23   #10
Blad47
Пользователь
 
Регистрация: 10.11.2008
Сообщений: 93
По умолчанию

Код:
// lab11.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "iostream"
#include "stack"
#include "ctype.h"
#include "cstring"


using namespace std;

int prior(char a)
{
	switch(a)
	{
	case'*':
	case'/':
		return 4;
	case'+':
	case'-':
		return 3;
	case'(':
		return 2;
	case')':
		return 1;
	default:
		return 0;
	}
}

template <typename T>
class Stack
{
	T stack[100];
	int top;
public:
	Stack(){top = 0;}
	void push(char item);
	T pop();
};
//помещаем элемент
template <typename T>
void Stack<T>::push(char item)
{
	if(top>=100)
	{
		cout<<"\n Stack is full.\n";
		return;
	}
	stack[top]=item;
	top++;
}
//Выталкиваем элемет
template <typename T>
T Stack<T>::pop()
{
	if(top<=0)
	{
		cout<<"\nStack is empty.\n";
		return 0;
	}
	top--;
	return stack[top];
}
//char
void Stack<char>::push(char item)
{
	if(top>=99)
	{
		cout<<"\nStack is full.\n";
		return;
	}
	stack[top]=item;
	top++;
}


int _tmain(int argc, _TCHAR* argv[])
{

	Stack<char> st1;
	cout<<"Vvedite vir"<<"\n";
	char vir[100];
	char vih[100];
	cin.getline(vir,99);
    for(int i=0;i<100;i++)
	{
		if(prior(vir[i]=0))
		{
          vih[i]=vir[i];
		}
		else if(prior(vir[i]=2))
		{
          st1.push(vir[i]);
		}
		else if(prior(vir[i]=1))
		{
			do{
				vih[i]=st1.pop();
			}
			while(st1.pop()!='(');
		  
		}
		

	}

	for(int i=0;vir[i]!=0;i++)
	{
		cout<<vih[i];
	}
	
getchar();
	return 0;
}
vir- входная строка. vih - выходная
Начал потихоньку реализовывать. Помогите разобраться почему компилятор выдает следующее?
Blad47 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Строковый тип McJordan Паскаль, Turbo Pascal, PascalABC.NET 1 26.08.2010 17:22
Строковый тип dusya9992 Паскаль, Turbo Pascal, PascalABC.NET 1 26.08.2010 00:53
Строковый тип Koshmarick Помощь студентам 8 05.11.2009 12:37
строковый калькулятор *Лена* Фриланс 4 06.05.2008 00:41