文档库 最新最全的文档下载
当前位置:文档库 › C语言程序设计各章练习题

C语言程序设计各章练习题

C语言程序设计各章练习题
C语言程序设计各章练习题

《C 语言程序设计》各章练习题

2016年12月汇编

第1-3章 C 语言基础、编程规范、顺序结构程序设计

编程题1:设a 和b 均为int 型变量,编写一个程序,通过键盘读入a,b 的值,然后交换a,b 的值。要求屏幕显示“输入2个整数,用空格隔开”的提示语句,并且输出交换前a,b 的值,交换后a,b 的值。 附加要求:(1)允许定义第3个变量,实现交换; (2)不允许定义第3个变量,实现交换。

第4章选择结构程序设计

编程题2:根据下列函数关系写程序,要求提示输入x 的值,输出y 的值。

???

????>=<+-=0

02

0212x x x x x y

编程题2:根据下列函数关系写程序,要求提示输入x 的值,输出y 的值。

??

???>≤≤--<=0

022

22x x x x x y

编程题3:求 ax 2+bx+c=0方程的解。(只输出b 2-4ac>=0的求解结果,小于0,输出“不予求解!”)

第5章 循环结构程序设计

编程题4:编程计算∑=n

i i

1。要求提示键盘输入n ,如n 为负数,不予计算,直接返回。 编程题5:编程序计算n !,要求n 从键盘输入,如n 小于0,不予计算。

编程题6:从键盘输入一个数n ,判断n 是否是素数。

编程题6:编写程序输出1~100之间的偶数,要求屏幕显示时5个偶数一行,每个数占5位,右对齐。

编程题7:编程计算100到1000之间有多少个数其各位数字之和是5,并将其输出。

编程题8:求满足下列条件的三位数n ,它除以11(整数相除)所得到的商等于n 的各位数字的平方和,且其中至少有二位数字相同的数。

编程题9:有一些十进制整数对ab 和cd 具有如下特性:ab×cd=ba×dc ,其中a≠b 且c≠d 。如:12×42=21×24。请编程找出30~50之间满足上述等式所有m ,n 值,并按上述等式的格式输出。(×用*表示)

编程题10:从键盘上输入一个整数,然后把这个整数的各位逆序输出。例如,输入123456,输出654321。

第6章 数组

编程题11:有一个已排好序的数组int a[11]={-5,-3,0,6,8,12,16,28,66,88};,要求输入一个数后,按原来排序的规律将它插入数组中。

编程题12:输入一个字符串(字符个数为小于100),统计其中字母、数字、空格以及其它符号的个数,并将大写字母改为小写字母,输出改变后的字符串。(提示:A 的ASCII 值为65,a 的ASCII 值为97) 编程题12:输入一行字符(字符数组的个数小于100),统计其中字母、数字以及其它符号的个数。(注:数组限定字符个数小于100)

编程题12:输入一行字符,分别统计出其中英文字母、数字、空格和其他字符的个数。(注:字符个数不受限制)

第7章函数

编程题13:编写一个子函数 int fun ( int n),其功能是判断整数n 是否为素数,n 是素数,返回值为1;n 不是素数,返回值为0。调用该函数,将100~200之间的素数全部输出,要求屏幕上每个数占4位,每行显示5个素数,左对齐。(循环、条件分支、子函数、变量的值传递、屏幕显示格式控制)

编程题14:主函数中定义两个数组int a[5]={5,4,8,-1,2},b[10]={1,-1,2,4,8,4,0,9,3,7};用子函数实现从小到大的冒泡排序,子函数为void bubble(int [ ],int);要求在主函数中显示排序前、后的数组a 和b 的元素。(循环、条件分支、子函数、数组、地址传递)

编程题15:主函数中定义两个数组int a[5]={5,4,8,-1,2},b[10]={1,-1,2,4,8,4,0,9,3,7};用子函数实现从小到大的选择法排序,子函数为void sort(int [ ],int);要求在主函数中显示排序前、后的数组a 和b 的元素。(循环、条件分支、子函数、数组、地址传递) 编程题16:用递归函数计算n!。

编程题17:编写一个子函数 int fact ( int n),计算n 的阶乘。调用该函数计算1!+2!+3!+…+n !,要求n 从键盘输入,如输入n 小于0,不予计算。(循环、递归函数)

编程题18:将16进制或8进制或2进制数转换为十进制数(字符数组、字符串函数、子函数、字符ASCII 值与10进制数的转换,指数函数的调用)

编程题18:编程实现八进制数转换为十进制数(注:用字符数组n[100]接收输入,输入的八进制数肯定正确,无须检测;八进制数转换为十进制数的子函数为int htoi(char hnum[ ]);)

编程题18:编写一个子函数,将16进制数转换为10进制数。

编程题19:编写一个子函数,主函数用字符数组作为实参,统计字符串中字母、数字、空格以及其他符号的个数,要求主函数中显示字符串与统计结果。

编程题20:编写一个子函数,主函数输入一行字符,子函数找出字符串中最长的单词,并显示结果。 编程题21:用递归法将一个整数n 转换为字符串。例如:输入483,输出字符串“483”,n 的位数不确定。 编程题22:写一个子函数,将输入的字符串按反序存放,在main 中输入和输出字符串。

第8章指针

编程题23:编写一个子函数mystrcmp(char *s1,char *s2)实现2个字符串的比较。 编程题23:编程实现两个字符串连接起来,不要用strcat 函数。 编程题23:用函数调用实现字符串的复制。

编程题23:写一个函数,求一个字符串的长度。在main 函数中输入字符串,并输出其长度。 编程题24:写一个用矩形法求定积分的通用函数,分别计算 编程题25:输入一个字符串,内有数字和非数字字符,如: A123x456 17960?302tab5876,将其中连续的数字作为一个整数,依次用数组存放这些数,统计有多少个整数,并输出这些数。

编程题26:主函数输入整数的个数,用指针变量动态申请内存,并用键盘按任意次序输入n 个整数,用子函数void bubble(int [ ],int)实现从小到大的冒泡排序。

第9章 结构

编程题27:建立一个链表,每个结点包括:学号、姓名、性别、年龄,输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。

编程题28:13个人围成一圈,从第一个人开始顺序报号,凡报到3者退出圈子,找出最后留在圈子中的人原来的序号。要求用链表实现。

编程题29:阅读链表操作相关函数,完成指定的操作函数。 #include "stdio.h"

#include "malloc.h"

#include "string.h"

?

?

?

-2

x 1

1

1

dx e xdx cos xdx

sin 、、链表内容仅限表头表尾添加、删

除、查询、显示、保存,不考排

struct Student

{

char name[20];

int num;

int math;

struct Student *next;

};

struct Student *Create(struct Student *head); //生成数据链表

void ShowList(struct Student *head); //显示链表

void saveList(struct Student *head); //保存链表数据

void AddTail(struct Student *head,struct Student *temp); //表尾添加元素

struct Student *AddHead(struct Student *head,struct Student *temp); //表头添加元素struct Student *DeleteSomeone(struct Student *head); //删除元素

void FindSomeone(struct Student *head); //查询元素

struct Student *DeleteHead(struct Student *head);//删除表头

void DeleteTail(struct Student *head);//删除表尾

void main()

