-7 c++ if-statement goto converter
我正在制作USD到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;
}
Run Code Online (Sandbox Code Playgroud)
作为程序员,我们必须做的最基本的事情之一就是学会将问题分解为更小的问题.你实际上遇到了一系列问题.
我将向您展示如何解决您的问题.你可能想要预定这个答案,因为我已经预先解决了一些问题,你将会遇到一些问题并为你做好准备 - 如果你注意 - 你自己解决它们;)
让我们从剥离代码开始吧.
现场演示:http://ideone.com/aUCtmM
#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";
}
Run Code Online (Sandbox Code Playgroud)
我们在这里检查什么?我们正在检查我们是否可以向用户提出两个问题.这很好.
接下来是你对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";
}
Run Code Online (Sandbox Code Playgroud)
现场演示:http://ideone.com/1ElcV8
所以转到不是问题.
这使你使用变量.通过使用第二组变量(mm,uu),你真的把事情搞得一团糟.你不仅不需要这些,你做了一些非常顽皮的事情,因为这些变量只存在于一个范围内,而不存在于另一个范围内.你可以"逃脱"这个,但它会在以后回来困扰你.
两个主要代码流的区别在于变量名称.第二个转换案例如下:
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;
Run Code Online (Sandbox Code Playgroud)
这里的问题是你 - 意外地 - 在你的输出中使用了变量"m".这就是我们所说的未初始化的.
cout << "US Dollars: " << m << endl;
Run Code Online (Sandbox Code Playgroud)
这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.
}
Run Code Online (Sandbox Code Playgroud)
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";
}
}
}
Run Code Online (Sandbox Code Playgroud)
这有很大的改进空间,但我希望它可以帮助你.
----编辑----
最后提示:看来你正在使用视觉工作室,基于system("PAUSE").不必添加到代码中,只需使用Debug - > Start Without Debugging或按Ctrl-F5.它会自动为你做暂停:)
----编辑2 ----
一些"你是怎么做到的"这一点.
cout << '\n' << original << ' ' << from << " gives " << int(original * exchange) << ' ' << to << ".\n";
Run Code Online (Sandbox Code Playgroud)
我非常小心地没有这样做using namespace std;,当你开始使用更多的C++时,该指令将成为你存在的祸根.最好不要习惯它,只有在你对C++编程更加熟悉并且更重要的是调试奇怪的编译错误时才让自己开始使用它.
但是通过添加using std::cout并且using std::cin我节省了很多打字而没有创建我必须避免的函数/变量名称的雷区.
那条线做了什么:
cout << '\n' << original << ' ' << from << " gives " << int(original * exchange) << ' ' << to << ".\n";
Run Code Online (Sandbox Code Playgroud)
'\n'是单个字符,回车符.这样做效率要高于std::endl因为std::endl必须捅出输出系统并强制写入; 它不仅仅是行尾字符,它实际上终止了行,如果你愿意的话.
int(original * exchange)
Run Code Online (Sandbox Code Playgroud)
这是一个让C程序员感到困惑的C++特性.我实际上正在创建一个带有original * exchangeas参数结果的"临时"整数.
int i = 0;
int i(0);
Run Code Online (Sandbox Code Playgroud)
两者都是等价的,一些程序员建议最好养成使用第二种机制的习惯,这样你才能理解当你后来遇到一种叫做"最烦恼的解析"的事情时会发生什么:)
convert("Pesos", "British Pounds", 1 / GBP_TO_MXN)
Run Code Online (Sandbox Code Playgroud)
1/x"反转"的值.
cout << "Foreign Currency Converter\n"
"1 USD = " << USD_TO_MXN << " MXN (" << DATA_DATE << ")\n"
"1 GBP = " << GBP_TO_MXN << " MXN (" << DATA_DATE << ")\n"
"\n";
Run Code Online (Sandbox Code Playgroud)
这可能会令人困惑.我把这个比喻混合起来,我有点惭愧,但它读得很好.再次,采用将问题分解为更小问题的概念.
cout << "Hello " "world" << '\n';
Run Code Online (Sandbox Code Playgroud)
(注意:"\n"和'\n'不同:"\n"实际上是一个字符串,而'\n'实际上只是回车符号)
这会打印出来
Hello world
Run Code Online (Sandbox Code Playgroud)
当C++看到由这样的空格(或注释)分隔的两个字符串文字时,它会连接它们,所以它实际上将"Hello world"传递给cout.
所以你可以重写这段代码
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";
Run Code Online (Sandbox Code Playgroud)
这<<就是我们所说的"语义糖".当你写作
cout << i;
Run Code Online (Sandbox Code Playgroud)
编译器正在将其转换为
cout.operator<<(i);
Run Code Online (Sandbox Code Playgroud)
这个奇怪的函数调用返回cout.所以当你写作
cout << i << j;
Run Code Online (Sandbox Code Playgroud)
它实际上是在翻译它
(cout.operator<<(i)).operator<<(j);
Run Code Online (Sandbox Code Playgroud)
括号中的表达式(cout.operator<<(i))返回cout,因此它变为
cout.operator<<(i); // get cout back to use on next line
cout.operator<<(j);
Run Code Online (Sandbox Code Playgroud)
主要的指纹
int main()
int main(int argc, const char* argv[])
Run Code Online (Sandbox Code Playgroud)
两者都是合法的.第一个是完全可以接受的C或C++.第二个仅在您计划捕获"命令行参数"时才有用.
最后,在主要
return 0;
Run Code Online (Sandbox Code Playgroud)
请记住,main指定为返回int.C和C++标准就是一个特例,main它说它是唯一一个不返回任何东西的错误函数,在这种情况下程序的"退出代码"可以是任何东西.
通常最好回报一些东西.在C和C++中,"0"被认为是"假",而其他任何东西(任何非零)都是"真".所以C和C++程序有一个约定返回错误代码为0(错误,没有错误)的约定,表示程序成功或退出没有问题,或其他任何指示(例如1,2 ... 255)错误.
使用main的"return"将结束程序.