欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C/C++:学生管理系统(适合初学者)

程序员文章站 2024-02-29 12:00:46
...

今天趁着没事做想写一个简单的控制台程序——学生管理系统

相信很多接触C/C++的初学者来说,学生管理系统无疑是检验是否学懂C/C++基本语法的最基本项目

下面开始简单介绍一下我的思路:

1.系统界面

2.实现增删查改功能

 

用到的相关知识:

1.结构体

2.链表

3.循环语句、判断语句

这里我要说明一点,可能看完我的程序会有点懵逼,我写了一个大题框架,具体的细节没有去抠,读者根据自己的需求来修改一下即可。

程序中定义了一个学生的结构体,使用结构体链表来存储学生数据(学的深的朋友可以尝试与数据库建立连接,把数据存储在数据库中),为了偷懒,我选择使用带头节点的单链表(用双链表操作更舒服一些)。

我把结构体写在StudentStruct.h中

//StudentStruct.h
 struct stu
{
	char stu_name[10]; //姓名
	int stu_age;  //年龄
	char stu_id[10]; //学生id
	int stu_grade;  //年级 1/2/3/4
	int stu_sort; //本科or研究生
	struct stu* next;
	
};

下面是程序的.c文件

#include <iostream>
#include<stdio.h>
#include<string.h>
#include"StudentStruct.h"

void welcome();
void list();
void add_info();
void delete_info();
void check_info();
void modify_info();

stu *Stu = NULL;
stu *head=NULL;
stu* temp = NULL;

int main()
{
	Stu = (stu*)malloc(sizeof(stu));
	Stu->next = NULL;
	head = Stu;
	welcome();
	while(1)
	list();
	return 0;

}

void welcome()
{
	printf("******************************************** \n");
	printf("\n");
	printf("Welcome to Student Administration System \n");
	printf("\n");
	printf("1.添加学生信息\n");
	printf("2.删除学生信息\n");
	printf("3.查询学生信息\n");
	printf("4.修改学生信息\n");
	printf("******************************************** \n");
}

void list()
{
	int i=0;
	scanf_s("%d",&i);
	switch (i)
	{
		case 1:
		{
			printf("add\n");
			add_info();
			break;
		}
		case 2:
		{
			printf("delete\n");
			delete_info();
			break;
		}
		case 3:
		{
			printf("check\n");
			check_info();
			break;
		}
		case 4:
		{
			printf("modify\n");
			modify_info();
			break;
		}
	default:
		break;
	}
}

void add_info()
{
	char name[10]; //姓名
	int age;  //年龄
	char id[10]; //学生id
	int grade;  //年级 1/2/3/4
	int sort; //本科or研究生
	printf("请输入学生姓名:");
	scanf_s("%s",name,sizeof(name));

	printf("请输入学生年龄:");
	scanf_s("%d", &age);

	printf("请输入学生学号:");
	scanf_s("%s", &id,sizeof(id));

	printf("请输入学生年级(1/2/3/4):");
	scanf_s("%d", &grade);

	printf("该学生为本科生输入0,研究生输入1:");
	scanf_s("%d", &sort);
	
	/*创建动态结点,形成链表*/
	temp = (stu*)malloc(sizeof(stu));
	temp->next = NULL;
	strcpy_s(temp->stu_name, name);
	strcpy_s(temp->stu_id, id);
	temp->stu_age = age;
	temp->stu_grade = grade;
	temp->stu_sort = sort;
	Stu->next = temp;
	Stu = temp;
	
	printf("添加成功,继续添加请按1,返回主菜单请按2:\n");
	int exit;
	scanf_s("%d",&exit);
	if (exit == 1)
		add_info();
	else
		welcome();

}

void delete_info()
{
	char name[10];
	stu* p,*q;
	p = head->next;
	q = head;
	int flag = 0;
	printf("请输入需要删除信息的学生姓名:");
	scanf_s("%s",name,sizeof(name));
	while (p != NULL&&flag==0)
	{
		if (strcmp(p->stu_name, name)) //如果不匹配
		{
			q = p;   //q指向前一个位置
			p = p->next;
		}
		else  //匹配成功,找到要删除的学生
		{
			q->next = p->next;
			free(p);
			flag = 1;
			printf("删除成功\n");
		}
	}
	int exit;
	printf("继续删除请按1,返回主菜单请按2:");
	scanf_s("%d",&exit);
	if (exit == 1)
		delete_info();
	else if (exit == 2)
		welcome();
	
}

