版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、一、 程序设计训练目的和教学要求“C程序设计训练”是在学习“C语言程序设计”课程之后进行的一个实践教学环节,程序设计训练的目的是:1进一步培养学生结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解;2针对C语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。3掌握C语言的编程技巧和上机调试程序的方法。4掌握程序设计的常用算法及模块化程序设计方法。5. 掌握项目与工程设计的基本方法。本程序设计训练是利用C语言理论和实验课中学到的编程知识和编程技巧,通过布置具有一定难度、一定编程量的程序设计训练题目,使学生通过程序设计训练掌握高级编程语言的知
2、识和编程技术,掌握程序设计的思想和方法,具备利用计算机求解实际问题的能力。二、程序设计训练的基本要求 设计步骤的规范不但可以培养学生科学的工作方法和作风,而且还能有效地减少错误,提高工作效率。因此必须严格执行良好的实验步骤规范(包括上级操作规范)。本程序设计训练的基本步骤与要求是: 1问题分析及解决方案框架确定l 充分地分析和理解问题本身,弄清要求做什么(What to do?)。l 在确定解决方案框架过程中(How to do?),考虑怎样使程序结构清晰、合理、简单和易于调试,并确定每个函数的简单功能,以及函数之间的调用关系。 2详细设计和编码 确定算法的主要流程,再此基础上进行代码设计(C
3、oding),每个明确的功能模块程序一般不超过60行,否则要进一步划分。 3上机前编写程序与检查 上机前程序检查可有效提高调试效率,减少上机调试程序时的无谓错误。 程序检查主要有两种途径:用一组测试数据手工执行程序;通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑,把程序中的明显错误事先排除。 4上机调试程序 5完成程序设计训练报告 问题描述:题目要解决的问题是什么。 设计l 设计算法:主要算法思想,用流程图表示。l 实现注释:各项功能的实现程度。l 调试报告:调试过程中遇到的主要问题,是如何解决的;对设计和编码的回顾讨论和分析;改进设想;经验和体会等。 如果题目规定了测试数据,则结果要
4、包含这些测试数据和运行输出,当然还可以含其他测试数据和运行输出。三、程序设计训练的内容 见程序设计训练题目(共8题)。要求都能编写程序和运行,但验收时,15题中任抽一道题,68题中任抽一道题,并提交所抽中的两题的实验报告。四、程序设计训练安排1、课堂教学(1周,8学时)。用于讲授程序设计的方式方法,包括原问题的分析、算法设计、程序编写以及调试等,内容从基本程序设计到项目的实现,以及程序设计文档的编制方法。a) 程序设计的基本方法b) 程序代码的规范(最佳实践法)c) 工程方法论d) 项目实践2、训练辅导(2周,20学时)(8月24号下学期开学现场辅导:以2个自然班为教学班,每天2课时现场辅导,
5、每教学班一名教师配一名助教。3、测试(1周,4学时)学生从3类(见训练内容)题中,各选择一道,提前写好设计训练报告,现场编写(断网、断U盘)程序,独立完成,根据完成情况予以评分。五、考核方式与评分办法通过程序实现、总结报告和学习态度综合考评,并结合学生的动手能力,独立分析解决问题的能力和创新精神。成绩分优、良、中、及格和不及格五等。 考核标准包括: 1程序设计的正确性,程序结构是否合理、编程风格(50%)。 2学生的工作态度、动手能力、创新精神及出勤率(30%)。 3总结报告(20%)。六、程序设计报告的封面程序设计基础课程实训题 目: 院 系: 专业班级: 姓 名: 学 号: 指导老师: 七
6、、训练报告的格式一、 目的和要求二、 设计内容三、 运行环境四、 设计步骤五、 流程图六、 源代码七、 运行结果八、 总结八、部分训练题目算法分析 1、日历问题 问题描述在我们现在使用的日历中, 闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而 1600, 2000 和 2400是闰年。 给定从公元2000年1月1日开始逝去的天数,你的任务是给出这一天是哪年哪月哪日星期几。输入数据输入包含若干行,每行包含一个正整数,表示从2000年1月1日开始逝去的天数。输入最后一行是1, 不必处理。
7、可以假设结果的年份不会超过9999。输出要求对每个测试样例,输出一行,该行包含对应的日期和星期几。格式为“YYYY-MM-DD DayOfWeek”, 其中 “DayOfWeek” 必须是下面中的一个: Sunday, Monday, Tuesday, Wednesday, Thursday, Friday and Saturday“。(1) 确定某年的第一天是星期几?int day(int year)/求某年的第一天是星期几long a,b;if(year=2000)a=2000-year;b=6-(a+a/4-a/100+a/400)%7; return b;else a=year-200
8、0; b=(a+1+(a-1)/4-(a-1)/100+(a-1)/400)%7+6; return b%7; (2) 求出2000年1月1日是星期几Y=day(2000)(3) 求从2000年1月1日开始逝去的天数days除以7的余数Z=days%7(4) 求days是星期几x=(y+z)%7(5) 利用字符数组输出下标x所对应的星期英文名(6) 求days的年月日Year=2000 month=1 day=1利用循环while(days)days-;day+如果day达到某月的最后一天,day=1,month+如果month=12,day=31,则year+,month=1,day=1但要
9、考虑闰年问题 2、生理周期问题描述人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23 天、28 天和33 天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间)下一次三个高峰落在同一天的时间(距给定时间的天数)。例如:给定时
10、间为10,下次出现三个高峰同天的时间是12,则输出2(注意这里不是3)。输入数据输入四个整数:p, e, i 和d。 p, e, i 分别表示体力、情感和智力高峰出现的时间(时间从当年的第一天开始计算)。d 是给定的时间,可能小于p, e, 或 i。 所有给定时间是非负的并且小于365, 所求的时间小于等于21252。输出要求从给定时间起,下一次三个高峰同天的时间(距离给定时间的天数)。解题思路:假设从当年的第一天开始数,第x天三个高峰值同时出现,符合要求的x必须在d+1,21252之间,并且同时满足三个条件(1)(x-p)%23=0(2)(x-e)%28=0 (3)(x-i)%33=0于是可
11、以用三种方法解决问题。方法一slzq.c:(1) 设置数组m表示三个周期的长度int m3=23,28,33(2) 设置数组a表示体力、情感和智力高峰出现的时间从键盘输入a(3) 计算出三者高峰同时出现的时间ans=0; for(j=0;j3;j+) int t=M/mj; ext_gcd(t,mj); ans=(ans+t*x*aj)%M;其中:M=m0*m1*m2t=M/mi, i=0,1,2x由下面函数求出(4) 设置全局变量x,yint x,y;void ext_gcd(int a,int b) int t; if(b=0) x=1; y=0; else ext_gcd(b,a%b);
12、 t=x; x=y; y=t-a/b*y; (5) 调用ext_gcd(t,mi),求出x(6) ansd执行下面循环while(ans=d) ans+=M; (7) ans-d为所求的结果(d为给定的时间,从键盘输入)方法二slzq1.c:a0,a1,a2分别代表p,e,i,表示体力、情感、智力出现最大值的时间m0,m1,m2分别表示三个的周长M=1; for(j=0;j3;j+) M*=mj; for(j=d+1;j=M;j+) if(j-a0)%m0=0)break; for(;j=M;j=j+m0) if(j-a1)%m1=0) break; for(;j=M;j=j+m0*m1) i
13、f(j-a2)%m2=0)方法 三slzq2.cM=m0*m1*m2; for(j=d+1;j=M;j+)x=(j-a0)%m0=0; y=(j-a1)%m1=0; z=(j-a2)%m2=0; if(x&y&z)printf(“%dn”,j-d);3、约瑟夫问题问题描述约瑟夫问题:有只猴子,按顺时针方向围成一圈选大王(编号从到),从第号开始报数,一直数到,数到的猴子退出圈外,剩下的猴子再从出圈的下一个开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入,后,输出最后猴王的编号。输入数据每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 m, n =2;i-)
14、s1=(s1+m-1)%i;if(s1=0) s1=i;w=as1;for(j=s1;ji;j+)aj=aj+1;ai=w;(3) 用循环链表解决问题将n个人的编号建立一个循环链表,通过报数,删除要离开的结点,当链表中剩下一个结点时,即为所求的值。(4) 用结构数组解决问题struct monkey int no; /猴子编号int next; /下一个猴子编号;struct monkey linkN;/n个猴子信息count=0; /出圈人数h=n;while(count=a&(c)=A&(c)=Z) )void Denc( const char *str, char *out, int k
15、ey ) int i=0; while( stri ) if ( isletter( stri ) ) outi = stri - key; if ( ! isletter( outi ) ) outi += 26; else outi = stri; i+; outi = 0; 5、身份证校验题目描述 我国国标GB 11643-1999中规定:公民身份号码是18位特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。其校验码(最后一位)计算方法和步骤为:(1)十七位数字本体码加权求和公式S = Sum(
16、Ai * Wi), i = 0, . , 16 ,先对前17位数字的权求和其中Ai:表示第i位置上的身份证号码数字值Wi:表示第i位置上的加权因子,前17位加权因子从左到右分别为Wi:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2(2)计算模Y = mod(S, 11)(3)通过模Y查下表得到对应的校验码Y012345678910校验码10X98765432例如:某身份证前17位为i1234567891011121314151617wi791058421637910584211010519491231002积7905020292427718305004得到和为:167;
17、则模为y=167%11=2查(3)得校验码为x请按上面所述步骤编程,输入一个二代身份证号,检查该身份证是否正确。(1) 将输入的十八位身份证保存到一个一维数组b中(2) 设定十七位权值保存到数组d中(题目中给定)(3) 利用s=b1*d1+b2*d2+b17*d17求权值和但注意字符b要转换成整型(4) n=s%11求出数组y的下标(5) 利用数组y保存校验码(6) Yn=b18身份证正确,否则身份证不正确6、学生成绩管理学生信息包括:学号、姓名、年龄、性别、出生年月。主要功能: (1)能按学期、按班级完成对学生成绩的录入、修改。(2能按班级统计学生的成绩,求学生的总分及平均分,并能根据学生的
18、平均成绩进行排序。(3)能查询学生成绩。(4)能按班级输出学生的成绩单。用键盘菜单程序的实现(1) 将各功能写成菜单形式printf(n欢迎使用学生成绩管理系统系统n);1.printf(1. 录入 n);2.printf(2. 修改 n);3.printf(3. 统计 n);4.printf(4. 查询 n);5.printf(5. 打印 n);6.printf(6. 退出 n);(2)利用switch执行相应的自定义函数scanf(%d,&op);switch(op) case 1:a1();ch=Y;break; /录入case 2:a2();ch=Y;break; /修改 case 3
19、:a3();ch=Y;break; /统计 case 4:a4();ch=Y;break; /查询case 5:a5();ch=Y;break; /打印成绩单 default:ch=N;break;(3)利用循环重复1、 2、两步main() int op;char ch;do system(cls);printf(n欢迎使用学生成绩管理系统系统n);printf(1. 录入 n);printf(2. 修改 n);printf(3. 统计 n);printf(4. 查询 n);printf(5. 打印 n);printf(6. 退出 n);scanf(%d,&op);switch(op) ca
20、se 1:a1();ch=Y;break; case 2:a2();ch=Y;break; case 3:a3();ch=Y;break; case 4:a4();ch=Y;break; case 5:a5();ch=Y;break; default:ch=N;break;while(ch=Y);(4)各自定义函数单独完成/录入学生成绩void a1() system(cls);printf(录入学生成绩n);getch();/修改学生成绩void a2() system(cls);printf(修改学生成绩n);getch();/统计学生成绩void a3()system(cls); pri
21、ntf(统计学生成绩n);getch();/查询学生成绩void a4() system(cls);printf(查询学生成绩n);getch();/打印成绩单void a5() system(cls);printf(打印成绩单n);getch();(5)确定所使用的存储结构可以使用数组,也可以使用链表(6)假设采用数组作存储结构#define N 100 /一个班的人数struct student long xq; /学期 char bj20; /班级 char xh20; /学号 char xm20; /姓名 char xb8; /性别 long csny; /出生年月 float cj6
22、; /6门成绩 float total; /总分 float aver; /平均分;struct student xN; /N个学生long xueqi; /学期char banji20; /班级int n; /一个班的实际人数 7、学生成绩管理文件结构(1)先用记事本编辑文件stu1.dat存储一个班学习成绩。然后在C环境下,建立一个学生信息的结构体,用r方式打开上述文件,再用fscanf读入、用printf在屏幕上显示文件内容。(2)利用循环使每个学生的三门功课的成绩相加,然后再把和除以三就得到了平均成绩。接着用冒泡法利用平均分的高低排出名次。最后用fprintf将每个学生的信息写入到st
23、u2.dat文件。(1)定义结构表示学生信息struct student long xq; /学期 char bj20; /班级 char xh20; /学号 char xm20; /姓名 char xb8; /性别 long csny; /出生年月 float cj3; /3门成绩 float total; /总分 float aver; /平均分;struct student xN;(2)用记事本建立文件stu1.dat包含一个班学生成绩(3)打开文件并读出数据,计算总分和平均分fp=fopen(f:stu1.dat,r);while(1)fscanf(fp,%ld%s%s%s%s%ld,
24、&xn.xq,xn.bj,xn.xh,xn.xm,xn.xb,&xn.csny);s=0;for(j=0;j3;j+)fscanf(fp,%f,&xn.cjj);s=s+xn.cjj;xn.total=s;xn.aver=s/3.0;if(feof(fp) break;n+;fclose(fp);(4)用冒泡法按平均分从高到低排序 for(i=0;i=i+1;j-)if(xj.averxj-1.aver)t=xj;xj=xj-1;xj-1=t;(5)输出成绩等信息printf(学 期 班级 学号 姓名 性别 出生年月 三门成绩 总成绩 平均分n);for(i=0;in;i+)printf(%6
25、ld %8s%12s%8s %s %8ld ,xi.xq,xi.bj,xi.xh,xi.xm,xi.xb,xi.csny); for(j=0;j3;j+) printf(%3.0f ,xi.cjj); printf(%6.1f %6.1fnn,xi.total,xi.aver);(6)将成绩等信息写入文件stu2.dat中fq=fopen(f:stu2.dat,w);for(i=0;in;i+) fprintf(fq,%ld %s %s %s %s %ld ,xi.xq,xi.bj,xi.xh,xi.xm,xi.xb,xi.csny); for(j=0;j3;j+) fprintf(fq,%f
26、 ,xi.cjj); fprintf(fq,%f %fn,xi.total,xi.aver);fclose(fq);8、校园卡消费记录学生信息包括:学号或工号、学院、姓名、消费地点、日期、时间、金额。主要功能: (1)能按消费地点完成对消费的录入、修改。(2能按学号或工号统计消费,求消费者的本月的总消费及日均消费余额,并能根据学生的月消费进行排序。(3)能查询消费记录清单。(4)能按工号或学号排序以后输出消费清单。(1)确定所需的结构类型struct student char no20; /学号或工号 char xy30; /学院 char xm20; /姓名 char dd30; /消费地点
27、 char rq15; /日期 char sj12; /时间 float je; /金额;(2) 建立菜单结构(类似学生成绩管理)main() int op;char ch;do system(cls);printf(n欢迎使用校园卡消费管理系统系统n);printf(1. 消费录入 n);printf(2. 消费修改 n);printf(3. 消费统计 n);printf(4. 消费查询 n);printf(5. 消费单打印 n);printf(6. 退出 n);scanf(%d,&op);switch(op) case 1:a1();ch=Y;break; case 2:a2();ch=Y
28、;break; case 3:a3();ch=Y;break; case 4:a4();ch=Y;break; case 5:a5();ch=Y;break; default:ch=N;break;while(ch=Y);(3) 消费录入从键盘输入消费记录,保存到磁盘文件中。void a1() FILE *fp;char yn;fp=fopen(f:rmb.txt,w);doprintf(输入学(工)号 学院 姓名 消费地点 日期 时间 金额n);scanf(%s%s%s%s%s%s%f,y.no,y.xy,y.xm,y.dd,y.rq,y.sj,&y.je);fprintf(fp,%s %s
29、 %s %s %s %s %fn,y.no,y.xy,y.xm,y.dd,y.rq,y.sj,y.je);printf(继续录入吗(y/n)?n);scanf(%s,&yn); while(yn=y);fclose(fp);getch();(4) 消费修改先输入要修改人员的学(工)号,然后打开文件,从文件读出数据,若是要修改人员的信息,进行修改(不是,则不要修改),然后将信息保存到另一个文件中。最后从另一个文件将数据保存到原来文件中。void a2() FILE *fp,*fq;char yn,no20;do system(cls);fp=fopen(f:rmb.txt,r);fq=fopen
30、(f:rmb1.txt,w);printf(输入要修改人员的学(工)号 n); scanf(%s,no);while(1) fscanf(fp,%s%s%s%s%s%s%f,y.no,y.xy,y.xm,y.dd,y.rq,y.sj,&y.je); if(feof(fp)break;if(strcmp(y.no,no)=0)printf(要修改人员信息如下:n);printf(学(工)号 学 院 姓 名 消费地点 日期 时间 金额n); printf(%12s %6s %6s %8s %8s %8s %fn,y.no,y.xy,y.xm,y.dd,y.rq,y.sj,y.je);printf(
31、输入要修改人员的学院 姓名 消费地点 日期 时间 金额n); scanf(%s%s%s%s%s%f,y.xy,y.xm,y.dd,y.rq,y.sj,&y.je); fprintf(fq,%s %s %s %s %s %s %fn,no,y.xy,y.xm,y.dd,y.rq,y.sj,y.je);else fprintf(fq,%s %s %s %s %s %s %fn,y.no,y.xy,y.xm,y.dd,y.rq,y.sj,y.je);fclose(fp);fclose(fq); fp=fopen(f:rmb.txt,w);fq=fopen(f:rmb1.txt,r);while(1)
32、fscanf(fq,%s%s%s%s%s%s%f,y.no,y.xy,y.xm,y.dd,y.rq,y.sj,&y.je); if(feof(fq)break; fprintf(fp,%s %s %s %s %s %s %fn,y.no,y.xy,y.xm,y.dd,y.rq,y.sj,y.je); printf(继续修改吗(y/n)?n);scanf(%s,&yn); fclose(fp);fclose(fq);while(yn=y); getch();(5) 消费统计先将所有的消费信息从文件读出到数组中(一个人可以有多次消费记录),将学(工)号相同的记录的消费金额合并到他的第一项,其它多余的项的消费金额置0,最后输出每个学(工)号的第一项(当然也可以保存到文件中)void a3() FILE *fp;int i,j; fp=fopen(f:rmb.txt,r); n=0;while(1) fscanf(fp,%s%s%s%s%s%s%f,y.no,y.xy,y.xm,y.dd,y.rq,y.sj,&y.je); if(feof(fp)break;zn=y;n+; fclose(fp); for(i=0;in-1;i+) for(j=i+1;jn;j+) if(strcmp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年重载eVTOL在高山基站物资投送中的应用
- 福建福州市仓山区第十二中学2026年初三第二学期期末联考化学试题试卷含解析
- 2026年“十五五”数字经济核心产业占比12.5%目标与AI机遇解读
- 2026年金融大模型“预训练 后训练”两阶段架构设计指南
- 2026年数据产权与传统物权知识产权异同比较分析
- 2026年临床病例引擎循证数据引擎医患交互仿真引擎技术解析
- 2026年澎湃OS自研大模型与PC端深度集成技术架构
- 高尔夫俱乐部管理经理职位职责和素质要求概述
- 社会公益活动与组织
- 酒店服务与管理专业人员的职业能力提升的面试全解析
- 医疗行业商业秘密保护典型案例评析与启示
- 中学生用电安全 课件
- 放射护理继续教育
- 地下商场火灾应急处置预案
- 瞳孔检查课件
- 疫苗冷链管理培训课件
- 游泳救生培训课件
- DB11∕T 2447-2025 村庄雨水排除与内涝防治技术规范
- 2026年浙江经贸职业技术学院单招职业适应性考试题库及参考答案详解1套
- 2026年初级银行从业资格之初级银行业法律法规与综合能力考试题库500道附答案(夺分金卷)
- 某市生态环保局大气监测站点运维方案
评论
0/150
提交评论