C语言的学生信息管理系统练习

自学C语言后自己编写的一个学生信息管理系统 ,虽然很简单,但是遇到一些问题。之前写过一些小程序,都很顺利,当开始写一些稍微有一点规模的程序后,就会遇到各种各样的问题。学习还是要多实践,以后要多写一些大规模的程序,这样才能多发现问题和不足,才能更好更快的成长。

头文件

#pragma once
#ifndef MYSYSTEM_H_
#define MYSYSTEM_H_

#define SIZENAME 20
#define SIZESEX 6

//定义学生数据结构
typedef struct Stu
{
	int number;					//学号
	char name[SIZENAME];	 	//姓名
	char sex[SIZESEX];			//性别
	int age;			    	//年龄
	double score;				//成绩
}Student;

//创建学生链表
struct ListNode
{
	Student stu;
	struct ListNode * next;
};
struct ListNode * headnode ;

//读取文件
void readFile(void);
//菜单显示
void showMenu(void);
//获得选择
int getChoice(int n);
//清除字符
void clear(void);
//获取姓名和性别
char * s_gets(char * st, int n);
//添加学生信息
void addInfo(void);
//删除学生信息
int deletInfo(void);
//查找学生信息
struct ListNode * searchInfo(void);
//修改学生信息
void modifyInfo(void);
//保存学生信息到文件
void saveInfo(void);
//查看所有信息
void allInfo(void);
//清理缓存
void clearSpace(void);
//暂停,按任意键继续
inline static void pause(void)
{
	while (getchar() != '\n')
		continue;
}
//延时函数
void delay(int n);

#endif

函数定义

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
#include"mysystem.h"