{

struct Student *head=NULL,*temp=NULL;

int choice;

do

{

printf("1:创建数据链表\n");

printf("2:添加链表单元\n");

printf("3:删除链表单元\n");

printf("4:查询链表单元\n");

printf("5:删除表头\n");

printf("6:删除表尾\n");

printf("7:退出\n");

printf("请输入功能选择:");

scanf("%d",&choice);//cin>>choice;

if(choice==1)

{

head=Create(temp);

ShowList(head);

saveList(head);

}

else if(choice==2)//表头添加元素

{

temp=(struct Student *)malloc(sizeof(struct Student));

printf("姓名:"); scanf("%s",temp->name);

printf("学号:"); scanf("%d",&temp->num);

printf("成绩:"); scanf("%d",&temp->math);

AddTail(head,temp);// head=AddHead(head,temp);

ShowList(head);

saveList(head);

}

else if(choice==3) //删除元素

{

head=DeleteSomeone(head);

ShowList(head);

saveList(head);

}

else if(choice==4) //查找元素

FindSomeone(head);

else if(choice==5) //删除表头

{

head=DeleteHead(head);

ShowList(head);

saveList(head);

}

else if(choice==6) //删除表尾

{

DeleteTail(head);

ShowList(head);

saveList(head);

}

else if(choice==7)

printf("谢谢使用!\n");

else

printf("非法输入,请输入1~7之间的数!\n");

}while(choice!=7);

}

struct Student *Create(struct Student *head)//包含读文件创建链表

{

struct Student *pS,*pEnd;

FILE *fp;

fp=fopen("e:\\list.txt","r");

if(fp!=NULL)//表明已有链表数据,直接读入

{

int flag;

while(1)

{

pS=(struct Student *)malloc(sizeof(struct Student));

flag=fscanf(fp,"%s %d %d",pS->name,&pS->num,&pS->math);

if(flag==EOF)

break;

if(head==NULL)

head=pS;

else

pEnd->next=pS;

pEnd=pS;

}

if(head!=NULL)

{

pEnd->next=NULL;

printf("已从文件中读入数据创建链表!\n");

}

delete pS;

fclose(fp);

}

if(head==NULL)

{

while(1)

{

pS=(struct Student *)malloc(sizeof(struct Student));

printf("姓名:"); scanf("%s",pS->name);

if(strcmp(pS->name,"000"))

{

printf("学号:"); scanf("%d",&pS->num);

printf("成绩:"); scanf("%d",&pS->math);

}

else

break;

if(head==NULL)

head=pS;

else

pEnd->next=pS;

pEnd=pS;

}

pEnd->next=NULL;

delete pS;

}

return head;

}

void ShowList(struct Student *head)//显示链表上的数据

{

printf(" 学生姓名学号成绩:\n");

while(head)

{

printf("%20s",head->name);

printf("%6d",head->num);

printf("%5d\n",head->math);

head=head->next;

}

}

void saveList(struct Student *head)//保存链表上的数据

{

FILE *fp;

fp=fopen("e:\\list.txt","w");

if(fp==NULL)

{

printf("无法创建文件e:\\list.txt!");

return;

}

while(head)

{

fprintf(fp,"%s %d %d\n",head->name,head->num,head->math);

head=head->next;

}

fclose(fp);

}

void AddTail(struct Student *head,struct Student *temp)//加在表尾

{

struct Student *last;

while(head)

{

last=head;

head=head->next;

}

last->next=temp;

temp->next=NULL;

}

struct Student *AddHead(struct Student *head,struct Student *temp)//加在表头{

struct Student *first;

first=head;

head=temp;

head->next=first;

return head;

}

struct Student *DeleteSomeone(struct Student *head)

{

struct Student *temp;

int xnum,flag=0;

printf("请输入学号:");

scanf("%d",&xnum);

if(head==NULL)

{

printf("表为空!\n");

return head;

}

if(head->num==xnum)

{

temp=head;

head=head->next;

delete temp;

return head;

}

Student *first=head;

while(head)

{

if(head->next==NULL)

break;

if(head->next->num==xnum)

{

temp=head->next;

head->next=temp->next;

delete temp;

flag=1;

break;

}

head=head->next;

}

if(flag==0)

printf("未发现!\n");

return first;

}

void FindSomeone(Student *head)//按学号查找

