重庆邮电大学本科实验报告课程名称C语言程序设计成绩评定实验项目名称C语言基础知识实践实践指导教师实验项目编号实验项目类型综合性实验地点信科S311学生姓名学号学院系专业实验时间年6月1日下午~6月18日下午(一)实验目的1.掌握C语言基础知识和基本语法2.掌握循环语句和选择语句的使用,能进行基本的编程。3.理解函数的定义,函数调用等相关知识,掌握变量的作用域和存储类型。最后能根据实际需要,编写相应的函数,用于实现某种功能。4.掌握指针和数组的相关知识,会使用指针和数组解决基本的编程问题。5.掌握字符串常量,字符数组和字符指针相关知识。掌握常见的字符串处理函数以及如何向函数传递字符串。6.了解结构体,共同体,枚举等数据类型。掌握结构体变量,结构体数组,结构体指针的定义和初始化,能够进行简单的结构体使用。(二)实验内容和要求实验一(1)实验内容:编程从键盘输入一个小写字母,将其转换成大写字母,将转换后的大写字母及其十进制ASCII码输出。(2)实验编程思路:1.首先设定一个字符型变量。2.然后提醒用户输入一个小写字母。3.用scanf函数获得输入的小写字母。4.用printf函数分别打印大写字母和其十进制数。(3)实验关键代码实现(要有调试运行效果图):#includestdio.hintmain(){chara;printf(Pleaseinputalowercaseletter:);scanf(%c,&a);printf(out:%c%d\n,a-32,a);return0;}(4)实验总结(总结该实验学到了哪些东西或者心得体会):1.设计代码要条理清晰。2.char变量用%c和%d打印将会有不同的效果。3.要熟悉ASCII码里面大写字母与小写字母之间的差。实验二(1)实验内容:课本P99页体型判断。(2)实验编程思路:1.用print和scanf函数获得相关的数据:身高和体重。2.对数据处理,获得t。3.用if-else和if语句分别实现相关结果。(3)实验关键代码实现(要有调试运行效果图):1.if-else语句#includestdio.hintmain(){floatt,w,h;printf(请输入你的体重(单位:kg):);scanf(%f,&w);printf(请输入你的身高(单位:m):);scanf(%f,&h);t=w/(h*h);//输入数据,得到关键tif(t18)printf(低体重\n);elseif(t=25)printf(正常体重\n);elseif(t27)printf(超重体重\n);elseprintf(肥胖\n);//几个if-else函数return0;}2.if语句#includestdio.hintmain(){floatt,w,h;printf(请输入你的体重(单位:kg):);scanf(%f,&w);printf(请输入你的身高(单位:m):);scanf(%f,&h);t=w/(h*h);//输入相关数据,算出关键tif(t27){if(t25){if(t18){printf(低体重\n);}else{printf(正常体重\n);}}else{printf(超重体重\n);}}else{printf(肥胖\n);}//嵌套ifreturn0;}(4)实验总结(总结该实验学到了哪些东西或者心得体会):1.if语句遇到多条件问题时候需要不断嵌套,不如其他判断语句方便。2.认为if更适合一些小问题的条件判断,比if-else更节约空间。3.写完代码要多代入不同数据进行检验计算。最好能写一个小函数来清除错误的数据格式并判断是否需要重新输入。实验三(1)实验内容:编程求200以内的所有素数(考察循环语句)。(2)实验编程思路:1.设计一个函数,用于判断一个数是否是素数。即如果他除从2到它本身的数都没有余数即为素数。2.将1~200依次套入函数,然后将素数打印出来。(3)实验关键代码实现(要有调试运行效果图):#includestdio.hintcheck(intn){intflag=1;for(inti=2;in;i++){if(n%i==0){flag=0;break;}}returnflag;}intmain(){for(inti=3;i=200;i++){if(check(i))printf(%d是质数\n,i);}return0;}(4)实验总结(总结该实验学到了哪些东西或者心得体会):1.编程需要一个清晰的思路,且要复合实际情况,比如这次1/2均不属于素数,要提前剔除。2.函数名称的定义最好采用大小写字母组合的方式。3.用for循环遍历的时候,要留心条件的变化。实验四(1)实验内容:任意从键盘输入两个数,要求编程求出最大公约数和最小公倍数。要求:用函数实现,并且在main函数中调用(2)实验编程思路:1.要先后构思出最大公约数和最小公倍数的函数算法2.关于最大公约数,设定一个int变量的值为较小的那个数,然后将它每次循环减一,再每次循环时候都用两个键盘输入的整数将它做%计算,当两者%int变量都为0时,跳出循环。3.关于最小公倍数,类似最大公约数的算法。设定一个int变量的值为较小的那个数,然后将它每次循环加一,再每次循环时候都用它%两个键盘输入的整数,当int%两者变量都为0时,跳出循环。#includestdio.h//求最大公因数的函数intMax(intm,intn){inti=(mn?n:m);while(!(m%i==0&&n%i==0)){i--;}returni;}//求最小公倍数的函数intMin(intp,intq){intj=(pq?q:p);while(!(j%q==0&&j%p==0)){j++;}returnj;}//主函数intmain(void){inta,b,c,d;printf(请输入两个整数(用英文,隔开):);scanf(%d,%d,&a,&b);c=Max(a,b);d=Min(a,b);printf(最大公因数是:%d\n最大公倍数是:%d\n,c,d);return0;}(4)实验总结(总结该实验学到了哪些东西或者心得体会):1.对于函数的设计一般是编程的重点。2.不同函数的变量最好设计成不同的名称,不然会降低可读性。3.目前函数的设计不要过分追求简单高效,能完成目标才是现在最重要的。实验五(1)实验内容:输入十个整数,将其中最小的数与最后一个数对调,将其中最大的数与第一个数对调。要求:(1)用三个函数实现,并且在主函数中调用。(2)必须要使用指针(2)实验编程思路:本题的重点在于必须要用指针实现,而指针和数组具有一定的相似性,所以,我们首先要找出关键数字——最大值和最小值的指针值。这分别用了两个函数,然后再在主函数中将这两个函数调用。最后用简单的交换方法交换值,然后用一个for循环打印。(3)实验关键代码实现(要有调试运行效果图):#includestdio.h//函数一返回最小值的指针值int*Min(intnum[]){int*p,*min;min=num;for(p=num+1;pnum+10;p++){if(*p*min){min=p;}}returnmin;}//函数二返回最大值的指针值int*Max(intnum[]){int*p,*max;max=num;for(p=num+1;pnum+10;p++){if(*p*max){max=p;}}returnmax;}//函数三主函数intmain(){intnum[10];printf(请输入十个整数(每输入一个数用回车确认输入):\n);for(inti=0;i10;i++){scanf(%d,&num[i]);}//输入一串整数int*min=Min(num);int*max=Max(num);inta,b;a=num[9];num[9]=*min;*min=a;b=num[0];num[0]=*max;*max=b;//按照题目要求转换位置for(inti=0;i10;i++){printf(%d,num[i]);}//用for语句加以打印return0;}(4)实验总结(总结该实验学到了哪些东西或者心得体会):1.对于scanf和printf以及for语句等一定要熟练掌握。2.设计函数时,要注意变量的类型。3.指针和数组是具有一定的相似性的,我们可以用类似数组的写法写出指针的算法。实验六(1)实验内容:任意输入一行字符串,统计字母,数字,空格的个数。要求:用指针实现。(2)实验编程思路:依然是主要运用数组和指针的相似性,首先用字符串的gets函数获得字符串,然后设计字母、数字、空格的计数变量,我还多设计了一个可以用来计数无关的符号,比如“,”、“。”。再就是判断各个字符是数字还是字母还是空格,这主要用ASCII码进行判断。(3)实验关键代码实现(要有调试运行效果图):#includestdio.hintmain(){printf(请输入任意字符串:);charstr[1024];char*p=str;inti,j,k,m;gets(str);i=j=k=m=0;while(*p){if(*p='0'&&*p='9')i++;elseif(*p=='')k++;elseif((*p='A'&&*p='Z')||(*p='a'&&*p='z'))j++;elsem++;p++;}printf(数字有%d个\n字母有%d个\n空格有%d个\n,i,j,k);return0;}(4)实验总结(总结该实验学到了哪些东西或者心得体会):1.对指针和数组的理解一定要加深。2.对几个基础循环的理解要加深。3.对ASCII码在C语言学校中的重要性要有意识。实验七(1)实验内容:某班有不超过30人(具体人数由键盘输出)参加某门课程的考试,用一维数组和指针实现,编程实现如下菜单驱动的学生管理系统:、具体的要求见书P252实验题(2)实验编程思路:这个题是本次最难的,难在分支很多,所以我认为最好选择switch面对这个情况。下面逐条介绍思路:0.菜单界面,单纯的printf。1.如何完成一个项目后返回菜单界面,一开始想用goto函数,但是考虑到一些问题所以最后还是用了比较稳妥的for语句,并采用无限循环。2.分支1——采用for循环,scanf将学号和成绩放入两个数组中。3.分支2——总分和平均分。用基础for语句算出总分直接除以一开始的总人数即可。4.分支3、4、5——类比书上的方式,设计一个对比函数,然后一个升序一个降序两个排序函数,一个交换函数,再互相嵌套运用即可。5.分支6——首先运用分支3的方式排好序,然后获得该学号学生在整个顺序数组中的位置,还要考虑大名次上我们应该+1,因为机器是从0开始计数的。最后加以打印就好。6.分支7——对每个人加以分类,这有点类似试验2。然后设定特征值(数量)。最后考虑到printf中打印%的方式是“%%”。7.分支8——遍历打印即可。8.分支0——运用exit函数即可。(3)实验关键代码实现(要有调试运行效果图):#includestdio.h#includestdlib.h#defineNUM30//2.1计算总分和平均分voidzongfen(intscore[],intN){intzong=0;floatping;for(inti=0;iN;i++){zong=zong+score[i];}ping=(float)zong/N;printf(总分为%d,平均分为%.2f\n,zong,ping);}//两数的交换函数voidswap(int*x,int*y){inttemp;temp=*x;*x=*y;*y=temp;}//3/4/5分数的排序voidpaixu(intscore[],intnum[],intN,int(*compare)(inta,intb)){inti,j,k;for(i=0;iN-1;i++){k=i;for(j=i+1;