来源:互联网转载 | 更新日期:2023-09-11 08:35:51
课程设计名称:C语言课程设计(C Language Designing )
课程设计学分:1学分
课程设计时间:第一学年第1学期
课程设计学时(周数):28学时(1周)
课程设计年级:大一
适用专业:计算机大类专业
一、课程设计的性质与教学目标
课程性质:C语言是一种编程灵活,特色鲜明的程序设计语言。课程是理论与实践相结合的一门计算机专业基础课程。C语言在学习基本知识如概念,方法和语法规则的基础上,进行实践能力的训练,以提高学生的动手和编程能力。
课程目标:能够掌握一些较为常见的算法,并初步积累编程经验,解决一些典型实际工程问题;综合运用编程方法和问题分析方法,设计针对解决问题的算法步骤。初步培养数据采集、数据分析、数据处理及结果分析的能力。具体为:
课程目标1:具备计算机软件基本理论和简单算法设计能力;掌握C语言程序设计的基本方法,运用结构化程序设计思想分析问题。
课程目标2:初步培养学生对复杂问题的分析能力和解决问题的能力;学生能够针对实际应用问题,使用C语言完成代码的设计、实现、调试、测试和演示。
题目难度、深度、广度分析:
(1)给定8个基础课题和2个深化课题,学生必须完成8个基础题,同时任意选择1个深化课题,学生按照课题要求完成相应任务。
(2)发明、创新性课题:这类课题要求学生充分挖掘自己的创造性思维潜力。
四、课程设计内容
1、基础部分
①分屏处理数据系统:
随机产生1000个数,并分屏显示(每行显示10个数字,每页显示10行),而且在每一屏的下方显示本屏中数据的最大值、最小值和平均值。
提示:循环显示,在分屏点上输出press any key to continue…,通过getchar()函数让用户以按回车键的方式进入下一屏。
附加要求:能够前后循环翻页,且输入页码可以回显该页码数据,如果页码错误默认回到第一页。
②求积分:
小明最近在学高等数学,被数学里面的微积分难倒了。但小明编程能力很强,于是他就突发奇想,看能不能用编程的方法来帮助理解数学的学习。以下是他想求解的问题:
请编程求解 的值,并分析 的值与 的关系。(提示:如下图,按照积分的原理,将函数区间切分为非常小的长方形,其中长方形的宽度为切分的间距 ,长方形的高度为方格所在横坐标对应的函数值 ,则图中第 个小长方形(阴影部分)面积为 ,而最终函数的积分值为所有小方格的面积之和。)
③最佳分组
随机生成一组位于二维坐标系的点集(15<=点集元素个数N<=65),这些点不重合,每个点的位置由x,y值决定,x,y为整数且0<x<80,0<y<40。现在想知道这些点按距离远近该分成几个组合适,已知分组值K备选范围从1-10,输入K值,请你按以下方法画出分组结果:
1)从N个数据点中随机挑选K个不同点作为K个组的初始中心起点(组中心);
2)计算所有点到K个组中心的距离(欧式距离),并把它归到距离最近的组(如果有多个组距离一样,随便选一个归入);
3)更新K个组的中心值(求出该组所有点的x平均值和y平均值,作为新的组中心);
4)重复(2)~(3)步直至新的组中心和原来的组中心差值小于指定阈值(人为设置),或超出最大重复次数(人为设置),算法结束;
5)在控制台画出K组分组结果,每组用不同数字表示,使用0,1,2,3…9分别表示10个组。
示例如下:
④曲线2阶曲线绘制:
2阶曲线公式可描述为
请编程绘制出该曲线的图形,坐标原点,y轴正方向,x轴正方向,如下图所示
提示:可利用二维数组预先计算并存储每个点(图中用“*”表示)的坐标,然后利用循环一次性输出图形。注意坐标线的显示。
⑤任意进制转换:
编程将任意n( )进制的正整数num1转换成m( )进制的num2表示形式。
要求:实现以下形式的进制转换函数 void transX2X(char num1[],int n, int m, char num2[])
其中,字符数组num1待转换数的数字序列,n是其对应的进制数,num2用于存储转换进制后的数字序列,m是其对应的进制数。用法如下:char num2[256]; transX2X(“5”,10, 2, num2);则经过函数调用后,num2中的值为“101”
⑥排序(冒泡排序、快速排序、直接插入排序、选择排序):
选择两种排序方法,理解其算法核心思想、实现和对比。
⑦小明上学
小明是汉东省政法大学附属中学的一名学生,他每天都要骑自行车往返于家和学校。为了能尽可能充足地睡眠,他希 望能够预计自己上学所需要的时间。他上学需要经过数段道路,相邻两段道路之间设有至多一盏红绿灯。
京州市的红绿灯是这样工作的:每盏红绿灯有红、黄、绿三盏灯和一个能够显示倒计时的显示牌。假设红绿灯被设定 为红灯 r 秒,黄灯 y 秒,绿灯 g 秒,那么从 0 时刻起,[0,r) 秒内亮红灯,车辆不许通过;[r, r+g) 秒内亮绿灯, 车辆允许通过;[r+g, r+g+y) 秒内亮黄灯,车辆不许通过,然后依次循环。倒计时的显示牌上显示的数字 l(l > 0)是 指距离下一次信号灯变化的秒数。
⑧期末统计分数
某班有最多不超过60人(具体人数n由键盘输入)参加期末考试,考试科目为程序设计、英语和数学,编程实现以下功能:
2、 深化部分 (以下2题,任选1题 )
题目1:推箱子游戏设计
题目描述:简易小人推箱子游戏,游戏过程:(1)初始时,小人在窗口的左上角位置,箱子在小人的右侧;(2)在小人前方随机生成若干个阻碍物;(3)在窗口的右侧随机生成一个出口;(4)要求小人能够将箱子推到窗口右侧出口。(5)*实时给出推荐路径(6)*自动寻路推箱子。
基本要求:
题目2:小蜜蜂游戏
题目描述:80年代产生了很多经典游戏,像《魂斗罗》、《街头霸王》、《赤色要塞》、《双截龙》、《沙罗曼蛇》…其中,作为红白机射击游戏鼻祖《小蜜蜂(Galaxian)》游戏更是让人怀旧。也学了一学期C语言了,亲爱的小伙伴们,(+o+)v,让我们一起动手做一个吧。
基本要求:
扩展要求:
8) 设计可以双人玩,每人3条命,加入借命功能,挂掉后可借用别人剩余一条命;
9) 设计一些奖励元素,从屏幕上方掉下来各种奖励,比如:不同的子弹、补血、绝招(使得主角也可以次元斩飞向敌方阵地撞击敌人。。。);
10) 设计一个菜单选择单人、双人游戏,并设计剧情开头动画和结尾动画(失败and胜利)
11) 给游戏添加音乐和特效。
五、课程设计时间进程表(若有节假日,任课老师可合理调整进度)
第一天:1、布置任务,讲解设计课题的基本设计思路和基本要求。
2、讲解课程设计报告本要求、需要的提交电子资料和课程设计最总成绩评定标准。
3、提供本次课程设计关键技术的基础练习(可根据所选课题选择相应的题进行练习):
第二天:讲解设计深化部分的基本设计思路和基本要求,及其在成绩评定中的比例。
第三天:学生自主设计,老师辅导,并进行抽查。
第四天:再次讲解课程设计报告本要求,强调报告格式要求。需要的提交电子资料。
学生自主设计,老师辅导,并进行抽查。
第五天:学生自主设计,老师辅导,并进行抽查,部分同学可进行作业演示报告。
递交课程设计电子资料和设计报告。
六、设计过程和报告格式要求
(1) 设计要求
编写程序要求遵循如下基本要求:
模块化程序设计
锯齿型书写格式
必须上机调试通过
(2) 课程设计报告格式
设计目的
总体设计(程序设计流程图)
详细设计(如函数功能、入口及出口参数说明,函数调用关系描述等)
调试与测试:调试方法,测试结果的分析与讨论,测试过程到的主要问题及采取的解决措施
源程序清单和执行结果:源程序中应有足够的注释
七、考核及成绩评分
1)总评成绩评分标准:
考核方式 比例% 主要考核内容
平时表现 10% 阶段目标实现情况,学习活跃度
基础题
+提高题 60% 基础题目的完成情况80%
提高提的完成情况20%
设计报告检查 15% 设计报告的规范性及内容完整性
演示答辩 15% 课程设计报告、现场演示及讲解、问题回答情况。
附本人做的代码如下:
1.
暂时未完成
4.
6.1.
#include<stdio.h> int main() {int i, j, n, a[10];printf("输入10个数,以空格间隔");for (j = 0; j < 10; j++){scanf_s("%d", &a[j]);}for (i = 0; i < 9; i++){for (j = i + 1; j < 10; j++){if (a[i] > a[j]){n = a[i];a[i] = a[j];a[j] = n;}}}for (j = 0; j < 10; j++){printf("%d ", a[j]);}return 0; }6.2.
#include<stdio.h> int main() {int i, j, n, a[10];printf("请输入十个数,以空格间隔:");for (j = 0; j < 10; j++){scanf_s("%d", &a[j]);}printf("\n");for (i = 0; i < 10; i++){for (j = 0; j < 10 - i - 1; j++){if (a[i] > a[j + 1]){n = a[j];a[j] = a[j + 1];a[j + 1] = n;}}}for (j = 0; j < 10; j++){printf("%d ", a[j]);}return 0; } #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #include<time.h> int main() {int r[100] = { 0 }, y[100] = { 0 }, g[100] = { 0 }, n, i, ti = 0, k[100] = { 0 }, t[100] = { 0 };int a0, a1, a2, a3, a4, a5, a6;srand(time(NULL));n = rand() % 101;for (i = 0; i < 100; i++){a0 = rand()%106;r[i] = a0;a1 = rand()%106;y[i] = a1;a2 = rand()%106;g[i] = a2;a3 = rand() % 4;k[i] = a3;}//随机给灯和K赋值for (i = 0; i < n; i++){if (k[i] == 0)//过街{do{a4 = rand() % 106;t[i] = a4;} while (t[i] <= 0);//保证t[i]不为0ti = ti + t[i];}else if (k[i] == 1)//红灯{do{a4 = rand() % r[i];//时间少于当前红灯时间t[i] = a4;}while (t[i] <= 0);ti = ti + t[i];}else if (k[i] == 2)//黄灯{do{a4 = rand() % y[i];//时间少于当前黄灯时间t[i] = a4;} while (t[i] <= 0);ti = ti + t[i] + r[i];}else if (k[i] == 3)//绿灯,不计数{do{a4 = rand() % y[i];t[i] = a4;} while (t[i] <= 0);}printf("k=%d r=%d y=%d g=%d t=%d \n",k[i], r[i], y[i], g[i], t[i]);}printf("%d %d", n, ti);return 0; } #include<stdio.h> #include<math.h> #include<string.h> int n; double zd(double a[61])//求最大 {int i;double max=0;for (i = 0; i < n; i++){if (max < a[i]){max = a[i];}}return max; }//求最大值 double zx(double a[61]) {int i;double min = 100;for (i = 0; i < n; i++){if (a[i] < min){min = a[i];}}return min; }//求最小值 double pj(double a[61]) {int i;double b=0;for (i = 0; i < n; i++){b = b + a[i];}b = b / n;return b; }//求平均值 double jgl(double a[61]) {int i;double s, j = 0;for (i = 0; i < n; i++){if (a[i] >= 60){j++;}}s = j / n*100;return s; }//求及格率 int main() {double cx[61] = { 0 }, yy[61] = { 0 },sx[61] = { 0 };double ave[61] = { 0 }, cxa = 0, yya = 0, sxa = 0;int i,j;int rand[61] = { 0 };double q1, q2, q3;printf("请输入期末考试人数:");scanf_s("%d", &n);printf("请输入各科权重:");scanf_s("%lf %lf %lf", &q1, &q2, &q3);if ((q1 + q2 + q3) != 1){printf("请检查权重!");return 0;}printf("请依次输入C语言、英语、数学成绩\n");for (i = 0; i < n; i++)//循环输入{scanf_s("%lf %lf %lf", &cx[i], &yy[i], &sx[i]);}for (i = 0; i < n; i++)//求个人总分、平均{ave[i] = (cx[i]*q1 + yy[i]*q2 + sx[i]*q3);cxa = cxa + cx[i];yya = yya + yy[i];sxa = sxa + sx[i];}cxa = cxa / n;yya = yya / n;sxa = sxa / n;for (i = 0; i < n; i++){printf("第%d名学生的C语言成绩是:%.2f 英语成绩是:%.2f 数学成绩是:%.2f ", i + 1, cx[i], yy[i], sx[i]);printf("其个人加权平均分为:%.2f\n", ave[i]);}printf("C语言的平均分为:%.2f 最高分:%.2f 最低分:%.2f 及格率:%.2f%%\n", pj(cx), zd(cx), zx(cx), jgl(cx));printf("英语的平均分为:%.2f 最高分:%.2f 最低分:%.2f 及格率:%.2f%%\n", pj(yy), zd(yy), zx(yy), jgl(yy));printf("数学的平均分为:%.2f 最高分:%.2f 最低分:%.2f 及格率:%.2f%%\n", pj(sx), zd(sx), zx(sx), jgl(sx));for (i = 0; i < n; i++){rand[i] = n;for (j = 0; j < n; j++){if (ave[i] > ave[j]){rand[i]--;}}printf("第%d个人的排名是:%d\n",i+1,rand[i]);}return 0; }附加1.
#include <stdio.h> #include <stdlib.h> #include <conio.h> #include<time.h> int i, j; void draw_map(int map[50][50]) {for (i = 0; i < 50; i++){for (j = 0; j < 50; j++){switch (map[i][j]){case 0:printf(" "); //数字代表道路break;case 1:printf("%c", 5); //数字代表墙壁break;case 2:printf(" "); //数字是游戏边框的空白部分break;case 3:printf("*"); //数字代表目的地break;case 4:printf("%c", 30); //数字代表箱子break;case 7:printf("$"); //数字代表箱子进入目的地break;case 6:printf("%c", 12); //数字代表人break;case 9:printf("@"); //数字代表人进入目的地break;}}printf("\n"); //分行输出} } int main() {char input;int count = 0, count2 = 0; //定义记分变量int num = 0;//定义计步器int ww;int diff;printf("请输入要去的关卡数:(1-48)");scanf_s("%d", &diff); loop: srand(time(NULL));num = 0;int map[50][50] = { 0 };int wall[50][50] = { 0 };for (i = 0; i < 50; i++){for (j = 0; j < 50; j++){wall[i][j] = rand() % 2;}}//随机生成墙for (i = 0; i < 50; i++){map[0][i] = 1;map[49][i] = 1;map[i][0] = 1;map[i][49] = 1;}//生成墙壁map[1][1] = 6;map[2][2] = 4;for (i = 0; i < 50; i++){ww = rand() % 50;map[i][3] = wall[ww][i];}//生成第一道墙for (i = 0; i < 48; i++){ww = rand() % 50;map[i][46] = wall[ww][i];}//生成终点处的墙for (i = 3; i < diff; i = i + 3){for (j = 0; j < 49; j++){map[i][j] = wall[rand() % 50][rand() % 50];}}//调用随机数函数,生成墙壁{ww = rand() % 49;map[ww][49] = 3;//生成目的地map[ww][48] = 0;map[ww - 1][48] = 0;map[ww + 1][48] = 0;//避免目的地附近无法进入}while (1){system("CLS");printf("\n");draw_map(map);printf("得分:%d\n", count2);if (count == 1){count2++;count = 0;diff++;if (diff > 48){return 0;}goto loop;//跳转至生成地图}//找初始位置for (i = 0; i < 50; i++){for (j = 0; j < 50; j++){if (map[i][j] == 6 || map[i][j] == 9)break;}if (map[i][j] == 6 || map[i][j] == 9)break;}printf("您的当前坐标(%d,%d)", i, j);printf("您的当前步数为:%d", num);input = _getch(); //用getch()函数无需回车确认地获取用户输入,用于控制行走方向。switch (input){case 'R':{goto loop;}case 'O':{return 0;}case 'W'://如果人前面是空地。 //0代表空地 6代表人 //3代表目的地num++;if (map[i - 1][j] == 0){map[i - 1][j] = 6 + 0; //人往前走一步,ID为人的ID()加上空地的ID()。if (map[i][j] == 9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。map[i][j] = 3; //将人往前走一步后原地的ID修改为空地ID()。elsemap[i][j] = 0; //否则原地ID修改为空地ID 。 }//如果人前面是目的地。else if ((map[i - 1][j] == 3) || (map[i - 1][j] == 9)){map[i - 1][j] = 6 + 3; //人往前走一步,ID为人ID+目的地ID=9。if (map[i][j] == 9) //如果原地也是目的地(ID为)。map[i][j] = 3; //人走后把原地ID修改回目的地ID。elsemap[i][j] = 0; //否则原地ID修改为为空地ID}//如果人前面是箱子。//4代表箱子 //7箱子进入目的地else if (map[i - 1][j] == 4){//如果人前面是箱子,而箱子前面是空地。if (map[i - 2][j] == 0){map[i - 2][j] = 4; //人推箱子往前走一步,把空地ID修改为箱子ID()//下面是对箱子原地进行判断if (map[i - 1][j] == 7) //如果箱子原地为目的地。map[i - 1][j] = 9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。elsemap[i - 1][j] = 6; //否则,人站在了原来的空地上,ID应该为+0=6。//下面是对人原地进行判断if (map[i][j] == 9) //如果之前是目的地。map[i][j] = 3; //人走了之后修改回目的地ID。elsemap[i][j] = 0; //否则就是空地。}//如果人的前面是箱子,而箱子前面是目的地。else if (map[i - 2][j] == 3){map[i - 2][j] = 7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。count++;//下面是对箱子原先位置的判断,同上。if (map[i - 1][j] == 7)map[i - 1][j] = 9;elsemap[i - 1][j] = 6;//下面是对人原先位置进行判断,同上。if (map[i][j] == 9)map[i][j] = 3;elsemap[i][j] = 0;}}break;case 'S'://如果人前面是空地。num++;if (map[i + 1][j] == 0){map[i + 1][j] = 6 + 0; //人往前走一步,ID为人的ID()加上空地的ID()。if (map[i][j] == 9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。map[i][j] = 3; //将人往前走一步后原地的ID修改为空地ID()。elsemap[i][j] = 0; //否则原地ID修改为空地ID 。 }//如果人前面是目的地。else if (map[i + 1][j] == 3){map[i + 1][j] = 6 + 3; //人往前走一步,ID为人ID+目的地ID=9。if (map[i][j] == 9) //如果原地也是目的地(ID为)。map[i][j] = 3; //人走后把原地ID修改回目的地ID。elsemap[i][j] = 0; //否则原地ID修改为为空地ID}//如果人前面是箱子。else if (map[i + 1][j] == 4){//如果人前面是箱子,而箱子前面是空地。if (map[i + 2][j] == 0){map[i + 2][j] = 4; //人推箱子往前走一步,把空地ID修改为箱子ID()//下面是对箱子原地进行判断if (map[i + 1][j] == 7) //如果箱子原地为目的地。map[i + 1][j] = 9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。elsemap[i + 1][j] = 6; //否则,人站在了原来的空地上,ID应该为+0=6。//下面是对人原地进行判断if (map[i][j] == 9) //如果之前是目的地。map[i][j] = 3; //人走了之后修改回目的地ID。elsemap[i][j] = 0; //否则就是空地。}//如果人的前面是箱子,而箱子前面是目的地。else if (map[i + 2][j] == 3){map[i - 2][j] = 7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。count++;//下面是对箱子原先位置的判断,同上。if (map[i + 1][j] == 7)map[i + 1][j] = 9;elsemap[i + 1][j] = 6;//下面是对人原先位置进行判断,同上。if (map[i][j] == 9)map[i][j] = 3;elsemap[i][j] = 0;}}break;case 'A'://如果人前面是空地。num++;if (map[i][j - 1] == 0){map[i][j - 1] = 6 + 0; //人往前走一步,ID为人的ID()加上空地的ID()。if (map[i][j] == 9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。map[i][j] = 3; //将人往前走一步后原地的ID修改为空地ID()。elsemap[i][j] = 0; //否则原地ID修改为空地ID 。 }//如果人前面是目的地。else if (map[i][j - 1] == 3){map[i][j - 1] = 6 + 3; //人往前走一步,ID为人ID+目的地ID=9。if (map[i][j] == 9) //如果原地也是目的地(ID为)。map[i][j] = 3; //人走后把原地ID修改回目的地ID。elsemap[i][j] = 0; //否则原地ID修改为为空地ID}//如果人前面是箱子。else if (map[i][j - 1] == 4){//如果人前面是箱子,而箱子前面是空地。if (map[i][j - 2] == 0){map[i][j - 2] = 4; //人推箱子往前走一步,把空地ID修改为箱子ID()//下面是对箱子原地进行判断if (map[i][j - 1] == 7) //如果箱子原地为目的地。map[i][j - 1] = 9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。elsemap[i][j - 1] = 6; //否则,人站在了原来的空地上,ID应该为+0=6。//下面是对人原地进行判断if (map[i][j] == 9) //如果之前是目的地。map[i][j] = 3; //人走了之后修改回目的地ID。elsemap[i][j] = 0; //否则就是空地。}//如果人的前面是箱子,而箱子前面是目的地。else if (map[i][j - 2] == 3){count++;map[i][j - 2] = 7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。//下面是对箱子原先位置的判断,同上。if (map[i][j - 1] == 7)map[i][j - 1] = 9;elsemap[i][j - 1] = 6;//下面是对人原先位置进行判断,同上。if (map[i][j] == 9)map[i][j] = 3;elsemap[i][j] = 0;}}break;case 'D'://如果人前面是空地。num++;if (map[i][j + 1] == 0){map[i][j + 1] = 6 + 0; //人往前走一步,ID为人的ID()加上空地的ID()。if (map[i][j] == 9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。map[i][j] = 3; //将人往前走一步后原地的ID修改为空地ID()。elsemap[i][j] = 0; //否则原地ID修改为空地ID 。 }//如果人前面是目的地。else if (map[i][j + 1] == 3){map[i][j + 1] = 6 + 3; //人往前走一步,ID为人ID+目的地ID=9。if (map[i][j] == 9) //如果原地也是目的地(ID为)。map[i][j] = 3; //人走后把原地ID修改回目的地ID。elsemap[i][j] = 0; //否则原地ID修改为为空地ID}//如果人前面是箱子。else if (map[i][j + 1] == 4){//如果人前面是箱子,而箱子前面是空地。if (map[i][j + 2] == 0){map[i][j + 2] = 4; //人推箱子往前走一步,把空地ID修改为箱子ID()//下面是对箱子原地进行判断if (map[i][j + 1] == 7) //如果箱子原地为目的地。map[i][j + 1] = 9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。elsemap[i][j + 1] = 6; //否则,人站在了原来的空地上,ID应该为+0=6。//下面是对人原地进行判断if (map[i][j] == 9) //如果之前是目的地。map[i][j] = 3; //人走了之后修改回目的地ID。elsemap[i][j] = 0; //否则就是空地。}//如果人的前面是箱子,而箱子前面是目的地。else if (map[i][j + 2] == 3){count++;map[i][j + 2] = 7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。map[i][j] = 0;//下面是对箱子原先位置的判断,同上。if (map[i][j + 1] == 7)map[i][j + 1] = 9;elsemap[i][j + 1] = 6;//下面是对人原先位置进行判断,同上。if (map[i][j] == 9)map[i][j] = 3;elsemap[i][j] = 0;}}break;}} }部分程序有些冗余,有待完善、修正。
Copyright © 网站出售-网站交易平台 版权信息
网站备案号:黔ICP备2023004141号