C语言程序设计习题1.docx
- 文档编号:10307042
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:15
- 大小:22.46KB
C语言程序设计习题1.docx
《C语言程序设计习题1.docx》由会员分享,可在线阅读,更多相关《C语言程序设计习题1.docx(15页珍藏版)》请在冰豆网上搜索。
C语言程序设计习题1
第一套习题
1.填空题
(1)一个C程序的执行顺序是:
从本程序的_函数开始,到本程序的_函数结束。
(2)若有定义:
“inta=12,b=15;”则运算表达式a=a>0?
-a:
a和b=6,2*b后的值为_,b的值为_。
(3)已有定义intd=-3,执行以下语句的输出结果是_。
Printf(“*d1=%d*d2=%3d*d3=%-3d*\n”,d,d,d);
(4)A=6,b=3,c=2时,表达式啊,a>b!
=c的值是_。
(5)下面程序的运行结果是_。
#include
min()
{
intx,y,n,i:
x=2:
y=0;n=1;i=1
while(i<8){n*=x;y+=n;++i}
printf(“y=%d”,y)
}
(6)C语言中,二维数组定义的一般形式为:
类型说明符数组名[_][_]。
(7)下面sub函数的功能是求两个参数的差,并将差值返回调用函数。
函数中错误的部分是_,改正后为_。
voidsub(inta,intb)
{
intc;
c=a-b;
returnc;
}
(8)下面程序的错误是_。
main()
{
inta,*p;
a=20;
*p=a-5;
printf(“%d”,*p);
}
(9)宏替换不占用_时间,只占用_时间。
(10)结构体类型与结构体变量是不同的概念。
在程序中只能对_赋值、存取或运算,而不能对_赋值、存取或运算
(11)在C语言中,&作为双目运算符时表示的是_运算,作为单目运算符时表示的是_运算。
2.选择题
(1)下面叙述正确的是()
A.一个C源程序可以由一个或多个函数组成
B.C源程序的每行只能写一条语句
C.在C源程序中,main函数必须位于程序的最前面
D.C语言本身没有输入输出语句
E.在C源程序中,注释说明只能位于一条语句的后面
F.一个C源程序必须包含一个main函数
(2)能正确表示“当X的取值在[3,20]和(150,250)范围内为真,否则为假”的表达式是_。
A.(X>=3)&&(X<=20)&&(X>150)&&(X<250)
B.(X>=3)‖(X<=20)‖(X>150)‖(X<250)
C.(X>=3)&&(X<=20)‖(X>150)&&(X<250)
D.(X>=3)‖(X<=20)&&(X>150)‖(X<250)
(3)已知定义“inta;floatb;”且执行“scanf(“%4d%f”,&a,&b);”语句时,第一列开始输入数据5678︹234<回车>,则a的值为_,b的值为_。
(注:
︹表示空格)
A.56789B.5678C.9D.6789E.9.000000F.789.000000
G.234.000000
(4)有以下程序:
#include
main()
{
floatx,y;
scanf(“%f”,&x);
if(x<0.0)y=0.0;
elseif((x<5.0)&&(x!
=2.0))y=1.0/(x+3.0);
elseif(x<10.0)y=1.0/a;
elsey=10.0;
printf(“%f\n”,y);
}
若运行时输入,2.0<回车>,则上面的输出结果是_。
A.0.000000B.0.50000C.10.000000D.0.250000
(5)如果先定义有“intI;”语句,以下是死循环的程序段是_。
A.for(i=1;;)
{
if(++i%2==0)continue;
if(++i%3==0)break;
}
B.i=30000;
do{if(i<0)break;}while(++i)
C.for(i=1;;)if(++i<10)continue;
D.i=1;
While(i--);
(6)以下对一维数组b的正确说明是_。
A.intb(11);
B.intn=11,b[n];
C.intn;scanf(“%d”,&n);intb[n]
D.#defineS15
intb[S];
(7)在C程序中,函数返回值的类型取决于_。
A.调用该函数时的主调函数类型
B.return语句中的表达式类型
C.在定义该函数时指定的函数类型
D.调用该函数时系统自动设定为整型
(8)执行以下程序后,x的值为_,y的值为_。
main()
{
intx,y,z=4,m=6,*p1=&z,*p2=&m;
x=p1==&m;
y=(-*p1)/(*p2)+7;
printf(“x=%d\n”,x);
printf(“y=%d\n”,y);
}
A.-1,5B.1,6C.0,7D.4,10
(9)如果一个变量只有几种可能的值,可以定义为_类型,这种定义类型用_开头。
A.结构体,structB.枚举,enum
C.公用体,unionD.自定义,typedef
(10)系统分配给一个已定义结构体变量的内存是_。
A.各成员所需内存量的总和B.结构中第一个成员所需的内存量
C.成员中占内存量最大者所需的容量D.结构中最后一个成员所需内存量
(11)若要用fopen函数打开一个新的二进制文件,该文件既要能读也要能写,则文件方式字符串应该是_。
A.“ab+”B.“wb+”C.“rb+”D.“ab”
3.解答题
(1)指出下列程序的错误。
#incude
main()
{
inta,b;
scanf(“%d%d”,a,b);
a=a+b;
b;
printf(“%d%d”,a,b);
}
(2)按一下函数关系编写程序,要求对每个输入的x值,计算出相应的y值。
X
y
X<=0
0
0 12 22 0.8x+22 (3)有一数列,第一数位1,第二个数也为1,以后各数为前两个数之和。 试用数组方法编程打印这个数列的前15个数。 (4)从键盘输入8个整数,用指针方法编程找出其中最大和最小的数。 (5)改正下列程序中的错误。 注意: 不得增行或删行,不能改动程序结构。 #include #definePOSa>0 main() { inta=9; a+=a%=2; if(POS) printf(“aispositive”); else printf(“aisnotpositive”) } (6)任何一个英文字母的ASCII码,都能以一个由2位组成的十六进制数表示。 请编写一个程序,它能在某个英文字母后,输出2个数,一个是该字母的以2位十六进制表示的ASCII码,另一个数十表示该字母ASCII码的2位十六进制数互换位置后的十六进制数。 如输出十六进制数61和16 4.编程题 (1)已有firstnode指向一个具有头结点的单向链表,链表中每个节点包含整型数据域(idata)和指针域(pnext)。 今欲把值为m的结点插在值为n的结点之前,若没有值为n的结点,则把值为m的结点插在链表最后。 请编写一函数insertm实现上述要求。 第一套解答 1.填空题 (1)答案: main函数(或主函数),main函数(或主函数) 说明: C语言规定: C程序总是从main函数第一条语句开始执行,最后到main函数的最后一条语句结束。 (2)答案: -12,6 说明: 按照C语言条件表达式(x? y: z)的运算规则,若x为真,则表达式的值为y;若x为假,则表达式的值为z。 所以,a=12时a>0成立,故此时a=-a=-12。 逗号是C语言中运算优先级最低的运算符,故当b=12时逗号表达式b=6,2*b的值为12,但运算后b的值为6。 (3)答案: *d1=-3*d2=︹-3*d3-3︹*(︹表示空格) 说明: 格式符%md表示如下含义: %d表示按实际长度输出十进制整型数据;如果m为正整数,m为指定的输出字段的宽度,当数据的位数小于m时,左端补以空格,当数据的位数大于m时,按实际位数输出;如果m为负数,|m|为指定的输出字段宽度,当数据的位数小于|m|时,右端补以空格,当数据的位数大于|m|时,按实际位数输出。 所以,*d1=%d,对应输出*d1=-3,*d2=%3d对应输出*d2=︹-3,*d3=%-3d*对应输出*d3=-3︹*。 (4)答案: 1 说明: 逻辑运算符>的优先级高于! =,所以,当a=6,b=3,c=2时,a>b的值是1,1! =c为真,其值是1。 (5)答案: 254 说明: 本题的关键是要清楚while语句的用法。 while语句的一般形式为while(表达式)语句。 当表达式为非0时执行while语句中内嵌语句。 另外,要注意在本题中n*=x相当于n=n*x,y+=n相当于y=y+n。 (6)答案: 常量表达式、常量表达式 (7)答案: voidsub(inta,intb),intsub(inta,intb) 说明: 当不要求函数具有返回值时,用void定义函数。 如果要求函数具有返回值,就要根据函数返回值的类型进行定义,譬如,函数返回值是整型,则用int定义,返回值是自符型,则用char定义,等等。 本题中,函数sub具有返回值c,且c为整型,所以,不能用void定义sub函数,而应该用int定义该函数。 (8)答案: 指针P使用前未赋值 说明: 当指针未被赋值时,指针的值是一个不确定的值,即实际上可能指向一个事先未指定的单元。 这种情况很危险。 因为,在引用指针之前应它赋值。 本题中,指针P被定义后,应先赋值,如可以令P=&a,然后再引用*P=a-5. (9)答案: 执行(或运行),编译 (10)答案: 结构体变量,结构体类型 (11)答案: 按位于,取地址 说明: 进行单目运算时,&表示取地址。 进行双目运算时,&表示按位与运算。 2.选择题 (1)答案: A、D、F 说明: 在C语言中,C源程序是由一个或多个函数组成,其中必须且只能包含一个main函数,main函数可以在C源程序中的任何位置。 C程序的语句以分号为终结符,根据实际情况每行可以写一条或多条语句。 C源程序的注释说明用/*和*/作为两侧的分界符,根据需要可以放在一条语句之前、一条语句之后或程序的最前面,等等。 与其他高级语言不通,C语言本身没有输入输出语句,C语言利用标砖库函数(如scanf和printf等)实现数据的输入输出。 (2)答案: C 说明: 逻辑与&&的优先级高于逻辑或‖得优先级。 所以,(x>=3)&&(x<=20)表示x在闭区间[3,20]取值时为真,(x>150)&&(x<250)表示x在开区间(150,250)取值为真,表达式(x>=3)&&(x<=20)‖(x>150)&&(x<250)表示“当x的取值在[3,20]和(150,250)范围内为真,否则为假”。 注意,以上表达式也可去掉括号,因为逻辑运算符&&和‖的运算优先级低于关系运算符>=、<=、<和>的优先级。 (3)答案: B、E 说明: 用scanf输入数据时,在以下情况下认为该数据输入结束: 一是遇空格、“回车”键或TAB键;二是按宽度截取,如“%4d”,只取4列;三是遇非法输入,如想输入10.56,但却错打入1o.56,结果1被输入后,该数就被认为输入完。 对于本题,a取值按宽度截取,为5678/。 然后接着输入b的值,由于9后面是空格,故b的值是9.000000。 (4)答案: B 说明: 本题的关键点是要掌握条件语句的用法。 本题中if和elseif后面都有“表达式”,若表达式的值为非0,执行紧随其后的语句,然后结束if语句的执行,若为0,就进行下面“表达式”的判断。 本题中的x等于2.0,“表达式”中只有x<10.0为非0,故应执行其后语句y=1.0/a,最后屏幕输出是0.500000。 (5)答案: C 说明: 本题要点: 首先,对于循环语句for(表达式1;表达式2;表达式3)语句,若表达式2为空,则认为循环判断条件总为真。 其次,continue语句结束本次循环,break语句用于整个循环语句。 第三,整型变量i在-32768-32767之间变化。 对于程序段B,当i由30000增大到超过32767时,i变为负值,执行“if(i<0)break;”后,可结束循环。 对于程序段C,for语句的表达式2总为真,又没有break语句,故这是一个死循环程序段。 对于程序段D,i从1自减为0时,while(--i)结束执行。 (6)答案: D 说明: 一维数组定义式为 类型说明符数组名[常量表达式]; 在选择项A中,使用圆括号定义数组时错误的,应该使用方括号。 在选择项B中,方括号中是一个变量n,不属于常量表达式,也不正确。 选项C中存在与选择项B中相同的错误。 在选择项中D中,预处理语句把S定义为一个常数,编译后int[S]变成int[15],这是正确的数组定义。 (7)答案: C 说明: C语言规定函数的返回值通过函数中的reture语句获得,函数返回值的类型就是定义该函数时的函数类型。 如果函数值的类型和reture语句中的表达式的值不一致,则以函数类型为准。 如果函数定义时未加类型说明,一律自动按整数处理。 (8)答案: C 说明: 在“intx,y,z=4,m=6,*p1=&z,*P2=&m;”语句中,定义了4个整型变量和2个整型指针变量,注意指针变量p1和p2在定义时即被赋初始值,分别指向z和m。 在x=p1==&m语句中,赋值号=的右边是一个关系表达式p1==&m,因p1不指向m,故p1==&m的值为0,于是x为0。 在“y=(-*p1)/(*p2)+7”语句中,*p1等于整型数4,*p2等于整型数6,故(-*p1)/(*p2)等于0,于是y等于7。 (9)答案: B 说明: 如果变量的值有限,可以一一列举出来,则可以用枚举类型定义这种变量。 定义枚举类型用enum开头。 定义形式为: enum枚举变量{枚举变量} (10)答案: A 说明: 在C语言中,系统分配给一个已定义结构体变量的内存,是该结构变量的各成员所需内存量的总和。 而系统分配给一个已定义共用体变量的内存,则是该共用体变量的成员中占内存量最大所需的容量。 这是结构体格共用体的一个重要区别。 (11)答案: B 说明: 在fopen函数的使用文件方式字符串中,“r”: 打开文本文件用于读。 “w”: 创建文本文件用于写,并删除已存在的内容(如果有的话)。 “a”: 打开或创建文本文件用于在文件末尾写。 “r+”: 打开文本文件用于更新(即读和写。 )“w+”: 创建文本文件用于更新,并删除已有的内容(如果有的话)。 “a+”: 打开或创建文本文件用于读和在文件末尾写。 对于上述各种情况,如有b表示操作二进制文件,无b表示操作文本文件。 对于本题要建立一个新的文件,故在使用文本方字符串中要有w,又要能写能读,要有+,操作二进制文件,要有b。 于是使用文件方式字符串应为“wb+”。 3.解答题 1.答案: scanf函数从标准输入流(一般为键盘输入)读取字符序列,它的转换规格说明用于表示读取字符的格式,用于读取的变元必须是指针。 所以,本题中的“scanf(“%d%d”,a,b);”有误应该为scanf(“%d%d”,&a,&b)。 2.答案: #include main() { floatx,y; scanf(“%f”,&x); if(x<=0)y=0; elseif(x<=22)y=12; elseif(x<50)y=0.8*x+22; elseprintf(“xisnotinthedefinitionrange.”); if(x<50)printf(“y=%f”,y) } 说明: 这是一个分段函数的计算问题。 根据不同的条件,用不同的函数计算,这种情况适合用分支结构的程序实现,可选用if语句或switch语句编程。 本题选择if语句编程。 3.答案: #include main() { inti; \*定义一个整型变量作循环变量*\ staticintnum[15]={1,1}; \*定义静态整型数组,并给前两个数赋初始值*\ for(i=2,i<15,i++)num[i]=num[i-2]+num[i-1]; \*计算第二个元素之后各元素的值*\ for(i=0,i<15,i++)printf(“%d”,num[i]); \*打印数组各个元素值*\ } 说明: 本题编程时应注意两点: 一是通常使用循环语句处理有重复计算的问题;二是数组赋初始值时应定义数组为静态存储或外部存储,还有就是数组下标不要越界(如本题中15个元素数组,其下标最大值为14)。 (4)答案: #include main() { inti,num[8]/*定义1个整型变量和1个数组*/ int*p,*max,*min;/*定义3个指针变量*/ printf(“input8integersplease.\n”); for(i=0;i<8;i++)scanf(“%d”,&num[i]);/*循环读取8个整数*/ max=min=p=num; for(;p { if(*p>*max)max=p;/*搜索指向数组最大数据元素的指针*/ if(*p<*min)min=p;/*搜索指向数组最小数据元素的指针*/ } Printf(“\n%d,%d”,*max,*min);/*打印数组最大和最小数据元素*/ } (5)答案: C语言中的编译预处理命令包括三种: 宏定义、文件包含和条件编译。 这些命令以符号#开头,结尾没有分号之类的符号。 在本题中,宏定义命令“#definePOSa>0;”结尾有分号,这是错误的,应改为#definePOSa>0的形式。 (6)答案: #include main() { chara,b,c;/*定义3个字符型变量*/ printf(“inputaEnglishcharacterplease: ”); scanf(“%c”,&a);/*输入1个英文字母*/ printf(“\n%x”,a);/*以十六进制数表示该字母的ASCII码*/ b=(a&0xf)<<4;/*与高位是4个0低位时4个1的数按位与,再左移4位*/ c=(a&0xf0)>>4;/*与高位是4个1低位时4个0的数换位与,再右移4位*/ a=b|c;/*ASCII码中移到高位的十六进制数与移到低位的十六进制数按位或*/ printf(“\n%x”,a);/*打印结果*/ } 说明: 本题的实质是把字母的ASCII码的高位十六进制数与低位十六进制数进行位置交换。 可采用如下方法处理: 先把高位十六进制数屏蔽掉,左移4位以使低位十六进制数移到高位;再把低位十六进制数屏蔽掉,右移4位以使高位十六进制数移到低位;最后把这两个数按位进行或运算。 4.编程题 (1)答案: #defineNULL0/*NULL代表0,表示“空地址”*/ #defineLENsizeof(structmynode)/*LEN代表sturctmynode结构数据的长度*/ structmynode/*定义结点为结构体类型*/ { intidata; structmynode*pnext; }; insertm(firstnode,n,m);/*定义firstnode为指针,它指向链表的头结点*/ intn,m; { structmynode*s,*p,*q;/*定义3个指针*/ s=(structmynode*)malloc(LEN);/*令s指向新开的结点*/ s->idata=m;/*令新开结点的整数域等于m*/ q=firstnode;p=firstnode->pnext;/*令头结点为当结点(q所指),p指向下一个结点*/ if(p==null) {s->pnext=p;q->pnext=s;return;}/*若当前节点指向空,则令s所指结点为头结点*/ while((p->idata! =n)&&(p->pnext! =NULL))/*查找整数域为n的结点或链表尾结点*/ {q=p;p=p->pnext;} if(p->idata==n) {s->pnext=p;q->pnext=s;}/*若当前结点整数域为n,则在它之前插入s所指结点*/ else {s->pnext=NULL;p->pnext=s;}/*若未找到整数域为n的结点,把s所指结点作尾结点*/ } 说明: 该算法的思路是: 令s指向整数域为m的结点,q指向链表的当前结点,p指向链表当前结点的下一个结点。 从该单向链表的头结点开始搜索检验,如果firtnode指向空,则把s所指结点作为链表的一个结点加入,即令firtnode指向该节点,该结点的指针域指向空。 如果当前结点的整数域为n或当前结点的指针域为空,则停止逐个结点的搜索检验,把s所指结点插入。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 习题