到目前为止,所有的训练题目中给出的输入数据个数是确定的,但是有时候输入数据个数不确定,这种情况下,需要不断读取数据直到没有新的输入数据为止,那么C++是如何判断出读到文件末尾(或者没有新的输入)了呢?在C++中使用"EOF"(end of file)来实现,代表文件(file)或者标准输入(stdin)的结尾,读入语句一旦判断到文件末尾,即可结束读入数据。
实战训练1—统计馆内人数
问题描述:
某市新开了一家科技馆,放假期间每天有许多团队慕名而来入场参观,每个团队人数介于2到50之间,并且必须团进团出,游客不得脱团行动。请编写一个程序,计算馆内的实时人数。
输入格式:
输入一行若干个整数,代表若干个团队的人数。入场团队人数为正数,离场团队人数为负数。团 队总数不超过10000。
输出格式:
输出一行一个整数,代表馆内的游客人数。数据保证馆内游客人数不会小于 0。
输入输出样例:
输入样例1 | 输出样例1 |
3 4 5 10 -4 -10 5 8 -3 | 18 |
输入样例2 | 输出样例2 |
3 4 5 8 -4 -8 -5 10 -3 | 10 |
问题分析:
根据题意,需要一个变量sum来存储科技馆内的总人数,根据输入的进入团队或离场人数来实时更新馆内的总人数,由于不确定输入的数据个数,所以只要判断输入的不是结束标志EOF,那么就进行操作,使用while循环来是实现,具体程序代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int sum=0,tmp;//定义馆内总人数变量sum(并初始化为0)和每次进入馆内或离开馆内人数
while(scanf("%d",&tmp)!=EOF){//只要有数据输入表明馆内人数在变化
sum += tmp;//将人数变化累加到和变量sum中
}
printf("%d\n",sum); //输出馆内人数
return 0;
}
这段程序看起来似乎没有任何问题,但是在dev中输入测试样例运行时,输入回车后没有任何反应,也就是说scanf并没有读到EOF,程序仍然在等待输入,在Windows系统中,输入回车之后,再接着按"Ctrl+Z"程序才能输出正确的结果,如果是Linux系统,需要键入"Ctrl+D"。同理cin在遇到EOF也表明读入数据结束,具体程序代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int sum=0,tmp;//定义馆内总人数变量sum(并初始化为0)和每次进入馆内或离开馆内人数?
while(cin>>tmp){//只要有数据输入表明馆内人数在变化
sum += tmp;//将人数变化累加到和变量sum中
}
cout<<sum<<endl;//输出馆内人数
return 0;
}
实战训练2—数字反转
问题描述:
给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零,例如输入420,反转后得到的新数为24。
输入格式:
输入一行一个整数,该整数定义为n(-10000000000<=n<=10000000000)。
输出格式:
输出一行一个整数,表示反转后的整数。
输入输出样例:
输入样例1 | 输出样例1 |
985 | 589 |
输入样例2 | 输出样例2 |
1120 | 211 |
问题分析:
根据题意,假设输入变量为n,要构建反转后的数字rn,可以借鉴数位分离的思想,使用循环来逐位提取输入整数的每一位数字,通过取模运算 % 10 得到当前最低位的数字,将反转后的数字rn乘以10加上最低位为rn重新赋值,这样就可以得到到目前为止所有最低位数得到的反转数字rn,例如123,起始值rn为0,分离最低位数3之后,得到反转后数为3,再通过整除运算 /= 10 去掉当前最低位的数字,为下一次迭代准备,例如123变为12,紧接着在分离出2,rn=3*10+2=32,依次进行下去;其次需要注意n的取值范围,由于n最大值超出了int表示的范围,所以采用long long类型,具体程序代码如下:
#include<bits/stdc++.h>
using namespace std;
int main() {
long long n,rn=0;//定义变量n和反转后的变量rn并初始化为0
cin>>n;//输入n的值
while(n){//从低位开始到高位依次分离数字
rn = rn*10 +n%10;//将rn的值赋值为rn*10+最低位数
n /= 10;//修改n的值
}
cout<<rn<<endl;//输出反转后的整数
return 0;
}
实战训练3—简单的除法
问题描述:
输入三个正整数a,b,n(a,b≤10,1≤n≤200),输出a÷b的值,要求计算结果精确到小数点后n位,最后一位不需要四舍五入。
输入格式:
输入一行三个整数a、b和n,中间用逗号隔开。
输出格式:
输出一行一个数,即a÷b 的小数点后面有n位的值。
输入输出样例:
输入样例1 | 输出样例1 |
1 3 5 | 0.33333 |
输入样例2 | 输出样例2 |
10 7 12 | 1.428571428571 |
问题分析:
这道题给人的第一反应就是用double类型数据进行除法运算,但是题目中要求结果精确到小数点后n位(1≤n≤200),double类型数据的精度无法达到,因此只能另辟蹊径。可以通过除法竖式得到启发,a÷b的商的小数部分就是在重复“余数x10÷b的商”。例如10÷7,10除以7商为1,余数是3,接着用余数3乘10得到30,继续除以7得商为4,即小数部分当前位的值,30除以7的余数2继续乘10,以此类推,直到求解得到n位小数,具体程序代码为:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b,n,t=1;//首先定义变量a、b和小数点后n位变量,以及while循环变量来标志小数位数并初始化为1
cin>>a>>b>>n;//输入a、b和n
cout<<a/b<<'.';//输出小数点前面内容
a=a%b*10;//求余乘以10
while(t<=n){//小数位数小于等于n则进入循环
cout<<a/b;//依次输出小数内容
a=a%b*10;//求余乘以10修改a
t++;//小数标志自增运算
}
return 0;
}
标签:10,信奥赛,样例,while,循环,馆内,rn,人数,输入
From: https://blog.csdn.net/ALISHENGYA/article/details/145044413