408 计算机考研-001-C语言-C语言基础-考研必学
本文目录
- 408 计算机考研-001-C语言-C语言基础-考研必学
- 考研C语言应掌握的内容
- 考研真题
- 2022 年考研真题第 1 题
- 2022 年考研真题第 41 题
- 2021 年考研真题第 42 题
- 一、打印:Hello, World
- 二、数据类型
- 1. 基本数据类型
- 三、运算符
- 四、流程控制
- 五、函数
- 六、数组和指针
- 1. 数组
- 2. 指针
- 3. 动态内存分配
- 七、结构体和联合体
- 1.结构体
- 八、常用函数
- 总结
- 参考资料
考研C语言应掌握的内容
计算机408考纲内容:
能够运用数据结构基本原理和方法进行问题的分析与求解,具备采用 C 或 C++语言设计与实现算法的能力
大家可以先看下下面的几道真题,如果下面的题目你都能看到,那么你对于C语音在考研中需要的的基础知识应该也差不多了。如果你看不懂的话那么可以接着往下面看,所有的知识点都在代码里面。
从下面几道真题题目中我们可以知道需要掌握C语言的如下知识:
- 数据类型:了解C语言的基本数据类型(整型、浮点型、字符型等),以及如何声明和使用变量。
- 运算符:熟悉C语言的算术运算符、关系运算符、逻辑运算符等,以及它们的优先级和结合性。
- 控制流程:理解C语言的条件语句(if-else语句、switch语句)和循环语句(for循环、while循环),以及如何使用它们控制程序的执行流程。
- 函数:掌握如何定义、调用和传递参数给函数,以及如何使用函数来组织代码和实现模块化。
- 数组和指针:了解如何声明、初始化和操作数组,以及如何使用指针来访问数组元素和动态分配内存。
- 结构体和联合体:了解如何定义和使用结构体和联合体,以及它们如何用于组织和管理复杂的数据。
- C语言中的常用函数:熟悉如常见的字符串处理函数,如strlen、strcmp、strcpy等。
考研真题
2022 年考研真题第 1 题
2022 年考研真题第 41 题
2021 年考研真题第 42 题
// 42.已知某排序算法如下
void cmpCountSort(int a[], int b[], int n)
{
int i, j, *count;
// C++语言:count = new int[n];
count = (int*)malloc(sizeof(int) * n);
for(i = 0; i < n; i++) count[i] = 0;
for(i = 0; i < n - 1; i++)
for(j = i+1; j<n; j++)
if(a[i] < a[j]) count[j]++;
else count[j]++;
for(i = 0; i < n; i++) b[count[i]] = a[i];
// C++语言:delete count;
free(count);
}
一、打印:Hello, World
首先先来看看最经典的C的Hello,World程序吧。
/**
* include是包含的意思,这句话的意思就是把 stdio.h 的这个文件包含进来
* 专业解释:#include 这行代码是一条C预处理器指令
* #include <stdio.h>:这句话代码就是把C语音中的 标准输入输出(stdio.h)库 引入进来
* stdio.h: 这个文件里面包含了标准一些标准输入输出相关的函数, 如下面用到的 printf() 这个输出函数。还有如scanf() 输出函数
* 引入库的标准格式: #include <函数库的名称>
* 这属于C语言语法要求的格式,不用纠结为何这样写,记下来就好了
*/
#include <stdio.h>
/**
* 这行表示函数名为main的函数
* int: 表示函数值的反类型
* main: 表示函数的名称,也可以叫 其他的名称, 如 abc() 等
* 但是main这个名称有些特殊,它在C语音中表示的是开始的函数。
* 意思是这个程序编译好后,如果要执行的话就会去找文件中找到名字叫main的函数。就像游戏中的开始按钮一样,如果游戏没有开始按钮就玩不了了。
*/
int main()
// 这个左花括号 { 的意思表示函数定义的开始,代表着这个里面的东西属于一个整体
// 程序中的注释的表示方法: 1. 行注释 // <注释的内容> 2. 块注释 /* <注释的内容> */
{
/**
* 这行的意思是调用标准输入输出库(stdio.h)中的printf()函数,把 双引号中的 Hello, Wordl 输出到控制台中
*/
printf("Hello, World");
/**
* main函数可以给使用者返回一个数。目前,可暂时把该行看作是结束main()函数的要求。
*/
return 0;
// 这个右花括号 } 的意思表示的函数定义的结束
}
二、数据类型
1. 基本数据类型
/**
* C语言数据类型
*/
#include <stdio.h>
#include <limits.h>
int main() {
/**
* char : 字符数据类型, 对应的值需要使用单引号扩起来。
* 取值范围:-128 到 127 (对应于ASCII码)
* ASCII码中 '0' = 48; 'A' = 65; 'a' = 97;
*/
char singleSymbol = 'A';
printf("打印char据类型中的字符:%c \n", singleSymbol);
printf("打印char据类型中的字符对应的ASCII码:%d \n", singleSymbol);
/**
* CHAR_MAX : 是从 <limits.h> 这个库中引入进来的。
* 表示CHAR的最大取值范围,其中还有CHAR_MIN(char类型最小值), INT_MAX(int类型最大值)等
*/
printf("打印char字符最大值 %d \n", CHAR_MAX);
/**
* unsigned char : 无符号字符数据类型
* 数据取值范围:0 到 255;
* unsigned 也可以加到其他数类型的前面,待表对应的无符号数据类型
* 如;unsigned int 、 unsigned long
*/
unsigned char unsignedSingleSymbol = 'A';
/**
* 整型数据类型
* 一般都用的int类型就够了
*/
short shortIntegral = 10; // 短整型
int integral = 10000; // 整型
long longIntegral = 10000000L; // 长整型
/**
* 浮点数据类型,可以表示小数。常用double类型
*/
float floatNum = 1.1; // 单精度浮点型
double pi = 3.1415962; // 双精度浮点型
return 0;
}
三、运算符
/**
* C语音中的运算符
*/
#include <stdio.h>
int main() {
/**
* 赋值运算符: =
* 把等号右边的值赋值给左边
*/
int a = 10; // 把10赋值给变量a
int b = 20;
int c = 4;
int d;
/**
* 算数运算符
* 加、减、乘、除、取模、自增、自减
* +、 -、 *、 \、 %、 ++、 --
*/
d = a + b; // 加法运算符 = 30
printf("a + b = %d\n", d);
d = a - b; // 减法运算符 = -10
printf("a - b = %d\n", d);
d = a * c; // 乘法运算符 = 40
printf("a * b = %d\n", d);
// 整数除法和浮点数除法不同。浮点数除法的结果是浮点数,而整数除法的结果是整数。整数是没有小数部分的数。
d = a / c; // 除法运算符 = 2 ,
printf("a * b = %d\n", d);
d = a % c; // 取模运算符 = 2;
printf("a * b = %d\n", d);
c++; // 自增运算符 = 5
printf("a * b = %d\n", c);
c--; // 自减运算符 = 4
printf("a * b = %d\n", c);
/**
* 关系运算符: 主要用来作为条件判断使用。
* == (等于)、!= (不等于)、> (大于)、>= (大于等于)、< (小于)、<= (小于等于)
*/
if ( a < b) { // 判断 a 和 b 的大小
printf("a 小于 b \n"); // 此句将会打印
} else {
printf("a 不小于 b \n");
}
/**
* 逻辑运算符
* && (逻辑与)、 || (逻辑或)、! (逻辑非)
*/
if ( a && b) {
printf("a && b 条件为真 \n");
}
}
四、流程控制
/**
* 流程控制
*/
#include <stdio.h>
int main () {
/**
* 判断语句
*/
int age = 18; // 年龄
// if语句
if (age >= 18) { // 判断年龄是否大于等于18岁
printf("已满18岁,可以上网 \n");
}
// if else 格式
age = 17;
if (age >= 18) { // 判断年龄是否大于等于18岁
printf("已满18岁,可以上网 \n");
} else {
printf("未满18岁,不可以上网 \n");
}
/**
* 也可以简写为下面这样,意思同上
* 注意:如果没有花括号的话只能跟携带一条语句
*/
if (age >= 18)
printf("已满18岁,可以上网 \n");
else
printf("未满18岁,不可以上网 \n");
// 多重选择 switch 语句
char score = 'A'; // 成绩
switch (score) {
case 'A': // 如果成绩为A这进入到里面,并打印其中的语句
printf("您的考试成绩为A \n");
// 结束语句
break;
case 'B':
printf("您的考试成绩为B \n");
// 结束语句
break;
// 如果上面都没有匹配的,则执行到这里
default:
printf("您的成绩为C");
}
/**
* 循环语句
*/
// while 循环
int count = 1; // 计数器
while (count <= 10) { // 打印 1 - 10
printf("%4d", count);
count++; // 计算器自增
}
printf("\n");
// for 循环
for (int i = 1; i <= 10; ++i) {
printf("%4d", i);
}
printf("\n");
}
五、函数
/**
* C语言函数
* 函数(function)是完成特定任务的独立程序代码单元。
*/
#include <stdio.h>
/* 函数声明 */
int max(int num1, int num2);
int main() {
/* 局部变量定义 */
int a = 100;
int b = 200;
int result;
/* 调用函数来获取最大值 */
result = max(a, b);
printf( "最大值是 : %d\n", result );
return 0;
}
/* 函数返回两个数中较大的那个数 */
int max(int num1, int num2) {
/* 局部变量声明 */
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
六、数组和指针
1. 数组
/**
* C语言数组
*/
#include <stdio.h>
int main() {
/**
* 声明数组
*/
int candy[10]; // 糖果数组
double scores[52]; // 成绩数组
/**
* 数组的初始化
*/
int candyA[3] = {1, 2, 3};
candy[0] = 1;
/**
* 访问数组
*/
printf("candy数组中的第一个值:%d", candyA[0]);
return 0;
}
2. 指针
- C语言中的指针是一种特殊的数据类型,它用来存储变量的地址。指针变量表示的是一个内存地址,可以用来访问和修改该地址处的数据。
- 指针的声明形式为:数据类型 * 指针变量名;例如:int * p; 表示声明了一个指向整型数据的指针变量p。
- 使用指针变量时,可以通过解引用操作符*来访问该指针所指向的内存地址处的数据。例如:*p 表示访问指针p所指向的整型数据。
- 指针的主要作用是在函数间传递参数和动态分配内存。通过传递指针参数,可以在函数中修改实际参数的值。通过动态分配内存,可以在程序运行时动态申请和释放内存空间,实现灵活的内存管理。
- 使用指针时需要注意一些细节问题,如指针的初始化、指针的比较、指针的运算等。同时,在使用指针时还要注意避免空指针和野指针的出现,以免引起程序崩溃或数据错误的问题。
/**
* C语言指针
*/
#include <stdio.h>
int main() {
/** 指针的声明 */
int * ptr; // 声明一个指向整型数据的指针
char * str; // 声明一个指向字符型数据的指针
/** 指针的赋值 */
int num = 10;
ptr = # // 将指针ptr指向变量num的地址
/** 通过指针访问和修改数据 */
printf("%d\n", *ptr); // 打印出变量num的值
*ptr = 20; // 修改变量num的值
printf("%d\n", num); // 打印出修改后的变量num的值
/** 指针的运算 */
int arr[5] = {1, 2, 3, 4, 5};
int * arrPtr = arr; // 指针指向数组arr的第一个元素
printf("%d\n", *arrPtr); // 打印第一个元素的值
arrPtr++; // 指针右移一个元素
printf("%d\n", *arrPtr); // 打印第二个元素的值
return 0;
}
3. 动态内存分配
- C语言通过使用指针来管理内存,手动分配和释放内存。
- C语言中有两种主要的内存分配方式:静态分配和动态分配。
- 静态分配是在程序编译时进行的,在程序运行时分配固定大小的内存。静态分配的内存是通过声明变量和数组来完成的。例如,当你声明一个整型变量时,编译器会为它分配必要的内存。
- 动态分配是在程序运行时进行的,在程序运行时根据需要分配内存。动态分配的内存是通过C标准库函数malloc()和calloc()来完成的。
- 内存分配函相关数
- malloc():动态分配指定大小的内存块,并返回一个指向分配内存的指针。如果分配失败,则返回NULL。
- calloc():动态分配指定数量和大小的内存块,并返回一个指向分配内存的指针。calloc()函数在分配内存块之前会将其初始化为0。如果分配失败,则返回NULL。
- realloc():重新分配之前分配的内存大小,可以调整内存的大小。如果分配失败,则返回NULL。
- free(): 将先前分配的内存块返回给系统。
/**
* C语言动态内存分配
*/
#include <stdio.h>
#include <malloc.h>
int main() {
/**
* 分配一个包含10个整数的数组,可以使用以下代码
* 在这个例子中,`malloc`函数分配了`sizeof(int) * 10`字节的内存空间,并将指针赋值给了`arr`变量。
* 注意,我们在类型转换前面加上了`(int*)`,这是因为`malloc`的返回类型是`void*`,需要将其转换为我们所需的指针类型。
* 在分配完内存后,可以使用`arr`指针来访问这些内存。
*/
int* arr = (int*) malloc(sizeof(int) * 10);
// 使用`malloc`函数分配内存后,我们需要负责手动释放这些内存空间。否则,这些内存将一直占用直到程序结束。
free(arr);
return 0;
}
七、结构体和联合体
1.结构体
结构体是一种用户定义的数据类型,可以用来存储多个不同类型的数据项。结构体可以包含多个成员,每个成员可以是任意数据类型,包括基本类型(如整数和浮点数)和其他结构体类型。
// 结构体的定义
struct 结构体名 {
数据类型 成员1;
数据类型 成员2;
...
数据类型 成员n;
};
/**
* C语言结构体
*/
#include <stdio.h>
#include <string.h>
// 定义一个表示学生信息的结构体,包含姓名、年龄和分数三个成员
struct student {
char name[20];
int age;
float score;
};
int main() {
// 声明结构体变量
struct student s;
// 给结构体中的成员赋值
strcpy(s.name, "Tom");
s.age = 18;
s.score = 90.5;
// 直接访问结构体中的成员
printf("Name: %s\n", s.name);
printf("Age: %d\n", s.age);
printf("Score: %.2f\n", s.score);
// 通过指针访问结构体的成员
struct student *p = &s;
printf("Name: %s\n", p->name);
printf("Age: %d\n", p->age);
printf("Score: %.2f\n", p->score);
return 0;
}
八、常用函数
- printf():用于打印输出。
- scanf():用于输入数据。
- strcmp():用于比较两个字符串是否相等。
- strlen():用于获取字符串的长度。
- strcpy():用于将一个字符串复制到另一个字符串。
- strcat():用于将一个字符串连接到另一个字符串的末尾。
- atoi():用于将字符串转换为整数。
- atof():用于将字符串转换为浮点数。
- rand():用于生成随机数。
- malloc():用于动态分配内存。
- free():用于释放动态分配的内存。
总结
看到这里大家应该也能够对于C语言有个基本的了解了吧,对于考研中的408C语言中的知识差不多也就是上面那些了。
了解了C语言的基本知识之后就可以开始学习数据结构了。
如果大家还是不懂的话可以直接去看B站上面老师们的视频,或者看看下面的参考资料。
参考资料
- 《C Primer Plus》第六版
- 计算机 408 历年考研真题
- 计算机 408 考研大纲
- ChatGPT
- 牛客网C语言入门教程