早上10点,准时开始比赛。10:00~11:30一个半小时的时间,需要解答13道不定项选择题、2道程序填空题、1道程序设计题和1道综合应用题。这里准备记录分享一下我的思路和解法。
       我毫不犹豫地选择先完成后面4道程序题目,如果在难度中上等的情况下,很显然,这段时间感觉是比较紧迫的。另外,我们知道编程需要充足的时间去思考分析问题,打好程序代码后还需要debug,所以我一上来跳到程序题目。下面我将对完成的这4道题目进行思路介绍和代码分析,欢迎一起学习讨论。
阶乘和、迷宫游戏属于算法设计分析方面,单链表&指针偏向数据结构,而这个类就是单纯的C++编程问题。

题目

  • 阶乘和(递归算法)
  • 学生成绩(单链表&指针)
  • 类的编写(继承&纯虚函数)
  • 迷宫游戏(回溯递归)

阶乘和(递归算法)

众所周知,阶乘的计算使用递归的方法的很经典的做法,而计算阶乘和,很容易想到的就是:在一个for循环里面,每次循环递归求解,再把此次结果相加,得到n轮之和。
如下:
设n=3,sum=0;
第一轮1!
第二轮2!
第三轮3!
sum=1!+2!+3!
而比赛题目并非我们使用的循环+递归的做法,而是需要编写2个函数实现完全递归的做法。

