2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 C++ _atold()
Сообщение08.02.2016, 11:35 
Аватара пользователя


26/03/13
326
Russia
Помогите найти функцию _atold(). В книге написано, что нужно использовать библиотеки STDLIB.H или MATH.H, но там нет

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

class money
{
private:
             long double monee;
public:                      
           void mstold(string str);         
};

void money::mstold(string str)
{
string str1="",str2="";
string simb;
char sim;
int i=0;
do{        
  simb=str.at(i);
  sim=str.at(i);
  if (48<=sim<=57)
   str1+=simb;
  else if (sim=='.')
   {
      str2+=str.at(i+1);      
       str2+=str.at(i+2);
       break;      
    }
}while(sim!='.');         
   str1+=".";
   str1+=str2.at(0);
   str1+=str2.at(1);
   monee=_atold(str1);   
   cout<<monee<<endl;      
}

int main()
{
money account;
string stmoney;
cout<<"Please, enter your money: ";
getline(cin,stmoney);
account.mstold(stmoney);      
system("pause");      
return 0;      
}

 Профиль  
                  
 
 Re: C++ _atold()
Сообщение08.02.2016, 11:49 
Заслуженный участник
Аватара пользователя


19/12/10
1546
Что за книгу вы читаете?
Каким компилятором вы пользуетесь?
Какими словами ваш компилятор обругал директиву #include<stdlib>?
И почему вы не используете подсветку синтаксиса?
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include<iostream>
#include<string>
#include<stdlib>
using namespace std;

class money
{
private:
             long double monee;
public:                      
           void mstold(string str);        
};

void money::mstold(string str)
{
string str1="",str2="";
string simb;
char sim;
int i=0;
do{        
  simb=str.at(i);
  sim=str.at(i);
  if (48<=sim<=57)
   str1+=simb;
  else if (sim=='.')
   {
      str2+=str.at(i+1);      
       str2+=str.at(i+2);
       break;      
    }
}while(sim!='.');        
   str1+=".";
   str1+=str2.at(0);
   str1+=str2.at(1);
   monee=_atold(str1);  
   cout<<monee<<endl;      
}

int main()
{
money account;
string stmoney;
cout<<"Please, enter your money: ";
getline(cin,stmoney);
account.mstold(stmoney);      
system("pause");      
return 0;      
}

 Профиль  
                  
 
 Re: C++ _atold()
Сообщение08.02.2016, 11:54 
Заслуженный участник
Аватара пользователя


06/10/08
6422
_atold - нестандартная функция (кажется, борландовская). Используйте std::istringstream

 Профиль  
                  
 
 Re: C++ _atold()
Сообщение08.02.2016, 11:57 
Аватара пользователя


26/03/13
326
Russia
Книга Лафоре Объектно-Ориентированное программирование;
Компилятор Developer C++;
Никак не обругал;
Как использовать подсветку?

 Профиль  
                  
 
 Re: C++ _atold()
Сообщение08.02.2016, 12:10 
Заслуженный участник
Аватара пользователя


19/12/10
1546
Joe Black в сообщении #1097837 писал(а):
Никак не обругал;
Это он зря, ибо такого заголовка в стандарте нет, а есть stdlib.h и cstdlib (первый С-шный, но С++ его принимает, а второй чисто С++).

Joe Black в сообщении #1097837 писал(а):
Как использовать подсветку?
Выделяем код, кликаем "Выберите язык", выбираем язык. :-)

 Профиль  
                  
 
 Re: C++ _atold()
Сообщение08.02.2016, 12:41 


11/12/14
893
Dev-C++ это который с mingw?
Если свежий, то можно перевести в режим C++11 и тогда в stdlib.h будет доступна похожая функция strtold (последним параметром передавать NULL и разницы не будет).

Но тут еще есть вот какая штука - тип long double в настоящее время будет последовательно искореняться из компиляторов.
Происходит отказ от FPU в пользу SSE, где аналога просто нет и в компиляторе MS это вроде бы уже даже для платформы x86 это псевдоним для обычного double.
Примеры с ним уже можно считать морально устаревающими и использовать double и обычный atof.

 Профиль  
                  
 
 Re: C++ _atold()
Сообщение08.02.2016, 12:48 
Аватара пользователя


26/03/13
326
Russia
Да, с mingw. Как перевести в режим C++ 11?

 Профиль  
                  
 
 Re: C++ _atold()
Сообщение08.02.2016, 12:58 
Заслуженный участник
Аватара пользователя


19/12/10
1546
aa_dav в сообщении #1097847 писал(а):
и в компиляторе MS это вроде бы уже даже для платформы x86 это псевдоним для обычного double.

В моём VC++ 2010 именно так.

 Профиль  
                  
 
 Re: C++ _atold()
Сообщение08.02.2016, 14:11 


11/12/14
893
Joe Black в сообщении #1097848 писал(а):
Да, с mingw. Как перевести в режим C++ 11?


Опция компилятору -std=c++11

 Профиль  
                  
 
 Re: C++ _atold()
Сообщение09.02.2016, 12:17 
Аватара пользователя


26/03/13
326
Russia
Использовал istringstream, но теперь после ввода строки программа просто зависает

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include<iostream>
#include<string>
#include<cstdlib>
#include<sstream>
using namespace std;

class money
{
 private:
                                 double monee;
 public:                                                       
                          void mstold(string str);                       
};

