《C语言课程设计》任务书
课程设计名称: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)是 指距离下一次信号灯变化的秒数。
- 问题描述
一次上学的路上,小明记录下了经过每段路的时间,和各个红绿灯在小明到达路口时的颜色和倒计时秒数。希望你帮忙计算此次小明上学所用的时间。 - 输入格式
输入的第一行包含空格分隔的三个正整数 r、y、g,表示红绿灯的设置。这三个数均不超过 106。
输入的第二行包含一个正整数 n(n ≤ 100),表示小明总共经过的道路段数和看到的红绿灯数目。
接下来的 n 行,每行包含空格分隔的两个整数 k、t。k=0 表示经过了一段道路,耗时 t 秒,此处 t 不超过 106;k=1、2、3 时,分别表示看到了一个红灯、黄灯、绿灯,且倒计时显示牌上显示的数字是 t,此处 t 分别不会超过 r、y、g。 - 输出格式
输出一个数字,表示此次小明上学所用的时间。 - 样例输入
30 3 30
8
0 10
1 5
0 11
2 2
0 6
0 3
3 10
0 3 - 样例输出
70 - 样例说明
小明先经过第一段道路,用时 10 秒,然后等待 5 秒的红灯,再经过第二段道路,用时 11 秒,然后等待 2 秒的黄 灯和 30 秒的红灯,再经过第三段、第四段道路,分别用时6、3秒,然后通过绿灯,再经过最后一段道路,用时 3 秒。 共计 10 + 5 + 11 + 2 + 30 + 6 + 3 + 3=70 秒。 - 测试用例n、k、t、r、y、g的值可考虑随机产生,并在此基础上采用“案例集合”,即随机产生多组测试用例。
⑧期末统计分数
某班有最多不超过60人(具体人数n由键盘输入)参加期末考试,考试科目为程序设计、英语和数学,编程实现以下功能:
- 输入学生的各科考试成绩。
- 计算每个学生的平均分。
- 输出每名学生的各科考试成绩和个人平均分。
- 计算输出各科目的平均分、最高分、最低分、及格率。
- 按学生总评成绩进行排名,并输出排名。
2、 深化部分 (以下2题,任选1题 )
题目1:推箱子游戏设计
题目描述:简易小人推箱子游戏,游戏过程:(1)初始时,小人在窗口的左上角位置,箱子在小人的右侧;(2)在小人前方随机生成若干个阻碍物;(3)在窗口的右侧随机生成一个出口;(4)要求小人能够将箱子推到窗口右侧出口。(5)*实时给出推荐路径(6)*自动寻路推箱子。
基本要求:
- 用键盘上、下、左、右按键控制小人移动。小人必须推箱子,而不能拉箱子。
- 在小人前方随机生成若干个阻碍物和一个箱子。
- 小人必须穿过阻碍物之间的空隙,到达出口。
- 小人进入出口时提示游戏成功。
5 ) 小人无路可走时提示游戏失败。 - 小人每移动一步在窗口的左下角显示当前已经移动的步数。
7 ) 用户可自行放弃游戏。 - 有难度晋级。
9)能够给出一条推荐路径。
10)自动寻路,1秒移动一次,直到目标。
提示:小人可以用“ ”表示(ASCII码值为12),阻碍物可用“ ”表示(ASCII码值为5),推箱子可用“ ”表示(ASCII码值为30)。
加分方向:尽量体现游戏的趣味性和智能性。
题目2:小蜜蜂游戏
题目描述:80年代产生了很多经典游戏,像《魂斗罗》、《街头霸王》、《赤色要塞》、《双截龙》、《沙罗曼蛇》…其中,作为红白机射击游戏鼻祖《小蜜蜂(Galaxian)》游戏更是让人怀旧。也学了一学期C语言了,亲爱的小伙伴们,(+o+)v,让我们一起动手做一个吧。
基本要求:
- 主角在屏幕最下方,通过键盘左右操控移动;
- 敌方初始在屏幕上方,有一定的队形(可自定义);
- 主角和敌方都可发射子弹,主角被击中,损失一条命(共3条);敌方被击中,直接消失;
- 敌方移动控制,敌方小兵可以按一定轨迹(至少设计1种:直线飞往主角、弧线飞往主角、螺旋飞法…)撞向主角;
- 至少设计3个基础关卡,难度依次递增,关卡1敌人只会发射子弹,关卡2敌人也会撞主角,关卡3敌人可以多只同时撞向主角;
- 至少设计1个BOSS关卡,一只AI比较强的大蜜蜂(请使用多个图案拼凑它,让它看起来霸气些噢血条长点,别一下就挂了),它可以较大概率躲避主角子弹,并可以来回快速移动撞击主角(设计个漂亮招式吧,请至少设计2种:瞬移攻击?次元连斩?…),可以加个漂亮的拖尾效果哟(+o+)v,同时,它可以拥有各种华丽子弹效果(至少设计2种:火箭炮,光束弹,连环旋转弹,反弹弹…发挥你的想象吧);
- 拉仇恨,BOSS血多的时候AI弱,血值越少,攻击和躲避能力越强。
扩展要求:
8) 设计可以双人玩,每人3条命,加入借命功能,挂掉后可借用别人剩余一条命;
9) 设计一些奖励元素,从屏幕上方掉下来各种奖励,比如:不同的子弹、补血、绝招(使得主角也可以次元斩飞向敌方阵地撞击敌人。。。);
10) 设计一个菜单选择单人、双人游戏,并设计剧情开头动画和结尾动画(失败and胜利)
11) 给游戏添加音乐和特效。
五、课程设计时间进程表(若有节假日,任课老师可合理调整进度)
第一天:1、布置任务,讲解设计课题的基本设计思路和基本要求。
2、讲解课程设计报告本要求、需要的提交电子资料和课程设计最总成绩评定标准。
3、提供本次课程设计关键技术的基础练习(可根据所选课题选择相应的题进行练习):
第二天:讲解设计深化部分的基本设计思路和基本要求,及其在成绩评定中的比例。
第三天:学生自主设计,老师辅导,并进行抽查。
第四天:再次讲解课程设计报告本要求,强调报告格式要求。需要的提交电子资料。
学生自主设计,老师辅导,并进行抽查。
第五天:学生自主设计,老师辅导,并进行抽查,部分同学可进行作业演示报告。
递交课程设计电子资料和设计报告。
六、设计过程和报告格式要求
(1) 设计要求
编写程序要求遵循如下基本要求:
模块化程序设计
锯齿型书写格式
必须上机调试通过
(2) 课程设计报告格式
设计目的
总体设计(程序设计流程图)
详细设计(如函数功能、入口及出口参数说明,函数调用关系描述等)
调试与测试:调试方法,测试结果的分析与讨论,测试过程到的主要问题及采取的解决措施
源程序清单和执行结果:源程序中应有足够的注释
七、考核及成绩评分
1)总评成绩评分标准:
考核方式 比例% 主要考核内容
平时表现 10% 阶段目标实现情况,学习活跃度
基础题
+提高题 60% 基础题目的完成情况80%
提高提的完成情况20%
设计报告检查 15% 设计报告的规范性及内容完整性
演示答辩 15% 课程设计报告、现场演示及讲解、问题回答情况。
附本人做的代码如下:
1.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>
#include<conio.h>
void sj(long int b[1001]) //使用随机数函数以及time函数将系统时间转换成随机数并赋值给数组中元素
{
int i;
srand(time(NULL));
for (i = 0; i <= 1000; i++)
{
b[i] = rand();
}
}
int zd(long int c[1001], int j) //进行循环求最大值
{
int i;
long int max = 0;
for (i = 100 * j; i < 100 * (j + 1); i++)
{
if (c[i] > max)
max = c[i];
}
return max;
}
int zx(long int d[1001], int i) //进行循环求最小值
{
int j;
long int min = 100000;
for (j = 100 * i; j < (i + 1) * 100; j++)
{
if (d[j] < min)
min = d[j];
}
return min;
}
double pj(long int e[1001], int i) //进行循环求平均值
{
int j;
double ave, add = 0;
for (j = 100 * i; j < (i + 1) * 100; j++)
{
add = add + e[j];
}
ave = add / 100;
return ave;
}
int main()
{
int i, n = 1, j;
long int max, min;
double ave;
char f, g;
int ch1 = 0;
long int a[1001] = { 0 }; //初始化
int k; //用作回查
sj(a); //赋值
for (i = 0;; i++) //求最大值并输出
{
for (j = i * 100; j < (i + 1) * 100; j++) //输出数组
{
printf("%-6ld", a[j]);
if (n++ % 10 == 0)
printf("\n");
}
max = zd(a, i);
min = zx(a, i);
ave = pj(a, i);
printf("当前页最大值为:%ld\n", max); //输出最大值
printf("当前页最小值为:%ld\n", min); //输出最小值
printf("当前页平均值为:%f\n", ave); //输出平均值
printf("当前页码:%d\n", i + 1); //输出当前页码提示
system("pause"); //实现分屏操作
while (1)
{
ch1 = _getch();
switch (ch1)
{
case 13:
{
system("cls");
break;
}
case 87://如果是W
{
i = i - 2;
if (i < -1)
i = 8;
system("cls");
break;
}
case 83://如果是S
{
i = i;
if (i > 8)
i = -1;
system("cls");
break;
}
case 'O':
{
printf("您是否需要回查数据? (是:Y/否:N)\n");
if ((f = getchar()) == 'Y')
{
printf("请输入页码:");
scanf_s("%d", &k);
if (k < 0 || k>10)
{
k = 1;
}
n = 1;
system("cls");
printf("您正在回查第%d页!\n", k);
for (i = 100 * (k - 1); i < 100 * k; i++)
{
printf("%-6ld", a[i]);
if (n++ % 10 == 0)
{
printf("\n");
}
}
printf("当前页最大值为:%ld\n", zd(a, k));
printf("当前页最小值为:%ld\n", zx(a, k));
printf("当前页平均值为:%f\n", pj(a, k));
}
if ((f = getchar()) == 'N')
{
return 0;
}
system("pause");
return 0;
break;
}
}
break;
}
}
return 0;
}
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
double hs(double i)
{
double j;
j = 1.0 / (pow(i, 2) + 4 * i);
if (j < 0)
{
j = -j;
}
j = j * 0.00001;
return j;
}
int main()
{
int a, b;
double x, y = 0;
printf("请输入上限和下限:\n");
scanf_s("%d %d", &a, &b);
if (a == 0 && b == 0)
{
printf("0");
return 0;
}
for (x = a; x <= b; x = x + 0.00001)
{
y = y + hs(x);
}
printf("%f", y);
return 0;
}
暂时未完成
4.
#include<stdio.h>
#include<time.h>
#include<math.h>
#include<stdlib.h>
int main()
{
double x[65] = { 0 }, y[65] = { 0 }, K[10] = { 0 }, zx[10] = { 0 }, zy[10] = { 0 };
double sp[65][10] = { 0 };
int n, k, i, j, l, o;
srand(time(NULL));
do
{
n = rand() % 66;
} while (n < 15 || n>65);
printf("n=%d\n", n);
for (i = 0; i < n; i++)
{
do
{
l = rand() % 80;
} while (l < 0);
do
{
o = rand() % 40;
} while (o < 0);
x[i] = l;
y[i] = o;
}
scanf_s("%d", &k);
K[0] = rand() % n;
K[k - 1] = rand() % n;
for (i = 0; i < k; i++)
{
for (j = 0; j < k; j++)
{
if (K[i] == K[j])
{
K[j] = rand() % (n - 1);
}
}
}//随机生成k个中心点
for (i = 0; i < k; i++)
{
l = K[i];
zx[i] = x[l];
zy[i] = y[l];
printf("%d %f %f\n", l, zx[i], zy[i]);
}
//开始循环
while (1)
{
for (i = 0; i < n; i++)
{
for (j = 0; j < k; j++)
{
sp[i][j] = sqrt(pow(zx[j] - x[i], 2) + pow(zy[j] - y[i], 2));
printf("%f\n", sp[i][j]);
}
}//求了距离
//分组代码
for (i = 0; i < k; i++)
{
//添加更新中心点代码
}
}
return 0;
}
#include<stdio.h>
#include<math.h>
#include<string.h>
char num1[1000] = { 0 }, num2[1000] = { 0 };
void X3X( int o,int n, int m, char num6[])
{
int i, j;
long int k = 0;
int l = 0;
for (i = 0;i<=o; i++)
{
if (num1[i] != '\0')
{
l++;
num1[i] = num1[i] - 48;
if (num1[i] > 10)
{
num1[i] = num1[i] - 7;
}
}
}
for (i = 0; i < l; i++)
{
k = k + num1[i] * pow(n, l - i - 1);
}
for (i = 0;; i++)
{
num6[i] = k % m + 1;
k = k / m;
if (k == 0)
{
break;
}
}
}
void X2X(char num3[1000], int n, int m, char num4[1000])
{
int i, j;
long int k=0;
int l=0;
for (i = 0;; i++)
{
if (num3[i] != '\0')
{
l++;
num3[i] = num3[i] - 48;
}
else
break;
}
for (i = 0; i < l; i++)
{
k =k+num3[i] * pow(n, l - i - 1);
}
for (i = 0;; i++)
{
num4[i] = k % m+1;
k = k / m;
if (k == 0)
{
break;
}
}
}
void X4X(int n, int m, char num7[1000])
{
int i, j;
long int k = 0;
int l = 0;
for (i = 0;; i++)
{
if (num1[i] != '\0')
{
l++;
num1[i] = num1[i] - 48;
}
else
break;
}
for (i = 0; i < l; i++)
{
k = k + num1[i] * pow(n, l - i - 1);
}
for (i = 0;; i++)
{
num7[i] = k % m + 1;
/*
if (num7[i] > 10)
{
num7[i] = num7[i] + 17;
}
*/
k = k / m;
if (k == 0)
{
break;
}
}
}
int main()
{
int i,n, m;
printf("请输入初始进制和要转换成的进制:\n");
scanf_s("%d %d", &n, &m);
for (i = 0; i < 1000; i++)//初始化为空
{
num1[i] = '\0';
num2[i] = '\0';
}
printf("请输入数据:");
getchar();
gets_s(num1);
for (i = 0;; i++)
{
if (num1[i] == 0)
break;
}
if (n <= 10 && m <= 10)
{
X2X(num1, n, m, num2);
}
else if(n>10&&m<=10)
{
X3X(i, n, m, num2);
}
else if (m > 10)
{
X4X(n,m,num2);
}
for (i = 0;; i++)
{
if (num2[i] == '\0')
break;
}
i -= 1;
for (; i >= 0; i--)
{
if (num2[i] < 10)
{
printf("%d", num2[i] - 1);
}
else
{
printf("%c", num2[i] + 54);
}
}
return 0;
}
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]不为0
ti = 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()。
else
map[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。
else
map[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。
else
map[i - 1][j] = 6; //否则,人站在了原来的空地上,ID应该为+0=6。
//下面是对人原地进行判断
if (map[i][j] == 9) //如果之前是目的地。
map[i][j] = 3; //人走了之后修改回目的地ID。
else
map[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;
else
map[i - 1][j] = 6;
//下面是对人原先位置进行判断,同上。
if (map[i][j] == 9)
map[i][j] = 3;
else
map[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()。
else
map[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。
else
map[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。
else
map[i + 1][j] = 6; //否则,人站在了原来的空地上,ID应该为+0=6。
//下面是对人原地进行判断
if (map[i][j] == 9) //如果之前是目的地。
map[i][j] = 3; //人走了之后修改回目的地ID。
else
map[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;
else
map[i + 1][j] = 6;
//下面是对人原先位置进行判断,同上。
if (map[i][j] == 9)
map[i][j] = 3;
else
map[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()。
else
map[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。
else
map[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。
else
map[i][j - 1] = 6; //否则,人站在了原来的空地上,ID应该为+0=6。
//下面是对人原地进行判断
if (map[i][j] == 9) //如果之前是目的地。
map[i][j] = 3; //人走了之后修改回目的地ID。
else
map[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;
else
map[i][j - 1] = 6;
//下面是对人原先位置进行判断,同上。
if (map[i][j] == 9)
map[i][j] = 3;
else
map[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()。
else
map[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。
else
map[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。
else
map[i][j + 1] = 6; //否则,人站在了原来的空地上,ID应该为+0=6。
//下面是对人原地进行判断
if (map[i][j] == 9) //如果之前是目的地。
map[i][j] = 3; //人走了之后修改回目的地ID。
else
map[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;
else
map[i][j + 1] = 6;
//下面是对人原先位置进行判断,同上。
if (map[i][j] == 9)
map[i][j] = 3;
else
map[i][j] = 0;
}
}
break;
}
}
}
部分程序有些冗余,有待完善、修正。