C语言各章节的重点和易错之处.doc_第1页
C语言各章节的重点和易错之处.doc_第2页
C语言各章节的重点和易错之处.doc_第3页
C语言各章节的重点和易错之处.doc_第4页
C语言各章节的重点和易错之处.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

c语言各章节的重点和易错之处第二章 算法 重点:掌握用ns流程图表示算法。注意c语言的语句是以“;”作为结束符,一行可以书写多条语句。例:当a,b,c的值分别为3,4,5时,以下各语句执行后a,b,c的值为多少? (1)if(ac) a=b;b=c;c=a; else a=c;c=b;b=a; 执行后a,b,c的值为_5_,_5_,_4_ (2)if(ac) a=c; else a=b;c=b;b=a; 执行后a,b,c的值为_5_,_5_,_4_ (3)if(a!=c) ; /* 空语句 */ else a=c;c=b;b=a; 执行后a,b,c的值为_3_,_3_,_4_第三章 数据类型、运算符与表达式 重点:注意八进制和十六进制常量的表示方式,以及指数的表示方式;区分字符常量与字符串常量的区别;混合运算时各种运算符和优先级;逗号表达式的结果为最后一个表达式值;标识符的命名规则。 注意:c语言是区分大小写的。 易错之处:1)将 a 与 ”a” 混为一谈。前者为字符常量,在内存中占用一个字节的存储空间;后者为字符串常量,在内存中占用二个字节的存储空间,即对于字符串常量系统会自动在最后一个字符后面添加一个字符串结束标志0(ascii码值为0的字符,即第一个字符“空字符”,它要占用一个字节的存储空间。)2)在字符串常量中,特别是统计字符个数时,忽略了转义字符的作用和含义。尤其是ddd (后面13个八进制数)和 xhh (x后面12个十六进制)只是用来表示一个字符,即字符的ascii码值。例:a) 下面四个选项中,均是非法常量的选项是a。a) as-0fff0xab) 0112,456c) -0x18011770xfd) 0xabc0“a”b)下面四个选项中,均是正确的数值常量或字符常量的选项是d。a) 0.00f8.9e&b) “a”3.9e-2.51e1”c) 30110xff00 0ad) +0110xabcd2e2 50.3)自增(+)和自减()运算符作为后置运算符时要特别小心。这时变量先参加表达式的计算,然后再增1(+)或减1()。例:执行以下的c语言程序段后,a=【10】,b=【9】,c=【11】。int x=10,y=9;int a,b,c;a=(x-=y+)?x-:y+;b=x+;c=y;另外,和只能用于变量,而不能用于常量或表达式。例:有以下定义:int a10, *p ; p=a ; 若想得到数组中第二个元素的地址,则可通过如下语句实现:p;或p=&a1 ; 而a;是错误的,因为数组名a是常量。4)两个整数相除( / ),结果为整数(小数部分舍去);“%”运算符两端的表达式(或数据)必须是整数。这两个运算符配合使用可以得到一个整数的各位数字。例:a)若有定义:int a=7; float x=2.5,y=4.7;则表达式x+a%3*(int)(x+y)%2/4的值是a。 a)2.500000b)2.750000c)3.500000d)0.000000b)下面程序的功能是输出1至100之间每位数的乘积大于每位数的和的数。请填空。#include main()int n,k=1,s=0,m;for(n=1;ns) printf(“%d”,n);第四章 顺序程序设计 重点:printf( )和scanf( )的格式化输入/输出,以及附加格式的应用。当使用getchar( ) 和scanf( )的“%c”格式进行单个字符输入时,要特别注意“回车键”的问题,因为当输入一组数据按下“回车键”后,“回车键”转换为f(换行)字符保留在键盘缓冲区中,就会被后续的接收输入的getchar( ) 和scanf( )的“%c”所收,从而造成错误。例:【题4.11】已有如下定义和输入语句,若要求a1,a2,c1,c2的值分别为10,20,a和b,当从第一列开始输入数据时,正确的数据输入方式是d。 int a1,a2; char c1,c2; scanf(“%d%d”,&a1,&a2); scanf(“%c%c”,&c1,&c2);a)1020ab b)10 20 ab c)10 20 ab d)10 20ab第五章 选择结构程序设计重点:关系运算符和逻辑运算符的优先级顺序;复杂关系(或逻辑)表达式的正确书写;switch( )语句中常量表达式的前后顺序;多外选择结构嵌套时要注意各级关系表达式之间的关系。 必须明确关系(或逻辑)表达式的结果只有两个值:“真”(用数值1表示)和“假”(用数值0表示);但是在判断一个关系(或逻辑)表达式是“真”还是“假”时,是看这个表达式的值是“0”还是“非0”(即使是负数也是“真”的)。易错之处:1) 在switch( )语句中多个常量表达式仅起到一个程序跳转的入口指示(即语句标号),并不是实现多路分支,要想实现多路分支就必须在每个case中使用break ; 语句。例:以下程序段的运行结果是*1* *3*。int x=1,y=0;switch(x)case 1:switch(y)case 0: printf(“*1*n”); break;case 1: printf(“*2*n”); break;case 2: printf(“*3*n”);2) 判断语句中给出的关系(或逻辑)表达式与题目的要求不符。例:表示图中坐标轴上阴影部分的正确表达式是c。x a b ca) (x=b)&(x=c)b) (x=a)|(b=x=c)c) (x=b)&(x=c)d)(x=a)&(b=xx)&(b=yz); +a|+b&+c;【1】a)5b)0c)2d)1 【2】a)6b)0c)1d)44) 注意三目运算符的结合方向是“自右向左”。例:设有int x=1,y=0;,则以下表达式的值为【a】。x-(y+x)?10:12.5y+?a:z (因为它等价于:x-(y+x)?10:(12.5y+?a:z) )第六章 循环控制程序设计重点:循环控制表达式正确性和有效性,特别是当循环之间或者循环与选择之间嵌套时更应注意内外层循环体中循环控制表达式的一致性。注意break语句和continue语句的使用,当循环与switch语句嵌套或者循环之间嵌套时,break语句仅能结束它所在的循环体或switch语句体。易错之处:1) 循环控制变量的初始值、改变语句与循环控制表达式不匹配(根据题意)。例:a)设有以下程序段 int x=0,s=0; while(!x!=0) s+=+x; printf(“%d”,s); 则b。a)运行程序段后输出0 b)运行程序段后输出1c)程序段中的控制表达式是非法的 d)程序段执行无限次b)若运行以下程序时,从键盘输入2473,则下面程序的运行结果是a。#include main()int c;while(c=getchar()!=n)switch(c-2)case 0:case 1: putchar(c+4);case 2: putchar(c+4); break;case 3: putchar(c+3);default: putchar(c+2); break;printf(“n”);a)668977b)668966c)66778777d)6688766c)有一堆零件(100到200之间),如果分成4个零件一组的若干组,则多2个零件;若分成7个零件一组,则多3个零件;若分成9个零件一组,则多5个零件。下面程序是求这堆零件总数,请选择填空。#include main()int i;for(i=100;i200;i+)if(i-2)%4=0)if(!(i-3)%7)if(d)printf(“%d”,i);a)i%9=5 b)i%9!=5 c)(i-5)%9!=0 d)i%9=5d)下面程序是输出一个正整数等差数列的前十项,此数列前四项之和及之积分别是26和880,请选择填空。#include main()int a,d,i,s,f,x;/* a是第一项 */for(a=1;a30;a+)for(d=1; 【1-c】;d+)s=0; f=1; x=a;for(i=1;i=4;i+)s=s+x;f=f*x;x=x+d;if(s=26&f=880)for(i=0;i10;i+)printf(“%3d”, 【2-a】);printf(“n”);【1】a)d=a b)空 c)d=5 d)da【2】a)a+i*d b)i*d c)a+(i+1)*d d)a+de)下面程序的功能是求出用数字0至9可以组成多少个没有重复的三位偶数。请填空。#include main()int n,i,j,k;n=0;for(i=1;i=9;i+)for(k=0;k=8; 【k+=2】)if(k!=i)for(j=0;j=9;j+)if(【j!=i&j!=k】) n+;printf(“n=%dn”,n);2) 用于解决实际问题。例:a)以下程序是用梯形法求sin(x)*cos(x)的定积分。求定积分的公式为:其中xi=a+ih, h=(b-a)/n。设a=0,b=1.2为积分上下限,积分区间分隔数n=100,请填空。#include main()int i,n; double h,s,a,b;printf(“input a,b:”);scanf(“%lf %lf”, 【1】);n=100; h=【2】;s=0.5*(sin(a)*cos(a)+sin(b)*cos(b);for(i=1;i=1; j-b)下面程序的功能是将二维数组a中每个元素向右移一列,最右一列换到最左一列,移后的数组存到另一二维数组b中,并按矩阵形式输出a和b。请填空。例如:array a:array b: 4 5 66 4 5 1 2 33 1 2main()int a23=4,5,6,1,2,3,b23;int i,j;printf(“array a:n”);for(i=0;i=1;i+)for(j=0;j3;j+)printf(“%5d”,aij);【1】;printf(“n”);for(【2】;i+) bi0=ai2;printf(“array b:n”);for(i=0;i2;i+)for(j=0;j3;j+)printf(“%5d”,bij);【3】; 【1】bij+1=aij 【2】i=0;i2 【3】printf(“n”)5) 注意:二维数组的一维(行)表示形式代表的是相应行的首地址值;判断字符数组的操作结束条件是“0”。例:a)有十个字符串。下面程序的功能是在每个字符串中,找出最大字符按一一对应的顺序放入一维数组a中,即第i个字符串中的最大字符放入ai中,输出每个字符串中的最大字符。请填空。#include main()char s1020;int a10,i,j;for(i=0;i10;i+)gets(si); /* 二维数组的一维(行)表示形式 */for(i=0;i10;i+)【1】;for(j=1;sij!=0;j+)if(aisij) 【2】;for(i=0;i10;i+)printf(“%d %c”,i,ai);【1】ai=si0【2】ai=sij第八章 函 数重点:函数的定义形式;函数的形参与实参之间的二种值传递方式;函数的递归调用的解理和使用,对于函数的递归调用只有调用到最后开始返回上级函数时才能得到结果,所以阅读时要使用一个简单的数值进行分析;变量的存储类型(生存期和作用域),特别是局部 static变量的使用,它虽然没有扩展变量的作用域,但延长了变量的生存期,即该局部变量的值即使在子函数调用完毕也一直存在(即会保留运算结果,便于下次使用),不会由于重新调用子函数时对该静态局部变量重新初始化。但是,如果用static说明外部变量(即:全局变量),反而限制了该外部变量的作用域,即该外部变量只能被定义它的源程序模块使用。易错之处:1) 实参与形参的个数和类型必须一致,当实参和形参都是地址时,实现的是地址传递,这时实参与形参指向的是同一个内存存储空间,所以形参的变化会影响互实参,即实现双向数据传递。例:a)折半查找法的思路是:先确定待查元素的范围,将其分成两半,然后测试位于中间点元素的值。如果该待查元素的值大于中间点元素,就缩小待查范围,只测试中点之后的元素;反之,测试中点之前的元素,测试方法同前。函数binary的作用是应用折半查找法从存有10个整数的a数组中对关键字m进行查找,若找到,返回其下标值;返回-1。请选择填空。#include binary(int a10,int m)int low=0,high=9,mid;while(low=high)mid=(low+high)/2;if(mamid) 【2】;(为:b)else return(mid);return(-1);main()int a1012,3,45,67,32,7,9,80,54,10, m, i, no;printf(“input search number:”); scanf(“%d”, &m)no=search(a, m);if(no=0) printf(“nok found! is no. %d”,no+1);else printf(“nsorry not found!”);【1】 a)high=mid-1b)low=mid+1c)high=mid+1d)low=mid-1【2】 a)high=mid-1b)low=mid+1c)high=mid+1d)low=mid-1b)以下程序的输出结果是a=_36_,b=_16_,c=_19_。/*指针*/#include int func(int a,int *p);void main() int a=1,b=2,c; c=func(a,&b); b=func(c,&a); a=func(b,&c); printf(a=%d,b=%d,c=%d,a,b,c); int func(int a,int *p) a+; *p=a+2; return(*p+a);2) 局部static变量和外部变量作用。例:a)以下程序的运行结果是。int n=1;main()static int x=5; int y;y=n;printf(“main:x=%2d y=%2d n=%2dn”,x,y,n);func();printf(“main:x=%2d y=%2d n=%2dn”,x,y,n);func();func()static int x=4; int y=10;x=x+2;n=n+10;y=y+n;printf(“func:x=%2d y=%2d n=%2dn”,x,y,n); 结果: main:x=5 y=1 n=1fanc:x=6 y=21 n=11main:x=5 y=1 n=11fanc:x=8 y=31 n=213) 实际应用。例:下面程序的功能是:从键盘输入一个整数m(4m20),则输出如下的整数方阵(存入二维数组aa)。例如,若输入“4”和“5”,则分别输出1694125169419411616941254116994125161169441251691251694请改正程序中的错误语句,使它能得出正确的结果。改正后的语句是【1】和【2】。(注意:不得增行或删行,也不得更改程序的结构。)#include #include #define m 20void amatrix(int n,int xxm)int i,j;for(j=0;jn;j+)xx0j=(n-j)*(n-j);for(i=1;in;i+)for(j=0;jn;j+)/* 错误语句【1】 */xxij=xxi-1j+1;xxin-1=xxi-10;main()int aamm,i,j,m;printf(“nplease enter an integer number between 4 and 20:”);scanf(“%d”,&m);amatrix(m,aa);printf(“nthe %d*%d matrix generated:”,m,m);for(i=0;im;i+)printf(“n”);for(j=0;jm;j+)printf(“%4f”,(*(aa+i)j);/* 错误语句【2】 */结果:【1】for(j=0;jn-1;j+) 【2】printf(“%4d”,(*(aa+i)j);第九章 预处理命令重点:宏定义,特别是带参数的宏定义。易错之处: 在定义带参数的宏定义时,忘记了“( )”,使得展开不对。例:a) #define add(x) x+x main() int m=1,n=2,k=3;int sum=add(m+n)*k;printf(“sum=%d”,sum); 上面程序的运行结果是b 。a)sum=9 b)sum=10 c)sum=12 d)sum=18 b) 以下在任何情况下计算平方数时都不会引起二义性的宏定义是d。a) #define power(x) x*xb) #define power(x) (x)*(x)c) #define power(x) (x*x)d) #define power(x) (x)*(x) c) 以下程序的运行结果是b。 #define min(x,y) (x)(y)?(x):(y) main() int i=10,j=15,k;k=10*min(i,j); /* 展开后为:10*(i)(j)?(i):(j) 因为“*”的优先级比“ ? : ”高,则先作10*i=100,再与j=15进行比较。 */printf(“%dn”,k); a)10b)15c)100d)150d) 设有宏定义如下: #define min(x,y) (x)(y)?(x):(y) #define t(x,y,r) x*r*y/4 则执行以下语句后,s1的值为【0】,s2的值为【11】。 int a=1,b=2,c=3,s1,s2; s1=min(a=b, b-a); s2=t(a+, a*+b, a+b+c);第十章 指 针重点:指针的定义和使用方法,特别要明确指针是一个存储内存地址的变量(而一维数组名或二维数组的一维表示形式都是地址常量);明确数组与指针、字符串与指针、函数与指针的关系;认识指针数组和指向指针的指针。易错之处:1) 没有搞清数组与指针之间的对应关系。当一个指针指向了一个数组后,数组名可以用指针变量名来代替。注意:指针定义后一定要有具体指向后才能使用。 例:a) 若有以下说明和语句,且0=i10, 则下面哪个是对数组元素的错误引用?(单选)int a=1,2,3,4,5,6,7,8,9,0, *p, i;p=a; a. *(a+i) b. ap-a c. p+i d. *(&ai) 答案: cb) 若有以下说明和语句,且0=i10,则下面哪个是对数组元素地址的正确表示?(单选) int a=1,2,3,4,5,6,7,8,9,0, *p,i; p=a; a. &(a+1) b. a+ c. &p d. &pi 答案: d2) 当一个指针指向数组后,指针n表示移动了几个元素,而不是几个字节。(数组名也是如此) 例:a)以下程序的输出结果是_。#include main() int a=1,2,3,4,5,6,*p; p=a; *(p+3)+=2; printf(%d,%dn,*p,*(p+3); a. 0,5 b. 1,5 c. 0,6 d. 1,6 答案: db)已知有以下的说明,int a=8,1,2,5,0,4,7,6,3,9; 那么a *(a+a3) 的值为_ _. 答案: 03) 要明确各种类型指针定义的实际含义。4) 指向同一个数组的两个指针可以做减()运算,其结果这两个指针之间间隔的元素个数。例:若有以下说明和语句,,则p2p1的值为多少?(单选) int a10, *p1, *p2; p1=a; p2=&a5; a. 5 b. 6 c. 10 d. 没有指针与指针的减法 答案: a5) 注意指针数组中的每个元素都是一个指针,可以指向一个地址。要知道main( )函数可以带指针数组作为其参数。例:某一程序test.c的主函数为:main( int argc, char *argv ),编译后运行:test 123 456 abc enter 则相应的argc及argv3分别为:a) 3 “456” b) 3 “abc” c) 4 “456” d) 4 “ abc” argv0 “test” argv1 “123” argv2 “456” argv3 “abc” 第十一章 结构体和共用体重点:掌握结构体类型的说明和相应变量的定义方法,要知道结构体类型定义只是在程序中说明了一种新的数据类型,如果不定义相应的变量,程序中是不存在相关的成员数据,只有定义了这种类型的变量才能通过该变量存取其中的成员数据;掌握如何通过结构体变量来引用结构体成员,实际结构体与数组是一样的都是整体定义单个使用,只是再使用成员时通过两种方式实现:变量名.成员名或指针变量名-成员名;掌握结构体变量中成员初始化的方法。对于共用体只要掌握基概念和变量的引用方法。例:a)head为指向以下结构的链表指针, 统计链表中所有inf域值之和s的程序段为: struct nlist int inf ; struct nlist *next; *head, *p; long s; for (p=head, s=0; _p != null_ ; p = p-next) s += _p-inf_;b)struct student int num; char name20; char sex; int age; ; struct student stu3 = 1001, “li lin”, m, 18, 1002, “zhang fun”, m, 19, 1004, “wang min”, f, 20 ; main() struct student *p; p = &stu1; printf(“%dn”,(p+)-num); /* n

温馨提示

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

评论

0/150

提交评论