在while中使用cin>>a 为条件,注意事项

用一个题目来解释

本题为统计输入多少个连续数字

#include<iostream>
using namespace std;
int main()
{
	int currVal = 0 , val = 0;
	if(cin >> currVal)
	{
		int cnt=1;//统计次数
		while(cin >> val)
		{
			if(currVal == val)
			{
				cnt++;
			}
			else{
				cout << currVal <<" occurs "<<cnt<<" times "<<endl;
				currVal = val;
				cnt=1;//重新计算另一个 
			}
		} //while循环结束 
		cout << currVal <<" occurs "<<cnt<<" times "<<endl;//打印最后一个数 
	}//if循环结束 
	return 0;
}

有一个要注意的地方,以前不理解在while里面用cin >> val是什么意思,用这个当条件的话,通过检测其流的状态来判断结束;

(1)若流是有效的,即流未遇到错误,那么检测成功;

(2)若遇到文件结束符,或遇到一个无效的输入时(例如本题输入的值不是一个整数),istream对象的状态会变为无效,条件就为假;

怎样才是文件结束符呢?

不同的操作系统有不同的约定,在windows系统中,输入文件结束符的方法是先按Ctrl+Z,然后再按Enter;在UNIX系统中,包括Mac OS X系统中,文件结束输入为Ctrl+D;

下面是两个输入实例图片,请对比

1.这个直接按enter,最后一个4显然没有输入进去,程序读不到最后一个数,程序一直保持输入的状态;


2.这个是正确实例,上面的Z是按了ctrl的效果


  • 19
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
C++代码翻译成Python代码,实现同样的功能: ```python class Homework: def __init__(self, no, deadline, score): self.no = no self.deadline = deadline self.score = score def __lt__(self, other): # 重载 < 运算符 # 扣分相同时,按提交时间递减排序 if self.score == other.score: return self.deadline > other.deadline else: return self.score < other.score def findans(n): ans = 0 flag = [0] * (MAXN + 1) for i in range(n - 1, -1, -1): # 从最后一个(扣分最多的作业)开始做 for j in range(H[i].deadline, 0, -1): # 对照deadline,deadline前的第一个空闲做该任务 if not flag[j]: flag[j] = H[i].no break else: ans += H[i].score return ans, flag MAXN = 1005 while True: n = int(input()) if n == 0: break H = [] for i in range(n): deadline = int(input()) H.append(Homework(i + 1, deadline, 0)) for i in range(n): score = int(input()) H[i].score = score H.sort() res, flag = findans(n) # 按时间做作业顺序输出作业编号 for i in range(1, MAXN + 1): if flag[i]: print(flag[i], end=' ') print() print(res) ``` 注意事项: - Python没有结构体,可以使用类来表示作业。 - C++数组下标从0开始,而Python数组下标从0开始,因此在将下标作为作业编号时需要加1。 - C++的`fill()`函数在Python没有对应的函数,可以使用列表解析式来清空列表。 - Python`for...else...`语句可以在for循环完整遍历完列表后执行else块,相当于C++的if...else...语句。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值