学生管理系统(改进版)(C语言链表)

4 篇文章 0 订阅

在这里插入图片描述

main.c文件

/*·1. 界面
	2. 数据结构的设计
			//需求和数据结构设计糅合在一起 
	3. 交互				*/

#include "Mylist.h" 

void menu();/*数据的设计----->学生信息抽象出来,菜单设计*/

struct Node *list;	

void keyDown();/*用户的交互:根据所选菜单项,执行问题*/

int main(int argc, char *argv[]) {
	list = createList();
	readInfoFromFile(list, "1.txt");
	while(1){
		menu(); 
		keyDown();
		system("pause");
		system("cls");
	}

//	测试链表代码
//	struct Node*list = creatList();
//	insertNodeByHead(list, 1); 
//	insertNodeByHead(list, 3); 
//	insertNodeByHead(list, 2); 
//	insertNodeByHead(list, 4);
//	printList(list);
//	printf("删除指定位置:\n");
//	deleteAppoinNode(list, 3);
//	printList(list);
//	printf("链表的查找:\n");
//	printf("%d\n", searchInfoByData(list, 2)->data); 
	system("pause");
	return 0;
}

void menu()
{
	/*所有操作都同步到文件*/ 
	printf("--------------【学生管理系统】-----------------\n");
	printf("\t\t0. 退出系统\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("\t\t8. 成绩排序\n");
	printf("\t\t9. 成绩统计\n");
	printf("-----------------------------------------------\n");	
}


void keyDown()
{
	int choice = 0;
	struct student data;
	struct Node *pMove = NULL;
	scanf("%d", &choice);
	switch(choice){
		case 0:
			printf("正常退出\n");
			system("pause");
			exit(0); 
				break;
		case 1:
			printf("----------------【录入信息】----------------\n"); 
			/*插入链表*/ 
			printf("请输入学生学号,姓名,成绩:");
			fflush(stdin);/*清空缓冲区*/ 
			scanf("%s%s%d",data.xuehao, data.name, &data.score ) ; 
			insertNodeByHead(list, data);
			break;
		case 2:
			printf("----------------【插入信息】-------------------\n"); 
			printf("请输入插入学生学号,姓名,成绩:");
			fflush(stdin);/*清空缓冲区*/ 
			scanf("%s%s%d",data.xuehao, data.name, &data.score );
			printf("插在学号为多少的后面");
			char xuehao1[20];
			fflush(stdin);/*清空缓冲区*/ 
			scanf("%s", xuehao1) ;
			insert(list, data, xuehao1);
			break; 
		case 3:
			printf("----------------【浏览信息】-------------------\n"); 
			printList(list);/*打印链表*/ 
			break;
		case 4:
			printf("----------------【按学号浏览信息】-------------------\n"); 
			sort_score(list);/* 打开可按学号排序 */
			printList(list);/*打印链表*/ 
			break;
		case 5:
			printf("----------------【修改信息】-------------------\n");
			printf("请输入需要修改的学生姓名:");
			scanf("%s", data.name);
			modification(list, data.name);
			break;
		case 6:
			printf("----------------【删除信息】-------------------\n");
			printf("请输入删除的学生姓名:");
			scanf("%s", data.name);
			deleteAppoinNode(list, data.name); 			
			break;
		case 7:
			printf("----------------【查找信息】-------------------\n");
			printf("请输入要查找学生的学号:");
			scanf("%s", data.xuehao);
			pMove = searchInfoByData(list, data.xuehao);
			if((pMove) == NULL){
				printf("未找到相关信息!\n");
				system("pause");
			} 
			else{
				printf("学号\t姓名\t成绩\n");
				printf("%s\t%s\t%d\n", pMove->data.xuehao, pMove->data.name,  pMove->data.score );
			}
			break;
		case 8:
		    printf("----------------【成绩排序】-------------------\n");
		    sort(list);
			printList(list);/*打印链表*/ 
			break; 
		case 9:
		    printf("----------------【成绩统计】-------------------\n");
	 		count(list);
			break; 
		default:
			printf("选择错误,重新输入\n");
			system("pause");/*防止闪屏*/ 
			break;
	} 
	writeInfoToFile(list, "1.txt");
}


Mylist.h文件

#include <stdio.h>
#include <stdlib.h>		/*防止闪屏*/
#include <string.h>

struct student{
	char xuehao[20];
	char name[50];
	int score;
};

//结构分结构去写
//某一种数据结构趋势线什么东西的时候,单独去写这一种数据结构
//先把数据写对了再说

struct Node{
	/*int data*/
	struct student data;
	struct Node*next;
};


/*创建表*/ 
struct Node *createList(){
	/*用结构体变量表示表头*/ 
	/*指针--->变量  动态内存申请*/ 
	struct Node *headNode = (struct Node *)malloc(sizeof(struct Node));
	/*表头:做差异化处理  数据域data 不做初始化*/ 
	headNode->next = NULL;

	return headNode;
} 

/*创建节点*/ 
struct Node* createNode(struct student data){
	struct Node*newNode = (struct Node*)malloc(sizeof(struct Node));
	newNode->data = data;
	newNode->next = NULL;
	return newNode; 		
} 

/*插入节点*/
void insertNodeByHead(struct Node*headNode, struct student data){
	struct Node*newNode = createNode(data);
	/*表头法插入*/
	newNode->next = headNode->next;
	headNode->next = newNode; 
} 

/*删除链表*/
void deleteAppoinNode(struct Node*headNode,  char*name){
	//struct student 
	struct Node*posNode = headNode->next;
	struct Node*posFrontNode = headNode;
	if(posNode == NULL){
		printf("数据为空,无法删除!\n");
		return;
	}
	/*姓名是字符串,字符串:strcmp */ 
	while(strcmp(posNode->data.name, name)){
		posFrontNode = posNode;
		posNode = posFrontNode->next;
		if(posNode ==NULL){
			printf("未找到指定位置无法删除!\n");
			return ;
		}
	}
	/*找到了*/
	posFrontNode->next = posNode->next;
	free(posNode);
} 

/*链表的存储:文件读操作*/
void readInfoFromFile(struct Node*headNode, char *fileName){
	/* 1. 打开*/ 
	FILE *fp;
	struct student data;/*先把文件读到data中去,在读到链表中去*/ 
	fp = fopen(fileName, "r");/*这个方式是不会创造文件的*/ 
	if(fp == NULL){
		fp = fopen(fileName, "w+");/*这个方式能创造文件的*/
	}
	/*2. 读文件*/
	/*先把文件读到data中去,在读到链表中去*/
		/*将文件当作输入设备*/ 
	while(fscanf(fp, "%s\t%s\t%d\n", data.xuehao, data.name, &data.score) != EOF){
						/*制表符\t*/       /*在读到链表里去*/ 
		insertNodeByHead(headNode, data);	
	} 
	/* 3.关闭文件*/
	fclose(fp); 
} 

/*链表的读取:文件写操作*/
void writeInfoToFile(struct Node*headNode, char*fileName){
	FILE *fp;
	fp = fopen(fileName, "w");/*已清空的方式*/ /*w+是追加的方式*/ 
	if(fp == NULL){
		printf("文件打开失败!");
		return ; 
	}
	struct Node *pMove = headNode->next;
	while(pMove){
		fprintf(fp, "%s\t%s\t%d\n",pMove->data.xuehao,  pMove->data.name, pMove->data.score);
		pMove = pMove->next;
	}
	fclose(fp);
}
/*修改功能*/ 	/*方法一*/ 
struct Node *modification (struct Node* headNode, char* name){
	struct student data;
	deleteAppoinNode(headNode, name);
	printf("请重新输入学生学号,姓名,成绩::");
	fflush(stdin);/*清空缓冲区*/ 
	scanf("%s%s%d",data.xuehao, data.name, &data.score) ; 
	insertNodeByHead(headNode, data); 
}
 

//查找 
struct Node *searchInfoByData(struct Node* headNode, char *xuehao){
	struct Node *pMove = headNode->next;
	while(strcmp(pMove->data.xuehao, xuehao)){
		pMove = pMove->next;
		if(pMove == NULL){
			return NULL;
		}
	}
	return pMove;
} 

//插入到某人后面
void insert(struct Node*headNode, struct student data, char *xuehao) {
	struct Node*newNode = createNode(data);
	struct Node *pMove = searchInfoByData(headNode, xuehao);
	newNode->next = pMove->next;
	pMove->next = newNode;
}

//排序(辅) 
void exchange(struct Node*now, struct Node*stop){
		struct Node*temp = (struct Node*)malloc(sizeof(struct Node));
		
		strcpy(temp->data.xuehao, stop->data.xuehao);			
		strcpy(temp->data.name, stop->data.name);
		temp->data.score        = stop->data.score;
		
		strcpy(stop->data.xuehao, now->data.xuehao);		
		strcpy(stop->data.name, now->data.name);
		stop->data.score    	= now->data.score;

		strcpy(now->data.xuehao , temp->data.xuehao);
		strcpy(now->data.name , temp->data.name);
		now->data.score    		= temp->data.score; 

		free(temp);		
}

//排序成绩(主) 
void sort(struct Node*headNode){
	struct Node*now = headNode->next->next;
	struct Node*stop = headNode->next;
	while(stop->next){
		now = stop->next;
		while(now){
			if(stop->data.score < now->data.score){
				exchange(now, stop);
			}
			now = now->next;  
		}
		stop = stop->next;
	}	 
}
//排序学号
void sort_score(struct Node*headNode){
	struct Node*now = headNode->next->next;
	struct Node*stop = headNode->next;
	while(stop->next){
		now = stop->next;
		while(now){
			long a = atol(stop->data.xuehao);
			long b = atol(now->data.xuehao);
			if(a > b){
				exchange(now, stop);
			}
			now = now->next;  
		}
		stop = stop->next;
	}	 
}

//成绩计数
int *count(struct Node*headNode){
	struct Node*now = headNode->next;
	sort(headNode);
	int score[5]={0};
	while( now ) {
		if(now->data.score >= 90){
			score[0]++;
		}else if(now->data.score < 90 && now->data.score >= 80){
			score[1]++;
		}else if(now->data.score < 80 && now->data.score >=70){
			score[2]++;
		}else if(now->data.score < 70 && now->data.score >=60){
			score[3]++;
		}else if(now->data.score < 60){
			score[4]++;
		}
		now = now->next;
	}
	printf("优秀:  %d人\n", score[0]);
	printf("良好:  %d人\n", score[1]);
	printf("中等:  %d人\n", score[2]);
	printf("及格:  %d人\n", score[3]);
	printf("不及格:%d人\n", score[4]);
} 

/*打印链表*/
void printList(struct Node*headNode){
	struct Node*pMove = headNode->next;
	/*设计到数据的处理*/ 
	printf("学号\t姓名\t成绩\n");
	while(pMove){
		printf("%s\t%s\t%d\n", pMove->data.xuehao, pMove->data.name,  pMove->data.score );
		pMove = pMove->next;
	}
	printf("\n");
} 
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个C++管理系统基本涵盖了“学生成绩管理系统”的所有功能,你可以从中借鉴到C++链表、类、封装、继承、文件操作、排序等等很多知识,极具借鉴意义,以下为本项目的功能介绍: 1. 建立文件 (1)可以使用默认文件名或指定文件名将记录存储到 (2)设置适当的标志位,作为对记录进行操作的 (3)写同名文件将覆盖原来文件的 2.增加学生记录 (1) 可在已有记录后面追加新的记录 (2) 可以随时增加新的记录,它们仅保存在向量数组中 (3) 可以将一个文件读入,追加在已有记录之后 (4) 采取文件追加方式时,在没有保存到文件之前,将继续保持文件追加状态,以便实现连续追加操作方式 3. 新建学生信息文件 (1) 用来新建学生信息记录 (2) 如果已经有记录存在,可以覆盖原记录或者在原记录后面追加,也可以将原有记录信息保存 到一个指定文件,然后重新建立记录 (3) 给出相应的提示信息 4. 显示记录 (1) 如果没有记录可供显示,给出提示信息 (2) 可以随时显示内存中的记录 (3) 显示表头 5. 文件存储 (1) 可以按默认名字或指定名字存储记录文件 6. 读取文件 (1) 可以按默认名字或指定名字将记录文件读入内存 (2) 可以将指定或默认文件追加到现有记录的尾部 (3) 可以将文件连续追加到现有记录并更新记录中的“名次” 7. 删除记录 (1) 可以按“学号”、“姓名”或“名次”方式删除记录 (2) 标志将被删除的记录, 可以再次取消标志, 经确认后删除已经标志的记录(3) 如果记录是空表, 删除时应给出提示信息并返回主菜单 (4) 如果没有要删除的信息, 输出“没有找到”的信息 (5) 更新其他记录的名次 (6) 删除操作仅限于内存, 只有执行存储操作时, 才能覆盖原记录 8. 修改记录 (1) 可以按“学号”、“姓名”或“名次”方式查找要修改的记录内容 (2) 给出将被修改记录的信息, 经确认后进行修改 (3) 如果记录已经是空表,应给出提示信息并返回主菜单 (4) 如果没有找到需要修改的信息, 输出“没有找到”的信息 (5) 更新其他记录的名次 (6) 修改操作仅限于内存, 只有执行存储操作时, 才能覆盖原记录 9. 查询记录 (1) 可以按“学号”、“姓名”或“名次”方式查询记录 (2) 能给出查询记录的信息 (3) 如果查询的信息不存在, 输出提示信息 10. 对记录进行排序 (1) 可以按”学号”进行升序和降序排列 (2) 可以按”姓名”进行升序和降序排列 (3) 可以按”名次”进行升序和降序排列 (4) 如果属于选择错误, 可以立即退出程序

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值