《C语言》复习提纲.doc_第1页
《C语言》复习提纲.doc_第2页
《C语言》复习提纲.doc_第3页
《C语言》复习提纲.doc_第4页
《C语言》复习提纲.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基本知识要求一、 语法基础1、 记住C语言常量的定义方法(#define 名称 值),理解符号常量与变量的区别;如果要用符号Integer定义整型变量,可以使用的方法有:l 使用define定义符号常量:#define int Integerl 使用typedef定义新类型名称:typedef int Integer;2、 记住C语言定义标识符的要求(只能由数字、英文字母、下划线组成,第一个字符不能是数字);3、 理解计算机存储整数的方法(什么是补码?怎样计算?);理解计算机存储字符的方式(ASCII码),区分数字字符与数字,掌握相互转换的方法(3-0)。同时理解大小写字符的转换方法及与自然数的映射方法(c-a);4、 了解(unsigned)char、(unsigned)(short)int、(unsigned)long、float、double常量表达方法,掌握怎样求各类整数范围(如int类型,占4个字节,范围为;unsigned int类型,占4个字节,范围为),以及在printf及scanf中对应的格式控制符;(注意char也可以当作整数使用,用的是什么?)5、 理解转义字符的含义,掌握常见转义字符:0、n、t、”、ddd、xhh;6、 记住常量字符串的表示方法(与常量字符表示的区别?),理解字符串在C语言中的存储方式及特点,由此掌握字符串在C语言中的访问及遍历方式。7、 理解C语言中的不同类型数据在同一个表达式中的运算规则,能手动计算简单表达式;8、 理解C语言的常用运算符,掌握+、-运算符的简单使用(前置与后置的区别),掌握/和%的使用规则,掌握 指针 与 *(指针) 的关系(ai等价于*(a+i));9、 理解强制类型转换的含义及使用场合(如:(double)2/3与2/3的区别);10、 理解赋值规则(注意有符号数赋给无符号变量的使用:如求整数补码);理解复合赋值;(注意赋值号左边必须是一个存储单元,实际上常常就是一个变量);11、 了解逗号运算符和三元运算符的运算规则。二、 控制结构1、 记住C语言中的关系运算符与逻辑运算符(注意=与!=),掌握关系和逻辑表达式的运算规则和方式及结果值(0或者1);理解C语言对逻辑值的判断方式(非零作为真);2、 熟练掌握if语句的使用,注意的使用及if-else的配对;3、 理解C语言中的常用的三种循环(while、do-while和for),特别注意for循环的表达方式及循环执行流程;4、 掌握for循环的常见使用方法(与一维数组、二维数组和字符串结合各自的使用方式,及一些数组使用的技巧);5、 理解break、continue的含义及使用方式和场合(break在循环和switch中)。三、 数组1、 掌握一维数组和二维数组的声明方式与初始化方法(特别注意初始化元素不足的情形);2、 理解数组名称的意义与使用规则;3、 掌握一维数组和二维数组的遍历方法; (注意二维数组在C语言中是按行存储的)4、 掌握数组的常见应用,比如向量、矩阵应用、排序(冒泡和简单选择排序)、字符串的存储等;5、 掌握C语言字符数组与字符串的关系,能对字符串进行遍历和简单操作(注意0的重要性);6、 掌握gets、puts、strlen、strcmp、strcat、strcpy的使用,区分gets函数与scanf函数读取字符串的区别。四、 函数1、 掌握函数声明的格式,理解形参与实参的含义与之间的传递规则(理解形参变量内容的改变不会影响实参变元内容),理解函数最多能返回一个值及返回方式(return指令);2、 注意几类函数的区别:库函数、main函数、用户自定义函数;记住模块化的程序正常运行时总是从main函数进入,从main函数退出;3、 理解函数可以嵌套调用,它的特殊情形是递归调用(会写简单的递归程序);4、 理解并能熟练使用数组作为形参的声明方式(如int a和int* a)及对应实参的传递方式;(注意理解:数组作为参数传递过去的是数组的首地址,由于数组元素在内存中是连续存放的,所以在函数中可以通过该首地址访问数组的元素,从而实现改变元素的目的,但这不是改变实参)5、 理解全局变量、局部变量的声明方式及使用特点;6、 理解静态变量(static)、寄存器变量(register)变量特点,特别注意理解static。五、 指针1、 理解指针(即地址)、指针变量(存储指针的变量)、指向的含义;掌握指针变量的声明方式和使用(怎样得到地址、怎样取到内容);注意指针变量依然占存储单元,它用来存储指针(内存地址),而其它简单类型变量也占存储单元,但是只用来存储内容;注意指针与整数的加法含义,比如p+1、p+分别表示什么。2、 理解指针作为参数传递的方法及意义(可以通过传递的指针即地址找到主调函数中变量,从而改变其内容);把地址传递给函数称为传址调用,把内容传递给函数称为传值调用;3、 掌握指针与数组的关系,并能利用指针访问数组;4、 理解字符指针,注意字符指针赋常量字符串初值与字符数组赋常量字符串初值的区别;5、 注意指针作为返回类型时,不要返回在函数中声明的局部变量的地址。(为什么?)6、 掌握malloc函数的free函数的使用格式,以及它们的标准使用方法(动态内存声明成功后,通常可以作为一维数组使用,也可模拟为二维数组,但最后一定要用free函数释放)7、 了解指针数组和指向指针的指针(二级指针)。六、 构造数据类型1、 理解结构体与数组的区别与联系;2、 掌握结构体的声明方式与使用结构体声明结构体变量的方式,掌握怎样访问结构体成员变量;3、 掌握结构体作为整体使用的两种情形:两个同类型的结构体变量进行赋值运算时和当结构体变量作为函数的参数进行传递和返回值时;4、 掌握结构体数组的使用(实质与一般数组的使用方法相同);5、 掌握结构体指针的声明方式(注意结构体指针加上一个数的含义);掌握利用结构体指针访问结构体成员的方法(两种);记住运算符优先级为1级的4个运算符:()、-、.。(分析:p-math、p-math+、+p-math、(+p)-math、(p+)-math)6、 理解链式存储与顺序存储方式与各自优缺点。会声明链表结点的结构体类型,会构造链表,能进行链表的遍历;会绘图演示链表中元素的删除和插入过程;7、 了解共用体(联合体)、枚举类型,能对typedef进行简单的使用。七、 文件1、 了解文件的定义,了解文本文件和二进制文件的区别与特点;2、 了解FILE结构体;能用fopen、fclose写出文件操作的标准过程;3、 记住并理解:fgetc和fputc、feof、fread和fwrite、fscanf和fprintf、fgets和fputs、rewind、fseek、ftell函数的含义与使用方法;4、 能进行简单的文件操作。编程问题举例1. 内存编码显示问题:(1)从外部读入一个整数,输出这个数在内存中的存储编码(以十六进制),并且输出若直接把该编码当作原数的值;(2)以二进制方式显示存储编码。2. 字符转换问题:从外部读入一个字符,如果是小写字母,则转换为大写字母输出;如果是大写字母,则转换为小写字母输出;如果是数字字符,则转换为对应的数字输出。3. 随机数的简单使用、偶数的判断问题:(1)产生一随机整数,若该数为偶数,则输出字符串“学习”,否则输出“锻炼”。(2)产生位于整数a和整数b之间的随机整数。4. switch的使用:写一段程序,利用switch语句把学生成绩(整型分数)转换为等级,规则如下:5. 循环的使用:(1)最大公约数问题:写一个函数,用辗转相除法求整数a、b的最大公约数;(2)最小公倍数:写一个函数,求两数的最小公倍数,函数原型为:int lcm(int a,int b);(3)3n+1问题:任选一个自然数,如果该数为偶数,就将它变为自身的1/2;如果奇数,那就将它变为原来的3倍再加1。按照这样的方法进行运算,经过若干次计算后,无论最初是什么数,得到的结果总是“1”。试用程序输出该数的变化过程。6. 素数问题:求出a b之间所有的素数。7. 遍历数组:(1)给出一个整型数组,找出该数组中的最大元素,同时求出它们的平均值,输出结果;(2)写一个函数,找出字符串中指定的字符的位置(即下标),比如,注意如果不存在,则返回-1,函数原型可参考:int findchar(char* str, char ch);(3)写一个函数,实现列数为5的矩阵的转置,原型可为:int transpose(int ma5);8. 构造特殊矩阵:(1)构造一个5阶希尔伯特矩阵;(2)构造一个5行的杨辉三角矩阵。 5阶希尔伯特矩阵 5行杨辉三角矩阵9. 字符串的使用:(1)遍历字符串,计算它的长度(不含0);(2)假设一字符数组存储了一个字符串(全为小写英文字符),按以下规则变换:a-b,,y-z,z-a(提示:%运算符):char* trans(char* str);(3)编写一个函数,取字符串的左子串(返回值为子串首地址):char* left(char* str, int n, char* d);(4)编写一个函数,删除字符串左边的所有空格(返回值字符串首地址):char* ltrim(char* str);(5)编写一个函数,取字符串的任意子串:char* mid(char* s,int start,int n,char* d);例:char str=”aaercg”; trans(str);则str中应为字符串”bbfsdh”;char str=”asdfsa fsdf”, d20; left(str,3,d);则d中为”asd”; 若left(str,100,d);则d中为” asdfsa fsdf”;若left(str,-2,d);则d为空,即d=”0”。char str=” asd”; ltrim(str);则str中为”asd”。10. 简单排序:编写一个函数,实现对浮点数组的排序:int sort(float* f, int n);11. 指针的简单使用:(1)用指针实现两个数交换;(2)用指针访问数组中的每个元素(通过指针加法);12. 动态分配内存的简单使用:从键盘读入n(),生成一个长度为n的字符数组,并赋值a,b,。13. 链表的简单使用:(1)若链表结构体类型已给出,建立一个含n个有效结点的链表;(2)若链表已建立(头结点不含有效数据),输出每个结点的的有效数据;(3)若链表已建立(至少有一个不含有效数据的头结点),释放链表。14. 文件的简单操作:(1)在程序中生成1000个随机整数,并把它们输入到文件名为“data.txt”的文件中(数与数之间用空格隔开);(2)把与程序同目录下的文件“data1.c”复制到文件“data1.bak”;(3)把程序中的一个数组所有数据,一次性按二进制格式写入文件“data.dat”中(用fwrite);(4)给出文件名“file1.exe”,求出它的文件长度,并输出。参考程序:/*1.(1)内存编码显示问题:从外部读入一个整数,输出这个数在内存中的存储编码(以十六进制),并且输出若直接把该编码当作原数的值;*/#include int main(void) int d; unsigned k; scanf(%d,&d);k=d; printf(0x%x,%u,k,k);(2) #include int main(void)int k,i=0;unsigned kk;char ch32=0;scanf(%d,&k);kk=k; /直接传送,转化为无符号数dochi=kk%2;kk=kk/2;i+;while(kk!=0);for(i=31;i=0;i-)printf(%d,chi);return 0;/*2.字符转换问题:从外部读入一个字符,如果是小写字母,则转换为大写字母输出;如是是大写字母,则转换为小写字母输出;如果是数字字符,则转换为对应的数字输出。*/#include int main(void) char ch; scanf(%c,&ch); if(ch=a&ch=A&ch=0&ch9) printf(%c,ch); else printf(%d,ch);/*3.随机数的简单使用、偶数的判断问题:产生一随机整数,若该数为偶数,则输出字符串“学习”,否则输出“锻炼”。*/#include #include int main(void) int k; k=rand(); if(k%2) printf(锻炼n); else printf(学习n);/*4.switch的使用:写一段程序,利用switch语句把学生成绩(整型分数)转换为等级,规则如下:f(x)=A,90=x=100;=B,80=x89;=C,x80*/#include int main(void) char grade; int k; scanf(%d,&k); switch(k/10) case 9: case 10: grade=A;break; case 8: grade=B;break;default: grade=C;break; putchar(grade);/*5.循环编写:(1)最大公约数问题:写一个函数,用辗转相除法求整数a、b的最大公约数,返回两数的最小公倍数,函数原型为:int lcm(int a,int b);*/#include int lcm(int a,int b);int main(void)int a,b;scanf(%d%d,&a,&b);printf(lcm(%d,%d)=%d,a,b,lcm(a,b);int lcm(int a,int b)int aa=a,bb=b,r,t;if(ab) t=a;a=b;b=t; dor=a%b;a=b;b=r;while(r!=0);return aa*bb/a;/*5.循环编写:(3)3n+1问题:任选一个自然数,如果该数为偶数,就将它变为自身的1/2;如果奇数,那就将它变为原来的3倍再加1。按照这样的方法进行运算,经过若干次计算后,无论最初是什么数,得到的结果总是“1”。试用程序输出该数的变化过程。*/#include int main(void)long k;scanf(%ld,&k);printf(n%8ld,k);while(k!=1)if(k%2=0)k=k/2;elsek=3*k+1;printf(%8ld,k);/*6.素数判断问题:求出1100之间所有的素数*/#include #include int isprime(int k);int main(void)int i;for(i=2;i100;i+)if(isprime(i) printf(%4d,i);int isprime(int k)int i,m;m=(int)sqrt(k);for(i=2;i=m;i+)if(k%i=0)break;if(i=m+1) /*正常退出循环,k是素数*/return 1;else /*由break退出,k不是素数*/return 0;/*7.遍历数组:(1)给出一个整型数组,找出该数组中的最大元素,同时求出它们的平均值,输出结果;*/#include int main(void)int i,sum,max,a10;for(i=0;i10;i+)scanf(%d,&ai);sum=max=a0;for(i=1;imax)max=ai;sum+=ai;printf(max=%d,average=%f,max,(float)sum/10);/*(2)写一个函数,找出字符串中指定的字符的位置(即下标),比如,注意如果不存在,则返回-1,函数原型可参考:int findchar(char* str, char ch);*/int findchar(char* str, char ch)int i;for(i=0;stri!=0;i+)if(stri=ch)return i;return -1;/*(3)写一个函数,实现列数为5的矩阵的转置,原型可为:int transpose(int ma5);*/int transpose(int ma5)int i,j,temp;for(i=0;i5;i+)for(j=0;ji;j+)temp=maij;maij=maji;maji=temp;/*8.构造特殊矩阵:(1)构造一个5阶希尔伯特矩阵;*/#include int main(void)int i,j;float a55;for(i=0;i5;i+)for(j=0;j5;j+)aij=1.0/(i+j+1);for(i=0;i5;i+)for(j=0;j5;j+)printf(%5.3f,aij);printf(n);/*(2)构造一个5行的杨辉三角矩阵。*/#include int main(void)int i,j;int a55=0;for(i=0;i5;i+)ai0=aii=1;for(i=1;i5;i+)for(j=1;ji;j+)aij=ai-1j+ai-1j-1;for(i=0;i5;i+)for(j=0;j5;j+)printf(%5.3f,aij);printf(n);/*9.字符串的使用:(1)遍历字符串,计算它的长度(不含0);*/#include int main(void)char str81;int i;gets(str);for(i=0;stri!=0;i+);printf(len=%d,i);/*(2)假设一字符数组存储了一个字符串(全为小写英文字符),按以下规则变换:a-b,,y-z,z-a(提示:%运算符):char* trans(char* str);*/char* trans(char* str)int i;for(i=0;i0)for(i=0;stri!=0&i0)for(i=0;(stri=strk)!=0;i+,k+);return str;/*(5)编写一个函数,取字符串的任意子串:char* mid(char* s,int start,int n,char* d);*/char* mid(char*s,int start,int n,char* d) int i,k;for(k=0;sk!=0&kstart;k+); /*找到复制的起始位置*/if(k=start)for(i=0;(di=sk)!=0&(k-start)n;i+,k+);if(k-start=n) /*说明剩下的子串足够长*/di=0;return d;elsereturn NULL;/*10.简单排序:编写一个函数,实现对浮点数组的排序:int sort(float* f, int n);*/int sort(float* f, int n)int i,j,k;float t;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(fjfk) k=j;t=fi;fi=fk;fk=t;return 1;/*11.指针的简单使用:(1)用指针实现两个数交换;*/#include int main(void)int a,b,t;int *pa=&a,*pb=&b;scanf(%d%d,&a,&b);t=*pa;*pa=*pb;*pb=t;printf(%d %d,a,b);/*(2)用指针访问数组中的每个元素(通过指针加法);*/#include int main()int i,a10,*p=a;for(i=0;i10;i+)scanf(%d,p+i); /*scanf(%d,&ai)*/for(;pa+10;p+)printf(%d ,*p);/*12.动态分配内存的简单使用:从键盘读入n(1=n=26),生成一个长度为n的字符数组,并赋值a,b,。*/#include int main(void)char* a;int i,n;scanf(%d,&n);a=(char*)malloc(n*sizeof(char);for(i=0;in;i+)ai=i+a;for(i=0;in;i+)putchar(ai);free(a);/*13.链表的简单使用:(1)若链表结构体类型已给出,建立一个含n个有效结点的链表;(2)若链表已建立(头结点不含有效数据),输出每个结点的的有效数据;(3)若链表已建立(至少有一个不含有效数据的头结点),释放链表。*/#include #include #define N 10 /*最初建立结点数*/struct node /*链表结点类型声明*/int data; /*数据域*/struct node *link; /*链接域或指针域*/;struct node *create(int n); /*建立链表函数声明*/void write(struct node *head); /*输出链表函数声明*/void destroy(struct node *head); /*释放链表所有结点函数声明*/int main(void)struct node *head;/*头指针声明*/head=create(N); /*建立链接*/write(head);destroy(head);struct node *create(int n)int i;/*newnode指向新建立结点,head指向头结点,last指向链表最后一个结点*/struct node *newnode,*head,*last;/*建立头结点,不保存实际数据,只是为了方便链表的操作*/head=(struct node*)malloc(sizeof(struct node);head-data=-1;head-link=NULL;/*保存尾结点的链接域为NULL,表明后面没有结点*/last=head;/*保存last始终指向链表最后一个结点*/for(i=0;idata=i+1;/*数据域赋值*/newnode-link=NULL;/*链接域赋为NULL,因为它将成为尾结点*/last-link=newnode;/*把新结点链接到尾结点后*/last=last-link;/*保证last始终指向尾结点*/return head;/*返回头结点指针*/void write(struct node *head)struct node *p=head;/*p指向头结点,注意不是链接的实际结点,因为没有保存实际数据*/printf(n);while(p-link)/*如果存在下一个结点*/p=p-link;/*p指向下一个结点*/printf(%4d,p-data);/*输出该结点的数据*/if(p=head)/*说明除头结点外,链表没有其它结点*/printf(No data!);printf(n);void destroy(struct node *head)struct node *p=head;while(head)/*释放所有结点*/p=head;head=head-link;free(p);/*14.文件的简单操作:(1)在程序中生成1000个随机整数,并把它们输入到文件名为“dat

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论