{

int xnum,flag=0;

printf("请输入学号:");

scanf("%d",&xnum);

while(head)

{

if(head->num==xnum)

{

printf("%20s",head->name);

printf("%6d",head->num);

printf("%4d\n",head->math);

flag=1;

break;

}

head=head->next;

}

if(flag==0)

printf("未发现!\n");

}

struct Student *DeleteHead(struct Student *head) {

if(head==NULL)

{

printf("表为空!\n");

return head;

}

if(head->next==NULL)

{

delete head;

head=NULL;

return head;

}

else

{

struct Student *first=head;

head=head->next;

delete first;

return head;

}

}

void DeleteTail(struct Student *head)

{

if(head==NULL)

{

printf("表为空!\n");

}

if(head->next==NULL)

{

delete head;

head=NULL;

}

else

{

struct Student *temp,*end;

end=head;

while(end->next!=NULL)

{

temp=end;

end=end->next;

}

temp->next=NULL;

}

}

第10章文件

编程题30:编程实现:有一个文本文件“a.txt”,里面有大小写英文字母、数字和其它符号。要求分别统计其中大写字母、小写字母、数字以及其它字符的个数。

编程题30:从键盘输入一串字符,并以 # 结束,将其中的大写字母全部转换成小写字母,并输出到计算机D盘文件“test.txt”中保存。(提示:一串字符并不意味着一行字符,另外一串字符的具体字符个数是不定的。)

编程题31:从键盘输入一个字符串,将其中的小写字母全部转换为大写字母,然后输出到C盘“test”文件中保存,输入的字符串以“!”结束。

编程题32:有两个磁盘文件“A”和“B”,各存放一行字母,要求把这两个文件中的信息合并(按字母顺序排列),输出到一个新文件“C”中去。

编程题33:有5个学生,每个学生有3门课程的成绩,从键盘输入学号、姓名、3门课程成绩,计算每个学生的平均成绩,将原有数据和平时成绩存放在磁盘文件“stud”中。

第1-3章 C语言基础、编程规范、顺序结构程序设计

一、选择题

1. C语言是一种(C)程序设计语言。

A. 低级

B. 面向对象

C. 高级

D. 智能

2. 下列特性中,( D )不是C语言的特征。

A.运行效率高

B.结构化程序设计

C.能直接访问物理地址

D.类型检测严格

3.下列标识符中,( D )不是C的关键字;

A. int

B. float

C. char

D. scanf

4.下列标识符中,( D )不是C的关键字;

A. sizeof

B. short

C. long

D. define

5.下列标识符中,( D )不是C的关键字;

A. goto

B. break

C. auto

D. printf

6.下列标识符中,( D )不是C的关键字;

A. static

B. struct

C. void

D. include

7.下列自定义标识符中,( C )是不符合规定。

A. point1x

B. _point1x

C. 2pointx

D. pointx_2

8.下列自定义标识符中,( C )是不符合规定。

A. MAX

B. _MIN

C. MAX$

D. MIN_2

9.下列自定义标识符中,( D )是不符合规定。

A. point1_

B. _point1x

C. pointx

D. pointx_ #

10.下列自定义标识符中,( A )是不符合规定。

A. 2_point1x

B. _point1x

C. pointx

D. pointx_2

11.下列四个选项中,是不合法的用户标识符的选项是( C )

A.P_0 B._abcC.gotoD.temp

12.下面是不正确的字符串常量的是( A )

A.’abc’B.“12’12”C.“0”D.“”

13. 已知int a; float f; scanf(“a=%d,f=%f”,&a,&f); 为了把10和3.14分别赋值给a和f,则正确的输入为(C)

A.10,3.14 B. 10 3.14 C. a=10,f=3.14 D. a=10 f=3.14

14.输入语句为:scanf("%f,%f\n",&radius,&high);下列键盘输入( D )是正确的。

A.1 2↙; B.1,2\n↙; C.1↙2↙; D.1,2↙;

15.输入语句为:scanf("a=%f,b=%f",&radius,&high);从键盘输入( D )是正确的。

