流程控制语句实验答案及详解
【实验目的】
1学习if、switch选择语句的使用及其嵌套的使用方法
2掌握循环结构while、do-while、for的使用。
3了解转向语句的使用。
4学习循环结构的嵌套使用。
【实验内容】
⒈编程实现:输入一个百分制成绩,要求输出成绩等级A、B、C、D、E。
(注:90分以上:为A,80一 89分为B,70一79分为C,60一69分为D,60分以下为E。)
要求:该程序能正确处理任何数据。当输人数据大于:100或小于0的数据通知用户“输人数据错”,结束程序。
#include"iostream"
using namespace std;
//(注:90分以上:为A,80一 89分为B,70一79分为C,60一69分为D,60分以下为E。)
//要求:该程序能正确处理任何数据。当输人数据大于:100或小于0的数据通知用户“输人数据错”,结束程序。
int main()
{
int sorce;//学生的分数,根据题意,为 int 型。因为并没有 89.5 之类的数据。
cout<<"输入成绩:"<<endl;
cin>>sorce;//输入分数。
if(sorce>=90)
{
cout<<"成绩为A"<<endl;
}
else if(sorce<90&&sorce>=80)
{
cout<<"成绩为B"<<endl;
}
else if(sorce<80&&sorce>=70)
{
cout<<"成绩为C"<<endl;
}
else if(sorce<70&&sorce>=60)
{
cout<<"成绩为D"<<endl;
}
else if(sorce<60&&sorce>=0)
{
cout<<"成绩为E"<<endl;
}
else
{
cout<<"输入数据错误";
}
return 0;
}
2.编程由键盘输入年、月,输出该年该月的天数
先来看看闰年的集合:如下一张图阴影部分:
#include"iostream"
using namespace std;
//由键盘输入年、月,输出该月天数。
//月份有大月小月,2月还有闰年不闰年的区别。先判断是否为闰年,再判断是哪个月份,就能该月知道有几天了。
int main()
{
int year,month;
cout<<"输入年份:"<<endl;
cin>>year;
cout<<"输入月份:"<<endl;
cin>>month;
bool is_runnian;//这个 变量用于表示是否为闰年。
if((year%4==0&&year%100!=0)||year%400==0)//闰年可以被4整除,但是有下面这种限制情况。不可被100整除但可被400整除。//参照上图图片。
{//即图片的 (黄框绿框之间部分)再除加上蓝框。
is_runnian=true;
}
else
{
is_runnian=false;
}
if(month==2)
{
if(is_runnian==true)//是二月,且是闰年
{
cout<<endl<<"该月份有 29 天。"<<endl;
}
else//是二月但不是闰年
{
cout<<endl<<"该月份有 28 天。"<<endl;
}
}
else if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
{
cout<<endl<<"该月份有 31 天。"<<endl;
}
else
{
cout<<endl<<"该月份有 30 天。"<<endl;
}
return 0;
}
3.从键盘上输入若干实数,以输入0为结束。设计一程序、分别统计出正数和负数的个数,并求出正数之和、负数之和及总的平均值。
#include"iostream"
using namespace std;
//3.从键盘上输入若干实数,以输入0为结束。设计一程序、分别统计出正数和负数的个数,并求出正数之和、负数之和及总的平均值。
int main()
{
double num;//要输入的数
int geshu=0;//输入数据的总数,最后求平均值的时候除以这个数,刚开始输入了 0 个。后来每输入一个就加 1 。
int ageshu=0;//整数个数。
int bgeshu=0;//负数个数。
double sum=0;//所有输入数据的总和。一开始和为 0 。输入哪个数,就加上哪个数。
double asum=0;//正数和
double bsum=0; //负数和1
cin>>num;
while(num!=0)//只要输入的数不为 0 就不结束。
{
//这行以上是判断。判断成功 则 执行以下代码。开始执行,则 总和需要加上这个数,而且 输入的个数要加 1 。
geshu++;
if(num>0)//输入数据大于 0 ,正数个数加 1 ,正数和加上输入的数。
{
ageshu++;
asum=asum+num;
}
if(num<0)//输入数据小于 0 ,负数个数加 1 ,负数和加上输入的数。//可以直接写成 else。解释见代码片下方一行。
{
bgeshu++;
bsum=bsum+num;
}
sum=sum+num;//无论输入的是正数还是负数都要加上。
fflush(stdin);//每次输入前,清空输入的缓冲区 防止缓冲区出错。
cin>>num; //清空输入缓冲区后,从新输入 num 。
}//当 输入的 num 为 0 时,结束。
cout<<"输入个数为"<<geshu<<endl;
cout<<"平均数为:"<<sum/geshu<<endl;
cout<<"正数和为:"<<asum<<endl;
cout<<"负数和为:"<<bsum<<endl;
return 0;
}
因为输入 0 就结束计算。所以 可以直接 if 和 else。这样就用不到两个 if 来判断了,优化了代码。而写成两个 if 判断 主要是考虑到还有 0 的非正非负情况。
4.编写程序用公式计算e的近似值。直到最后一项小于给定精度。
由图公式看出:e 是由阶乘倒数的和得来的。 所以 e 是多次循环得来的。每次循环 加上一个阶乘倒数的和。而阶乘由循环得来。这样的想法就可以用二重循环实现。外层循环是 最终结果的循环。内层是每次阶乘的结果。但是,后一个数的阶乘,可以用前一个结果去乘,这样就可以省去第二个循环。(双重循环方法见第二段代码)(e为2.71828来运行验证一下。精度不要太高)
#include"iostream"
using namespace std;
//单重循环法。
int main()
{
double e=1;
double a;//用来输入给定精确的值。比如精确到0.0001位置,就输入0.0001;
/*
1.0/a 如果比最后阶乘大,则最后一项抵达精确范围。
*/
cout<<"输入最后一个数的精度"<<endl;
cin>>a;
double b=1.0/a;
long int n=1;//用 n 来求阶乘。
for(int i=1;b>=n;i++)
{
n=n*i;
double f=1.0/n;
e=e+f;
}
cout<<"e的值为"<<e<<endl;
return 0;
}
第二种方法:
#include"iostream"
using namespace std;
//双重循环法。不如单重的快,因为没有利用上一次的阶乘结果,而要从 1 开始算阶乘。
int main()
{
double e=1;
double a;//用来输入给定精确的值。比如精确到0.0001位置,就输入0.0001;
/*
1.0/a 如果比最后阶乘大,则最后一项抵达精确范围。
*/
cout<<"输入最后一个数的精度"<<endl;
cin>>a;
double b=1.0/a;
for(int i=1;;i++)
{
int f=1;//每次阶乘结果还原。
for(int j=1;j<=i;j++)
{
f=f*j;//算阶乘,直到 i 次结束。
}
if(f>b)//如果精度到达指定值 则 break 循环。
{
break;
}
e=e+1.0/f;//未到达指定值则让 e 不断的加该阶乘的倒数。
}
cout<<"e的值为:"<<e<<endl;
return 0;
}
⒌ 编程序打印一个如图3-2所示的数字金字塔:
观察图可知: 设行为 i 。有9行,则外循环要9次,即 i 从 1 到 9。每行前面的空格数是 ( 9 - i ) 个。每行结束后,还要换行。
每行从 1 输出到 i 再从 i 输出到 1 。这又是一个循环。行内的第几个数用 j 表示。
从 1 输出到 i 要在第一层循环下,从 i 到 1 也在第一层循环下,且在 1 到 i 的后面输出。
#include"iostream"
using namespace std;
//双重循环法。不如单重的快,因为没有利用上一次的阶乘结果,而要从 1 开始算阶乘。
int main()
{
for(int i=1;i<9;i++)
{
for(int k=1;k<=9-i;k++)//输出 前面的(9-i)个 空格。
{
cout<<" ";//输出空格
}
for(int j=1;j<i;j++)//从 1 到 i 。输出。
{
cout<<j;
}
for(int j=i;j>=1;j--)//从 i 到 1 。输出。
{
cout<<j;
}
cout<<endl;
}
return 0;
}
6 设计一个简单的计算器程序。能进行两个数的加,减,乘,除即可。
#include"iostream"
using namespace std;
int main()
{
char a;//用来存 =-*/号。
double b,c;//两个用于计算的数。
cout<<"输入 x+y,x-y,x*y,x/y 的格式"<<endl;
cin>>b>>a>>c;
switch(a)
{
case '+':
cout<<b<<"+"<<c<<"="<<b+c<<endl;
break;
case '-':
cout<<b<<"-"<<c<<"="<<b-c<<endl;
break;
case '*':
cout<<b<<"*"<<c<<"="<<b*c<<endl;
break;
case '/':
cout<<b<<"/"<<c<<"="<<b/c<<endl;
break;
default :
cout<<"输入格式错误"<<endl;
break;
}
return 0;
}