C语言程序设计各章练习题.docx
《C语言程序设计各章练习题.docx》由会员分享,可在线阅读,更多相关《C语言程序设计各章练习题.docx(46页珍藏版)》请在冰豆网上搜索。
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的值。
编程题2:
根据下列函数关系写程序,要求提示输入x的值,输出y的值。
编程题3:
求ax2+bx+c=0方程的解。
(只输出b2-4ac>=0的求解结果,小于0,输出“不予求解!
”)
第5章循环结构程序设计
编程题4:
编程计算
。
要求提示键盘输入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:
有一个已排好序的数组inta[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:
编写一个子函数intfun(intn),其功能是判断整数n是否为素数,n是素数,返回值为1;n不是素数,返回值为0。
调用该函数,将100~200之间的素数全部输出,要求屏幕上每个数占4位,每行显示5个素数,左对齐。
(循环、条件分支、子函数、变量的值传递、屏幕显示格式控制)
编程题14:
主函数中定义两个数组inta[5]={5,4,8,-1,2},b[10]={1,-1,2,4,8,4,0,9,3,7};用子函数实现从小到大的冒泡排序,子函数为voidbubble(int[],int);要求在主函数中显示排序前、后的数组a和b的元素。
(循环、条件分支、子函数、数组、地址传递)
编程题15:
主函数中定义两个数组inta[5]={5,4,8,-1,2},b[10]={1,-1,2,4,8,4,0,9,3,7};用子函数实现从小到大的选择法排序,子函数为voidsort(int[],int);要求在主函数中显示排序前、后的数组a和b的元素。
(循环、条件分支、子函数、数组、地址传递)
编程题16:
用递归函数计算n!
。
编程题17:
编写一个子函数intfact(intn),计算n的阶乘。
调用该函数计算1!
+2!
+3!
+…+n!
,要求n从键盘输入,如输入n小于0,不予计算。
(循环、递归函数)
编程题18:
将16进制或8进制或2进制数转换为十进制数(字符数组、字符串函数、子函数、字符ASCII值与10进制数的转换,指数函数的调用)
编程题18:
编程实现八进制数转换为十进制数(注:
用字符数组n[100]接收输入,输入的八进制数肯定正确,无须检测;八进制数转换为十进制数的子函数为inthtoi(charhnum[]);)
编程题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:
输入一个字符串,内有数字和非数字字符,如:
A123x45617960302tab5876,将其中连续的数字作为一个整数,依次用数组存放这些数,统计有多少个整数,并输出这些数。
编程题26:
主函数输入整数的个数,用指针变量动态申请内存,并用键盘按任意次序输入n个整数,用子函数voidbubble(int[],int)实现从小到大的冒泡排序。
第9章结构
编程题27:
建立一个链表,每个结点包括:
学号、姓名、性别、年龄,输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,则将此结点删去。
编程题28:
13个人围成一圈,从第一个人开始顺序报号,凡报到3者退出圈子,找出最后留在圈子中的人原来的序号。
要求用链表实现。
编程题29:
阅读链表操作相关函数,完成指定的操作函数。
链表内容仅限表头表尾添加、删除、查询、显示、保存,不考排序、中间节点的插入和删除
#include"stdio.h"
#include"malloc.h"
#include"string.h"
structStudent
{
charname[20];
intnum;
intmath;
structStudent*next;
};
structStudent*Create(structStudent*head);//生成数据链表
voidShowList(structStudent*head);//显示链表
voidsaveList(structStudent*head);//保存链表数据
voidAddTail(structStudent*head,structStudent*temp);//表尾添加元素
structStudent*AddHead(structStudent*head,structStudent*temp);//表头添加元素
structStudent*DeleteSomeone(structStudent*head);//删除元素
voidFindSomeone(structStudent*head);//查询元素
structStudent*DeleteHead(structStudent*head);//删除表头
voidDeleteTail(structStudent*head);//删除表尾
voidmain()
{
structStudent*head=NULL,*temp=NULL;
intchoice;
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);
}
elseif(choice==2)//表头添加元素
{
temp=(structStudent*)malloc(sizeof(structStudent));
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);
}
elseif(choice==3)//删除元素
{
head=DeleteSomeone(head);
ShowList(head);
saveList(head);
}
elseif(choice==4)//查找元素
FindSomeone(head);
elseif(choice==5)//删除表头
{
head=DeleteHead(head);
ShowList(head);
saveList(head);
}
elseif(choice==6)//删除表尾
{
DeleteTail(head);
ShowList(head);
saveList(head);
}
elseif(choice==7)
printf("谢谢使用!
\n");
else
printf("非法输入,请输入1~7之间的数!
\n");
}while(choice!
=7);
}
structStudent*Create(structStudent*head)//包含读文件创建链表
{
structStudent*pS,*pEnd;
FILE*fp;
fp=fopen("e:
\\list.txt","r");
if(fp!
=NULL)//表明已有链表数据,直接读入
{
intflag;
while
(1)
{
pS=(structStudent*)malloc(sizeof(structStudent));
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");
}
deletepS;
fclose(fp);
}
if(head==NULL)
{
while
(1)
{
pS=(structStudent*)malloc(sizeof(structStudent));
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;
deletepS;
}
returnhead;
}
voidShowList(structStudent*head)//显示链表上的数据
{
printf("学生姓名学号成绩:
\n");
while(head)
{
printf("%20s",head->name);
printf("%6d",head->num);
printf("%5d\n",head->math);
head=head->next;
}
}
voidsaveList(structStudent*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);
}
voidAddTail(structStudent*head,structStudent*temp)//加在表尾
{
structStudent*last;
while(head)
{
last=head;
head=head->next;
}
last->next=temp;
temp->next=NULL;
}
structStudent*AddHead(structStudent*head,structStudent*temp)//加在表头
{
structStudent*first;
first=head;
head=temp;
head->next=first;
returnhead;
}
structStudent*DeleteSomeone(structStudent*head)
{
structStudent*temp;
intxnum,flag=0;
printf("请输入学号:
");
scanf("%d",&xnum);
if(head==NULL)
{
printf("表为空!
\n");
returnhead;
}
if(head->num==xnum)
{
temp=head;
head=head->next;
deletetemp;
returnhead;
}
Student*first=head;
while(head)
{
if(head->next==NULL)
break;
if(head->next->num==xnum)
{
temp=head->next;
head->next=temp->next;
deletetemp;
flag=1;
break;
}
head=head->next;
}
if(flag==0)
printf("未发现!
\n");
returnfirst;
}
voidFindSomeone(Student*head)//按学号查找
{
intxnum,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");
}
structStudent*DeleteHead(structStudent*head)
{
if(head==NULL)
{
printf("表为空!
\n");
returnhead;
}
if(head->next==NULL)
{
deletehead;
head=NULL;
returnhead;
}
else
{
structStudent*first=head;
head=head->next;
deletefirst;
returnhead;
}
}
voidDeleteTail(structStudent*head)
{
if(head==NULL)
{
printf("表为空!
\n");
}
if(head->next==NULL)
{
deletehead;
head=NULL;
}
else
{
structStudent*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.intB.floatC.charD.scanf
4.下列标识符中,(D)不是C的关键字;
A.sizeofB.shortC.longD.define
5.下列标识符中,(D)不是C的关键字;
A.gotoB.breakC.autoD.printf
6.下列标识符中,(D)不是C的关键字;
A.staticB.structC.voidD.include
7.下列自定义标识符中,(C)是不符合规定。
A.point1xB._point1xC.2pointxD.pointx_2
8.下列自定义标识符中,(C)是不符合规定。
A.MAXB._MINC.MAX$D.MIN_2
9.下列自定义标识符中,(D)是不符合规定。
A.point1_B._point1xC.pointxD.pointx_?
#
10.下列自定义标识符中,(A)是不符合规定。
A.2_point1xB._point1xC.pointxD.pointx_2
11.下列四个选项中,是不合法的用户标识符的选项是(C)
A.P_0 B._abc C.goto D.temp
12.下面是不正确的字符串常量的是(A)
A.’abc’ B.“12’12” C.“0” D.“”
13.已知inta;floatf;scanf(“a=%d,f=%f”,&a,&f);为了把10和3.14分别赋值给a和f,则正确的输入为(C)
A.10,3.14B.103.14C.a=10,f=3.14D.a=10f=3.14
14.输入语句为:
scanf("%f,%f\n",&radius,&high);下列键盘输入(D)是正确的。
A.12↙;B.1,2\n↙;C.1↙2↙;D.1,2↙;
15.输入语句为:
scanf("a=%f,b=%f",&radius,&high);从键盘输入(D)是正确的。
A.12↙;B.1,2↙;C.1↙2↙;D.a=1,b=2↙;
16.输入语句为:
scanf("a=%f,b=%f\n",&radius,&high);从键盘输入(D)是正确的。
A.12↙;B.1,2↙;C.1↙2↙;D.a=1,b=2\n↙;
17.输入语句为:
scanf("a=%fb=%f",&radius,&high);从键盘输入(D)是正确的。
A.12↙;B.1,2↙;C.1↙2↙;D.a=1b=2↙;
18.doublePI=3.1415926,输出语句为:
printf("%3.2lf",PI);下列输出结果(D)是正确的。
A.3.1415926;B.3.2;C.3.1;D.3.14;
19.doublePI=3.1415926,输出语句为:
printf("%5.4lf",PI);下列输出结果(B)是正确的。
A.3.1415926;B.3.1415;C.3.1416;D.5.4;
20.doublePI=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=