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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.04.2010, 04:47   #1
Aerial
Пользователь
 
Аватар для Aerial
 
Регистрация: 12.04.2010
Сообщений: 17
По умолчанию Cтроки. Приведение типов. char * to float

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

При компиляции пишет ошибки: приведение типов: невозможно преобразовать 'char *' в 'float'
Собственно, как можно устранить? Среда программирования VS 2008
Посоветуйте книжку, с подробным описание строк, а то, никак их понять не могу
Код:
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <conio.h>
using namespace std;
/**********************************
 *Дана строка символов, представляющих собой арифметическое выраже-ние. Порядок операций определен 
 *слева направо. Подсчитайте результат данного выражения.
 **********************************/
int _tmain(int argc, _TCHAR* argv[])
{	setlocale(LC_ALL,"Russian");
	const int M = 80;		 
	char str[]="123-90+3/5*2";			
	float slag1,slag2,answer=0;
	int i=0;
	char string[M];
	char seps[]="-+/*";
	char *slag,*temp;
	strcpy(string, str); 
	slag = strtok( string, seps );
	while( slag != NULL )
	{
		slag1=(float)slag-'0';temp=slag;
		slag = strtok( NULL, seps );
		if(slag!=NULL)slag2=(float)slag-'0';
		switch(str[strlen(temp)+i])
		{
			case '-': answer+=(slag1-slag2);break;
			case '+': answer+=(slag1+slag2);break;
			case '/': answer+=(slag1/slag2);break;
			default:  answer+=(slag1*slag2);break;
		}
		i+=strlen(slag);
		slag = strtok( NULL, seps );
	}
	cout<<"Результат данного выражения равен = "<<answer<<endl;
	_getch();
	return 0;
}
Aerial вне форума Ответить с цитированием
Старый 28.04.2010, 04:57   #2
Aerial
Пользователь
 
Аватар для Aerial
 
Регистрация: 12.04.2010
Сообщений: 17
По умолчанию

Нашел, понял, через atof(правда в double пришлось)
Код:
#include "stdafx.h"
#include <iostream>
#include <string.h>
#include <conio.h>
using namespace std;
/**********************************
 *Дана строка символов, представляющих собой арифметическое выраже-ние. Порядок операций определен 
 *слева направо. Подсчитайте результат данного выражения.
 **********************************/
int _tmain(int argc, _TCHAR* argv[])
{	setlocale(LC_ALL,"Russian");
	const int M = 80;		 
	char str[]="123-90+3/5*2";		//тут меняешь выражение! ;)	
	double slag1,slag2,answer=0;
	int i=0;
	char string[M];
	char seps[]="-+/*";
	char *slag,*temp;
	strcpy(string, str); 
	slag = strtok( string, seps );
	while( slag != NULL )
	{	
		slag1=atof(slag);temp=slag;
		slag = strtok( NULL, seps );
		if(slag!=NULL)slag2=atof(slag);
		switch(str[strlen(temp)+i])
		{
			case '-': answer+=(slag1-slag2);break;
			case '+': answer+=(slag1+slag2);break;
			case '/': answer+=(slag1/slag2);break;
			default:  answer+=(slag1*slag2);break;
		}
		i+=strlen(slag);
		slag = strtok( NULL, seps );
	}
	cout<<"Результат данного выражения равен = "<<answer<<endl;
	_getch();
	return 0;
}
Но теперь после копиляции, программа, закрывается(ответа не выдает).. Помогите решить пожалуйста
Aerial вне форума Ответить с цитированием
Старый 28.04.2010, 06:21   #3
sashonk
Форумчанин
 
Регистрация: 26.10.2009
Сообщений: 170
По умолчанию

ваша задача на мой взгляд проще решается с использованием строкового буфера

Код:
#include <iostream>
#include <strstream>
using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{
  char* expression = "123-24+5/3*4";
  strstream str;
  str << expression;
  int number;
  str >> number;      //извлекаем первое число
  while(!str.eof())
  {
    char c;
    int nextnumber;
    str >> c;
    str >> nextnumber;
    switch (c)
    {
      case '-':
        number -= nextnumber;   //производим действия с числом
        break;
      case '+':
        number += nextnumber;
        break;
      case '/':
        number /= nextnumber;
        break;
      case '*':
        number *= nextnumber;
        break;
    }
  }
    
  cout << "result = " << number;
	return 0;
}
sashonk вне форума Ответить с цитированием
Старый 28.04.2010, 14:54   #4
Aerial
Пользователь
 
Аватар для Aerial
 
Регистрация: 12.04.2010
Сообщений: 17
По умолчанию

Цитата:
Сообщение от sashonk Посмотреть сообщение
ваша задача на мой взгляд проще решается с использованием строкового буфера
....
Спасибо.
Если не сложно, исправьте пожалуйста ошибку в моем варианте, кто-нибудь (хочу понять в чем ошибился, как исправлять)
Aerial вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Приведение типов массива объектов Arnezami Общие вопросы .NET 3 17.12.2009 11:30
Паскаль/Cтроки/Задача ax/bx Помощь студентам 5 06.12.2009 07:54
Приведение процедурных типов в перегруженных методах AndreyCo Общие вопросы Delphi 8 10.11.2009 19:20
Cтроки pascal Trancer_drum Помощь студентам 1 15.05.2009 11:31
Есть таблица - В ней три поля int, char, char нужно чтобы данные заносились в таблицу Mysql Muahahaha PHP 8 27.03.2008 11:17