C语言学生管理系统(附论文)

C语言学生管理系统(附论文)

系统功能说明:
(1)录入:操作添加一条新的学生记录项,包括新建数据、在指定记录前插入数据、追加数据操作。
(2)显示:显示所有的学生记录项。
(3)删除:删除一条已经存在的学生记录项。
(4)修改:改变学生记录项的一个或多个属性,并用新的记录项覆盖已经存在的记录项。
(5)查找:根据用户输入的学号进行查找,如果该学号存在则输出匹配到的数据,没有则给出提示。
(6)排序:根据学号进行排序的同时浏览数据,不会改变数据的原始排序。
(7)模糊查询:根据学号或者名字的其中某个关键字查询所有匹配到的记录
代码如下:

#include//studio 指 “stuandard input & output"(标准输入输出)(常用的函数如fopen()、fflush()、fwrite()、scanf()、fscanf()、fprintf()、sprintf()、perror())
#include//定义了一个变量类型、一个宏和各种操作字符数组的函数(常用的函数如sturcpy()、sturcat()、sturchr()、sturcmp()、sturlen()、sturcspn()、sturdup()、sturerror()、sturncmp())
#include//定义了五种类型、一些宏和通用工具函数(常用的函数如malloc()、calloc()、realloc()、free()、systuem()、atoi()、atol()、rand()、srand()、exit())


#pragma warning (disable:4996) //消除警告(关闭VS2010的安全警告, 因为VS2020是C++软件)

#define N 200//定义标识符 N为200

typedef struct student//创建一个结构体, 结构体包含以下成员
{
	long long int ID;		 //学号
	char Name[10];			//姓名
	int Age;				//年龄
	char Sex[4];			//性别
	char Birthday[20];		//出生年月
	char Site[20];			//地址
	char Phone[20];			//电话
	char Notes[20];			//备注
}student;//struct student定义为student
student stu[N];//定义结构体数组, 存储上限为N

int Num = 0;//建立全局变量,Num为当前系统的录入学生信息的总数

// 函数声明 
//学生信息 == 系统关键词
void Save();//学生信息保存函数
void Read();//学生信息读取函数
void Show();//学生信息菜单函数
void Input();//学生信息输入函数
void All();//学生信息浏览函数
void Que();//学生信息查找函数
void Mod();//学生信息修改函数
void Del();//学生信息删除函数
void sort();//学生信息排序函数
void FuzzyQuery();//模糊查询 

//主函数 
int main() {
    // ...
	 Read();//调用学生信息读取函数 
	 int n = 1; 
    while (n != 0) {
    	
        Show(); //调用显示学生信息管理系统菜单函数
        
        scanf("%d", &n);

        switch (n) {
            case 0:
                return 0;//直接退出系统 
            case 1:
                Input();//输入学生信息 
                break;
            case 2:
                All();//输出所有学生信息 
                break;
            case 3:
                Que(); //输入学号查询学生信息 
                break;
            case 4:
                Mod();// 修改学生信息(修改前根据学号查询到某个学生,再确认是否修改) 
                break;
            case 5:
                Del();// 删除某个学生的信息(删除前先根据学号查询到某个学生,再确认是否删除) 
                break;
            case 6:
                sort();// 冒泡排序(根据学号进行降序排序) 
                break;
            case 7:
                FuzzyQuery(); //根据学号或者姓名的关键字查询所有匹配到的信息 
                break;
            default:
                printf("输入错误,按任意键返回主菜单");
                break;
        }

        Save();//保存学生信息 
        system("pause");
        system("cls");
    }

    // ...
}

//将int型转换为string 
char* to_string(int num) {
    // 分配足够大的动态内存来存储结果字符串
    int str_size = snprintf(NULL, 0, "%d", num);
    char* str = (char*)malloc((str_size + 1) * sizeof(char));

    // 将整数转换为字符串
    sprintf(str, "%d", num);

    return str;
}

//模糊查询 
void FuzzyQuery() {
    char keyword[20];
    printf("请输入学号或姓名的关键字:");
    scanf("%s", keyword);

    int found = 0; // 标记是否找到匹配的学生信息

    printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n", "学号", "姓名", "性别", "年龄", "出生年月", "地址", "电话", "备注");
	//strstr()函数用于:查找子字符串  返回指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回空指针 
	//这个函数的功能是有一个模式串,在主串中找模式串。如果主串中有模式串,返回的则是主串中模式串的的第一次出现的位置
    for (int i = 0; i < Num; i++) {
        if (strstr(stu[i].Name, keyword) != NULL || strstr(to_string(stu[i].ID),keyword ) != NULL) {//这里先要调用to_string()函数把学号转换为string类型 
        	//to_string(ID); 
            printf("%-10lld%-10s%-10s%-10d%-10s%-10s%-10s%-10s\t\n", stu[i].ID, stu[i].Name, stu[i].Sex, stu[i].Age, stu[i].Birthday, stu[i].Site, stu[i].Phone, stu[i].Notes);
            found = 1;
        }
    }

    if (!found) {
        printf("未找到匹配的学生信息!\n");
    }
}



