




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一、 程序设计训练目的和教学要求 “C程序设计训练”是在学习“C语言程序设计”课程之后进行的一个实践教学环节,程序设计训练的目的是: 1进一步培养学生结构化程序设计的思想,加深对高级语言基本语言要素和控制结构的理解; 2针对C语言中的重点和难点内容进行训练,独立完成有一定工作量的程序设计任务,同时强调好的程序设计风格。 3掌握C语言的编程技巧和上机调试程序的方法。 4掌握程序设计的常用算法及模块化程序设计方法。 5. 掌握项目与工程设计的基本方法。 本程序设计训练是利用C语言理论和实验课中学到的编程知识和编程技巧,通过布置具有一定难度、一定编程量的程序设计训练题目,使学生通过程序设计训练掌握高级编程语言的知识和编程技术,掌握程序设计的思想和方法,具备利用计算机求解实际问题的能力。 二、程序设计训练的基本要求 设计步骤的规范不但可以培养学生科学的工作方法和作风,而且还能有效地减少错误,提高工作效率。因此必须严格执行良好的实验步骤规范(包括上级操作规范)。本程序设计训练的基本步骤与要求是: 1问题分析及解决方案框架确定 l 充分地分析和理解问题本身,弄清要求做什么(What to do?)。 l 在确定解决方案框架过程中(How to do?),考虑怎样使程序结构清晰、合理、简单和易于调试,并确定每个函数的简单功能,以及函数之间的调用关系。 2详细设计和编码 确定算法的主要流程,再此基础上进行代码设计(Coding),每个明确的功能模块程序一般不超过60行,否则要进一步划分。 3上机前编写程序与检查 上机前程序检查可有效提高调试效率,减少上机调试程序时的无谓错误。 程序检查主要有两种途径:用一组测试数据手工执行程序;通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑,把程序中的明显错误事先排除。 4上机调试程序 5完成程序设计训练报告 问题描述:题目要解决的问题是什么。 设计 l 设计算法:主要算法思想,用流程图表示。 l 实现注释:各项功能的实现程度。 l 调试报告:调试过程中遇到的主要问题,是如何解决的;对设计和编码的回顾讨论和分析;改进设想;经验和体会等。 如果题目规定了测试数据,则结果要包含这些测试数据和运行输出,当然还可以含其他测试数据和运行输出。 三、程序设计训练的内容 见程序设计训练题目(共8题)。要求都能编写程序和运行,但验收时,15题中任抽一道题,68题中任抽一道题,并提交所抽中的两题的实验报告。 四、程序设计训练安排1、课堂教学(1周,8学时)。 用于讲授程序设计的方式方法,包括原问题的分析、算法设计、程序编写以及调试等,内容从基本程序设计到项目的实现,以及程序设计文档的编制方法。 a) 程序设计的基本方法 b) 程序代码的规范(最佳实践法) c) 工程方法论 d) 项目实践 2、训练辅导(2周,20学时)(8月24号下学期开学 现场辅导:以2个自然班为教学班,每天2课时现场辅导,每教学班一名教师配一名助教。 3、测试(1周,4学时) 学生从3类(见训练内容)题中,各选择一道,提前写好设计训练报告,现场编写(断网、断U盘)程序,独立完成,根据完成情况予以评分。 五、考核方式与评分办法 通过程序实现、总结报告和学习态度综合考评,并结合学生的动手能力,独立分析解决问题的能力和创新精神。成绩分优、良、中、及格和不及格五等。 考核标准包括: 1程序设计的正确性,程序结构是否合理、编程风格(50%)。2学生的工作态度、动手能力、创新精神及出勤率(30%)。 3总结报告(20%)。 六、程序设计报告的封面 程序设计基础课程实训 题 目: 院 系: 专业班级: 姓 名: 学 号: 指导老师: 七、训练报告的格式 一、 目的和要求 二、 设计内容 三、 运行环境 四、 设计步骤 五、 流程图 六、 源代码 七、 运行结果 八、 总结 部分训练题目算法分析八、1、 日历问题问题描述 在我们现在使用的日历中, 闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。例如:1700, 1800, 1900 和 2100 不是闰年,而 1600, 2000 和 2400是闰年。 给定从公元2000年1月1日开始逝去的天数,你的任务是给出这一天是哪年哪月哪日星期几。 输入数据 输入包含若干行,每行包含一个正整数,表示从2000年1月1日开始逝去的天数。输入最后一行是1, 不必处理。可以假设结果的年份不会超过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-2000; 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 但要考虑闰年问题 生理周期 2、问题描述 人生来就有三个生理周期,分别为体力、感情和智力周期,它们的周期长度为23 天、28 天和33 天。每一个周期中有一天是高峰。在高峰这天,人会在相应的方面表现出色。例如,智力周期的高峰,人会思维敏捷,精力容易高度集中。因为三个周期的周长不同,所以通常三个周期的高峰不会落在同一天。对于每个人,我们想知道何时三个高峰落在同一天。 对于每个周期,我们会给出从当前年份的第一天开始,到出现高峰的天数(不一定是第一次高峰出现的时间)。你的任务是给定一个从当年第一天开始数的天数,输出从给定时间开始(不包括给定时间)下一次三个高峰落在同一天的时间(距给定时间的天数)。例如:给定时间为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 于是可以用三种方法解决问题。 方法一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*m2 t=M/mi, i=0,1,2 x由下面函数求出 (4) 设置全局变量x,y int x,y; void ext_gcd(int a,int b) int t; if(b=0) x=1; y=0; else ext_gcd(b,a%b); 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) if(j-a2)%m2=0) 方法 三slzq2.c M=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-) 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 key ) 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(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查下表得到对应的校验码 Y 0 1 2 3 4 5 6 7 8 9 10 1 0 X 9 8 7 6 5 4 3 2 校验码 例如:某身份证前17位为11010519491231002 i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 8 4 2 1 6 3 7 9 10 5 8 4 2 wi 7 9 10 5 0 5 1 9 4 9 1 2 3 1 0 0 2 1 1 0 1 0 0 4 9 0 5 7 0 20 2 9 24 27 7 18 30 5 积 得到和为:167;则模为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能按班级统计学生的成绩,求学生的总分及平均分,并能根据学生的平均成绩进行排序。 (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:a3();ch=Y;break; /统计 case 4:a4();ch=Y;break; /查询 case 5:a5();ch=Y;break; /打印成绩单 default:ch=N;break; 利用循环重复1、 2、两步(3) 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;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); printf(统计学生成绩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; /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将每个学生的信息写入到stu2.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,&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(%6ld %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 ,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; /消费地点 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;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); do printf(输入学(工)号 学院 姓名 消费地点 日期 时间 金额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 %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(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(输入要修改人员的学院 姓名 消费地点 日期 时间 金额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) 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
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智能配送调度算法-洞察及研究
- 锦纶纳米复合功能化-洞察及研究
- 包皮包茎疫苗研发与免疫治疗应用-洞察及研究
- 手持刀具使用安全培训课件
- 量子网络协议互操作性-洞察及研究
- 体育赛事直播版权管理-洞察及研究
- 执法主体管理制度
- 第四章 基本平面图形 单元试卷(含答案)2025-2026学年北师大版七年级数学上册
- 2025-2026学年统编版语文八年级上册第二单元检测卷(含答案)
- 手影变形记课件
- 董关鹏-沈阳课件
- 大学生活从“心”开始
- 企业消防安全基础知识培训讲义课件
- 淄博市2020年度专业技术人员继续教育公需课考试题及答案
- 大运河前世今生课件
- 商务英语翻译实务完整版教学ppt课件全套教程
- 第五章__大数定律与中心极限定理
- 现代控制理论教案Word版
- 基本建设项目管理办法
- 加弹机操作规程
- 国家开放大学《电气传动与调速系统》章节测试参考答案
评论
0/150
提交评论