void money::mstold(string str)
{
 string str1="",str2="";
 string simb;
 char sim;
 int i=0;
 do{             
  simb=str.at(i);
  sim=str.at(i);
  if (48<=sim<=57)
   str1+=simb;
  else if (sim=='.')
   {
           str2+=str.at(i+1);            
                 str2+=str.at(i+2);
                 break;        
         }
 }while(sim!='.');                     
        str1+=".";
        str1+=str2.at(0);
        str1+=str2.at(1);
        istringstream ist(str1);
        ist>>monee;
        //monee=strtold(str1,NULL);
        cout<<monee<<endl;             
}

int main()
{
 money account;
 string stmoney;
 cout<<"Please, enter your money: ";
 getline(cin,stmoney);
 account.mstold(stmoney);                
 system("pause");                
 return 0;               
}
 

 Профиль  
                  
 
 Re: C++ _atold()
Сообщение09.02.2016, 12:30 


11/12/14
893
попробуйте atof , она работает полностью как _atold, только возвращает не long double, а double, что уже, как я вижу, не имеет значения.

 Профиль  
                  
 
 Re: C++ _atold()
Сообщение09.02.2016, 13:04 
Заслуженный участник
Аватара пользователя


19/12/10
1546
Joe Black
Вы модифицируете какой-то учебный пример? Или весь этот код целиком ваш?

Что, вообще, ваша программа должна делать?

Как по вашему мнению должен работать цикл
Используется синтаксис C++
int i=0;
 do{            
  simb=str.at(i);
  sim=str.at(i);
  if (48<=sim<=57)
   str1+=simb;
  else if (sim=='.')
   {
           str2+=str.at(i+1);            
                 str2+=str.at(i+2);
                 break;        
         }
 }while(sim!='.');

:?:
А как он работает на самом деле? В частности, изменяется ли значение переменной i в каждой итерации? И как, по вашему, вычисляется выражение 48<=sim<=57? А как оно вычисляется на самом деле? И как его нужно записать правильно?

(Оффтоп)

Лучше вместо 48 и 57 использовать '0' и '9' соответственно.

И к чему все эти сложности с ООП если код
Используется синтаксис C++
#include <iostream>

using namespace std;

int main(){
        double account;
        cout << "Please, enter your money: ";
        cin >> account;
        cout << "Your account: " << account << "\n\nHit any key to exit . . . ";
        system("pause > nul");
        cout << endl;
        return 0;                
}  
имхо, делает желаемое?

-- 09 фев 2016, 13:34 --

Используется синтаксис C++
string str1="",str2="";
string simb;
Ранее мы уже обсуждали явную инициализацию объектов типа string пустой С-шной строкой. Было высказано две точки зрения:
  1. такая инициализация бессмысленна, так как конструктор по умолчанию и так её выполняет;
  2. такая инициализация полезна, так как визуализирует инициализацию переменных типа string.
Я придерживаюсь первой точки зрения. Кому-то милее вторая. А вы? По вашему коду не понять.

 Профиль  
                  
 
 Re: C++ _atold()
Сообщение10.02.2016, 11:41 
Аватара пользователя


26/03/13
326
Russia
Выполняю задачу из книги Лафоре. Код целиком мой. Программа должна принимать строку и игнорируя все символы вытаскивать из строки число.

Переделал цикл:

Используется синтаксис C++
void money::mstold(string str)
{
 string str1,str2;
 int n=str.length();
 for (int i=0,j=0;i<n;i++)
 {               
  if (48<=str[i]&&str[i]=<57)
    {
                 str1[j]=str[i];
                 j++;
          }  
        cout<<str1<<endl;
 }     
}


Теперь в if выдаёт ошибку, expected primary-expression before '<' token, не понимаю почему, вроде str[i] должен char вытаскивать

 Профиль  
                  
 
 Re: C++ _atold()
Сообщение10.02.2016, 12:08 
Заслуженный участник
Аватара пользователя


19/12/10
1546
Joe Black в сообщении #1098348 писал(а):
Выполняю задачу из книги Лафоре.
Пожалуйста, укажите страницу.

Joe Black в сообщении #1098348 писал(а):
Теперь в if выдаёт ошибку
А вы попробуйте заменить =< на <=. :-)

Да и замените уже, наконец, 48 и 57 на '0' и '9' соответственно. Стандарт не гарантирует, что эти символы будут иметь именно эти коды.

И, вообще, вместо выражения '0' <= str[i] && str[i] <= '9' можно использовать стандартную функцию isdigit(str[i]).

PS Код
Используется синтаксис C++
str1[j]=str[i];
j++;
можно сократить до
Используется синтаксис C++
str1[j++]=str[i];

 Профиль  
                  
 
 Re: C++ _atold()
Сообщение10.02.2016, 12:52 
Аватара пользователя


26/03/13
326
Russia
Страница 308 упражнение 7

-- 10.02.2016, 13:03 --

Всё, сделал, спасибо за помощь!

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;

class money
{
 private:
                                 double monee;
 public:                                                       
                          void mstold(string str);                       
};

void money::mstold(string str)
{
 string str1,str2;
 int n=str.length(),i=0;
 do{             
  if ('0'<=str[i]&&str[i]<='9')
    {
                 str1+=str[i];
          }  
        i++;
 }while(str[i]!='.');
 str2+=str[i+1];
 str2+=str[i+2];
 str1+='.';
 str1+=str2;
 const char* ch=new char [str1.length()+1];
 ch=str1.c_str();
 monee=atof(ch);
 cout<<monee<<endl;
}
int main()
{
 money account;
 string stmoney;
 cout<<"Please, enter your money: ";
 cin>>stmoney;
 account.mstold(stmoney);                
 system("pause");                
 return 0;               
}

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group