首页 > 其他分享 >学生信息管理系统-C语言版

学生信息管理系统-C语言版

时间:2023-06-22 21:23:36浏览次数:49  
标签:index students scanf 学生 int printf 信息管理系统 C语言 void

环境

操作系统:Windows11

编译器:GCC

源代码

函数较多,自定义头文件,主文件引入即可

头文件:functions.h

头文件所对应的源文件:functions.c

主文件:学生信息管理系统.c

functions.h

#ifndef _FUNCTINOS_H_
#define _FUNCTINOS_H_

#define MAX_STU 100

typedef struct Students{
	char name[9], sex[5], StuID[21], class[31];
	int age;
	float score;
}stu;

#define LEN sizeof(stu)
stu students[MAX_STU];



//函数申明
void menu(); //打印菜单
void enter_info(); //录入信息
void delete_info(); //删除信息
void select_info(); //检索信息
void show_all(); //查看所有信息
void order_score(); //根据成绩排序
void insert_info(); //插入信息
void modify_info(); //修改数据

#endif

functions.c

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include "functions.h"

//打印菜单
void menu(){
	char *options[] = {"1.录入学生信息", "2.删除学生信息", "3.修改学生信息", "4.查询学生信息", "5.插入学生信息", "6.根据成绩排序", "7.查看所有记录", "8.清屏    ", "9.退出管理系统"};

	printf("\n\n\n");
	Sleep(1200);
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 3);

	printf("\t\t===============================================\n");
	printf("\t\t||\t\t学生信息管理系统\t     ||\n");
	printf("\t\t||-------------------------------------------||\n");
	for(int i=0; i<sizeof(options)/sizeof(options[0]); i++){
		printf("\t\t||\t\t");
		printf("%s", options[i]);
		printf("\t\t     ||\n");
	}
	printf("\t\t===============================================\n");
}



//读取数据
int read_info(){
	int index=0;
	FILE *fp = fopen("informations.txt", "r");
	if(fp == NULL){
		printf("没有文件,请先添加!\n");
		return 0;
	}
	while(!feof(fp))
		if(fread(&students[index], LEN, 1, fp) == 1)
			index++;
	fclose(fp);
	fp = NULL;

	return index;
}


//录入信息
void enter_info(){
	FILE *fp;
	int index;

	//如果没有文件,则先创建一个
	fp = fopen("informations.txt", "a+");
	if(fp == NULL){
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
		printf("创建文件失败!\n");
		return;
	}

	//录入数据
	index = read_info();
	if(index>100){
		system("color 0c");
		printf("文件已满,无法录入!\n");
		return;
	}
	printf("姓名:");
	scanf("%s", students[index].name);//printf("\n");

	printf("性别:");
	scanf("%s", students[index].sex);//printf("\n");
	if(strcmp(students[index].sex, "男")!=0 && strcmp(students[index].sex, "女")!=0){
		printf("应输入“男”或“女”!\n");
		return;
	}

	printf("年龄:");
	scanf("%d", &students[index].age);//printf("\n");
	if(students[index].age<0 || students[index].age>100){
		printf("年龄应在0~100之间!\n");
		return;
	}

	printf("学号:");
	scanf("%s", students[index].StuID);//printf("\n");
	for (int i = 0; i < index; ++i)
	{
		if(strcmp(students[i].StuID, students[index].StuID) == 0){
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
			printf("学号不能重复!\n");
			return;
		}
	}

	printf("班级:");
	scanf("%s", students[index].class);//printf("\n");

	printf("此次项目的成绩:");
	scanf("%f", &students[index].score);//printf("\n");

	fp = fopen("informations.txt", "a+");
	fwrite(&students[index], LEN, 1, fp);
	fclose(fp);
	fp = NULL;
}



//检索信息
void select_info(){
	char id[21];
	int index = read_info();
	if(index == 0){
		printf("文件中没有任何信息,请先添加!\n");
		return;
	}

	//根据学号检索信息
	printf("学号:");
	scanf("%s", id);
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 15);
	for(int i=0; i<index; i++){
		if(strcmp(id, students[i].StuID) == 0){
			printf("姓名:%s    ", students[i].name);
			printf("性别:%s    ", students[i].sex);
			printf("年龄:%d    ", students[i].age);
			printf("学号:%s    ", students[i].StuID);
			printf("班级:%s    ", students[i].class);
			printf("答辩成绩:%.1f\n", students[i].score);
			return;
		}
	}
	printf("查无此人!\n");
	return;
}


