课堂练习:用结构体数组做学生管理系统

本文介绍了一个C++程序,用于输入、显示和查找最高分学生信息。程序定义了SNode结构体,包含学号、姓名和成绩字段,并实现了Create、MaxScore和manu三个函数。Create函数用于输入学生信息,MaxScore函数通过冒泡排序找到最高分学生并显示,manu函数提供用户交互界面。程序中注意到了字符串不能直接赋值以及结构体排序的细节问题。
摘要由CSDN通过智能技术生成

请用typedef struct自定义学生结构类型SNode,包括学号(char Id[10])、姓名(char Name[8])、成绩(int Score),编程实现如下功能,禁止用全局变量,使用函数参数传递学生信息。
1.函数Create(SNode Stu[])功能:在键盘输入五位学生信息(学号、姓名、成绩)。
2.函数MaxScore(SNode Stu[])功能:输出最高成绩的学生信息。
3.主函数Main(),调用如上函数。

因为大一小学期做过类似的系统,所以使用了main、manu、show的结构来展示用户面板和详细信息。通过利用结构体数组,可以以一个用户块为单位,用一维数组把他们串联起来。
在这个过程中所发现的问题有:
1.MaxScore函数中,当我想要将stu[i].score直接排序的时候,结构体中剩下两个元素id和name不会以结构体整体为单位被移动,所以排序必须直接移动stu[i]整体。
2.Create函数中,发现字符串不能直接赋值,必须利用strcpy()函数拷贝数值到参数中。【strcpy函数在algorithm头文件中】
3.对清屏cls、退出程序exit的应用:system(“——”)。

#pragma warning(disable : 4996)
#include <stdio.h>
#include <iostream>
#include <algorithm>
#define MAX 10
using namespace std;


typedef struct SNode {
	char Id[10];
	char Name[8];
	int Score;
}SNode;


//SNode Create(char Id[10], char Name[8], int Score) {

	//SNode Stu;
	//Stu[i]->Id = Id;
	//报错:表达式必须是可修改的左值。
	//原因:字符串不能直接赋值。
	//strcpy(Stu.Id,Id);//strcpy表示拷贝该字符串
	//strcpy(Stu.Name,Name);
	//字符串不能,但是普通数字可以
	//Stu.Score = Score;
	//return Stu;

//}

void Show(int n, SNode stu[]) {
	
	printf("学号\t姓名\t成绩\n");
	for (int i = 0; i < n; i++) 
	{
		printf("%s\t%s\t%d\n",stu[i].Id, stu[i].Name, stu[i].Score);
	}

}

void MaxScore(int n,SNode Stu[]) {

	SNode w;
	for (int i = 0; i < n; i++) {
		for (int k = 0; k < n - i; k++) {
			if (Stu[k].Score < Stu[k + 1].Score) {
				w = Stu[k];
				Stu[k] = Stu[k + 1];
				Stu[k + 1] = w;
			}
		}
	}
	printf("学号\t姓名\t成绩\n");
	printf("%s\t%s\t%d\n", Stu[0].Id, Stu[0].Name, Stu[0].Score);

}

void manu(int n,SNode Stu[]) {
	int a;
	printf("您下面想进行的操作是:\n");
	//printf("1.查看学生信息\n");
	//printf("2.查看最高成绩的学生信息\n");
	//printf("输入-1退出\n");
	do {
		printf("1.查看学生信息\n");
		printf("2.查看最高成绩的学生信息\n");
		printf("输入-1退出\n");
		cin >> a;
		switch (a) {
		case 1:Show(n, Stu); break;
		case 2:MaxScore(n, Stu); break;
		default:
			printf("谢谢使用,再见!\n");
			system("exit");
		}
	} while (a != -1);

}

int main() {

	SNode Stu[MAX];
	int a = 1, i = 0, Score;
	char Id[10],Name[8];
	while(a!=-1){

		cout << "请输入学生信息(顺序:学号,姓名,成绩):" << endl;
		//cin >> Id >> Name >> Score;
		//Stu[i] = Create(Id, Name, Score);
		cin >> Stu[i].Id >> Stu[i].Name >> Stu[i].Score;
		cout << "录入学生信息成功!" << endl;
		i++;
		cout << "是否要继续输入学生信息(确认请输入1,退出请输入-1)" << endl;
		cin >> a;
		system("cls");

	}

	manu(i,Stu);

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

椰椰燕麦奶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值