C语言上机试题及答案 .doc
实验一 Visual C+6.0的使用及顺序结构程序设计一、实验目的1、掌握启动和退出VC6的方法。2、熟悉VC6开发环境。3、初步掌握简单程序的上机操作基本步骤,熟悉C单文件程序的输入、编译、链接和运行过程。4、初步掌握程序的编辑修改和调试。5、熟练使用赋值运算、算术运算等表达式。6、熟练使用标准输入、输出函数及各种数据类型的格式说明符。二、实验内容 1、下面C语言程序,其功能是显示字符串“欢迎同学们来到华北水院计算中心!”。请同学们按照下面的实验指导学习VisualC+60的使用。1启动VisualC+60开发环境(1)单击“开始”按钮,选择“程序” “Microsoft Visual Studio 60菜单项,单击“MicrosoftVisualC+60”,屏幕出现标题为“当时的提示”的窗口。 (2)单击“结束”按钮,关闭窗口,进入VC6.0开发环境的主窗口。2使用Visual C+6.0对一个C程序进行编辑、编译、连接和运行。分析Visual C+6.0中程序的开发过程与其它高级语言的开发过程相仿,都要经过编辑、编译、连接和运行四个步骤。 步骤 编辑 图1-1 New对话框 编辑是将C源程序输入计算机的过程。在Visual C+6.0主界面下,点击File菜单,选择New菜单项,即可出现New对话框,如图1-1所示。在弹出窗口中的Files标签页下,选择C+ Source File。在选项卡右面的File编辑框里输入文件名如“Exa.c”,在Location编辑框里输入文件路径,如“d:test”。点击OK按钮。将出现编辑窗口,如图1-2所示。 在图1-2所示的右端编辑窗口里输入以下C源程序并保存文件。 图1-2 编辑窗口 编译 编译是使用系统提供的编译器将文本文件Exa.c生成机器语言的过程,结果为,由于没有得到系统分配的绝对地址,还不能直接运行,如图1-3所示。选择Build菜单下的Compile Exa.c,计算机将完成对当前源程序的编译。按提示建立默认工程空间。编译无错时,将源程序Exa.c编译为目标文件。 编译结果如图1-4所示。如果出现运行错误,应该分析错误的原因,例如,是输入数据错误,还是代码错误;如果需要修改源程序文件,还需重新编译、链接和执行。改正编译窗口下方指出的两个错误,直至编译成功,如图1-5所示。图1-3 编译源程序 图1-4编译结果 图1-5编译成功连接 连接是将目标文件转换为可执行文件的过程。如图1-6所示选择Build菜单下的Build 。连接无错时,将目标文件连接为。图1-6 源程序 运行 运行是执行可执行文件,屏幕输出运行结果。如图1-7所示选择Build菜单下的Execute 。 图1-7 运行程序 运行结果如图1-8所示: 图1-8运行结果 3关闭系统工作区空间单击“文件关闭工作区”菜单命令,关闭系统工作区空间。此时读者可以开始输入调试第(2) 个C程序文件。4退出VC6.0开发环境单击主窗口右上角的“关闭”按钮,退出VC6.0。2、验证程序,熟悉VC6.0编程环境及调试程序的步骤。已知三角形三条边长a,b,c,计算三角形面积公式为:s=0.5*(a+b+c)编写程序,要求从键盘输入a,b,c的值,计算并输出三角形面积。其中源程序代码如下:#include<stdio.h>#include<math.h>void main()double a,b,c,s,area;printf("input a,b,c:");scanf("%lf,%lf,%lf",&a,&b,&c); /输入三角形的三条边s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c) /求三角形的面积prinf("area=%fn",area);具体要求:(1)在VC6.0环境中输入上述源程序。(2)对源程序进行编译连接,若有错误请调试修改。(3) 运行程序,并输入三条边长,观察程序运行结果。图1-9为程序运行时,当输入三条边长分别为3,4,5时的运行结果,可作为参考。图1 - 9 上述程序的运行结果三、问题讨论 1、使用printf函数输出数据时如果想使数据左对齐该如何设置?2、使用scanf函数时,输入项为何必须是变量地址而不是变量名?四、实验总结1 总结本次实验完成情况、相关知识掌握情况2 总结本次实验编辑、编译、连接、运行所取得的经验3 分析本次实验出现的主要错误最直接原因实验二 选择结构程序设计一、实验目的1、 熟悉VC6.0编程环境。2、 进一步熟悉用VC6.0调试C语言源程序的过程。3、 熟练使用关系表达式和逻辑表达式作为if语句的条件判断。4、 熟练掌握if语句和switch语句的使用方法。二、实验内容1、身高预测 每个做父母的都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后身高的因素有遗传、饮食习惯与坚持体育锻炼等。小孩成人后身高与其父母身高和自身性别密切相关。设faHeight为其父身高,moHeight为其母身高,身高预测公式为:男性成人时身高 = (faHeight + moHeight) * 0.54(cm)女性成人时身高 = (faHeight * 0.923 + moHeight) / 2(cm)此外,如果喜爱体育锻炼,那么可增加身高2%,如果有良好的卫生饮食习惯,那么可增加身高1.5%。编程从键盘输入你的性别(用字符型变量sex存储,输入字符F表示女性,输入字符M表示男性)、父母身高(用实型变量存储,faHeight为其父身高,moHeight为其母身高)、是否喜爱体育锻炼(用字符型变量sports存储,输入字符Y表示喜爱,输入字符N表示不喜爱)、是否有良好的饮食习惯等条件(用字符型变量diet存储,输入字符Y表示喜爱,输入字符N表示不喜爱),利用给定公式和身高预测方法对你的身高进行预测。 程序代码:#include <stdio.h>main()char sex; /*孩子的性别*/char sports; /*是否喜欢体育运动*/char diet; /*是否有良好的饮食习惯*/float myHeight; /*孩子身高*/float faHeight; /*父亲身高*/float moHeight; /*母亲身高*/printf("你是男孩(M)还是女孩(F):");scanf(" %c", &sex); /*在前加一个空格,将存于缓冲区的回车符读入*/printf("你爸多高(cm):");scanf("%f", &faHeight);printf("你妈多高(cm):");scanf("%f",&moHeight);printf("你喜欢运动吗(Y/N)?");scanf(" %c", &sports); /*在前加一个空格,将存于缓冲区的回车符读入*/printf("你有一个良好的生活习惯吗(Y/N)?");scanf(" %c", &diet); /*在前加一个空格,将存于缓冲区的回车符读入*/if (sex='M'|sex='m')myHeight = (faHeight + moHeight) * 0.54;elsemyHeight = (faHeight * 0.923 + moHeight)/2.0;if (sports ='Y'|sports='y')myHeight = myHeight * ( 1 + 0.02);if (diet ='Y'|diet='y')myHeight = myHeight * (1 + 0.015);printf("你将来的身高是 %f(cm)n",myHeight); 设计多组测试数据对程序进行测试,并观察运行结果。将程序的运行情况写在下面。运行结果:自己弄运行信息结果吧2、使用switch语句实现下面程序。输入一个学生的两门课成绩(百分制),计算该学生的总分并要求输出成绩等级A、B、C、D、E。总分在180分以上为A,160179分为B,140159分为C,120139分为D,120分以下为E。具体要求:学生的两门课成绩通过键盘输入,成绩应该都为整数,输入之前要有提示信息。若输入的成绩不是百分制成绩,则给出错误提示信息,并且不再进行下面的等级评价;若输入的成绩是百分制成绩,则计算总分,并根据要求评价等级。按下面形式输出结果:总分-等级如: 186-A把正确的程序源代码写在下面。程序代码:#include <stdio.h>main()int score1,score2 ,sum,mark;printf("请输入你的成绩:");scanf("%d%d",&score1,&score2);sum=score1+score2;mark=sum/10; /*采取整除方法,将mark取值压缩到有限的去值范围内*/switch(mark)case 20:case 19:case 18:printf("%d->An",sum);break;case 17:case 16:printf("%d->Bn",sum);break;case 15:case 14:printf("%d->Cn",sum);break;case 13:case 12:printf("%d->Dn",sum);break;case 11:case 10:case 9:case 8: case 7: case 6:case 5: case 4: case 3:case 2:case 1:case 0:printf("%d->En",sum);break;default:printf("输入错误n"); /*处理非法数据*/ 设计多组测试数据对程序进行测试,并观察运行结果。将程序的运行情况写在下面。运行结果:自己弄运行信息结果吧三、问题讨论 在使用switch语句时, switch和case后值的类型要求以及default子句和break语句的位置有什么需要注意的地方?举例说明四、实验总结1 总结本次实验完成情况、相关知识掌握情况2 总结本次实验编辑、编译、连接、运行所取得的经验3 分析本次实验出现的主要错误最直接原因实验三 循环结构程序设计一、实验目的5、 熟练掌握while语句,do-while语句和for语句的格式和功能,能够用这些语句实现循环结构程序设计的方法。6、 熟练掌握循环语句嵌套使用的基本形式,能够用循环语句实现多重循环。7、 掌握在循环结构程序设计中使用break语句和continue语句改变程序流程。8、 通过编程和调试程序,加深对while语句、dowhile语句和for语句的理解,学习编程和测试的基本方法。9、 实验前复习while语句、dowhile语句和for语句的概念。二、实验内容 1. 打印100-200之间的所有素数(按照每行5个显示)程序代码:对程序进行测试,并观察运行结果。将程序的运行情况写在下面。运行结果:2. 编程输出如下上三角形式的九九乘法表。1 2 3 4 5 6 7 8 9- - - - - - - - -1 2 3 4 5 6 7 8 9 4 6 8 10 12 14 16 18 9 12 15 18 21 24 27 16 20 24 28 32 36 25 30 35 40 45 36 42 48 54 49 56 63 64 72 81程序代码:对程序进行测试,并观察运行结果。将程序的运行情况写在下面。运行结果:三、问题讨论 break语句和continue语句在循环结构中使用时有何区别?举例说明。四、实验总结1 总结本次实验完成情况、相关知识掌握情况2 总结本次实验编辑、编译、连接、运行所取得的经验3 分析本次实验出现的主要错误最直接原因实验四 使用数组的程序设计一、实验目的1、 正确理解数组的概念,熟练掌握一维数组和二维数组的定义和初始化方法。2、 熟练掌握字符数组和字符串的区别和使用、字符串函数的使用。3、 熟练掌握一维数组、二维数组以及字符串的输入和输出方法。4、 了解数组的地址、数组元素的地址及一维数组和二维数组的存储结构。5、 掌握字符串的结束标志,正确使用字符串的结束标志对字符串进行处理。6、 通过编程和调试程序,加深对数组、字符数组和字符串函数应用的理解。7、 实验前复习数组、字符数组和字符串函数的概念。二、实验内容1、打印fabonacci数列的前20项,该数列前两项为1,以后各项均为前相邻两项之和。程序代码:#include <stdio.h>void main()long int f20=1,1;int j;for(j=2;j<20;j+)fj=fj-1+fj-2;for(j=0;j<20;j+)printf("%15ld",fj);if(j+1)%5=0)printf("n");对程序进行测试,并观察运行结果。将程序的运行情况写在下面。运行结果:2、 从键盘输入一个班学生(最多30人)的成绩,然后按降序进行排列。#include <stdio.h>#define N 5void main()int aN,i,j,t;printf("input scores of students:",N);for(i=0;i<N;i+)scanf("%d,",&ai);for(i=0;i<N-1;i+)for(j=0;j<N-1-i;j+)if(aj>aj+1)t=aj;aj=aj+1;aj+1=t;printf("the sorted scores:n");for(i=0;i<N;i+)printf("%10d",ai);printf("n");3、程序代码:对程序进行测试,并观察运行结果。将程序的运行情况写在下面。c运行结果:3、编写一个程序,利用字符数组实现两个字符串的比较。(注意不能使用字符串比较函数strcmp())#include <stdio.h>#define n 7void main()char s1n,s2n;int i;printf("input %d charactersn",n);scanf("%sn",s1);scanf("%sn",s2);if(s1!=s2)for(i=0);i<n;i+)if(s1i>s2i)printf("%s>%s",s1,s2);break;else if(s1i<s2i)printf("%s<%s",s1,s2);break;elsecontinue;elseprintf("%s=%s",s1,s2);程序代码:对程序进行测试,并观察运行结果。将程序的运行情况写在下面。运行结果:三、问题讨论 1使用%s格式符输入字符串到数组时能否将空格符输入?如果不能该如何使用其它方法解决?举例说明2数组在“定义”时和“引用”时所带的下标有何区别?四、实验总结需多操作才能 熟练掌握各种C语言.1 总结本次实验完成情况、相关知识掌握情况2 总结本次实验编辑、编译、连接、运行所取得的经验3 分析本次实验出现的主要错误最直接原因实验五 函数与编译预处理一、实验目的10、 掌握函数定义及调用的方法,正确理解函数调用时实参和形参的对应关系;11、 掌握并正确使用数组作为函数参数;12、 掌握函数的嵌套调用和递归调用的方法;13、 理解变量的作用域和生存期;14、 掌握宏定义、文件包含。二、实验内容1、分析下面的程序并上机运行程序,要求写出3组以上程序的运行结果。#include <stdio.h> int fun(int k)int result=1,i;for(i=1;i<=k;i+)result=result*i;return result;void main()int n;printf("Input n please(1<=n<=10)");scanf("%d",&n);printf("%d!=%dn",n,fun(n);运行结果:2、编写程序,输出2n之间的所有素数,n由键盘输入。要求判断素数的过程要写在函数中,由主函数调用实现,并写出2组以上程序运行结果。程序代码:#include<stdio.h>#include<math.h>void main() int i,j,k,n,m=0; printf("input n please!n"); scanf("%d",&n); for(i=2;i<=n;i+) j=sqrt(i); for(k=2;k<=j;k+) if(i%k=0) break; if(k>j) m+; printf("%3d",i); if(m%10=0) printf("n"); 运行结果:3、编程实现输入8个学生某门功课的成绩,用函数求出平均分,并在主函数中输出平均分以及高于平均分的同学的成绩。并写出2组以上程序运行结果。程序代码:#include<stdio.h>float average(float x8) float sum; int k;sum=x0;for(k=1;k<8;k+) sum=sum+xk;return(sum/8);void main() float cj8,aver; int m,j; printf("input scores of eight students:n"); for(j=0;j<8;j+)scanf("%f",&cjj);aver=average(cj);for(m=0;m<8;m+) if(cjm>aver) printf("高于平均分:%fn",cjm);printf("average=%6.2fn",aver);运行结果:三、问题讨论 1、 举例说明自动变量和静态变量的区别。2、答:自动变量是指那些当程序的流程转到该函数时才开辟的单元,执行后又立即释放的变量。静态变量则是指在整个程序运行期间分配固定存储空间的变量。四、实验总结1 总结本次实验完成情况、相关知识掌握情况2 总结本次实验编辑、编译、连接、运行所取得的经验3 分析本次实验出现的主要错误最直接原因答:1.实验完成,知识还未完全掌握。 2.要注意书写格式的正确。 3.主要原因是对知识的不理解。实验六 使用指针的程序设计一、实验目的15、 掌握指针的概念,会定义和使用指针变量;16、 能正确使用数组的指针和指向数组的指针变量;17、 熟悉指针作为函数参数的定义和调用方法;18、 能正确使用字符串的指针和指向字符串的指针变量。二、实验内容1. 分析下面的程序并上机运行程序,要求写出3组以上程序的运行结果。#include <stdio.h> void main()int *p1,*p2,*p;int a,b;printf("Input a b please");scanf("%d%d",&a,&b);p1=&a;p2=&b;if(a>b)p=p1;p1=p2;p2=p;printf("*p1=%d, *p2=%dn",*p1,*p2);printf("a=%d, b=%dn",a,b);运行结果:2. 下列程序的功能是分别求出数组中所有奇数之和以及所有偶数之和。形参n给了数组中数据的个数,利用指针odd返回奇数之和,利用指针even返回偶数之和。请在下面空白处将实现这一功能的函数完善,并且调试运行出结果。#include <stdio.h>#define N 10void fun(int *a,int n,int *odd,int *even) void main() int aN=1,10,2,3,19,6,i,n=6,odd,even; printf("The original data is:n"); for(i=0;i<n;i+) printf("%5d",*(a+i); printf("nn"); fun(a,n,&odd,&even); printf("The sum of odd numbers:%dn",odd); printf("The sum of even number:%dn",even);运行结果:3. 编程实现从键盘输入一个字符ch和一个字符串str,利用字符指针实现删除字符串str中和字符ch相等所有字符,然后输出字符串str。运行程序并写出2组以上程序运行结果。程序代码:运行结果:三、问题讨论 1. 简述字符串数组和字符指针的区别,举例说明。四、实验总结1 总结本次实验完成情况、相关知识掌握情况答:通过本次实验我学习了关于指针的一些应用和怎样用指针来解决一些实际问题。2 总结本次实验编辑、编译、连接、运行所取得的经验3 分析本次实验出现的主要错误最直接原因答:对课本上的知识记忆的不够牢固,对一些知识似懂非懂的,理解的不清楚。还有就是对计算机的的操作不够熟练,操作起来很慢,还经常出错。以后需加强练习。实验七、结构体程序设计一、实验目的 1 掌握结构体类型变量和数组、共用体类型变量和数组以及枚举类型变量的定义和使用。2 掌握链表的基本,初步学会对链表进行操作。3 通过编程和调试程序,加深对结构体和共用体概念的理解。4 实验前复习结构体类型、共用体类型和枚举类型的概念。二、实验内容及步骤:编程题:某单位进行选举,有5位候选人:zhang、wang、li、zhao、liu。编写一个统计每人得票数的程序。要求每个人的信息使用一个结构体表示,5个人的信息使用结构体数组。程序代码:#include <stdio.h>#include <string.h>#define M 5#define N 10struct perchar name20;int t;leaderM="zhang",0,"wang",0,"li",0,"zhao",0,"ma",0;void main()int i,j;char sec20;for(i=0;i<N;i+)printf("%d please input your result:",i+1);scanf("%s",sec);for(j=0;j<M;j+)if(strcmp(leaderj.name,sec)=0)leaderj.t+;printf("the result:n");for(j=0;j<M;j+)printf("%st%dn",leaderj.name,leaderj.t);对程序进行测试,并观察运行结果。将程序的运行情况写在下面。运行结果:2、编程题:设张三20岁、李四22岁、王平23岁,编程输出3人中年龄最小者的姓名和年龄。程序代码:#include <stdio.h>#define N 3struct peochar name20;int old;peopleN="张三",20,"李四",22,"王平",23;void main()int i=0,min=people0.old,t=0;for(;i<N;i+)if(peoplei.old<min)min=peoplei.old;t=i;printf("姓名:%sn年龄:%dn",peoplet.name,min);对程序进行测试,并观察运行结果。将程序的运行情况写在下面。运行结果:三、问题讨论 1、结构体变量何时可以整体引用,何时只能引用结构体成员变量?2、结构体和数组有什么区别?答:结构体是一种构造类型,它是由若干成员组成的。每一个可以是一个基本数据类型或者可以又是一个构造类型。结构体既然是一种构造而成的数据类型,那么在说明和使用之前必须先定义它。如同定义函数一样。 四、实验总结1 总结本次实验完成情况、相关知识掌握情况2 总结本次实验编辑、编译、连接、运行所取得的经验3 分析本次实验出现的主要错误最直接原因