//删除信息
void delete_info(){
	FILE *fp;
	char id[21];
	int index = read_info();
	if(index == 0){
		printf("文件中没有数据,请先添加!\n");
		return;
	}

	//根据学号删除
	printf("学号:");
	scanf("%s", id);
	for(int i=0; i<index; i++){
		if(strcmp(id, students[i].StuID) == 0)
			break;
		else{
			if(i == index-1){
				printf("文件中没有该学号的相关信息!\n");
				return;
			}
		}

	}

	for(int i=0; i<index; i++){
		if(strcmp(id, students[i].StuID) == 0){
			for(int j=i; j<index; j++){
				students[j] = students[j+1];
			}
		}
	}

	//将删除后的信息更新到文件中
	fp = fopen("informations.txt", "w+");
	for(int i=0; i<index-1; i++)
		fwrite(&students[i], LEN, 1, fp);
	fclose(fp);
	fp = NULL;

	printf("删除成功!\n");
	return;
}


//插入信息
void insert_info(){
	FILE *fp;
	int position;
	int index = read_info();
	if(index==0){
		printf("文件中没有任何数据,请先添加!\n");
		return;
	}
	if(index>100){
		printf("文件已满,请删除后再插入!\n");
		return;
	}

	printf("插入位置:");
	scanf("%d", &position);

	for(int i=index; i>=position; i--){
		students[i] = students[i-1];
	}

	//录入信息
	printf("姓名:");
	scanf("%s", students[position-1].name);//printf("\n");

	printf("性别:");
	scanf("%s", students[position-1].sex);//printf("\n");
	if(strcmp(students[position-1].sex, "男")!=0 && strcmp(students[position-1].sex, "女")!=0){
		printf("应输入“男”或“女”!\n");
		return;
	}

	printf("年龄:");
	scanf("%d", &students[position-1].age);//printf("\n");
	if(students[position-1].age<0 || students[position-1].age>100){
		printf("年龄应在0~100之间!\n");
		return;
	}

	printf("学号:");
	scanf("%s", students[position-1].StuID);//printf("\n");
	for (int i = 0; i < index; ++i)
	{
		if(i==position-1)
			continue;
		else{
			if(strcmp(students[i].StuID, students[index].StuID) == 0){
				SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
				printf("学号不能重复!\n");
				return;
			}
		}

	}

	printf("班级:");
	scanf("%s", students[position-1].class);//printf("\n");

	printf("此次项目的成绩:");
	scanf("%f", &students[position-1].score);//printf("\n");

	fp = fopen("informations.txt", "w+");
	for(int i=0; i<index+1; i++)
		fwrite(&students[i], LEN, 1, fp);
	fclose(fp);
	fp = NULL;

	printf("插入成功!\n");
	return;
}


//根据成绩排序
void order_score(){
	int index = read_info();
	stu temp;

	if(index == 0){
		printf("文件中没有任何数据,请先添加!\n");
		return;
	}

	for(int i=0; i<index-1; i++)
		for(int j=0; j<index-1-i; j++)
			if(students[j].score < students[j+1].score){
				temp = students[j];
				students[j] = students[j+1];
				students[j+1] = temp;
			}
	//输出结果
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
	printf("%-9s    %-7s    %-5s    %-21s    %-30s    %-5s\n", 
		"姓名", "性别", "年龄", "学号", "班级", "成绩");
	for (int i = 0; i < index; i++){
		printf("%-9s    ", students[i].name);
		printf("%-7s    ", students[i].sex);
		printf("%-5d    ", students[i].age);
		printf("%-21s    ", students[i].StuID);
		printf("%-30s    ", students[i].class);
		printf("%-.1f", students[i].score);
		printf("\n");
	}
}