//extern struct ListNode * headnode;
/***************************************
功能:读取文件,将文件数据存入链表中
****************************************/
void readFile(void)
{
	FILE * fp;
	struct ListNode * current, *temp;
	current = NULL;

	if ((fp = fopen("student.dat", "rb")) == NULL)
	{
		fprintf(stderr, "\n\t------------打开文件失败--------------\n");
		pause();
		return;
	}
	while (!feof(fp))
	{
		if (ferror(fp))
		{
			fprintf(stderr, "\n\t------------读取文件错误------------\n");
			delay(3);
			break;
		}
		temp = (struct ListNode *)malloc(sizeof(struct ListNode));
		if (!(fread(&(temp->stu), sizeof(Student), 1, fp)))
			break;
		temp->next = NULL;
		if (headnode == NULL)
		{
			headnode = temp;
			current = headnode;
			printf("\t学号\t姓名\t性别\t年龄\t成绩\n");
		}
		else
		{
			current->next = temp;
			current = current->next;
		}
			printf("\t%d\t%s\t%s\t%d\t%.2lf\n", current->stu.number, current->stu.name, current->stu.sex,
				current->stu.age, current->stu.score);
	}
	pause();
	if (fclose(fp))
		fprintf(stderr, "Can't close file!\n");
}
/***************************************
功能:显示菜单
****************************************/
void showMenu(void)
{
	printf("------------------学生管理系统------------------\n");
	printf("\t\t1.添加学生信息\n");
	printf("\t\t2.删除学生信息\n");
	printf("\t\t3.查找学生信息\n");
	printf("\t\t4.修改学生信息\n");
	printf("\t\t5.保存学生信息\n");
	printf("\t\t6.查看所有学生信息\n");
	printf("\t\t7.退出\n");
	printf("------------------------------------------------\n");
}
/***************************************
功能:读取选项
****************************************/
int getChoice(int n)
{
	int choice;
	printf("请输入您的选择:");
	while (1)
	{
		if (scanf_s("%d", &choice))
		{
			clear();
			if (choice < 1 || choice>n)
			{
				printf("请选择1-%d:", n);
				continue;
			}
			else
				return choice;
		}
		else
		{
			printf("输入出错,请选择1-%d:", n);
			clear();
		}
	}
}
/***************************************
功能:清除多余的字符
****************************************/
void clear(void)
{
	while (getchar() != '\n')
		continue;
}
/***************************************
功能:获取字符串
****************************************/
char * s_gets(char * st, int n)
{
	char * ret_val;
	char * find;

	ret_val = fgets(st, n, stdin);
	if (ret_val)
	{
		find = strchr(st, '\n');
		if (find)
			*find = '\0';
		else
			clear();
	}
	return ret_val;
}
/***************************************
功能:添加学生的信息
****************************************/
void addInfo(void)
{
	struct ListNode * new;
	struct ListNode * current;
	new = (struct ListNode *)malloc(sizeof(struct ListNode));
	//学号、姓名、性别、年龄、成绩
	printf("请输入学号:");
	scanf_s("%d", &new->stu.number);
	clear();
	printf("请输入姓名:");
	s_gets(new->stu.name, SIZENAME);
	printf("请输入性别:");
	s_gets(new->stu.sex, SIZESEX);
	printf("请输入年龄:");
	scanf_s("%d", &new->stu.age);
	clear();
	printf("请输入成绩:");
	scanf_s("%lf", &new->stu.score);
	clear();
	new->next = NULL;
	if (headnode == NULL)
		headnode = new;
	else
	{
		current = headnode;
		while (current->next)
		{
			current = current->next;
		}
		current->next = new;
	}
}
/***************************************
功能:删除学生的信息
****************************************/
int deletInfo(void)
{
	int number;
	struct ListNode * Pre, *Current, *Next;
	if (headnode == NULL)
	{
		printf("没有信息!\n");
		pause();
	}
	else
	{
		printf("请输入学号:");
		scanf_s("%d", &number);
		clear();
		Current = headnode;
		Pre = headnode;
		if (headnode->stu.number == number)  //判断头结点数据
		{
			headnode = headnode->next;
			free(Current);
			return 1;
		}
		while (Current)
		{
			if (Current->stu.number == number)
				break;
			Pre = Current;
			Current = Current->next;
		}
		if (Current == NULL)
		{
			printf("无此学号信息!\n");
			pause();
		}
		else
		{
			Next = Current->next;
			free(Current);
			Pre->next = Next;
			return 1;
		}
	}
	return 0;
}
/***************************************
功能:查找学生的信息
****************************************/
struct ListNode * searchInfo(void)
{
	int number;
	struct ListNode * Current;
	Current = headnode;
	if (headnode == NULL)
	{
		printf("没有信息!\n");
		pause();
	}
	else
	{
		printf("请输入学号:");
		scanf_s("%d", &number);
		clear();
		while (Current && (Current->stu.number != number))
			Current = Current->next;
		if (Current == NULL)
		{
			printf("查无此学号!\n");
			pause();
		}
	}
	return Current;
}
/***************************************
功能:修改学生的信息
****************************************/
void modifyInfo(void)
{
	int choice;
	struct ListNode * search;

	search = searchInfo();
	if (search)
	{
		system("cls");
		printf("学生原信息:\n");
		printf("  学号        姓名        性别   年龄  成绩\n");
		printf("%6d %15s %7s %5d %6.2lf\n", search->stu.number, search->stu.name, search->stu.sex,
			search->stu.age, search->stu.score);
		/*修改菜单*/
		while (1)
		{
			printf("***************************************\n");
			printf("请选择您需要修改的内容:\n");
			printf("1.学号      2.姓名      3.性别\n");
			printf("4.年龄      5.成绩      6.退出\n");
			printf("***************************************\n");
			choice = getChoice(6);
			switch (choice)
			{
			case 1:
				printf("请输入学号:");
				scanf_s("%d", &search->stu.number);
				clear();
				break;
			case  2:
				printf("请输入姓名:");
				s_gets(search->stu.name, SIZENAME);
				break;
			case 3:
				printf("请输入性别:");
				s_gets(search->stu.sex, SIZESEX);
				break;
			case 4:
				printf("请输入年龄:");
				scanf_s("%d", &search->stu.age);
				clear();
				break;
			case 5:
				printf("请输入成绩:");
				scanf_s("%lf", &search->stu.score);
				clear();
				break;
			case 6:goto ENDMODIFY;
			}
			system("cls");
			printf("修改后的学生信息:\n");
			printf("  学号        姓名        性别   年龄  成绩\n");
			printf("%6d %15s %7s %5d %6.2lf\n", search->stu.number, search->stu.name, search->stu.sex,
				search->stu.age, search->stu.score);
		}
	ENDMODIFY:
		system("cls");
		printf("\n\t------------修改成功-----------\n");
		delay(5);  //延时
	}
}
/***************************************
功能:保存学生的信息
****************************************/
void saveInfo(void)
{
	FILE * fp;
	struct ListNode * current = NULL;

	if ((fp = fopen("student.dat", "wb")) == NULL)
	{
		fprintf(stderr, "打开文件失败!\n");
		return;
	}
	current = headnode;
	while (current)
	{
		fwrite(&(current->stu), sizeof(Student), 1, fp);
		current = current->next;
	}
	if (fclose(fp))
		fprintf(stderr, "Can't close file!\n");
}
/***************************************
功能:查看所有学生信息
****************************************/
void allInfo(void)
{
	struct ListNode * Current;

	Current = headnode;
	if (headnode == NULL)
	{
		printf("\n\t------------没有信息-------------\n");
		return;
	}
	printf("  学号        姓名        性别   年龄  成绩\n");
	while (Current)
	{
		printf("%6d %15s %7s %5d %6.2lf\n", Current->stu.number, Current->stu.name, Current->stu.sex,
			Current->stu.age, Current->stu.score);
		Current = Current->next;
	}
}
/***************************************
功能:清理链表内存
****************************************/
void clearSpace(void)
{
	struct ListNode * Current, *Next;
	Current = headnode;
	while (Current)
	{
		Next = Current->next;
		free(Current);
		Current = Next;
	}
	headnode = NULL;
}
/***************************************
功能:延时n秒
****************************************/
void delay(int n)
{
	clock_t start = clock();
	clock_t end = clock();
	while ((end - start) / CLOCKS_PER_SEC < n)
	{
		end = clock();
	}
}

主函数

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include"mysystem.h"

int main(void)
{
	int choice;
	struct ListNode * search;
	headnode = NULL;

	//读取文件
	readFile();
	while (1)
	{
		system("cls");  //清屏
		showMenu();
		choice = getChoice(7);
		switch (choice)
		{
		case 1:addInfo(); 
			system("cls");
			printf("\n\t-----------添加成功------------\n");
			delay(3);  //延时
			break;
		case 2:if (deletInfo())
		{
			system("cls");
			printf("\n\t-----------删除成功------------\n");
			delay(3);  //延时
		}
			break;
		case 3:
			search=searchInfo();
			if (search)
			{
				printf("  学号        姓名        性别   年龄  成绩\n");
				printf("%6d %15s %7s %5d %6.2lf\n", search->stu.number, search->stu.name, search->stu.sex,
					search->stu.age, search->stu.score);
				pause();
			}
			break;
		case 4:modifyInfo();
			break;
		case 5:saveInfo();
			system("cls");
			printf("\n\t-----------保存成功------------\n");
			delay(3);  //延时
			break;
		case 6:system("cls");
			allInfo();
			pause();
			break;
		case 7:goto END;
		}
	}
END:system("cls");
	printf("\n\t-----------Bye------------\n");
	clearSpace();
	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值