C复习提纲.docx
- 文档编号:29347022
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:54
- 大小:48.37KB
C复习提纲.docx
《C复习提纲.docx》由会员分享,可在线阅读,更多相关《C复习提纲.docx(54页珍藏版)》请在冰豆网上搜索。
C复习提纲
c程序设计语言复习提纲
一.数据的定义
(一)数据类型
1.基本类型
基本类型指整型(int)、实型(float、double)和字符型(char)。
(1)常量
①八进制整数:
0123十六进制整数:
0x123长整型常量:
123l
②实数的浮点表示法:
123.0实数的科学计数法:
1.23e2
③字符的转义序列:
’\’(换行)、’5’(’a’)、’\\x61’(’a’)
④符号常量:
#definepi3.14常用符号常量null(空值0)、eof(文件结束符-1)
(2)变量
①变量的定义:
inta;变量名a为一个符号地址,编译连接时对应一个内存地址,该地址代表的内存单元能够存放一个整数。
②变量的初始化:
a=3;通过变量名a找到相应的内存地址,将数据3保存在此内存单元中。
2.构造类型
构造类型包括数组和结构。
(1)数组
①一维数组的定义:
inta[5];一维数组的初始化:
inta[5]={1,2,3,4,5};
②二维数组的定义和初始化:
intb[2][3]={1,2,3,4,5};
③数组元素的引用:
a[0]=1;b[1][2]=0;
④一维字符数组(字符串):
charc[]=”abc”;(4个元素,c[3]=’{post.content}’)
⑤二维字符数组(字符串数组):
charstr[3][20]={“china”,”usa”,”russia”};
(2)结构
①结构类型的定义:
structrectangle{floatlength;floatwidth;};
②结构变量的定义和初始化:
structrectanglerec1={20.0,10.0};
③结构变量成员的引用:
rec1.length=25.0;
3.指针
(1)指针和地址的概念
变量名ap指针变量
变量值(内存单元内容)指针变量的值(地址)
内存单元地址1000
(2)指针变量的定义和初始化
inta,*p;p=&a;
(3)通过指针引用指向实体
*p=10;
4.构造类型和指针类型的混和定义及应用
(1)指针、数组和地址间的关系
①一维数组
inta[5]={1,2,3,4,5};int*p=a;/*p=&a[0];首地址*/
a、*(p+i)、*(a+i)等价,&a、p+i、a+i等价。
②二维数组
inta[2][2]={1,2,3,4},*p;
若p=&a[0][0];/*p=a[0];第0行第0列地址*/,则a[j]、*(a[0]+i*2+j)、*(p+i*2+j)等价。
若p=a;/*数组首地址,第0行地址*/,则a[j]、*(a+j)、*(*(a+i)+j)、*(*(p+i)+j)等价。
(2)指针数组
int*p[4];/*由4个指向整型变量的指针组成的指针数组*/
int(*p)[4];/*指向由4个元素组成的一维数组的指针变量*/
(3)结构数组
structrectangler[3];
(4)结构指针
structrectangle*p;p=r;r[0].length、(*p).length、p->length等价。
(5)结构中含指针或数组
structstudent{charname[10];/*char*name*/……};
(6)嵌套结构
structstudent{intnum;floatscore;structstudent*next;};
(7)指向指针的指针(二级)
char*str[]={“china”,”usa”,”russia”};char**s=str;
5.空类型
为使程序减少出错,保证正确调用,凡不要求带回函数值的函数,一般应定义为空类型(void)。
(二)变量的存储类别、作用域和生存期
(1)存储类别
存储类别是指数据在内存中的存储方法,具体有以下四种:
①auto自动型:
此类变量存放于内存的动态存储区。
②static静态型:
此类变量存放于内存的静态存储区。
③extern外部参照型:
此类变量存放于内存的静态存储区。
④register寄存器型:
此类变量存放于cpu中的寄存器。
(2)作用域(空间角度)
①局局变量:
在函数内部定义,只在本函数范围有效。
②全部变量:
在函数外部定义,其有效范围从定义位置开始到源文件结束。
(3)生存期(时间角度)
①静态存储:
在程序运行期间分配固定的存储空间。
②动态存储:
在程序运行期间根据需要动态分配存储空间。
自动局部变量:
在函数内部定义,离开函数,值消失。
静态局部变量:
在函数内部定义,离开函数,值仍保留,下次调用该函数可继续使用。
静态全局变量:
只限于被本文件中的函数引用。
外部变量(extern):
允许其它文件引用。
二.运算及流程控制
1.基本运算
(1)运算符的功能
c运算符范围很广,常用的有以下几类:
①算术运算符(+-*/%):
运算结果为数值。
②关系运算符(><==>=<=!
=):
运算结果为1(真)或0(假)。
③逻辑运算符(!
&&||):
运算结果为1(真)或0(假)。
④赋值运算符(=):
运算结果为赋值运算符右边表达式的值。
⑤条件运算符(?
:
):
当?
后表达式值非0时,运算结果为:
左边表达式的值,否则为右边表达式的值。
⑥逗号运算符(,):
运算结果为最右边表达式的值。
(2)运算符的优先级、结合性和目数
①优先级(由高至低):
初等运算符()[]->·→单目运算符→算术运算符(先乘除求余,后加减)→逻辑运算符(不包括!
)→条件运算符→赋值运算符→逗号运算符
②结合性:
规定了运算的结合方向,除单目运算符、条件运算符和逗号运算符为自右向左外,其余均为自左向右
③目数:
运算符所要求的运算对象的个数,条件运算符是唯一的三目运算符。
(3)隐式类型转换和强制类型转换
①隐式类型转换:
系统会自动把不同类型的数据先先转换成同一类型,再进行运算,如10+’a’→10+97→107,3+6.5→3.0+6.5→9.5,又如floatx;x=3+6.5→x值为9。
②强制类型转换:
(类型名)表达式,如(int)6.5%3→6%3→0。
2.表达式
(1)组成规则:
按c语法规则,用运算符将运算对象(常量、变量、函数)连接起来。
(2)计算过程:
先进行优先级高的运算,同一优先级的运算符的运算次序由结合性决定。
3.语句
(1)表达式语句、空语句、复合语句
①表达式语句:
在表达式最后加分号构成,函数调用语句就属于表达式语句。
②空语句:
只有一个分号的语句,什么也不做,有时做循环体。
③复合语句:
用{}括起来的一些语句。
(2)简单控制语句
①break:
提前结束整个循环或switch语句,接着执行循环或switch语句下面的语句。
②continue:
提前结束本次循环,接着进行下一次是否执行循环的判断。
③return(表达式):
将表达式的值作为函数值返回。
若表达式值的类型与函数类型不一致,自动转换成函数类型。
(3)选择控制语句
①if:
有单分支、双分支和多分支三种形式,注意同一程序的等价转换。
②switch:
根据表达式的具体值进行多分支选择。
(4)重复控制语句
①for:
既可处理循环次数已知的循环,也可处理循环次数未知而只给出循环条件的循环。
②while:
当型循环,先判断循环条件,再执行循环体。
③do-while:
直到型循环,先执行循环体,再判断循环条件。
三.程序结构和函数
1.程序结构
(1)main函数与其它函数之间的关系
c程序由函数组成,一个c源程序至少包含一个main函数和若干个其它函数,每个函数实现一定的功能,从而实现程序的模块化设计。
程序总是从main函数开始执行,在main函数中可以调用其它函数,其它函数间也可以相互调用。
(2)被调用函数
①标准库函数:
系统将一些常用的功能模块编写成函数,放在函数库中供用户直接选用。
使用时应用#include命令将相应的头文件包含到本文件中。
②自定义函数:
用户为解决自己的专门需要而定义的函数。
在主调函数中对被调函数进行声明,形式“函数类型函数名(参数类型列表)”。
2.函数的定义
(1)函数定义的ansic格式
类型名函数名(形式参数列表){函数体}
(2)函数的参数及参数传递
①形式参数:
调用函数前不占内存单元,调用时才分配内存单元,调用结束后释放。
②实际参数:
可以是常量、变量或表达式。
③指针参数:
为使在被调用函数中改变的变量的值能被主调函数得到,应该用指针变量作为函数参数。
④参数传递:
是主调函数与被调用函数之间传递数据的主要途径,这种传递是“值传递”,即只能由实参传给形参,不能由形参传回给实参,因为实参与形参位于内存中不同的单元。
注意实参与形参的类型应相同或赋值兼容。
(3)函数的返回值
通过函数调用使主调函数获得一个确定的值。
除了可能返回一个整型值、实型值、字符值外,也可以把指针(地址)作为函数的返回值,此时函数的定义形式为:
类型名*函数名(参数表){函数体}
3.函数的调用
(1)函数调用的一般格式
①通过函数名调用函数:
形式“函数名(实参列表)”,位置出现在语句、表达式或实参。
②通过函数指针调用函数:
定义指向函数的指针变量“类型名(*变量名)();”,给函数指针变量赋值“函数指针变量名=函数名;”,调用“(*函数指针变量名)(实参列表)”。
(2)函数的嵌套调用和递归调用
①嵌套调用:
一个函数体内不能包含另一函数的定义,即不允许嵌套定义,但允许调用另一个函数,即嵌套调用。
②递归调用:
在调用一个函数的过程中直接或间接地调用该函数本身。
(3)熟练掌握标准库函数的调用
①常用数学函数:
cos、sqrt、pow、exp、fabs、log、log10。
②常用字符函数:
isalnum、isalpha、isdigit、islower、toupper。
③常用字符串函数:
strcpy、strcmp、strcat、strlen。
四.数据的输入和输出
1.文件
所谓文件是指存放在外存上的数据集合,一个c文件是一个字节流(ascii文件、文本文件)或二进制流(二进制文件),而不是由记录组成的。
在c语言中对文件的存取是以字符(字节)为单位。
2.标准文件的输入和输出
键盘和显示器被看作标准文件,通过键盘输入即从文件中读取数据,在显示器上显示即向文件中写数据。
c语言不提供专门的输入输出语句,而是通过函数来实现输入输出操作,常用输入输出函数有:
格式化输入输出函数(scanf、printf)、字符输入输出函数(getchar、putchar)、字符串输入输出函数(gets、puts)。
3.缓冲文件系统(文本文件)
(1)文件的打开和关闭
file*fp;fp=fopen(文件名,使用方式);fclose(fp);
(2)文件的基本读写操作
常用函数有:
fscanf(从指定文件按格式读出数据)、fprintf(按格式向指定文件写入数据)、fgetc(从指定文件读出一个字符)、fputc(向指定文件写入一个字符)、fgets(从指定文件读出一个字符串)、fputs(向指定文件写入一个字符串)。
(3)文件的状态检测
feof(文件指针):
若文件指针指向文件末尾,函数值为真(非0)。
五.编译预处理
1.编译预处理的基本概念
预处理命令并不属于c语言本身的组成部分,这些命令在编译前处理,主要用于改进程序设计环境,提高编程效率。
主要有宏定义、文件包含和条件编译三种,这些命令都以#开头。
2.宏定义
用一个指定标识符代表一个字符串,形式为:
#define标识符字符串,常用于定义符号常量。
3.文件包含
一个源文件将另一个源文件的全部内容包含进来,形式为:
#include<文件名>,常用于包含头文件。
六.面向对象程序设计初步
1.类、对象和面向对象程序设计的基本概念
①对象:
客观世界中任何一个事务都可以看作一个对象,它们之间通过一定的渠道相互联系。
一个对象应该包含两个要素:
数据和操作。
②类:
每一个实体都是一个对象,具有相同结构和特性的对象属于同一类型,在c++中称为“类”,它代表某一批对象的共性和特征。
类是对象的抽象,对象是类的具体实例。
类是用来定义对象的一种抽象数据类型。
③面向对象程序设计:
程序设计者的任务包括设计对象(把数据和操作代码封装在一个对象中)和协调各种对象共同完成所需任务。
2.掌握类的定义
classstud
{intnum;//定义数据成员
charname[10];
charsex;
voiddisplay()//定义成员函数
{cout<<”num:
”< cout<<”name: ”< cout<<”sex: ”< } studstud1,stud2;//定义对象 第二部分c程序设计的常用算法 算法(algorithm): 计算机解题的基本思想方法和步骤。 算法的描述: 是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。 通常使用自然语言、结构化流程图、伪代码等来描述算法。 一、计数、求和、求阶乘等简单算法 此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。 例: 用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。 本题使用数组来处理,用数组a[100]存放产生的确100个随机整数,数组x[10]来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。 即个位是1的个数存放在x[1]中,个位是2的个数存放在x[2]中,……个位是0的个数存放在x[10]。 voidmain() {inta[101],x[11],i,p; for(i=0;i<=11;i++) x=0; for(i=1;i<=100;i++) {a=rand()%100; printf("%4d",a); if(i%10==0)printf("\"); } for(i=1;i<=100;i++) {p=a%10; if(p==0)p=10; x[p]=x[p]+1; } for(i=1;i<=10;i++) {p=i; if(i==10)p=0; printf("%d,%d\",p,x); } printf("\"); } 二、求两个整数的最大公约数、最小公倍数 分析: 求最大公约数的算法思想: (最小公倍数=两个整数之积/最大公约数) (1)对于已知两数m,n,使得m>n; (2)m除以n得余数r; (3)若r=0,则n为求得的最大公约数,算法结束;否则执行(4); (4)m←n,n←r,再重复执行 (2)。 例如: 求m=14,n=6的最大公约数.mnr 1462 620 voidmain() {intnm,r,n,m,t; printf("pleaseinputtwonumbers: \"); scanf("%d,%d",&m,&n); nm=n*m; if(m {t=n;n=m;m=t;} r=m%n; while(r! =0) {m=n;n=r;r=m%n;} printf("最大公约数: %d\",n); printf("最小公倍数: %d\",nm/n); } 三、判断素数 只能被1或本身整除的数称为素数基本思想: 把m作为被除数,将2—int()作为除数,如果都除不尽,m就是素数,否则就不是。 (可用以下程序段实现) voidmain() {intm,i,k; printf("pleaseinputanumber: \"); scanf("%d",&m); k=sqrt(m); for(i=2;i if(m%i==0)break; if(i>=k) printf("该数是素数"); else printf("该数不是素数"); } 将其写成一函数,若为素数返回1,不是则返回0 intprime(m%) {inti,k; k=sqrt(m); for(i=2;i if(m%i==0)return0; return1; } 四、验证哥德巴赫猜想 (任意一个大于等于6的偶数都可以分解为两个素数之和) 基本思想: n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。 如n1不是素数,就不必再检查n2是否素数。 先从n1=3开始,检验n1和n2(n2=n-n1)是否素数。 然后使n1+2再检验n1、n2是否素数,…直到n1=n/2为止。 利用上面的prime函数,验证哥德巴赫猜想的程序代码如下: #include"math.h" intprime(intm) {inti,k; k=sqrt(m); for(i=2;i if(m%i==0)break; if(i>=k) return1; else return0; } main() {intx,i; printf("pleaseinputaevennumber(>=6): \"); scanf("%d",&x); if(x<6||x%2! =0) printf("dataerror! \"); else for(i=2;i<=x/2;i++) if(prime(i)&&prime(x-i)) { printf("%d+%d\",i,x-i); printf("验证成功! "); break; } } 五、排序问题 1.选择法排序(升序) 基本思想: 1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置; 2)除第1个数外,其余n-1个数中选最小的数,与第2个数交换位置; 3)依次类推,选择了n-1次后,这个数列已按升序排列。 程序代码如下: voidmain() {inti,j,imin,s,a[10]; printf("\input10numbers: \"); for(i=0;i<10;i++) scanf("%d",&a); for(i=0;i<9;i++) {imin=i; for(j=i+1;j<10;j++) if(a[imin]>a[j])imin=j; if(i! =imin) {s=a;a=a[imin];a[imin]=s;} printf("%d\",a); } } 2.冒泡法排序(升序) 基本思想: (将相邻两个数比较,小的调到前头) 1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”; 2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数; 3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。 程序段如下 voidmain() {inta[10]; inti,j,t; printf("input10numbers\"); for(i=0;i<10;i++) scanf("%d",&a); printf("\"); for(j=0;j<=8;j++) for(i=0;i<9-j;i++) if(a>a[i+1]) {t=a;a=a[i+1];a[i+1]=t;} printf("thesortednumbers: \"); for(i=0;i<10;i++) printf("%d\",a); } 3.合并法排序(将两个有序数组a、b合并成另一个有序的数组c,升序) 基本思想: 1)先在a、b数组中各取第一个元素进行比较,将小的元素放入c数组; 2)取小的元素所在数组的下一个元素与另一数组中上次比较后较大的元素比较,重复上述比较过程,直到某个数组被先排完; 3)将另一个数组剩余元素抄入c数组,合并排序完成。 程序段如下: voidmain() {inta[10],b[10],c[20],i,ia,ib,ic; printf("pleaseinputthefirstarray: \"); for(i=0;i<10;i++) scanf("%d",&a); for(i=0;i<10;i++) scanf("%d",&b); printf("\"); ia=0;ib=0;ic=0; while(ia<10&&ib<10) {if(a[ia] {c[ic]=a[ia];ia++;} else {c[ic]=b[ib];ib++;} ic++; } while(ia<=9) {c[ic]=a[ia]; ia++;ic++; } while(ib<=9) {c[ic]=b[ib]; b++;ic++; } for(i=0;i<20;i++) printf("%d\",c); } 六、查找问题 1.①顺序查找法(在一列数中查找某数x) 基本思想: 一列数放在数组a[1]---a[n]中,待查找的数放在x中,把x与a数组中的元素从头到尾一一进行比较查找。 用变量p表示a数组元素下标,p初值为1,使x与a[p]比较,如果x不等于a[p],则使p=p+1,不断重复这个过程;一旦x等于a[p]则退出循环;另外,如果p大于数组长度,循环也应该停止。 (这个过程可由下语句实现) voidmain() {inta[10],p,x,i; printf("pleaseinputthearray: \"); for(i=0;i<10;i++) scanf("%d",&a); printf("pleaseinputthenumberyouwantfind: \"); scanf("%d",&x); printf("\"); p=0; while(x! =a[p]&&p<10) p++; if(p>=10) printf("thenumber
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 复习 提纲