43.C语言-学生成绩排名,并且要求输出原来的位置号以及成绩

问题:
        输入一组互不相等的百分之成绩,个数<=100,以-1j结束,按从高到低的顺序输出前10名成绩以及其位置号。位置号根据最初输入个数输入,例如:66 88 77 -1,输出2号88分 3号77分 1号66分等。

思路:

  1. 由于输入成绩以及其位置号绑定移动,所以最好定义一个结构体,来存放这两个数据,每个学生为单个结构体变量。
  2. 个数小于等于100,所以结构体定义的数最大为s[100];
  3. 输入数据,-1,结束。——意思是没必要真输100个数据,我输入12个想结束了,按个-1,也可以结束,所以需要定一个变量,来表示实际输入的个数。
  4. -1结束,所以while(1)死循环,直到结构体中的成绩为-1时才跳出while循环。其中在输入学生具体内容时,若输入的成绩为-1,则跳出输入循环。提前结束。
  5. 由于学生的成绩和座位号绑定了,所以只需定一个相应的结构体中间变量,struct student temp,进行冒泡排序。
  6. 冒泡排序,外循环为所需要移动的数据;内循环为与后面的一一对比,判断是否交换。若发现s【q】.cj中比后面的s【q+1】.cj小,则进行交换,结构体交换,交换的时候直接temp = s【q】这种形式即可,s【q】为交换这个结构体整体。
  7. 随后进行输出即可。

代码如下:

#define max 100
#include 
int main()
{
	struct student    //因为要求位置随成绩变动而捆绑,所以结构体可以更好满足
	{
		int cj;
		int weizhi;
	};
	struct student s[max]; //定义学生数组,每一位为一个学生信息,注意其中最后一位需要输入-1,不能超过定义的结构体内容。
	int i;
	int sum=0;//记录实际输入的数量
	printf("你想输出前几名?\n");
	int ming;
	scanf("%d", &ming);
	//进行数据输入,直至-1为止
	while (1)
	{
		for (i = 0; i < max; i++)
		{
			scanf("%d", &s[i].cj);
			sum++;
			s[i].weizhi = i + 1;
			if (s[i].cj == -1) //如果输到中间 想结束,输入-1,跳出输入循环;
				break;
		}
		if (s[i].cj == -1)//如果等于发现成绩等于-1,跳出while循环,且sum--,因为-1不算有效成绩;
		{
			sum--;
			break;
		}
			
	}
	printf("sum=%d\n", sum);
	int p;
	
	struct student temp;
	int k, q;
	for (k = 0; k < sum-1; k++)
	{
		for (q = 0; q < sum - 1 - k; q++)
		{
			if (s[q].cj < s[q + 1].cj)
			{
				temp = s[q];
				s[q] = s[q + 1];
				s[q + 1] = temp;
			}
		}

	}
	for (p = 0; p < ming; p++)
	{
		printf("从高到低排名为下行所示\n")
		printf("%d号%d分 ", s[p].weizhi, s[p].cj);
	}

	return 0;
}

你可能感兴趣的:(C语言学习笔记,c语言,算法,数据结构)