A.1 2↙; B.1,2↙; C.1↙2↙;D.a=1,b=2↙;

16.输入语句为:scanf("a=%f,b=%f\n",&radius,&high);从键盘输入(D)是正确的。

A.1 2↙; B.1,2↙; C.1↙2↙; D.a=1,b=2\n↙;

17.输入语句为:scanf("a=%fb=%f",&radius,&high);从键盘输入(D)是正确的。

A.1 2↙; B.1,2↙; C.1↙2↙;D.a=1b=2↙;

18.double PI=3.1415926, 输出语句为:printf("%3.2lf",PI);下列输出结果( D )是正确的。

A.3.1415926; B.3.2; C.3.1; D.3.14;

19.double PI=3.1415926, 输出语句为:printf("%5.4lf",PI);下列输出结果(B)是正确的。

A.3.1415926;B.3.1415; C.3.1416; D.5.4;

20.double PI=3.1415926, 输出语句为:printf("%3.4lf",PI);下列输出结果()是正确的。

A.3.1415926; B.3.141; C.3.1415; D.3.1416;

21.设x,y均为float型变量,则下列不合法的赋值语句是()

A.++x B.y=(x%2)/10

C.x*=y+8 D.x=y=0

22.double PI=3.1415926, 输出语句为:printf("%4.2lf",PI);下列输出结果()是正确的。

A.3.1415926; B.4.2; C.3.141; D.3.14;

23. int a=-1;C语言整型数分配4个字节,在计算机中下列十六进制表示的(A)是正确的。

A.ffffffff; B.; C.; D.;

24. int a=1;C语言整型数分配4个字节,在计算机中下列十六进制表示的a()是正确的。

A.; B.; C.; D.ffffffff;

25. int a=-1;C语言整型数分配4个字节,在计算机中下列十六进制表示的a()是正确的。

A.; B.-00000001; C.-1; D.ffffffff;*

26 .int a=-1;C 语言整型数分配4个字节,在计算机中下列十六进制表示的a ()是正确的。 A .-ffffffff ; B .; C .ffffffff ; D .-1;**

27.设有下列变量说明:char a; int x; float y; double z; 则表达式a*x-z+y 的值的数据类型为()。***

A .float B.char C.int D.double

28.已知字母a 的ASCII 码为十进制数97,且设ch 为字符型变量,则表达式ch=’a’+’8’-‘3’的值为()

A .’f’ B.’a’ C.’d’ D.102

29.已知ch 是字符型变量,下列不正确的赋值语句是()

A .ch=’a+b’ B.ch=’\0’ C.ch=’a’+’b’ D.ch=5+9 30.若s 是int 型变量,则表达式s=25/3%3的值为()

A .25 B.1 C.2 D.3 31.若s 是int 型变量,则表达式s%2+(s-1)%2的值为()

A .0 B.1 C.–1 D.2 32.若s 是int 型变量,则表达式s%2+(s+1)%2的值为()

A .0 B.1 C.2 D.不确定

33.下列表达式中,不能正确表达代数式ab xy

2含义的C 语言表达式是()

A .x/a/b*y*2 B.2*x*y/a/b C.2*x*y/a*b D.x*y/b/a*2 34.若x 、i 、j 、k 均为int 变量,则计算表达式x=(i=4,j=16,k=32);后,x 的值为() A. 4 B. 16 C. 32 D. 52

35. 已知int a=6,b=6; 执行b=(++b)+(a++);后,a 和b 的值为()。 A. a=7,b=13 B. a=7,b=14 C. a=6,b=13 D. a=6,b=14

36.若有定义:int x=5,y=2; 则计算表达式y+=y –=x*=y 后, y 的值为() A .16 B.–16 C.7 D.10

37.若a 是int 型变量,且其初值为6,则计算表达式a+=a -=a*a 后,a 的值为() A .-30 B.-60 C.-24 D.6 38.若x 的初值为7,执行语句x+=x -=x+x ;后,x 的值为()

