【实验环境】
IDE: Microsoft Visual Studio Community 2022 17.3.3&Microsoft Visual Studio Code August 2022 (version 1.71.2)
操作系统:Windows 11 家庭中文版21H2 22000.918(64-bit)
控制台:Microsoft.WindowsTerminalPreview_Win11_1.15.2283.0
【实验一】
已知鸡和兔的总数量为 n, 腿的总数量为 m, 编写一个程序,输入 n 和 m, 输出鸡和兔的数目。
计算结果可以用小学奥数中的抬脚法来实现;
程序判断是否有解通过一个bool变量来控制,=1时有解,=0无解;通过if语句来控制bool值的改变以及决定最后的输出结果
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,m,cxk,atp;// n=鸡兔总数 m=脚的总数 cxk=鸡 atp=兔
bool right=1; //数据合法检查指示
cout<<"请依次输入鸡和兔的总数量, 腿的总数量:"<<endl;
cin>>n>>m;
if(m%2!=0)
right=0; //如果脚的总数为奇数,则不合法
atp=(m-n*2)/2;
cxk=n-atp; //抬脚计算法
if(atp<0||cxk<0)
right=0; //如果鸡兔任一数目小于0,则不合法
if(right==1)
printf("鸡:%d, 兔:%d\n",cxk,atp); //数据合法,直接输出
else
cout<<"无解!"<<endl; //数据非法,输出无解
return 0;
}
【实验二】
编写一个程序,输入二维平面上的3个点(x1, y1), (x2, y2) 和 (x3, y3), 判断是否存在以这3个点为顶点的三角形
两点间距离公式计算三边长度;
三角形存在条件:任意两边之和大于第三边
//源代码
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
double x1,y1,x2,y2,x3,y3,a,b,c; //a,b,c为三角形三边长度
cout<<"请输入(x1,y1):"<<endl;
cin>>x1>>y1;
cout<<"请输入 (x2,y2):"<<endl;
cin>>x2>>y2;
cout<<"请输入 (x3,y3):"<<endl;
cin>>x3>>y3;
a=sqrt(pow(x1-x2,2)+pow(y1-y2,2)); //两点间距离公式,下同
b=sqrt(pow(x1-x3,2)+pow(y1-y3,2));
c=sqrt(pow(x2-x3,2)+pow(y2-y3,2));
if(a+b>c&&a+c>b&&b+c>a) //三角形存在条件:任意两边之和大于第三边
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
return 0;
}
【实验三】
找到并输出所有具有这样特性的4位数字:其4位数字的和等于这个数字以十六进制表示时的4位数字的和,也等于这个数字以十二进制表示时的4位数字的和。
提取每一位的数字基于权表示法,通过整除以及求余运算取得;
使用for循环对每一个四位数依次检查,if语句判断是否符合条件以便输出
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int i,j=0,a,b,c,d,e,f,g,h,w,x,y,z;
//i,j:计数器 abcd:十进制数 efgh:十六进制数 wxyz:十二进制数
for(i=1000;i<=9999;i++){
a=i/1000; b=i%1000/100; c=i%100/10; d=i%10; //十进制数提取四位数字,下以此类推
e=i/4096; f=i%4096/256; g=i%256/16; h=i%16;
w=i/1728; x=i%1728/144; y=i%144/12; z=i%12;
if((a+b+c+d==e+f+g+h)&&(a+b+c+d==w+x+y+z)){
//printf("i[10]=%d,i[16]=%d %d %d %d,i[12]=%d %d %d %d,sum=%d\n",i,e,f,g,h,w,x,y,z,a+b+c+d);
//上为检查语句,分别输出十进制,十六进制,十二进制数及四位数字总和,最终运行时不输出
cout<<i<<" ";
j++;
if(j==10){
cout<<"\n";
j=0;
} //无情的换行机器,每输出十个数换一次行(否则输出截屏截不下了)
}
}
return 0;
}
【实验四】
输出所有形如 aabc(即前两位数字相等)的 4 位完全平方数。完全平方数是指那些可以表示为某一正整数的平方的数。
提取前两位的数字基于权表示法,通过整除以及求余运算取得;
使用for循环对每一个小于10000的完全平方数依次检查;
if语句判断是否符合条件以便输出
//源代码
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int i,a,b; //i:底数 a,b:平方数的前两位数字
for(i=1;(i*i)<=9999;i++)
{
a=(i*i)/1000; //提取数位,下同
b=(i*i)%1000/100;
if(a==b&&a!=0) //符合题意,并且是四位数
printf("%d=%d^2\n",i*i,i);
}
return 0;
}
【实验五】
定积分的物理意义是某个函数 f(x) 与 x 轴围成的区域的面积。 定积分可以通过将这块面积分解成一 连串的小矩形,计算各小矩形的面积的和而得到。计算时,小矩形的宽度 d=(xi - xi-1) 可由用户指定,矩形的高度选取函数值 f((xi + xi-1)/2),请依据计算定积分的方法,编写程序求𝜋的近似值。
由于半径为1的圆面积恰好为π,所以可以先用定积分求出四分之一圆的面积,最后乘以四得到总面积,即π的近似值
//源代码
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int i,j=0,dInput; //i,j:计数器 dInput:输入的宽度精度
double pai,d,x,xPrev=0,h;
//pai:π d:矩形实际宽度 x:当前横坐标 xPrev:上一个横坐标 h:矩形高度
cout<<"请指定矩形的宽度(单位:10^-n,推荐3-9之间):"<<endl;
//用10^-n将宽度d用一个精度值n(即dInput)表示
cin>>dInput;
d=pow(10,0-dInput);
//将精度值转换为实际宽度
for(i=1;i<=1/d;i++)
{
x=i*d;
h=sqrt(1-pow(0.5*(xPrev+x),2));
pai+=(d*h);
//将矩形面积加入到总面积
xPrev=x;
//下面是一个小进度条,程序每五千万次运算会输出一个运算精度值
j++;
if(j==50000000)
{
printf("Loading %.2f %% ",x*100);
j=0;
}
}
pai*=4; //之前算的总面积是四分之一个圆,乘以四得到总面积π
printf("\nπ=%.15lf\n",pai); //输出小数点后共计15位
return 0;
}
【实验六】
编写程序,程序随机生成一个整数 x, 其中 x 在-500 和 500 之间,即-500≤x≤500。程序给用户 10 次 机会猜测这个整数,在这 10 次机会中,程序先提示“请输入你猜得数:”,若用户给出的值大于 x, 程序 输出信息“大 了”,若用户给出的值小于 x, 程序输出信息“小了”,若用户给出的值等于 x, 程序输出 信息“恭喜, 你答对了”。若超过 10 次,用户都没有猜中,程序输出“不好意思, 你失败了!”
随机数和符号分别通过两个随机函数生成,猜测的过程用for循环,判断对错与大小由if语句控制
//源代码
#include<iostream>
#include<cmath>
#include<ctime>
#include<cstdlib>
using namespace std;
int main()
{
int x,guess,sign,chance;
//x:随机数绝对值 guess: 猜的数 sign:随机数正负号 chance:剩余机会
bool win=0; //win:胜负判定
srand(time(NULL));
x=rand()%501; //在0-500中生成一个随机数
sign=rand()%2; //随机生成正负号
if(sign==0)
x*=-1; //sign=1 x正负号不变,sign=0 x取负值
for(chance=9;chance>=0;chance--) //机会递减
{
cout<<"请输入你想猜的数(在-500~500之间):";
cin>>guess;
if(guess==x) //猜对:结束循环
{
win=1;
break;
}
else
{
if(guess>x) //猜错:判断大小
cout<<"太大了!";
else
cout<<"太小了!";
}
printf(" 你还有%d次机会\n",chance);
}
if(win==1) //结果输出
cout<<"你猜对了!"<<endl;
else
cout<<"你输了!"<<endl;
}
【附加题】
求子序列的和:输入两个正整数0<n<m<10^6,输出\frac{1}{n^2}+\frac{2}{(n+1)^2}+...+\frac{m-n+1}{m^2},保留 5 位小数。
找规律求得通项公式,然后for循环累加
//源代码
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
double sum=0;
int i,n,m;
cout<<"请输入n,m,使0<n<m<10^6:";
cin>>n>>m;
for(i=1;i<=m-n+1;i++)
sum+=(i)/pow(n+i-1,2);
printf("S=%.5lf",sum);
}
【测试数据与结果】&【实验总结】
详见GitHub上的实验报告