//学生信息保存函数
void Save() {
	int i = 0, j = 0, k = 0;
	FILE* fp = fopen("学生信息数据.txt", "w+");//打开文件+清除文件内信息
	for (i = 0; i < Num; i++) {//从1循环到Num, 将学生数据逐个录入 "学生信息数据.txt" 文本内
		fprintf(fp, "%lld %s %s %d %s %s %s %s\n", stu[i].ID, stu[i].Name, stu[i].Sex, stu[i].Age, stu[i].Birthday, stu[i].Site, stu[i].Phone, stu[i].Notes);
	}
	fclose(fp);//关闭文件
}


//学生信息读取函数
void Read() {
	FILE* file = fopen("学生信息数据.txt", "r");//以只读方式打开文件
	if (file == NULL) {//当文件不存在,则为真
		return;//返回上一个函数
	}
	Num = 0;//Num为当前系统的录入学生信息的总数, 读入文件前将总数置为0,以防有残留数据
	while (fgetc(file) != EOF) {//当下一个字符不为空时
		fseek(file, -1, 1);//每一次循环, 定位在当前行的-1位置,也就是最左边的位置
		fscanf(file, "%d %s %s %d %s %s %s %s\n", &stu[Num].ID, stu[Num].Name, stu[Num].Sex, &stu[Num].Age, stu[Num].Birthday, stu[Num].Site, stu[Num].Phone, stu[Num].Notes);
		Num++;//每一次循环,学生信息的总数 + 1
	}
	fclose(file);//关闭
}


//学生信息管理系统菜单函数
void Show() {
	printf("学生信息管理系统:\n");
	printf("********************************\n");
	printf("* 请择操作序号:               *\n");
	printf("* 1 输入学生信息               *\n");
	printf("* 2 输出学生信息               *\n");
	printf("* 3 查询学生信息               *\n");
	printf("* 4 修改学生信息               *\n");
	printf("* 5 删除学生信息               *\n");
	printf("* 6 排序学生信息               *\n");
	printf("* 7 模糊查询                   *\n");
	printf("* 0 退出系统                   *\n");
	printf("********************************\n");
	printf("请输入数字进入对应功能:");
}


//学生信息输入函数
void Input() {
	int i = 0, j = 0, k = 0, flag = 0;//flag用来输入学号, j用来遍历输出查找学号是否重复
	printf("请输入学号:");
	scanf("%d", &flag);
	for (j = 0; j < Num; j++) {//判断学号是否查重
		if (stu[j].ID == flag) {
			printf("系统已有该学号!");
			return;
		}
	}
	
	stu[Num].ID = flag;//学号不重复则赋值该结构体
	printf("姓名:");
	scanf("%s", stu[Num].Name);
	printf("性别:");
	scanf("%s", stu[Num].Sex);
	printf("年龄:");
	scanf("%d", &stu[Num].Age);
	printf("出生年月:");
	scanf("%s", stu[Num].Birthday);
	printf("地址:");
	scanf("%s", stu[Num].Site);
	printf("电话:");
	scanf("%s", stu[Num].Phone);
	printf("备注:");
	scanf("%s", stu[Num].Notes);
	Num++;
	printf("学生信息录入成功,当前共有学生信息:%d。\n", Num);
}


//学生信息浏览函数
void All() {
	int i = 0, j = 0, k = 0;
	printf("----------------------------------------------------\n");
	printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n", "名次", "学号", "姓名", "性别", "年龄", "出生年月", "地址", "电话", "备注");
	for (i = 0; i < Num; i++) {//输出结构体数组里的所有信息
		printf("%-10d%-10d%-10s%-10s%-10d%-10s%-10s%-10s%-10s\t\n", i + 1, stu[i].ID, stu[i].Name, stu[i].Sex, stu[i].Age, stu[i].Birthday, stu[i].Site, stu[i].Phone, stu[i].Notes);//浏览数据
	}
	printf("----------------------------------------------------\n");

}

//学生信息查找函数
void Que()
{
	int i = 0, j = 0, k = 0;
	printf("请输入学号:");
	scanf("%d", &j);
	for (i = 0; i < Num; i++)
	{
		if (j == stu[i].ID)
		{
			printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n", "学号", "姓名", "性别", "年龄", "出生年月", "地址", "电话", "备注");
			printf("%-10d%-10s%-10s%-10d%-10s%-10s%-10s%-10s\t\n", stu[i].ID, stu[i].Name, stu[i].Sex, stu[i].Age, stu[i].Birthday, stu[i].Site, stu[i].Phone, stu[i].Notes);//浏览数据
			k = 1;
		}
	}
	if (k == 0) {//没有找到数据则给出提示
		printf("未找到学生信息!\n");
		return;
	}
}


