`
mmdev
  • 浏览: 12914627 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

菜鸟修炼C语言小设计之——学生成绩管理系统

 
阅读更多

一、本设计涉及的重要C语言知识有:

1.单链表的各种操作

2.文件流的操作

3.单链表的排序


二、本设计主要以下几个模块组成

1.学生成绩添加模块

2.学生成绩删除模块

3.学生成绩修改模块

4.学生成绩检索模块

5.学生成绩显示模块(包括成绩排序)

6.学生成绩保存模块

效果图:

本设计大概5、6百行代码左右,通过这个设计,本人感觉C语言熟练了很多,

希望能对像我一样的C语言菜鸟同学会有点帮助,废话少说,咱们上代码!

三、程序代码

1.main.c
这个文件内主要完成主菜单的跳转和接受用户信息完成到各个模块的跳转。
#include <stdio.h>
#include "students.h"

int select_menu(void);
void hand_menu(int cmd, int *flag);
void quit();


	
int main(int argc, char *argv[])
{
	int cmd;
	int flag = 0;
	
	while(1){
		cmd = select_menu();		
		hand_menu(cmd, &flag);
	}
}

int select_menu(void)
{
	int select = 0;
	printf("**************************************************************\n\n");
	printf("			学生管理系统				\n");
	printf("	1:添加学生信息			2:删除学生信息\n");
	printf("	3:修改学生信息			4:查询学生信息\n");
	printf("	5:查看学生信息			6:保存\n");
	printf("	0:退出\n\n");
	printf("**************************************************************\n");
	printf("请选择:");
	
	select=getch();
	while(select<'0'||select>'6'){
		printf("\n输入错误,请重新选择:");
		select=getch();
	}
	return select;
}

void hand_menu(int cmd, int *flag)
{
	static STU *stu_head = NULL;
	if(*flag == 0){
		stu_head = init_student(stu_head);
		*flag = 1;
	}
	
	switch(cmd){
		case '0':
			save_student(stu_head);
			quit();
			break;
		case '1':
			system("cls");
			stu_head = add_student(stu_head);
			system("cls");
			break;
		case '2':
			system("cls");
			stu_head = del_student(stu_head);
			system("cls");
			break;
		case '3':
			system("cls");
			modify_student(stu_head);
			system("cls");
			break;
		case '4':
			system("cls");
			search_student(stu_head);
			system("cls");
			break;
		case '5':
			system("cls");
			stu_head = display_student(stu_head);
			system("cls");
			break;
		case '6':
			system("cls");	
			save_student(stu_head);
			system("cls");
			break;
		default:
			break;
	}
}

void quit()
{
	printf("\n感谢使用学生管理系统!\n");
	exit(0);
}

2.students.h

这个文件主要包含students.c文件函数操作所需的定义。
#ifndef _STUDENTS_H_
#define _STUDENTS_H_

typedef struct st{
	unsigned long ID;
	char name[10];
 	float chinese;
	float math;
 	float english;
 	double all_sub;
 	float average;
	struct st* next;
}STU;

#define ASK_STU(p) do{p=(STU *)malloc(sizeof(STU));\
				if(p==NULL){printf("malloc memory failed!\n");exit(1);}\
				}while(0)
				
STU *search_by_nb(STU *stu_head, unsigned long nb);
STU *search_by_name(STU *stu_head, char name[]);
STU *select_sort(STU *g, char flag);
STU *add_student(STU *stu_head);
STU *del_all(STU *stu_head);
STU *del_one(STU *stu_head, int flag);
STU *del_student(STU *stu_head);
void modify_student(STU *stu_head);
STU *display_student(STU *stu_head);
STU *search_by_name(STU *stu_head, char name[]);
STU *search_by_nb(STU *stu_head, unsigned long nb);
#endif

3.store.h

#ifndef _STORE_H_
#define _STORE_H_
void save_student(STU *stu_head);
STU *init_student(STU *stu_head);
#endif

4.students.c
这个文件是本设计的核心部分,包括各个模块的实现函数,
包括添加,删除,修改,查找,显示学生信息这几个模块的实现。
#include <stdio.h>
#include "students.h"

 STU *select_sort(STU *g, char flag)
 { 
 	STU *p,*q,*t,*s,*h;
 
 	h=(STU *)malloc(sizeof(STU));
 	h->next=g;
 	p=h;
 	while(p->next->next!=NULL)
 	{
 		for(s=p,q=p->next;q->next!=NULL;q=q->next)
 		{
 			if(flag == '1')
				if(q->next->ID<s->next->ID)
					s=q;
			
			if(flag == '2')
				if(q->next->chinese<s->next->chinese)
					s=q;
					
			if(flag == '3')
				if(q->next->math<s->next->math)
					s=q;
					
			if(flag == '4')
				if(q->next->english<s->next->english)
					s=q;
					
			if(flag == '5')
				if(q->next->average<s->next->average)
					s=q;
 		}

 		if(s!=q)
 		{
 			t=s->next;
 			s->next=t->next;
 			t->next=p->next;
 			p->next=t;
 		}
 		p=p->next;
 	}
 	g=h->next;
 	free(h);
 	return g;
} 

STU *add_student(STU *stu_head)
{	
	STU *stu;
	STU *head = stu_head;
	STU *node = stu_head; 
	STU *node_fd;
	int sel;

 	ASK_STU(stu);
 	stu->next = NULL;
 	
	printf("请输入学生学号:");
	scanf("%d", &stu->ID); 	

	while(search_by_nb(node, stu->ID)){
		printf("已经存在该学号!请重新输入一个学号:");
		scanf("%d", &stu->ID); 
	}
	
	printf("请输入学生名字:");
	scanf("%s", stu->name); 
	printf("请输入该学生英语成绩:");
	
	scanf("%f", &stu->english);
	while(stu->english < 0.0 || stu->english > 100.0){
		printf("输入错误,请重新输入英语成绩:");
		scanf("%f", &stu->english);
	}
	printf("请输入该学生数学成绩:");
	scanf("%f", &stu->math);
	while(stu->math < 0.0 || stu->math > 100.0){
		printf("输入错误,请重新输入数学成绩:");
		scanf("%f", &stu->math);
	}
	printf("请输入该学生语文成绩:");
	scanf("%f", &stu->chinese);
	while(stu->chinese < 0.0 || stu->chinese > 100.0){
		printf("输入错误,请重新输入数学成绩:");
		scanf("%f", &stu->chinese);
	}
	
	stu->all_sub = stu->chinese+stu->math+stu->english; 
	stu->average = stu->all_sub/3;
	
	if(!head){
 		head = stu;
		return head;
	}

	while(node->next)
		node = node->next;
		
	node->next = stu;
	head = select_sort(head, '1');
	return 	head;	
}
STU *del_all(STU *stu_head)
{
	if(!stu_head)
		return NULL;
	del_all(stu_head->next);
	free(stu_head);
	stu_head = NULL;
	return NULL;
}

STU *del_one(STU *stu_head, int flag)
{
	STU *node = stu_head;
	STU *head = stu_head;
	STU *pre;
	
	char name[10]; 
	unsigned long ID;
	
	if(head = NULL){
		printf("没有任何学生信息!\n");
		return head;
	}
	
	if(flag == '2'){
		printf("请输入要删除的学生姓名:");
		scanf("%s", name);
		
		if(!strcmp(node->name, name)){
			free(node);
			head = node->next;
			printf("成功删除!按任意键返回。\n");
			getch();
		 	return head;
		}
		
		while(node){
			if(!strcmp(node->name, name)){
				pre->next = node->next;
				free(node);
				printf("成功删除!按任意键返回。\n");
				getch();
				return head;
			}
			pre = node;
			node = node->next;
		}
		
		printf("没有找到该学生信息!\n");
		return head; 
	}
	
	if(flag == '3'){
		printf("请输入要删除的学生学号:");
		scanf("%d", &ID);
		
		if(node->ID == ID){
			free(node);
			head = node->next;
			printf("成功删除!按任意键返回。\n");
			getch();
		 	return head;
		}
		
		while(node){
			if(!strcmp(node->name, name)){
				pre->next = node->next;
				free(node);
				printf("成功删除!按任意键返回。\n");
				getch();
				return head;
			}
			pre = node;
			node = node->next;
		}
		
		printf("没有找到该学生信息!按任意键返回\n");
		getch();
		return head; 
	}
	
}

STU *del_student(STU *stu_head)
{
	int sel;
	STU *head = stu_head; 
	
	printf("1:删除全部	2:按名字删除	3:按学号删除	0:返回\n");
	printf("请选择:\n");
	
	sel = getch();
	while(sel<'0'||sel>'3'){
		printf("输入错误,请重新选择:\n");
		sel = getch();
	} 
	
	if(sel == '0')
		return head;
	
	if(!head){
		printf("没有任何学生信息!按任意键返回.\n");
		getch();
		return head; 
	}
	
	 if(sel == '1'){
		head = del_all(head);
		printf("删除成功!按任意键返回.");
		getch();
		return head;
	}
	
	if(sel == '2'||sel =='3'){
		head = del_one(head, sel);
		return head;
	}
	
}

void modify_student(STU *stu_head)
{
	STU *head = stu_head;
	STU *node_fd;
	int sel;
	char name[10];
	unsigned long nb; 
	
recyc3:
	printf("1:修改指定学号的学生信息	2:修改指定姓名的学生信息	0:返回\n请选择:\n");
	
	sel = getch();
	while(sel < '0'|| sel>'2'){
		printf("输入错误!请重新选择:\n");
		sel = getch();
	}
	if(sel == '1'||sel=='2'){
		if(sel == '1'){
			printf("请输入要修改的学生学号:");
			scanf("%d", &nb);	
			node_fd = search_by_nb(head, nb);
		}
		if(sel == '2'){
			printf("请输入要修改的学生姓名:");
			scanf("%s", name);	
			node_fd = search_by_name(head, name);
		}
	
		if(node_fd){
			
			printf("请输入该学生英语成绩:");	
			scanf("%f", &node_fd->english);
			while(node_fd->english < 0.0 || node_fd->english > 100.0){
				printf("输入错误,请重新输入英语成绩:");
				scanf("%f", &node_fd->english);
			}
			printf("请输入该学生数学成绩:");
			scanf("%f", &node_fd->math);
			while(node_fd->math < 0.0 || node_fd->math > 100.0){
				printf("输入错误,请重新输入数学成绩:");
				scanf("%f", &node_fd->math);
			}
			printf("请输入该学生语文成绩:");
			scanf("%f", &node_fd->chinese);
			while(node_fd->chinese < 0.0 || node_fd->chinese > 100.0){
			printf("输入错误,请重新输入数学成绩:");
			scanf("%f", &node_fd->chinese);
			}
	
			node_fd->all_sub = node_fd->chinese+node_fd->math+node_fd->english; 
			node_fd->average = node_fd->all_sub/3;
			printf("修改成功!\n");
			goto recyc3;
		}
		else{
			printf("没有该学生信息!\n");
			goto recyc3;
		} 
	}
}

STU *display_student(STU *stu_head)
{
	int sel;
	STU *head = stu_head;
	STU *node = stu_head;
	if(node == NULL){
		printf("没有任何学生信息,按任意键返回");
		getch();
		return head;  
	}
recyc:
	printf("学号		姓名		语文	数学	英文	平均分	总分\n");
	while(node){
		printf("%d		%s		%0.1f	%0.1f	%0.1f	%0.1f	%0.1f\n", node->ID, node->name,\
			node->chinese, node->math, node->english, node->average, node->all_sub);
		node=node->next;
	}
	printf("排序方式: 1:按学号排序 2:按语文成绩排序 3:按数学成绩排序\n          4:按英文成绩排序 5:按总分排序 0:返回\n请选择:");

	sel = getch();
	while(sel < '0'|| sel>'5'){
		printf("输入错误!请重新选择:");
		sel = getch();
	}
	if(sel == '0')
		return head;
		
	head = node = select_sort(head, sel);
	system("cls");
	goto recyc;
	return head;
}

STU *search_by_name(STU *stu_head, char name[])
{
	STU *node = stu_head;

	if(!node)
		return NULL;

			
	while(node){
		if(!strcmp(node->name, name))
				return node;
			node=node->next;
	}
		
	return NULL;
}

STU *search_by_nb(STU *stu_head, unsigned long nb)
{
	STU *node = stu_head;

	if(!node)
		return NULL;
		
			
	while(node){
		if(node->ID == nb)
			return node;
			
		node=node->next;
	}
		
	return NULL;
}

void search_student(STU *stu_head)
{
	STU *head = stu_head;
	STU *node;
	int sel = 0;
	char name[10];
	unsigned long ID;
	
recyc2:
	printf("1:按姓名查找	2:按学号查找	0:返回\n请选择:");
	sel = getch();
	while(sel<'0' || sel>'2'){
		printf("\n输入错误,请重新选择:");
		sel = getch();
	}
	
	if(sel == '0')
		return;
	if(sel == '1'||sel=='2'){
		if(sel == '1'){
			printf("\n请输入你要查找的学生姓名:");
			scanf("%s", name);
			node = search_by_name(head, name);
		}
		else{
			printf("\n请输入你要查找的学生学号:");
			scanf("%d", &ID);
			node = search_by_nb(head, ID);
		}
	
		if(node){
			printf("学号		姓名		语文	数学	英文	平均分	总分\n");
			printf("%d		%s		%0.1f	%0.1f	%0.1f	%0.1f	%0.1f\n", node->ID, node->name,\
					node->chinese, node->math, node->english, node->average, node->all_sub);
				goto recyc2;
		}
		else{
			printf("没有找到该学生信息!\n");
			goto recyc2;
		}
	}

}




5.store.c
这个文件包含程序启动时读取文件内的学生成绩信息,
和需要保存时或者退出时向文件保存学生成绩信息的操作。
#include <stdlib.h>
#include <stdio.h>

#include "students.h"

#define FILE_NAME "students"

void save_student(STU *stu_head)
{
	STU *node = stu_head;
	FILE *fp;
	fp = fopen(FILE_NAME, "w+");
	while(node){
		fprintf(fp, "%ld	%s	%0.1f	%0.1f	%0.1f	%0.1lf	%0.1f\n", node->ID, node->name,\
				node->chinese, node->math, node->english, node->all_sub, node->average);
		node=node->next;
	}
	fclose(fp);
	printf("保存成功!按任意键返回。\n");
	getch();
}

STU *init_student(STU *stu_head)
{
 	STU *node =	stu_head;
	STU *head = stu_head;
	STU *new_node;
	int i;
	FILE *fp;
	char name[10];
	int num;
	
	ASK_STU(new_node);
	new_node->next=NULL;
	
	fp = fopen(FILE_NAME, "r+");
	rewind(fp);
	while((i = fscanf(fp, "%ld%s%f%f%f%lf%f\n", &new_node->ID, new_node->name,\
					&new_node->chinese, &new_node->math, &new_node->english, &new_node->all_sub, &new_node->average)) == 7){
		if(!head)
			head = node = new_node;
		else{
			while(node->next)
				node = node->next;
			node->next = new_node;
		}
		ASK_STU(new_node);
		new_node->next = NULL;
	}
	fclose(fp);
	return head;
}

四、总结

菜鸟修炼C语言基础部分到此告一段落了,通过这段时间的修炼对C语言有了更加深入的理解,
能够熟练运用指针、数组、结构体和链表进行代码的编写了。
如果以后有时间,可能会修炼一下C算法,下一段时间我会修炼C++。
希望能对像我一样的C语言菜鸟能提供到帮助,大家共同努力,共同奋斗!


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics