【C语言实战项目5——结构体以及应用】

学生管理系统结构体问题

项目功能需求

本系统演示如何使用结构体如何存储复杂的数据结构(学生信息),并结合数组操作一定数量的对象(学生人数的确定),不涉及变化的学生人数和数据的物理储存操作,输出的学生的信息的图如图所示:
输出的学生的信息的图

知识点分析

程序处理的对象是学生,由于每个学生有姓名,性别等若干属性,所以属于复杂的数据类型,可以使用结构体的处理。
学生人数的确定,并且程序的运行中不能要求改变,可以考虑用数组介意储存。

  • 通过实验可达到如下目标:
    (1)进一步掌握数据导入声明和使用
    (2)掌握结构体的声明,结构体的变量声明和赋值
    (3)掌握结构体的成员的访问
    (4)掌握结构体数组的使用
    (5)使用结构体处理复杂的数据结构

算法思想

(1)学生对象包含学学号,姓名,年龄,成绩等若干属性,因此应该宏定义一个结构体。同时,其属性“成绩”包含三个科目的成绩,英语,高数,C语言。故成绩属于复合属性,应考虑其定义一个结构体,即学生结构体中嵌套另一个结构体
(2)学生人数的确定,宏定义一个数组,并且不会发生任何变化
(3)程序包括输入学生信息,显示操作菜单,排序,显示信息等功能,这些功能相对独立,根据结构化,模块化的编程思想,应该将他们单独编写函数,除了输入学生下信息值运行一次以外,其他都应该放到训话体当中反复操作。
(4)程序与用户交互中有不少接受用户的输入环节,如:选择菜单的项,选择排序等,考虑到用户可能输入错误,并且可能多次出错,所以也应该设置无线循环,当输入错误的时候,给予适当的提示,并继续显示操作菜单,知道用户选择一个正确的交互为止。
(5)排序操作:经典的排序算法包括快速排序,归并排序,插入排序,冒泡排序等,由于参与的排序的数量不大,所以结合时间复杂度和空间复杂度上不做过多的考虑,就采用冒泡的算法及逆行排序。

系统流程图

学生管理系统流程图

图1学生管理系统流程图

项目实现

学生管理系统项目实现
学生管理系统项目实现

运行效果图:
学生管理系统运行效果图
学生管理系统运行效果图

在这里插入图片描述

项目扩展

(1)如果对输入的子覅长度(如学号长度必须为12位,数字构成)类型(成绩必须为整数)范围(成绩范围必须是0~100)等加以合法性的验证,该如何完善程序
(2)如果要求可以根据学号,姓名等不同的信息进行查询,并显示查询的结果,该如何完善程序
(3)如果增加删除功能(根据学号删除相应的学生),该如何完善程序
(4)如果学生的人数不确定即在程序运行时临时确定或根据操作人员的实际输入去确定,该如何处理
(5)一次处理完成,退出程序后,再次运行程序,上一次的输入的数据还在吗?如果希望不在重新输入数据或者继续上次数据的基础上进行操作,该如何处理?

拓展项目1项目实现和运行效果图:

拓展项目1项目实现
拓展项目1运行效果图

项目小结

学习结构体的时候,看了相关的视频,懂得如何使用结构体,如何定义一个结构体,也知道代码时什么意思,但是轮到自己谢=些就不会,不知道该怎么去定义,也不知道该怎么用,包括后面的链表也是这样,懂代码什么意思,怎么用的,自己写一个程序就不会,所以还是基础不牢,需要每天都练习,不能停止,一定要每天都能看C语言,基础基础加强。

参考文献

《C语言综合项目实战》 科学出版社。

代码

 
 
#define _CRT_SECURE_NO_WARNINGS
 
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include <time.h>
 
 
int studentDisplayMenu();
int CPractise5MainDisplayMenu();
int trainDisplayMenu();
 
//学生信息登记问题菜单
void studentRegisterwenti();
//购买火车票问题菜单
void buyTicketwenti();
//图书信息系统问题的菜单
void bookManagewenti();
 
//学生管理系统声明
void manageStudent();
//学生管理系统问题扩展声明
void  manageStudentkz();
//火车票购票系统声明
void BuyTicket();
//火车票购票系统声明扩展
void BuyTicketkz();
 
//实战五菜单
void HandlePractise5()
{
   
	int key;
	for (;;)
	{
   
		key = CPractise5MainDisplayMenu();
		switch (key)
		{
   
		case 1:
			studentRegisterwenti();
			break;
		/*case 2:
			buyTicketwenti();
			break;
		case 3:
			bookManagewenti();
			break;*/
		case 4:
			return;
		case 0:
			printf("\n*******谢谢你的使用,欢迎多提意见****!\n");
			exit(0);
		default:
			printf("对不起,你输入有误!\n");
			break;
		}
	}
}
 
 
 
