C语言课程设计

《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)是 指距离下一次信号灯变化的秒数。

  1. 问题描述
    一次上学的路上,小明记录下了经过每段路的时间,和各个红绿灯在小明到达路口时的颜色和倒计时秒数。希望你帮忙计算此次小明上学所用的时间。
  2. 输入格式
    输入的第一行包含空格分隔的三个正整数 r、y、g,表示红绿灯的设置。这三个数均不超过 106。
    输入的第二行包含一个正整数 n(n ≤ 100),表示小明总共经过的道路段数和看到的红绿灯数目。
    接下来的 n 行,每行包含空格分隔的两个整数 k、t。k=0 表示经过了一段道路,耗时 t 秒,此处 t 不超过 106;k=1、2、3 时,分别表示看到了一个红灯、黄灯、绿灯,且倒计时显示牌上显示的数字是 t,此处 t 分别不会超过 r、y、g。
  3. 输出格式
    输出一个数字,表示此次小明上学所用的时间。
  4. 样例输入
    30 3 30
    8
    0 10
    1 5
    0 11
    2 2
    0 6
    0 3
    3 10
    0 3
  5. 样例输出
    70
  6. 样例说明
    小明先经过第一段道路,用时 10 秒,然后等待 5 秒的红灯,再经过第二段道路,用时 11 秒,然后等待 2 秒的黄 灯和 30 秒的红灯,再经过第三段、第四段道路,分别用时6、3秒,然后通过绿灯,再经过最后一段道路,用时 3 秒。 共计 10 + 5 + 11 + 2 + 30 + 6 + 3 + 3=70 秒。
  7. 测试用例n、k、t、r、y、g的值可考虑随机产生,并在此基础上采用“案例集合”,即随机产生多组测试用例。

⑧期末统计分数
某班有最多不超过60人(具体人数n由键盘输入)参加期末考试,考试科目为程序设计、英语和数学,编程实现以下功能:

  1. 输入学生的各科考试成绩。
  2. 计算每个学生的平均分。
  3. 输出每名学生的各科考试成绩和个人平均分。
  4. 计算输出各科目的平均分、最高分、最低分、及格率。
  5. 按学生总评成绩进行排名,并输出排名。

2、 深化部分 (以下2题,任选1题 )
题目1:推箱子游戏设计

题目描述:简易小人推箱子游戏,游戏过程:(1)初始时,小人在窗口的左上角位置,箱子在小人的右侧;(2)在小人前方随机生成若干个阻碍物;(3)在窗口的右侧随机生成一个出口;(4)要求小人能够将箱子推到窗口右侧出口。(5)*实时给出推荐路径(6)*自动寻路推箱子。
基本要求:

  1. 用键盘上、下、左、右按键控制小人移动。小人必须推箱子,而不能拉箱子。
  2. 在小人前方随机生成若干个阻碍物和一个箱子。
  3. 小人必须穿过阻碍物之间的空隙,到达出口。
  4. 小人进入出口时提示游戏成功。
    5 ) 小人无路可走时提示游戏失败。
  5. 小人每移动一步在窗口的左下角显示当前已经移动的步数。
    7 ) 用户可自行放弃游戏。
  6. 有难度晋级。
    9)能够给出一条推荐路径。
    10)自动寻路,1秒移动一次,直到目标。
    提示:小人可以用“ ”表示(ASCII码值为12),阻碍物可用“ ”表示(ASCII码值为5),推箱子可用“ ”表示(ASCII码值为30)。
    加分方向:尽量体现游戏的趣味性和智能性。

题目2:小蜜蜂游戏
题目描述:80年代产生了很多经典游戏,像《魂斗罗》、《街头霸王》、《赤色要塞》、《双截龙》、《沙罗曼蛇》…其中,作为红白机射击游戏鼻祖《小蜜蜂(Galaxian)》游戏更是让人怀旧。也学了一学期C语言了,亲爱的小伙伴们,(+o+)v,让我们一起动手做一个吧。

基本要求:

  1. 主角在屏幕最下方,通过键盘左右操控移动;
  2. 敌方初始在屏幕上方,有一定的队形(可自定义);
  3. 主角和敌方都可发射子弹,主角被击中,损失一条命(共3条);敌方被击中,直接消失;
  4. 敌方移动控制,敌方小兵可以按一定轨迹(至少设计1种:直线飞往主角、弧线飞往主角、螺旋飞法…)撞向主角;
  5. 至少设计3个基础关卡,难度依次递增,关卡1敌人只会发射子弹,关卡2敌人也会撞主角,关卡3敌人可以多只同时撞向主角;
  6. 至少设计1个BOSS关卡,一只AI比较强的大蜜蜂(请使用多个图案拼凑它,让它看起来霸气些噢血条长点,别一下就挂了),它可以较大概率躲避主角子弹,并可以来回快速移动撞击主角(设计个漂亮招式吧,请至少设计2种:瞬移攻击?次元连斩?…),可以加个漂亮的拖尾效果哟(+o+)v,同时,它可以拥有各种华丽子弹效果(至少设计2种:火箭炮,光束弹,连环旋转弹,反弹弹…发挥你的想象吧);
  7. 拉仇恨,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;
		}
	}
}

部分程序有些冗余,有待完善、修正。

  • 31
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值