2012-01-03 17 views
5

OK, quindi sto facendo un esercizio in un libro, convertendo diversi tipi di denaro in dollari. Per qualche motivo quando digito 'e' come input per una variabile char e lo confronta con 'e' in un'istruzione if il confronto non funziona, tuttavia se lo sostituisco con un'altra lettera funzionerà correttamente. Qual è l'accordo? Heres il codice:Prendendo char 'e' come input e confrontando

int main() 
{ 
    const double yen_per_dollar = .013; 
    const double pound_per_dollar = 1.55; 
    const double euro_per_dollar = 1.29; 

    double amount = 1; 
    char unit = ' '; 

    std::cout << "Please enter a amount followed by a unit (p, y, or e): "; 
    std::cin >> amount >> unit; 

    if (unit == 'y') 
     std::cout << amount << " yen is $" << amount * yen_per_dollar << " dollars.\n"; 
    if (unit == 'p') 
     if (amount == 1) 
      std::cout << amount << " pound is $" << amount * pound_per_dollar << " dollars.\n"; 
     else 
      std::cout << amount << " pounds is $" << amount * pound_per_dollar << " dollars.\n"; 
    if (unit == 'e') 
     if (amount == 1) 
      std::cout << amount << " euro is $" << amount * euro_per_dollar << " dollars.\n"; 
     else 
      std::cout << amount << " euros is $" << amount * euro_per_dollar << " dollars.\n"; 
    else 
     std::cout << "Sorry, that input isn't in the correct format." << std::endl; 
    std::cin >> amount; // Keeps window open 
} 
+8

¤ Considerare che ad es. '3.14e20' è una specifica valida di un valore' double'. Cheers & hth., –

+0

Ahhh ho pensato che potesse avere qualcosa a che fare con questo, solo ricordando la notazione della scuola elementare, non sapevo che i doppi potevano essere espressi in quel modo. Grazie. – Fuddlebutts

+1

Si prega di non mettere in pausa artificialmente i programmi alla fine con tecniche dipendenti dalla piattaforma come 'system (" pause ");'. Se il problema è che "la finestra scompare", quindi eseguire il programma in modo diverso, in modo che la durata della finestra non è legata alla durata del programma. Il tuo programma ** non crea la finestra di comando ** e, in quanto tale, non è logicamente responsabile di tenerlo in giro. –

risposta

-1

Ecco i suggerimenti per il vostro programma:

1. Usare qualcosa come system("pause"); mettere in pausa il programma o apportare cambiamenti in impostazioni del progetto se si utilizza Visual Studio in modo che le finestre di debug attende dopo l'esecuzione.

2. Per le successive istruzioni if è necessario utilizzare istruzioni else e surround per parentesi. Ecco un esempio,

else if (unit == 'p') { 
    if (amount == 1) 
     std::cout << amount << " pound is $" << amount * pound_per_dollar << " dollars.\n"; 
    else 
     std::cout << amount << " pounds is $" << amount * pound_per_dollar << " dollars.\n"; 
} 

Se lo si fa in questo modo, la tua ultima affermazione else vi darà risultato corretto. Altrimenti riceverai sempre "Mi dispiace, quell'input non è nel formato corretto" tranne per "e". In effetti, questo è ciò che accade nel tuo programma.

3. È necessario aggiungere un'istruzione return 0 per il proprio tipo di ritorno.

4. Invece di battitura std ogni volta che è possibile aggiungere questa dichiarazione una volta,

using namespace std; 

dopo la vostra comprendono preprocessori e possono omettere compreso std namespace in seguito come questo,

cout << "Please enter a amount followed by a unit (p, y, or e): "; 


5. e è un carattere riservato per l'utilizzo con tipi numerici interi/doppi ecc. e significa esponenziale. Quando inserisci la valuta, usa uno spazio prima per dire esplicitamente a cin che questa e non è parte dell'input numerico. Altrimenti, devi analizzare l'input usando le stringhe.

+0

Nota che se ometti un 'return' esplicito dalla fine di' main() ', l'effetto è come se scrivessi' return 0; '. Solo 'main()' ottiene questa esenzione. Non mi piace molto, ma è il comportamento standard (e C99 supporta anche questo, e quindi anche C11). –

+0

utilizzando "return 0" sarà buono. Nei vecchi tempi abbiamo ottenuto errori di compilazione nei concorsi di programmazione a causa di omettere che, come la maggior parte dei compilatori di Judge non erano così .. –

+0

La qualifica esplicita sarà buona se il programma sta consumando una buona quantità di memoria inclusi i membri del namespace non necessari. Per i piccoli programmi le qualifiche esplicite non sarebbero t importa molto. –

2

Ci sono molti commenti ma nessuna soluzione. In effetti, non sono riuscito a trovare una buona soluzione. La cosa migliore che potrei immaginare è installare un faccione personalizzato num_get (questo da solo quasi certamente regola il codice come adatto per essere consegnato come soluzione per i compiti a casa): questo è qualcosa di molto avanzato e non credo che molte persone lo farebbero mai pensa a questo.

Oltre a questo, penso che si desideri utilizzare il data-drive per le valute, ovvero invece di avere un ramo di codice per ogni valuta, si desidera impostare una sorta di contenitore che descriva tutte le valute (BTW, il plurale di Euro è Euro). Il programma risultante sarebbe simile al seguente:

#include <iostream> 
#include <locale> 
#include <string> 
#include <tuple> 
#include <map> 
#include <ctype.h> 

struct currency_get: 
    std::num_get<char> 
{ 
    iter_type do_get(iter_type it, iter_type end, std::ios_base&, std::ios_base::iostate& err, double& v) const 
    { 
     std::string input; 
     for (; it != end && (*it == '.' || *it == '-' || *it == '+' 
          || isdigit(static_cast<unsigned char>(*it))); ++it) 
     { 
      input.push_back(*it); 
     } 
     errno = 0; 
     if (input.empty()) 
     { 
      err |= std::ios_base::failbit; 
     } 
     else 
     { 
      v = strtod(input.c_str(), 0); 
     } 

     return it; 
    } 
}; 

int main() 
{ 
    typedef std::tuple<double, std::string, std::string> desc; 
    std::map<char, desc> currencies; 
    currencies['y'] = desc(0.013, "yen", "yen"); 
    currencies['p'] = desc(1.55, "pound", "pounds"); 
    currencies['e'] = desc(1.29, "euro", "euro"); 

    double amount(0); 
    char currency(' '); 
    std::locale loc(std::locale(), new currency_get); 
    std::cin.imbue(loc); 

    if (std::cin >> amount >> currency) 
    { 
     std::map<char, desc>::const_iterator it(currencies.find(currency)); 
     if (it != currencies.end()) 
     { 
      desc const& d(it->second); 
      std::cout << amount << " " << (amount == 1? std::get<1>(d): std::get<2>(d)) << " is " 
         << (std::get<0>(d) * amount) << " dollar" 
         << (std::get<0>(d) * amount == 1? "": "s") << "\n"; 
     } 
    } 
    else 
    { 
     std::cout << "input failed\n"; 
    } 
} 
+2

Penso che la soluzione più semplice sia richiedere all'utente di digitare uno spazio tra il numero e l'identificatore di valuta. :) –