//函数getnumber
int getnumber(int n)
{int sum;if(n ==1){ sum = 1;return sum;//填空1}else{sum = getnumber(n-1)*n; //填空2return sum;}}

通过getnumber函数可知,它实现了一个数阶乘的递归算法,是经典的方法。

//函数get
int get(int n){int sum;if(n==0){return 0;//填空3}else{sum = get(n-1)+getnumber(n);//填空4}return sum;
}

另外,get函数也使用了递归方式求和,首先,调用getnumber求得n的阶乘,其次,递归调用自身来求和,sum = get(n-1)+getnumber(n);巧妙地实现。由此看来,函数体功能很清晰,递归终止条件也很显然,可以说,题目换了一种求解方式,使用了“完全递归”方法来实现阶乘和。
完整程序如下:

#include<iostream>
using namespace std;
int getnumber(int n)//递归求n的阶乘
{int sum;if(n ==1){ sum = 1;return sum;}else{sum = getnumber(n-1)*n; return sum;}}int get(int n){//递归求n的阶乘和int sum;if(n==0){return 0;}else{sum =get(n-1)+getnumber(n);}return sum;
}int main()
{int a;cout<<"请输入需要求的阶乘数:\n";cin>>a;cout<<"程序输出结果是:"<<get(a)<<endl;return 0;
}

学生成绩(单链表&指针)

此题目单链表包含头结点和头指针,考察结点之间的联系和指针的指向,单链表的基本操作:创建链表、初始化、插入结点、遍历单链表。只需要熟悉单链表结构和基本操作就能够正确完成。注释比较详细,完整代码如下:

#include<iostream>
#include<string>
using namespace std;
#define MAX 100typedef struct
{int id;char name[12];char sex[4];int age;char door[10];int tel;int chinese;int math;int english;int cpri;
}Student;typedef struct sqlist
{Student data;struct sqlist *next;}sqlist,*Linklist;//初始化
void init(Linklist &L)
{L=new sqlist;if(!L){cout<<"单链表初始化失败"<<endl;}else {      cout<<"单链表初始化成功"<<endl;L->next=NULL;//填空① 头结点相关操作。}}
//单链表增加元素(尾插法)
void create(Linklist &L)
{int n;cout<<"请输入班级人数"<<endl;cin>>n;Linklist p,tail;tail=L;cout<<"请输入学号,姓名,性别,年龄,宿舍号,手机号码,语文,数学,英语成绩,c++成绩"<<endl;for(int i=1;i<=n;i++){p = new sqlist;//填空②生成内存空间,不要使用malloc生成,使用new函数cin>>p->data.id>>p->data.name>>p->data.sex>>p->data.age>>p->data.door>>p->data.tel>>p->data.chinese>>p->data.math>>p->data.english>>p->data.cpri;tail->next=p;//填空③节点指向操作,插入结点p后尾指针指向修改 tail=p;// 尾指针重新指向新的插入p }tail->next=NULL;//填空④尾节点的相关操作
}
//输出单链表元素
void print(Linklist L)
{Linklist p;p=L->next;while(p!=NULL){cout<<p->data.id<<"  "<<p->data.name<<"  "<<p->data.sex<<"  "<<p->data.age<<"  "<<p->data.door<<"  "<<p->data.tel<<"  "<<p->data.chinese<<"  "<<p->data.english<<"  "<<p->data.cpri;cout<<endl;p=p->next;//指向下一个结点 }
}
int main()
{Linklist L;init(L);create(L);cout<<endl;print(L);
}

类的编写(继承&纯虚函数)

定义一个基类,包含radius(可表示边长、半径)和2个纯虚函数(求体积和表面积),要求编写正方体,圆柱体,球体类并实现其基本功能和属性,输出程序。
基本知识:

  1. C++中,把基类中没有给出具体实现的函数定义为出纯虚函数。格式如:virtual double surface_area()=0;
  2. 含有纯虚函数的类成为抽象类,所以上面所说的基类是抽象类,需要在派生类中实现具体方法。
  3. 抽象类只能做派生类的基类。不能定义抽象类的对象。

此题目实现的是编写通用函数,使用基类统一接口实现派生类的具体方法。详见代码:

#include <iostream>
using namespace std;
#define X 3.1416
class container{protected:double radius;
public:container(double ra){radius=ra;}virtual double surface_area()=0;      //纯虚函数,求面积。virtual double volume()=0;            //纯虚函数,求体积。
};/*在下方构造编写正方体,圆柱体,球体类并实现其基本功能和属性,输出程序
*/
class cube:public container//继承基类,实现纯虚函数的具体方法
{public:cube(double ra=0):container(ra){}virtual double surface_area(){return radius*radius*6;}virtual double volume(){return radius*radius*radius;}
};class sphere:public container
{public:sphere(double ra=0):container(ra){}virtual double surface_area(){return 4*X*radius*radius;}virtual double volume(){return 4/3*X*radius*radius*radius;}
};class cylinder:public container
{protected:double h;public:cylinder(double ra=0,double b=0):container(ra){h=b;}virtual double surface_area(){return 4*X*radius*radius+2*X*radius*h;}virtual double volume(){return X*radius*radius*h;}
};int main()
{container *p;             //定义抽象类指针pcube obj1(10);            //创建正方体对象obj1sphere obj2(6);            //创建球体对象obj2cylinder obj3(4,5);        //创建圆柱体对象obj3p=&obj1;                  //指针p指向正方体对象obj1cout<<"程序输出结果:"<<endl;cout<<"   正方体表面积:"<<p->surface_area()<<endl;cout<<"   正方体体积:  "<<p->volume()<<endl;p=&obj2;                   //指针p指向球体对象obj2cout<<"   球体的表面积:"<<p->surface_area()<<endl;cout<<"   球体的体积:  "<<p->volume()<<endl;p=&obj3;                    //指针p指向圆柱体对象obj3cout<<"   圆体的表面积:"<<p->surface_area()<<endl;cout<<"   圆体的体积:  "<<p->volume()<<endl;return 0;
}

迷宫游戏(回溯递归)

迷宫游戏就是常见的迷宫问题,这也是这次比赛难度较大的一个题目,之前没有接触过这个迷宫问题,做起来费劲一些。

迷宫问题作为一个经典的算法题目,使用到回溯法进行求解,我想再另起一篇详细介绍迷宫游戏题目以及回溯法的具体内容,由此也复习一下之前算法设计分析的经典算法,迷宫游戏也让我意识到学习过的算法的重要性,需要不断练习,重温经典算法,才能够真正掌握,更新之后会在此放文章链接,烦请期待,与大家共勉!
迷宫游戏题解请看我的这篇博客:有趣的迷宫问题(游戏)——递归回溯算法详解

全国大学生计算机技能应用(2020年)——C++科目决赛程序设计题解相关推荐

  1. ML之LGBMRegressor(Competition):2018年全国大学生计算机技能应用大赛《住房月租金预测大数据赛》——设计思路以及核心代码—191017再次更新

    ML之LGBMRegressor(Competition):2018年全国大学生计算机技能应用大赛<住房月租金预测大数据赛>--设计思路以及核心代码-191017再次更新 目录 竞赛相关信 ...

  2. 全国大学生计算机技能应用大赛Java模拟题

    全国大学生计算机技能应用大赛Java模拟题 竞赛官网:http://www.cnccac.com/ 单选题 1.以下哪个不是java的垃圾回收算法 A.标记清除算法 B.空间分配算法 C.标记整理算法 ...

  3. 全国大学生计算机技能应用大赛ppt题库,全国计算机应用技术技能大赛预赛试题及答案.doc...

    全国计算机应用技术技能大赛预赛试题及答案 2004全国计算机应用技术技能大赛预赛试题及答案 IT技能大赛预赛之办公类试题库办公自动化(Word XP试题) 一.单选题:1.下列可将段落设置成1.5倍行 ...

  4. 万字长文带你玩转2020全国大学生计算机技能应用大赛—C语言模考整理解析

    本文前段可能让你索然无味,但是后劲大. 如有解释错误的地方,欢迎在评论区指正 1.判断下列常量不合法的是: 选项 Value A 0128 B -45 C 123.5e4 D ' \n ' 答案:A ...

  5. 第三届“传智杯”全国大学生IT技能大赛(初赛)-Java B组题解

    A - 课程报名 A-课程报名洛谷题目链接 题目描述 传智播客推出了一款课程,并进行了一次促销活动.具体来说就是,课程的初始定价为v元:每报名m个学员,课程的定价就要提升a 元.由于课程能够容纳的学生 ...

  6. 沈理工大学计算机设计专业,沈理工学子在全国大学生计算机设计竞赛中喜获佳绩...

    2020年8月,全国大学生计算机设计竞赛暨第十三届"朔日杯"中国大学生计算机设计竞赛在厦门大学和山东大学举行.本次竞赛作品根据内容分为14类,全国共有700余所院校.约3万件作品参 ...

  7. 中国计算机大赛游戏,我校在第10届全国大学生计算机设计大赛第暨4届中国大学生动漫游戏设计大赛,“星雨杯”福建省级赛的表现优异...

    2017年7月2日上午,第10届全国大学生计算机设计大赛暨第4届中国大学生动漫游戏大赛"星雨杯"福建省分赛区的颁奖典礼在福建省农林大学拓荒广场礼堂召开.我校影视系副主任郑则凌.教师 ...

  8. 计算机比赛证书要求,全国大学生计算机专业证书认证及比赛简介

    全国大学生计算机专业证书认证及比赛简介 一.专业证书及认证 1.等级考试(全国计算机等级考试) 权威:★★★★☆ 难度:★★☆☆☆ 含金量:★★☆☆☆ 官方网址:http://doc.xuehai.n ...

  9. 全国大学生计算机等级考试时间

    全国大学生计算机等级考试时间: 全国计算机等级考试(NCRE)(预计)3月28-30日(根据2020年数据): 全国计算机等级考试(NCRE)(预计)5月30日(根据2019年数据): 全国计算机等级 ...

最新文章

  1. oracle+监控索引使用,ORACLE 监控索引的使用
  2. 如何将linux装入空白硬盘,如何将tiny core linux装入硬盘
  3. 新书上架:《Java SE 实践教程》
  4. 刷前端面经笔记(十二)
  5. 面向对象的三大特征,封装、继承、多态的个人理解以及代码分析
  6. Echarts给坐标轴添加自定义属性
  7. Object 及toString() 方法的重写
  8. linux的程序员计算器,linux中的计算器
  9. 不小心执行了rm-rf,除了跑路,如何恢复?
  10. 程序员面试必备:动图演示十大经典排序算法及代码实现
  11. WebAssembly 将成为互联网的终结?
  12. python音频处理库_python音频处理
  13. 证券分析软件测试面试题,光大证券面试经验
  14. 一句话告诉你为什么有些jQuery插件会有特殊字符(加号、减号、感叹号等)
  15. 职场必备的30套报表模板,满足95%的报表需求,一键套用无需代码
  16. 从MDK分散加载文件学习STM32启动流程
  17. Single Yuanz(单一原则)
  18. React生成二维码并将canvas转换成img格式
  19. 【PAT乙级】1020 月饼
  20. Iphone被刷机后用电信卡提示未激活,移动联通卡可以正常使用

热门文章

  1. 猿辅导python辅导老师_【猿题库/猿辅导课程设计面试】python 教研不推荐去猿辅导-看准网...
  2. 通过小狼毫/rime输入法在飞书中输入Tex/Latex公式的效果-2
  3. 第三周 7.17LJY关于方法参数的一些理解
  4. STM32物联网通信WIFI
  5. Arduino+2.4G模块做航模遥控器
  6. 无法将“pytest”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
  7. zabbix系列:解决zabbix模板不能重复链接到其它模板, 即使透过其它模板
  8. scanf函数用%s参数时的注意事项
  9. DirectSound简单的概述|DirectSound SDK文档翻译
  10. 烤仔观察 | SEC 重拳出击,Brad Garlinghouse 能否成为拯救 Ripple 的关键先生?