留意错误写法,2022年新增程序分析题
思想很重要,2022年真题出现过
注意附加格式符,左右对齐,默认右对齐
注意浮点数的输出、%e和%g的区别
注意浮点数输入的格式符:附加格式符*和.
注意输入时带来的回车键问题
注意积累多行字符的输入技巧、EOF的含义、计数器思想
注意积累66页的字母大小写转换、数字字符转化整数等技巧
数组调试程序时可以使用define N 数字
用来定义数组的长度,注意数组的长度不能使用变量,为数组元素赋值时记得加&
取地址符
1.注意字符串输入时,只需要写数组名即可,不用加取地址符
2.使用scanf(%s)
这种方式输入时,不能输入空格,空会被当做结束输入,想要输入空格,例如格式为:Li Lei等,可以使用gets_s函数输入
1.掌握文件的打开、关闭函数fopen、fclose
2.掌握向文件写入内容的fprintf函数、以及fscanf函数等
3.了解exit函数,在头文件,stdlib.h文件中
#include
#include
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;
}
注意自增自减的优先级问题
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
三角形的判断条件曾经作为真题表达式出现过
打折问题,掌握相应的计算
掌握sqrt函数:
C语言中sqrt函数是指的开方运算函数,得到的结果是函数变量(可以是数值,也可以是变量名)的算术平方根。
奇数偶数的判断条件贯穿很多的题型,基本考试都会出现,编程中也较为常用
椭圆的条件曾经作为表达式真题出现过!
写表达式真题出现过
逻辑表达式的算术运算方式每年必出!!!
等级分类的判断也曾作为真题出现过,当年是研究生评优评先
该问法也作为真题出现过
技巧总结:
一个数%10可以获得它的个位、/10则可以去掉它的个位
牛顿迭代法
视频讲解
积累sqrt的使用,以及穷举的思想,当年出过填空题没做出来
注意一些复杂图形的打印,找规律!例如运用字母相减的特性
最大公约数、最小公倍数问题不是很会,积累!!
对于字符串中空格的处理问题需要积累,可以引进标志变量flag通过赋值1/0来判断
枚举的思想广泛应用,真题中也有涉及
排列组合问题、水仙花、完数、因子分解问题
完数问题
需要记忆牛顿迭代公式,迭代法的关键在于找出迭代公式,此题要注意几个点,首先迭代公式中有一个初值,他是迭代的首项,这个值会影响程序迭代的次数,一般来说和结果越接近,迭代的次数越少,例如:根号2,假设初值为1.5,程序会迭代4次,初值为1,程序会迭代5次。其次就是精度问题,一般来说就是来衡量根要多接近于一个区间,例如:0.000001
斐波那契、杨辉三角
3个关键点:
1.寻找递推关系
2.递推关系必须要有始基
3.递推计算
可以积累分类打印的技巧
掌握冒泡和选择
有时候可以利用数组的一些特性达到去重
数组可以有统计的作用
了解公示和解法
1.了解rand函数,知道怎么控制随机数的范围
2.了解srand函数设定种子值
熟记过程和代码
掌握递归算法求解,遇到分段函数问题都可以考虑用递归
掌握递归算法求解!!解题能够提升快速,避免使用排序算法
本题主要综合了对时间处理的各个模块的知识,需要了解怎么判断平闰年,怎么知道该年该月改日对应该月的星期几(转换公式%7),需要掌握结构化编程的思想,了解头文件的概念和作用及自定义头文件封装的方法
掌握自顶向下、逐步求精的过程
220页注意宏的一些计算规则
注意变量地址赋值给指针变量时的写法,真题考察过
&和*优先级相同,但是会按自右向左的方向进行结合
注意:&*a是非法的
指针赋值时有时候要注意类型强制转换,预防类型不匹配的错误
1.指针的加减操作是使指针指向当前指针所指向存储单元的之后第n个、之前的第n个存储单元
2.指针的加减运算特别适合对数组所有元素进行逐个扫描的操作
3.注意指针一种错误写法(p+2)++
4.说明功能类型的题目22年出现了,注意训练
有时可以采用逆向位思维,从后往前扫描
积累提取连续数字字符的技巧
后期补充
先赋值、根据行和列的关系,再输出
利用二维数组掌握报表的思想,利用报表完成数据的统计,类似Excel
可以通过比较二维数组元素指针的大小来进行扫描
strncpy(str1,"sunday",3)
,不会添加结束符出现字母、数字等类型时,有时可以考虑strcmp结合strcpy的排序功能进行进一步处理
注意指针重置起点的问题
注意变量的指针作为函数的实参,要传的是地址,注意加取地址符
利用3个数组
strcmp函数的实现
掌握比较的方法
视频讲解
#include
#include
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
注意积累加权平均的计算方法
要预防返回指针时,内存释放的问题
积累strchr函数的使用以及实现过程
了解排序的方法
利用行指针数组进行排序
有可能从这里出一些考题
建议不在必要时不使用全局变量,了解全局变量的作用范围
掌握static修饰变量的特点及运算规则
注意积累
掌握两种方式:switch、静态数组
静态数组要多预留一位,与数组下标匹配
掌握其思想及熟记代码,注意边界取值问题
掌握结构体的定义及初始化、调用(点名法)
掌握结构体数组的定义及初始化
了解atoi、atof函数,原型放至头文件stdlib.h中
通过年月日案例掌握结构体作为参数的使用
和普通变量一样,传的是地址
求下周的今天是什么日期?
掌握解题思路
掌握联合共用体的定义及使用,掌握共用体的内存存储规则!
视频解析
看懂、了解即可,能积累就积累
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,从读取那一刻开始便会清空文件内容
1.fegtc(File *fp)
方式,函数返回文件结束符EOF
while ((ch = fgetc(fp)) != EOF)
putchar(ch);
2.从磁盘中读入字符,并非每次都从磁盘读取,而是每访问一次将一批字符送入输入缓冲区,当缓冲区全部读完才会再访问一次磁盘
1.fputs函数:fputs(char *string,FILE *stream)
字符串\0
不会输出
while (gets_s(ch) != NULL) {
fputs(ch, fp);
fputc('\n', fp);
}
2.ctrl+z作为结束符,等于NULL
1.函数:fgets(char *string,int n,FILE *stream)
while (fgets(ch,81,fp) != NULL) {
printf("%s", ch);
}
2.fgets函数会在最后添加’\0’
函数:fwrite(数据地址、数据块大小、要写多少个、文件指针)
案例:建立学生入学档案文件
#include
#include
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;
}
函数: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");
1.rewind(文件指针):将文件指针移动回开头
2.ftell(文件指针):返回当前指针的位置,返回值为long类型
3.fseek(指针,偏移量,起点):移动读写指针,一般用于二进制文件,文本文件慎用!偏移量可正可负,起点一般由3个位置组成:SEEK_SET/SEEK_CUR/SEEK_END,常用!!!
4.feof(文件指针):用于检测是否到了文件尾,例题12.2的方式只能用于文本文件,但该函数可以用于文本文件和二进制文件
例题12.5的加强,实现倒数几位或者前几位可以利用读写指针fseek的方式
写操作后跟了读操作,那么在读操作之前要重新定位,反之同理
掌握数据删除的思路:
读取旧文件,添加新文件
两个函数:
rename(旧文件指针,新文件指针):重命名文件、改变文件路径、更改目录名称
remove(文件指针):删除文件
注意读写操作切换时要重新定位,否则导致数据发生无效的情况,掌握正确的追加方法!!