程序设计基础作业02-分支&循环程序结构练习

【实验环境】

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上的实验报告

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