初学C++,关于一个变量的值

ifndef冬瓜 2018-02-02 10:31:45

void Chapter_6::func_2()
{
double ipt[10] = {0};
double average;
double sum = 0;
int iptnum = 0;
int count = 0;
cin >> ipt[iptnum];
while(!isdigit(ipt[iptnum]))
{
sum += ipt[iptnum];
iptnum++;
if(10 == iptnum)
break;
cin >> ipt[iptnum];
}

average = sum/iptnum;

for(int i = 0; i < iptnum; i++)
{
if(ipt[i] > average)
count++;
cout << ipt[i] << ' ';
}
cout << "\nthe iptnum: " << iptnum;
cout << "\nthe average is " << average << " and there are " << count << " digiter(s) is(are) bigger than the average.";

}


运行后,
输入非数字时能正常break,但是不论往数组中输多少个,iptnum都是等于10,不知道哪里出了问题。。
...全文
716 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
runjiajia 2018-02-06
  • 打赏
  • 举报
回复
不是自己的代码吧 if(10 == iptnum) break; 自己看看这段?...
gzhosp_redAnt 2018-02-05
  • 打赏
  • 举报
回复
引用 15 楼 theo_a_sommeil 的回复:
[quote=引用 14 楼 redRnt 的回复:] 哈 你的理解是正确的 只不过我不明白 你都定义了double类型 什么还要判断它是不是输入的是不是数字呢? 一般的,我记得这个方法是在<cctype> 头文件,我以前的文章写过,然后当你输入的是字符或者字符串的时候才用吧。。。
确实,是在cctype中的,还有其它大小写转化一些其它的方法。 我要判断的原因是,要求要实现当输入非数字时停止输入。[/quote]如果说,这是你判断的原因,那么用户在输入之前并不知道这一定要输入数据,因此,你定义的数据类型更不应该直接就是double类,应该是char,然后对用户输入的字符进行逐个检验。如果要停止输入我不是很明白你的意思,如果是你想终止用户输入后,还能继续进行接下来的程序运行,那么就用break跳出循环,如果你想直接终止程序运行,以免造成其他未知的错误,可以使用标准库中的exit函数退出
The-godfather-wu 2018-02-05
  • 打赏
  • 举报
回复
过来学习!过来学习!过来学习!过来学习!
MATRIX123321 2018-02-05
  • 打赏
  • 举报
回复
不错,学习了
The-godfather-wu 2018-02-05
  • 打赏
  • 举报
回复
过来学习!过来学习!过来学习!过来学习!
cattpon 2018-02-05
  • 打赏
  • 举报
回复
引用 35 楼 redRnt 的回复:
[quote=引用 28 楼 theo_a_sommeil 的回复:] [quote=引用 24 楼 qq_40414286 的回复:] 楼主你的错误就在while循环语句,while中的表达式(isdigit)的含义是判断是否为字符,你输入一个数字,返回值为0,你在加上!值就变成了1,判断为真,执行循环。 当你输入字符,系统会翻译出你输入的数为一串乱码,然后从乱码第一个开始判断,当判断到iptnum=10,跳出循环。所以你的iptnum每次都是10
确实错在循环语句的条件,改完之后的代码我已经贴在11楼了,但是你后面的解释引发我一点疑问: 当我试图往一个double数组中输入char型时,系统是怎么处理我输入的变量的,是把我输入的值留在输入流中等待下一次读取,还是如你所说,翻译成一段乱码... 我写了这几行实验:

