程序——数据结构与算法(C++)

目录

第一部分 C++入门练习题

第二部分 C++提升练习题


本专栏用于记录我对于数据结构与算法的学习过程以及思考收获,问题改正等

代码全是自己码的(Dev C++/VS)

第一部分 C++入门练习题

1.1三个数找最大值

#include<iostream>//引入头文件 
using namespace std;//引入std命名空间中的成员 

int main()//主函数入口 
{
	int a, b, c;//定义三个整型变量 
	cout <<"请输入三个数以比较大小:"<<endl; //输出一句话提示使用者 
	cin >>a>>b>>c;//依次输入a b c,中间是以空格隔开 
	if(a >= b)
	{
		if(a >= c) cout <<a;
		else cout <<c;
	} 
	else
	{
		if(b >= c) cout <<b;
		else cout <<c;
	}//比较三个数大小的算法,先比较ab,再取其中大的与c比较 
	return 0;//程序正常退出标志 
}

1.2二元一次方程组求解

#include<iostream>
#include<cmath>//引入函数库,后续需要用到开根号的函数  sqrt() 
using namespace std;

int main()
{
	int a, b, c;
	cout <<"依次输入方程的三个系数:"<<endl;
	cin >> a >> b >> c;
	cout <<"方程为:("<<a<<")*x^2 + ("<<b<<")*x + ("<<c<<") = 0"<<endl; 
/*
对系数的非零或零的情况进行分类 
*/ 
	if(a == 0)
	{
		if(b == 0) cout << "方程无解" << endl;
		else
		{
			int x = (-c)/b;
			cout <<"方程有唯一解:x = "<< x << endl;
		}
	}
	else
	{
		if(b == 0)
		{
			int x = sqrt((-c)/a);
			cout <<"方程有两解:"<<x<<" 和 "<< -x << endl;
		}
		else
		{
			int delt = b*b - 4*a*c;
			if(delt > 0)
			{
				delt = sqrt(delt);
				int x1 = (-b+delt)/(2*a);
				int x2 = (-b-delt)/(2*a);
				cout <<"方程与两个解:"<<x1<<" 和 "<<x2<<endl;
			}
			else if(delt == 0)
			{
				int x = (-b)/(2*a);
				cout <<"x = "<<x<<endl;
			}
			else cout <<"方程无解"<<endl;
		} 
	}
/*
对结果的可能性判断不正确 
*/
//	if(delta > 0)
//	{
//		delta = sqrt(delta);
//		int x1 = (-b+delta)/(2*a);
//		int x2 = (-b-delta)/(2*a);
//		cout <<"方程与两个解:x1 = "<<x1<<"  x2 = "<<x2<<endl;
//	}
//	else if(delta == 0)
//	{
//		int x = (-b)/(2*a);
//		cout <<"x = "<<x<<endl;
//	}
//	else cout <<"方程无解"<<endl; 
	return 0;
}

1.3成绩等级划分

#include<iostream>
using namespace std;

/*
就按照优秀、良好、及格、不及格分类 
采用分支语句 if     else if    else 
*/

int main()
{
	int sco = 0;
	cout <<"请输入成绩:"<< endl;
	cin >> sco;
	if(sco < 0 || sco >100)
	{
		cout <<"输入成绩不符合规定:"<< endl;
	}
	else if(sco >= 0 && sco <= 59)
	{
		cout <<"成绩等级为:不及格"<< endl;
	}
	else if(sco >= 60 && sco <= 69)
	{
		cout <<"成绩等级为:及格"<< endl;
	}
	else if(sco >= 70 && sco <= 89)
	{
		cout <<"成绩等级为:良好"<< endl;
	}
	else if(sco >= 90 && sco <= 100)
	{
		cout <<"成绩等级为:优秀"<< endl;
	}
}

1.4输入三个双精度浮点数判断是否能构成一个三角形

#include<iostream>
using namespace std;
/*
三个双精度浮点型的数据,判断是否能构成一个三角形 
需要满足较小的两边之和大于第三边,或者所有两边之和都大于第三边
这采用代码更为简介的第二种判断方法 
*/
int main()
{
	double a, b, c;
	cout <<"请输入三个小数:(以空格隔开)"<<endl;
	cin >> a >> b >> c;
	if((a+b) > c && (a+c) > b && (b+c) > a) cout <<"可以构成三角形"<<endl;
	else cout <<"不可以构成三角形"<< endl;
	return 0; 
 } 

