实验目的
1、学习选择语句(包括if-else 语句和switch 语句)的语法和使用。
2、学习循环结构(包括for 语句、while 语句和do-while 语句)的语法和使用,以及不同的循环语句之间的联系和区别。
3、学习break 语句和continue 语句在流程控制中的作用。
4、学习选择语句和结构语句的嵌套。
5、学习Visual Studio 的Debug 功能。
实验内容
1、设计程序,输入为两个正整数,输出为这两个正整数的最大公约数。
2、给出一个大于1 的正整数a,设计一个使用for 循环的程序判断这个数是否为质数。
3、设计程序,输入为一个正整数,给出这个整数的质因子分解(如。提示:质因子从小到大排列的分解更容易实现。
4.用本章学习的逻辑运算和流程控制的知识,求解我国古代数学中经典的“百钱百雉”问题:公元5 世纪末,我国古代数学家张丘建在《算经》中提出了如下问题:鸡翁一值钱五,鸡母一值钱三,鸡雏三值钱一。凡百钱买百鸡,问鸡翁、母、雏各几何?
5.某地发生了一起犯罪案件,警局经过审问,做出了以下判断:
1) A、B 至少有1 人作案。
2) A、E、F 中至少有2 人参与作案。
3) A、D 不可能都是案犯。
4) B、C 或同时作案,或与本案无关。
5) C、D 中有且仅有1 人作案。
6) 如果D 没有参与作案,那么E 也不可能参与作案。
请利用学过的关于逻辑运算和流程控制的方法,设计解答方案,并编程输出所有的案犯。
实验过程
实验一(最大公约数)
#include <iostream>
using namespace std;
int main()
{
int a,b,i,t;
cout << "Please input 2 numbers:" << endl;
cin >> a >> b;
if(a<b) //判断a、b大小
t=b;
else
t=a;
for(i=t;i>1;i--) //从a、b中较小的数开始找公约数
{
if(a%i==0 && b%i==0)
{
cout << "最大公约数为" << i;
break;
}
}
return 0;
}
运行结果
实验二(判断是否为质数)
代码
#include <iostream>
#include <cmath>
using namespace std;
int isPrime(int n) //判断n是否是质数
{
float sqrt_n;
int i,t = 1;
for(i=3;i<sqrt(n);i+=2) //从3开始判断偶数
{
if(n%i==0)
t = 0;
}
return t;
}
int main()
{
int a;
cout << "Please input a number:" << endl;
cin >> a;
if(a%2!=0 && isPrime(a)==1) //当不能被2整除用函数判断
cout << a << "是质数" << endl;
else
cout << a << "不是质数" << endl;
return 0;
}
运行结果
实验三(质因数分解)
代码
#include <iostream>
using namespace std;
int main()
{
int n,k,i;
cout << "Please input a number:" ;
cin >> n;
cout << n << "=";
k = n;
if(n<2) //小于2的数不能分解
return 0;
for(i=2;i*i<k;i++) //从小到大用质数分解合数
{
while(k%i==0)
{
k = k/i;
cout << i;
if(k!=1)
cout << "*";
}
}
if(k!=1) //若为质数,输出
cout << k;
return 0;
}
运行结果
实验四(百钱百雉问题)
代码
#include <iostream>
using namespace std;
int main()
{
int x,y,t=1;
float z;
for(x=0;(5*x)<=100;x++)
{
for(y=0;(3*y)<=100;y++)
{
for(z=0;(z/3.0)<100;z++) //注意到数据类型转换
{
if(5*x+3*y+z/3.0==100) //“百钱百雉”条件
{
cout <<"第"<<t<<"种情况:鸡翁"<< x << "只;鸡母" << y << "只;鸡雏" << z <<"只"<< endl;
t++;
}
}
}
}
return 0;
}
运行结果
实验五(案犯推理)
代码
#include <iostream>
using namespace std;
int main()
{
int a,b,c,d,e,f,i;
for(a=0;a<2;a++) //分别以0、1表示不犯罪、犯罪
{
for(b=0;b<2;b++)
{
for(c=0;c<2;c++)
{
for(d=0;d<2;d++)
{
for(f=0;f<2;f++)
{
e = d;
if(a+b>0 && a+d+f>1 && a+d!=2 && c+d ==1 && (b+c==2 || b+c==0)) //将推理条件转化为编程语言
{
cout << "推断结果:" << endl;
if(a==1)
cout << "A是案犯"<< endl;
if(b==1)
cout << "B是案犯"<< endl;
if(c==1)
cout << "C是案犯"<< endl;
if(d==1)
cout << "D是案犯"<< endl;
if(e==1)
cout << "E是案犯"<< endl;
if(f==1)
cout << "F是案犯"<< endl;
}
}
}
}
}
}
return 0;
}
运行结果
总结
这次实验完成了最大公约数、质数判断、质因数分解、百钱百雉及案犯推理几个实验,主要练习了C++流程控制结构。
通过本次实验,学习了C++的顺序、选择、循环结构的使用,其流程控制的代码形式与C语言基本一致;练习了C++用类的方法输入输出cin、cout。本次实验有几个重要的知识点:①从几种判断质数的算法中,找到复杂度较低的算法;②设计判断质数的函数,合理设置函数返回值;②百钱百雉问题包含隐含强制类型转换,需要使用浮点型数据保证正确输出;③案犯推理的问题,将文字叙述合理地转换为编程语言。
实验代码已经检查并优化,但依然存在重复,不够优雅。实验后,深入学习使用数组“储存”变量进行遍历等知识,对实验代码继续改进。