//学生信息修改函数
void Mod() {
	int i = 0, j = 0, k = 0;
	long long int flag = 0;
	static char choice;
	printf("请输入学号:");
	scanf("%lld", &flag);
	for (i = 0; i < Num; i++) {
		if (flag == stu[i].ID) {
			printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n", "学号", "姓名", "性别", "年龄", "出生年月", "地址", "电话", "备注");
			printf("%-10d%-10s%-10s%-10d%-10s%-10s%-10s%-10s\n", stu[i].ID, stu[i].Name, stu[i].Sex, stu[i].Age, stu[i].Birthday, stu[i].Site, stu[i].Phone, stu[i].Notes);//浏览数据
			printf("是否修改此数据(y/n):");
			scanf("%s", &choice);
			if (choice == 'y' || choice == 'Y')
			{
				printf("学生信息修改:\n");
				printf("********************************\n");
				printf("* 请择操作序号:               *\n");
				printf("* 1 修改学生姓名               *\n");
				printf("* 2 修改学生性别               *\n");
				printf("* 3 修改学生年龄               *\n");
				printf("* 4 修改学生出生年月           *\n");
				printf("* 5 修改学生地址               *\n");
				printf("* 6 修改学生电话               *\n");
				printf("* 7 修改学生地址               *\n");
				printf("* 0 返回上一页                 *\n");
				printf("********************************\n");
				printf("请输入数字进入对应修改功能:");
				scanf("%d", &k);
				switch (k)//选择
				{
				case 0:
					return;//返回上一页
				case 1:
					printf("请输入姓名:");
					scanf("%s", stu[i].Name);
					break;
				case 2:
					printf("请输入性别:");
					scanf("%s", stu[i].Sex);
					break;
				case 3:
					printf("请输入年龄:");
					scanf("%d", &stu[i].Age);
					break;
				case 4:
					printf("请输入出生年月:");
					scanf("%s", stu[i].Birthday);
					break;
				case 5:
					printf("请输入地址:");
					scanf("%s", stu[i].Site);
					break;
				case 6:
					printf("请输入电话:");
					scanf("%s", stu[i].Phone);
					break;
				case 7:
					printf("请输入备注:");
					scanf("%s", stu[i].Notes);
					break;
				default:
					printf("输入错误, 按任意键返回上一页\n");
					return;
				}
				printf("修改成功!\n");
				return;
			}
			else {
				printf("修改取消!\n");
				return;
			}
		}
	}
	printf("没有找到学生信息\n");
}

//学生信息删除函数
void Del() {
	int i = 0, j = 0, k = 0;
	printf("\n请输入学号:");
	scanf("%d", &j);
	for (i = 0; i < Num; i++) {
		if (j == stu[i].ID)
		{
			printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n", "学号", "姓名", "性别", "年龄", "出生年月", "地址", "电话", "备注");
			printf("%-10d%-10s%-10s%-10d%-10s%-10s%-10s%-10s\t\n", stu[i].ID, stu[i].Name, stu[i].Sex, stu[i].Age, stu[i].Birthday, stu[i].Site, stu[i].Phone, stu[i].Notes);//浏览数据
			printf("是否删除此数据(y/n):");
			static char choice;
			scanf("%s", &choice);
			if (choice == 'y' || choice == 'Y') {
				for (; i < Num - 1; i++)//将i+1覆盖i中, 循环
					stu[i] = stu[i + 1];
				Num--;//删除后数量-1
				printf("删除成功!\n");
			}
			else {
				printf("删除取消!\n");
			}
		}
	}
}

//学生信息排序函数
void sort()
{
	int i = 0, j = 0, k = 0;
	student stu2[N];//定义临时结构体数组, 存储上限为N
	for (i = 0; i < Num; i++) {//将数据传到stu2里
		stu2[i] = stu[i];
	}
	for (i = 0; i < Num; i++) {//冒泡排序
		for (j = i; j < Num; j++)
			if (stu2[i].ID < stu2[j].ID) {

				student t = stu2[i];
				stu2[i] = stu2[j];
				stu2[j] = t;
			}
	}
	printf("%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s%-10s\n", "名次", "学号", "姓名", "性别", "年龄", "出生年月", "地址", "电话", "备注");
	for (i = 0; i < Num; i++)
	{
		printf("%-10d%-10d%-10s%-10s%-10d%-10s%-10s%-10s%-10s\t\n", i + 1, stu2[i].ID, stu2[i].Name, stu2[i].Sex, stu2[i].Age, stu2[i].Birthday, stu2[i].Site, stu2[i].Phone, stu2[i].Notes);//浏览数据
	}
	printf("排序成功!\n");
}




















你可能感兴趣的:(c语言,开发语言)