int main()
{
	int test   = 1;
	char test1 = 'b';
	cout << "input an int: ";
	cin  >> test;
	cout << "\ninput a char: ";
	cin  >> test1;
	cout << "\nint: " << test << ' ' << "char: " << test1;
	
	return 0;
}
结果是他根本不给我第二次输入的机会... [/quote]对于你这个问题,说实话我没有试过。因此我将你的代码调试了一遍然后做了一个推论,你可以看看。首先用户输入的数据先在缓存流,然后在存在相应的变量中,最后取出显示。那么你在输入a的时候,你向系统申请的是存储int型的空间,那么由于数据类型不对,这个操作是错误的,C++ I/O专门有一种处理错误的错误机制,比如cerr等,它发现非法输入,然后就禁止你继续输入,转而执行其他的语句。至于为什么int你赋的初始值为1,结果输出却是0,这很简单,因为你赋值非法,所以它只能返回你一个该类型的默认值(int类型的默认构造函数,int初始值就是0),而b的值由于没有输入当然就没改变了 这是我的个人推测,你可以参考参考。有兴趣一起学C++吧,我最近的博客都有分享小知识[/quote] 感谢有心测试~
ifndef冬瓜 2018-02-05
  • 打赏
  • 举报
回复
引用 35 楼 redRnt 的回复:
[quote=引用 28 楼 theo_a_sommeil 的回复:] [quote=引用 24 楼 qq_40414286 的回复:] 楼主你的错误就在while循环语句,while中的表达式(isdigit)的含义是判断是否为字符,你输入一个数字,返回值为0,你在加上!值就变成了1,判断为真,执行循环。 当你输入字符,系统会翻译出你输入的数为一串乱码,然后从乱码第一个开始判断,当判断到iptnum=10,跳出循环。所以你的iptnum每次都是10
确实错在循环语句的条件,改完之后的代码我已经贴在11楼了,但是你后面的解释引发我一点疑问: 当我试图往一个double数组中输入char型时,系统是怎么处理我输入的变量的,是把我输入的值留在输入流中等待下一次读取,还是如你所说,翻译成一段乱码... 我写了这几行实验:

int main()
{
	int test   = 1;
	char test1 = 'b';
	cout << "input an int: ";
	cin  >> test;
	cout << "\ninput a char: ";
	cin  >> test1;
	cout << "\nint: " << test << ' ' << "char: " << test1;
	
	return 0;
}
结果是他根本不给我第二次输入的机会... [/quote]对于你这个问题,说实话我没有试过。因此我将你的代码调试了一遍然后做了一个推论,你可以看看。首先用户输入的数据先在缓存流,然后在存在相应的变量中,最后取出显示。那么你在输入a的时候,你向系统申请的是存储int型的空间,那么由于数据类型不对,这个操作是错误的,C++ I/O专门有一种处理错误的错误机制,比如cerr等,它发现非法输入,然后就禁止你继续输入,转而执行其他的语句。至于为什么int你赋的初始值为1,结果输出却是0,这很简单,因为你赋值非法,所以它只能返回你一个该类型的默认值(int类型的默认构造函数,int初始值就是0),而b的值由于没有输入当然就没改变了 这是我的个人推测,你可以参考参考。有兴趣一起学C++吧,我最近的博客都有分享小知识[/quote] 没错应该就是这样吧 也可以通过cin.clear()来继续输入
大嘿嘿 2018-02-05
  • 打赏
  • 举报
回复
围观围观学习学习
gzhosp_redAnt 2018-02-05
  • 打赏
  • 举报
回复
引用 28 楼 theo_a_sommeil 的回复:
[quote=引用 24 楼 qq_40414286 的回复:] 楼主你的错误就在while循环语句,while中的表达式(isdigit)的含义是判断是否为字符,你输入一个数字,返回值为0,你在加上!值就变成了1,判断为真,执行循环。 当你输入字符,系统会翻译出你输入的数为一串乱码,然后从乱码第一个开始判断,当判断到iptnum=10,跳出循环。所以你的iptnum每次都是10
确实错在循环语句的条件,改完之后的代码我已经贴在11楼了,但是你后面的解释引发我一点疑问: 当我试图往一个double数组中输入char型时,系统是怎么处理我输入的变量的,是把我输入的值留在输入流中等待下一次读取,还是如你所说,翻译成一段乱码... 我写了这几行实验:

