进行一个C语言的入门?

本文最后更新于:2023年10月23日 晚上

进行一个C语言的入门?

$\mathcal{Author:CoolWind\quad Group:while(1)\quad Date:2023.8.26}$

0x00 一个c语言程序分为几个部分?

0、分号

分号作为c语言中每个语句的结束符号,在语句结束的时候需要加入,但是在预处理、以及条件语句后面不需要加入。

1、预处理部分

这一部分包括所要加载的头文件,使用#include <stdio.h>的指令进行加载。

头文件 功能
<stdio.h> 输入输出函数,如 printfscanf 等。
<stdlib.h> 内存管理、类型转换、随机数生成等。
<string.h> 字符串操作函数,如 strcpystrcatstrlen 等。
<math.h> 数学函数,如数学运算、三角函数、对数函数等。
<ctype.h> 字符处理函数,如字符分类、大小写转换等。

包括你要定义的宏,例如#define TRUE 1

此部分不需要加;

2、主函数与定义函数

所谓主函数就是程序的主要运行部分,在c标准中定义主函数的形式为int main(int argc, char *argv[]),在初学的时候,只需要写成int main()即可,是否加void根据个人喜好来定。

注意,因为主函数是一个返回int类型的函数,因此在主函数结束的最后要进行return 0,如果你在本地没有return 0大概率可以运行,但是上传到OJ之后可能会报错。

所谓定义函数就是你自己可以DIY的函数,完成你自己想完成的功能。

3、变量

变量类型 描述和特点
int 整数类型,通常用来表示整数值。
short 短整数类型,占用较少内存。
long 长整数类型,用于表示较大的整数值。
long long 更长的整数类型,表示更大范围的整数。
char 字符类型,用于表示单个字符。
float 单精度浮点数类型。
double 双精度浮点数类型,提供更高精度。
unsigned int 无符号整数类型,仅包含非负整数。
unsigned char 无符号字符类型。
unsigned short 无符号短整数类型。
unsigned long 无符号长整数类型。
unsigned long long 无符号更长的整数类型。

在c语言中使用变量之前需要进行一个变量的定义,并且在此时可以使用=进行变量的初始化。

同时,每种数据类型都有自己对应的范围:

数据类型 范围
char -128 到 127 或 0 到 255(取决于有无符号修饰)
unsigned char 0 到 255
short -32,768 到 32,767
unsigned short 0 到 65,535
int -2,147,483,648 到 2,147,483,647
unsigned int 0 到 4,294,967,295
long -2,147,483,648 到 2,147,483,647
unsigned long 0 到 4,294,967,295
long long -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long long 0 到 18,446,744,073,709,551,615
float 大约 1.2E-38 到 3.4E+38
double 大约 2.3E-308 到 1.7E+308
long double 大约 3.4E-4932 到 1.1E+4932

因此,使用数据类型或者选择算法的时候要注意自己的数据范围,不要超过数据范围导致WA

同时,变量分为全局变量局部变量全局变量顾名思义可以在整个c语言文件中随时随地进行调用,而局部变量只能在其所在的代码块以及该代码块所包含的代码块中进行使用。

如在不同位置有同名变量,那么在代码块中优先使用该代码块中的同名变量,再依次向外使用。

4、库函数

在头文件中包含的、可以直接调用的函数都可以称之为库函数。

例如printf,scanf这样的函数都是库函数,需要自己去积累或者去查询。

5、运算符

