C语言程序设计习题1.docx

上传人:b****3 文档编号:3877475 上传时间:2023-05-06 格式:DOCX 页数:15 大小:22.46KB
下载 相关 举报
C语言程序设计习题1.docx_第1页
第1页 / 共15页
C语言程序设计习题1.docx_第2页
第2页 / 共15页
C语言程序设计习题1.docx_第3页
第3页 / 共15页
C语言程序设计习题1.docx_第4页
第4页 / 共15页
C语言程序设计习题1.docx_第5页
第5页 / 共15页
C语言程序设计习题1.docx_第6页
第6页 / 共15页
C语言程序设计习题1.docx_第7页
第7页 / 共15页
C语言程序设计习题1.docx_第8页
第8页 / 共15页
C语言程序设计习题1.docx_第9页
第9页 / 共15页
C语言程序设计习题1.docx_第10页
第10页 / 共15页
C语言程序设计习题1.docx_第11页
第11页 / 共15页
C语言程序设计习题1.docx_第12页
第12页 / 共15页
C语言程序设计习题1.docx_第13页
第13页 / 共15页
C语言程序设计习题1.docx_第14页
第14页 / 共15页
C语言程序设计习题1.docx_第15页
第15页 / 共15页
亲,该文档总共15页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

C语言程序设计习题1.docx

《C语言程序设计习题1.docx》由会员分享,可在线阅读,更多相关《C语言程序设计习题1.docx(15页珍藏版)》请在冰点文库上搜索。

C语言程序设计习题1.docx

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所指结点插入。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工作范文 > 行政公文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2