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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.07.2012, 14:45   #1
Chelovekpredel
Пользователь
 
Регистрация: 31.03.2012
Сообщений: 33
По умолчанию Калькулятор(обратная польская запись).

В книге Керниган и Ритчи язык Си разбирают задачу по написанию калькулятора. Вот и сам код:
Код:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define MAXOP 100
#define NUMBER '0'
#define MAXVAL 100
#define BUFSIZE 100

int sp=0;
double val[MAXVAL];
char buf[BUFSIZE];
int bufp=0;

int getop(char []);
void push(double);
double pop(void);
int getch(void);
void ungetch(int);

int _tmain(int argc, _TCHAR* argv[])
{
	int type;
	double op2;
	char s[MAXOP];
	
	while ((type=getop(s))!=EOF)
	{
		switch (type)
		{
		case NUMBER:
			push(atof(s));
			break;
		case '+':
			push(pop() + pop());
			break;
		case '*':
			push(pop() * pop());
			break;
		case '-':
			op2=pop();
			push(pop()-op2);
			break;
		case '/':
			op2=pop();
			if (op2!=0.0)
				push(pop()/op2);
			else
				printf("ERROR!\n");
			break;
		case '\n':
			printf("\t%.8g\n", pop());
			break;
		default:
			printf("Default operation %s\n", s);
			break;
		}
	}
	getchar();
	return 0;
}

void push(double f)
{
	if (sp<MAXVAL)
		val[sp++]=f;
	else
		printf("ERROR!\n",f);
}

double pop(void)
{
	if (sp>0)
		return val[--sp];
	else
	{
		printf("ERROR!\n");
		return 0.0;
	}
}

int getop(char s[])
{
	int i,c;

	while ((s[0]=c=getch())==' ' || c=='\t')
		;
	s[1]='\0';
	if (!isdigit(c) && c!='.')
		return c;
	i=0;
	if (isdigit(c))
		while (isdigit(s[++i]=c=getch()))
			;
	if (c=='.')
		while (isdigit(s[++i]=c=getch()))
			;
	s[i]='\0';
	if (c!=EOF)
		ungetch(c);
	return NUMBER;
}

int getch(void)
{
	return (bufp>0) ? buf[--bufp]: getchar();
}

void ungetch(int c)
{
	if (bufp>=BUFSIZE)
		printf("ungetch: too much chars\n");
	else
		buf[bufp++]=c;
}
В общем проблем нет, но я совершенно не понимаю, как работает функция getop и функция getch.
Был бы очень признателен, если бы кто-нибудь помог мне с этим разобраться.
Заранее спасибо.
Chelovekpredel вне форума Ответить с цитированием
Старый 01.07.2012, 22:30   #2
Vlt
Пользователь
 
Регистрация: 18.05.2012
Сообщений: 27
По умолчанию

Здравствуйте!
Книга хорошая, читайте внимательнее, так же рекомендую книгу «Программирование на языке Си» авторы Подбельский В.В. Фомин С.С.

Функция GETCH доставляет следующий символ ввода, подлежащий рассмотрению; функция UNGETCH помещает символ назад во ввод, так что при следующем обращении к GETCH он будет возвращен. Функция UNGETCH помещает возвращаемые назад символы в совместно используемый буфер, являющийся символьным массивом.
Функция GETCH читает из этого буфера, если в нем что-либо имеется; если же буфер пуст, она обращается к GETCHAR. При этом также нужна индексирующая переменная, которая будет фиксировать позицию текущего символа в буфере.

Функция GETOP считывает цифры подряд /возможно с десятичной точкой/ и запоминает их, пока последовательность не прерывается. Если при этом не происходит переполнения, то функция возвращает NUMBER и строку цифр. Если же число оказывается слишком длинным, то GETOP отбрасывает остальную часть строки из файла ввода, так что пользователь может просто перепечатать эту строку с места ошибки; функция возвращает TOOBIG как сигнал о переполнении.
Vlt вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обратная польская запись на С++ machines Visual C++ 0 16.05.2011 01:21
Обратная польская запись C++ nurgayin Помощь студентам 0 24.03.2011 18:48
Обратная польская запись alexobenikov Общие вопросы C/C++ 12 25.11.2010 23:03
Обратная польская запись Катуха Помощь студентам 6 27.12.2008 10:23
Обратная польская запись Роман Радер Общие вопросы Delphi 0 09.12.2008 18:18