//打印文件中所有信息
void show_all(){
	int index = read_info();
	if(index == 0){
		printf("文件中没有任何数据,请先添加!\n");
		return;
	}

	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 14);
	printf("%-9s    %-7s    %-5s    %-21s    %-30s    %-5s\n", 
		"姓名", "性别", "年龄", "学号", "班级", "成绩");
	for (int i = 0; i < index; i++){
		printf("%-9s    ", students[i].name);
		printf("%-7s    ", students[i].sex);
		printf("%-5d    ", students[i].age);
		printf("%-21s    ", students[i].StuID);
		printf("%-30s    ", students[i].class);
		printf("%-.1f", students[i].score);
		printf("\n");
	}
	return;
}


//修改数据
void modify_name(stu *p){
	printf("修改后的姓名:");
	scanf("%s", p->name);
}
void modify_sex(stu *p){
	printf("修改后的性别:");
	scanf("%s", p->sex);
}
void modify_age(stu *p){
    printf("修改后的年龄:");
	scanf("%d", &(p->age));
	if(p->age<0 || p->age>100){
		printf("年龄的范围应在0~100之间!\n");
		return;
	}
}
int modify_StuID(stu *p, stu *students, int index, int demo){
	printf("修改后的学号:");
	scanf("%s", p->StuID);
	for (int i = 0; i < index; ++i)
	{
		if(i == demo)
			continue;
		else
			if(strcmp(p->StuID, (students+i)->StuID) == 0){
				SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
				printf("学号不能重复\n");
				return -1;
				break;
			}
	}
	printf("\n");
	return 0;
}
void modify_class(stu *p){
	printf("修改后的班级:");
	scanf("%s", p->class);
}
void modify_score(stu *p){
	printf("修改后的成绩:" );
	scanf("%f", &(p->score));
}
void modify_info(){
	FILE *fp;
	int index = read_info();
	char StuID[21];
	int demo, status, number;
	if(index == 0){
		printf("文件中没有任何数据,请先添加!\n");
		return;
	}

	printf("请输入学号:");
	scanf("%s", StuID);
	for(int i=0; i<index; i++){
		if(strcmp(StuID, students[i].StuID) == 0){
			demo = i;
			break;
		}
	}

	printf("1.修改姓名    2.修改性别    3.修改年龄    4.修改学号    5.修改班级    6.修改成绩\n");
	scanf("%d", &number);
	switch(number){
		case 1:modify_name(&students[demo]); break;
		case 2:modify_sex(&students[demo]); break;
		case 3:modify_age(&students[demo]); break;
		case 4:status=modify_StuID(&students[demo], students, index, demo); break;
		case 5:modify_class(&students[demo]); break;
		case 6:modify_score(&students[demo]); break;
		default:return;break;
	}
	if(status == -1){
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12);
		printf("学号重复!\n");
		return;
	}


	//将信息更新到文件中
	fp = fopen("./informations.txt", "w+");

	for(int i=0; i<index; i++)
		fwrite(&students[i], sizeof(stu), 1, fp);
	printf("修改成功!\n");

	fclose(fp);
	fp = NULL;
}

学生信息管理系统.c

#include "functions.h"
#include <stdio.h>
#include <windows.h>



int main(int argc, char const *argv[])
{
	int command;

	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 10);
	printf("\t\t\t     欢迎使用学生信息管理系统\n");
	printf("\t     作者:BrankYeen,博客:https://www.cnblogs.com/brankyeen\n");

	while(1){
		menu();
		while(1){
			fflush(stdin);
			printf("输入命令:");
			scanf("%d", &command);
			if(command>=1 && command<=9)
				break;
			else
				printf("请输入1~9的整数!\n");
		}

		switch(command){
			case 1:enter_info();break;
			case 2:delete_info();break;
			case 3:modify_info();break;
			case 4:select_info();break;
			case 5:insert_info();break;
			case 6:order_score();break;
			case 7:show_all();break;
			case 8:system("cls");break;
			case 9:return 0;break;
		}
	}
	return 0;
}

编译运行

cmd进入文件所在目录

gcc -fexec-charset=GBK 学生信息管理系统.c -o 学生信息管理系统.exe -include functions.h functions.c

