我正在制作一个美元到MXN转换器,我想让它在两个方面都有效。 if语句有效(尝试了cout<<“test”;并且它有效)但是当我用goto语句替换它时它不会工作。
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int user;
int u, m;
cout << "US/MXN Converter" << endl;
cout << "1 US = 12.99 MXN (6/12/2014)" << endl;
cout << endl;
cout << "What Way to convert" << endl;
cout << "[1] US to MXN" << endl;
cout << "[2] MXN to US" << endl;
cout << "Selection: ";
cin >> user;
if (user == 1)
{
goto USTMXN;
}
else
{
goto MXNTUS;
}
USTMXN:
cout << "Enter the amount of US Dollars to Convert" << endl;
cout << "Amount: ";
cin >> u;
m = u * 12.99;
cout << endl;
cout << "MXN Pesos: " << m << endl;
goto END;
MXNTUS:
int mm, uu;
cout << "Enter the amount of Pesos to Convert" << endl;
cout << "Amount: ";
cin >> mm;
uu = mm / 12.99;
cout << endl;
cout << "US Dollars: " << m << endl;
goto END;
END:
system("PAUSE");
return EXIT_SUCCESS;
}
答案 0 :(得分:6)
作为程序员,我们必须做的最基本的事情之一就是学会将问题分解为更小的问题。你实际上遇到了一系列问题。
我将向您展示如何解决您的问题。你可能想要预定这个答案,因为我预先解决了一些问题,你将会遇到一些问题并准备好你 - 如果你注意 - 你自己解决它们;)
让我们首先删除您的代码。
#include <iostream>
int main()
{
std::cout << "Enter a number: ";
int i;
std::cin >> i;
std::cout << "Enter a second number: ";
int j;
std::cin >> j;
std::cout << "i = '" << i << "', j = '" << j << "'\n";
}
我们在这里查看什么?我们正在检查我们是否可以向用户提出两个问题。这很好。
接下来是你对goto的使用,我强烈建议你不要使用它。最好使用一个函数。我将首先在这里演示你的goto案例:
#include <iostream>
int main()
{
int choice;
std::cout << "Enter choice 1 or 2: ";
std::cin >> choice;
if ( choice == 1 )
goto CHOSE1;
else if ( choice == 2 )
goto CHOSE2;
else {
std::cout << "It was a simple enough question!\n";
goto END;
}
CHOSE1:
std::cout << "Chose 1\n";
goto END;
CHOSE2:
std::cout << "Chose 2\n";
goto END;
END:
std::cout << "Here we are at end\n";
}
因此,问题还没有解决。
这使您可以使用变量。通过使用第二组变量(mm,uu),你真的把事情搞得一团糟。你不仅不需要这些,你做了一些非常顽皮的事情,因为这些变量只存在于一个范围内,而不存在于另一个范围内。你可以逃脱&#34;逃避&#34;有了它,但它会在以后再次困扰你。
两个主要代码流的区别在于变量名称。第二个转换案例如下:
MXNTUS:
int mm, uu;
cout << "Enter the amount of Pesos to Convert" << endl;
cout << "Amount: ";
cin >> mm;
uu = mm / 12.99;
cout << endl;
cout << "US Dollars: " << m << endl;
goto END;
这里的问题是你 - 意外地 - 使用了变量&#34; m&#34;在你的输出中。这就是我们所谓的未初始化。
cout << "US Dollars: " << m << endl;
中间的m
应为mm
。
您的编译器实际上应该警告您。如果不是,并且您只是开始学习,那么您应该弄清楚如何提高编译器警告级别。
最好做一个功能来进行转换;你可以为每个方向制作一个函数,但是我已经创建了一个处理这两种情况的函数:
#include <iostream>
static const double US_TO_MXN = 12.99;
static const char DATA_DATE[] = "6/12/2014";
void convert(const char* from, const char* to, double exchange)
{
std::cout << "Enter the number of " << from << " to convert to " << to << ".\n"
"Amount: ";
int original;
std::cin >> original;
std::cout << to << ": " << (original * exchange) << '\n';
}
int main() // this is valid since C++2003
{
std::cout << "US/MXN Converter\n"
"1 US = " << US_TO_MXN << " MXN (" << DATA_DATE << ")\n"
"\n";
int choice = 0;
// Here's a better demonstration of goto
GET_CHOICE:
std::cout << "Which conversion do you want to perform?\n"
"[1] US to MXN\n"
"[2] MXN to US\n"
"Selection: ";
std::cin >> choice;
if (choice == 1)
convert("US Dollars", "Pesos", US_TO_MXN);
else if (choice == 2)
convert("Pesos", "US Dollars", 1 / US_TO_MXN);
else {
std::cerr << "Invalid choice. Please try again.\n";
goto GET_CHOICE;
}
// this also serves to demonstrate that goto is bad because
// it's not obvious from the above that you have a loop.
}
ideone现场演示:http://ideone.com/qwpRtQ
有了这个,我们可以继续清理一大堆并扩展它:
#include <iostream>
using std::cin;
using std::cout;
static const double USD_TO_MXN = 12.99;
static const double GBP_TO_MXN = 22.03;
static const char DATA_DATE[] = "6/12/2014";
void convert(const char* from, const char* to, double exchange)
{
cout << "Enter the number of " << from << " to convert to " << to << ".\n"
"Amount: ";
int original;
cin >> original;
cout << '\n' << original << ' ' << from << " gives " << int(original * exchange) << ' ' << to << ".\n";
}
int main() // this is valid since C++2003
{
cout << "Foreign Currency Converter\n"
"1 USD = " << USD_TO_MXN << " MXN (" << DATA_DATE << ")\n"
"1 GBP = " << GBP_TO_MXN << " MXN (" << DATA_DATE << ")\n"
"\n";
for ( ; ; ) { // continuous loop
cout << "Which conversion do you want to perform?\n"
"[1] USD to MXN\n"
"[2] MXN to USD\n"
"[3] GBP to MXN\n"
"[4] MXN to GBP\n"
"[0] Quit\n"
"Selection: ";
int choice = -1;
cin >> choice;
cout << '\n';
switch (choice) {
case 0:
return 0; // return from main
case 1:
convert("US Dollars", "Pesos", USD_TO_MXN);
break;
case 2:
convert("Pesos", "US Dollars", 1 / USD_TO_MXN);
break;
case 3:
convert("British Pounds", "Pesos", GBP_TO_MXN);
break;
case 4:
convert("Pesos", "British Pounds", 1 / GBP_TO_MXN);
break;
default:
cout << "Invalid selection. Try again.\n";
}
}
}
这方面还有很多改进空间,但我希望它可以帮助你。
----编辑----
最后提示:根据system("PAUSE")
,您似乎正在使用visual studio。只需使用Debug - &gt;而不必添加到您的代码中。启动不调试或按Ctrl-F5。它会自动为您暂停:)
----编辑2 ----
有些&#34;你是怎么做到的?#34;分。
cout << '\n' << original << ' ' << from << " gives " << int(original * exchange) << ' ' << to << ".\n";
我非常小心地没有做using namespace std;
,当你开始使用更多C ++时,该指令将成为你存在的祸根。最好不要习惯它,只有当你对C ++编程更加熟悉并且更重要的是调试奇怪的编译错误时,才让自己开始使用它。
但是通过添加using std::cout
和using std::cin
,我节省了大量的打字工作而没有创建我必须避免的函数/变量名称的雷区。
该线路的作用是什么:
cout << '\n' << original << ' ' << from << " gives " << int(original * exchange) << ' ' << to << ".\n";
&#39; \ n&#39;是单个字符,回车。这样做比std::endl
更有效,因为std::endl
必须戳戳输出系统并强制写入;它不仅仅是行尾字符,它实际上会终止该行,如果你愿意的话。
int(original * exchange)
这是一个让C程序员感到困惑的C ++特性。我实际上是在创造一个临时的&#34;结果为original * exchange
的整数作为参数。
int i = 0;
int i(0);
两者都是等价的,并且一些程序员建议最好养成使用第二种机制的习惯,这样你就可以理解当你后来遇到一种叫做“最令人烦恼的解析”的事情时会发生什么。 :)
convert("Pesos", "British Pounds", 1 / GBP_TO_MXN)
1 / x&#34;反转&#34; s。
cout << "Foreign Currency Converter\n"
"1 USD = " << USD_TO_MXN << " MXN (" << DATA_DATE << ")\n"
"1 GBP = " << GBP_TO_MXN << " MXN (" << DATA_DATE << ")\n"
"\n";
这可能令人困惑。我把这个比喻混为一谈,我有点惭愧,但它读得很好。再次,采用将问题分解为更小问题的概念。
cout << "Hello " "world" << '\n';
(注意:&#34; \ n&#34;和&#39; \ n&#39;不同:&#34; \ n&#34;实际上是一个字符串,而&#39; \ n&#39; ;字面上只是回车符号)
这会打印
Hello world
当C ++看到由这样的空格(或注释)分隔的两个字符串文字时,它会连接它们,所以它实际上传递了#Hello; Hello world&#34;小丑。
所以你可以将这段代码重写为
cout << "Foreign Currency Converter\n1 USD = ";
cout << USD_TO_MXN;
cout << " MXN (";
cout << DATA_DATE;
cout << ")\n1 GBP = ";
cout << GBP_TO_MXN;
cout << " MXN (";
cout << DATA_DATE;
cout << ")\n\n";
我们称之为<<
&#34;语义糖&#34;。当你写
cout << i;
编译器正在将其转换为
cout.operator<<(i);
这个奇怪的函数调用返回cout
。所以当你写
cout << i << j;
它实际上将其翻译为
(cout.operator<<(i)).operator<<(j);
括号(cout.operator<<(i))
中的表达式返回cout,因此它变为
cout.operator<<(i); // get cout back to use on next line
cout.operator<<(j);
主要指纹
int main()
int main(int argc, const char* argv[])
两者都是合法的。第一个是完全可以接受的C或C ++。第二个仅在您计划捕获&#34;命令行参数&#34;。
时才有用最后,在主要
return 0;
请注意,main
被指定为返回int
。 C和C ++标准为main
提供了一个特殊情况,它说它是唯一的功能,它不是一个错误,不返回任何东西,在这种情况下,程序&#34;退出代码& #34;可能是任何事情。
通常最好回报一些东西。在C和C ++&#34; 0&#34;被视为&#34; false&#34;而其他任何东西(任何不为零的东西)都是&#34; true&#34;。所以C和C ++程序有一个约定返回错误代码为0(错误,没有错误)的约定,表示程序成功或退出没有问题,或者其他任何指示(例如1,2 ... 255)错误
使用&#34;返回&#34;来自main将结束该计划。
答案 1 :(得分:-1)
尝试像这样更改你的代码。建议不要使用goto标签。 switch语句的主要思想:
int option;
cin >> option
switch(option)
{
case 1: // executed if option == 1
{
... code to be executed ...
break;
}
case 99: //executed id option == 99
{
... code to be executed
break;
}
default: // if non of above value was passed to option
{
// ...code...
break;
}
}
唯一的例子。
int main(int argc, char *argv[])
{
int user;
int u, m;
cout << "US/MXN Converter" << endl;
cout << "1 US = 12.99 MXN (6/12/2014)" << endl;
cout << endl;
cout << "What Way to convert" << endl;
cout << "[1] US to MXN" << endl;
cout << "[2] MXN to US" << endl;
cout << "Selection: ";
cin >> user;
switch(user )
{
case 1 :
{
//USTMXN:
cout << "Enter the amount of US Dollars to Convert" << endl;
cout << "Amount: ";
cin >> u;
m = u * 12.99;
cout << endl;
cout << "MXN Pesos: " << m << endl;
break;
}
}
default :
{
//MXNTUS:
int mm, uu;
cout << "Enter the amount of Pesos to Convert" << endl;
cout << "Amount: ";
cin >> mm;
uu = mm / 12.99;
cout << endl;
cout << "US Dollars: " << m << endl;
break;
}
}
system("PAUSE");
return EXIT_SUCCESS;
}