《C语言程序设计》课程重点、难点及例题分析第一章重点:(1)算法的特性;(2)简单算法的设计;(3)c程序的基本结构。难点:算法设计以及表示方法是本章的难点。算法在程序设计中占有重要的地位,是程序设计的灵魂。算法设计师程序设计必不可少的步骤。结构化的程序设计方法在其中起着重要的作用。用结构化程序设计方法设计算法可使编写的程序结构清晰,易于调试和修改。算法的表示有流程图、N-S图、PAD图以及伪代码等,图形表示使得程序的控制结构清晰。伪代码不能在计算机上执行。例题:1.1C语言源程序的最小单位是:A.程序行B.语句C.函数D.字符【分析】程序行、语句和函数都是由字符构成的,字符是C语言最小单位。正确答案:【D】1.2C语言源程序文件的后缀是,经过编译后生成文件的后缀是,经过连接后生成的文件后缀是。【分析】文件的后缀即是文件的冠名,主要用来标示该文件的类型。C语言源程序文件的扩展命为”c”;经过编译后生成目标程序,其文件的扩展名为”obj”,目标程序必须经过连接生成可执行程序才能运行,其扩展名为”exe”,本题的答案分别是”c”、”obj”、”exe”。第二章重点:(1)标示符的正确使用;(2)变量和常量的定义与应用;(3)C语言的各种基本数据类型及其标示方法;(4)C语言的各种运算符的优先级和结合性;(5)C语言表达式的运算以及计算过程的类型转换;难点:数据类型的概念;各种类型的数据在内存中的存储方式;运算符对运算对象类型的要求和限制,这涉及到运算对象类型的自动转换和牵制转换的概念;C语言表达式的运算,特别是自增/自减运算等。例题:2.1不是C语言基本数据类型的是:。A.指针类型B.整型C.无符号长整型D.单精度型【分析】c语言的数据类型分为两大类,基本类型和构造类型。指针类型即不是基本类型也不是构造类型。正确答案:【A】2.2表达式!2+12&&15%5+2的值是:A.0B.1C.2D.3【分析】本题是考核对运算符优先级的掌握程度,注意逻辑运算符“!”的优先级高于所有的算数运算符,而“&&”和“||”的优先级则低于所有的关系运算符。正确答案:【A】2.3执行下面的程序断后,输出结果为:intx=1,y=1,z=1;x=x+++y+++z++;printf(“%d,%d,%d”,x,++y,z++);A.4,3,2B.3,3,2C.3,3,3D.3,2,2【分析】语句x=x+++y+++z++;可以改写成x=(x++)+(y++)+(z++),执行此语句后,得到结果x=4,y=2,z=2,在执行printf语句,注意printf语句中变量y是一个自增(前缀)运算,所以输出的y的值是3,变量z是一个后缀的自增运算,输出的z的值为2。正确答案:【A】第三章重点:(1)顺序、选择、循环三种结构的设计与使用;(2)格式输入/输出函数的各种使用方法;(3)条件的表示方法与运算策略;(4)if语句的执行过程:三种形式的if语句的正确使用方法;(5)switch语句的流程控制;(6)分支嵌套的执行过程以及嵌套的使用;(7)循环语句while、do…while、for的构成、区别与转换;(8)循环前套的执行过程与前套的使用;(9)break、continue、goto语句的使用方式。(9)难点:运用三种基本结构实现简单算法是本章的重点。因此下面的内容需要注意:格式输入/输出函数中的各种格式控制形式的变化与使用,例如精度的使用等;在构成选择条件时的逻辑表达式设置形式;if…else语句的匹配原则(不以形式上相邻,而从最内层开始);if语句的嵌套;switch语句的嵌套以及switch语句break的正确使用;For语句表达式的各种省略方式、处理方法;多重循环初始值的设置值与设置点;break、continue、goto三个语句的区别和联系。例题:3.1已知:intx;floaty;语句scanf的调用格式为:scanf(“x=%d,y=%f”,&x,&y);则为了将数据10和66.6分别赋给x和y,正确的输入应当是()。A.x=10,y=66.6回车B.10,66.6回车C.10回车66.6回车D.x=10回车y=66.6回车【分析】本题考察的使scanf函数的输入格式,在scanf函数中,如果格式字符串中除了格式字符外还有其他字符,则在输入数据时,其他字符应原样输入。本题中格式字符中由”x=”、”,”、”y=”等字符,这些字符在输入时应原样输入。正确答案:A3.2下面程序的执行的结果为:#includestdio.hmain(){intx=5;{inty=x,z;intx=10;z=x;printf(“%d,%d,%d\n”,x,y,z);}}【分析】x在开始和后面的复合语句块中分别被定义,它们被赋予了不同的初值.在复合语句块中x等于5的值赋给了y,接着在重新定义x的同时将10赋给了它,所以z的值为10。最后的输出结果为x=10,y=5,z=10。3.3下面程序的执行的结果为:#includestdio.hmain(){inta,b;for(a=1,b=1;a=100;a++){if(b=20)break;if(b%3==1){b+=3;continue;}b=-5;}printf(“%d\n”,a);}【分析】for语句的表达式1是一个逗号表达式,这是for语句很有用的一个特性,可一次完成对多个变量的赋初值的功能,应学会使用。循环体中有一条break语句和一条continue语句,分析程序时要注意它们的作用:当b=20时,执行break语句直接跳出循环体而执行最后一条printf语句;当b%3==1时,b+=3后,执行continue语句跳出此次循环,进行下一次循环处理。所以最后的输出结果为8。3.4程序的功能是统计用0~9之间不同的三个数字构成一个三位数的个数。请填空。#includestdio.hmain(){inta,b,c,count;for(a=1;a9;a++)for(b=0;b=9;b++)if(【1】)continue;for(c=0;c=9;c++)if(【2】)count++;printf(“%d”,count);}【分析】构成三个数字不同的一个三位数的采用三重循环处理,百位上的数字的取值范围在1~9之间;十位数字和个位数字的取值范围是:0~9。不同的条件是百位、十位、个位上的数不能相等。正确答案:【1】a==b【2】c!=a&&c!=b第四章重点:(1)库函数的正确调用(头文件的正确包含);(2)函数的定义;(3)函数的声明与return语句使用;(4)函数的调用与参数传递原则(传值/传址);(5)函数的嵌套调用与递归调用;(6)变脸个存储类型及其特性。难点:函数定义、声明、调用三者之间的联系和区别;函数的调用(无值/带值);参数传递过程中传值与传址之间的区别与正确使用方法;递归函数的构建(条件及形式)和动态执行过程;不同函数中变量的适用范围;变量的生存期和作用域。递归和递推、迭代之间色区别和联系。正确包含库函数的头文件,不同的库函数可能头文件不同;例题:4.1以下函数值的类型是。fun(floatx){floaty;y=3*x-4;returny;}【分析】本题考察函数返回值的应用。当使用return语句返回的值的类型与函数定义时规定的返回值类型不一致时,应意定义时的类型为准。将return语句返回时的值的类型转换为定义是规定的类型,定义函数时如果没有给出返回值的类型,则默认类型为int。所以正确答案应为int类型。4.2对于C语言的函数,下列说法正确的是:A.函数的定义不能嵌套,但函数的调用可以嵌套。B.函数的定义可以嵌套,但函数的调用不能嵌套。C.函数的调用和定义都不能嵌套。D.函数的定义和调用都可以嵌套【分析】C语言不允许嵌套定义,但是允许嵌套调用。正确答案:【A】4.3下面程序的执行的结果为:#includestdio.hmain(){intx=2,p;p=f(x,++x);printf(“%d”,p);}intf(inta,intb){intc;if(ab)c=1;elseif(a==b)c=0;elsec=-1;return(c);}【分析】在程序中的第四行有p=f(x,++x);语句,它的作用是将一个函数调用的结果赋给变量p中。在函数体f(a,b)中,a和b所对应的实参为2和3,通过函数体内的条件语句进行判断可知执行的是c=-1这条语句,所以返回值为-1。最后的输出结果为-1。第五章重点:(1)一维数组的定义、引用和初始化;(2)二维数组的定义、引用和初始化;(3)字符数组(字符串)的定义、引用和初始化;(4)各类数组的存储方式;(5)字符串库函数的调用和使用。难点:利用数组解决实际问题。c语言的数组必须先定义后使用,不允许动态定义;对数组的存储方式按行存储的理解;二维数组初始化的不同形式;字符数组与字符串之间的关系,字符数组与字符串初始化的区别;字符串库函数的正确使用。例题:5.1以下正确的数组定义为:A.inta[1][3]={1,2,3,4};B.floatb[3][]={{1},{2},{3,4}};C.longc[2][4]={{1},{2},{3},{1,2,3,4}};D.doublet[][2]={0};【分析】如果二维数组在说明的同时进行初始化,则一维长度可以省略,但不允许省略二维长度,初始化的数据个数不允许超过二维数组定义的数组元素的个数。正确答案:【D】5.2若有以下的数组定义:chara[]=“12345”;charb[]={‘1’,‘2’,‘3’,‘4’,‘5’};则正确的描述是:A.a数组和b数组的长度相等B.a数组的长度大于b数组的长度C.a数组的长度小于b数组的长度D.两个数组中存放相同的内容【分析】可以利用字符串常量给字符数组赋初值,但是要注意:在存储一个字符串时,系统自动在其末尾加一个字符串结束标志“\0”。虽然字符串的长度为5,但在内存占6个字节,因此数组a的长度应该为6,而数组b赋的初值是字符常量,在内存中分配5个字节。正确答案:【B】5.3设有下列程序段,执行后的输出结果是:chara[]=“\\\”A\n%d%c”;printf(“%d\n”,strlen(stract(a,“good”)));A.5B.6C.11D.12【分析】函数strlen的功能是求字符串参数的长度并返回,stract函数的功能是进行两个字符串的合并,即将一个字符串追加到另一个字符串的结尾处。需要注意的是:a[]=“\\\”A\n%d%c”中的%d%c不是输入输出函数的格式控制符,而是字符串中的4个普通字符;另外这两个函数实现过程中是不对字符串的结束标志进行处理的,所以在函数stract(a,“good”)执行后,a的值为“\\\”A\n%d%cgood”对该字符串求长度,结果为12。5.4下面findmax函数将返回数组a中最大元素的下标,数组元素的个数由x传入。请填空。findmax(inta[],intx){intk,p;for(p=0,k=p;px;p++)if(a[p]a[k])【1】;return(k);}【分析】函数的功能是返回数组中最大的元素的下标,函数中用于返回的变量是k,所以k就是记录最大数组元素下标的变量,在程序中,应对其赋值。for循环中,当a[p]a[k]时,元素a[p]的值为本次循环中的最大值,应该记录p的值到k中。正确答案:【1】k=p第六章重点:(1)指针的概念;(2)指针与指针变量的区别;(3)指针变量的引用与指针运算;(4)指针处理一维数组;(5)指针处理字符串;(6)指针作为参数进行函数的传址调用。难点:指针变量的概念、利用指针传址调用以及一维数组的数组名/起始地址与指针变量的关系。指针变量与内存地址的关系;指针变量与指针所指向变量的区别和联系;指针运算的不同表示方式;函数指针的处理。例题:6.1下面程序段运行的结果是:。char*s=“abcde”;s+=1;printf