程序设计实训专题讲座Word格式文档下载.docx
《程序设计实训专题讲座Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《程序设计实训专题讲座Word格式文档下载.docx(9页珍藏版)》请在冰点文库上搜索。
![程序设计实训专题讲座Word格式文档下载.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/2e1122a7-5d11-4c32-94f0-5b7558869255/2e1122a7-5d11-4c32-94f0-5b75588692551.gif)
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-DDDayOfWeek”,其中“DayOfWeek”必须是下面中的一个:
"
Sunday"
"
Monday"
Tuesday"
Wednesday"
Thursday"
Friday"
and"
Saturday“。
(1)确定某年的第一天是星期几?
intday(intyear)//求某年的第一天是星期几{longa,b;
if(year<
=2000){a=2000-year;
b=6-(a+a/4-a/100+a/400)%7;
returnb;
}else{a=year-2000;
b=(a+1+(a-1)/4-(a-1)/100+(a-1)/400)%7+6;
returnb%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=2000month=1day=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表示三个周期的长度intm[3]={23,28,33}
(2)设置数组a表示体力、情感和智力高峰出现的时间从键盘输入a
(3)计算出三者高峰同时出现的时间ans=0;
for(j=0;
j<
3;
j++){intt=M/m[j];
ext_gcd(t,m[j]);
ans=(ans+t*x*a[j])%M;
}其中:
M=m[0]*m[1]*m[2]t=M/m[i],i=0,1,2x由下面函数求出(4)设置全局变量x,yintx,y;
voidext_gcd(inta,intb){intt;
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,m[i]),求出x(6)ans<
d执行下面循环while(ans<
=d){ans+=M;
}(7)ans-d为所求的结果(d为给定的时间,从键盘输入)
方法二slzq1.c:
a[0],a[1],a[2]分别代表p,e,i,表示体力、情感、智力出现最大值的时间m[0],m[1],m[2]分别表示三个的周长M=1;
j++)M*=m[j];
for(j=d+1;
=M;
j++)if((j-a[0])%m[0]==0)break;
for(;
j=j+m[0])if((j-a[1])%m[1]==0)break;
j=j+m[0]*m[1])if((j-a[2])%m[2]==0)方法三slzq2.cM=m[0]*m[1]*m[2];
j++){x=(j-a[0])%m[0]==0;
y=(j-a[1])%m[1]==0;
z=(j-a[2])%m[2]==0;
if(x&
&
y&
z)printf(“%d\n”,j-d);
3、约瑟夫问题问题描述
约瑟夫问题:
有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再从出圈的下一个开始报数。
就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
输入数据每行是用空格分开的两个整数,第一个是n,第二个是m(0<
m,n<
300)。
最后一行是:
00输出要求对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
(1)选用所用的解决问题的方法可以使用数组、循环链表、结构数组
(2)用数组解决问题建立一个一维数组a,a[1]~a[n]存放n个人的编号,对n个人按1,2,„,m的顺序报数,报数为m的人保存到a[0]中,后面的人往前移动一个位置,报数的人数减1,再重复下去,最后a[1]中的值就是所求的值。
s1=1;
for(i=n;
i>
=2;
i--){s1=(s1+m-1)%i;
if(s1==0)s1=i;
w=a[s1];
for(j=s1;
i;
j++)
a[j]=a[j+1];
a[i]=w;
(3)用循环链表解决问题将n个人的编号建立一个循环链表,通过报数,删除要离开的结点,当链表中剩下一个结点时,即为所求的值。
(4)用结构数组解决问题structmonkey{intno;
//猴子编号intnext;
//下一个猴子编号};
structmonkeylink[N];
//n个猴子信息count=0;
//出圈人数h=n;
while(count<
n-1){i=0;
while(i!
=m){h=link[h].next;
if(link[h].no)i++;
}link[h].no=0;
count++;
//离开的猴子值为0,数目加1}最后结构中值不为0的即为所求的值。
4、恺撒Caesar密码题目描述JuliusCaesar生活在充满危险和阴谋的年代。
为了生存,他首次发明了密码,用于军队的消息传递。
假设你是Caesar军团中的一名军官,需要把Caesar发送的消息破译出来、并提供给你的将军。
消息加密的办法是:
对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:
消息原文中的每个字母A都分别替换成字母F),其他字符不变,并且消息原文的所有字母都是大写的。
密码字母:
ABCDEFGHIJKLMNOPQRSTUVWXYZ原文字母:
VWXYZABCDEFGHIJKLMNOPQRSTU输入数据最多不超过100个数据集组成。
每个数据集由3部分组成:
起始行:
START密码消息:
由1到200个字符组成一行,表示Caesar发出的一条消息结束行:
END在最后一个数据集之后,是另一行:
ENDOFINPUT输出要求每个数据集对应一行,是Caesar的原始消息。
(1)输入字符串密码
(2)解密是字母,则key值减5,减5后若不是字母,加26#defineisletter(c)(((c)>
='
a'
(c)<
z'
)||((c)>
A'
Z'
))
voidDenc(constchar*str,char*out,intkey){inti=0;
while(str[i]){if(isletter(str[i])){out[i]=str[i]-key;
if(!
isletter(out[i]))out[i]+=26;
}elseout[i]=str[i];
i++;
}out[i]=0;
}5、身份证校验题目描述我国国标〖GB11643-1999〗中规定:
公民身份号码是18位特征组合码,由十七位数字本体码和一位数字校验码组成。
排列顺序从左至右依次为:
六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
其校验码(最后一位)计算方法和步骤为:
(1)十七位数字本体码加权求和公式S=Sum(Ai*Wi),i=0,...,16,先对前17位数字的权求和其中Ai:
表示第i位置上的身份证号码数字值Wi:
表示第i位置上的加权因子,前17位加权因子从左到右分别为
Wi:
7910584216379105842
(2)计算模Y=mod(S,11)(3)通过模Y查下表得到对应的校验码Y01234567891010X98765432校验码例如:
某身份证前17位为11010519491231002i123456789101112131415161784216379105842wi79105051949123100211010049057020292427718305积得到和为:
167;
则模为y=167%11=2查(3)得校验码为x请按上面所述步骤编程,输入一个二代身份证号,检查该身份证是否正确。
(1)将输入的十八位身份证保存到一个一维数组b中
(2)设定十七位权值保存到数组d中(题目中给定)(3)利用s=b[1]*d[1]+b[2]*d[2]+„+b[17]*d[17]求权值和但注意字符b要转换成整型(4)n=s%11求出数组y的下标(5)利用数组y保存校验码(6)Y[n]=b[18]身份证正确,否则身份证不正确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){case1:
a1();
ch='
Y'
;
break;
//录入case2:
a2();
//修改
case3:
a3();
//统计case4:
a4();
//查询case5:
a5();
//打印成绩单default:
N'
}利用循环重复1、2、两步(3)main(){intop;
charch;
do{system("
cls"
printf("
scanf("
case2:
case3:
case4:
case5:
default:
}}while(ch=='
(4)各自定义函数单独完成//录入学生成绩voida1(){system("
录入学生成绩\n"
„„getch();
}//修改学生成绩voida2(){system("
修改学生成绩\n"
}//统计学生成绩voida3(){system("
统计学生成绩\n"
}//查询学生成绩
voida4(){system("
查询学生成绩\n"
}//打印成绩单voida5(){system("
打印成绩单\n"
}(5)确定所使用的存储结构可以使用数组,也可以使用链表(6)假设采用数组作存储结构#defineN100//一个班的人数structstudent{longxq;
//学期charbj[20];
//班级charxh[20];
//学号charxm[20];
//姓名charxb[8];
//性别longcsny;
//出生年月floatcj[6];
//6门成绩floattotal;
//总分floataver;
//平均分
};
structstudentx[N];
//N个学生longxueqi;
//学期charbanji[20];
//班级intn;
//一个班的实际人数7、学生成绩管理文件结构
(1)先用记事本编辑文件stu1.dat存储一个班学习成绩。
然后在C环境下,建立一个学生信息的结构体,用r方式打开上述文件,再用fscanf读入、用printf在屏幕上显示文件内容。
(2)利用循环使每个学生的三门功课的成绩相加,然后再把和除以三就得到了平均成绩。
接着用冒泡法利用平均分的高低排出名次。
最后用fprintf将每个学生的信息写入到stu2.dat文件。
(1)定义结构表示学生信息structstudent{longxq;
//出生年月floatcj[3];
//3门成绩floattotal;
//平均分};
(2)用记事本建立文件stu1.dat包含一个班学生成绩(3)打开文件并读出数据,计算总分和平均分fp=fopen("
f:
\\stu1.dat"
"
r"
while
(1){fscanf(fp,"
%ld%s%s%s%s%ld"
x[n].xq,x[n].bj,x[n].xh,x[n].xm,x[n].xb,&
x[n].csny);
s=0;
j++){fscanf(fp,"
%f"
x[n].cj[j]);
s=s+x[n].cj[j];
}x[n].total=s;
x[n].aver=s/3.0;
if(feof(fp))break;
n++;
}fclose(fp);
(4)用冒泡法按平均分从高到低排序for(i=0;
i<
n-1;
i++)//排序for(j=n-1;
j>
=i+1;
j--)if(x[j].aver>
x[j-1].aver){t=x[j];
x[j]=x[j-1];
x[j-1]=t;
}(5)输出成绩等信息printf("
学期班级学号姓名性别出生年月三门成绩总成绩平均分\n"
for(i=0;
n;
i++){printf("
%6ld%8s%12s%8s%s%8ld"
x[i].xq,x[i].bj,x[i].xh,x[i].xm,x[i].xb,x[i].csny);
j++)printf("
%3.0f"
x[i].cj[j]);
%6.1f%6.1f\n\n"
x[i].total,x[i].aver);
}(6)将成绩等信息写入文件stu2.dat中fq=fopen("
\\stu2.dat"
w"
i++){fprintf(fq,"
%ld%s%s%s%s%ld"
j++)fprintf(fq,"
%f"
fprintf(fq,"
%f%f\n"
}fclose(fq);
}8、校园卡消费记录学生信息包括:
学号或工号、学院、姓名、消费地点、日期、时间、金额。
(1)能按消费地点完成对消费的录入、修改。
(2能按学号或工号统计消费,求消费者的本月的总消费及日均消费余额,并能根据学生的月消费进行排序。
(3)能查询消费记录清单。
(4)能按工号或学号排序以后输出消费清单。
(1)确定所需的结构类型structstudent{charno[20];
//学号或工号charxy[30];
//学院charxm[20];
//姓名chardd[30];
//消费地点charrq[15];
//日期charsj[12];
//时间floatje;
//金额};
(2)建立菜单结构(类似学生成绩管理)main(){intop;
\n欢迎使用校园卡消费管理系统系统\n"
1.消费录入\n"
2.消费修改\n"
prin