c语言课后习题_c语言课后习题及答案
c语言课后习题由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“c语言课后习题及答案”。
C语言程序设计实验报告
学院
数学与信息技术
班级
学号
11130730
姓名
指导教师
实验1 简单程序设计
1.实验目的(1)熟悉C语言开发环境并掌握在该环境下如何编辑、编译、连接和运行一个C程序。(2)通过运行一个简单的C程序过程,初步了解C程序的基本结构及特点。
2. 实验要求
(1)认真阅读和掌握和本实验相关的教材内容。
(2)输入三个整数,请把这三个数由小到大输出。试编写多种方法。(3)上机运行程序。
(4)保存和打印出程序的运行结果,并结合程序进行分析。
3.实验重点和难点
(1)C程序是由一个个函数构成,当一个函数调用另一个函数时,需要对被调函数作声明。(2)用户自定以的函数最好写在一个头文件中,在需要的地方用文件包含命令即可。
(3)system(“cls”)函数的作用是清屏,它的声明在头文件stdlib.h中。如果是在Linux操作系统的gcc环境下,清屏用system(”clear”)。
4. 常见错误
(1)数据声明或语句后面缺少分号。(2)对被调函数没有声明。
(3)没有main函数或者有多个main函数。
5. 程序代码
#include int main(){ float a,b,c,t;printf(“请输入三个数:”);scanf(“%f,%f,%f”,&a,&b,&c);if(a>b){
t=a;a=b;b=t;} if(a>c){t=a;a=c;c=t;} if(b>c){t=b;b=c;c=t;} printf(“%5.2f,%5.2f,%5.2fn”,a,b,c);} 6. 实验结果
7. 心得体会
刚开始学习C语言,有一些小问题,数据声明时,分号会忘记,语句后面缺少分号。而且n斜杠会写反,有时会忘记声明函数。
实验2 顺序结构程序设计
1.实验目的(1)掌握C语言数据类型,熟悉如何定义一个整型、字符型、实型变量。(2)掌握数据的输入输出的方法,能正确使用各种格式控制符。(3)掌握算术运算符和赋值运算符。
2. 实验要求
(1)认真阅读和掌握和本实验相关的教材内容。
(2)输入圆半径和圆柱高,求圆周长、圆面积、圆球表面积、圆球体积和圆柱体积。输入输出要有文字说明,输出结果取小数点后2位。(3)上机运行程序。
(4)保存和打印出程序的运行结果,并结合程序进行分析。
3.实验重点和难点
(1)用scanf和printf对数据进行输入输出时,不同的数据类型用不同的格式控制符。(2)scanf函数中的格式控制后面应当是变量地址,而不是变量名。
4. 常见错误
(1)变量没有定义,直接使用。
(2)企图利用整数除以整数得到精确结果。例如1/4结果不是0.25而是0,1/4.0结果才是0.25。(3)printf和scanf函数中格式控制符的个数与变量或变量地址的个数不一致。(4)scanf函数的地址表列因该是变量地址,而不是变量名。
(5)scanf函数在格式控制字符串中除了格式说明以外还有其他字符时,在输入数据时(6)没有在对应的位置输入与这些字符相同的字符。
5. 程序代码
#include int main(){ float h,r,l,s,sq,vq,vz;float p=3.141526;printf(“请输入圆半径r,圆柱高h”);scanf(“%f,%f”,&r,&h);l=2*p*r;//圆周长
s=r*r*p;//圆面积
sq=4*p*r*r;//圆球表面积
vq=4.0/3.0*p*r*r*r;//圆球体积
vz=p*r*r*h;//圆柱体积
printf(“圆周长为: l=%6.2fn”,l);printf(“圆面积为: s=%6.2fn”,s);printf(“圆球表面积为: sq=%6.2fn”,sq);printf(“圆球体积为: vq=%6.2fn”,vq);printf(“圆柱体积为: vz=%6.2fn”,vz);return 0;} 6. 实验结果
7. 心得体会
这边是基础的用scanf和printf对数据进行输入输出,不同的数据类型用不同的格式控制符。有点小睇混淆。才刚开始,还是觉得挺简单的。
实验3 选择结构程序设计
1.实验目的(1)了解C语言表示逻辑变量的方法(2)学会正确使用关系运算符和逻辑运算符。(3)熟练掌握if语句和switch语句。
2. 实验要求
(1)认真阅读和掌握和本实验相关的教材内容。(2)把百分制成绩转换成5级记分制,要求分别用if else 和switch语句。
90分以上(包括90): A 80至90分(包括80):B 70至80分(包括70):C 60至70分(包括60):D 60分以下:E
(3)上机运行程序。
(4)保存和打印出程序的运行结果,并结合程序进行分析。
3.实验重点和难点
(1)注意关系运算符==和复制运算符=的区别。(2)if和else的匹配原则。
(3)在switch语句中正确使用break。
4. 常见错误
(1)赋值运算符=和关系运算符等号=搞混。(2)在if语句为复合语句时,忘记写{}。(3)if语句出现嵌套时,没正确配对。(4)switch语句中,没正确使用break。
5. 程序代码
#include int main(){ float score;char grade;printf(“请输入学生成绩:”);scanf(“%f”,&score);while(score>100 || score
printf(“n输入有误,请重新输入!”);
scanf(“%f”,&score);} switch((int)(score/10)){ case 10: case 9:grade='A';break;case 8:grade='B';break;case 7:grade='C';break;case 6:grade='D';break;case 5: case 4:
} case 3: case 2: case 1: case 0:grade='E';} printf(“成绩是%5.1f,相应的等级是%cn”,score,grade);return 0;6. 实验结果
7. 心得体会
赋值运算符=和关系运算符等号=搞混。在if语句为复合语句时,忘记写{}。if语句出现嵌套时,没正确配对。
实验4 循环结构程序设计
1.实验目的(1)熟练掌握循环语句中的for语句、while语句和do while语句的使用方法,以及这三种循环语句之间的转换方法。
(2)掌握编写循环结构程序的方法。
2. 实验要求
(1)认真阅读和掌握和本实验相关的教材内容。
(2)通过键盘输入任意两个正整数,求其最大公约数和最小公倍数。(3)上机运行程序。
(4)保存和打印出程序的运行结果,并结合程序进行分析。
3.实验重点和难点
(1)循环结构程序的设计方法。
(2)while和do while循环之间的转换方法。
(3)getch函数从键盘接收一个字符,该函数被调用后程序会暂停,等待按任意键,再继续执行后续的语句,以便我们观察中间结果。在VC++下需要包含conio.h头文件,在Linux下需要包含头文件curses.h。由于在Linux下getch函数还需要与其它函数配合使用才能达到上面所说的功能并且在编译时还要指定链接所使用的库文件,所以在Linux环境建议使用两次调用getchar函数来替换getch函数。
4. 常见错误
(1)循环体为复合语句时,没用{}括起来。
(2)在while()和for()后面添加分号,使得循环体为空语句。(3)for括号里的分号和逗号用错。
(4)循环嵌套时,内循环的初始条件和循环体没正确设计好。
5. 程序代码
#include int main(){ int r,m,n,p;scanf(“%d,%d”,&m,&n);p=n*m;do{ r=m%n;m=n;n=r;p=p/m;}while(r!=0);printf(“最大公约数:%dn”,m);
printf(“最小公倍数:%dn”,p);return 0;} 6. 实验结果
7. 心得体会
循环体为复合语句时,没用{}括起来。在while()和for()后面添加分号,使得循环体为空语句。for括号里的分号和逗号用错。循环嵌套时,内循环的初始条件和循环体没正确设计好。
实验5 数组的应用
1.实验目的(1)掌握一维数组和二维数组的定义和引用。(2)掌握字符数组和字符串函数的使用。(3)掌握与数组有关的算法(特别是排序算法)。
2. 实验要求
(1)认真阅读和掌握和本实验相关的教材内容。(2)用选择法对10个整数排序。(3)上机运行程序。
(4)保存和打印出程序的运行结果,并结合程序进行分析。
3.实验重点和难点
(1)在循环中,数组元素的引用。
(2)起泡排序法、选择排序法和插入排序法。
4. 常见错误
(1)数组定义时,没规定数组长度或者长度为一变量。(2)循环中数组元素的下标没正确表示。
(3)起泡排序、选择排序和插入排序算法没理解透。
(4)起泡排序、选择排序和插入排序中,循环的初始条件和终止条件出现错误。(5)字符串的复制和比较直接使用赋值运算符和关系运算符。
5. 程序代码
#include int main(){ int i,j,t,a[10];printf(“请输入10个整数:n”);for(i=0;i
for(j=i+1;j
if(a[i]>a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
} printf(“选择排列:n”);for(i=0;i
printf(“%5d”,a[i]);printf(“n”);return 0;} 6. 实验结果
7. 心得体会
数组定义时,没规定数组长度或者长度为一变量。循环中数组元素的下标没正确表示。起泡排序、选择排序和插入排序算法没理解透。起泡排序、选择排序和插入排序中,循环的初始条件和终止条件出现错误。字符串的复制和比较直接使用赋值运算符和关系运算符。
实验6 函数的应用
1.实验目的(1)掌握函数的定义和调用方法。
(1)掌握函数实参与形参的对应关系,以及“值传递”的方式。(1)掌握函数的嵌套调用和递归调用的方法。
(1)掌握全局变量和局部变量,动态变量以及静态变量的概念和使用方法。
2. 实验要求
(1)认真阅读和掌握和本实验相关的教材内容。
(2)写一个函数,用“起泡法”对输入的10个字符按由小到大的顺序排列,主函数通过调用它实现题目要求。
(3)上机运行程序。
(4)保存和打印出程序的运行结果,并结合程序进行分析。
3.实验重点和难点
(1)函数的定义和调用方法。
(2)函数的实参数为数组时,形参的形式以及实参和形参之间的数据传递方式。(3)函数的递归调用。
4. 常见错误
(1)函数没定义,就被调用。(2)函数定义了,又没被调用。(3)定义函数时,形参没规定类型。(4)函数调用时,实参前加类型。(5)被调函数没有声明
(6)嵌套调用和递归调用没理解透,使用错误。(7)全局变量和局部变量有效范围没能正确区分。
5. 程序代码
#include #include #define N 10 char str[N];int main(){ void sort(char[]);int i,flag;for(flag=1;flag==1;){ printf(“input string:n”);scanf(“%s”,&str);if(strlen(str)>N)printf(“string is too long,input again!”);else flag=0;} sort(str);printf(“string sorted:n”);for(i=0;istr[i+1]){ t=str[i];str[i]=str[i+1];str[i+1]=t;} } 6. 实验结果
7. 心得体会
有时候函数没定义就使用,有时候会定义函数,然后没有使用,定义函数时,形参没规定类型。函数调用时,实参前加类型。会把形参与实参搞混
实验7 指针的应用
1.实验目的(1)熟练掌握指针的定义、赋值和使用。
(2)掌握用指针引用数组的元素、熟悉指向数组的指针的使用。(3)熟练掌握字符数组与字符串的使用,掌握指针数组。(4)掌握指针函数与函数指针的用法。
2. 实验要求
(1)认真阅读和掌握和本实验相关的教材内容。
(2)有一个班4个学生,5门课程。①求第1门课程的平均分;②找出两门以上课程不及格的学生,输出他们的学号和全部课程成绩及平均成绩;③找出平均成绩在90以上或全部课程成绩在85分以上的学生。分别编3个函数实现以上3个要求。(3)上机运行程序。
(4)保存和打印出程序的运行结果,并结合程序进行分析。
3.实验重点和难点
(1)列指针变量的定义、赋值以及利用它引用数组元素。(2)行指针变量的定义、赋值以及它在二维数组中的使用。(3)函数指针变量的定义、赋值和利用它进行函数调用。
4. 常见错误(1)混淆变量值和变量地址。
(2)指针变量没有初始化,就利用该指针变量引用变量。
(3)利用指针变量引用一维数组元素和二维数组元素或地址时,引用的方法不对。(4)函数指针概念清楚。(5)混淆行指针变量和指针数组。
5. 程序代码
#include int main(){ void avsco(float *,float *);void avcour1(char(*)[10],float *);void fali2(char course[5][10],int num[],float *pscore,float aver[4]);void good(char course[5][10],int num[4],float *pscore,float aver[4]);int i,j,*pnum,num[4];float score[4][5],aver[4],*pscore,*paver;char course[5][10],(*pcourse)[10];printf(“input course:n”);pcourse=course;for(i=0;i
scanf(“%d”,pnum+i);
for(j=0;j
scanf(“%f”,pscore+5*i+j);} paver=&aver[0];printf(“nn”);avsco(pscore,paver);avcour1(pcourse,pscore);printf(“nn”);fali2(pcourse,pnum,pscore,paver);printf(“nn”);good(pcourse,pnum,pscore,paver);return 0;} void avsco(float *pscore,float *paver){ int i,j;float sum,average;for(i=0;i
sum=0.0;
for(j=0;j
sum=sum+(*(pscore+5*i+j));
average=sum/5;
*(paver+i)=average;} } void avcour1(char(*pcourse)[10],float *pscore){ int i;float sum,average1;sum=0.0;for(i=0;i
void fali2(char course[5][10],int num[],float *pscore,float aver[4]){ int i,j,k,labe1;printf(“ ==========Student who is fail in two courses======= n”);printf(“NO.”);for(i=0;i
labe1=0;for(j=0;j=2)
{
printf(“%d”,num[i]);for(k=0;k
} } } void good(char course[5][10],int num[4],float *pscore,float aver[4]){ int i,j,k,n;printf(“ ======Students whose score is good======n”);printf(“NO.”);for(i=0;i
n=0;
for(j=0;j
if(*(pscore+5*i+j)>85.0)n++;
if((n==5)||(aver[i]>=90))
{
printf(“%d”,num[i]);
for(k=0;k
printf(“%11.2f”,*(pscore+5*i+k));
printf(“%11.2fn”,aver[i]);
} } } 6. 实验结果
7. 心得体会
指针这章有点小混乱 混淆变量值和变量地址。会忘记给指针变量没有初始化,就利用该指针变量引用变量。数组元素或地址有些模糊
实验8 结构体的应用
1.实验目的(1)掌握结构体变量、结构体数组以及结构体指针的定义和使用。(2)掌握动态存储分配函数的用法和单向链表的创建、输出等操作。(3)掌握用typedef定义类型。
2. 实验要求
(1)认真阅读和掌握和本实验相关的教材内容。
(2)编写建立链表的函数creat,输出链表的函数print,删除链表中节点的函数del,插入节点的函数insert,再编写一个主函数,先后调用这些函数,在主函数中指定需要删除和插入的节点的数据。(3)上机运行程序。
(4)保存和打印出程序的运行结果,并结合程序进行分析。
3.实验重点和难点
(1)结构成员引用的三种方法。(2)链表节点数据类型的定义。
(3)malloc函数用于动态分配存储空间,它的返回值类型是void *,在实际使用中一般需要强类型转换成多需要的类型。该函数的声明在stdlib.h头文件中。(4)链表操作中,节点指针域的使用。
4. 常见错误
(1)引用结构体成员时,成员运算符.和指向运算符->的使用混淆。(2)链表操作过程中不能正确利用指针域进行操作。(3)不能正确使用typedef声明新类型名。
5. 程序代码
#include #include #define LEN sizeof(struct Student)struct Student { long num;float score;struct Student *next;};int n;int main()//主函数 { struct Student *creat();struct Student *del(struct Student *,long);struct Student *insert(struct Student *,struct Student *);void print(struct Student *);struct Student *head,stu;long del_num;printf(“input records:n”);head=creat();print(head);printf(“input the deleted number:”);scanf(“%ld”,&del_num);head=del(head,del_num);print(head);printf(“input the inserted record:”);scanf(“%ld,%f”,&stu.num,&stu.score);head=insert(head,&stu);print(head);return 0;} struct Student *creat()//创建链表 { struct Student *head;struct Student *p1,*p2;n=0;p1=p2=(struct Student *)malloc(LEN);scanf(“%ld,%f”,&p1->num,&p1->score);head=NULL;while(p1->num!=0){
n=n+1;
if(n==1)head=p1;
else p2->next=p1;
p2=p1;
p1=(struct Student *)malloc(LEN);
scanf(“%ld,%f”,&p1->num,&p1->score);} p2->next=NULL;return(head);} struct Student *del(struct Student *head,long num)//{ struct Student *p1,*p2;if(head==NULL){
printf(“nlist null!n”);
return(head);} p1=head;while(num!=p1->num && p1->next!=NULL){
删除
p2=p1;
p1=p1->next;} if(num==p1->num){
if(p1==head)head=p1->next;
else p2->next=p1->next;
printf(“delete:%ldn”,num);
n=n-1;} else printf(“%ld not been found!n”,num);return(head);} struct Student * insert(struct Student *head,struct Student *stud)//{ struct Student *p0,*p1,*p2;p1=head;p0=stud;if(head==NULL){
head=p0;
p0->next=NULL;} else {
while((p0->num>p1->num)&&(p1->next!=NULL))
{
p2=p1;
p1=p1->next;
}
if(p0->numnum)
{
if(head==p1)head=p0;
else p2->next=p0;
p0->next=p1;}
else
{p1->next=p0;
p0->next=NULL;
}} n=n+1;return(head);} void print(struct Student *head)//输出链表 { struct Student *p;printf(“nNow,These %d records are:n”,n);p=head;
插入
if(head!=NULL)do {
printf(“%ld %5.1fn”,p->num,p->score);
p=p->next;}while(p!=NULL);} 6. 实验结果
7. 心得体会
结构体可以允许我们自己建立不同类型数据,组成组合型的数据结构。这样可以处理一些复杂的问题。但是,在引用结构体成员时,成员运算符.和指向运算符->的使用时会有点混淆。而且有时会不能正确利用指针域进行操作。
实验9 文件的应用
1.实验目的(1)掌握文件、缓冲文件系统以及文件指针等概念。
(2)学会使用文件打开、关闭、读、写等函数对文件进行简单的操作。
2. 实验要求
(1)认真阅读和掌握和本实验相关的教材内容。(2)编写函数void fun(int n,int *t),其功能是计算n!,通过指针t返回。编写main函数,通过键盘输入一个不大于100的整数,调用fun函数,将指针t返回的值写入文件myf2.out中。(3)上机运行程序。
(4)保存和打印出程序的运行结果,并结合程序进行分析。
3.实验重点和难点
(1)acce函数可以用来判断某一文件是否存在。调用该函数时,在VC++下需包含头文件io.h,在Linux下需包含unistd.h头文件。(2)fopen、fclose函数的使用。(3)fread和fwrite函数的使用。
4. 常见错误
(1)文件打开方式使用错误。(2)文件使用完毕没有关闭。
(3)不能正确使用文件读写函数对文件进行操作。
5. 程序代码
#include #include void fun(int n, int *t){
int result=1;int i;for(i=1;i
int main(){ int num;int write;FILE *pFile;scanf(“%d”,&num);while(num>=100){
printf(“输入的数据大于100了n”);
scanf(“%d”,&num);} fun(num,&write);
} if((pFile=fopen(“myf2.out”,“w”))==NULL){
printf(“打开文件失败!n”);
} fprintf(pFile,“%d”,write);fclose(pFile);printf(“%d”,write);return 0;6. 实验结果
7. 心得体会
文件打开方式使用错误。文件使用完毕没有关闭。不能正确使用文件读写函数对文件进行操作。而且对于的各种操作容易混淆。不太清楚什么时候怎样使用。