本次出错在于测试时我输入了1.1、2.2、3.3,结果输出为可以构成三角形,然后开始调试发现a\b\c的值被记录为如图所示,导致进行判断时完全符合要求任意两边之和大于第三边。

原因如下:

来自本站@行秋的解答

这是因为我们输入是十进制小数,而转化为机器代码,是用二进制表示的,小数部分转化为二进制(“乘2取整”),需要不断的乘以2,去其整数部分,但反复运算,有些小数是算不进的,而float是有位数长度限制的。计算机数据的浮点表示和整数表示的数据编码方式是不一样的,计算机表示浮点数会存在一定误差。

1.5寻找20个数中的最大数最小数和平均数

#include<iostream>
using namespace std;
/*
输入20个数,找出最大数,最小数,求平均值 
*/

int main()
{
	double max, min, sum, temp;//设置最大数、最小数、和、temp用于临时存放每次输入的数 
	cout <<"请输入第1个数字:"<< endl;
	cin >> temp;
	max = min = sum = temp;//将第一个数赋值给最大最小和用于后续循环的开始
	/*
	每次循环对本次输入的数进行是否为最大或最小以及相加计算和的操作 
	*/ 
	for(int i = 2 ; i <= 20; i++)
	{
		cout <<"请输入第"<< i <<"个数字:"<< endl;
		cin >> temp;
		if(temp > max) max = temp;
		if(temp < min) min = temp;
		sum += temp;
	}
	cout <<"最大数是:"<< max << endl;
	cout <<"最小数是:"<< min << endl;
	cout <<"平均数是:"<< (sum/20) <<endl;
    return 0;
}

1.6n个数求最大值平均值

#include<iostream>
using namespace std;
/*
若干个数,求最大值和平均值 
*/ 
int main()
{
	int total;//用于统计共有多少个数字 
	cout <<"请输入有多少个数:"<< endl;
	cin >> total;
	float a[total];//生成数组放置数据 
	cout <<"请输入这些数:"<< endl;
	for(int i = 0 ; i < total ; i++) cin >> a[i];//循环放入 
	int max = a[0], sum = 0;
	for(int i = 0 ; i < total ; i++)
	{
		if(max < a[i]) max = a[i];
		sum += a[i];
	}
	cout <<"最大值为:"<< max << endl;
	cout <<"平均值为:"<< (sum/total) << endl;
	return 0;
}

1.7到标志数字时结束输入,求最小值和平均值

#include<iostream>
using namespace std;
/*
输入若干个数字,到某个特定数字时停止,求这些数字的平均数和最小值 
*/
int main()
{
	int flag;//标志数字 
	cout <<"请输入特定数字:"<< endl; 
	cin >> flag;
	double temp, min, sum, num;
	cout <<"请依次输入数字:"<< endl; 
	cin >> temp;
	min = temp;
	sum = 0;//和 
	num = 1;//数字个数 
	//当值为标志数字时直接就退出循环 
	while(temp != flag)
	{
		if(min > temp) min = temp;
		sum += temp;
		num++;
		cin >> temp;
	}
	cout <<"最小值为:"<< min << endl;
	cout <<"平均值为:"<< (sum/num) << endl;
	return 0;
}

1.8一个数列求和

#include<iostream>
using namespace std;
/*
求1*X^1+……+100*X^100
*/
int main()
{
	int x;
	cout <<"请输入x的值:"<< endl; 
	cin >> x;
	int sum = 0, sumX = 1;
	//进入循环后,每次先计算本次的x的次方 
	for(int i = 1 ; i <= 100 ; i++)
	{
		sumX *= x;//i个x的乘积 
		sum += i * sumX;//把每个i个x的乘积乘以前面的系数后加到总和sum中去 
	}
	cout <<"S="<< sum << endl; 
}

1.9 2的零次方加到2的64次方

#include<iostream>
#include<cmath>
using namespace std;
/*
从2的零次方加到2的六十四次方 
*/
int main()
{
	long long temp;
	long long sum = 0;
	for(int i = 0 ; i <= 64 ; i++)
	{
		temp = pow(2, i);
		sum += temp;
	}
	cout << sum;
	return 0;
}

1.10 1!+2!+3!+……+10!

#include<iostream>
using namespace std;
/*
求1!+2!+3!+……+10! 
*/
int main()
{
	int sum = 0, temp = 1;
	//循环中,每次先算出某个数的阶乘,然后再将它们相加 
	for(int i = 1 ; i <= 10 ; i++)
	{
		temp *= i;
		sum += temp;
	}
	cout << sum << endl;
	return 0;
 } 

第二部分 C++提升练习题

