二级C语言各章的知识点 (2)_第1页
二级C语言各章的知识点 (2)_第2页
二级C语言各章的知识点 (2)_第3页
二级C语言各章的知识点 (2)_第4页
二级C语言各章的知识点 (2)_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

1、各章的知识点第一章(略-给学生们在书上画一下)第二章C程序基础知识(以下列举的知识点给学生在书上画一画,有的可以写在书上的空白地方或写在本上)1 简单的C语言程序的构成(1)一个C程序只有一个main()-称为主函数,main要小写,程序的执行是从主函数开始并在主函数中 结束,一个完整的C程序是由一个主函数和若干个子函数构成的。(2)函数内部称为函数体,由一对大括号括起来,在里,前面必须是定义各种所需的变量,后面才是各种语句,二者不能颠倒,并且一个语句结束必须有分号;下面是例子:#include”stdio.h” /* 或写成#include嵌入头文件 ,注意前面要有#号,后面没有;号 ,所以

2、它不是语句*/main()int a,b,c; /* 定义三个整型变量 */a=2; /*以下三句是赋值语句,注意每个语句都有分号; */b=3;c=a+b;printf(“%d”,c); /* 把变量C的值在电脑屏幕上显示-称为输出语句 */把这个程序领着学生在VC6里演示一下,让学生会运行程序,并且会看输出结果。2 关于/* .*/-称为注释,它不运行把从/*开始到*/结束的语句行都作为注释(记住注释是不运行的)-老师在投影上举一例说明。不能嵌套注释,如:/*/*.*/*/3 关于给变量起名的问题,也就是变量名的命名规则由字母az、AZ、09、_(下划线)组成由字母或下划线开头大、小写的字

3、母是不同的变量不能使用C语言的关键字(关键字是小写的)老师在此可以举例说明4 在C语言中经常可以用到哪些类型的变量和常量的问题(1)若有f(x)=2x2 +5 ,其中X是变量,5是常量,那么X的取值范围是什么 呢?是有符号整型?无符号整型?短整型?长整型?单精度浮点型?双精度浮点型等等,这个问题在C语言的程序设计中对变量X的取值范围规定的比较清楚。下面就介绍一下在C语言中对变量X 是如何规定它的取值范围的。呵呵! int x(signed int x或signed x)-称为普通整型,它规定了X的取值范围是下列类型(注意:这里的变量X 是用4个字节来存放的) 十进制的-正整数、负整数、0,如:

4、25、-36等 八进制的-正整数,如:065等,-065(不允许 ) 十六进制的-正整数,如:0 x2c,0Xa6等,-0 xa1(不允许) short int x(short x)-称为短整型,它规定的X的取值范围和int x基本一样,只不过取的数要比int x要小而已,因为它是用两个字节来存放X的(-32768+32767)。而上面的是用 四个字节来存放X的。long int x(long x)-称为长整型,其规定的X取值范围和int x一样,也是用四个字节来存放X的(输入时要用%ld、%Ld)。unsigned int x(unsigned x)-称为无符号整型,它规定了X只能取正整数,

5、也是用四个字节来存放X的。unsigned short int x-称为无符号短整形,其十进制的 取值范围喂065535char x-称为字符型,用一对单引号括起来的任意字符,包括字母字符、数字字符、转义字符等如:a、3、n等分析:a、A 、2、 2 、ab 、123float x-单精度浮点型,小数点后默认保留6位小数如:0.123、.123、123.等1.23e+2、1.23e2、1.23E2、.123e-2等(指数形式)用指数形式表示浮点数要注意三点:、e或E前后必须有数 、e或E后面必须是整数 、e或E的前后以及数字之间不得插入空格double x-双精度浮点型(输入时要用%lf或%L

6、f,输出可用%f、%lf、%Lf)(2)关于常量(整数、小数、字符型数据)5-可以认为是int型、short int、unsigned int都可以5L或5l-是long int型5h或5H-是short int型1.23-是double型a-97A-652-50123-(3)关于类型的强制转换问题-即把一个类型强制转换成其他类型如:#include”stdio.h”main()int x=5; /* 给变量X初始化*/float y,z;z=2.56; /*给变量Z赋值 */y=(float)x; /*对变量X的值进行强制转换 ,而X的类型和值都不改变 */printf(“%d,%fn”,x

7、,y); /*5,5.000000 */x=(int)z; (或写成x=z) /* 对变量Z的值进行强制转换,且不进行四舍五入*/printf(“%d”,x); /* 2 */分析:a=(float)b+c;和a=(float)(b+c);有什么区别?关于强制转换要注意两点:一是待转换的类型一定要用小括号括起来;二是对后面变量的值进行转换,不改变原来变量的类型和值,并且不进行四舍五入。5 常用的算术运算符+、-、*、/、%、+=、-=、*=、/=、+、-、,等下面把需要特殊注意的运算符加以说明:/-除号, 若分子和分母都是整型,其结果也是整型(不进行四舍五入) 若分子或分母至少有一个是浮点型,

