1 #include<iostream>
2 using namespace std;
3
4 int main()
5 {
6 const double yen_to_euro=0.007215;
7 const double euro_to_dollar=1.12;
8 char currency;
9 double x;
10
11 while(currency!='q')
12 {
13 cout << "enter currency and unit(y , e, or d)";
14 cin >> x >>currency;
15
16 switch(currency){
17
18 case 'y':
19 cout <<"euro:"<< x*yen_to_euro<<" dollar:"<<x*yen_to_euro*euro_to_dollar<<'\n';
20 break;
21 case 'e':
22 cout <<"yen:"<< (x*(1.0/yen_to_euro))<<" dollar:"<<(x*euro_to_dollar)<<'\n';
23 break;
24 case 'd':
25 cout <<" yen:"<< x*(1.0/yen_to_euro)*(1.0/euro_to_dollar)<<" euro:"<<x*(1.0/euro_to_dollar)<<'\n';
26 break;
27 case 'q':
28 currency='q';
29 break;
30 default:
31 cout << "invalid";
32 break;
33
34 }
35
36 }
37
38
39 }
~
Предполагаемая функция приведенного выше кода заключается в конвертации выбранной валюты (y для японской иены, e для евро и d для доллара США) в другие валюты.
Например, если я хочу конвертировать в 12 японских иен, я бы ввел:
12y
который затем программа будет выводить
евро: 0,08658 доллар: 0,0969696
Однако, если бы я ввел 12e, я бы получил бесконечный цикл. Дважды проверив код, логических ошибок вроде бы нет. Тем не менее, я чувствую, что источник проблемы связан с cin в строке 14, потому что если я возьму сумму x и тип валюты отдельно, вот так:
cin>> x;
cin>> currency;
Код работает нормально, но мне нужно ввести сумму, затем нажать Enter, а затем нажать символ, представляющий тип валюты. Есть ли способ просто ввести все в одну строку, без пробелов?
Более того, почему он так себя ведет? Это необычное поведение прохождения бесконечного цикла происходит только тогда, когда я ввожу e для евро и q для выхода.
'e'
сбивает синтаксический анализатор, заставляя его думать, что вы пытаетесь передать значение в экспоненциальном представлении. В большинстве случаев синтаксический анализатор сдастся, как только дойдет до нечислового символа, и вернет значение, которое он проанализировал до сих пор. Однако в этом случае он читает'e'
как часть числа, переключается в научный режим, а затем решает, что число неправильно отформатировано, и терпит неудачу (вы можете проверитьcin.good()
, чтобы проверить эту и другие ошибки синтаксического анализа). - person Wug   schedule 13.08.2015