2011-09-05 131 views
1

我正在学习我的第一个C++类,并且被卡住了。我真的很感谢你们有经验的程序员的帮助。类型char的C++输入,类型为int的输出

该任务正在创建一个二十一点计分程序。不是很现实的,但嘿。用户输入他想要的卡数,然后输入每张卡的数值。该作业指定输入应为char。所以如果用户有2张卡,他们输入2,但实际上2是char,必须转换为int。或者如果他们有一个女王,他们会输入“Q”,我的程序应该将该Q值转换为十分进球。我无法弄清楚什么是正确的做法。作业建议我将使用开关语句或嵌套if-else声明,但恐怕我不明白开关很好从书中的例子。

所以这里有一点我的尝试在开关。 * points_for_card *的类型为char,* number_value *为int。

switch (points_for_card) 
{  
case '2': 
    number_value = 2 ; 
    break; 
case '3': 
    number_value = 3 ; 
    break; 

// ETC 
} 

那么,我打算在这里:如果用户输入“3”作为一个char,它成为INT 3,但也许这是不是交换机是如何工作的。

事情是,我的程序编译和工作,但返回怪异的疯狂巨大的数字。如果我将points_for_card移动到int而不是char,那么对于输入的任何数字,算法都可以很好地工作,因为此时它只是将它们加在一起。

我希望我解释过这个好,如果有必要,会尽可能地澄清。

+3

这就是如何'之开关工作,这里的片段是适当的使用它。如果你的程序“不能正常工作”,那么问题在于别处。请显示'points_for_card'的声明以及您如何收集输入。 – Chad

+0

这是_is_如何开关语句应该工作,你的逻辑没有错。如何定义'points_for_card'?它是作为int还是char输入的? –

回答

0

A 地图浮现在脑海。您可以直接存储分数,或者您可以制作一张地图查找卡片类型和其他地图,以将其他信息(如分数)与每张卡片相关联。这里的宝贝例如:

std::map<char, int> scores; 

scores['Q'] = 10; scores['A'] = 13; scores['2'] = 2; // etc. 

char c; 

std::cout << "Please enter a card: "; 
std::cin >> c; 

std::cout << "Your card has score " << scores[c] << std::endl; 

通常情况下,当你的心脏说:“开关”,你的大脑应该说“地图” :-)

Personnally我会定义一个enum ECardType { Card_2, ..., Card_10, Card_Jack, ... };,并有一个地图是std::map<char, ECardType>,和然后从卡类型的其他地图到次要信息如分数。

+1

使用映射为简单输入集提供对数查找时间(在编译时已知)。为什么不使用OP已经拥有的'switch'语句? OP公布的代码并不是导致他失败的原因。 – Chad

+0

@Chad:13的对数是多少?如果OP想要支持多种语言或卡片快捷方式会怎样? –

+3

> 1。公平的,但考虑到这被标记为家庭作业,并赋予一个“暗示”他们会使用'switch'或嵌套的'if-else-if',一个'std :: map'是最好的矫枉过正,最坏的情况下,教师的红旗(我敢打赌STL还没有被覆盖)。另外,这与OP的问题没有任何关系,因为发布的'switch'语句没有问题。 – Chad

0

您如何接受points_for_card

您的输入应为cin >> points_for_card;

除了可以将字符与字符进行比较,还可以将其与字符的ASCII值进行比较。 例如,

char letter = 'A' 
if(letter == 65){ 
cout << "Match"; 
} 

上面的代码将输出 “的比赛!”。

另外,您的开关语句是完美的措辞。问题在于你的程序中的其他地方,所以请提供相关资料。 另一点与你的程序有关,但不是你的问题:你如何处理王牌?你知道他们可以算作1或11,这取决于玩家的手牌价值,对吧?

+0

常量“A”已经评估为65.如果你的观点是那些角色真的只是数字,我同意。如果你建议使用常数65,那将是非常糟糕的风格。 –

3

它可以是这样的代码:

if (points_for_card >= '1' && points_for_card <= '9'){ 
    number_value = points_for_card - '0'; // convert to number 
}else if (points_for_card == 'Q'){ 
    ... 
} 
+0

“0”到“9”的ascii(即char)值是有序的。这是第一部分工作的原因。 – Rodyland