8、其结果就是浮点型。%-取余,注意%的前后都必须是整型的,且结果的符号与被除数相同.举例:把两个两位的正整数按要求组成一个新数a=45,b=32,要求组成一个新数C=4325#include”stdio.h”main()int a=45,b=32,c;c=a/10*1000+b/10*100+b%10*10+a%10;printf(“%d”,c);分析:如何取出1234的每个位上的数?(使用算术符%和 /)+=、-=、*=、/=-称为复合运算符(注意:两个符号不能分开)如:a=a+b;可以写成a+=b;a+=b-c 和a-=b+c可以写成什么呢?(由学生来回答)a+=a-=a+a (假设a=9)

9、,最后a=?(-18)(由老师来讲解)+、-称为自增自减运算符(单目的),很重要如:a+ 先用a,然后再把a加1+a 先把a加1,然后再用aa- 先用a,然后再把a减1-a 先把a减1,然后再用a举例:见如下程序#include”stdio.h”main()int a=3,b=6,c,d,e,f;c=b+a+;d=a+(-b);e=-a+;f=a+b+c;printf(“a=%d,b=%d,c=%d,d=%d,e=%d,f=%dn”,a,b,c,d,e,f);答案:a=5,b=5,c=9,d=9,e=-4,f=19 , 逗号-称为逗号运算符,由逗号运算符构成逗号表达式,逗号表达式最后一项的值就

10、是逗号表达式的值,逗号运算符的优先级最低。如:a=3,b=4,c=5;x=(a,b,c); 问:x=?(5),逗号表达式的值=?(5)x=a,b,c; 问:x=?(3),逗号表达式的值=?(5)x=(a+,-b,a+b); 问:x=?(7),逗号表达式的值=?(7)x=a+,-b,a+b; 问:x=?(3),逗号表达式的值=?(7)x=(a+,-b,a+b+c+); 问:x=?(12),逗号表达式的值=?(12)6 关于数据溢出问题,看下面例子:int a=-3;unsigned short x;x=a; 问:x=?(65533)7 分析:int a=b=c=1;对不? 领学生做书后的习题第三

11、章顺序结构程序设计1 关于输出函数的使用 使用的格式: printf(“各种字符及汉字等”);/*printf要小写 */ 这种使用就是在屏幕上显示双引号中的内容 printf(“输出格式控制”,待输出的变量列表);这种使用就是在屏幕上以何种形式输出变量的值要重点掌握输出格式控制都有哪些?格式符:%d 以普通整型输出(不可以写成%D)%md 以普通整型输出,数据占m位,右对齐%+md 以普通整型输出,数据占m位,右对齐(正数的前面有+号)%-md 以普通整型输出,数据占m位,左对齐%hd 以短整型输出%ld(或%Ld) 以长整型输出%u 以无符号整型输出%o 以八进制形势输出%x(或%X) 以

12、十六进制形势输出%f 以单精度小数形势输出,点后6位小数%lf(或%Lf或%f) 以双精度小数形势输出,%m.nf 以单精度小数形势输出,点后n位小数,且进行四舍五入%.nf 以单精度小数形势输出,点后n位小数,且进行四舍五入%c 以字符形式输出%s 以字符串形式输出说明:以上的常用格式符必须和后面的变量一一对应,并且后面的 变量是什么类型前面就必须用相应的格式符例:int a=-2;unsigned int b=30;float c=3.1456;printf(“%d%u%5.2f”,a,b,c); 问:输出结果是什么?(-230 3.15)普通字符普通字符原样输出,它不控制变量的输出。pr

