1、哥德巴赫猜想任意一个大偶数(=4)都可以拆成两个素数之和。【题目:任意读入一个大偶数=6,然后输出被拆成的两个素数。】/*主函数拆分,子函数判断素数*/int PDSS(x)long x;/*与主函数的同名*/int flag=1; long k; for(k=3;k=x-1;k=k+2) if(x%k=0)flag=0;break; return(flag);main()long x; long s1,s2; do%ldx); while(x6|x%2!=0); s1=3; s2=x-s1; while(!PDSS(s1)|!PDSS(s2) s1=s1+2; s2=s2-2;%ld=%ld
2、+%ldn,x,s1,s2);三、自定义子函数的使用说明1、主、子函数的书写不分前后,但是当被调函数书写在主调函数的后面且返回值不为整型int时,必须在主调函数的说明部分(或在函数体外加以说明)对被调函数加以说明:【格式】返回类型名 函数名( );2、主函数一般做主调函数(即使带参数,也只能自己调用自己),子函数通常做被调函数,但也可以做主调函数,调用别的子函数或自己。3、程序的执行总是从主函数到主函数结束,除非遇到exit函数语句。4、return语句的格式:return(表达式);return 表达式 ;格式三:return;【功能】格式一与格式二的功能完全相同:将表达式的值(一个值)带回
3、到主调函数的调用点,且立即终止所在函数的执行。格式三只能终止所在函数的执行并返回主调函数的调用点,但不带回值(因此很少用,通常可以省略)。四、实参与形参之间的关系1、实参和形参在个数、类型、顺序上一一对应一致。2、实参总是单向地传值给形参:传的值有两种(内容或地址),一般,传内容时常常简称“值传递”,传地址时简称“地址传递”。3、实参可以是常量、变量(通常有值)、表达式;形参通常是变量。五、参数的地址传递例1:任意读入两个数,调用函数求得二者的和与积。float x,y,h,j; void HJ();%f%f HJ(x,y,&h,&j);%f,%fn,h,j);void HJ(a,b,p,q)
4、float a,b,*p,*q;*p=a+b; *q=a*b;1、当被调函数没有返回值时,定义时函数名前加void,在主调函数中调用语句的格式:被调函数名(参数系列);省略类型名时,默认int型。2、当需要从被调方获得一个以上的值时,通常使用地址传递。例2:任意读入10个数,然后进行升序排列。【分工:int a10,i; void PX(); for(i=0;i10;i+)%dai); PX(a,10);%dn,ai);void PX(p,n)int *p,n;int i,j; int t; for(j=1;j*(p+i+1) t=*(p+i);*(p+i)=*(p+i+1); *(p+i+1
5、)=t;【说明】(1)当需要将多个值传给被调函数时,通常使用数组名作为实参,同时为了增大被调函数的灵活性,将数组元素的个数也作为实参。(2)与数组名这个实参对应的形参的格式有两种:指针变量 ;通常省略了元素个数的数组。系统会主动将第二种格式转换成相应的指针。void PX(int p , int n)(3)在形参中出现的一维数组,通常省略元素的个数,系统立刻将之转化成相应的指针变量,本例中即为:int *p(4)实参还可以是二维数组的名字,对应形参可以有两种格式:行指针变量 ;通常省略了第一维的行数的二维数组。例3:主函数生成如下5阶方阵,然后调用子函数求得副对角线上所有元素之积,以及方阵所有
6、元素之和,再由主函数输出。1 2 3 4 5int fun(p, he)int (*p)5,*he;int ji=1; int i,j;5; ji=ji*pi4-i; *he=0; for(j=0; *he=*he+pij; return ji; int a55,i,j; int ji,he; aij=j+1; ji=fun(a,&he);JI=%d,HE=%dn,ji,he);int p5,*he;【归纳】形参和实参之间的联系方式(单向传递:实参形参)传递方式 形参 实参(同类型的) 说明 通过函数调用能否改变实参的值值传递 变量 常量、有值的变量、数组元素或表达式 实参必须事先获得合法的值
7、 不能地址传递 “共用存贮单元”实质依然是“遥控” 数组名 数组的地址(数组名、指向数组的指针等) 即使将形参书写成数组名(通常内为空),系统立即转换成相应的指针 能 “遥控” 指针变量 变量(通常原先没有值)的地址、指针变量、数组名等 就是想通过调用函数,使实参获得值(或发生变化) 能6、全局变量与局部变量函数间还可以运用全局变量来交流信息。1. 定义凡是定义在函数体外的变量称为全局变量或外部变量,其作用域从定义处开始直到程序末尾(但是也可以通过exturn拓展其作用域)。凡是定义在函数体内的变量称为局部变量或内部变量,其作用域是本函数体内。而在复合语句开始处定义的变量只在该复合语句中有效。
8、形参也是局部变量。2同名问题同一个函数内的局部变量不可以同名;同一个程序中的全局变量不可以同名;全局变量与局部变量可以同名,在函数体内与局部变量同名的全局变量失效。七、变量的存储类别和生命周期(生存期)1、变量在内存中的存储区域(1)静态区(从程序开始执行到整个结束)(2)动态区(函数调用开始到被调结束)2、存储类别(1)auto型(自动型)只有局部变量(包含形参)可以定义成auto型,定义格式:auto 类型名 变量名;局部变量若定义成auto型,此关键字auto可省略。auto型处于内存的动态区,auto型变量随所在函数被调用才被分配内存空间(活了),一旦调用完毕内存空间被收回(即释放,死
9、了)(2)register型(寄存器型)少量被反复多次使用的变量一般才定义成register型。若定义多了,系统会自动转成auto型。除调用速度更大,其余特性同auto型。只有局部变量(包含形参)可以定义成register型,定义格式:register 类型名 变量名;(3)static型(静态型)全局变量全是静态型的,且通常省略static关键字局部变量也可以定义成静态型,形参不可以定义成静态型。引例:读程题int s,n,i; n=100; for(i=1;=n;i+) s=f(i);,s);int f(int n)static int s=0; s=s+n; return s;以上输出为
10、:5050但若将其中的“static”改为“auto”,则输出为100。静态型变量如果进行初始化(即定义的同时赋予值),只有第一次执行定义语句时随着分配内存赋予初值,当退出所定义的函数时,将保留其当时值。再次调用所在的函数时,将不重新定义,也不进行初始化,此时,该变量值是上次离开时的值。静态型变量如果不进行初始化,系统自动为其赋予“0”值。3、外部变量作用域拓展声明extern举例:void fun(int a)extern y; /*拓展声明*/ a=a*a;,a+y);int y=9; /*定义变量y*/fun(y);【声明格式】extern 原定义类型名 定义在后的全局变量;八、递归调用
11、某子函数直接或间接调用自身,被称为“递归调用”。【引例】5个小孩从大到小一次编号,问5号小孩几岁,告知比4号小2岁;问4号,说比3号小2岁问1号,告知10岁。求5号的年龄。【“栈”的特点:“先进后出”或“后进先出”;有底“无”顶。int age(int n) /*求出n号小孩年龄*/int nl; if(n=1) nl=10; else nl=age(n-1)-2; return nl;printf(,age(5);1、能够运用“递归”解决的问题的特点: (1)递归的出口(1号说出年龄) (2)有重复的操作例:求n!【分析: (1) n!=(n-1)!n (2) n=1 (n=0或1) 】#i
12、nclude int n; /*n=0,n=20*/ long JC(); FILE *fp; if(fp=fopen(D:my1.out,w)=NULL) printf(Open File Errorn);exit(0);n); while(n20);%ldn,JC(n); fprintf(fp,20090901007 fclose(fp);/*子函数求任意合法数的阶乘*/long JC(int n)long jc; if(n=0|n=1) jc=1; jc=JC(n-1)*n; return(jc);2、好多能用循环解决的问题都可以改用递归描述。例如:、进制转换等。但是,不提倡,因为递归的
13、时间和空间复杂度高!九、函数的指针函数名就是函数的首地址。int max(a,b)main() int (*fp)(); fp=max; z=(*fp)(x,y);1、定义所指函数的返回值类型 (*指针名)( );2、说明(1)*和指针名是一个整体,外加()提高优先级。(2)后一个()也不能省,表示所指的是函数。(3)定义时的“类型名”,必须和所指函数定义时的“类型名”一致,若无返回值则用void。(4)定义后使用前,必须先赋值“函数名”(因为函数名就是函数的首地址)(5)凡是写“函数名”的地方(除定义函数外)从此可以用“(*指针名)”替代。十、主函数的参数主函数(main)可以带参数,但只能
14、是两个,且格式如下:int argc, char *argv;或int argc, char *argv ;(1)第一个参数必须是整型,名字公认写成“argc”,但可以自定;(2)第二个参数是指向字符串的指针数组。名字公认写成“argv”,但可以自定;(3)任何函数不可以调用主函数,因此实参的给定必须在DOS环境下给出。 练习题 一、选择题 (1)C 语言总是从( )函数开始执行。A. main B. 处于最前的 C.处于最后的 D. 随机选一个 (2)函数在定义时,省略函数类型说明符,则该函数值的类型为( ) A. int B. float C. long D. double (3)以下(
15、)函数,真正地没有返回值。A. int a()int a=2;return (a); B. void b()printf(c C. int a()int a=2;return a; D. 以上都是 (4)在 C 语言中,有关函数的说法,以下正确的是( ) A. 函数可嵌套定义,也可嵌套调用 B. 函数可嵌套定义,但不可嵌套调用 C. 函数不可嵌套定义,但可嵌套调用 D. 函数不可嵌套定义,也不可嵌套调用 (5)以下函数调用语句中,含有实参的个数为( ) fun(2,3),(4,5+6,7);A. 1 B. 2 C. 5 D. 6(6)函数调用可以在( ) A. 函数表达式中 B. 函数语句中
16、C. 函数参数中 D. 以上都是 (7)被调函数返回给主调函数的值称为( ) A. 形参 B. 实参 C. 返回值 D. 参数 (8) ( ),可以不进行函数类型说明。A. 被调函数的返回值是整型或字符型时 B. 被调函数的定义在主调函数定义之前时 C. 在所有函数定义前,已在函数外预先说明了被调函数类型 D. 以上都是 (9)被调函数通过( )语句,将值返回给主调函数。A. if B. for C. while D. return (10)被调函数调用结束后,返回到( )。A.主调函数中该被调函数调用语句处 B.主函数中该被调函数调用语句处 C.主调函数中该被调函数调用语句的前一语句 D.主
17、调函数中该被调函数调用语句的后一语句(11)以下对 C语言函数的有关描述中,正确的是( )。A. 在 C 中,调用函数时,只能把实参的值传送给形参,形参的值不能传送给实参 B. C函数既可以嵌套定义又可递归调用 C. 函数必须有返回值,否则不能使用函数 D. C程序中有调用关系的所有函数必须放在同一个源程序文件中 (12)C 语言中函数的隐含存储类型是( )。A. auto B. static C. extern D. 无存储类型 (13)能把函数处理结果的两个数据返回给主调函数,在下面的方法中不正确的是( )。A. return 这两个数 B. 形参用两个元素的数组 C. 形参用两个这种数据
18、类型的指针 D. 用两个全局变量 二、填空题 (1) 变量的作用域主要取决于变量 ,变量的生存期既取决于变量 ,又取决于变量 。(2) 说明变量时,若省略存储类型符,系统默认其为 存储类别,该存储类别的类型符为: 。(3) 静态型局部变量的作用域是 ,生存期是 。(4) 函数中的形参和调用时的实参都是数组名时,传递方式为 ,都是变量时,传递方式为 。(5) 函数的形式参数的作用域为 ,全局的外部变量和函数体内定义的局部变量重名时, 变量优先。(6) 若自定义函数要求返回一个值,则应在该函数体中有一条 语句,若自定义函数要求不返回一个值,则应在该函数说明时加一个类型说明符 。(7) 若函数的形式
19、参数是指针类型,则实参可以是 、 或 。(8) 函数的参数为 char *类型时,形参与实参结合的传递方式为 。(9) 函数的实参为常量时,形参与实参结合的传递方式为 。(10) 对数组按值从大到小的顺序排序后输出,请填空。void main() float a7=2,6,3,8,3,12,9; int i; void sort(float*,int); ;7;i+) printf(%f nvoid sort( ) int i,j,k; float t;n-1;i+) k=i; for(j=i+1;n;j+) if( ) k=j; t=*(p+i); *(p+i)=*(p+k); *(p+k)
20、=t; (11) 下列函数在 n 个元素的一维数组中,找出最大值、最小值并传送到调用函数,请填空。 #include void find(float *p, float *max, float *min, int n) int k; *max=*p; for(k=1;k+) t=*(p+k); if( ) *max=t; if(t*min) *min=t;三、程序执行题 (1) main() int i=1,p; p=fun(i,i+1);,p); int fun(int a,int b) int f;b) f=1; else if(a=b) f=0; else f=-1; return f;
21、 输出:(2)键盘输入 abcdefvoid fun( ) char c ; if(c=getchar( )!=n) fun( ) ; putchar(c);void main( ) fun( ); 输出:(3) #define C 5 int x=1,y=C; int x; x=y+;%d %dn, x,y); if(x4) int x ; x=+y;,x,y) ; x+=y-;,x,y);(4) int c , a=4 ;func(int a , int b) c=a*b ; a=b-1 ; b+ ; return (a+b+1) ; int b=2 , p=0 ; c=1 ; p=fun
22、c(b , a) ;%d,%d,%d,%dn, a,b,c,p) ;(5) unsigned fun6(unsigned num) unsigned k=1; do k*=num%10; num/=10; while(num); return k; unsigned n=26;, fun6(n);时间:2012年11月14号 热点作文5 Directions: For this part, you are allowed 30 minutes to write a composition on the topic Secondhand Goods. You should write at le
23、ast 150 words, and base your composition on the outline (given in Chinese) below:1)目前购买二手货的人越来越多2)分析产生这一现象的原因3)二手货交易可能带来的问题【思路点拨】本题属于提纲式文字命题。提纲第1点指出一种现象,提纲第2点要求分析该现象产生的原因,提纲第3点要求谈谈该现象可能带来的问题,由此可判断本文应为现象解释型作文根据所给提纲,本文应包含以下内容:描述目前二手货的交易现状;说明二手货交易增加的原因;分析二手货交易可能带来的问题。 【参考范文】Secondhand Goods In recent y
24、ears, second-hand transactions have become quite common. Nowadays there are more and more secondhand goods in the market, such as secondhand books, furniture, appliances, cars, and so on. Why do so many people like to buy secondhand goods? The following reasons can account for this phenomenon. Above all, secondhand goo
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2