运算符 描述和用途
+ 加法运算符,用于将两个数相加。
- 减法运算符,用于将一个数减去另一个数。
* 乘法运算符,用于将两个数相乘。
/ 除法运算符,用于将一个数除以另一个数。
% 取模运算符,返回除法的余数。
++ 自增运算符,将操作数的值加一。
-- 自减运算符,将操作数的值减一。
= 赋值运算符,用于将右边的值赋给左边的变量。
+= 加法赋值运算符,相当于 a = a + b
-= 减法赋值运算符,相当于 a = a - b
*= 乘法赋值运算符,相当于 a = a * b
/= 除法赋值运算符,相当于 a = a / b
%= 取模赋值运算符,相当于 a = a % b
== 相等运算符,检查两个操作数是否相等。
!= 不等运算符,检查两个操作数是否不相等。
> 大于运算符,检查左边的操作数是否大于右边的操作数。
< 小于运算符,检查左边的操作数是否小于右边的操作数。
>= 大于等于运算符,检查左边的操作数是否大于等于右边的操作数。
<= 小于等于运算符,检查左边的操作数是否小于等于右边的操作数。
&& 逻辑与运算符,用于逻辑与操作。
! 逻辑非运算符,取反操作数的逻辑值。
& 按位与运算符,对操作数的每个位执行逻辑与操作。
^ 按位异或运算符,对操作数的每个位执行逻辑异或操作。
~ 按位取反运算符,反转操作数的每个位。
<< 左移运算符,将操作数的二进制位左移指定的位数。
>> 右移运算符,将操作数的二进制位右移指定的位数。
&= 按位与赋值运算符,相当于 a = a & b
^= 按位异或赋值运算符,相当于 a = a ^ b
<<= 左移赋值运算符,相当于 a = a << b
>>= 右移赋值运算符,相当于 a = a >> b

6、条件语句

控制语句 描述和用途
if 语句 根据条件的真假来执行不同的代码块。
switch 语句 基于表达式的值,在多个固定值分支中选择执行代码块。
while 循环 当条件为真时重复执行代码块。
do-while 循环 先执行一次代码块,然后在条件为真时重复执行。
for 循环 初始化、条件判断和迭代步骤的循环。
break 语句 在循环或 switch 语句中立即退出。
continue 语句 跳过当前迭代步骤,继续下一次迭代。
goto 语句 无条件跳转到指定的标签位置。

其中,if,else if,else,while语句后如果不加{}的代码块,那么只能执行该语句之后的一行语句。

0x01 转义字符是什么

2022-C1-A

题目描述

今年是北航70周年校庆,让我们祝北航生日快乐!。 要求用三行输出三个句子。分别是:

Hello, BUAA!

This year is your 70th birthday!

Happy birthday!

本题中主要考察大家对printf函数的使用。

printf函数需要现在第一个参数的位置加上你想要打印的字符(包括你想要打印的字符以及想要打印的变量的格式控制符,如%d,%lld,%lf等)。

在第二个参数位置需要按照顺序填写上你想要打印的变量的名称

控制字符对应表:

格式控制字符 描述 对应的数据类型
%d 有符号十进制整数 int
%ld 有符号长整数 long
%u 无符号十进制整数 unsigned int
%lu 无符号长整数 unsigned long
%f 浮点数 float
%lf 双精度浮点数 double
%c 字符 char
%s 字符串 char *
%p 指针 (任意指针类型)
%x 无符号十六进制整数(小写字母) unsigned int
%X 无符号十六进制整数(大写字母) unsigned int
%% 百分号字符

转义字符表:

\' 用于表示字符常量'
\" 用于表示一个字符产内部的双引号"
\n 用于表示换行
\r 回车
\t 水平制表符(Tab)

题解代码:

1
2
3
4
5
6
#include <stdio.h>
int main()
{
printf("Hello, BUAA!\nThis year is your 70th birthday!\nHappy birthday!");
return 0;
}

0x02 这啥啊?咋输入啊?

2022-C1-B

题目描述

式部茉优需要计算学生们的星幽能力值经过增强化后的数值。 现有原能力值 $X_0$ 和加值 $\Delta$,需要你计算出增强后的数值 $X_1$,满足 $X_1=X_0+\Delta$。

输入格式

输入共一行,两个数。第一个数为 $X_0$,第二个数为 $\Delta$。含义如上述描述。

输出格式

输出共一行,一个数。为计算得出的 $X_1$ 数值。

本题主要考察的是scanf函数的使用。

注意对于变量来说,在进行scanf的时候要在变量前面加上取址符&,而对于数组来说不需要。

题解代码:

1
2
3
4
5
6
7
8
#include <stdio.h>
int main()
{
int a=0,b=0;
scanf("%d%d",&a,&b);
printf("%d",a+b);
return 0;
}

0x03 AI就是n个if函数?

2022-C1-D

曾经有人说if-else是ai的基础,中间忘了,后面忘了。

