2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 C++ _atold()
Сообщение08.02.2016, 11:35 
Аватара пользователя
Помогите найти функцию _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 
Аватара пользователя
Что за книгу вы читаете?
Каким компилятором вы пользуетесь?
Какими словами ваш компилятор обругал директиву #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 
Аватара пользователя
_atold - нестандартная функция (кажется, борландовская). Используйте std::istringstream

 
 
 
 Re: C++ _atold()
Сообщение08.02.2016, 11:57 
Аватара пользователя
Книга Лафоре Объектно-Ориентированное программирование;
Компилятор Developer C++;
Никак не обругал;
Как использовать подсветку?

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

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

 
 
 
 Re: C++ _atold()
Сообщение08.02.2016, 12:41 
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 
Аватара пользователя
Да, с mingw. Как перевести в режим C++ 11?

 
 
 
 Re: C++ _atold()
Сообщение08.02.2016, 12:58 
Аватара пользователя
aa_dav в сообщении #1097847 писал(а):
и в компиляторе MS это вроде бы уже даже для платформы x86 это псевдоним для обычного double.

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

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


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

 
 
 
 Re: C++ _atold()
Сообщение09.02.2016, 12:17 
Аватара пользователя
Использовал 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 
попробуйте atof , она работает полностью как _atold, только возвращает не long double, а double, что уже, как я вижу, не имеет значения.

 
 
 
 Re: C++ _atold()
Сообщение09.02.2016, 13:04 
Аватара пользователя
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 
Аватара пользователя
Выполняю задачу из книги Лафоре. Код целиком мой. Программа должна принимать строку и игнорируя все символы вытаскивать из строки число.

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

Используется синтаксис 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 
Аватара пользователя
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 
Аватара пользователя
Страница 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  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group