大学作业最后差一点不知道哪里错了

k854053320k08 2018-04-09 01:34:35
#include <iostream>
#include <string>

using namespace std;

int main() {
char num1;
char num2;
char num3;
int num4 = 0;
while (1) {
cout << "=====================================" << endl;
cout << "1.triangle 2.diamond 3.exit\ninput : ";
cin >> num1;
if (num1 == '1') {
cout << "1.right-angle triangle 2.regular triangle\ninput : ";
cin >> num2;
if (num2 == '1') {
cout << "size:";
cin >> num4;
for (int i = 0; i < num4; i++) {
for (int j = 0; j <= i; j++) {
cout << "*";
}
cout << endl;
}
}
else if (num2 == '2') {
cout << "size:";
cin >> num4;
for (int i = 0; i < num4; i++) {
for (int j = num4; j > i; j--) { cout << " "; }

for (int j = 0; j < (2 * i + 1); j++) { cout << "*"; }
cout << endl;
}
}
else { cout << "woring input!" << endl; }
}
else if (num1 == '2') {
cout << "1. filled diamond 2.blank diamond\ninput : ";
cin >> num3;
if (num3 == '1') {
cout << "size:";
cin >> num4;
num4 = (num4 / 2) + 1;

for (int i = 0; i < num4; i++) {

for (int j = 0; j < num4 - i; j++) cout << " ";
for (int j = 0; j < (2 * i + 1); j++) cout << "*";
cout << endl;
}
for (int i = num4 - 2; i >= 0; i--) {

for (int j = 0; j < num4 - i; j++) cout << " ";
for (int j = 0; j < 2 * i + 1; j++) cout << "*";
cout << endl;
}
}
else if (num3 == '2') {
cout << "size:";
cin >> num4;
num4 = num4 / 2;

for (int i = 0; i < num4; i++) {

for (int j = 0; j < num4 - i; j++) cout << "*";
for (int j = 0; j < (2 * i + 1); j++) cout << " ";
for (int j = 0; j < num4 - i; j++)cout << "*";
cout << endl;
}
cout << endl;
for (int i = num4 - 1; i >= 0; i--) {

for (int j = 0; j < num4 - i; j++) cout << "*";
for (int j = 0; j < 2 * i + 1; j++) cout << " ";
for (int j = 0; j < num4 - i; j++)cout << "*";
cout << endl;
}

}
else { cout << "woring input!" << endl; }
}
else if (num1 == '3') {
return 0;
}
else { cout << "woring input!" << endl; continue; }


}
return 0;
}

这是作业

然而我打开后如果输入fff就会出现3次
=====================================
1.triangle 2.diamond 3.exit
input : fff
woring input!
=====================================
1.triangle 2.diamond 3.exit
input : woring input!
=====================================
1.triangle 2.diamond 3.exit
input : woring input!
=====================================
1.triangle 2.diamond 3.exit
input :

求救啊~~~~~~~~~~~~~~~~~~~~
...全文
933 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
棉猴 2018-04-28
  • 打赏
  • 举报
