[工学]c语言复习概念要点.ppt_第1页
[工学]c语言复习概念要点.ppt_第2页
[工学]c语言复习概念要点.ppt_第3页
[工学]c语言复习概念要点.ppt_第4页
[工学]c语言复习概念要点.ppt_第5页
已阅读5页,还剩57页未读 继续免费阅读

下载本文档

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

文档简介

,ANSI C一共只有37个关键字,C语言提供的数据结构是以数据类型的形式出现的,用指针、结构体还可构成链表、树、栈等复杂的数据结构,Data Type,跟第四版书稍有不同,基本数据类型,int long 整数,在目前绝大多数机器上占4个字节。 TC2中是2个字节 float 单精度浮点数,一般是4个字节长 double (long) 双精度浮点数,一般是8个字节长 char 字符,一般是1个字节长 用来表示256个ASCII字符,或者0255的整数,字符常量,转义字符特殊的字符常量 一些特殊字符(无法从键盘输入或者另有它用)用转义字符表示,char c1, c2; c1=a; 可以 c2=“a” ; 错误,合法的字符常量 ?,变量类型 定义 字节数 范围 整型 int a, b; 2 -3276832767 短整型 short x, y; 2 -3276832767 无符号整型 unsigned int a; 2 065535 无符号短整型 unsigned short b; 2 065535 长整型 long l; 4 -21474836482147483647 无符号长整型 unsigned long d; 4 04294967295 单精度实型 float f; 4 3.4e-38 3.4e38(7位) 双精度实型 double d; 8 1.7e-308 1.7e308(15位) 长双精度实型 long double ld; 16 3.4e-49323.4e4932(19位) 字符型 char c1, c2; 1 0255 有符号字符型 signed char c3; 1 -128127,d 以带符号十进制整数输出 o 以八进制无符号整数输出(无前导0) x 以十六进制无符号整数输出(无前导0x) u 以十进制无符号整数输出 c 以字符形式输出单个字符 s 输出一个字符串 f 以小数形式输出浮点数(6位小数) e 以标准指数形式输出(6位小数) g 选用%f,%e中输出宽度较小的一种格式,printf格式字符,d 以带符号十进制形式输入整型数据 o 以八进制无符号形式输入(无前导0) x 以十六进制无符号形式输入(无前导0x) c 以字符形式输入单个字符 s 输入字符串,以非空字符开始,遇第一个 空白字符结束 f 以小数形式输入浮点数 e 以标准指数形式输入,scanf格式字符,字符输入输出函数,字符输出函数-putchar(ch) 输出一个字符ch 字符输入函数-getchar() 无参数 函数值为从输入设备接收的字符,字符串输入输出函数,字符串输出函数-puts(str) 输出一个字符串str 数组 或 指针 字符串输入函数-gets(str) 输入一个字符串str 数组 或 指针,字符输出函数 -fputc(ch,fp) 字符输入函数 -fgetc(fp),字符串输出函数 -fputs(str,fp) 字符串输入函数 -fgets(fp),C语言中的三大定律,表达式定律 任何能产生数值结果的运算、操作都可以作为表达式 并可以放到任何需要数值结果的地方,只要数值类型能够匹配 常见的可以产生数值结果的运算和操作 算术、逻辑、位运算等 ? :、&、* 等 有返回值的函数 赋值 常见的需要数值的地方有: 赋值 条件判断 函数调用,C语言中的三大定律,类型定律 任何类型都可以在任何需要类型的地方使用 用任何类型定义的变量都要占用内存 已知特例 函数返回值不能定义为数组类型 函数参数定义为数组类型,此时该参数不占用内存,而是共享函数调用者传入的数组空间 常用类型 基本数据类型、指针、数组、结构体 常见的需要类型的地方 定义变量 定义指针、数组和结构体 函数参数和返回值 sizeof,C语言中的三大定律,参数传递定律 函数调用时的参数传递永远都是传值调用,把实参的值拷贝给形参 实参:调用者提供的参数 形参:函数定义的参数 基本数据类型 Struct数据类型 指针作为参数时,把指针变量的内容(即其指向的内存地址)做了拷贝 数组名作为参数时,把它等同于指针看待了,分析题一:,1.在C语言程序中,xyz与Xyz是相同的变量,变量名的组成? 2. 变量的类型通常指_?_和 _?_。 3. 字符串的结束符为 什么?“n” 还是“0” ?。 4. 以下语句:int a=6; a+=a; printf(“%d”, a ); 输出结果?,5. C语言规定以_字符作为字符串结束标志。 6一个C语言程序是由若干个 组成的,每个文件是由若 干 组成的。 C语言可以包括多个函数,且程序总是从_开始执行。 函数只能有一个。 7. 在C语言中,二维数组元素在内存中的存放顺序是_。 8定义符号常量price为36的宏定义命令是 。,9. 字符串常量“abcd”在内存中的字节数是 ? 。,1. 已知: int b=2;, 下列各表达式的值不为5的是 ? b2?5:1 +b+2 b%2+(b=5) b+=3 2sizeof 运算符作用于一个表达式上,则是 - 。 不可能 求出该表达式的类型占内存的字节 求出该表达式的值 强制该表达式的类型,3. 对于下面程序段,执行的结果是?。 char str =” btn0fun0”; printf(“%d”, strlen(c) ); 15? 7? 4 字符串中有非法字符,输出值不确定?,4. 已知: int x=1, y=2; ,下列 表达式 中哪些是合法? x=10.5%2 ; x+=y+2; (x+y) ; +(-x); 5. 判断字符串s1是否大于字符串s2,写出相应的函数及表达式,C语句概述,语句是算法实现的程序表示,是算法实现的最小单位。 语句说明了一种行为,它是用计算语言编写的控制计算机完成确定操作的句子。,1) 表达式语句 4)复合语句 2) 函数调用语句 5) 空语句 3) 控制语句,构成程序的三种基本结构,顺序结构 选择结构 循环结构 已经证明,任何程序均可只用这三种结构综合描述 只用这三种结构编制的程序,叫结构化程序 程序必须符合结构化规则,与基本控制结构相应的结构化的控制语句 if-else switch for while do-while break continue 常用算法,如累加、累乘、统计、递推、迭代、穷举等,选择、循环结构,求阶乘: 数据类型的定义, float、 long或double 求累加和: long 统计: 统计正数、平均分以上、n个成绩中10090、8980、7970、6960、60的人数;输入字符串中字母d的个数 设置一个计数变量k:初始化为1,每遇到一次将其加1:k+;,编程计算 : 1+2+3+100=? 1! +2!+3! +100!=? 1+1/2+1/3+1/100=? 2+22+222+2222,分别用如下语句编程 while do-while for,累加的项较复杂时,得专门求,例: 前后项之间无关 1m+3m +5m +7m +. /4=1-1/3+1/5-1/7+.直到最后一项的绝对值小于10-6为止 前后项之间有关 1!+2!+.+n! x0+x1 +x2+x3+. 1+1+2+3+5+8+13+21+. 2/1+3/2+5/3+8/5+13/8+21/13+. a+aa+aaa+aaaa+aaaaa+a是一个数字,例a=2,2+22+222+2222+,流程的转移控制,break 语句 continue 语句 goto 语句 return 语句,有返回值的函数体内应加条_语句。 break; 输出函数调用语句:printf(”控制串”,参数表); return; contnuin;,数组(Array),int a10; 定义一个有10个元素的数组,每个元素的类型均为int 使用a0、a1、a2、a9这样的形式访问每个元素。它们与普通变量没有任何区别 系统会在内存分配连续的10个int空间给此数组 数组下标可以是整型表达式 直接对a的访问,就是访问此数组的首地址,a,a9,a8,a7,a1,a0,数组是一组共用同一个名字、具有一定顺序关系和相同数据类型的变量的集合。其中,共用的名字称作?,集合中的变量称为? 。,数组的定义与初始化,数组定义后的初值仍然是随机数,一般需要我们来初 始化 int a5 = 12, 34, 56 ,78 ,9 ; int a5 = 0 ; int a = 11, 22, 33, 44, 55 ; 数组大小最好用宏来定义,以适应未来可能的变化 #define SIZE 10 int aSIZE; 数组大小定义好后,将永远不变,数组的使用,数组的下标都是从0开始 对数组每个元素的使用与普通变量无异 可以用任意表达式作为下标,动态决定访问哪个元素 for (i=0; iSIZE; i+) ai = 2 * i; 下标越界是大忌! 使用大于最大下标的下标,将访问数组以外的空间。 那里的数据是未知的,可能带来严重后果 sizeof可以用来获得数组大小,只能逐个对数组元素进行操作(字符数组例外),输入方法:,int a10,i;,输入第i个数组元素:,scanf(“%d“ ,输入整个数组元素:,for (i=0;i10;i+) scanf(“%d“,输出方法:,输出第i个数组元素:,printf(“%d“,ai);,输出整个数组元素:,for (i=0;i10;i+) printf(“%d“,ai);,一维数组的输入和输出,二维数组的输入和输出,数组的输入和输出只能逐个对数组元素进行操作(字符数组例外),int a23,i,j;,即字符数组的初始化的两种形式:,用字符型数据对数组进行初始化 char str6 = C,h,i,n,a,0; char c = c, , p, r, o, g, r, a, m ; char str = C,h,i,n,a; 用字符串常量直接对数组初始化 char str6 = “China“; char str6 = “China“; char c = “C program “ ; 或去掉 写为: char c =“C program “ ;,字符逐个方式,字符串赋值方式, 0 是由C编译系统自动加上的。由于采用了 0标志,所以在用字符串赋初值时一般无须指定数组的长度, 而由系统自行处理。,字符串 处理函数,str1 = str2; /*错误*/ strcpy(str1,str2); /*正确*/ if (str1 str2) /*错误*/ if (strcmp(str1,str2) 0) /*正确*/,字符串不能直接整体复制! 也不能用关系运算符比较大小,注: str, str1, str2是字符数组名或字符型指针变量名,字符串处理函数: 头文件是 ,1. 数组元素在内存中是怎样 ?按顺序存放的。 2. 变量名为函数参数与数组名作函数参数有何不同? 3. 数组是一组共用同一个名字、具有一定顺序关系和相同数据 类型的变量的集合。其中,共用的名字称作 ,集合中 的变量称为 。 4. C语言的数组名是一个地址常量,不能对它进行加减和赋值 运算;而指针是把另一个变量的 作为其值的变量。,5要打印出以下的杨辉三角形(若打印出10行), 要求: 1 正确的定义一个数组: 1 1 1 2 1 给出虚线部分元素值的表达式 1 3 3 1 , 1 4 6 4 1 给出第i行第j列元素的表达式 1 5 10 10 5 1 ,6. 在下列对字符串的定义中,正确的有( )?。 char c 7 =“student“; char c = “ student “; char *c = “ student “; char c = s, t, u, d, e, n, t, 0 ;,7. 输出字符串 “ I am a student! ” 的语句有? #include”string.h” void main( ) chara =“ I am a student! “; int i; ,1) putchar(a); 2) puts(a); 3) for( i=0; ai!=0; i+) printf( “%c“,a i ); 4) printf(“%s“,a );,#include ,void main( ),int s;,float n, t, pi;,t = 1; pi = 0; n = 1.0; s = 1;,while( ( fabs(t) ) = 1E-6 ), pi = pi + t;,n = n + 2;,s = -s;,t = s/n;,pi = pi * 4;,printf(“pi=%10.6fn“, pi );,运行结果:pi=3.141397,#include ,程序:,#include “math.h“,Void main,(),int m, i, k;,scanf(“%d“, /* 输入一个整数m */,k = sqrt(m);,for( i=2; i=k; i+),if (m%i = 0) break;,if (i = k+1) printf(“%d 是素数n“, m );,else printf(“%d 不是素数n“, m );,运行结果: 17 17 is a prime number,数组这一章的应用,了解了在什么情况下使用数组这种数据类型 向函数传递一维数组和二维数组的方法 用数组名作为函数参数和用简单变量作为函数参数的不同之处 程序设计常用算法: 求最大值,排序,查找,统计,斐比数列的设计几种方法 逆序存放数据 回文问题,函数,C 中库函数按功能分类:,在计算机高级语言中,引入函数(或子程序、过程),称为标准函数,在C中称库函数。,函数 头文件 输入、输出函数 stdio.h 数学函数 math.h 字符和字符串函数 string.h 动态分配函数 malloc.h ,7. 在C语言中,使用putchar库函数,需要用include命令将头 文件_包含进来。 8. 何谓全局变量? 在主函数内定义?局部变量?,局部变量,局部变量 在语句块内定义的变量 形参也是局部变量 只能被定义它的函数内部所识别的变量称为_ 特点 定义时不会自动初始化,除非程序员指定初值 进入语句块时获得内存,仅能由语句块内语句访问,退出语句块时释放内存,不再有效 并列语句块各自定义的同名变量互不干扰,全局变量,全局变量 在所有函数之外定义的变量 特点 在程序中定义它的位置以后都有效 在定义点之前或在其他文件中引用,应该进行如下声明: extern 类型名 变量名; 从程序运行起即占据内存,程序运行过程中可随时访问,程序退出时释放内存 使函数之间的数据交换更容易,也更高效 但是并不推荐使用,尽量少用 因为谁都可以改写全局变量,所以很难确定是谁改写了它,自动变量 (auto ),“自动”体现在 进入语句块时自动申请内存,退出时自动释放内存 标准定义格式 auto 类型名 变量名; 动态局部变量 缺省的存储类型 不初始化时,值是不确定的,静态变量(static),一般的内部变量 在函数退出后失效,再次进入函数,变量值重新初始化 静态变量 在变量类型前面用static修饰 static int i; 变量的值可以保存到下次进入函数,使函数具有记忆功能,寄存器变量(register),寄存器 CPU的内部容量很有限、但速度极快的存储器 使用频率比较高的变量声明为register ,可以使程序更小、执行速度更快 register 类型名 变量名; register int i; 现代编译器有能力自动把普通变量优化为寄存器变量,并且可以忽略用户的指定,所以一般无需特别声明变量为register,1. C语言中变量的存储类别有自动(auto)、静态(static)、寄存 器(register) 和外部(extern) 四种类型,其中形参变量的默 认类型是 。 2. 只能被定义它的函数内部所识别的变量称为 。,3. 实参与其对应的形参的特征是? 4. 当变量名为函数参数,在函数调用时, 形参是虚拟的,不占存储单元 实参与其对应的形参共占同一个存储单元; 只有当实参与其对应的形参同名时,才共占同一个存储单元; ,#include int Average(int x, int y); /*声明Average()函数*/ main() int a = 12; int b = 24; int ave; ave = Average(a, b); printf(“Average of %d and %d is %d.n“, a, b, ave); /* 函数功能: 计算平均数 函数入口参数: 整型x,存储第一个运算数 整型y,存储第二个运算数 函数返回值: 平均数 */ int Average(int x, int y) int result; result = (x + y) / 2; return result; ,调用函数在前, 定义函数在后,另:float average (float array10) int ; float aver,sumarray0; for ( i1;i10;i+) ; /* 求总分之和*/ aver sum10; return(aver); ,例如:#define N 5 long fac(int n) long f=1; f=f*n; return(f); main( ) int i; for (i=1; i=N; i+) printf(“%d! = %ld n”, i, fac(i) ); ,运行结果:1!=1 2!=2 3!=3 4!=4 5!=5,运行结果: 1!=1 2!=2 3!=6 4!=24 5!=120,在语言中,允许用一个变量来存放指针,这种变量称为指针变量。因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。,指针与指针变量 指针:一个变量的地址 指针变量:声明为指针类型的变量,专门存放变量地址的变量即专门存放地址数据的变量,指针(Pointer)的概念,指针也是一种数据类型,定义一个指针变量,对指针变量的定义包括三个内容: (1) 指针类型说明,即定义变量为一个指针变量; (2) 指针变量名; (3) 变量值(指针)所指向的变量的数据类型。 其一般形式为: 类型说明符 *变量名; int *p1 *表示这是一个指针变量,变量名即为定义的指针变量名,类型说明符表示本指针变量所指向的变量的数据类型。,p1究竟指向哪一个整型变量,应由向p1赋予的地址来决定。,如何定义指针变量?,指针变量初始化 p = *p就像普通的变量一样使用,其值是p指向的内存的内容(在上例和a等价,但寻址方式不同) p可以动态(任意)地指向不同内存,从而使*p代表不同的变量 (指针变量的赋值只能赋予地址, 决不能赋予任何其它数据(除0以外),否则将引起错误。在语言中,变量的地址是由编译系统分配的。) 两个有关的运算符: &与*操作符 1) &: 取地址运算符 2) *:指针运算符(或称“间接访问” 运算符),例如: int a10; /*定义a为包含10个整型数据的数组*/ int *p; /*定义p为指向整型变量的指针*/ 下面是对指针变量赋值: p= 即p指向a数组的第0号元素,p,a,&a0均指向同一单元,它们是数组a的首地址,也是0号元素a0的首地址。 但p是变量, 而a、&a0都是常量。,二、通过指针引用数组元素,C语言规定:如果指针变量 p 已指向数组中的一个元素,则 p+1 指向同一数组中的下一个元素。 引入指针变量后,就可以用两 种方法来访问数组元素了。 如果p的初值为&a0,则: 1) p+i和a+i就是ai的地址, 或者说它们指向a数组的第i个 元素。,2) *(p+i)或*(a+i)就是p+i或a+i所指向的数组元素,即ai。 例如: *(p+5) 或 *(a+5) - a5 3) 指向数组的指针变量也可以带下标, 如 pi 与 *(p+i ),等价,等价,字符串与字符数组、字符指针,C语言并没有为字符串提供任何专门的表示法,完全使用字符数组和字符指针来处理 字符串 一串以0结尾的字符 字符数组 每个元素都是字符类型的数组 char string100; 字符指针 指向字符类型的指针 char *p; 数组和指针虽不同,介可以等同看待,上面三者本质上是一回事,字符指针变量与字符数组的区别,定义方法不同 char str10; char *ptr; 赋值方法不同 char str10; str = ”china”; /*错误*/ strcpy(str, ”china”);/*正确*/ 字符指针是变量,而数组名是地址常量,char *ptr; ptr = ”china”;,输入输出数组的全部元素,main() int a10; int i; for (i=0; i10; i+) scanf(“%d“, ,方法1:下标法,main() int a10; int *p, i; for (p=a; p(a+10); p+) scanf(“%d“, p); for (p=a; p(a+10); p+) printf(“%d “, *p); ,方法2:指针法,问题:若没有第二个 p=a,情况会怎么样?,例 将字符串a复制到字符串b。见书(用指针处理或不用指针皆可),void main,(),char a =“Iam a boy.“, b20, *p1, *p2;,int i;,p1 = a; p2 = b;,for(; *p1 != 0; p1+, p2+),*p2 = *p1;,*p2 = 0;,printf( “string a is: %sn”, a );,printf(“string b is:” );,for( i=0; b i !=0; i+),printf(“%c“, b i );,printf(“n“);,3、若定义 int k =1, 2, 3 ,4, 5, *pk=k; 下列对数组元素 的引用中错误的是 ? k3 *(k+3) *(pk+3) +pk,1、设int a, *p;则语句p= 的输出结果为 ? 。 无确定值 a的地址 512 511,5、由指针和结构体构成的单向链表是一种重要的数据结构,它 便于实现动态 存储分配。( ),4、设float a34= 1,2,3,4, 5,6,7,8,9,10,11,12 ; 则 *(a0+1), *(a1+2), *(*a+1) 的值为_。,6. 指针:是一种变量 /指针的类型是它所指向的变量的类型 /指针在内存中有一个单元空间 /指针占内存空间的大小与它的类型有关吗? /指针运算实际是地址运算,指针加1就是实际的地址值 加1 吗? 7. 设 struct student int no; char name12; float score3; s1, *p=,9、在C程序中有如下语句:float *sum(int x,char y); 它是 ( ) 。 对函数sum的定义。 对函数sum的调用。 对函数sum的原型说明。 不合法的。,10若有 Char text = “ABCDEFG”, *p=text; , 则表达式 *(p+7)的值是【 】。 G 0 G 不确定 11设有以下一程序段: main() int *p, *pa, a=100; pa= 执行上面的程序段后,上面的程序的输出结果是【 】。 100 pa的地址 a的地址 运行错误,12若有以下定义和语句,则通过指针p对值为8的数组元素的引用的表达式是 。 int a10=1, 2, 3, 4, 5, 6, 7, 8, 9 , *p; p= 13C语言的数组名是一个地址常量,不能对它进行加减和赋值运算;而指针是把另一个变量的 作为其值的变量。,有关指针的数据类型 和指针运算的小结,一、有关指针的数据类型的小结,二、指针运算小结 1、指针变量加/减运算 p+、p-、p+i、p-i、p+

温馨提示

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

评论

0/150

提交评论