1、顺序表实现:存储学生三科成绩以及总分,实现成绩查询、按总分排序、求科目平均分2、本文含goto的使用、顺序表的建立与初始化等知识点的相关应用

因为比较简单就不过多赘述,有问题的读者可以在评论区评论,也可以私信一起讨论

一、.c文件

#include"Module.h"
int main()
{
	SqList L;
	int N = 0,Choice=0;
	printf("您将录入的学生信息个数为:");
	scanf_s("%d", &N);
	InitList(L, N);//初始化顺序表L
	while (1)
	{
		printf("请选择想完成的操作:1:查询学生成绩\t2:按总分对学生进行排序\t3:查看各科的平均分\t4:退出\n");
		scanf_s("%d", &Choice);
		switch (Choice)
		{
		case 1:
			Find(L);
			break;
		case 2:
			Rank(L);
			break;
		case 3:
			average(L);
			break;
		case 4:
			exit(0);
			break;
		}
	}
}

二、.h文件

#pragma once
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
#define MAXSIZE 20//限制结构体STU最大容量
#define QUANTITY 21//限制顺序表最大元素个数
 
typedef struct
{
	char name[20];
	int Chinese,Math,English,total;//toral用来存放总分
	//int Total = Chinese+Math+English;不能这样写会报错
}STU;
typedef struct
{//L.elem存储所需空间的地址,后将为基地址申请空间存放数据
	STU* elem;//存储空间的基地址,顺序表指针动态赋存储空间
	int length;
}SqList;//顺序表
int InitList(SqList& L, int N)//传引用,以及传参N
{
	int flag2 = 0;
	L.elem = new STU[MAXSIZE];//为顺序表分配一个大小为MAXSIZE的数组空间
	L.length = N;//定义顺序表表长为N
	if (L.elem == NULL)//判断申请空间是否成功,如果申请空间不成功返回false
	{
		return false;//将函数返回值定义为int
	}               //return false相当于返回0,return true相当于返回1
	else//成功申请空间
	{		//继续对传入参数N(表长也是元素个数)进行判断
		if (L.length == 0)//L.length = N=0
		{
			printf("您将录入的学生信息个数为:0\n");
		}
		else if (L.length < 0)//L.length=N=0 
		{
			printf("非法输入请重新输入:");
			return false;
		}
		else if (L.length > QUANTITY)//如果超出顺序表最大容量
		{
			printf("对不起您输入的数据超出存储范围,请重新输入:");
			return false;
		}
		else//合法输入1<=N<= QUANTITY
		{//初始化顺序表
			for (int i = 0; i < L.length; i++)
			{
			circul://从goto回到circul处
				printf("请输入第%d个学生的姓名、语文、数学、英语的成绩:", i + 1);
				scanf_s("%s", &L.elem[i].name, sizeof(L.elem[i].name));
 
				scanf("%d", &L.elem[i].Chinese, sizeof(L.elem[i].Chinese));
 
				scanf_s("%d", &L.elem[i].Math, sizeof(L.elem[i].Math));
			
				scanf_s("%d", &L.elem[i].English, sizeof(L.elem[i].English));
				if (((L.elem[i].Chinese <= 150) && (L.elem[i].Chinese >= 0)) && ((L.elem[i].Math <= 150) && (L.elem[i].Math >= 0)) && ((L.elem[i].English <= 150) && (L.elem[i].English >= 0)))
				{
					flag2 = 1;
				}
				else
				{
					flag2 = 0;
					printf("输入成绩错误!!请重新录入\n");
					goto circul;
				}
				
			}
			printf("输入完成,所输入学生信息为:\n");//打印顺序表内容
			for (int i = 0; i < L.length; i++)
			{
				printf("%s\t%d\t%d\t%d\n", L.elem[i].name, L.elem[i].Chinese, L.elem[i].Math, L.elem[i].English);
			}
			return true;
		}
	}
}
int Find(SqList& L)
{
	char name[12] = { 0 };
	int i = 0, j = 0,flag=0;
	printf("请输入你想查询学生的名字:\n");
	scanf_s("%s", &name,sizeof(name));
	for (i = 0; i < L.length; i++)
	{
		if (strcmp(L.elem[i].name, name) == 0)
		{
			flag = 1;
			printf("该学生的语文成绩为:%d\t数学成绩为:%d\t英语成绩为:%d\n",L.elem[i].Chinese, L.elem[i].Math, L.elem[i].English);
			return true;
		}
	}
	if (flag == 0)
	{
		printf("未检索到学生姓名!!\n");
		return false;
	}
}
int Rank(SqList& L)
{
	int arr[5] = { 0 };
	for (int i = 0; i < L.length; i++)
	{
		L.elem[i].total = L.elem[i].Chinese + L.elem[i].Math + L.elem[i].English;
	}//求出总分
	for (int i = 0; i < L.length; i++)
	{
		int count1 = 0;
		for (int j=0; j < L.length; j++)
		{
			if (L.elem[i].total < L.elem[j].total)
			{
				count1 += 1;
			}
		}
		arr[i] = count1;//利用数组存储名次
	}
	    for (int a = 0; a <= L.length; a++)
		{
			for(int b=0;b<L.length;b++)
			 if(arr[b]==a)//当名次和序号对应时打印顺序表元素
			printf("%s是第%d名\t语文成绩为:%d\t数学成绩为:%d\t英语成绩为:%d\t总成绩为:%d\n", L.elem[b].name, a + 1, L.elem[b].Chinese, L.elem[b].Math, L.elem[b].English, L.elem[b].total);
		}
	return true;
}
int average(SqList& L)
{
	float A_Chinese=0, A_Math=0, A_English = 0;
	for (int i=0; i < L.length; i++)
	{
		A_Chinese += L.elem[i].Chinese;
		A_Math += L.elem[i].Math;
		A_English += L.elem[i].English;
	}
	printf("本次测试语文平均分为:%.2f\t数学平均分为:%.2f\t英语平均分为:%.2f\n", A_Chinese/3.0, A_Math/3.0, A_English/3.0);
	return true;
}

三、结果展示 

当输入学生信息个数小于0时会被认定为非法输入,将重新输入;

等于0时将会打印:录入学生信息个数为0

当录入学生成绩超过150时会要求重新输入学生成绩

完成输入后按照功能表依次实现功能

这是后面用VScode运行的结果

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值