标签:index,students,scanf,学生,int,printf,信息管理系统,C语言,void
From: https://www.cnblogs.com/brankyeen/p/17498362.html

相关文章

  • C语言三子棋项目(顺序逻辑-小白学习笔记)
    首先要确定游戏的基本框架简易来说,由进入游戏--->选择菜单--->进入游戏三部分组成应用在c语言项目中,我们通过功能来对文件进行区分,主函数main()内进入游戏,通过test函数加入我们的菜单,但这里meau()菜单选项我们不希望执行一次,因为如果玩家选择错误,将会导致程序无法进行。这里通过dowh......
  • C语言 大小端转换(16位)c51,ARM
    //C++#include<arpa/inet.h>uint32_thtonl(uint32_tbuffer);//32位uint16_thtons(uint16_tbuffer);//16位Linux上,无符号c++版 #define__SWP16(A)((((uint16)(A)&0xff00)>>8)|\(((uint16)(A)&0x00ff)......
  • 01-C语言基础语法
    目录一.C语言发展史二.数据类型三.常量和变量四.字符串和转义字符五.选择语句六.循环语句七.函数一.C语言发展史1963年ALGOL60作为C语言最早的模型,剑桥大学将其发展成为CPL(CombinedProgramingLanguage)。1967年,剑桥大学的MatinRichards对CPL语言进行了简......
  • 图的遍历——DFS, BFS(邻接矩阵,邻接表)——C语言描述
    图的遍历——DFS,BFS(邻接矩阵,邻接表)——C语言描述目录图的遍历——DFS,BFS(邻接矩阵,邻接表)——C语言描述0测试用例框架1图的深度优先遍历(DFS)1.1邻接矩阵(1)数据结构(2)代码(3)测试用例(4)打印结果1.2邻接表(1)数据结构(2)代码(3)测试用例(4)结果2图的广度度优先遍历(BFS)2.1队列(1)数据结构......
  • C语言中数组和指针
    (文章目录)前言本文将给大家带来C语言中非常重要的两个知识点,指针和数组。一、指针的概念指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,指针既然都用来存放地址了那就说明指针也是一个变量。二、指......
  • 自学C语言2023_6_21
    变量的作用域和生命周期: 作用域:变量的生效范围就是作用域局部变量的作用域:变量所在的局部范围(大括号内) 全局变量的作用域:整个工程其他.c文件的变量:需要使用extern声明一下变量  生命周期:变量的创建和销毁之间的时间段局部变量:进入局部范围生命开始,出局部范围生命......
  • 精通c语言中的指针-数组
    一维数组:intara[3]={1,2,3};printf("%d\n",ara):printf("%d\n",&ara):打印之后,发现ara和&ara两个值是一样的,为什么?按照我们学习的理解,&ara是取ara的地址,一个是地址,一个是值,不应该一样,那为什么打印出来会是一样的? 从汇编的角度可以解释这个问题:printf("%d\n",ara):......
  • C语言与C++不得不说的那点事
    说到C语言,就不得不说它的继承者——C++语言。众所周知,C++语言是在C语言的基础上,添加了面向对象、模板等现代程序设计语言的特性而发展起来的。两者无论是从语法规则上,还是从运算符的数量和使用上,都非常相似,所以我们常常将这两门语言统称为“C/C++”。虽然因为天然的血缘关系,导致两......
  • 精通c语言中的指针(精通c指针1)
    之前学c语言的时候,指针这一章学的半吊子,似是而非,最近经过学习,对指针有个更加深刻的理解。如果之前学过c指针,并且可以使用指针随心所欲操作内存中的任何数据,那么说明指针学好了,否则就是半吊子。如果之前学过指针,那最好忘记之前学过的所有概念,把指针当做一种新的类型来学习。这种......
  • 全面解读Objective-C语言及Cocoa特性——《Objective-C基础教程》
    媒体评论“这是我读过的最好的一本编程书。我从头到尾逐字逐句地读完了它,可读性真强啊!试问,现在有几本技术书能达到这种程度?”——Amazon读者评论“这本书结构清晰,逻辑性强,风格幽默……借助本书,你可以毫不费力地从一个初学者摇身一变升级为优秀的Objective-C编程人员。”——Ama......