void check_info()
{
	stu* p;
	p = head->next;
	int swi;
	printf("1.查询全部学生\n");
	printf("2.精确查询\n");
	printf("3.模糊查询\n");
	scanf_s("%d", &swi);


	if (1 == swi) //查询全部学生
	{
		printf("姓名\t 学号\t 年龄\t 学历\t 年级\n");
		while (p != NULL)
		{
			printf("%s\t %s\t %d\t %d\t %d\n", p->stu_name, p->stu_id, p->stu_age, p->stu_sort, p->stu_grade);
			p = p->next;
		}

	}
	else if (2 == swi) //精确查询,不考虑同名的情况
	{
		char name[10];
		int flag1 = 0;
		//stu* q;
		//q = head->next;
		printf("输入学生姓名:");
		scanf_s("%s", &name, sizeof(name));
		while (p != NULL && flag1 == 0)
		{

			if (strcmp(name, p->stu_name) == 0)
			{
				printf("姓名\t 学号\t 年龄\t 学历\t 年级\n");
				printf("%s\t %s\t %d\t %d\t %d\n", p->stu_name, p->stu_id, p->stu_age, p->stu_sort, p->stu_grade);
				flag1 = 1;
			}
			else
				p = p->next;
		}
	}

	else if (3 == swi) //模糊查询
	{
		int flag2;
		printf("1.查询全部本科生\n");
		printf("2.查询全部研究生\n");
		scanf_s("%d", &flag2);

		if (1 == flag2)
		{
			printf("姓名\t 学号\t 年龄\t 学历\t 年级\n");
			while (p != NULL)
			{
				if (p->stu_sort == 0)
				{
					printf("%s\t %s\t %d\t %d\t %d\n", p->stu_name, p->stu_id, p->stu_age, p->stu_sort, p->stu_grade);
					p = p->next;
				}
				else
					p = p->next;
			}
			

		}
		if (2 == flag2)
		{
			printf("姓名\t 学号\t 年龄\t 学历\t 年级\n");
			while (p != NULL)
			{
				if (p->stu_sort == 1)
				{
					printf("%s\t %s\t %d\t %d\t %d\n", p->stu_name, p->stu_id, p->stu_age, p->stu_sort, p->stu_grade);
					p = p->next;
				}
				else
					p = p->next;
			}
			
			
		}
	
	}
	int exit;
	printf("继续查询请按1,返回主菜单请按2:");
	scanf_s("%d", &exit);
	if (exit == 1)
		check_info();
	else if (exit == 2)
		welcome();
}

void modify_info()  //此处没有考虑名字相同时候的情况
{
	int  age, sort, grade;
	char name[10], id[10];
	stu* p;
	p = head->next;
	printf("输入需要修改的学生姓名:");
	scanf_s("%s", &name, sizeof(name));
	while (p != NULL)
	{
		if (strcmp(name, p->stu_name)==0) //找到学生
		{
			int flag;
			printf("请输入需要修改的项目:");
			printf("1.学号\t2.年龄\t3.学历\t4.年级\n");
			scanf_s("%d", &flag);
			if (flag == 1)
			{
				printf("请输入新学号:");
				scanf_s("%s", id, sizeof(id));
				strcpy_s(p->stu_id, id);
				printf("更新成功\n");
			}
			else if (flag == 2)
			{
				printf("请输入新年龄:");
				scanf_s("%d", &age);
				p->stu_age = age;
				printf("更新成功\n");
			}
			else if (flag == 3)
			{
				printf("请输入新学历(0本科生/1研究生):");
				scanf_s("%d", &sort);
				p->stu_sort = sort;
				printf("更新成功\n");
			}
			else if (flag == 4)
			{
				printf("请输入新年级:");
				scanf_s("%d", &grade);
				p->stu_grade = grade;
				printf("更新成功\n");
			}
			break;
		}
		else
		{
			p = p->next;
			if (p == NULL)
				break;
		}
	}
	int exit;
	printf("继续修改请按1,返回主菜单请按2:");
	scanf_s("%d", &exit);
	if (exit == 1)
		modify_info();
	else if (exit == 2)
		welcome();
}

经过我的测试,以上程序粘贴复制后可以直接运行。

希望可以帮助刚入门的小伙伴,看完不妨点个赞吧,谢谢啦。