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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2012, 01:38   #1
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию C++ Visual: как собрать все числа, следя за операторами

Дорогие форумчане, нужен добрый совет. Самая сложная часть реализована, осталась ерунда, но мне что-то не сообразить.

Есть символьный массив (не в файле, а уже как итог предидущих действий), где в перемешку собраны вещественные числа и математические операторы. Мне надо - аккуратно выудить оттуда числа по порядку, и если символ оператора, выполнить действия с выгруженными до этого числами, согласно этому оператору ...

Проблема в том, что я не знаю, сколько вещественных чисел будет и не знаю, каким разделителем они будет разделяться (у меня могут быть пара пробелов подряд, или сразу за числом знак операции).

Например, такая строчка
Код:
4.5 7.89  + 45.2  2*
Стандартные scanf ("%f", &n) и ("%s", result) работают, пока нет математического оператора.... но как только вмешивается любой символ, кроме пробела, все, труба... И как, используя scanf (или может что-то иное), можно вытаскивать и вещественные числа целиком и строковые символы?

Вот наброски
Код:
int main()
{

float x1=0.00;
float temp=0.0;
char result[100]="";
float n;

cout<<"Vvedite formulu"<<endl;

scanf("%s", result);
scanf ("%f",&n);
temp=n;

cout<<result<<endl;
cout<<temp;
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 08.05.2012, 02:21   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

Как-то так:
Код:
#include <iostream>

int main()
{
	// вот строка введенная тупым юзером
	char strorig[] = "4.5**7.89+  45.2      eklmn 2     qwe *44  ";
	// находим ее длину
	int origlen = strlen(strorig);
	// создаем новую, размером нагло в два раза больше
	char * mystrorig = new char[origlen*2];
	// копируем, добавляем пробелы, отделяя операторы
	char * str = strorig;
	char * mystr = mystrorig;
	while (*str)
	{
		// если текущий символ - оператор
		if (*str == '*' || *str == '+' || *str == '/' || *str == '-')
		{
			*mystr  = ' '; // внести пробел
			mystr ++;
			*mystr = *str; // копируем один символ 
			mystr ++;
			*mystr  = ' '; // внести пробел
		}
		else
		{
			*mystr = *str; // копируем один символ 
		}
		mystr ++;
		str ++;
	}
	*mystr = 0; // терминатор
	//разбиваем по пробелам
	char* token =	strtok(mystrorig," ");
	while( token != 0 )
	{
		printf(token);
		printf("\n");
		token = strtok( 0, " " );
	}
	delete []mystrorig;
}

Последний раз редактировалось EUGY; 08.05.2012 в 02:51. Причина: поправил
EUGY вне форума Ответить с цитированием
Старый 08.05.2012, 06:46   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Мне кажется здесь сами собой напрашиваются структура данных стек и stringstream. Что-нибудь вроде такого (на скорую руку)
http://ideone.com/TykfX
netrino вне форума Ответить с цитированием
Старый 08.05.2012, 23:22   #4
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Дорогой Netrino, спасибо Вам за идею... Нас за контейнеры, конечно, ругают - считается, что у нас мануал, поэтому все прописываем ручками...Но я думаю, что я в состоянии буду прописать стеки и операции top, pop и push в мануалом....

Кстати, Вы убедили меня в том, что все-таки нужен стек как стуктура при расчете результата...я была практически уверена, что стек не нужен, просто читать со строки и в какую-нибудь переменную заносить результат после каких-то действий....Но со стеком все-таки изящнее и эффектнее все это выглядит.....

Уважаемый EUGY, Ваш код тоже ждет своего звездного часа - у меня на подходе еще одна работа, и Ваша идея просто шикарно под нее подойдет....

Мальчики, Вы молодцы, настоящие рыцари и прекрасные принцы. Я ставлю Вам плюсики в весах)))
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Собрать все Image и сохранить в один файл как реализовать? Vans888 Общие вопросы Delphi 4 23.03.2012 22:47
Visual Basic.Нужно распечатать в столбик все слова и числа строки, стоящие на четных местах. ride013 Помощь студентам 3 19.04.2011 09:59
собрать все ссылки с Html designer999 Общие вопросы Delphi 4 26.04.2010 23:17
Как все edit собрать в переменную и записать в файл f1xed Помощь студентам 9 07.02.2010 23:18
Форум без перезагрузки страницы. Как все собрать в едино? Web-Gangsta JavaScript, Ajax 15 07.05.2009 00:32