13、intf(“a=%d,b=%u,c=%5.2f”,a,b,c); 问:输出结果是什么?转义字符n 回车且换行r 回车但不换行b 退一个字符t 走一个制表位(8个字符) 转译成 转译成” 转译成”% 转译成%ddd 转译成13位八进制所对应的ascii码值所代表的字符xdd 转译成12位十六进制所对应的ascii码值所代表的字符 老师举例子说明如:printf(“a=%d,b=%u,c=%5.2fn”,a,b,c); printf(“%cn%cn”,56,x2a);问:以上输出结果是什么?答案:int a=1,b=3;printf(“%d”,a,b);输出结果是什么?(1)printf(“%d”

14、,(a,b); 输出结果是什么?(3)2 关于输入函数的使用格式:scanf(“输入格式控制”,变量地址列表);重点掌握都有哪些输入格式?(有格式符和普通字符,没有转义字符)格式符:%d 以普通整型输入%ld(%Ld) 以长整型输入%hd 以短整形输入%md 取整型的m位%u 以无符号型输入%o 以八进制输入%x(%X) 以十六进制输入%f 以单精度小数输入%lf(%Lf) 以双精度小数输入%mf 以单精度小数输入(但是不能规定它的精度。如:%5.2f )%c 以字符型输入%s 以字符串型输入如:int a;float b;double c;long d;scanf(“%d%f%lf%ld”,

15、&a,&b,&c,&d);假设让 a=23,b=2.6,c=12.66,d=12345问:在键盘上应如何输入?普通字符普通字符不影响输入,只是在输入时原样打上就 行如:把上例改为:scanf(a=%d,b=%f,c=%lf,d=%ld);那么应该如何输入?关于混合输入问题如:假设让a=23,b=k,c=12.5,d=pscanf(“%d%c%f%c”,&a,&b,&c,&d);问:如何输入?(23k 12.5p或23k12.5p)关于跳过某个输入项的问题如:scanf(“%d%*d%f”,&x,&y);假设输入如下:20 30 2.5回车问:x=? (20) y=?(2.5)按照给定的长度输入

16、如:scanf(“%3d%2d”,&x,&y);假设输入如下:2345678回车问:x=? (234) y=?(56)下面举三个综合的 例子:(让学生自己写写看行不?)例1:从键盘输入两个两位的正整数,第一个数的十位作为千位,个位作为十位;第二个数的十位作为百位,个位作为个位,组成一个新的数输出。#include”stdio.h”main()int a,b,c; scanf(“%d%d”,&a,&b); c=a/10*1000+b/10*100+a%10*10+b%10;printf(“nc=%d”,c);例2:从键盘输入两个数,然后把这两个数交换并输出#include”stdio.h”mai

17、n()int a,b,t; scanf(“%d%d”,&a,&b); t=a;a=b;b=t;printf(“n%d,%d”,a,b);例3:输入一个double型数,保留两位小数,第三位小数进行四舍五入,然后输出。#include”stdio.h”main()double x,y; scanf(“%lf”,&x); y=(int)(x*100+0.5)/100.0;printf(“ny=%.2f”,y);最后领学生做做书后习题第四章 选择(分支)结构程序设计1 在C语言中真和假的概念 真-若一个表达式成立则称为真;若值为非0也称为真。2关系运算符和关系表达式C语言提供六种关系运算符: = =

18、 (等于) !=(不等于)注意几点:由两个符号组成的关系运算符不能分开前四个运算符优先级相同且高于后两个关系符低于算术运算符,但高于赋值运算符(=) 如:a+b=c相当于(a+b)=c关系表达式的值:一个是真(用1来表示);另一个是假(用0来表示)注意“=“和”=“的区别 0 x-5&x0&xy逻辑表达式,如xy&yz算术表达式,如x+y赋值表达式,如x=y变量,如x常量,如-5+ 或出现在条件里,如x+y如果语句1或语句2是一条语句,则一对花括号可以省略 if.else 是一条语句,else 不能单独出现,要注意else 与 if的搭配问题(既:else与其上面最近的且没使用的if搭配)下面

19、举几个例子来说明:例1:从键盘输入一个整数,判断其是奇数还是偶数?#include”stdio.h”main()int x,y;scanf(“%d”,&x);if(x%2=0) printf(“偶数”); else printf(“奇数”);例2:下面程序的输出结果是什么?#include”stdio.h”main()int a=2,b=-1,c=2;if(ab) if(b0) c=0; else c+=1;printf(“%d”,c);答案:2例3:下面程序的输出结果是什么?#include”stdio.h”main()int a=2,b=-1,c=2;if(ab) if(b0) c=0;

20、else c+=1;printf(“%d”,c);答案:3例4:下面程序的输出结果是什么?#include”stdio.h”main()int a=2,b=-1,c=2;if(a+b) if(b0) c=0; else c+=1;printf(“%d,%d”,c,a);答案:2,3分析:可以把条件a+b分成三个步骤来执行:第一步:先判断ab是真?还是假?第二步:把a加1,既a=a+1第三步:根据第一步的判断情况来决定程序的执行方向请同学们考虑:若改为+ab呢?例5:下面程序的输出结果是什么?#include”stdio.h”main()int a=2,b=-1,c=2;if(a=b) if(b

21、b?a:b; 问:y=?(2)y=ab?a:ac?c:a; 问:y=?(1)用switch开关语句来实现程序的分支格式:switch() case 常量表达式1:语句; case 常量表达式2:语句; case 常量表达式3:语句; 。 。 。 default :语句 注意以下几点:switch和case是关键字,要小写switch后面括号里可以是以下内容: 整型常量或变量、字符常量或变量、关系表达式、逻辑表达式、整型的算术表达式,总之是整数case要和后面的常量表达式用空格分开,且这个常量表达式必须是整型常量或字符常量,不是变量。default可以放在任何位置,不一定在最后,也可以没有可以用

22、break 语句跳出switch举几个例子:例1:程序输出结果是什么?#include”stdio.h”main()int x=0,y=2,z=3;switch(x) case 0:printf(“*”); case 1:printf(“#”);break; default: printf(“!”); 答案:*#例2:程序输出结果是什么?#include”stdio.h”main()int x=0,y=2,z=3;switch(x) case 0:switch(y=2)case 1: printf(“*”);break case 2:printf(“%”);break; case 1:prin

23、tf(“#”);break; default: printf(“!”); 答案:*#领学生做书后习题第五章循环结构程序设计如何计算1+2+3+4+。+100?这就需要用到循环,C语言有三种循环结构,既:while()、 dowhile;、for()#include”stdio.h”main()int i,sum=0; /* 定义所需的变量,并给变量sum初始化为0 */i=1;while(i0);或写成while(x0);请说出循环条件和循环体?dowhile()循环格式:do 循环体 while(循环条件);既:先执行循环体中的语句,执行完后再去判断循环条件,若为真,则继续执行循环体,否则退

24、出循环。注意以下几点:do和 while是关键字,都要小写循环至少执行一次while()后面要有分号;for循环格式:for(表达式1;表达式2;表达式3) 循环体执行过程:先执行表达式1,然后判断表达式2是否为真?,若为假则退出循环;若为真则执行循环,再执行表达式3,然后再去判断表达式2是否为真?,若为真则继续执行循环体,再执行表达式3,直到表达式2为假注意以下几点:三个表达式可有可无,但分号;必须有三个表达式的含义如下: 表达式1:一般是给变量赋值的表达式2:是循环条件表达式3:是变量的变化重点弄明白循环条件是什么?循环体是谁?如何结束循环,两种方式:一是正常结束(既不满足循环条件了)二是

25、中途结束(用break语句)用dowhile()循环 和for()循环来改写上面的例子:1 用dowhile()循环#include”stdio.h”main()int i,sum=0; /* 定义所需的变量,并给变量sum初始化为0 */i=1;dosum+=i; i+;while(i100); /* 注意后面的分号一定要有 */printf(“%d”,sum);2 用for()循环#include”stdio.h”main()int i,sum=0; /* 定义所需的变量,并给变量sum初始化为0 */for(i=1;i=100;i+)sum+=i;printf(“%d”,sum);大家比

26、较一下哪种循环更简练?若把for(i=1;i=100;i+)改成如下形式,其余的语句不动会是什么结果呢?for(i=1;i0) y=x%2;printf(“%2d,”,y);x/=2;上面程序用for()循环怎么改?例2:用=1-+-+公式求 的近似值,直到最后一项的绝对值小于10-6为止#include”stdio.h”#include”math.h”main()float n,t,pi;int s;s=1; /* 用变量s来改变正和负 */n=1.0; /* 用n代表分母 */t=1.0; /* 用t代表公式中的某一项 */pi=0; /* 用pi代表各项的和*/while(fabs(t)

27、=1e-6) /* fabs(t)就是t的绝对值 */ pi+=t; n+=2;s=-s;t=s/n;pi=pi*4;printf(“pi=%fn”,pi);(4)break语句和 continue语句的含义 如果遇到break语句,则无条件退出循环如果遇到continue语句,其含义是结束本次循环,继续下一次循环。下面再举几个例子:例1:从键盘输入一个正整数,判断它是否为素数(质数)?(用两种算法来写)判断一个正整数x是素数的三种方法:x被2 x-1来除,若都除不开,则x就是素数x被2 x/2来除,若都除不开,则x就是素数x被2 来除,若都除不开,则x就是素数解法1:(标志变量法)#incl

28、ude”stdio.h”main()int x,i,f=1; /* f是标志变量 */scanf(“%d”,&x);for(i=2;ix;i+)if(x%i=0) f=0;break;if(f=1) printf(“是素数”); else printf(“不是素数”);解法2:(判断循环是如何退出的办法)#include”stdio.h”main()int x,i;scanf(“%d”,&x);for(i=2;ix;i+)if(x%i=0) break;if(i=x) printf(“是素数”);/* 如果i等于x的话,说明循环是正常退出的 */ else printf(“不是素数”);例2:

29、输出2100以内的所有素数(1即不是素数,也不是非素数)#include”stdio.h”main()int x,i;for(x=2;x=100;x+) for(i=2;ix;i+) if(x%i=0) break; if(i=x) printf(“%d,”,x);思考:用另一种判断素数的算法怎么改写上面的程序?参考答案:#include”stdio.h”main()int x,i,k;for(x=2;x=100;x+) k=1;for(i=2;ix;i+) if(x%i=0) k=0;break; if(k=1) printf(“%d,”,x);由学生来完成:求出大于整数K(K由键盘输入),

30、且紧靠K的5个素数参考答案:#include”stdio.h”main()int k,m,i,n=0;scanf(“%d”,&k);for(m=k+1;n5;m+) for(i=2;im;i+) if(m%i=0) break; if(i=m) printf(“%d,”,m);n+;例3:编程找出1000以内所有完数(例如:6的 因子为1、2、3,而6=1+2+3)?#include”stdio.h”main()int i,x,sum; for(x=1;x=1000;x+) sum=0;for(i=1;ib) c=b; /* 用变量c放a和b小的数 */ else c=a; while(a%c

31、!=0|b%c!=0) c-; max=c;/* 求最小公倍数 */if(ab) c=a; /* 用c来放 a和b大的数 */ else c=b;while(c%a!=0|c%b!=0)c+;min=c;/* 输出最大公约数和最小公倍数 */printf(“max=%d,min=%dn”,max,min);解法2(辗转相除法):#include”stdio.h”main()int a,b,c,t,m,max,min;/* 用max来放最大公约数,用 min放最小公倍数 */scanf(“%d%d”,&a,&b);t=a*b; /* 把a和b的乘积放在变量t中 */if(ab) m=a;a=b;