题目描述

青豆正在投球。现在已知青豆投出球的距离,请你帮他算算能否正好投入球框内?

已知青豆和球框相距53米,如果他投出球的距离小于53米;则输出 Too close! ,如果正好投出了53米,则输出 Bingo! ;如果投出的距离大于53米,则输出 Too far!

输入

一个整数 a,代表青豆投出球的距离。

输出

一行一个字符串。

考察if-else if-else函数的使用。

if后面加上所要判断的判断语句,如果这个语句为真,那么就要进行if后函数块内的内容,为假则不执行,向下进行。

题解代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main()
{
int a;
scanf("%d",&a);
if(a<53)
{
printf("Too close!");
}
else if(a==53)
{
printf("Bingo!");
}
else
{
printf("Too far!");
}
return 0;
}

0x04 嗯?这个循环怎么跳不出?

2022-C1-E

题目描述

小羊学姐很开兴又有新生来到校园学习啦!兴奋之下,她报名了帮助新生学弟学妹们搬书的志愿活动(大家都知道开学的新教材真的很多啊)。志愿工作当天,有好多书需要搬,书籍被分成了一堆一堆的,每个书堆分别有 a1 , a2 , a3 ,…, an ,… 本书,小羊学姐每一次需要搬一个书堆(有且仅一个)的书到目的地去。由于书籍堆数太多,所以一眼看不出来一共有多少堆,小羊学姐想请你帮忙求出:对于今天的搬书工作,一共有多少本书籍?一共有多少个书堆?她平均每次搬了多少本?(本题的测试数据给得比较简单,题中直接用 int定义变量就可以了)

输入

一共有若干行输入,每行输入一个 int 型的正整数,当输入 0 时表明输入结束,且 0不计入书籍堆数

输出

一共有一行输出,三个 int 型的正整数,从左往右依次为:书籍总数,书堆总数,平均每次搬运的书籍个数(每两个正整数之间一个空格)

while循环结构是一个很好的东西,这样就省去了你写重复代码的时间,并且看起来不像shit mountain

但是注意循环跳出条件,不然就会发生本节标题的情况。

while语句后的括号中需要填写的是控制语句,例如while(n<6)就是在变量n小于6的时候执行语句控制下的代码块。

do-while语句是先执行一次do后代码块内的内容之后,如果满足while后的控制条件,那么再次执行该代码块的内容,直到不满足条件。

题解代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main()
{
int book=0,num=0,sum=0;
scanf("%d",&book);
while(book!=0)
{
num++;
sum+=book;
scanf("%d",&book);
}
printf("%d %d %d",sum,num,sum/num);
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
int main()
{
int book=0,num=0,sum=0;
do
{
scanf("%d",&book);
num++;
sum+=book;
}while(book!=0);
num--;
printf("%d %d %d",sum,num,sum/num);
return 0;
}

0x05 这循环怎么比上一个简洁

2022-C1-G

题目描述

给定一个数字 n(4≤n≤10000 ,用 “∗” 打印形状为如样例所示的六边形 。

输入

一行,一个数字 n 。

输出

第一行,n−2 个 ∗ 。

第二行,n 个 ∗ 。

第三行,n−2 个 ∗ 。

形状为如样例所示的六边形.

for循环主要用来简化循环的书写形式,其组成为for(s1;s2;s3)

除此之外for循环可以与while循环互相转化,for循环可以有如下等价形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
for(int i=0;i<10;i++)
{
...
}

等价于

while(i<10)
{
int i=0;
...
i++;
}
只是可以大致看成这种情况,因为i在出了for循环之后就无法使用了,但是这种情况在实际写码过程中不存在,因为没有提前定义i。
此外,在使用for循环中定义变量的时候,需要c99及以上的编译器。

题解代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
printf(" ");
for(int i=0;i<n-2;i++)
printf("*");
printf("\n");
for(int i=0;i<n;i++)
printf("*");
printf("\n");
printf(" ");
for(int i=0;i<n-2;i++)
printf("*");
return 0;
}

进行一个C语言的入门?
http://cool-wind.top/2023/08/26/进行一个C语言的入门?/
作者
CoolWind
发布于
2023年8月26日
许可协议