int main()
{
	int test   = 1;
	char test1 = 'b';
	cout << "input an int: ";
	cin  >> test;
	cout << "\ninput a char: ";
	cin  >> test1;
	cout << "\nint: " << test << ' ' << "char: " << test1;
	
	return 0;
}
结果是他根本不给我第二次输入的机会... [/quote]对于你这个问题,说实话我没有试过。因此我将你的代码调试了一遍然后做了一个推论,你可以看看。首先用户输入的数据先在缓存流,然后在存在相应的变量中,最后取出显示。那么你在输入a的时候,你向系统申请的是存储int型的空间,那么由于数据类型不对,这个操作是错误的,C++ I/O专门有一种处理错误的错误机制,比如cerr等,它发现非法输入,然后就禁止你继续输入,转而执行其他的语句。至于为什么int你赋的初始值为1,结果输出却是0,这很简单,因为你赋值非法,所以它只能返回你一个该类型的默认值(int类型的默认构造函数,int初始值就是0),而b的值由于没有输入当然就没改变了 这是我的个人推测,你可以参考参考。有兴趣一起学C++吧,我最近的博客都有分享小知识
shantb08 2018-02-04
  • 打赏
  • 举报
回复
输入的字母无效呀
jixianghuawei 2018-02-03
  • 打赏
  • 举报
回复
啊我知道问题出在哪里了! 我的ipt数组是double类型的,所以当我输入一个字母时,比如a,它并不能输入进去,还是留在输入流中,这样这个while循环的判定条件,isdigit()里面的ipt[i]的值其实是0! 那么while循环就一直在执行,直到iptnum=10跳出循环... 应该就是这样吧...
百城_a61 2018-02-03
  • 打赏
  • 举报
回复
楼主你的错误就在while循环语句,while中的表达式(isdigit)的含义是判断是否为字符,你输入一个数字,返回值为0,你在加上!值就变成了1,判断为真,执行循环。 当你输入字符,系统会翻译出你输入的数为一串乱码,然后从乱码第一个开始判断,当判断到iptnum=10,跳出循环。所以你的iptnum每次都是10
tangpeter 2018-02-03
  • 打赏
  • 举报
回复
初学c时自己写的一个通讯录 很幼稚
S_HB_L 2018-02-03
  • 打赏
  • 举报
回复
https://vwpan.com/down/show-1154.html
ifndef冬瓜 2018-02-03
  • 打赏
  • 举报
回复
引用 14 楼 redRnt 的回复:
哈 你的理解是正确的 只不过我不明白 你都定义了double类型 什么还要判断它是不是输入的是不是数字呢? 一般的,我记得这个方法是在<cctype> 头文件,我以前的文章写过,然后当你输入的是字符或者字符串的时候才用吧。。。
请教,不知道对我#28的疑问有什么看法吗?
ifndef冬瓜 2018-02-03
  • 打赏
  • 举报
回复
引用 27 楼 wangningyu 的回复:
10改成10.0
....我觉得可能没啥用吧....
ifndef冬瓜 2018-02-03
  • 打赏
  • 举报
回复
引用 24 楼 qq_40414286 的回复:
楼主你的错误就在while循环语句,while中的表达式(isdigit)的含义是判断是否为字符,你输入一个数字,返回值为0,你在加上!值就变成了1,判断为真,执行循环。
当你输入字符,系统会翻译出你输入的数为一串乱码,然后从乱码第一个开始判断,当判断到iptnum=10,跳出循环。所以你的iptnum每次都是10

确实错在循环语句的条件,改完之后的代码我已经贴在11楼了,但是你后面的解释引发我一点疑问:
当我试图往一个double数组中输入char型时,系统是怎么处理我输入的变量的,是把我输入的值留在输入流中等待下一次读取,还是如你所说,翻译成一段乱码...
我写了这几行实验:

int main()
{
int test = 1;
char test1 = 'b';
cout << "input an int: ";
cin >> test;
cout << "\ninput a char: ";
cin >> test1;
cout << "\nint: " << test << ' ' << "char: " << test1;

return 0;
}

结果是他根本不给我第二次输入的机会...

汪宁宇 2018-02-03
  • 打赏
  • 举报
回复
10改成10.0
xujianshun 2018-02-03
  • 打赏
  • 举报
回复
眼花了。。。。
加载更多回复(21)

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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