32、b=m; /* 让a放a和b间大的数*/c=a%b;while(c!=0) a=b; b=c; c=a%b;max=b;/* b的值就是最大公约数 */min=t/max;printf(“max=%d,min=%dn”,max,min);例5:编写程序求e的值 e1+(1)用for循环计算前50项的和(2)用while循环,要求直到最后一项的值小于10-6解1:#include”stdio.h”main()double sum=1,t=1;/* 定义sum变量为和,t为某项 */int k;for(k=1;k=1e-6) sum+=t; k+; t/=k; printf(“%f”,sum);分

33、析:若把t/=k;放到sum+=t;的前面会如何?(结果就不对了)例6:下面程序的输出结果是什么?#include”stdio.h”main()int i;for(i=1;i=5;i+) if(i%2) printf(“*”);else continue; printf(“#”);printf(“$n”);答案:*#*#*#$例7:下面程序的输出结果是什么?#include”stdio.h”main()int x=3; do printf(“%3d”,x-=2);while(!(-x);#include”stdio.h”main()int i,j; for(i=1;i=4;i+) for(j=

34、1;j=4-i;j+) printf(“ “); for(j=1;j=2*i-1;j+) printf(“%c”,*); printf(“n”);for(i=1;i=3;i+) for(j=1;j=i;j+) printf(“ “); for(j=1;j100) s/=100;t=s%10 +t*10;其余部分不变main()long s,t,sl=10;scanf(“%ld”,&s); s/=10; t=s%10;while(s0) s/=100;t=s%10*sl+t;sl*=10;printf(“%ld”,t);说明:若是求偶数位上的呢?(531)只需把s/=10;删除即可。若是把S逆过

