C程序设计复习要点.ppt

上传人:za****8 文档编号:15799117 上传时间:2020-09-06 格式:PPT 页数:88 大小:410.05KB
返回 下载 相关 举报
C程序设计复习要点.ppt_第1页
第1页 / 共88页
C程序设计复习要点.ppt_第2页
第2页 / 共88页
C程序设计复习要点.ppt_第3页
第3页 / 共88页
点击查看更多>>
资源描述
C程序设计技术复习要点,一基本概念部分,C语言的基本概念(数据类型,常量,变量,表达式的书写方法等) 当两个整数相除时,得到的结果仍然是整数。既取整运算。例如:7/5结果为1,-7/5结果为-1,3/5结果为0. 求模运算就是求余数,参加求模运算的两个对象必须都是整型对象,运算结果的符号与第一个运算对象相同。例如:7%5结果为2,-7%5结果为-2,7%(-5)=2。,优先级高 ( ) 函数 +、- *、/、% +、- 优先级低,典型运算符的使用(+,-,复合赋值等) 复合赋值符:凡是双目运算符都可以与赋值运算符一起组成复合赋值符,其结合性为右结合性。这些复合赋值符共有10个,它们是: +=、-=、*=、/=、%=、=、 例如:5=5/*结果为1*/ 10=10/*结果为1*/ 5!=5/*结果为0*/ 53/*结果为1*/ 35/*结果为0*/,例2-1 关系运算示例。,该程序运行执行语句c=5-1=a+2=a+2=和=结合,即先计算表达式5-1=a+2得到结果0,然后计算表达式0=b-21的结果也为0,最后将该0值赋值给变量c。 所以,该程序运行的输出结果为:c=0,对逻辑表达式从左到右扫描求解; 在逻辑表达式的求解过程中,任何时候只要逻辑 表达式的值已经可以确定,则求解过程不再进行。,例如有定义:int a=1,b=2,c=0;,则逻辑表达式a+|b+ ch=getchar(); putchar(ch); ,要特别注意各控制结构的流程,2.2.6 switch语句与程序的多分支结构,switch(expession) case constand1:sentences1; break; case constand2:sentences2; break; case constandN:sentencesN; break; default:sentencesN+1 ,2)执行过程:,首先,对作为条件的表达式(expression)求值; 然后,在语句结构的花括号内从上至下查找所有的case分支,当找到与条件表达式值相匹配的case时,将其作为控制流程执行的入口,并从此处开始执行相应的语句段,直到遇到break语句或者是switch语句结构的右花括号“”为止。,switch(number) case 1: statement1; case 2: statement2; case 3: statement3; default: statement4; statement5;,2,习题:P84页,一、 6. For (i=1;i+4;);后,循环控制变量i的值是?,要特别注意该题,分析该题;理解该题的考点!,特别注意+,-运算符进入条件表达式!,数组的定义和数组元素的访问,例3-3 用数组存放一组统计数据,然后用“*”表示的条形图输出这组数据。程序输出效果如下所示: Element Value Striation 1 11 * 2 3 * 3 7 * 4 10 * 5 20 * 例3-4 打印如下所示的杨辉三角形的前10行(要求使用一维数组处理),例3-5 在二维数组a34中依次选出各行最大元素值存入一维数组b3对应元素中。 程序运行结果: array a: 3 16 87 65 4 32 11 108 10 25 12 27 array b: 87 108 27,3.3.2 常用排序方法3.3.3 常用查找方法,例3-9 编程序实现冒泡排序算法,对随机生成的20个整数按升序进行排序并输出。 上面程序中用变量flag作为标志,每一趟排序开始时将其设置为0,当本趟排序过程中有数据交换时将flag设置为1,表示数据还没有排序完成;当本趟排序过程中没有一次数据交换时,flag保持为0值,表示被排序的数据已经完全满足排序的要求,没有必要再继续进行以后的排序过程,程序中用break语句退出排序循环。 程序的一次执行结果为: Before sorting . 293 31 365 849 867 166 487 826 487 775 331 630 294 5 242 136 953 123 849 65 After sorting . 5 31 65 123 136 166 242 293 294 331 365 487 487 630 775 826 849 849 867 953,例3-10 编程序实现选择排序算法,对随机生成的20个整数按升序进行排序并输出。 程序的一次运行结果为: Before sorting . 341 74 545 498 809 626 913 433 567 560 130 479 505 95 96 143 851 634 830 665 After sorting . 74 95 96 130 143 341 433 479 498 505 545 560 567 626 634 665 809 830 851 913,1顺序查找(Linear search) 顺序查找又称为线性查找。其基本过程是:从待查表中的第一个记录开始,将给定的关键字值与表中每一个记录的关键字值逐个进行比较。如果找到相符合的记录时,查找成功,如果查找到标得末端都未找到相符合的记录时,查找失败。顺序查找法适应于被查找集合无序的场合。 例3-11 编程序实现顺序查找算法,在随机生成的20个整数中查找指定值,要求程序能够显示出查找进行比较的次数以及本次查找成功与否。 程序的一次运行结果为: 请输入被查找的整数值: 43 被查找数据集合如下. 15 5 70 43 64 17 10 4 58 96 39 51 5 51 67 0 49 56 12 12 查找43成功,共进行了4次比较。,例3-12 编程序实现折半查找算法,在随机生成的20个整数中查找指定值,要求程序能够显示出查找进行比较的次数以及本次查找成功与否。 程序中首先输出随机产生、未经排序的查找数据集合,执行结果中用数组元素形式显示出来的是排序后与查找关键字key值相同的元素。 程序的一次执行结果如下所示: 下面是未排序的查找数据集合. 41 28 91 83 86 62 96 93 41 57 79 47 12 94 36 34 56 36 2 97 请输入被查找的关键字值: 91 查找a15成功,共进行了4次比较。,函数的定义,声明和调用,C程序的一般结构,宏代换(不带参,带参),宏定义分为代参数的宏定义和不代参数的宏定义两种。 1不代参数的宏定义 不代参数的宏定义编译预处理语句的一般形式是: #define 宏标识符 字符串 宏调用的格式为: 宏标识符 宏调用的作用是:在宏定义的作用范围之内,将所有的宏标识符用指定的字符串替换。式中,宏标识符也称为宏名或常量标识符,习惯上使用大写字母书写。,在C程序的设计中,正确地理解宏定义的关键在于理解宏调用仅仅就是一个替换而不会进行任何的合并、计算等等操作。在阅读理解包含宏调用问题的C程序时一定要做到先将宏替换完成、然后操作宏替换完成后的表达式,例4.25 宏调用替换问题的理解示例。 /* Name: ex04-25.cpp */ #include #define N 2 #define M N+2 #define MN 2*M void main() int x=MN; printf(x=%dn,x); ,错误的理解方式是:N2、M4(2+2)、MN8(2*4),从而认为上面程序的输出结果是x=8。 正确理解的方式应为:MN2*N+2、MN2*2+2,因而程序执行的正确结果:x=6。,带参数的宏定义 在C程序设计过程中如果有需要,也可以使用带参数的宏定义。定义代参数的宏定义的一般形式如下: #define 宏标识符(形参表) 表达式样式字符串 宏调用的格式为: 宏标识符(实参表) 宏调用的作用是:在宏定义的作用范围之内,将所有的宏标识符用指定的表达式样式字符串替换,然后用宏调用中的实际参数代替通过替换形成的表达式中的形式参数。,在程序设计中使用带参数宏定义时,为了避免当实际参数本身是表达式时引起的宏调用错误,在定义代参数的宏定义时最好将宏定义中表达式的形式参数用括号括起来,下面的例4.26展示了这方面的问题。,例4.26 代参数宏定义使用示例(不能正确处理表达式样式实际参数)。 /* Name: ex04-26.cpp */ #include #define PI 3.145926 #define S(r) PI*r*r void main() double a,b,area1,area2; a=3.3; b=3.2; area1=S(a); area2=S(a+b); printf(area1=%fnarea2=%fn,area1,area2); ,例4.27 宏调用替换问题的理解示例。 /* Name: ex04-27.cpp */ #include #define Min(x,y) (x)(y)?(x):(y) void main() int a=1,b=2,c=3,d=4,t; t=Min(a+b,c+d)*1000; printf(t=%dn,t); 正确结果为:t=3,返回指针函数和指向函数指针的定义和简单应用,例5-1编程序计算下面公式,其中n从键盘输入,并要求在程序中使用指向函数的指针变量。,结合”关于指针的复习PPT”复习,求解高阶方程的根 在对高阶方程的讨论中知道,高阶方程都是类似的,其形式可 以用f(x)=0来表示,也就是说被求根的函数用C语言都可表示 成为如下所示结构C函数: double f(double x) 因而指向被求根函数的指针变量的一般形式为: double (*fp)(double x); 对于使用牛顿迭代法的通用求根函数而言,在函数的参数表中 应该包含三个形式参数:一个是求根时指定的根的初始值,另 外两个是用于接受外界传递进来的函数实参以及导函数实参的指向函数的 指针变量。 例5-2 二分法求高阶方程根的通用函数 。 例5-3 利用已有的通用函数按给定条件求下面高阶方程的根。,指向函数的指针与函数型参数的实现 被积函数的形式均为有一个实型自变量且所积结果是实型数据,所以在求定积分的通用函数的返回值数据类型应为double,通用函数的参数有下面四个: 与被积函数对应的指向函数的指针: double (*p)(float x) 积分区间的下限:float a 积分区间的上限:float b 按精度所需的积分区间等分数:int n,函数与指针,返回指针值的函数,例5-6 求,#include long *fac(long nvoid main() long n,i,sum=0,*pi; printf(Input n: ); for(i=1;i=n;i+) sum+=*fac(i); scanf(%ld,i+) pi=fac(i,sum=sum+*pi; printf(Sun=%ldn,sum long *fac(long n)/函数的定义 static long p=1; p*=n; return ,用指针引用数组元素的方式,结合“关于指针复习.ppt”复习!,二重点知识点,整型数据的拆分以及特定数码的统计,注意模运算及如何提取一个整型数据的每一位,字符串的常见操作(在字符串中删除指定字符,统计字符串中的特定字符功能的实现),在字符串中删除指定的字符 在字符串中删除指定字符操作的基本思想是:首先在字符串中查找指定字符的位置,若找到则将字符串中自该位置以后所有字符依次向前移动一个字符位置即可。 例7-18 函数原型为:void deletechr(char s, char c);,其功能是在字符串中删除指定字符,若指定字符不存在则显示相应提示信息。请编制该函数并用相应主函数进行测试。,字符串中字符的查找 所谓字符串中字符的查找就是按照指定的方向寻找指定字符第一次在字符串中出现的位置。在字符串中查找指定的字符从查找方向上可以分为正向查找(从串首部至串尾)和反向查找(从串尾部至串首),从获取被查找字符位置信息上可以分为返回下标序号方式和返回字符存放地址方式。,统计字符串中的特定字符的个数时,需要先查找到特定字符,然后计数,字符串中正向查找指定字符 在字符串中正向查找指定字符第一次出现位置的基本思想是:从被操作字符串的第一个字符开始循环依次取出被操作字符串当前位置的字符与指定的字符相比较,若比较相符合则返回该字符的位置;否则进行下一轮比较直到被处理的字符串中所有字符取完为止。 例7-13 编制函数实现功能:在字符串中正向查找指定的字符,若被查找字符存在则返回字符在字符串中的下标序号;若指定的字符在被查找的字符串中不存在,则返回-1;并用相应主函数进行测试。 例7-14 编程序实现功能:利用上面设计的字符查找函数求两个字符串中共同具有的字符并将这些字符组成第三个字符串,注意相同字符只能取一次。 例7-15 重写例7.14程序,要求使用标准库函数strchr在字符串中查找指定字符。,字符串中反向查找指定字符 在字符串中反向查找指定字符第一次出现位置的基本思想是:从被操作字符串的最后一个字符开始循环依次取出被操作字符串当前位置的字符与指定的字符相比较,若比较相符合则返回该字符的位置;否则进行下一轮比较直到被处理的字符串中所有字符取完为止。 例7-16 编制函数实现功能:在字符串中反向查找指定的字符,若被查找字符存在则返回字符在字符串中的下标序号;若指定的字符在被查找的字符串中不存在,则返回-1;并用相应主函数进行测试。,函数的指针参数(利用指针参数返回多个值),结合”关于指针复习.ppt”复习,数组的定义,初始化,数组元素的引用;数组做函数的参数使用方法,在C程序设计中,既可以用数组的元素作为函数的参数,也可以将数组看成一个整体作为函数的参数。使用数组元素作为参数传递,其用法都与普通变量用法一样,实现的是函数间的传值调用。,/*Name: ex04-07.cpp*/ #include #include #include #define N 5 void main() void myprint(int x); int aN,bNN,i,j; srand(time(NULL); printf(下面是数组a的数据.n); for(i=0;iN;i+) ai=rand()%100; myprint(ai); ,printf(n下面是数组b的数据.n); for(i=0;iN;i+) for(j=0;jN;j+) bij=rand()%100; myprint(bij); printf(n); void myprint(int x) printf(%4d,x); ,将数组看成一个整体作为函数参数时,用数组名作为函数的形式参数或实际参数,实现的是函数间的传地址值调用,下面分别讨论一维数组和二维数组作为函数参数的问题。,数组参数传递函数调用,1一维数组名作为函数参数实现的是“传地址值调用”,其本质是将它的全部存储区域或者部分存储区域提供给形式参数数组共享,即形参数组与实参数组是同一存储区域或者形参数组是实参数组存储区域的一部分。 存储关系如下图:,需要把实参数组中从某个元素值后的部分传递给被调函数中的形参数组,则使用实参数组某个元素的地址(参见4.7)。,例4.8 编制求和函数并通过该函数求数组的元素值和。,int sum(int v,int n) int i,s=0; for(i=0;in;i+) s+=vi; return s; ,/* Name:ex04-08.cpp */ #include #define N 10 void main() int sum(int v,int n); int aN=1,2,3,4,5,6,7,8,9,10,total; total=sum(a,N); printf(total=%ldn,total); ,例4.9 编制求和函数并通过该函数求数组自某一元素后的所有元素值和,起始点元素序号从键盘上输入。,/* Name:ex04-09.cpp */ #include #define N 10 void main() int sum(int v,int n); int aN=1,2,3,4,5,6,7,8,9,10,total,pos; printf(请输入求和起始元素序号: ); scanf(%d, ,int sum(int v,int n) int i,s=0; for(i=0;in;i+) s+=vi; return s; ,比较例4.8和例4.9的程序,可以发现函数sum没有任何改变,程序中有所改变的是主调函数中的调用表达式:sum( int aMN=38,23,56,9,56,2,789,45,76,7,45,34; printf(Max value is:%dn,max(a); ,int max(int vN)/注意数组参数只能省略最高为的长度指定 int i,j,maxv; maxv=v00; for(i=0;imaxv) maxv=vij; return maxv; ,(1)用二维数组名字作为实际参数 实参用a,形参用b5图4.9 实际参数为二维数组名字,用二维数组名作为函数参数实现的是“传地址值调用”,其本质仍然是在函数调用期间实际参数数组将它的全部存储区域提供给形式参数数组共享,即形参数组与实参数组是同一存储区域。,例4.10程序的函数max中使用了二维数组样式的形式参数接收从主调函数中传递过来的二维数组首地址,使得形参数组v共享实参数组a的存储区域;然后通过对形参数组v的操作达到操作是参数a的目的,即在形参数数组v中寻找最大值实质上是在实参数组a中寻找最大值,程序执行的结果为:Max value is:789。,(2)用二维数组起始地址的一级地址形式作为实际参数 在实际计算机应用的程序设计中有时需要能够处理任意行列大小的二维数组的函数(例如要求上例中的函数max能够查找任意二维数组中的最大元素),此时直接用二维数组作为形式参数的设计形式就不太适合。,为了编制较通用的函数,可以借助一维数组作为形式参数时可以不指定长度的特点,使用一维数组样式的形式参数接收二维数组实参,数组存储区域全部共享或部分共享时形参数组与实参数组的关系如图4.10所示。,在实现这种参数传递时还须注意以下两点: 函数调用时的实际参数必须是一级地址形式(参见图4.8中列出的3种以及地址方式),同时将二维数组的行数和列数传递到被调函数中。 由于在被调函数中只知道被处理得二维数组的起始地址,所以在处理过程中二维数组每一行的长度由程序员根据参数表中传递过来信息自己控制。,例4.11 重新编制例4.10中的函数max,使其能够处理任意行列的二维数组。 /* Name: ex04-11.cpp */ #include #define M 3 #define N 4 void main() int max(int v,int m,int n); int aMN=38,23,56,9,56,2,789,45,76,7,45,34; printf(Max value is:%dn,max(a0,M,N); ,int max(int v,int m,int n) int i,j,maxv; maxv=v0; for(i=0;imaxv) maxv=vi*n+j; return maxv; ,程序中函数max用一维数组样式的形式参数v来接收从主调函数中传递过来的二维数组首地址,注意到二维数组的名字表示的是二级地址,所以被传递的二维数组的首地址不能直接用二维数组名表示而应该使用3种一级地址形式,本示例中使用的是a0,还可以使用、f1=f2;、f2=f3;,反复使用该语句序列就能够求出所要求的裴波那契数列。,例2-30 用牛顿迭代法求方程x4-4x3+6x2-8x-8=0在0附近的根。,例2-31 用二分迭代法求方程2x3-4x2+3x-6=0在(-10,10)之间的根。,例2-32 用割线法求方程2x3-4x2+3x-6=0在(-10,10)之间的根。,函数的递归调用,一个函数直接地或间接地自己调用自己,称为函数的递归调用。函数的递归调用可以看成是一种特殊的函数嵌套调用,它与一般的嵌套调用相比较有几个不同的特点: (1)递归调用中每次嵌套调用的函数都是该函数本身; (2)递归调用不会无限制进行下去,即这种特殊的自己对自己的嵌套调用总会在某种条件下结束。,例4.14 编程序使用递归方式求n!。 /* Name: ex04-14.cpp */ #include void main() long fac(long n); long n,result; printf(Input the n: ); scanf(%ld, ,fac(5)等于120,执行如下:,递归是程序设计中一种非常重要的技术,与程序设计中其它控制方法策略相比较,递归程序设计的难度在于递归在人类社会的现实生活中没有直接对应的概念存在,而必须通过推理分析才能理解递归思想进而实现递归程序设计。在实际设计递归函数程序时,我们可以将重点放在分析递推公式和递归终止条件上,可以忽略系统的具体执行过程,只要算法和递推公式正确,结论一定是正确的。,递归的实质是一种简化复杂问题求解的方法,它将问题逐步简化直至趋于已知条件。在简化的过程中必须保证问题的性质不发生变化,即在简化的过程中必须保证两点:一是问题简化后具有同样的形式;二是问题简化后必须趋于比原问题简单一些。具体使用递归技术时,必须能够将问题简化分解为递归方程(即问题的形式)和递归结束条件(即最简单的解)两个部分。如例4.14求n的阶乘,可以分解得到递归方程:n*(n-1)!和递归结束条件:n=1 时阶乘为1。,例4.16 编程序用递归方法求两个正整数的最大公约数。 可以分析得出如下递归关系:,/*Name: ex04-16.cpp*/ #include void main() int Gcd(int m,int n); int num1,num2; printf(请输入两个正整数: ); scanf(%d,%d, ,int Gcd(int m,int n) int r; if(r=m%n)=0) return n; else return Gcd(n,r); ,通过上面两个示例的分析,递归方式的实现也是基于语言的条件控制结构。递归函数设计的基本框架是相对固定的,其一般形式可以描述如下: if 递归结束条件成立 Return 已知结果 else 将问题转化为同性质的较简单子问题; 以递归方式求解子问题(递归方程);,例4.15 求菲波拉契数列。已知一对小兔出生一个月后变成一对成兔,两个月后这对成兔就会生出一对小兔,三个月后这对成兔将生出第二对小兔,而第一对小兔又长大变成一对成兔,即一月成熟,二月生育,如此类推。请用计算机求解一对小兔经n月后将繁衍成多少对兔子?,可以分析出如下递归关系: 按照上面分析得到的递归方程和结束条件,求菲波拉契数列的递归算法可以设计为如图4.13所示。,/*Name: ex04-15.cpp*/ #include void main() int m; float fib(int n); printf(请输入月份数); scanf(%d, ,全局变量和局部静态变量的简单使用,1全局变量 所谓全局变量,是指定义在C程序中所有函数外部的变量,全局变量也称为外部变量。C程序中全局变量的作用域(作用范围)从其在源程序文件中定义处开始到其所在的源程序文件结束为止。C语言中全局变量定义的一般形式如下: extern 变量表; 在全局变量的定义形式中,关键字extern类型符是C语言中全局变量默认的存储类型,在定义全局变量时一般将其省略。在C程序中,如果对于全局变量使用了关键字extern,目的是对程序中定义的全局变量进行重新声明,这种声明方法的意义和使用方法牵涉到多源程序文件C程序,将在4.5节中予以讨论。在定义全局变量时,也可以对其进行初始化工作。如果在定义全局变量时没有显式初始化,C的编译系统会自动将其初始化为0(若是字符类数据则初始化为0)。,例4.18 全局变量的作用域示例(为了讨论方便加上行号)。 1/* Name: ex04-18.cpp */ 2#include 3void increa(); 4void increb(); 5int x; 6void main() 7x+; 8increa(); 9increb(); 10printf(x=%dn,x); 11 12void increa() 13 14x+=5; 15 16void increb() 17 18x-=2; 19,程序在第5行定义了整型变量,由于变量x定义在所有函数的外面,所以变量x是全局变量,其作用范围(作用域)从第5行开始至第19行结束。同时由于在定义全局变量x时没有对其显式初该程序运行的结果为:x=4。,3同名全局变量与局部变量作用域重叠问题 在C程序中,全局变量与局部变量的作用域有可能出现重叠的情形。即在某些特定的情况下,可能会出现全局变量、在函数内部定义的局部变量乃至于在复合语句中定义的局部变量名字相同的现象,这样在程序中的某些区域内势必会出现若干个同名变量都起作用的情形.,静态局部变量定义的一般形式是: static 变量表; 在C语言中,静态局部变量具有如下特点: 静态局部变量的存储位置。 编译系统在编译时就为静态局部变量在系统静态存储区域中分配存储空间,静态局部变量的存储空间在程序的整个运行期间是固定的。因而静态局部变量的生存期是整个程序的运行周期。 静态局部变量的初始化。 静态局部变量的初始化是在源程序被编译时进行的。如果在定义静态局部变量时没有对它进行显式的初始化,编译系统会自动将其初始化为0(若是字符类数据则初始化为0)。,静态局部变量的作用域(作用范围)。 静态局部变量也是局部变量,它的值也只能定义它的局部范围内使用,即静态局部变量作用域界定方法与自动局部变量作用域的界定方法是相同的。离开静态局部变量的作用域后,该静态局部变量虽然存在,但不能对它进行访问(操作)。 静态局部变量具有继承性。 在某个函数中定义的静态局部变量值在函数的多次调用中具有可继承性,即对于某函数中的静态局部变量而言,在函数被多次调用时该静态变量是同一变量。,例4.23 静态局部变量与自动变量的比较示例(为了讨论方便加上行号)。 1/* Name: ex04-23.cpp */ 2#include 3void main() 4void f1(); 5f1(); 6f1(); 7 8void f1() 9int a=10; 10static int b=10; 11a+=100; 12b+=100; 13printf(a=%d,b=%dn,a,b); 14,上面程序的f1函数中,在第9行定义了自动变量a,初始值为10;在第10行定义了静态局部变量b,初始值为10。程序在执行时,第5行第一次调用函数f1,此时系统会为自动变量a分配存储(即创建该变量)并初始化为10;对于静态局部变量b而言,在程序编译时就分配了存储,即此时该变量已经是存在的;第11行和第12行分别对变量a和变量b增加值100,使得变量a和b的值都为110,程序输出:a=110,b=110;输入完结果后函数f1执行完成,程序的控制流程返回到主函数中的第6行,注意此时在函数f1中定义的变量a被系统自动撤销;根据静态局部变量的特点,变量b仍然存在,但由于此时控制流程在主函数中,已经离开了静态局部变量b的作用域,所以静态局部变量b虽然存在但在主函数不能使用。程序在第6行第二次调用了函数f1,对于自动变量a系统重新为其分配存储(即重新创建该变量)并初始化为10,但对于静态局部变量b则不会重新创建,使用的就是上一次调用时使用的变量b(此时变量b的值为上一次操作后的结果110);所以在第二次f1函数的调用中程序输出的结果为:a=110,b=210。,数组,指针数组,二级指针变量的结合使用,结合“关于指针复习.ppt”和”指针与数组复习(教材).ppt”复习,结构体变量做函数参数以及结构体变量的引用形式,例8-5 结构体变量引用和输入输出示例。,结构体变量作为函数参数 结构体类型变量可以作为函数的参数在函数之间进行传递。使用结构体类型变量作为函数参数时,数据的传递仍然是“值传递方式”; 实现方式:函数调用时系统为形参变量开辟一段内存单元(按照结构体变量所需要的存储单元数)以存放从实参传递过去的各结构体变量成员分量的值。 例8-6 结构体变量作为函数参数使用示例。,文件的简单应用(统计指定数据,写入和读出指定数据,查询特定的数据和文本行等),例9-5 编程序实现统计文本文件中单词个数的功能,要求被统计文件名从命令行上带入。,FILE *fp; int count=0;/*记录单词的个数*/ int space=1;/*空格标志*/ char c; if(argc!=2) printf(Using: command filenamen); return; if(fp=fopen(argv1,r)=NULL) printf(不能打开文件%sn,argv1); return; ,while(c=fgetc(fp)!=EOF) switch(c) case : case t: case n:space=1; break; default: if(space) space=0;count+; fclose(fp); printf(文件%s中含有%d个单词。n,argv1,count);,空白字符(空格键、制表键以及换行符),例9-7 按每次读入一行的方式读入例9.1的源程序文件,并在屏幕上显示其内容。,FILE *fp; char str100; if(fp=fopen(Ex09-01.cpp,r)=NULL) printf(Cannot open file.n); return; while(fgets(str,100,fp)!=NULL) printf(%s,str); fclose(fp);,例9-9 以10度为间隔,求出0360度之间的所有正弦函数值、余弦函数值并将它们写入指定文件,然后再将这些数据读出并显示到屏幕上。,for(dec=0;dec=90;dec+=10) x=dec*3.14159/180; fprintf(f,%5d: %f,%fn,dec,sin(x),cos(x); for(i=0;i=9;i+) fscanf(f,%d: %lf,%lf, ,例9-10 将某磁盘文件的所有行加上行号写入指定文件,两个文件的名字均从命令行带入。,if(fp1=fopen(argv1,r)=NULL) printf(Cant open file.n); return; if(fp2=fopen(argv2,w)=NULL) printf(Cant create file.n); return; line=1; while(fgets(buffer,SIZE,fp1)!=NULL) fprintf(fp2,%4d:%s,line+,buffer);,
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!