回复
1 问题分析 输入fff就会出现3次,如果输入ffff则会出现4次,以此类推.其中的原因,正如3楼朋友所说的,cin每次从输入流中读取一个char,而当输入是fff时,相当于读了3次字符'f',每次都不满足条件,所以会输出"woring input!".也就是说,你输入的字符串中包含几个字符,就会产生几个错误信息(当然前提是输入的字符串中不包含1,2,3这几个字符) 2 问题解决 添加在cin从输入流中读取内容后,对内容进行判断的功能.以下代码,把num1,num2和num3的类型从char改为int,之后对cin从输入流中读取到的内容进行判断,如果不是int,则重新输入
// ConsoleApplication4.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;
int isNum()
{
	unsigned long num_input = 0;
	cin >> num_input;
	string num_input_string;
	while (cin.fail())
	{
		cin.clear();
		cin >> num_input_string;
		cout << "输入的" << num_input_string << "不是数字,请输入一个数:";
		cin >> num_input;
	}
	return num_input;
}
int main()
{
	int num1;
	int num2;
	int num3;
	int num4 = 0;
	while (1) {
		cout << "=====================================" << endl;
		cout << "1.triangle    2.diamond    3.exit\ninput : ";
		num1 = isNum();
		if (num1 == 1) {
			cout << "1.right-angle triangle 2.regular triangle\ninput : ";
			num2 = isNum();
			if (num2 == 1) {
				cout << "size:";
				cin >> num4;
				for (int i = 0; i < num4; i++) {
					for (int j = 0; j <= i; j++) {
						cout << "*";
					}
					cout << endl;
				}
			}
			else if (num2 == 2) {
				cout << "size:";
				cin >> num4;
				for (int i = 0; i < num4; i++) {
					for (int j = num4; j > i; j--) { cout << " "; }

					for (int j = 0; j < (2 * i + 1); j++) { cout << "*"; }
					cout << endl;
				}
			}
			else { cout << "woring input!" << endl; }
		}
		else if (num1 == 2) {
			cout << "1. filled diamond       2.blank diamond\ninput : ";
			num3 = isNum();
			if (num3 == 1) {
				cout << "size:";
				cin >> num4;
				num4 = (num4 / 2) + 1;

				for (int i = 0; i < num4; i++) {

					for (int j = 0; j < num4 - i; j++) cout << " ";
					for (int j = 0; j < (2 * i + 1); j++) cout << "*";
					cout << endl;
				}
				for (int i = num4 - 2; i >= 0; i--) {

					for (int j = 0; j < num4 - i; j++) cout << " ";
					for (int j = 0; j < 2 * i + 1; j++) cout << "*";
					cout << endl;
				}
			}
			else if (num3 == 2) {
				cout << "size:";
				cin >> num4;
				num4 = num4 / 2;

				for (int i = 0; i < num4; i++) {

					for (int j = 0; j < num4 - i; j++) cout << "*";
					for (int j = 0; j < (2 * i + 1); j++) cout << " ";
					for (int j = 0; j < num4 - i; j++)cout << "*";
					cout << endl;
				}
				cout << endl;
				for (int i = num4 - 1; i >= 0; i--) {

					for (int j = 0; j < num4 - i; j++) cout << "*";
					for (int j = 0; j < 2 * i + 1; j++) cout << " ";
					for (int j = 0; j < num4 - i; j++)cout << "*";
					cout << endl;
				}

			}
			else { cout << "woring input!" << endl; }
		}
		else if (num1 == 3) {
			return 0;
		}
		else { cout << "woring input!" << endl; continue; }


	}
    return 0;
}

3 问题拓展 <<C++控制台程序判断输入的数字>>https://blog.csdn.net/hou09tian/article/details/77426834 <<C++中输入流istream>>https://blog.csdn.net/hou09tian/article/details/78335548 希望能够帮到你
qq_36260408 2018-04-28
  • 打赏
  • 举报
回复
设置个断点调试下
qq_40162781 2018-04-28
  • 打赏
  • 举报
回复
输入了一种类型后不用在输入另一种类型。.在输入另一种类型前用cin.clear();
qq_37592269 2018-04-17
  • 打赏
  • 举报
回复
cstring?用的c++标准不是吗
赵4老师 2018-04-10
  • 打赏
  • 举报
回复
百度搜相关关键字。
k854053320k08 2018-04-09
  • 打赏
  • 举报
回复
if (!cin) {cin.clear();cin.sync();} 这个没学过 ~~~~ 不知道什么意思应该用不着 如果把char num1改成int num1他就无限循环~~~所以才纠结的
自信男孩 2018-04-09
  • 打赏
  • 举报
回复
这是正常的,因为num1是char类型,输入fff,三个f都会存在输入缓存里,当地一个f赋值给num1后输出woring input!,再次执行cin>>num1,就会把缓存里剩余的f赋值给num1,因此会出现输出三次woring input! 解决办法是将num1, num2, num3定义为int类型,然后输入1, 2, 3,输入fff不会将fff赋值给num1 或者将num1, num2, num3定义成字符数组,然后判断第一个字符是否位'1', '2', '3'。然后在确定是否向下执行。
赵4老师 2018-04-09
  • 打赏
  • 举报
回复
if (!cin) {cin.clear();cin.sync();continue;}
赵4老师 2018-04-09
  • 打赏
  • 举报
回复
在适当的几个地方加一行:
if (!cin) {cin.clear();cin.sync();}
试试看。

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