35、来呢?#include stdio.h main()long s,t;scanf(%ld,&s); t=s%10;while(s10) s/=10;t=t*10+s%10;printf(%ld,t);第六章字符型数据1 什么是字符型数据和字符串型数据?a-就是字符型数据,它的值就是a的ASCII值97,而abc是非法的.3-也是字符型数据,它的值就是字符3的ASCII值51注意:3与3的 区别;3-0=3;3+0=3; 也就是说用一对单引号括起来的必须是一个字符那么一起来分析一下n呢?由于n是转义字符,记住转义字符就是一个字符,但看起来象两个或多个字符.123-看起来象4个字符,其实这也是转义

36、字符,那么它到底转义成了什么字符呢?x2a呢?又会是什么情况呢? “a12”-就是字符串型数据,它没有值“a”-也是字符串型数据注意 :a与”a”的 区别 既:用一对双引号括起来的就是字符串型数据.2 什么是字符型变量定义一个变量,用这个变量来存放字符型数据.格式:char c,d=1;c=a; /* 或写成c=97; */字符型和int型在一定范围内的通用问题:如果int型的数据在0-255范围内则char 与int通用。(既在一个字节范围内通用)如:int k=321;char ch;ch=k;printf(“%d,%c”,ch,ch);/* 输出结果是:65,A */3 如何在屏幕上输出

37、字符?char c=a;printf(“%c,%d”,c,c); /* 或putchar(c); */4 如何从键盘输入一个字符给某个字符型变量?char c;scanf(“%c”,&c);/* 或c=getchar(); */注意混合输入的问题:如:int a1,a2;char c1,c2;scanf(“%d%c%d%c”,&a1,&c1,&a2,&c2);假设使a1=20,a2=30,c1=d,c2=c应如何如输入数据?(20d 30c或20d30c)5 综合举例例1:从键盘输入任意字符,统计其中字母、数字、空格的个数,以#结束输入#include”stdio.h”main()int n1

