备战蓝桥杯——C++基础算法(一)

  • Post author:
  • Post category:其他


Hello,大家好!我是阿冰!在我的上一个“不忘初心”的博客中提到,过一周左右我要参加学校组织的程序设计大赛,以及要准备蓝桥杯,我们学校的比赛题型也是参考蓝桥杯的题型,不管怎样,最重要的都是蓝桥杯,校赛也一直抱着学习总结的心态,为蓝桥杯做好准备,因此,打算出一个备战蓝桥杯的系列,利用这段时间冲一冲省奖,有同样打算的小伙伴可以关注这一系列,如果能帮到你,本人将感到无比荣幸。

首先说一下本人的学习情况吧,我是省一本大学一名大二的学生,专业是软件工程,大一学了c语言和数据结构,c++只会建项目,头文件和输入输出,哈哈哈,也就是典型的只学教材的大学生,不过好在基础还算扎实,c++中涉及c的部分基本是会的。

比赛最重要的是考察算法而非语言,语言只是一个载体,我的计划是通过刷题来学习算法,算法遇到知识盲点再回看语言,通过这种学习方式可以让备赛更高效,真正做到以赛促学。好,话不多说,我们直接上干货~

我蓝桥杯报的是大学B组c/c++组,简单来说就是可以用c语言写程序,也可以用c++写,不过还是推荐使用c++,因为c++的功能更强大,它是c语言的升级版,除了包含c的功能外,还提供了一些类库函数,此外还有面向对象的部分,可以让代码更简洁,因此很受竞赛选手青睐。

我使用的编译器是Dev-c++,当然Visual Studio也是个非常不错的选择,大家根据习惯进行选择即可。我们需要先对c和c++有个初步的区分,首先就是头文件的不同,上面是c的,下面是c++的

#include<stdio.h>
#include "iostream"
using namespace std; 

然后就是输入输出格式有所不同, 以输入整数然后输出为例,下面是用c写的完整代码,附运行结果:

#include<stdio.h>
int main()
{
	int num;
	printf("请输入一个整数:\n");//输入提示 
	scanf("%d",&num);//输入数字 
	printf("%d",num);//输出数字 
	return 0; 
}

在这里插入图片描述

然后下面是使用c++的代码,附运行结果:

#include "iostream"
using namespace std; 
int main()
{
	int num;
	cout<<"请输入一个整数"<<endl;//输入提示 
	cin>>num;//输入整数 
	cout<<num;//输出 
	return 0;
}

在这里插入图片描述

在初步学习中,我们可以认为,除了以上两点不同外,其余都是一样的。在这里,我也是计划通过c语言的基本算法来带入到c++的算法,一是借此回忆起c的知识,进而打好c++的基础,二是找找感觉,提高算法编程能力。下面我们就直接使用c++来写程序啦!

#第一部分 选择结构

1、输入圆的半径,输出该圆的周长和面积。若半径小于0,提示“输入不合法”。

#include "iostream"
using namespace std;
#define PI 3.14
int main()
{
	double r;
	cout<<"请输入半径大小:";
	cin>>r;
	if(r<0)
	{
		cout<<"输入不合法!";
	}
	else
	{
		cout<<"周长为:"<<2*PI*r<<endl;
		cout<<"面积为:"<<PI*r*r;
	}
	return 0;
} 

在这里插入图片描述

这道题非常有代表性,首先定义了宏常量,方便后面使用,然后考虑到半径的合法问题,通过使用简单的选择结构,使程序功能更强大!

2、输入学生成绩,输出等级,规则如下:

90~100 A

80~89 B

70~79 C

60~69 D

不及格 E

要求:使用if和switch分别实现

方法一:if语句

#include "iostream"
using namespace std;
int main()
{
	int score;
	cout<<"请输入成绩:"<<endl;
	cin>>score;
	if(score<0||score>100)
	{
		cout<<"成绩输入不合法!"<<endl;
	}
	else
	{
		if(score>=90)
			cout<<"A"<<endl;
		else if(score>=80)
			cout<<"B"<<endl;
		else if(score>=70)
			cout<<"C"<<endl;
		else if(score>=60)
			cout<<"D"<<endl;
		else
			cout<<"E"<<endl;
	}
	return 0;
}

方法二:switch语句

#include "iostream"
using namespace std;
int main()
{ 
	int score;
	cout<<"请输入成绩:";
	cin>>score;
	if(score>=0&&score<=100)
	{
		switch(score/10)//成绩取整 
		{
			case 10:
			case 9:cout<<"A"<<endl;break;
			case 8:cout<<"B"<<endl;break;
			case 7:cout<<"C"<<endl;break;
			case 6:cout<<"D"<<endl;break;
			default:cout<<"E"<<endl;
		}
	}
	else
	{
		cout<<"成绩不合法!"<<endl;
	}
	return 0;
}

运行结果:

在这里插入图片描述

这道题使用了多条if语句以及if嵌套语句,很具有代表性,代码也是结构清晰,容易理解~

3、输入年、月,输出该月有多少天。( 1, 3, 5, 7, 8, 10, 12月,31天。

4, 6, 9, 11月,30天。2月, 闰年, 29天;平年, 28天。)

#include "iostream"
using namespace std;
int main()
{
	int year,month,days;
	cout<<"请输入年、月:";
	cin>>year;
	cin>>month;
	if(month<1||month>13)
	{
		cout<<"数据不合法!"<<endl;
	}
	else
	{                     
		switch(month)
		{
		case 1:days=31;break;                //注意break一定不能少!
		case 2:
			if(year%4==0&&year%100!=0||year%400==0)    //区分闰年和平年
				days=29;//闰年 
			else
				days=28;//平年 
			break;
		case 3:days=31;break;
		case 4:days=30;break;
		case 5:days=31;break;
		case 6:days=30;break;
		case 7:days=31;break;
		case 8:days=31;break;
		case 9:days=30;break;
		case 10:days=31;break;
		case 11:days=30;break;
		case 12:days=31;break;
		}
		cout<<year<<"年"<<month<<"月有"<<days<<"天"<<endl;
	}
	return 0;
}

在这里插入图片描述

这道题的核心算法就是闰年的判断条件,这个非常重要!

4、给一个不多于3位的正整数,要求按逆序输出各位数字。

例如,原数是321,应输出123;原数是45,应输出54。

#include "iostream"
using namespace std;
int main( )
{
	int num,n1,n2,n3;
	cout<<"请输入一个不多于3位的正整数:"<<endl;
	cin>>num;
	if(num<0||num>999)
	{
		cout<<"数据不合法!"<<endl;                       
	}
	n3=num/100;          /*分解出百位*/
	n2=num%100/10;       /*分解出十位*/
	n1=num%10;           /*分解出个位*/
	if (n3!=0) 
	cout<<"这是一个三位正整数,逆序输出结果为:"<<n1*100+n2*10+n3<<endl;
	else if (n2!=0) 
	cout<<"这是一个二位正整数,逆序输出结果为:"<<n1*10+n2<<endl;
	else  
	cout<<"这是一个一位正整数,逆序输出结果为:"<<n1;
	return 0;
}

在这里插入图片描述

这道题的核心算法是对于一个给定的三位数,分解出百位、十位、个位的数字,这是解题的关键!

好了,今天的分享就先到这里啦,希望可以对你有所帮助,我们下期再见,拜拜~



版权声明:本文为m0_70640261原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。