//实战五菜单显示函数
int CPractise5MainDisplayMenu()
{
   
	int key;
	/*system("CLS");*/
	printf("******************实战五功能显示菜单菜单*****************\n");
	printf("************* 1.项目1-学生信息登记系统问题 ********\n");
	printf("************* 2.项目2-购买火车票问题 ********\n");
	printf("************* 3.项目3-图书管理系统问题 ********\n");
	printf("**************4.返回上一步********\n");
	printf("*****************0.退出系统****************:");
	printf("******************************************\n");
	printf("请选择功能号(1或2或3或4或0:");
	printf("                                           \n");
	printf("                                           \n");
	printf("                                           \n");
 
	scanf_s("%d", &key);
	while (key < 0 || key>4)
	{
   
		printf("\n输入有误,请重新输入完成对应的操作\n请输入:");
		scanf_s("%d", &key);
	}
	return key;
 
}
 
 
 
//学生信息登记系统问题菜单
void studentRegisterwenti()
{
   
	int key;
	for (;;)
	{
   
		key = studentDisplayMenu();
		switch (key)
		{
   
		case 1:
			manageStudent();
			break;
		case 2:
			manageStudentkz();
			break;
		case 3:
			return;
		case 0:
			printf("\n*******谢谢你的使用,欢迎多提意见****!\n");
			exit(0);
		default:
			printf("对不起,你输入有误!\n");
			break;
		}
	}
}
 
//学生管理系统问题菜单页面显示
int studentDisplayMenu()
{
   
	int key;
	/*system("CLS");*/
	printf("******************学生管理系统问题菜单*****************\n");
	printf("************* 1.学生管理系统基础问题 ********\n");
	printf("************* 2.扩展问题 ********\n");
	printf("**************3.返回上一步********\n");
	printf("*****************0.退出系统****************:");
	printf("******************************************\n");
	printf("请选择功能号(1或2或3或0:");
	printf("                                           \n");
	printf("                                           \n");
	printf("                                           \n");
 
	scanf_s("%d", &key);
	while (key < 0 || key>4)
	{
   
		printf("\n输入有误,请重新输入完成对应的操作\n请输入:");
		scanf_s("%d", &key);
	}
	return key;
}
 
 
#define N 3
#define IDLEN 13
#define NAMELEN 11
#define SEXLEN 5	//性别
 
struct Score
{
   
	int cp;
	int english;
	int math;
};
 
typedef struct Stu
{
   
	char id[IDLEN];
	char name[NAMELEN];
	char sex[SEXLEN];
	int age;
	struct Score score;
	double avg;
}student;
 
student stu[N];		//原始输入学生的信息
student sorted[N];	//排序操作学生的信息
static int choice = 0;
static int dir = 0;
static int i = 0;
 
//各级菜单调用
void InputStudent();
void Meau();
void GetOrderDir();
void SortStudent();
void OutputStudent(student s[]);
 
void manageStudent() {
   
	InputStudent();
	while (1) {
   
		Meau();
		if (0 == choice) {
   
			printf("谢谢使用,再见\n");
			return;
		}
		else if (9 == choice) {
   
			dir = 1;
			OutputStudent(stu);
		}
		else {
   
			getchar();
			GetOrderDir();
			if (0 == dir)
				continue;
			if (1 == dir || 2 == dir) {
   
				SortStudent();
				OutputStudent(sorted);
			}
		}
	}
}
 
void InputStudent() {
   
	for (i = 0; i < N; i++) {
   
		fflush(stdin);
		printf("\n请输入第%d/%d个学生的信息\n", i + 1, N);
		printf("============================\n");
		printf("\n请输入该学生学号(12个字符以内):");
		getchar();
		gets_s(stu[i].id);
		stu[i].id[IDLEN - 1] = '\0';
		printf("请输入该学生姓名(10个字符以内):");
		getchar();
		gets_s(stu[i].name);
		stu[i].name[NAMELEN - 1] = '\0';
		printf("请输入该学生性别(4个字符以内):");
		getchar();
		gets_s(stu[i].sex);
		stu[i].sex[SEXLEN - 1] = '\0';
		printf("请输入该学生的年龄(整数):");
		scanf_s("%d", &stu[i].age);
		printf("请输入该学生《C语言》成绩(整数):");
		scanf_s("%d", &stu[i].score.cp);
		while ((stu[i].score.cp >= 0 && stu[i].score.cp <= 100) != 1)
		{
   
			printf("成绩不在0到100之间\n");
			printf("请重新输入该学生《C语言》成绩(整数):\t");
			scanf_s("%d", &stu[i].score.cp);
		}
		printf("请输入该学生《英语》成绩(整数):");
		scanf_s("%d", &stu[i].score.english);
		while ((stu[i].score.english >= 0 && stu[i].score.english <= 100) != 1)
		{
   
			printf("成绩不在0到100之间\n");
			printf("请重新输入该学生《英语》成绩(整数):\t");
			scanf_s("%d", &stu[i].score.english
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值