1、C程序设计语言实验指引书信息教研室编西南科技大学计算机科学与技术学院8月 实验一 简朴C语言程序1.1 实验类型:验证型实验 2学时1.2 实验目1、熟悉并学习使用C程序编译平台TurboC;2、掌握如何在编译平台下编辑、编译、连接和运营一种简朴C程序;3、掌握C语言基本数据类型,熟悉变量定义和赋值办法;4、学会使用C算术运算符和算术表达式;1.3 知识点简介1、C程序构造。 一种程序有各种程序单位构成,每一种程序单位作为一种文献,编译系统分别对每个程序文献分别编译,然后连接起来形成可执行程序。在一种程序单位中包括如下几某些:预解决命令全局声明某些函数(有函数首部和函数体构成),一种C必要有一
2、种(并且只能有一种)main()函数。2、C数据类型和表达式 C有各种数据类型,数据类型隐含着该类数据表达、存储及解决规则。 C运算符丰富,使用十分灵活。有运算符和括号将运算对象(操作数)连接起来,构成表达式。表达式中混合运算式要注意运算符优先级和结合性。此外,不同数据类型运算时,存在类型转换(隐式自动转换和强制转换)。3、C程序编写实现用C语言编写程序对源程序文献进行编译声称目的文献对目的文献连接形成可执行程序运营程序得到成果分析成果。1.4 实验内容题目1 最简朴C程序按提示操作环节,输入下面程序代码,编译连接并执行。实验提示 按照操作环节创立第一种应用:(1)编辑你第一种C源程序(2)保
3、存你源文献(3)编译、连接得到可执行程序(4)改正源程序中错误(5)运营你第一种程序思考与扩展1、如果程序中大小写输入错误如main 写成Main,成果会如何?2、编译运营通过后,本程序输出了一行字符,如果还想输出一行字符:its too easy!程序代码该如何修改添加?提示:注意使用换行控制符 n 题目2 简朴应用求圆柱体体积输入下面程序代码,编译运营。 实验提示按照第一题操作环节文献,输入代码,编译连接,执行程序,输入测试数据分析成果与否对的,如有错误改正后再重新编译连接,直到没有错误为止。 测试数据运营时输入:5 8 -2 1思考与扩展1、如果运营时输入 3.8 5 程序输出成果是什么
4、,对的吗?将程序中变量radius,high改为double类型,然后输入上面测试数据,成果怎么样?阐明因素。2、注意 输入提示和输出提示语句,尝试修改输入数出提示语句。题目3 温度转换 输入华式温度,规定输出摄式温度。公式C=5/9*(F-32)输入输出要有文字阐明,取两位小数。测试数据运营时输入:3017实验二 逻辑构造2.1 实验类型:验证型实验 2学时2.2 实验目1、掌握C程序控制基本构造:选取构造实现;2、掌握简朴C程序编写和调试2.3 知识点简介1 关系运算、逻辑预算,关系表达式和逻辑表达式。2、选取构造:if语句,switch语句应用。2.4 实验内容题目1 计算员工周工资编写
5、一种程序,输入某雇员每周工作时间(以小时计)和每小时工资数,计算并输出她工资。若雇员周工作小时超过40小时,则超过某些按原工资1.5倍加班工资来计算。若雇员每周工作小时超过60小时,则超过60某些按原工资3 倍加班工资来计算,而40到50小时工资仍按照原工资1.5倍加班工资来计算。1、规定有输入提示和输出提示,如要输入雇员工作时间和每小时工资值时,可以提示:“Please input employees work time and wage_per_hour:”输出时,提示:“The employees wage :”。2、给你程序加上注释,并注意排版格式,使得其清晰可读。实验提示1、从本次实
6、验开始,咱们开始编写稍微复杂程序,涉及到某些简朴算法,请务必按实验规定养成良好编程习惯,再次强调:代码要写整洁,注意排板规范。给你变量起个好名字,不要什么变量都用a,b,c等,变量最佳用英文单词或单词缩写命名,变量名字要体现变量在程序含义和作用。要有必要注释!,养成这一良好习惯很重要,请记住,“代码只被书写一次,而它被修改和阅读次数也许是无限”2、本程序可以使用if语句和switch语句分别实现流程图分别如下:真(1)真(1)假(0)假(0)Cinworktimewageph(worktime =40)(worktime =60)Wage= worktime* wagephWage=( (wo
7、rktime-40)*1.5+40)*wagephWage=( (worktime-60)*3.0+ (60-40)*1.5)+ 40)*wageph输入 coutworktimewagephif(worktime 60) count=3;else count = worktime/20Wage= worktime* wagephWage=( (worktime-40)*1.5+40)*wagephWage=( (worktime-60)*3.0+ (60-40)*1.5)+ 40)*wageph输入 coutwage;Switch 语句实现流程图测试数据输入:30 4输入:45 4.5输入:
8、60 5思考与扩展1、尝试分别用if和switch 语句实现选取构造语句2、测试数据选取应当考虑选取构造中每一种状况都被执行一次,也就是选取测试数据应当具备代表性,对本题来说,选取数据因该分几种状况:)不大于数据)不不大于而不大于数据,)不不大于数据,)不合理数据例如负数或不不大于数,(注意一周最多只有小时),设计一组你测试数据。 题目2 设计一种计算+、-、*、/程序程序从原则输入读入表达式:输入:回车则输出:输入:回车则输出:。实现规定:1、有输入提示和输出提示,如要输入表达式时,可以提示:pealse intput arithmetic expression:输出时,提示: 4+2=6。
9、计算在顾客输入非政策表达式时程序结束并提示输入错误。、为你程序加上注释,使得其清晰可读。、尝试运用调试程序来修改你程序逻辑错误。实验提示 详细计算可采用switch语句实现switch(operator)/判断运算符case +:result = operand1 + operand2;coutoperand1 op operand2=resultendl; break;case -: default:测试数据自己设计一组测试数据,规定覆盖switch选取构造中所有途径即每条case语句都被执行一次。思考与扩展1、使用switch 语句中break起什么作用?2、你尚有更好实现办法么? 实验三
10、 循环控制题目1 下面程序计算n! 规定:1、看懂代码,添加必要注释。2、分别用for do-while语句改写程序。3、当程序运营时输入,会遇到困难,请改写程序? 4、计算 -1!+ 2!- 3!-+ 20!。规定1)分别采用从左到右相加和从右到左相加计算顺序;2)采用所有负项和所有正项分别相加实验提示1、设立断点调试程序。在循环体语句某些设立几种断点,单步执行,观测需循环体语句执行流程,即循环控制变量变化,观测执行过程中个变量值。2、如果循环次数太大时,。你应当设立适当循环条件,使循环次数减少,否则单步执行完所有循环次数太费时间,如某个循环共1000次,在调试时可以设立较小循环次数10,待
11、调试完毕再设立为1000。 思考与扩展、计算!时,当程序运营时输入,会遇到困难,如何改写程序?、计算-1!+ 2!- 3!-+ 20!程序中使用循环嵌套,可以用for while do-while构造进行组合,有几种组合方式?题目2 计算生日时星期几 编写一种程序,只要输入年月日,就能回答那天是星期几。实验提示1、已知公元1年1月1日是星期一2、算法提示:如果输入是3月12日,计算办法是(1) 先计算从公元00初(0001-1-1)到末(-12-31)共多少天,注意其中有闰年,闰年是366天,平年是365天。闰年判断条件满足(见教材例3.8题):( year%4=0 & year%100!=0
12、 )!(year%400=0) (2) 然后再计算1月1日到-3-12是多少天。注意同样判断本年度与否闰年,即二月份是28天还是29天。(3) 上述两某些相加即从公元00初(0001-1-1)到末(-3-12)天数,用该天数模7(total%7)即得到星期数。、顾客多次循环输入数据并计算可采用while语句实现:/一方面输入三个数据:coutyear monthday;/一方面输入三个数: 年 月 日while(year!= 0 & month!=0 & month!= 0) /详细计算语句/本次循环结束前再次输入三个数据(年 月 日),为下次循环计算做准备coutyear monthday;
13、 测试数据、1年1月1日是星期一、2年1月1日是星期二、用上机日期4、1月1日是星期六思考与扩展1、用switch语句实现程序。比较if和switch语句区别。2、对输入日期和理性检查,例如月份不能不不大于12,非闰年不得有2月29日,小月不得有4月31日 实验四 数组4. 1 实验类型:验证型实验 2学时4.2 实验目1、掌握一维数组和二维数组定义、赋值和输入输出办法;2、掌握字符数组和字符串使用;4.3 知识点简介1、数组是有序数据集合。特点:有序,元素必要是同一种类型,用下标标记每一种元素,数组在内存中占用一块持续存储单元。2、数组定义:定义时必要给出数组大小(即数组元素个数)。数组使用
14、时用下标标记特定元素,注意使用时下标不要越界。3、经常使用char类型数组来解决字符和字符串。字符数组和字符串数组区别在于字符串数组有一种结束标志0.4、惯用排序算法:冒泡法和选取法。4.4 实验内容题目1 排序查找用选取法对15个学生成绩按从大到小顺序排序,15个学生成绩整数用scanf 输入,如果输入成绩不在0,100之间,则提示“输入错误”。排序完毕后,输入一种成绩,规定用折半查找法找出该成绩是该组中第几种元素值(即第几名)。如果该成绩不在数组中,则输出“无此成绩”。实验提示1、本题第一步一方面对15个成绩排序,可使用冒泡法或选取法排序(冒泡排序算法见教材)。选取法排序算法思想:n原数组
15、中选取最小一种元素,把它和位于第一种位置元素互换位置;然后,在剩余n-1个元素中选取最小一种元素,并把它和第一种位置元素互换;不断重复这些过程,直到最后两个元素。如:设有10个元素a0a9,第一轮:将a0与a1a9比较,若a0比a1a9都小,则不进行互换,即无任何操作。若a1a9中有一种以上比a0小,则将其中最小一种(假设为ai)与a0互换,此时a0中存储了10个中最小数。第二轮将a1与a2a9比较,将剩余8个数中最小者ai与a1对换,此时a1中存储是10个中第二小数。依此类推,共进行9轮比较,a0a9中已按由大到小顺序存储。2、排序完毕后,这15个成绩按由大到小顺序排列,此时用折半查找法查找
16、某一种成绩效率较高。折半查找法算法思想:如果有以按由小到大排好序9个数,a0a8,其值分别为:1 3 5 7 9 11 13 15 17 若想查3与否在此数组中,可以先找出表列中居中数,即a4,将要找数3与a4比较,a4值是9,发现a43,显然3应当在a0a4范畴内,而不会在a5a8范畴内。这样就可以缩小查找范畴,甩掉a5a8这一某些,即将查找范畴缩小为一半。再找a0a4 中居中数,即a2,将要找数与a2 比较,a2值是5,发现a23,显然3应当在a0a2范畴内。这样又将查找范畴缩小了一半。再将3与a0a2范畴内居中数a1比较,发现要找数3等于a1,查找结束。一共比较了3次。测试数据自己选取1
17、5数据输入。查找某一成绩时,分别选用在15个中成绩和没有在15成绩中数据测试。思考与扩展1、将选取法排序与起泡法比较,分析它们特点和效率。2、如果采用顺序查找办法,即从第一种元素开始对比始终到找到与之相等元素,和折半查找法相比,那个效率高?3、数组名作为函数参数,形参和实参关系?题目2 矩阵相乘将两个给定距阵(3X3)相乘得到另一种距阵并将其打印出来。提示: X = 其中 规定:1、从键盘输入两个矩阵,并输出成果矩阵。矩阵输入输出规定行列对其。2、把矩阵相承写成函数形式,在主函数中完毕矩阵输入输出。实验提示1、定义三个数组a22,b22,c222、注意c数组每一种元素则应设计一种嵌套循环,一共
18、有三个循环变量:i,j,k for(i=0;i3;i+;) for(j=0;j3;j+;) for(k=0;k=1并且n=r;2、分别用递归和非递归两种方式完毕程序设计;3、多文献构造实现将上面用非递归方式写成程序改成用多文献构造表达。规定将main()函数放在一种文献中,将此外两个函数放在另一种文献中,将函数原型阐明放在一种头文献中。建立一种项目,将这三个文献加到你项目中,编译连接使你程序正常运营。 测试数据:输入:5 3输入:10 20输入:-1 4输入:50 3输入:0 0实验提示1、运用一种非递归函数fn(int n)计算n!,运用另一种函数Cnr(int n,int r)计算Cnr,
19、在该函数中调用fn(),问题:你打算用什么样变量类型来存储n!函数返回值?注意各种数据类型内存字长不同,整数能存储数据范畴有限,你如何解决?可以用double数据类型来存储函数计算成果2、运用一种递归函数实现,运用公式实现递归:C(n,r) = C(n,r-1) * (n r + 1) / r注意递归结束条件:如果 r = 0 ,则C(n,r) = 1如果 r = 1,则C(n,r) = n思考与扩展1、设立断点观测函数递归调用和嵌套调用执行流程。2、递归函数书写要点是什么?3、在递归版本中,当n大到什么值时系统将发生栈溢出报错?你觉得递归和非递归函数哪种好些?,4、多文献构造中头文献作用是什
20、么?5、将程序划分为各种文献有什么好处?1、对一种形式测试:分别在有标记符和注释掉程序中标记符定义两种状况下编译运营。2、对第二种形式测试:分别使表达式值为0和非0两种状况下编译运营。. 实验六 指针6.1 实验类型:验证型实验 2学时6.2 实验目1、掌握指针概念、学会定义和使用指针变量;2、掌握引用型变量概念、学会定义和使用引用型变量;3、学习使用指针数组和指向数组指针;4、学习使用指向字符串指针变量;5、学习使用指针和引用给函数传递参数;6.3 知识点简介1、指针就是地址,一种变量地址成为给变量指针。指针变量就是用来专门存储另一种变量地址。若果一种指针变量存储另一种变量地址,咱们就说指针
21、变量指向该变量。 2、指针变量类型是其指向变量或常量数据类型,指针变量自身在内存中只占四个字节。3、指针作为函数参数时不会变化实参指针变量值,但可以变化实参所指向变量值。4、数组名代表数组首地址,是一种指针常量。可以用一种指针变量指向一种数组,通过该指针可以对数组任意操作。5 函数指针:函数名代表函数函数入口地址,可以定义指向函数指针变量用来指向函数。指针函数:函数返回值是指针(地址)。6、指针运算灵活,但容易出错。7、变量引用就是变量别名。引用作形参不是传值,而是传递别名,即形参是实参别名,并没有为形参分派存储单元。 6.4 实验内容题目1 程序分析输入下列程序,运营它,分析得到成果。规定:
22、1、给本题代码加上恰当注释,编译调试,分析阐明程序运营成果。2、如果将swap函数改为如下形式,程序运营成果是什么?分析阐明。void swappionter(int *p1,int *p2) int * temp; temp = p1; p1 = p2; p2 = temp;3、如果将swap函数改为如下形式,主函数中函数调用改为:swap( iv1,iv2 );程序运营成果是什么?分析阐明。void swap(int &p1,int &p2) int temp; temp = p1; p1 = p2; p2 = temp;实验提示1、注意区别指针定义,指针引用。 2、注意区别指针值和指针指
23、向对象值。测试数据自己修改程序中某些代码,调试运营。思考与扩展1 归纳阐明普通变量作形参、指针作形参、引用作函数形参得区别。题目2 班级课程成绩计算一种班有5名学生,每个学生修了五门课,1)求每个学生平均成绩,并输出每个学生学号,每门课程成绩及平均直。2)求某门课程平均分;实现规定:1、分别编写2个函数实现以上2个规定。2、第1个函数用数组名作参数。第2个函数用指针用参数,并在函数体内用指针对数组操作。实验提示 1、第一种办法:(1)程序数据构造定义一种一维数组存储5学生学号:int num5;定义一种二维数组存储5学生成绩int sco55,再定义一种一维数组存储5个学生平均成绩int av
24、sco5;(2)函数编写 求每个学生平均成绩函数:void averscore ( int sco5 ,avsco5 ),函数体中算法是计算sco5每一行平均值赋给avsco5相应元素。 求某门课程平均分函数:int avercourse( int(*psco)5, n ) ,形参中int(*sco)5 是指向5个元素构成一维数组指针变量,n表达要查找第n门课程成绩。如函数调用:avercourse( sco,3),sco是二维数组名,3表达要计算第3门课程平均分。函数体中计算psco所指向二维数组第3列平均值; 2、第二种办法,(1)程序数据构造由于学号、成绩、平均成绩都是数值型数据,可以定
25、义一种二维数组用来保存学生信息学号、5门成绩、平均成绩:int stu_info57 数组有5行7列,5行相应5个学生,7列分别相应学生学号、5门成绩、平均成绩。固然没有计算平均成绩之前最后一列数据是0;(2)函数编写 求每个学生平均成绩函数:void averscore ( int stu_info57 ),函数体中算法是计算stu_info57每一行第1到5列元素平均值赋给第6列元素(第0列是序号)。 求某门课程平均分函数:int avercourse( int(*psco)7, n ) ,形参中int(*sco)7 是指向7个元素构成一维数组指针变量,n表达要查找第n门课程成绩。如函数调
26、用:avercourse( sco,3),sco是二维数组名,3表达要计算第3门课程平均分。函数体中计算psco所指向二维数组第3+1列平均值(第一列是学号); 测试数据自己选取一组数据输入。思考与扩展1、二维数组作为函数形参int avercourse( int(*psco)5, n )中为什么要指定第二维大小?2、在函数体中用指针操作二维数组例如:*(*(psco +i)+j)就代表数组第i行j列元素即pscoij。题目3 排序查找(选做)用选取法对15个整数安从大到小顺序排序。15个整数用scanf 输入。排序完毕后输入一种数,规定用折半查找法找出该数是数组中第几种元素值。如果该数不在数
27、组中,则输出“无此数”。规定:1、把排序算法写成函数形式,用指针变量作为排序函数参数,在排序算法中用指针法访问数组元素。2、把查找算法写成函数形式,用指针变量作为查找函数参数,在查找算法中用指针法访问数组元素。实验提示 排序算法和折半查找法见实验4。测试数据自己选取一组数据输入。思考与扩展1、在调用函数时实参为什么只需给出数组名?2、指针函数和函数指针有什么区别? 实验七 构造体7.1 实验类型:验证型实验 2学时7.2 实验目1、掌握构造体变量定义和使用;2、掌握构造体数组定义和使用;3、理解链表概念,学习使用指针构造和操作简朴链表;4、理解堆内存分派技术;7.3 知识点简介1、C提供了丰富
28、基本数据类型,为理解决复杂实际问题,C容许顾客自定义数据类型:构造体类型、共用体类型、枚举类型2、构造体类型:包括若干个不同数据类型数据项。构造体类型定义(规定)了一组数据项信息组织构造,相称于一种模型,系统并没有为其分派存储单元,只有在定义了构造体变量时,系统才按照该构造类型数据项信息组织构造分派相应存储单元。3、构造体变量可以向其她数据类型同样使用。可以定义构造体类型数组,可以定义构造类型指针,也可以定义构造体类型引用。4、malloc和free:动态分派和撤销内存。malloc出来内存空间必要用一种指针来向它,使用完毕之后必要用free撤销掉,否则会导致内存泄露。5、共用体类型:不同几种
29、数据项占用同一块内存。使用共用体变量目是但愿同一段内存存储几种不同类型数据,但每一瞬间只能存储一种,而不是同步存储。7.4 实验内容题目1 日期计算定义一种构造体变量(涉及年、月、日),编程序,规定输入年月日,程序能计算并输出该日在本年中第几天。注意闰年问题。实验提示 算法提示见第三次实验计算生日时星期几测试数据1、1年1月1日是星期一2、2年1月1日是星期二3、用上机日期5、1月1日是星期六。思考与扩展1、修改程序,在程序中用指针办法访问构造体变量成员。2、构造体变量占用存储单元字节数是多少,能不能用sizeof()求构造体变量字节数?题目2 学生成绩管理有5个学生,每个学生数据涉及学号、班
30、级、姓名、三门课成绩。从键盘输入5个学生数据,规定打印出每个学生三门课平均成绩,以及平均分最高分学生数据(涉及学号、班级、姓名、三门课成绩,平均分)。规定:1、定义学生构造体。2、用一种函数实现5个学生数据输入,用另一种函数负责求每个学生三门课程平均成绩,再用一种函数求出平均分最高学生并输出该学生数据。规定平均分和平均分最高学生数据都在主函数种输出。3、用多文献程序构造实现。实验提示1、构造体定义 struct Student int num; /学号 char name20; /班级注意字节长度 char classname20; /班级 float score3; /三门课程成绩 floa
31、t aver_score; /平均分 2、数据组织提示:在主函数中定义一种构造体数组。 Student stu20 /定义有20个变量元素构造体数组(依照需要/拟定数组大小)。3、构造体数组使用 (1)循环输入学生信息:int stu_number = 0 ; /学生个数printf(please enter student number:); scanf(stu_number)for( int i = 0;i=stu_number;i+)cout please enter NO. i stui. num stui. name stui. classname;cin stui.score0 s
32、tui.score1 stui.score2;(2)平均分计算函数 ,以数组名作参数void averagescore(student stu,int number) for( int i = 0;i= number;i+) Stui = (stui.score0+ stui.score1+stui.score2)/3.0 (3)求平均分最高学生int averagescore(student stu,int number)int k = 0;/查找最高平均分并记录在数组中下标值for( int i = 0;i= number;i+) return k; /返回最高平均分数组元素下标测试数据自
33、己设计一组测试数据思考与扩展 如果这样定义构造体 typedef struct Student int num; /学号 char name20; /姓名 注意字节长度 char classname20; /班级 float score3; /三门课程成绩 float aver_score; /平均分 STU,* pSTU;阐明如下三条语句含义:student stu1;STU stu2; pSTU pstu; 实验 八 文献操作8.1 实验类型:验证型实验 2学时8.2 实验目1、理解文本文献和二进制文献格式区别;2、掌握对文本文献I/O操作;3、掌握对文本文献I/O操作;8.3 知识点简介
34、ASCII文献和二进制文献区别1)对于字符信息,在内存中是以ASCII代码形式存储,因而,无论用ASCII文献输出还是用二进制文献输出,其数据形式是同样。2)但是对于数值数据,两者是不同。例如有一种长整数100000,在内存中占4个字节,如果按内部格式直接输出,在磁盘文献中占4个字节,如果将它转换为ASCII码形式输出,则要占6个字节。8.4 实验内容题目1 二进制文献操作从键盘输入字符串并保存成文献。规定:1、输入字符串中涉及:大小写字母、空格、数字等字符,以“#”作为字符串输入结束条件;2、对输入字符进行加密并保存,以二进制文献方式保存,顾客可以输入保存途径,如:C:file.txt ;3
35、、打开文献时,对加密文献进行解密并显示在屏幕上。 实验提示1、使用scanf获取输入字符时,遇到空格时终结读取字符,为了避免这种状况,不能简朴使用scanf来获取输入字符;2、加密方式:将字母A变成E,a变成e,即将字母变成其后第4个字母,W变A,X变成B,Y变成C,Z变成D,w变a,x变成b,y变成c,z变成d。解密方式:即加密方式逆过程。 测试数据自己设计测试数据,进行测试;在实验报告中,列出自己设计测试数据。思考与扩展题目2 学生信息管理有5个学生,每个学生数据涉及学号、班级、姓名、三门课成绩。从键盘输入5个学生数据。规定:1计算出每个学生三门课平均成绩,将原有数据和计算出数据存储在磁盘文献stud中2从文献stud中得到数据,并按平均成绩高低进行排序,将排序学生数据放在新文献stud_sort中。 测试数据自己设计测试数据,进行测试;在实验报告中,列出自己设计测试数据。思考与扩展