写在前面
趁着暑假赶紧把C语言的习题也补了 也欢迎看到这篇博客的小灯们来到华南农业大学喵 专栏里还有后续其他部分课程的学习笔记
如何提交自己的代码
首先给各位说一下这门课程的要求,首先是我们学校的校内OJ,我们计算机类专业的学生用的是前面这个链接,别的学院选修课或者转专业用的应该是另外一个,登录的初始账号和密码都是自己的学号,后续可以进行修改。平时的程序类的课后作业和考试以及之后的程序设计校赛都在这个平台进行。
进去之后长这个样子,确实比较简陋
在左边的实验里面选对应的课程就可以看到课后习题了,第一次进入系统先去高级程序语言设计里面的实验1填一个问卷,可以直接升5级
如何编写自己的代码
然后是我们使用的IDE,上课老师做演示一般是使用CodeBlocks,优点在于不需要怎么配置,缺点在于不能怎么配置,不支持装插件,界面也很简陋
当然如果你不喜欢这个很土的页面,也懒得在学完C语言之后学其他语言还要换IDE花时间适应的话,你还有其他更酷炫的选择,我说的就是CLion,不推荐VS Code主要还是觉得新手配置麻烦过头了,而且我也不常用
打开官网,你肯定会发现这个软件要钱,没关系,接下来就向你介绍如何申请学生白嫖特权
学生认证
来到我们学校的网络服务中心 在最左边点击开通邮箱,虽然说是随便取名字,但是亲测输入学号除外的任何内容作为邮箱地址都会申请失败
回到JetBrains官网,在这里进入申请页面
申请方式选择官方文件,填进你刚刚申请好的校园邮箱,上传的学生证或者校园卡的照片,去学信网申请一个电子认证码填进去,一周内你就可以在校园邮箱看到申请成功的消息了。直接用你的校园邮箱登录CLion就可以使用了,等待成功的这段时间刚好有一个月的试用期,可以先用着
Github的学生认证也是同理,如果想要白嫖Copilot的AI辅助代码功能可以去申请一下
网课资源
陈湘骥教授(下称bsc)非常鼓励我们在这门课提前学习,他推荐我们去看的是翁凯教授的网课,让我们提前看,每节课课前要报一下自学进度,他在前期过渡几周之后的上课节奏就会非常快,不提前学一点的话可能会有一些吃力,当然翁凯老师的课确实是独一档了,免费还讲得这么好有什么理由不看看呢
实验1 C语言程序初步
6567 The first C Program
恭喜你在开学前完成了非常完备的准备工作,完成上面的操作,熟悉一下学校的系统你就已经击败80%的同学了,当然如果你真的那么好学!我们也可以直接开始C语言的学习
首先是我们的第一道题,照着题目给的这个图片把代码打上去然后运行即可,CodeBlocks的运行按钮已经告诉你们了,CLion的运行按钮是那个绿色的开始键,非常的清晰明朗(
1001 计算a+b
然后我们就要开始语法的学习了,首先作为一段程序,我们肯定是有一些命令的语句的,但是如何让计算机能够看懂呢?我们需要引入库,也就是最上面的#include <stdio.h> 如果不先include这么一下的话,你在底下写的大部分函数电脑都是看不懂的,你的代码也就只是一段文本文档而已,在之后的学习中我们还会学习很多的库,我们现在要知道的是,想让你的程序从点运行之后弹出来的黑框里面读入你输进去的东西以及输出东西上去所需要的scanf和printf语句,都需要你先引用stdio.h这个库
scanf和printf,顾名思义,就是在黑框里面读入和输出,具体使用方法如下
scanf("%d",&a);
printf("%d",a);
当程序运行到scanf那一句的时候,就需要你在黑框里面打进去一个数字,然后你的这个数字就会被存在a这个名字下面被程序继续使用,而当运行的printf那一句的时候,就会把存起来的a这个名字代表的数字显示在黑框上面
而外面这个框和int main是什么意思呢?就是说只有写在这个框里的内容才会跑起来,至于后续更复杂的函数相关呢,我们留到后面实验9再细说
那么这一题就直接这样写就可以了
#include <stdio.h>
int main()
{
int a, b;
scanf("%d%d", &a, &b);
int c=a+b;
printf("%d", c);
return 0;
}
11126 输出a与b中的较大值
与上面的同理,大于小于也是可以直接使用的
#include <stdio.h>
int main()
{
int a, b;
scanf("%d%d", &a, &b);
if(a > b)
printf("%d",a);
else
printf("%d",b);
return 0;
}
而这里新出现的if和else是啥呢?我想如果你高考考的是英语,那你一定知道if就是如果的意思,else就是否则的意思,所以这段代码你直接用你双一流的英语水平就可以直接看懂了,if和else也同样不需要你提前引用任何的库
实验2 基本类型与运算
上一章我们简单了解了一些基本的语法知识,但是那个int到底是什么呢,我们将在这一章详细学习数据类型的相关知识 具体的可以看这篇文章的第一节 后面的数组之类的我们后续再了解
总而言之,在C语言里面主要的数据类型有这些(标识符就是你在scanf和printf里面的双引号内应该写的内容)
类型名称 | 标识符 |
---|---|
int | %d |
long long | %lld |
float | %f |
double | %lf |
char | %c |
除了数据类型,还有运算相关的知识,想来也就是加减乘除大于小于嘛,但是在计算机的世界里我们还有一种运算叫做取模,符号是%,具体作用就是求两个整数相除之后的余数。除此之外,不同数据类型的运算也会有所不同,具体的你也可以在上面的那个文章里面看到
1117 变量定义,按要求完成程序
看了上面的文章,想来你可以很轻松的填上这道题的两个空
int a,b;
float i,j;
6568 在显示屏上显示指定字符
在C语言中,有一些标识符,比如\n标识回车,那么假如我真的只是想单纯地输出\n这两个字符怎么办呢,我们发现打\总是不会出现,我们有一些特殊的语言规范
假如我想输出\,那么我就要打两个斜杠,这样就会避免标识符的冲突
如果你是CodeBlocks用户就需要在打代码的过程中小心一点,但如果是CLion的话,你的编辑器会自动帮你修正这个问题,当你把C:\ABC.TXT复制进去之后,你会发现他自动变成了两个斜杠,自己打的过程如果你忘打了斜杠他也会自动变色提醒你修改,就像这样
言归正传,这一题你只需要注意多打一个斜杠才能正确输出就行了
#include <stdio.h>
int main()
{
printf("C:\\ABC.TXT\n");
return 0;
}
1119 基本运算,写出程序运行结果
问这个代码的运行结果是什么,我们一句一句看
#include <stdio.h>
int main()
{
int a,b,c;
float d=15,e,f;
a=35%7;//a是35除以7的余数,也就是0
b=15/10;//虽然15/10确实是1.5,但是b是int类型,所以会自动舍去小数部分,所以b是1
c=b++;//这一行其实做了两件事,我们要从前往后看,先把b的值赋给c,然后b再自增1,所以c是1,b是2
e=15/10;//我们从后往前看,15和10都是整数,所以算出来的结果还是整数1,把整数1赋给e,所以e是1.0
f=d/10;//d是float类型,10是int类型,所以d/10是float类型,所以f是1.5
printf("%d %d %d %f %f %f\n",a,b,c,d,e,f);
}
那么答案也就昭然若揭了
0,2,1,15.000000,1.000000,1.500000\n
1118 赋值表达式与赋值语句,写出程序运行结果
这题和上一题类型一样 这题我们还引入了char类型也就是字符,英文的字符和中文不同,一共就那么多个,所以我们给每一个字符标上序号,在本地存储的时候才能将字符先变成对应的序号,然后再存下这个序号的二进制表示,这就是ASCII码
#include <stdio.h>
int main()
{
float a;
int b,c;
char d,e;
a=3.5;
b=a;//由float强行变成int,会丢失小数部分,所以b是3
c=330;
d=c;//我们看上面的ASCII码表,330比最后的那个126还要大,在126之后又从1开始,所以d是对应74的‘J’
e='\141';//141是八进制,对应的是十进制的97,对应的是ASCII码表的‘a’
printf("%f %d %d %c %c\n",a,b,c,d,e);
}
那么答案也就是
3.500000,3,330,J,a\n
实验3 基本输入与输出
这一章,我们终于开始细究好像我们每一个代码都用了的scanf和printf函数了
1126 字符的输入与输出
#include <stdio.h>
int main()
{
char c;
scanf("%c",&c);
printf("%c",c);
return 0;
}
1127 计算加法
#include <stdio.h>
int main()
{
int a,b;
scanf("%d+%d",&a,&b);
printf("%d",a+b);
return 0;
}
1014 求圆面积
虽然输入的时候没有小数点,但是我们一样可以直接把他存到浮点数类型的变量里面。
顺带一提,自己写代码的时候推荐使用double,虽然比float多打一个字母,但是在之后写一些复杂代码的时候出错的概率会小很多
#include <stdio.h>
int main()
{
double r,s;
scanf("%lf",&r);
s=3.14159*r*r;
printf("%.2f\n",s);
}
1015 计算摄氏温度值
这一题需要注意一下上一章最后一题我们提到过的数据类型的强制转换,如果你直接写9/5的话他们算出来会是1,因为小数位会被直接抹去,所以我们要写成9.0/5.0表示他们是浮点数,当然也可以像下面的代码这样直接拿原本的数字乘5再除以9,因为f是double类型所以一直不会出错
算式内的每一次计算中途如果只涉及到整数类型的数据,那么算出来的结果也仍然会是整数类型
#include <stdio.h>
int main()
{
double f,c;
scanf("%lf",&f);
c=5*(f-32)/9;
printf("%.2lf\n",c);
}
11127 各位数字
我们仔细思考一下,一个三位数的百位数字其实就是他整除100的结果,而各位数字则是他对10取模的结果,所以答案也就不难出来了
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
printf("%d\n%d",n/100,n%10);
return 0;
}
单元测试1 计算路程
#include <stdio.h>
int main()
{
double a,t;
scanf("%lf%lf",&a,&t);
double s=0.5*a*t*t;
printf("%.2lf\n",s);
}
单元测试2 圆柱体的表面积
#include <stdio.h>
int main()
{
double PI=3.14159;
double r,h;
scanf("%lf%lf",&r,&h);
double S=2*PI*r*r+2*PI*r*h;
printf("%.2lf\n",S);
}