38、=0,n2=0,n3=0;char c;whiel(c=getchar()!=#); /* 注意 写法 */ if(c=a&c=A&c=0&cb)?a:b; /* 以下是语句部分 */ return c; /* 把变量c的值返回给调用者 */ main()int x,y,z; scanf(“%d,%d”,&x,&y);z=max(x,y);printf(“z=%dn”,z);说明以下几点:子函数可以放在主函数(main)的上面和下面,但不可以放在主函数或其他函数的内部.函数的存储类别可以是extern(开放型的) 和static(封闭型的),若不写,则默认是extern函数返回值的类型很多,它

39、可以是C语言的所有数据类型,若不写,则默认是int型.形式参数的类型和个数必须和调用者一致,而且多个形式参数必须分别定义.不能写成int a,b用return 表达式; 或return (表达式);语句返回一个值给调用者(只能返回一个值,分析一下:return c,d;是什么含义?若写成return c;return d;又是什么含义?),如果写成return ;则函数返回一个不确定的值.如果return语句后面要返回值的类型和函数首部的” 函数返回值的类型”不一致时,以”函数返回值的类型”为主.如果”函数返回值的类型”和调用者所要求的返回值的类型不一致时,以调用者为主.如果不需要返回值时,则

40、”函数返回值的类型”用void,这是就不能有return语句了.关于参数的传递:单向值传递,而且是由调用者传给子函数,调用者的参数称为实参,子函数的参数称为形参,并且主函数和子函数中 的变量可以同名(虽然同名但不是同一个变量),子函数中的变量只有在被调用时才建立,并且调用结束后子函数中的变量也不存在了(除了静态局部变量和全局变量-后面会讲到)如何调用子函数:直接写子函数的名字就行.(直接喊名)子函数的声明:如果子函数在主函数的下面,则需要对其下面的子函数作个基本介绍(声明),假如上面的例子中,子函数max()是在主函数的下面,可用如下的声明语句,这个语句可以放在主函数的上面,也可以放在主函数的

41、内部,int max(int a,int b);或int max(int ,int);子函数的调用过程讲解(由老师结合上面的例子演示)下面举几个例子:例1:在主函数中输入一个正整数,然后在子函数中求出各个位上的 数字之和,然后在主函数里输出#include”stdio.h”int aa(int x) /* 定义子函数 */int sum=0; while(x0) sum+=x%10; x/=10;return sum; /* 把sum的值返回给调用者 */main()int x,y; scanf(“x=%d”,&x);y=aa(x); /* 调用子函数,并把子函数的返回值给y */printf

42、(“y=%d”,y);例2:在主函数中输入一个正整数,然后在子函数中把这个数从低位开始重新组合,然后在主函数里输出,如:假设这个数是654321,则重新组合为642(既:从低位开始把奇位上的数进行重组)#include”stdio.h”long cz(long x)long y=0; int k=1; x/=10;while(x0) y=y+x%10*k;k*=10;x/=100;return y;main()long x,y;scanf(“%ld”,&x);y=cz(x);printf(“%ld”,y);分析:若把本题改为重新组合为246呢?程序怎么改?long cz(long x)long

43、 y=0;int k=1; x/=10;while(x0) y=y*k+x%10;k*=10;x/=100;return y;分析:若把本题改为重新组合为531呢?程序怎么改?(只需把x/=10;去掉即可)由学生来做:把一个整数每位上的数是偶数的重新组合成一个新数,如653892,重新组合成一个新数是682。参考答案:#includestdio.hlong cz(long x)long y=0;int k=1;while(x0) if(x%2=0) y=y+x%10*k;k*=10;x/=10;return y;main()long x,y;scanf(%ld,&x);y=cz(x);prin

44、tf(%ld,y);例3:在主函数中输入一个正整数,然后在 子函数中判断其是否为素数?参考答案:#includestdio.hint cz(int x)int i; for(i=2;ix;i+) if(x%i=0) break;if(i=x) return 1; else return 0;main()int x,y;scanf(%d,&x);y=cz(x);if(y=1) printf(%d 是素数,x); else printf(%d 不是素数,x);例4:验证任意偶数为两个素数之和#include”stdio.h”main()int x,i,f;int isprime(int);/* 子

45、函数声明 */scanf(“%d”,&x);for(i=2;i=x/2;i+) if(isprime(i)if(isprime(x-i) printf(“%d,%d,%dn”,x,i,x-i);break;int isprime(int a)int i;for(i=2;ia;i+) if(a%i=0) break; if(i=a) return 1; else return 0;例5:在主函数中输入两个变量,在子函数中把这两个变量的值交换过来(看 看能否交换 过来)#include”stdio.h”void swap(int x,int y)/* 不能写成int x,y */int t; t=

46、x;x=y;y=t; /* 注意:在子函数中不能有return语句了 */main()int x,y;scanf(“%d,%d”,&x,&y);swap(x,y);printf(“x=%d,y=%dn”,x,y);第八章 地址和指针1 地址和指针的概念首先了解一下1GB内存的含义:见下图定义任何一个变量,都要给它分配房间,如int型的变量需要给它分配连续的四个房间,short 型的变量需要给它分配两个连续的房间,等等,这样分配给它的第一个房间的房间号就是这个变量的地址,由于每个房间的房间号是不同的,是变化的,这样我们可以定义一个特殊的变量,用这个变量来存放某个房间的房间号,那么这个特殊的变量就

47、称为指针型变量,或简单称为“指针”。假设有int a=5;可用 下图形象说明 2 关于指针型变量的定义、初始化、赋值、使用的说明指针指向某个变量的含义:如果一个指针变量的值等于某个变量的地址,则称为指针指向这个变量,或者说指向这个单元(房间)。float *p; /* 定义一个指针型变量p,p所指的单元放的是float型的数据 , 但变量p占2个字节*/那么int *q;是什么含义呢?double *a,*b;呢? a,b,p,q四个指针变量具体 指向哪个单元?float x=5.3; float *p=&x;/* 让指针变量p指向变量x(初始化) ,符号&是取变量x的地址*/也可以把上面两句

48、写成一句: float x=5.3,*p=&x;但不能 写成float *p=&x,x=5.3;分析:如果写成float *p=1000H;行不?(不行,不能直接把一个数赋给指针变量)写成float *p=0;或float *p=NULL; 或float *p=0呢?(行,p=0说明这个指针不指向任何单元)float x,*p;x=5.3;p=&x;/* 使p指向x,注意不能写成*p=&x;*/指针变量的 使用要注意:指针变量必须先有指向,然后才可以使用*有三种含义:用于定义变量如:int *p;用于从指针所指的单元读出数据如:x=*p;用于把一个数写到指针所指的单元如 *p=x;例子:如何把

49、两个变量的值交换?#include”stdio.h”main()int a=3,b=5,t,*pa,*pb; pa=&a;pb=&b;t=a;a=b;b=t; /*不用指针*/t=*pa;*pa=*pb;*pb=t; /* 使用指针*/printf(“a=%d,b=%dn”,a,b);/*或写成printf(“a=%d,b=%dn”,*pa,*pb)*/关于*、+、-在一起使用的问题*、+、-三者优先级相同,自右向左结合*p=*p+1;*p+=1;+*p;(*p)+;四个语句的含义是一样 的,*p+是什么含义?重点掌握:是指针+(或-)还是指针里的内容+(或-)?,是先用后加还是先加后用 ?关

50、于指针的移动、比较、运算问题指针的移动、比较、运算一般和数组联合使用,如:int a5,*p=a,*q=&a4;p+;/* 说明p指向了a1-指针移动 */pq;/* 两个指针比较大小,实际上就是比较地址的大小*/q-p;/* q-p=4,就是两个指针之间元素的个数,注意:只能进行减法 */用指针做函数的参数指针也可以作为实参或形参,它传递的是 地址。关于二级指针就是定义一个变量,用来指向一个指针,这个变量就称为二级指针,如:int a=5,*p=&a,*q=&p;printf(“%d,%d,%d”,a,*p,*q);举例在主函数中输入两个变量,在子函数中把这两个变量的值交换过来#includ

51、e”stdio.h”void swap(int *x,int *y)/* 不能写成int *x,*y */int t; t=*x;*x=*y;*y=t; /* 注意:在子函数中不能有return语句了 */main()int x,y;scanf(“%d,%d”,&x,&y);swap(&x,&y);printf(“x=%d,y=%dn”,x,y);通过 这个例子可以 看出:子函数的 返回值有直接返回(用return语句返回)和间接返回(通过指针)。而且直接返回只能返回一个值,间接返回可以返回多个值。第九章 数组1 数组的概念:数组是个变量,属于复杂变量。假设程序需要10个int型的变量,如何定

52、义呢?int a1,a2,a3,a4.这样定义是不是很麻烦?如果定义成如下形式:int a10;和上面的比较一下哪个简单?说明:a就是数组变量,也就是数组的名字 这10个变量分别是a0、a1、a2.a9 0、1、2等是下标,注意数组的下标是从0开始的 这10个变量在位置上是相邻的,看下图表示:2 数组变量的初始化(定义变量的同时就给它值)float b3;/*没有初始化 */float b3=1.2,6,2.6;/*全部初始化 */float b3=1.2,6;/*部分初始化 */float b=1.1,2.2,3.3; /*省略下标 */请同学们分析一下float b3=0;?注意:不能写成

53、float b=1.2,6,2.6;也不能写成b;3 给数组变量赋值(先定义变量,然后用”=”进行赋值)int a3;a0=3;a1=6;a2=9;4 如何使用(或引用)数组中的变量(很重要)假设有int a5,*p=a;/* 数组名字代表数组里首元素(首变量)的地址,而且是常量 */想让a3的值等于6,可以有如下写法:a3=6;*(a+3)=6;*(p+3)=6;p3=6;p+=3;*p=6;或写成p0=6;分析:能否写成:a+=3;*a=6;? 假设指针p已经指向a3,有如下两个语句: p-1=3;p1=9;请说出它们的含义?5 如何从键盘输入数给数组中的变量假设:int a5,*p=a;

54、for(i=0;i5;i+) scanf(“%d”,&ai);注意:&ai可以换成:a+i、p+i,p+6 如何输出数组元素的值假设:int a5,*p=a;for(i=0;i5;i+) printf(“%d,”,ai);注意:ai可以换成:*(a+i)、*(p+i)、pi、*p+综合举例:(都用子函数来实现)例1:分析如下程序的输出结果:#include”stdio.h”main()int a5=3,2,7,6,8,*p=a; int i;for(i=0;i5;i+) printf(“%d,”,*p+);printf(“%d”,a0);/* 输出结果:3,2,7,6,8,3 */分析:把*p

55、+改为(*p)+、*(p+)、+*p、*+p、*p输出结果各是什么?例2:将数组中的数颠倒过来#include”stdio.h”#define N 5 /* 注意后面不要有分号*/void dd(int bb,int n)/* int bb可以写成int bbN、int *bb */int i,t;for(i=0;in/2;i+) t=bbi;bbi=bbn-i-1;bbn-i-1=t;main()int aaN=1,2,3,4,5,i;/*分析:int i,ai;行不? */ dd(aa,N);/*aa可以写成&aa0 */for(i=0;iN;i+) printf(“%5d”,aai);由

56、学生来做:用另外一种算法怎么实现?(参考答案如下:)只需改动子函数部分:void dd(int *bb,int n)int i=0,j=n-1,t;while(ij) t=bbi;bbi=bbj;bbj=t; i+;j-;例3:已知存放在a数组中的数不相重,在a数组中查找和x值相同的元素的位置(下标),若找到则输出该值和该值在a数组中的位置,若找不到则输出相应信息。#include”stdio.h”#define N 5int serch(int *p,int x)int i,f=-1;/* f是要找的数的下标 */for(i=0;iN;i+) if(pi=x) f=i;break;retur

57、n f;main()int aaN=1,2,3,4,5,x,f; /* f是要找的数的下标 */ scanf(“%d”,&x);f=serch(aa,x);if(f=-1) printf(“not found!”); else printf(“%d,%d”,f,aaf);例4:w数组中存放N个数,编写函数删除下标为k的元素#include”stdio.h”#define N 5void del(int *p,int k)int i; for(i=k+1;iN;i+) pi-1=pi;main()int aaN=1,2,3,4,5,i;del(aa,2);for(i=0;iN-1;i+) pri

58、ntf(“%3d”,aai);/* 输出结果:1 2 4 5 */练习:把上例数组的第一个数挪到最后(参考答案如下:)#include”stdio.h”#define N 5void del(int *p,int k)int i,t; t=p0; for(i=1;iN;i+) pi-1=pi;pN-1=t;main()int aaN=1,2,3,4,5,i;del(aa,N);for(i=0;i0) pi+=x%2;/* 变八进制时把x%2改为x%8*/ x/=2; /* 变八进制时把x/2改为x/8*/return i;main()int a20,x,i,y;scanf(“%d”,&x);y

59、=kk(a,x);for(i=y-1;i=0;i-) printf(“%3d”,ai);例6:编程找出数组中最大的元素及所在的下标#include”stdio.h”#define N 5void max_value(int p,int *q)int i,j,max;/* max放最大数,j放最大数的下标 */ max=p0;j=0;for(i=1;imax) max=pi;j=i;*q=j;main()int aN=3,2,7,6,3,x; max_value(a,&x);printf(“%d,%d”,x,ax);/*输出结果:2,7 */例7: 找出一维数组中的最大数和次最大数,并分别和a0

60、,a1对换#include”stdio.h”#define N 10 fun(int *a,int n) int i,k,m,t; for(i=0;i2;i+) m=i; for(k=i;kam) m=k;t=ai;ai=am;am=t;例8:用折半法找出一维数组(有序的)中指定的数是否存在,若有返回其下标,若无返回-1#include”stdio.h”#define N 10fun(int *a,int n)int low=0,high=N-1,mid;while(lown) high=mid-1; else low=mid+1; return -1;例9:随机产生20个不大于50的数放在数

温馨提示

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

评论

0/150

提交评论