2.1猜数字的小游戏

#include<iostream>
#include<ctime>
using namespace std;
/*
本节代码将实现一个与使用者互动的猜数字游戏,满足以下要求:
1、首先向用户说明游戏
2、根据时间生成一个1~100的随机数
3、用户输入猜测的数,提示他猜测数字过大或过小
4、用户有5次猜测机会
*/
int main()
{
	//1、向用户说明游戏规则
	cout << "~~~~~~~~~~欢迎使用由star开发的第一款文字类游戏~~~~~~~~~~" << endl;
	cout << "快来猜一猜我心中所想的数字吧!" << endl;
	cout << "游戏规则:\n\t1、我会在心里想一个1~100的数字,你来猜一猜\n\t2、每次我会提示你猜测的数字过大或过小\n\t3、你有五次猜测的机会,用完五次机会就会game over" << endl;
	
	//2、根据时间生成随机数(1~100)
	srand((unsigned int)time(NULL));//添加随机数种子,根据系统时间生成一个随机数,防止每次打开程序生成的随机数都是一样
	int num = rand() % 100 + 1;//生成一个0~99的随机数再加一
	
	int i = 1;//记录五次机会的次数,顺便用于提示用户
	int  val = 0;//创建变量val记录用户猜测的数,初始化为零则不可能与随机数相同
	while (i <= 5)
	{
		cout << "这是你第 " << i << " 次机会猜测:" << endl;
		cin >> val;//用户输入后进行判断
		if (val > num)
		{
			cout << "你猜的数字比我想的大!!!" << endl;
			if (i == 5)
			{
				cout << "好可惜,差一点点就猜对了!" << endl;//第五次依然猜错
				cout << num << ",这才是我想的数字呀!" << endl;
			}
		}
		else if (val < num)
		{
			cout << "你猜的数字比我想的小!!!" << endl;
			if (i == 5)
			{
				cout << "好可惜,差一点点就猜对了!" << endl;//第五次依然猜错
				cout << num << ",这才是我想的数字呀!" << endl;
			}
		}
		else
		{
			cout << "你居然第 " << i << "次就猜对啦,真厉害" << endl;
			cout << num << ",这是我想的数字呀!" << endl;
			break;
		}
		i++;//每次进行一遍猜测后,用i记录第几次
	}

	return 0;
}

2.2do while语句求水仙花数

#include<iostream>
#include<cmath>
using namespace std;

/*
要求使用do while语句寻找所有的三位数水仙花数
水仙花数是三个位上的数字的三次幂之和等于数字本身
预期采用两个do while嵌套从三位数的第一个数100开始直到999结束的循环中每个数进行判断
判断时,用循环方式求解三个数位上的数的三次幂之和
*/

int main()
{
	int num = 100;//三位数从100开始
	int a = 0;//记录每一位数字用于计算
	int sum = 0;//记录三次幂之和
	int temp = 0;//用于提取每一位
	do
	{
		temp = num;
		do
		{
			a = temp % 10;//取个位上的数字
			sum += pow(a, 3);//将其取三次幂然后加到sum
			temp /= 10;//丢掉最后一位
		} while (temp > 0);//经过三次循环后temp一定等于零,此时退出循环
		if (num == sum)
			cout << num << endl;//如果满足水仙花数的要求,就输出
		num++;//判断下一个三位数
		sum = 0;//!!!一定要将sum置零用于下次计算判断
	} while (num < 1000);//三位数到999结束
	return 0;
}

第一次写好运行时,没有结果,进行调试后发现sum一直不断增大,得知sum未置零。

2.3乘法口诀表

#include<iostream>
using namespace std;

/*
输出乘法口诀表
*/

int main()
{
	cout << "~~~~~~~~~~~~~~~乘法口诀表~~~~~~~~~~~~~~~" << endl;
	for (int i = 1; i <= 9; i++)
	{
		for (int j = i; j <= 9; j++)
		{
			cout << i << " × " << j << " = " << (i * j) << "\t";
		}
		cout << endl;
	}

	cout << "~~~~~~~~~~~~~~~乘法口诀表~~~~~~~~~~~~~~~" << endl;
	for (int i = 1; i <= 9; i++)
	{
		for (int j = 1; j <= 9; j++)
		{
			if (j <= i)
			{
				cout << j << " × " << i << " = " << (i * j) << "\t";
			}
			else
			{
				cout << endl;
				break;
			}
		}
	}

	return 0;
}

第一遍的代码出来跟原版不一致。 将行和列对调一下,然后每次行运行完直接换行。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值