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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2010, 22:56   #1
spirit_trapper
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 19
Лампочка Чтение из файла (С)

Имеется строковый калькулятор и текстовый файл message.txt Нужно чтобы калькулятор распознавал и вычислял математическое выражение, указанное в текстовом файле. т.е., грубо говоря, нужно чтобы при запуске калькулятор выдавал ответ на выражение, указанное в текстовом файле,а после этого мог работать в обычном режиме.

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

Вот что у меня получилось (точнее не получилось):
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>

int tok;
double tokval;
int ReadFile(char *fname);

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(stdout, "Некорректный ввод: %c\n", c); abort();
	}
	// return 0;
}

void skip(int t) 

	{if (tok == t) next();}

double expr();

double numpar() 
{
	if (tok == 'n') 
	{ double x = tokval; skip('n'); return x; }
	skip('('); double x = expr(); skip(')'); 
	return x;
}

double factor() 
{
	double x = numpar();
	if (tok == '^') 
	{ skip('^'); x = pow(x, factor()); }
	return x;
}

double term() 
{
	double x = factor();
	for (;;) 
	{
		if (tok == '*') { skip('*'); x *= factor(); }
		else 
		if (tok == '/') { skip('/'); x /= factor(); }
		else 
		return x;
	}
}

double expr() 
{
	 double x = term();
	 for (;;) 
	 {
		if (tok == '+') { skip('+'); x += term(); }
		else 
		if (tok == '-') { skip('-'); x -= term(); }
		else 
		return x;
	 }
}

int ReadFile(char *fname)
{
	FILE *fo;
	int z;
	
	if((fo=fopen(fname,"rf"))==NULL)
	{
		printf("\nОшибка: ");
		perror(fname);
		return 1;
	}
	else
	fscanf(fo,"%d\n", &z);
	fclose(fo);
	return 0;
}

int main() 
{	 
	 char *fname= "message.txt";
	 int r=ReadFile(fname);
	 
	 if (r == 0)
	 {
	 next();
		while (tok != EOF) 
		for (;;)
		{
			if (tok == r) 
			{skip(r);continue;}
			printf("%.9g\n", expr()); continue;
		}
	 }
	 else
	 next();
		while (tok != EOF) 
		for (;;)
		{
			if (tok == '\n') 
			{skip('\n');continue;}
			printf("%.9g\n", expr());
		}
	 return 0;
}
Мне кажется, я чего-то где-то не дописал. Вот где - понять не могу. Помогите.

Последний раз редактировалось spirit_trapper; 17.01.2010 в 23:20.
spirit_trapper вне форума Ответить с цитированием
Старый 18.01.2010, 22:11   #2
spirit_trapper
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 19
По умолчанию

Понял некоторые ошибки и поменял кое-что. Но всё равно есть несоответствия. Вот:

Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <ctype.h>

int tok;
double tokval;
char *ReadFile(char *fname);

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(stdout, "Некорректный ввод: %c\n", c); abort();
	}
	// return 0;
}

void skip(int t) 

{if (tok == t) next();}

double expr();

double numpar() 
{
	if (tok == 'n') 
	{ double x = tokval; skip('n'); return x; }
	skip('('); double x = expr(); skip(')'); 
	return x;
}

double factor() 
{
	double x = numpar();
	if (tok == '^') 
	{ skip('^'); x = pow(x, factor()); }
	return x;
}

double term() 
{
	double x = factor();
	for (;;) 
	{
		if (tok == '*') { skip('*'); x *= factor(); }
		else 
		if (tok == '/') { skip('/'); x /= factor(); }
		else 
		return x;
	}
}

double expr() 
{
	 double x = term();
	 for (;;) 
	 {
		if (tok == '+') { skip('+'); x += term(); }
		else 
		if (tok == '-') { skip('-'); x -= term(); }
		else 
		return x;
	 }
}

char *ReadFile(char *fname)
{
	FILE *fo=fopen(fname,"r");
	char *z;
	
	if(fo == NULL)
	{
		printf("\nОшибка чтения\n");
		perror(fname);
	}
	else
	z=(char *)malloc(sizeof(char));
	fscanf(fo,"%s",z);
	free(z);
	fclose(fo);
	return z;
}

int main() 
{	
	 char *fname = "message.txt";
	 char *r=(char *)malloc(sizeof(char));
	 fscanf(ReadFile, "%s", r);
	 next();
		while (tok != EOF) 
		for (;;)
		{	
			if (tok == r);
			{skip(r); continue;}
			printf ("%.9g\n", r);
			if (tok == '\n') 
			{skip('\n');continue;}
			printf("%.9g\n", expr());
		}
	free(r);
	return 0;
}
Компилятор ругается вот так:

calc01.cpp:99: error: cannot convert ‘char* (*)(char*)’ to ‘FILE*’ for argument ‘1’ to ‘int fscanf(FILE*, const char*, ...)’
calc01.cpp:104: error: ISO C++ forbids comparison between pointer and integer
calc01.cpp:105: error: invalid conversion from ‘char*’ to ‘int’
calc01.cpp:105: error: initializing argument 1 of ‘void skip(int)’

Понимаю что неправильно выделил память и описал "r". Как это сделать правильно? Помогите.
spirit_trapper вне форума Ответить с цитированием
Старый 18.01.2010, 22:28   #3
Alex_FF
Удален
Форумчанин
 
Регистрация: 02.12.2009
Сообщений: 309
По умолчанию

каким образом ваша программа будет вычислять, к примеру, ((12 * 34) - 5!)^(-1/2)
???
Alex_FF вне форума Ответить с цитированием
Старый 18.01.2010, 22:47   #4
spirit_trapper
Пользователь
 
Регистрация: 04.12.2009
Сообщений: 19
По умолчанию

Цитата:
Сообщение от Alex_FF Посмотреть сообщение
каким образом ваша программа будет вычислять, к примеру, ((12 * 34) - 5!)^(-1/2)
???
Это строковый калькулятор, вычисляющий простые выражения. Там только цифры и символы +-*/^(). И всё. Так в задании указанно. А если принцип: next() распознает и проверяет, numpar() вводит скобки, factor(), term(), expr() - описывают использование символов и операции с ними, цепляются друг за друга по цепочке. ReadFile читает из файла txt.
spirit_trapper вне форума Ответить с цитированием
Старый 26.05.2010, 19:37   #5
Rosom@ch@
Новичок
Джуниор
 
Регистрация: 26.05.2010
Сообщений: 1
По умолчанию коментарии

А можете прокоментировать Вашу програмку
Rosom@ch@ вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Чтение из файла DimOn4Ik PHP 1 02.01.2010 22:41
чтение из файла dedokk1234 Общие вопросы C/C++ 0 15.06.2009 19:10
чтение из файла. aschak Общие вопросы C/C++ 9 30.12.2008 15:24
Чтение из файла e@gle Общие вопросы Delphi 3 14.12.2008 17:21
Чтение из файла Need_Help Паскаль, Turbo Pascal, PascalABC.NET 5 19.05.2007 05:37