1. 前言
本章节只对本人不熟悉或者认为属于考试内容属于重点的进行收录
2. C语言概述
2.3 (38页)程序分析题-错误型
留意错误写法,2022年新增程序分析题
2.6 (40页)
思想很重要,2022年真题出现过
3. 数据类型的输入与输出
3.2 (55页)
注意附加格式符,左右对齐,默认右对齐
3.3 (59页)
注意浮点数的输出、%e和%g的区别
3.4 (60页)
注意浮点数输入的格式符:附加格式符*和.
3.8、3.9 (65页)程序分析题-错误型
注意输入时带来的回车键问题
3.10(67页)
注意积累多行字符的输入技巧、EOF的含义、计数器思想
3.11(68页)
注意积累66页的字母大小写转换、数字字符转化整数等技巧
3.12(70页)
数组调试程序时可以使用define N 数字
用来定义数组的长度,注意数组的长度不能使用变量,为数组元素赋值时记得加&
取地址符
3.14、3.15(75页)
1.注意字符串输入时,只需要写数组名即可,不用加取地址符
2.使用scanf(%s)
这种方式输入时,不能输入空格,空会被当做结束输入,想要输入空格,例如格式为:Li Lei等,可以使用gets_s函数输入
3.18(80页)
1.掌握文件的打开、关闭函数fopen、fclose
2.掌握向文件写入内容的fprintf函数、以及fscanf函数等
3.了解exit函数,在头文件,stdlib.h文件中
#include<stdio.h>
#include<stdlib.h>
int main() {
FILE* infile, * outfile;
infile = fopen("D:\\user.txt", "r");
outfile = fopen("D:\\stu.txt", "w");
char stuid[30], name[20];
float score;
if (outfile == NULL)
{
printf("不能创建文件");
exit(0);
}
fprintf(outfile, "学号\t姓名\t入学成绩\n");
for (int i = 0; i < 2; i++)
{
printf("请输入学生学号、姓名和入学成绩(空格分开):");
scanf("%s %s %f", stuid, name, &score);
fprintf(outfile, "%s\t%s\t%f\n", stuid, name, score);
}
fclose(outfile);
return 0;
}
4. 运算符与表达式
4.1 (96页)
注意自增自减的优先级问题
int a = 1, b = 0;
b = ++a+a---a; //2
b = a+++a---a; //1
b = a+++a;//2
注意位运算符,不曾考过(有可能今年出)
printf("%d",1 | 2); // 3
printf("%d",1 & 2); // 0
注意括号表达式的问题
5. 分支结构(此部分很容易出表达式的考点)
5.1 (116页)
三角形的判断条件曾经作为真题表达式出现过
5.2 (117页)
打折问题,掌握相应的计算
5.3(118页)
掌握sqrt函数:
C语言中sqrt函数是指的开方运算函数,得到的结果是函数变量(可以是数值,也可以是变量名)的算术平方根。
5.5 (122页)
奇数偶数的判断条件贯穿很多的题型,基本考试都会出现,编程中也较为常用
5.6 (122页)
椭圆的条件曾经作为表达式真题出现过!
5.7 (123页)
写表达式真题出现过
5.8 (123页)
逻辑表达式的算术运算方式每年必出!!!
5.9 (124页)
等级分类的判断也曾作为真题出现过,当年是研究生评优评先
5.11(126页)
该问法也作为真题出现过
6. 循环结构
6.1 (137页)
技巧总结:
一个数%10可以获得它的个位、/10则可以去掉它的个位
6.2(138页)
牛顿迭代法
视频讲解
6.3 (141页 真题出现过!)
积累sqrt的使用,以及穷举的思想,当年出过填空题没做出来
6.8 - 6.10 (146-147页 真题出现过)
注意一些复杂图形的打印,找规律!例如运用字母相减的特性
6.11 (148页)
最大公约数、最小公倍数问题不是很会,积累!!
6.12 (150页)
对于字符串中空格的处理问题需要积累,可以引进标志变量flag通过赋值1/0来判断
6.14 (153页)
枚举的思想广泛应用,真题中也有涉及
排列组合问题、水仙花、完数、因子分解问题
6.16 (155页)真题考察过
完数问题
6.18 (158页)牛顿迭代法
需要记忆牛顿迭代公式,迭代法的关键在于找出迭代公式,此题要注意几个点,首先迭代公式中有一个初值,他是迭代的首项,这个值会影响程序迭代的次数,一般来说和结果越接近,迭代的次数越少,例如:根号2,假设初值为1.5,程序会迭代4次,初值为1,程序会迭代5次。其次就是精度问题,一般来说就是来衡量根要多接近于一个区间,例如:0.000001
6.19、6.20 (160页)递推问题
斐波那契、杨辉三角
3个关键点:
1.寻找递推关系
2.递推关系必须要有始基
3.递推计算
6.22(162页)寻根
可以积累分类打印的技巧
6.23、6.24(164页)排序算法
掌握冒泡和选择
6.25 (166页)去重
有时候可以利用数组的一些特性达到去重
6.26 (167页)涉及一些文件的操作
数组可以有统计的作用
6.27(167页)逻辑推理,预测今年考表达式
7. 函数与结构化程序设计
7.1 (181页)排列组合问题
了解公示和解法
7.8 (199页)随机数
1.了解rand函数,知道怎么控制随机数的范围
2.了解srand函数设定种子值
7.9 (202页)阶乘问题-真题出现过(递归)
熟记过程和代码
7.10 (205页)Fibonachi数列
掌握递归算法求解,遇到分段函数问题都可以考虑用递归
7.11(205页)求一维数组中的最大、最小值问题
掌握递归算法求解!!解题能够提升快速,避免使用排序算法
7.12 (210页)日历打印
本题主要综合了对时间处理的各个模块的知识,需要了解怎么判断平闰年,怎么知道该年该月改日对应该月的星期几(转换公式%7),需要掌握结构化编程的思想,了解头文件的概念和作用及自定义头文件封装的方法
7.14 (215页)计算器案例
掌握自顶向下、逐步求精的过程
220页注意宏的一些计算规则
8. 指针与数组
8.1 (242页)指针赋值、优先级(真题出现过)
注意变量地址赋值给指针变量时的写法,真题考察过
&和*优先级相同,但是会按自右向左的方向进行结合
注意:&*a是非法的
8.2、8.3 (243页)指针的地址
指针赋值时有时候要注意类型强制转换,预防类型不匹配的错误
补充245页-246页(指针的运算)必考
1.指针的加减操作是使指针指向当前指针所指向存储单元的之后第n个、之前的第n个存储单元
2.指针的加减运算特别适合对数组所有元素进行逐个扫描的操作
3.注意指针一种错误写法(p+2)++
4.说明功能类型的题目22年出现了,注意训练
8.4 (248页)数组的排序
有时可以采用逆向位思维,从后往前扫描
8.5 (249页)字符串提取整数
积累提取连续数字字符的技巧
8.6 (249页 后期补充)固定格式文本文件读取
后期补充
8.8 (254页)利用二维数组打印杨辉三角
先赋值、根据行和列的关系,再输出
8.9 (256页)销售额统计
利用二维数组掌握报表的思想,利用报表完成数据的统计,类似Excel
8.10(258页)二维数组的元素指针
可以通过比较二维数组元素指针的大小来进行扫描
补充:262页-264页:字符串函数(真题必考)
- 求字符串长度:strlen(字符指针):不包含’\0’
- 字符串连接:strcat(字符数组1,字符串常量或字符数组2);返回值是字符数组1的地址,必须确保字符数组1的大小足够大
- 字符串复制:strcpy(字符数组1,字符串常量或字符数组2)
- strncpy:可以指定字符串中的若干个字符指定复制到字符数组1中去。例如:
strncpy(str1,"sunday",3)
,不会添加结束符 - 字符串比较:strcmp(字符串常量或字符数组1,2),注意返回值正负数问题,比的是ASCII码
8.13 (264页)字符串排序
出现字母、数字等类型时,有时可以考虑strcmp结合strcpy的排序功能进行进一步处理
8.14 (266页)错误型题目(真题,预测今年出)
注意指针重置起点的问题
8.15 (268页)真题出现过
注意变量的指针作为函数的实参,要传的是地址,注意加取地址符
补充268-270(预测今年找错误会出现)
8.16 (270页)数组的合并
利用3个数组
8.17 (271页)字符串匹配入门
strcmp函数的实现
8.18(272页)字符串匹配(模式匹配)重要
掌握比较的方法
视频讲解
#include <stdio.h>
#include<string.h>
int match(char *s,char *t,int start,int s_length,int t_length) {
int i = 0, j = 0, k = 0;
while (i < s_length && j < t_length)
{
if (s[i] == t[j])
{
i++; j++;
}
else
{
i = ++k;
j = 0;
}
}
if (j != t_length)
return -1;
return k + 1;
}
int main(){
int res;
if ((res=match("abcd","bc",0,4,2)) != -1)
{
printf("匹配成功!位置为:%d", res);
}
else
{
printf("匹配失败!找不到该子串!");
}
return 0;
}
拓展:
c标准库提供了一个字符串匹配函数strstr(char *str,char * substr)
,该函数返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回null
8.19 (273页)真题出现过
注意积累加权平均的计算方法
8.20(276页)返回指针的函数
要预防返回指针时,内存释放的问题
8.21 (277页)在字符串中找某一字符
积累strchr函数的使用以及实现过程
8.22 (279页)字符串数组排序
了解排序的方法
8.23 (281页)后期补充
8.24 (282页)与8.22同理
利用行指针数组进行排序
关注一下287-288页
有可能从这里出一些考题
9. C程序运行原理
9.3 全局变量
建议不在必要时不使用全局变量,了解全局变量的作用范围
9.4 静态变量(真题常考考点)
掌握static修饰变量的特点及运算规则
9.5 进制转换(真题出现过该考点)
注意积累
9.6 年份月份
掌握两种方式:switch、静态数组
静态数组要多预留一位,与数组下标匹配
10. 复杂问题的求解算法(后期优化补充)
10.1 折半查找
掌握其思想及熟记代码,注意边界取值问题
11. 结构体、联合共用体与枚举类型
11.1 结构体的使用
掌握结构体的定义及初始化、调用(点名法)
11.2 结构体数组
掌握结构体数组的定义及初始化
11.3 结构体指针
了解atoi、atof函数,原型放至头文件stdlib.h中
11.4 函数的结构体类型参数
通过年月日案例掌握结构体作为参数的使用
11.5 结构体指针作为参数
和普通变量一样,传的是地址
11.6 典型案例(结构体类型的函数)
求下周的今天是什么日期?
掌握解题思路
11.8 联合共用体
掌握联合共用体的定义及使用,掌握共用体的内存存储规则!
视频解析
11.9 教学管理案例
看懂、了解即可,能积累就积累
12. 文件
12.1 输入字符串输入到磁盘文件中
1.打开文件的基本格式代码:
FILE* fp;
char ch;
if ((fp=fopen("D:\\b.txt","w"))==NULL)
{
printf("无法创建文件!\n");
exit(0);
}
fclose(fp);
2.输出一行字符串到文件中:fputc/putc方式(字符,指针)
while ((ch=getchar())!= '\n')
fputc(ch, fp);
3.文件操作方式,如写w,从读取那一刻开始便会清空文件内容
12.2 从键盘逐个读入字符
1.fegtc(File *fp)
方式,函数返回文件结束符EOF
while ((ch = fgetc(fp)) != EOF)
putchar(ch);
2.从磁盘中读入字符,并非每次都从磁盘读取,而是每访问一次将一批字符送入输入缓冲区,当缓冲区全部读完才会再访问一次磁盘
12.3 向文件中写入多行字符串
1.fputs函数:fputs(char *string,FILE *stream)
字符串\0
不会输出
while (gets_s(ch) != NULL) {
fputs(ch, fp);
fputc('\n', fp);
}
2.ctrl+z作为结束符,等于NULL
12.4 读取文本文件中所有内容
1.函数:fgets(char *string,int n,FILE *stream)
while (fgets(ch,81,fp) != NULL) {
printf("%s", ch);
}
2.fgets函数会在最后添加’\0’
12.5 数据块方式写入文件
函数:fwrite(数据地址、数据块大小、要写多少个、文件指针)
案例:建立学生入学档案文件
#include <stdio.h>
#include<stdlib.h>
struct student {
char name[10];
char sex;
int age;
float score;
};
int main()
{
FILE* fp;
char str[81], ch = 'y';
struct student stud;
if ((fp=fopen("D:\\b.txt","w"))==NULL)
{
printf("无法创建文件!\n");
exit(0);
}
while (ch == 'y' || ch=='Y')
{
printf("请输入姓名:");
gets_s(stud.name);
printf("请输入性别:");
gets_s(str); stud.sex = str[0];
printf("请输入年龄:");
gets_s(str); stud.age = atoi(str);
printf("请输入分数:");
gets_s(str); stud.score = atof(str);
fwrite(&stud, sizeof(stud), 1, fp);
do
{
printf("继续输入(y/n)?");
gets_s(str); ch = str[0];
} while (!(ch=='y'||ch=='Y'||ch=='n'||ch=='N'));
}
fclose(fp);
return 0;
}
12.6 数据块方式读入文件
函数:fread(数据地址、数据块大小、要读多少个、文件指针)
while (fread(&stud,sizeof(stud),1,fp) == 1)
{
printf("\n姓名:%s", stud.name);
printf("\n性别:%c", stud.sex);
printf("\n年龄:%d", stud.age);
printf("\n分数:%.2f", stud.score);
}
printf("\n");
12.7 其它常用函数
1.rewind(文件指针):将文件指针移动回开头
2.ftell(文件指针):返回当前指针的位置,返回值为long类型
3.fseek(指针,偏移量,起点):移动读写指针,一般用于二进制文件,文本文件慎用!偏移量可正可负,起点一般由3个位置组成:SEEK_SET/SEEK_CUR/SEEK_END,常用!!!
4.feof(文件指针):用于检测是否到了文件尾,例题12.2的方式只能用于文本文件,但该函数可以用于文本文件和二进制文件
12.8 随机读写案例(倒数某某同学)
例题12.5的加强,实现倒数几位或者前几位可以利用读写指针fseek的方式
12.9 对文件中内容的修改
写操作后跟了读操作,那么在读操作之前要重新定位,反之同理
12.10 文件中数据的删除
掌握数据删除的思路:
读取旧文件,添加新文件
两个函数:
rename(旧文件指针,新文件指针):重命名文件、改变文件路径、更改目录名称
remove(文件指针):删除文件
12.11 文件中追加数据
注意读写操作切换时要重新定位,否则导致数据发生无效的情况,掌握正确的追加方法!!