A .21 B.-14 C.14 D.-21

39.C 语言的编译系统对宏命令的处理是() A .在程序运行时进行的 B .在程序连接时进行的

C .和C 程序中的其他语句同时进行编译的

D .在对源程序中其他成分正式编译之前进行的 40.以下正确的叙述是()

A .C 语言的预处理功能是指完成宏替换和包含文件的调用

B .预处理指令只能位于

C 源程序文件的首部

C .凡是C 源程序中行首以“#”标识的控制行都是预处理命令

D .C 语言的编译预处理就是对源程序进行初步的语法检查

41.以下在任何情况下计算平方数时都不会引起二义性的宏定义是()

A .#define POWER(x) x*x B.#define POWER(x) (x)*(x) C .#define POWER(x) (x*x) D.#define POWER(x) ((x)*(x)) 42.以下有关宏替换的叙述中错误的是()

A .宏替换不占用运行时间

B .宏替换只是字符替换

C .宏替换在编译之前进行

D .宏名必须用大写字母表示

43. 下列程序段的运行结果为()。

void main() { char c1,c2;

c1=’A’+’5’-‘3’; c2=’A’+’6’-‘3’; printf(“%d,%c”,c1,c2) }

A. C,D

B. 67,D

C. B,C

D. 无确定值

二、填空题

1.在C 语言中,实型变量可以分为两种类型,它们是 和 。

2.若x,a为整型变量,则计算表达式x=(a=4,6*2)后的x值为,计算表达式x=a=4,6*2后的x 值为。

3.若x和n均是int型变量,且x和n的初值均为5,则计算表达式x+=n++后x的值,n的值为。

三、阅读下列程序,在下划线上写出输出结果

1.程序段:

#define MUL(x) (x)*(x)*(x)

main( )

{printf(“%d”,MUL(1+2)+3);}

的结果是。

2.程序段:

#define y(t) (t)*(t)

main( )

{printf(“%d”,y(1+2)+3);}

的结果是。

3.以下程序的输出结果是(19) 21 。

#include

#define M(x,y,z) x*y+z

void main()

{int a=2,b=3,c=4;

printf("%d\n", M(a+b,b+c,c+a));//知识点:宏定义是编译时先替换,运行时才计算

}

第4章选择结构程序设计

一、选择题

1.若x是int型变量,则表达式x%2+(x+1)%2的值为()。

A.0 B.1C.2 D.不确定

2.设有定义int a=3,b=4,c=5,则表达式a||b+c&&b=c的值为()。

A.3 B.1C.0 D.不确定

3.判断字符串a和b是否相等,应当使用()

A.if (a==b) B.if (a=b)

C.if (strcpy(a,b)) D.if (strcmp(a,b))

4.表达式5!=4的值是()

A.0 B.1 C.true D.任一非零数

5.设逻辑型变量a,b,c,其中a的值为1,则逻辑运算表达式a||b||c的值是()

A.0 B.1 C.true D.不确定

6.若a=5,b=4,c=2时,表达式a>b!=c的值是()

A.1 B.0 C.非1 D.不确定

7.设逻辑型变量a,b,c,其中a的值为0,则逻辑运算表达式a&&b&&c的值是()

A.0 B.1 C.非1 D.不确定

8.若当a的值为奇数时,表达式的值为“真”,当a的值为偶数时,表达式的值为“假”,则以下不能满足要求的表达式是()

A.a%2==1B.!(a%2==0) C. !(a%2)D.a%2

9.判断字符型变量x是否为大写字母的正确表达式是()

A.’A’<=x<=‘Z’B.(x>=A)&(x<=Z)

C.(x>=’A’)&&(x<=’Z’)D.(x>=’A’) and (x<=’Z’)

10.若x=5,y=2,z=1,则表达式x-y

A.0B.1C.3D.2

相关文档