最新《C语言程序设计专用周》实训指导书.doc
Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateC语言程序设计专用周实训指导书程序设计基础C语言程序设计专用周2实训指导书(供计算机类专业3年制专科使用)计算机科学技术系编制前 言程序设计是一门实践性很强的课程,实践教学在程序设计中是非常重要的教学环节。程序设计基础课程一直设有实训专用周,实训专用周是课程教学中的一项重要内容,是完成教学计划达到教学目标的重要环节,它对帮助学生全面牢固地掌握课堂教学内容、培养学生的实践和实际动手能力、提高学生全面素质具有很重要的意义。在程序设计的教学中,实践教学与基础教学各有侧重,互为补充。通过实验教学,可以验证、巩固和补充课堂讲授的知识;通过实验教学,可以使学生深入领会程序设计语言的功能和作用,理解程序的编译、运行机理,加深对算法的程序实现本质的认识,从而具备较好的程序设计能力和解决问题的能力,并积累一定的实践经验,为今后在专业领域中用计算机解决问题打下扎实基础。实训专用周授课总时数为30学时。建议教师讲授学时为6学时,学生上机实验学时为24学时,教师也可根据学生的学习情况自行灵活地调整讲授学时和上机实验学时。本实训指导书根据程序设计基础课程选择的教材一般为C语言,故将实训项目分为四大部分,分别为模块化程序设计、数组与结构体的应用、综合练习、等级考试模拟考试,供教师根据学生掌握情况选择内容让学生练习。学生上机编译环境可选择Turbo C或Dev C+。由于时间仓促,在实训项目设置和实训方法设计上还有待进一步改进,书稿中难免有疏漏之处,恳请各位老师和同学批评指正,以利进一步改进。目 录第一部分 模块化程序设计6基础练习6提升练习9第二部分 数组、结构体、指针的应用11基础练习11提升练习14第三部分 综合题15附件:计算机等级考试二级C语言笔试试题22绪 论C 是一门高效实用的程序设计语言,它既可进行过程化程序设计,也可进行面向对象程序设计。随着 C 逐渐成为 ANSI 标准,这种新的面向对象程序设计语言已经成为了程序员最广泛使用的工具。本课程是一门计算机及相关专业的重要的专业基础课,开设实验课程主要目的是使学生掌握有关 C 语言的基本概念、基本语法和编程方法,理解 C 语言面向对象的重要特征, 促使学生理论联系实际,能够灵活应用自己所学的理论知识进行程序开发,增强学生的实践动手技能,并能够提高学生独立分析问题和解决问题的能力。通过程序设计基础实训专用周,使学生能将学到的程序设计思想用到具体的工作和学习中。通过实训专用周,能够提高学生分析问题、解决问题的能力,从而运用所学知识解决实际问题,因而必须给予足够的重视。 学生在进行专用周实训时,建议首先明确专用周实训任务,复习与查阅一些相关资料。在实习过程中,能按要求完成实训内容,实训指导书后面虽附有每一部分每一小题的程序源代码,但只是提供了对应问题的一种算法思路,而学程序设计基础是为后继课程打基础,要求学生能独立编一些基本的程序,解决基本的数学和实际等问题,所以学生一定要严格要求自己,希望学生能进行独立的思考、独立的编程、独立的上机调试,这一点是非常重要的。同时,通过进行专用周实训后,希望学生能将理论灵活地应用于实践,编写出正确、执行效率高、可读性好、界面友好的程序。实训要求、考核及说明建议学生在专用周中的实践练习中,对于指导书上前面四部分的基础练习、提升练习单独完成,同学之间可相互交流学习,但要独立上机编写调试,对于指导书上的第五部分学生可两人或三人分组完成。学生实训结束后需提交程序电子文档和实训报告(总结)。凡不按规定提交程序电子文档、报告(总结)或上交内容为抄袭,则整个实训成绩为“不及格”。实训采用百分制评定程序设计基础实训专用周成绩,学分为2学分,具体的评分标准参照如下:评分内容内涵比例按时出勤,遵守课堂纪律按学院及系部规定执行30按时完成规定内容能否按照要求编写程序50撰写报告(总结)思路清晰,操作可行等20第一部分 模块化程序设计实训目的:在课堂教学的基础之上,进一步熟悉模块化程序设计思想,掌握用函数书写程序的技巧。函数是模块划分的基本单位,是对处理问题过程的基本抽象单元。同时使用函数也为代码的重用提供了技术上的支持,从而提高开发效率,增强程序的可靠性,便于分工合作和修改维护。实训准备要求:复习程序设计基础教材的相应章节,熟悉函数的定义、调用、函数的参数传递、函数的返回值等。熟悉上机编译环境。实训环境要求一人一机。实训步骤和内容:基础练习:1. 写一个函数,判断一个5位数是不是回文数。例:12321是回文数,个位与万位相同,十位与千位相同。编程指导及提示:! 定义函数,注意形参、函数返回值类型等定义一个函数的语法格式为:类型 函数名(形式参数表)函数体;! 将输入的一个5位数的个、十、百、千、万位分离,再判定个位与万位、十位与千位是否相同,将判定结果返回给主函数! 程序运行演示:2. 编写一函数,将N*N方阵行列互换。编程指导及提示:! 函数的书写见上面的提示! N*N方阵用二维数组定义,定义格式如:int arrayNN;! 二维数组的输入、处理、输出均需用循环的嵌套来控制! 要实现N*N方阵行列互换关键是观察数组元素下标的变化规律。例一个3*3矩阵为: 1 2 3 4 5 6 7 8 9行列互换后该矩阵变为: 1 4 7 2 5 8 3 6 9! 程序运行演示:3. 写一函数,使输入的一个字符串按反序存放,要求在主函数中输入和输出字符串。编程指导及提示:! 函数的书写见上面的提示! 字符数组的定义一维字符数组定义的格式为: char数组名常量表达式;! 字符串按反序存放即第一个字符与最后一个字符交换,第二个字符与倒数第二个字符交换,,用循环控制,注意交换次数为N/2(N表示所输入字符串的长度)! 使用指针完成! 程序运行演示:4. 写一函数,将一个代表整型数的字符串(比如“-34”)转换为一个整型的数字。编程指导及提示:! 将字符串分两种情况考虑,一种情况是第一个字符是负号,另一种情况是全数字。! 程序运行演示:5. 编写一函数显示如下规则的图形,每行*号个数及输出行数由主函数输入n值控制。* * * * * * * * * * * * * * * * * *编程指导及提示:! 观察图形变化规律,分成两部分(前四行和后四行)来控制输出较易实现,用循环嵌套处理,外层循环变量值由n变为1,内层循环由1变为i(i为外层循环变量名)! 程序运行演示:6. 写一函数,用“起泡法”对输入的10个字符由小到大排序。编程指导及提示:! 函数、主函数的书写见上面的提示! “起泡法”思路为:将相邻两个数比较,将较小的调到前头,较大的放到后头。经过1轮比较后,最大的数便调到最后一个位置。所以n个数要比较n-1趟,在第j趟中要进行n-j次比较。下面以一个整型数组中的6个数为例演示进行第1趟比较的情况:第1次 第2次 第3次 第4次 第5次 结果! 起泡法代码:for (j=1;j<N;j+) for (i=0;(i<N-j)&&(stri+1!='0');i+) if (stri>stri+1) t=stri; stri=stri+1; stri+1=t;! 程序运行演示: 第二部分 数组、结构体、指针的应用实训目的:在课堂教学的基础之上,进一步了解构造数据类型,掌握一维数组、二维数组、字符数组、结构体、指针的应用及程序设计技巧。数组有利于我们对数据类型相同的许多数据进行分类与管理。实训准备要求:复习程序设计基础教材的相应章节,熟悉一维数组、二维数组、字符数组、结构体、指针的定义、初始化、使用等,熟悉上机编译环境。实训环境要求一人一机。实训步骤和内容:基础练习(尽量采用模块化编程,即自定义函数):1. 输入两个字符串,比较这两个字符串是否相同并输出比较结果。要求不用任何字符串处理函数。编程指导及提示:! 应分别用循环求出两个字符数组的长度! 若两个字符数组的长度相等,则需用循环比较下标相同的每一对字符是否相等,若不相等则退出,若比较到最后则根据循环变量与数组长度是否相等判定两个字符数组是否相同! 若两个字符数组的长度不相等则直接输出不相同的比较结果! 程序运行演示:2. 设有4x4的方阵,其中的元素由键盘输入。分别求出主对角线上元素之和、辅对角线上元素之积、方阵中最大的元素。编程指导及提示:! N*N方阵用二维数组定义、用二层循环控制输入和输出! 用二层循环控制处理方阵元素,判定主对角线上元素条件为:if(i=j),判定辅对角线上元素条件为:if(i+j=N-1)、求方阵中最大的元素判定条件为:if(aij>max)(i,j分别表示二维数组的行列下标)! 程序运行演示:3. 打印以下的杨辉三角形(10行)11 11 2 11 3 3 11 4 6 4 11 5 10 10 5 1编程指导及提示:! N*N方阵用二维数组定义,注意杨辉三角形为下三角! 对杨辉三角形赋值可分为两部分,第一部分为第一列和主对角线都为1,第二部分为其他元素都满足公式:aij=ai-1j-1+ai-1j! 程序运行演示:4. 由键盘任意输入一个字符串和一个字符,要求从该字符串中删除所指定的字符。编程指导及提示:! 用循环依次判定字符数组s中的每个字符与x是否相等,若不相等则赋给另一个数组存放,若相等则不赋给另一个数组存放,处理完后另一个数组即为删除了 x字符的数组。也可练习直接在一个数组中处理。! 程序运行演示:5. 已知数组int num120,num220中分别存放了两个20位整数的各个位的值,编写一个程序,求将这两个整数相加的结果。编程指导及提示:! 定义三个数组int num120,num220,num321; num321用于存放结果,因考虑进位故长度多1。! 循环控制输入num120,num220的每一位数,注意都为一位! 循环控制相加,考虑进位是本题的关键! 程序运行演示:6. 将一个3*3的矩阵转置。用函数和指针实现。编程指导及提示:! N*N方阵用二维数组定义、用二层循环控制输入和输出! 用指针作函数参数,通过指针控制二维数组的元素处理for(i=0;i<3;i+) for(j=i;j<3;j+) t=*(pointer+3*i+j); *(pointer+3*i+j)=*(pointer+3*j+i); *(pointer+3*j+i)=t; ! 程序运行演示:提升练习:1. 有一单位,职工信息包括姓名(name)、年龄(age)、工龄(worktime)、性别(sex)和婚姻状况(marrige)、级别(grade:15级)、工资(wage)、是否在职(tired)等信息。现在要进行工资的调整,规定退休职工增加工资50元,在职的职工15级的工资分别增加20、40、60、80、100元,编程实现上述的调整。编程指导及提示:! 定义一个表示职工信息的结构体,结构体包含职工的所有信息。多个职工信息则用结构体数组存放。用循环处理数组中的每个职工信息,用选择语句(if或switch)修改职工工资变动情况。! 程序运行演示:2. 有一个学生成绩管理,学生信息包括姓名、语文、数学、英语、总分。现要求从键盘输入姓名、语文、数学、英语信息,程序自动计算总分,并将每个学生的成绩信息进行显示。编程实现。! 定义一个结构体,包含有姓名、语文、数学、英语成员。用一个函数处理每个成员输入的问题,用一个函数处理总分问题,一个函数处理打印问题。! 程序运行演示第三部分 综合题实训目的:在前面四部分练习的基础之上,进一步熟悉结构化程序设计、面向对象程序设计的方法与技巧,能具备利用C编写一些实用程序的能力。实训准备要求:熟悉结构化程序设计、面向对象程序设计的思想与方法,熟悉C语法规则,熟悉上机编译环境。实训环境要求一人一机。实训步骤和内容:1. 编写一系统,计算常见图形(圆、三角形、正方形和矩形)的面积。要求:l 实用性强(不懂计算机编程的人也能够使用)。l 用户根据自己需要选择某类图形、输入相应的数据后,能够正确的计算该图形的面积。l 能够重复执行上面的操作。l 当用户把所有图形面积计算完后,能够正常退出。l 当用户数据输错时,能够有相应的错误提示。编程指导及提示:! 菜单函数char disp_menu() char n; printf("nnt-Computer shape area!-n "); printf("t1 :computer circle areann"); printf("t2 :computer square areann"); printf("t3 :computer rectangle areann"); printf("t4 :computer triangle areann"); printf("t0 : qiut the systemnn"); printf("tInput select 14 computer shape area (0:quit system):"); scanf(“%d”,&n); return n; ! 根据菜单函数选项做出相应的操作menu= disp_menu(); if(menu>='0' &&menu<='4') switch(menu) case '1':circle_area();break; case '2':square_area();break; case '3':rectangle_area();break; case '4':triangle_area();break; case '0':printf("Quit system"break; else clrscr(); printf("nntData erro!ntInput 04 select menu!"); ! 程序运行演示:2. 学生管理系统要求:l 定义学生结构体数据类型。在此类型中,应该包括三个成员变量(学号、姓名、成绩)。l 定义个学生数组保存学生的信息。用一个变量来记录学生人数。l 添加学生的信息。l 显示学生的信息。l 删除学生的信息。l 查找学生的信息,根据姓名。l 统计学生的信息。编程指导及提示:! 定义学生结构体数据类型。在此类型中,应该包括三个成员变量(学号、姓名、成绩),即struct stu int num; char name20; float cj; ;! 菜单函数(可自行设计,友好美观即可)char disp_menu() char m; printf("nnnt * student manager system*nn" printf("t 1:add a record!nn" printf("t 2:delete a record!nn" printf("t 3:look for a record by name!nn" printf("t 4:disp all record!nn" printf("t 5:tong ji!nn" printf("t 0:quit system!nn" printf("t * end system *nn" printf("t Input 05!:" scanf(“%d”,&m); printf(endl); return m; ! 根据菜单函数选项做出相应的操作while(m!='0') m=disp_menu(); if(m>='0'&&m<='5') switch(m) case '1': add();break; case '2': del_name();break; case '3': find(); break; case '4': disp(); break; case '5': tj(); break; else printf("ntError input 05!n"! 程序运行演示:3、提升:要求以链表的方式完成题目2,并以文件的方式将学生信息存储到磁盘上。4、自行设计彩票系统参考代码如下:#define QIXI 7#define SUANS 2#include<stdio.h>#include<time.h>#include<stdlib.h>int mmenup(void);int qixing(void);int suangse(void);int xuanhao(int);int mf(void);int sort(int p,int n);int qx7=-1,-1,-1,-1,-1,-1,-1;int ss7=-1,-1,-1,-1,-1,-1,-1;int main(void) mf(); return 0;int mf()int mn1,p;mmenup();dop= scanf("%d",&mn1);if(p=0)getchar();switch(mn1)case 1: qixing(); return 0;case 2: suangse();return 0;case 3: return 0;default: printf("erro input!n"); while(1); int mmenup() clrscr(); printf("-cai piao sui ji xi tong-n"); printf("1.qing xing cain"); printf("2.suang se qiun"); printf("3.quitn"); return 0;int qixing() int mn2,p,j; clrscr(); printf("-qing xing xuan hao-n"); printf("nni xuan hao wei:"); if(qx0!=-1) for(j=0;j<7;j+) printf("%d ",qxj); printf("n"); else printf("NULLn"); printf("1.xuan hao.n"); printf("2.return main menun"); scanf("%d",&mn2); switch(mn2) case 1:xuanhao(QIXI);break;case 2:mf();break;default:printf("erro input!n");mf(); return 0;int suangse() int mn3,p,j; clrscr(); printf("-suang se qiu xuan hao-n"); printf("suang se qiu hao ma:"); if(ss0!=-1) for(j=0;j<=6;j+)printf("%d ",ssj);printf("n"); elseprintf("NULLn"); printf("1.xuan hao.n"); printf("2.return main menun"); scanf("%d",&mn3); switch(mn3) case 1:xuanhao(SUANS);break;case 2:mf();break;default:printf("erro input!n"); mf(); return 0;int xuanhao(int i) int j,t,k,b; /*t->zhongjian bianliang,fang chan sheng de sui ji shu /b->zhuang tai bian liang, biao shi shi chan sheng fou zhong fu / j,k->xun huan kong zhi bian liang/qx->fang qixing cai hao ma,ss->fang suang se qiu hao ma*/ if(i=7) srand(int)time(0); for(j=0;j<7;j+) qxj=0+(int)(9.0*rand()/(RAND_MAX+1.0); qixing(); else srand(int)time(0); for( j=0;j<6;j+) b=0; t=1+(int)(33.0*rand()/(RAND_MAX+1.0); for(k=0;k<=j;k+) if( t=ssk) b=1; break; if(b=0) ssj=t; else j-; srand(int)time(0); ss6=1+(int)(16.0*rand()/(RAND_MAX+1.0); j=sizeof(ss)/sizeof(int)-1; /*dei dao shu zu chang du */ sort(ss,j); suangse(); return 0; int sort(int p,int n) int i,j,temp; for(i=0;i<n;i+) for(j=i;j<n;j+) if( pi>pj) temp=pi; pi=pj; pj=temp; return 0; 附件:计算机等级考试二级C语言笔试试题一、选择题(1)下列选项中不属于软件生命周期开发阶段任务的是 A)详细设计 B)概要设计 C)软件维护 D)软件测试(2)树是结点的集合,它的根结点数目是A)有且只有1 B)1或多于1 C)0或1 D)至少2(3)在面向对象方法中,实现信息隐蔽是依靠A)对象的继承 B)对象的多态 C)对象的封装 D)对象的分类(4)程序设计语言的基本成分是数据成分、运算成分、控制成分和 A)语句成分 B)变量成分 C)对象成分 D)传输成分(5)冒泡排序在最坏情况下的比较次数是 A)n/2 B)nlog2n C)n(n-1)/2 D)n(n+1)/2(6)下列叙述中,不属于软件需求规格说明书的作用的是A)作为确认测试和验收的依据B)反映出用户问题的结构,可以作为软件开发工作的基础和依据 C)便于用户、开发人员进行理解和交流D)便于开发人员进行需求分析 (7)下列叙述中错误的是 A)一个C语言程序只能实现一种算法 B)C程序可以由多个程序文件组成 C)C程序可以由一个或多个函数组成 D)一个函数可单独作为一个C程序文件存在(8)下列不属于软件工程的3个要素的是A)方法 B)过程 C)工具 D)环境 (9)下列叙述中正确的是A)数据库系统是一个独立的系统,不需要操作系统的支持B)数据库技术的根本目标是要解决数据的共享问题C)数据库管理系统就是数据库系统D)以上三种说法都不对(10)下列叙述中正确的是 A)每个C程序文件中都必须有一个main()函数 B)在C程序的函数中不能定义另一个函数 C)C程序可以由一个或多个函数组成 D)在C程序中main()函数的位置是固定的(11)将E-R图转换到关系模式时,实体与联系都可以表示成 A)属性 B)关系 C)键 D)域 (12)下列定义变量的语句中错误的是 A)double int_; B)int _int; C)char For D)float USS(13)下列叙述中正确的是 A)C语言编译时不检查语法 B)C语言的子程序有过程和函数两种 C)C语言的函数可以嵌套定义 D)C语言的函数可以嵌套调用(14)以下选项中,合法的一组C语言数值常量是A) 0x8A B)12 C).177 D) 028(15)以下叙述中正确的是 A)构成C程序的基本单位是函数 B)可以在一个函数中定义另一个函数 C)main()函数必须放在其他函数之前 D)所有被调用的函数一定要在调用之前进行定义 (16)若在定义语句:int a,b,c,*p=&c;之后,接着执行以下选项中的语句,则能正确执行的语句是A)scanf("%d",&p); B)scanf("%d%d%d",a,b,c);C)scanf("%d",p); D) scanf("%d",a,b,c);(17) 有以下程序 main() int x,y,z; x=y=1; z=x+,y+,+y; printf("%d,%d,%dn",x,y,z); 程序运行后的输出结果是 A)2,2,3 B)2,2,2 C)2,3,1 D)2,1,1(18) 若已定义:int a=25,b=14,c=19;以下三目运算符(?:)所构成语句的执行后a<=25&&b-<=2&&c?printf("*a=%d,b=%d,c=%dn",a,b,c):printf("#a=%d,b=%d,c=%dn",a,b,c);程序输出的结果是 A)*a=25,b=13,c=19 B)*a=26,b=14,c=19 C)# a=25,b=13,c=19 D)# a=26,b=14,c=19 (19)下列程序段的输出结果是 int a=1234; float b=123.456; double c=12345.54321; printf("-,%2.1f,%2.1f",a,b,c); A)无输出 B)12,123.5,12345.5 C)1234,123.5,12345.5 D)1234,123.4,1234.5 (20)有以下程序 main() int a=0,b=0; a=10; /*给a赋值 b=20; 给b赋值 */ printf("a+b=%dn",a+b); /* 输出计算结果 */ 程序运行后输出结果是 A)30 B)a+b=30 C)a+b=0 D)出错(21)若运行以下程序时,从键盘输入 ADescriptor(表示回车),则下面程序的运行结果是 #include main() char c; int v0=1,v1=0,v2=0; do switch(c=getchar() case a:case A: case e:case E: case i:case I: case o:case O: case u:case U:v1+=1; default:v0+=1;v2+=1; while(c!=n); printf("v0=%d,v1=%d,v2=%dn",v0,v1,v2); A)v0=11,v1=4,v2=11 B)v0=8,v1=4,v2=8 C)v0=7,v1=4,v2=7 D)v0=13,v1=4,v2=12 (22) 有以下程序#includemain()int y=9;for( y>0;y-)if(y%3= =0) printf("%d",-y);程序的运行结果是A)732 B)433 C)852 D)874(23) 设有以下程序段 int x=0,s=0; while(!x!=0)s+=+x; printf("%d",s); 则 A)运行程序段后输出0 B)运行程序段后输出1 C)程序段中的控制表达式是非法的 D)程序段执行无限次 (24)有以下程序 fun(int x,int y)return(x+y); main() int a=1,b=2,c=3,sum; sum=fun(a+,b+b,a+b),C); printf("%dn",sum); 执行后的输出结果是 A)5 B)7 C)8 D)3(25)执行下面的程序段后,变量k中的值为 int k=3, s2; s0=k; k=s1*10; A)不定值 B)35 C)31 D)20 (26)以下叙述中错误的是A)改变函数形参的值,不会改变对应实参的值B)函数可以返回地址值C)可以给指针变量赋一个整数作为地址值D)当在程序的开头包含文件stdio.h时,可以给指针变量赋NULL(27)以下程序段的描述,正确的是 x=-1; do x=x*x; while(!x); A)是死循环 B)循环执行两次 C)循环执行一次 D)有语法错误 (28)有以下程序 fun(int x,int y) static int m=0,i=2; i+=m+1;m=i+x+y; return m; main() int j=1,m=I,k; k=fun(j,m); printf("%d",k); k=fun(j,m); p