【2023年NCST C语言新生培训】| 五次培训总结 | C到C++内容补充 | 排位赛详细题解 |《万字长文》
文章目录
- 一,四次培训总结
- 1,第一次培训( 培训介绍 + Onilne Judge,编译语言,编译器的选择 )
- 2,第二次培训
- 1,本次培训安排
- 2,基本的运算式结构
- 3,第三次培训
- 1,选择性程序结构
- 2,循环顺序结构
- 4, 第四次培训
- 二,C到C++的建议
- 1,C++的优越性介绍
- 2,C到C++的建议
- 三,结营排位的相关题解
- 2023年C语言基础培训结课排位赛题解
- 题目讲解
- A : 俺の贝勒爺が!
- C++过题代码
- C 过题代码
- B : 秀才的约会
- C++过题代码
- C 过题代码
- C : 逃课的sea
- C++过题代码
- C 过题代码
- D : 猪刚鬣
- C++过题代码
- C 过题代码
- E : 伤心的周小树
- C++过题代码
- C 过题代码
- F : 哥布林的传说
- C++过题代码
一,四次培训总结
1,第一次培训( 培训介绍 + Onilne Judge,编译语言,编译器的选择 )
-
___培训介绍: 本次培训主要对学生的C语言能力进行相关培养,我们对基本的C语言课程进行了简化,简化后的课程更加简单,能更快的入手,但相应的知识体系不是很完整,所以需要学生们更多的花费时间来深入学习。
注意 : 考虑到大部分学生没有信息学基础,本课程仅作为导入学习使用
-
___Onilne Judge 在线测题平台 : 本次培训将会使用华北理工大学在线测评平台,OJ平台(Online Judge平台)是一个在线编程评测系统,用于评判编程竞赛、算法练习或编程作业提交的代码。这种平台允许用户提交自己编写的程序,然后自动测试和评估其代码的正确性和性能。以下是有关OJ平台使用的一些重要信息:
- 评测系统:OJ平台的核心是一个评测系统,它会自动运行提交的代码,并根据预定义的测试用例来评估代码的正确性。通常,系统会检查代码的输出是否与预期输出一致。
-
___编译语言和相关的编译器的介绍: :当涉及到编程语言选择时,了解每种语言的特性和应用领域是很重要的。下面是对C++, C, Java 和 Python 这四种编程语言的简要介绍:
-
C++:
- 特性:
- C++ 是在C语言的基础上扩展而来,支持面向对象编程(OOP)。
- 它拥有强大的指针和内存管理功能,允许程序员直接控制计算机硬件。
- C++具有丰富的标准库,包括数据结构和算法的实现。
- 应用领域:
- C++广泛用于游戏开发,高性能应用程序,嵌入式系统和操作系统开发。
- 也在金融领域、图形编程和科学计算中有广泛应用。
- 特性:
-
C:
- 特性:
- C语言是一种通用的编程语言,注重效率和性能。
- 它具有简洁的语法,强大的指针操作和直接的内存访问。
- C语言没有面向对象编程的特性,但可以使用过程化编程来解决问题。
- 应用领域:
- C语言常用于系统编程,操作系统内核的开发,嵌入式系统和硬件控制。
- 许多编程语言的编译器和解释器也是用C语言编写的。
- 特性:
-
Java:
- 特性:
- Java是一种面向对象的编程语言,具有跨平台性,通过Java虚拟机(JVM)实现。
- 它强调安全性、内存管理和垃圾收集。
- Java具有广泛的标准库和大型的开发社区。
- 应用领域:
- Java广泛用于Web开发(使用Java Servlet和JSP)、移动应用开发(Android应用)、企业级应用开发(使用Java EE)。
- 也在大数据处理和嵌入式系统中有应用。
- 特性:
-
Python:
- 特性:
- Python是一种高级编程语言,以清晰的语法和可读性著称。
- 它支持多种编程范式,包括面向对象、函数式和命令式编程。
- Python具有丰富的标准库和大量第三方库,使开发变得更容易。
- 应用领域:
- Python用于Web开发、数据分析、人工智能(如机器学习和深度学习)、科学计算和自动化任务。
- Python还在网络爬虫、游戏开发、自然语言处理和物联网等领域有应用。
- 特性:
本次培训选用的语言为 C语言 , C语言是C++语言的前身 ,我们先学习C语言在难度上会比较低,在后期也方便向C++进行转手,在程序设计比赛中考虑到程序运行速度的问题,我们大部分的算法学习都会以C为我们讲解算法的第一语言,所以现在学习C语言还能更好的适应以后的算法学习。
2,第二次培训
1,本次培训安排
由于本次的培训不可能全面的覆盖C语言的全部内容,现在我们来看一下本次的培训将会设计到哪些板块,以及后面我们怎么来安排自身的学习,当完成全部内容的学习之后,我们才能叫做真正意义上的掌握C语言。
- 下图是整个的C语言知识体系,当大家完成下面主要内容的学习之后,我们就真正意义上的完成了C语法的学习。
我们分批进行介绍
1, C语言入门和基本的运算符和表达式
首先一个程序最形象的样子应该像下图一样,有着数据的输入和结果的输出 ,程序起到对数据进行处理的作用,程序中的IO使用专门的函数的,对数据的处理我们使用表达式的方式进行处理,所以我们将会首先学习程序的输入输出和运算式的书写的操作。这是最基础的内容,所有内容都会在培训中提到,这块内容也是必须要掌握的内容。
2,控制流 + 函数和程序结构
控制流我习惯把他分成选择性控制流和循环性控制流 , 这些控制流语句是对运算式的提高的表现,使用这些高级语句能更快的实现一些高级操作,我们可以简单的认为他就是对前面的运算式程序结构的升级操作,运算式不仅仅包含程序结构还需要一些变量结构来存储变量,所以我们也可以把运算式分成两个部分,完成数据存储的变量结构和实现程序运行的程序结构两个板块。我们平常使用的程序结构就是顺序程序结构,控制流也就代表着其他不同的两种程序结构。这一板块我们介绍的还是比较全面,但是需要大家进行做题深入的学习,这块内容不刷题是无法进行掌握的。
3,指针和数组
像上文说的一样,我们的数组结构也是对变量的一种升级或者叫做扩展,使用更高级的数据存储方式可以极大的简化程序的运算式的长度,对于指针我们推荐大家可以自行的了解一下他的思想,对于绝大多数人来说在前期的学习中死啃指针只能导致自己掉入深渊,但是指针的思想还是比较重要的,推荐大家去浅入了解一下。
4,剩余内容
剩下的结构体和共用体也是比较重要的一种数据结构(变量),对我们后面的学习也是比较重要的,因为课时的原因需要大家自行去学习,重点_敲黑板
文件操作基本不会用到,一般只有早期OIer在调用文件测试数据的时候会使用到,但大学中绝大多数都是ICPC赛制,基本不会涉及到这块板块的内容,可以当成兴趣进行学习。
2,基本的运算式结构
-
标识符和关键字: 标识符是由字母、数字、下划线3种字符组成的字符序列,用于标识程序中的变量、符号常量、数组、函数和数据类型等操作对象的名字。标识符一般以字母、下划线开头。
C语言中的标识符可以分为预定义标识符和用户定义标识符。 -
基本的数据结构类型:
-
常见的运算符和表达式:
算术表达式 :
逻辑表达式 : && == and _________ || == or
3,第三次培训
1,选择性程序结构
对于选择性程序结构我们常用的只用一个 if,在一些时候我们甚至可以使用三元运算符对整个选择语句进行替代,我们就简单的来看一下if语句的使用,首先 if else ,这块内容非常简单,我们只用对题目进行练习就能比较好的掌握。
2,循环顺序结构
循环顺序结构分成下面几大部分
其中虽然有三种循环结构,但实际上我们用的比较多的循环结构只用 while循环 和 for 循环,do while 循环 不是很常用。两种中断方式还都是比较常用的,下面我们来看一下主要的几种循环结构。
不再废话,这部分直接看代码
while循环结构
while(条件语句)
{
循环执行语句
}
for循环结构
for(变量初始化 ; 条件语句 ; 变量递变规律)
{
循环语句
}
还有两种中断方式
break ; // 直接退出这个循环
continue ;// 弹出本次循环,再进行下次循环
4, 第四次培训
本次仅仅对数组进行了讲解,介绍了一些不同数据类型的数组类型,尤其是字符串类型,他是使用char 的数组进行实现的,数组可以理解为多个变量连接在一起组成的结构,所以比较简单,我们下面来看一下数组的使用和创建。
二,C到C++的建议
1,C++的优越性介绍
对于学习完成C语法的同学,要转手到C++ 的过程是比较的痛苦的,从C到C++的基础的语法是不会变的,对代码的风格要求也是不会变的,使用C++一般来说都比C语法要更好用,主要改变的是要熟练的应用各种库,使用库中的函数更快的实实现对程序的设计,但是在输入输出上 C++ 倒是赶不上C语言输入输出的速度 。
在输入输出中的不同 , 在C++中的输入,输出的速度比较慢,在 1e6 以上的文件的输入中会受到影响,我们使用快速读入的方式解决这个问题 。
// 解决办法
ios :: sync_with_stdio(false) ;
下面我们举几个例子,在排序或者二分搜索中我们往往要写大量的代码来进行功能的实现,但是在C++中algorithm 库中有直接实现该功能的函数 。 在C语言中的数据结构我们只能自己手写,但是在C++中我们有现成的标准库, 可以直接调用他们,更加简单方便。
2,C到C++的建议
在C语言的学习中,我们可能还会有一些遗忘的地方 ,我们要建立起长期学习C++语法知识的准备,当在读代码的时候语法知识出现了问题,我们一定要好好反思学习,语法知识永远都是高楼下的基石。
对于C++有很多的内容还没有讲解,这需要你在题目中来发现来理解,大学不能再像高中时期那样再一口一口喂,我建议把C++语法的学习分成两个时间段:
第一时间段是大家系统化学习C++语法知识的时间,时间不需要太长,不超过两个月,把整个的语法体系再行的建立一边,对编程语言的理解将会更上一层楼,时间不要太长也不要太慢。
第二时间段 : 就是对C++中所设计到的知识的不断的积累,所积累的知识也分成两部分, 一部分是对体系知识的学习, 另一部分是对库中的函数的学习 。
_________________明确轻重 _______________
以上仅供参考,每个人都不一样,请择优听取。
三,结营排位的相关题解
2023年C语言基础培训结课排位赛题解
by S_zhi
题解声明
1、 本份题解仅提供 C / C ++ 语言版本
2、解题思路分为多种,有多种解题思路能通过测试均可作为正确答案
题目讲解
A : 俺の贝勒爺が!
题目
小明是一名重度网瘾患者,他喜欢玩各种各样的游戏,这天他发现一款名叫《我的爹》的Galagame,他非常好奇,于是打开了这款游戏。下面是第一关 :
上图是游戏中的局长少爷NPC说的一句话,看到这句话时的小明觉得应该马上给这位少爷请安~~,请输出“少爷好”即可通过。
思路 : 俩眼一瞪,输出题,cout 或者 printf 即可
C++过题代码
#include <iostream>
using namespace std ;
int main ()
{
cout << "少爷好"<< endl ;
return 0;
}
C 过题代码
#include <stdio.h>
int main ()
{
printf("少爷好\n");
return 0;
}
B : 秀才的约会
题目
当谈到俊朗的男子,
英俊之貌,风采非凡。
眸中星光闪烁明亮,
笑靥如花,真情无患。他的步伐轻盈而从容,
举手投足皆充满风采。
他的声音如音乐般悦耳,
魅力四溢,让人陶醉。他那自信的姿态挺拔,
散发出的魅力无法抵挡。 秀才,世间稀有品,
无愧是风华绝代的传奇。
在一次直播中秀才遇到了一个难题,因为他热度很高并且有很多喜欢他的人,但是他现在没有时间来顾及到给他打赏的每个人,所以现在他决定先去和这场直播打赏最多的大哥(大姐)约会,本场直播一共有n个人对秀才进行了打赏,编号从1开始,(1,2,3,4…n)。因为秀才很忙,请帮秀才计算他应该先和编号为几的人约会。(当存在两个大哥打赏的金额一致的时候,秀才会优先跟编号小的大哥约会)
思路 : 本题的大意就是寻找出给秀才打赏最多的钱的人,如果两个人打赏的钱数是一样的,我们将优先选择序号比较小的人。
首先我们来完成寻找最大值的操作 : 首先使用一个 ans_max 变量来记录当前遇到的最大的打赏金额,使用循环扫一遍整个的数组我们就能知道最大值是多少了。
<
接下来简单的思路就是从编号为1的下标的人开始搜索,从1到n进行一边搜索,当遍历到当前这个人打赏的金额正好等于ans_max 的值的时候我们就输出当前这人的编号,就是打赏这个金额(金额最大)并且编号最小的人。
#include <stdio.h>
int q[200010] ;
int main ()
{
int ans_max = -1 ;
int n ;
scanf("%d",&n);
for(int i = 1 ; i <= n ; i ++ ){
int x ; scanf("%d",&q[i]);
if(ans_max < q[i]){
ans_max = q[i] ;
}
}
for(int i = 1 ; i <= n ; i ++ ){
if(ans_max == q[i]){
printf("%d\n",i) ;
break ;
}
}
return 0 ;
}
<
更优化的解法是开一个ans_num 数进行下标的存储工作,我们当遇到的值超过 ans_max 当前存储的值的时候,我们直接存储他的下标,当一次循环完成之后就可以直接输出 ans_num即可。
C++过题代码
#include <iostream>
using namespace std ;
int ans_num = 0 , ans_max = -1 ;
int main ()
{
int n ;
cin >> n ;
for(int i = 1 ; i <= n ; i ++ ){
int x ; cin >> x ;
if(ans_max < x){
ans_max = x ;
ans_num = i ;
}
}
cout << ans_num << endl ;
return 0 ;
}
C 过题代码
#include <stdio.h>
int main ()
{
int ans_num = 0 , ans_max = -1 ;
int n ;
scanf("%d",&n);
for(int i = 1 ; i <= n ; i ++ ){
int x ; scanf("%d",&x);
if(ans_max < x){
ans_max = x ;
ans_num = i ;
}
}
printf("%d\n",ans_num);
return 0 ;
}
C : 逃课的sea
题目
众所周知,sea是非常喜欢逃课的,他总是被老师抓到,在某门课上老师规定缺勤率超过或等于1/3这门课就会挂科,否则他就不会挂科。
现在sea同学有点害怕挂科,这门课一共进行了 n 次签到,sea同学会告诉你他的这n次签到记录,在签到记录中 0 代表缺勤(sea同学逃课了),1 代表sea同学签到了,请告诉sea同学他是否会挂科。
思路 :
看到这道题我们只用记录一下缺勤次数是否超过或等于了总的签到次数的 1 / 3 、所以我们只用记入一下,签上道的次数和未签上道的次数,我们使用一个变量 m 来进行缺勤的次数记录、最后我们使用 3 * m >= n 这个式子就能完成sea同学是否缺勤的判定
C++过题代码
#include <iostream>
using namespace std ;
int m = 0 ;
int main ()
{
int n ;
cin >> n ;
for(int i = 0 ; i < n ; i ++ ){
int x ; cin >> x ;
if(x==0){
m ++ ;
}
}
if(m*3>=n)
cout << "YES"<<endl;
else cout << "NO" << endl ;
return 0 ;
}
C 过题代码
#include <stdio.h>
int m = 0 ;
int main ()
{
int n ;
scanf("%d",&n);
for(int i = 0 ; i < n ; i ++ ){
int x ; scanf("%d",&x) ;
if(x==0){
m ++ ;
}
}
if(m*3>=n)
printf("YES\n");
else printf("NO\n");
return 0 ;
}
D : 猪刚鬣
题目
猪八戒或许以其外表来说不如孙悟空那般俊俏,但他的魅力却独具一格。他那圆滚滚的面庞和喜庆的笑容总能带来快乐,而他的眼睛则充满了善意和幽默。猪八戒的身体虽然丰满,但这反而赋予他温暖的包容力,使他成为了一个让人愿意亲近和信任的伙伴,在取经完后,他并不想要佛祖给他的这种净坛使者的虚名,猪八戒还是想有一个平凡又温暖的家,平静的过完这一生就好。
猪八戒打算去高老庄看看高翠兰,但佛祖已经认下猪八戒是净坛使者,于是派来了三位“佛门弟子”来拦下猪刚鬣,他当时承诺过高翠兰取经回来娶她为妻,猪刚鬣决定搏上一搏,已知猪刚鬣的战力为 n ,其他三人的战力分别为a ,b , c。因为三人不会和猪刚鬣讲武德,他们会一拥而上,最后的战力为他们的战力之和。
猪刚鬣只有在战力比他们高或相等的情况下才能战胜他们,只要战胜他们猪刚鬣就能回到高老庄,请问猪刚鬣能回到高老庄吗?
思路 : 比较大小 ,使用 if 语句实现即可
C++过题代码
#include <iostream>
using namespace std ;
int main ()
{
int n ;
int a , b , c ;
cin >> n >> a >> b >> c ;
if(n >= a + b + c)
cout << "YES" << endl ;
else cout << "NO" << endl ;
return 0 ;
}
C 过题代码
#include <stdio.h>
int main ()
{
int n ;
int a , b , c ;
scanf("%d%d%d%d",&n,&a,&b,&c);
if(n >= a + b + c)
printf("YES\n");
else printf("NO\n");;
return 0;
}
E : 伤心的周小树
题目
周小树是背带的一名学生,他最近有很多事情,心情非常的不开心(周小树起始的心情值为-100),小司是他的好朋友,打算去开导一下小树同学,小司同学计划带小树同学去曹妃甸牛马养殖场去玩,牛马养殖场很大,小司同学把他划分成 n * m 个板块,下面是个例子
但是收到小司的邀请之后,小树不知道要去哪里。但是不怕,经过小司对周小树的了解,他已经掌握了周小树去每个地方心情的改变值,小司的任务就是让周小树的心情值变得越大越好,在保证心情值变到最大的同时又要少去地方,小司不想去无意义的地方逛游。
注意 : 每个地方只能去一次,不用考虑会经过某些地方的问题,小司会传送法阵可以直接到达。
思路 :本题目为循环叠加题型, 两重循环完成全部的二维数组的扫描,题目上说的是让周小树的心情变得最优解,并且去最少的地方, 那这样首先我们开一个 cnt 来存储到达过几个地方,再开一个 ans 来存储当前周小树的心情值,每次当前遍历到的点的值大于0 就让 cnt ++ , 对应的加上ans 上, 即可。
C++过题代码
#include <iostream>
using namespace std ;
typedef long long LL ;
int main ()
{
int n , m ;
cin >> n >> m;
LL ans = -100 ;
int cnt = 0 ;
LL _min_ = -1e10 ;
for(int i = 1 ; i <= n ; i ++ ){
for(int j = 1 ; j <= m ; j ++ ){
int x ;cin >> x ;
_min_ = max(_min_,(LL)x);
if(x>0){cnt++,ans+=x;}
}
}
cout << ans << endl ;
cout << cnt << endl ;
return 0 ;
}
C 过题代码
#include <stdio.h>
#include <math.h>
typedef long long LL ;
int main ()
{
int n=0 , m=0 ;
scanf("%d%d",&n,&m);
LL ans = -100 ;
int cnt = 0 ;
LL _min_ = -1e10 ;
for(int i = 1 ; i <= n ; i ++ ){
for(int j = 1 ; j <= m ; j ++ ){
int x ;scanf("%d",&x);
_min_ = fmax(_min_,(LL)x);
if(x>0){cnt++,ans+=x;}
}
}
printf("%lld\n%d\n",ans,cnt);
return 0 ;
}
F : 哥布林的传说
题目
随着移动支付的发展,越来越多的小偷都开始了转行,作为小偷的祖宗哥布林也开始了灵活就业,现在的大学生全身上下最值钱的就是手里的手机了,但是现在一天24小时,他们巴不得25小时看手机,手机不好偷,那哥布林们就开始思考了,能偷些什么东西呢,显然大学生们的外卖是最合适的目标了,无人看守最容易得手。
于是哥布林首领下令开始窃取人类的外卖,每只哥布林都会有一只大麻袋,大麻袋的体积为 N ,每次他来到宿舍楼下行动的时候可以看到两个外卖的两个属性值 , 这份外卖的价值 W ,和这份外卖所占的体积为 V ,只要不超过他的袋子的体积他可以装任意份外卖。
请为哥布林计算他使用这个袋子最多能装价值为多少的外卖?
思路 : 使用 dp[i] 表示 背包体积为 i 时候所放的价值最大值即可。
C++过题代码
#include <iostream>
using namespace std ;
const int N = 510 ;
int dp[N];
int main ()
{
int n , m ;
cin >> n >> m ;
for(int i = 0 ; i < m ; i ++ ){
int w , v ;
cin >> w >> v ;
for(int j = n ; j >= v ; j -- ){
dp[j] = max(dp[j],dp[j-v]+w);
}
}
cout << dp[n]<< endl ;
return 0 ;
}