课程设计-高校社团管理系统

记录我的课程设计(C语言+数据结构)

目录

题目12:高校社团管理系统

--------  界面预览  --------

--------  以下贴上我的源代码  --------

主菜单 main.c

学生个人信息管理 student.c

社团信息管理 association.c

成员信息管理 member.c


 

题目12:高校社团管理系统

编写一个系统完成高校社团的管理,包括录入、查询、删除、修改、排序等操作。社团信息包括:社团名称、创建的时间、主要职责、主要负责人、社团成员等。

功能要求:

  1. 录入:采用交互式方式录入社团信息后存入文件,之后可导入;
  2. 查询:可以特定条件查询社团信息;
  3. 删除
  4. 修改:根据给出的条件查询出社团信息后进行相应的修改;
  5. 排序:根据社团的创建时间进行排序。

--------  界面预览  --------

 

 

--------  以下贴上我的源代码  --------

主菜单 main.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <malloc.h>
#include <conio.h> 
#include <time.h>

#include "association.c"  //调用社团信息管理模块源文件 
#include "student.c"   //调用学生信息管理模块源文件 
#include "member.c"   //调用成员信息管理模块源文件 

//获取用户输入的操作 
int getChooce(char n[]){  //参数以字符串的形式输入,以防用户不小心输入字符或字符串,导致系统进入死循环
	int m = -1;  //初始化 
	if(strcmp(n,"0")==0)
		m=0;
    else if(strcmp(n,"1")==0)
		m=1;
    else if(strcmp(n,"2")==0)
		m=2;
    else if(strcmp(n,"3")==0)
		m=3;
   	else if(strcmp(n,"4")==0)
		m=4;
	else if(strcmp(n,"5")==0)
		m=5;
    else if(strcmp(n,"6")==0)
		m=6;
    else if(strcmp(n,"7")==0)
		m=7;
   	else if(strcmp(n,"8")==0)
		m=8;
	else if(strcmp(n,"9")==0)
		m=9;
	else if(strcmp(n,"10")==0)
		m=10;
   	else
		m=-1;
	return(m);
}

int main(){
	Student stu;  //学生 
	Association aso;  //社团 
	Member mbe;   //成员信息 
	char n[8];  //用于记录用户的操作 
	initStu(&stu);   //初始化
	initAso(&aso);
	initMbe(&mbe);	
	loadStuDataFile(&stu); //加载文件 
	loadAsoDataFile(&aso);
	loadMbeDataFile(&mbe);
	long i=0;
	printf("加载中"); 
	for(i=0; i<100000000;i++){ //模拟加载效果 
		if(i%10000000 == 0)
		printf(">> "); 
	} 
	printf("加载完毕");
	while(i != 300000000){  //模拟计时效果 
		i++; 
	}
	system("cls"); 
	printf("\n\n\n     欢     ");  //欢迎动画 
	i = 0;
	while(i != 300000000){
		i++;
	}
	printf("迎     ");
	i = 0;
	while(i != 300000000){
		i++;
	}
	printf("使     ");
	i = 0;
	while(i != 300000000){
		i++;
	}
	printf("用    \n\n\n");
	getch();
	do {
		system("cls");  //清屏 
		printf("########### 欢迎使用高校社团管理系统v1.0 #######\n");
		printf("# 1. 学生个人信息管理                          #\n");
		printf("# 2. 社团信息管理                              #\n");
		printf("# 3. 社团会员管理                              #\n");
		printf("#                                              #\n");
		printf("#                                              #\n");
		printf("#                                              #\n");
		printf("#                                 0 退出系统   #\n"); 
		printf("##############################  by MR.DING #####\n");
		printf("请选择您需要的操作:");
		scanf("%s",n);  //参数以字符串的形式输入,以防用户不小心输入字符或字符串,导致系统进入死循环
		switch(getChooce(n)){
			case 0:  
				system("cls"); 
				printf("\n\n感谢您使用高校社团管理系统,再见!\n\n\n");
				system("pause"); 
				return 0;
				exit(0); 
			case 1:
				studentInfoManage(&stu); //模块选择 
				break;
			case 2:
				associationInfoManage(&aso); 
				break;
			case 3:
				memberInfoManage(&stu, &aso, &mbe); 
				break;
			default:
				printf("输入错误!\n");
				system("pause");
		}
	} while (1); 
}

学生个人信息管理 student.c

//定义学生对象类型
typedef struct node1{
	char sno[10];    //学号
	char name[30];  //姓名
	char gemder[3];    //性别
	char dept[30];   //年级专业
	char phone[15]; //手机号码
	struct node1 *next;
}Student;

int getChooce(char n[]);

//初始化学生信息
void initStu(Student *stu){
	stu->next = NULL;
}

//读取储存在studata.dat里的数据
int loadStuDataFile(Student* stu){
	FILE* fp = fopen(".\\data\\studata.dat", "rb");
	if(!fp){
		printf("不能读取文件!");
		return 0;
	}
	int num = 0,i;
	Student* r = stu;
	fread(&num, sizeof(int), 1, fp);
	for(i=0; i<num; i++){
		Student* newNode = (Student*)malloc(sizeof(Student));
		fread(newNode, sizeof(Student), 1, fp);
		newNode->next = 0;
		r->next = newNode;
		r = r->next;
	}
	fclose(fp);
	return 1;
}

//将数据存到studata.dat里
int saveStuDataFile(Student* stu){
	FILE *fp;
	if((fp = fopen(".\\data\\studata.dat", "wb")) == NULL){
        printf("不能打开文件! \n");
        return 0;
    }
	int sNum = 0;
	Student* p;
	for(p=stu->next; p; p=p->next)sNum++;
	printf("正在保存文件......");
	Student* p1;
	fwrite(&sNum, sizeof(int), 1, fp);
	for(p1=stu->next; p1; p1 = p1->next){
		fwrite(p1, sizeof(Student), 1, fp);
	}
	if (fclose(fp) == 0){//关闭成功返回0,否则返回-1 
		return 1;//关闭成功
	}else{
		return 0;//关闭失败 
	}
}

//查看学生个人信息 
void StuInfoList(Student *stu){ 
	Student *p = stu->next;
	printf("                     学生个人信息表                      \n");
	printf("_________________________________________________________\n");
	printf("|   学号   |   姓名   |  性别  |  年级专业  |   手机号   |\n");
	printf("|   sno    |   name   | gender |    dept    |    phone   |\n");
	printf(" ————— ————— ———— —————— ——————\n");
	if(p == NULL){
		printf("                      没有记录                         \n\n");
	}else{
		while(p != NULL){
			printf("|%10s|%10s|%8s|%12s|%12s|\n",p->sno,p->name,p->gemder,p->dept,p->phone);
			printf(" ————— ————— ———— —————— ——————\n");
			p = p->next;
		}
	}
}

//查找并显示显示一个学生信息 
void selectAStuRecold(Student *stu){ 
	char sn[20];
	Student *p = stu->next;
	printf("请输入所要查询的学生的学号或姓名\n");
	printf("请输入:");
	scanf("%s",sn);
	do{
		if (strcmp(p->name,sn) == 0 || strcmp(p->sno,sn) == 0) {
		printf("                     学生个人信息表                      \n");
		printf("_________________________________________________________\n");
		printf("|   学号   |   姓名   |  性别  |  年级专业  |   手机号   |\n");
		printf("|   sno    |   name   | gender |    dept    |    phone   |\n");
		printf(" ————— ————— ———— —————— ——————\n");
			printf("|%10s|%10s|%8s|%12s|%12s|\n",p->sno,p->name,p->gemder,p->dept,p->phone);
			printf(" ————— ————— ———— —————— ——————\n");
			break;
		}
		p=p->next;//注意指针要往后走
		if(p == NULL){
			break;
		}
	}while(p != NULL);
	if(p == NULL)
		printf("对不起!无此学生的信息!\n");
}

//更新学生个人信息 
void updateStuInfo(Student *stu){ 
	char sn[30];
	Student *p;
	printf("请输入要修改的学生的学号或者姓名:");
	scanf("%s",sn);
	p = stu->next;//检查是否存在这名学生,若存在则将姓名转换为对应的学号
	do {
		if (strcmp(p->sno,sn) == 0 || strcmp(p->name,sn) == 0){
		strcpy(sn,p->sno);
		break;
		}
		p = p->next; 
	} while (p != NULL);
	if(p==NULL){
		printf("对不起!无该名学生的信息!\n");
		return ;
	}
	if (strcmp(p->name,sn) == 0 || strcmp(p->sno,sn) == 0) {
		printf("                     学生个人信息表                      \n");
		printf("_________________________________________________________\n");
		printf("|   学号   |   姓名   |  性别  |  年级专业  |   手机号   |\n");
		printf("|   sno    |   name   | gender |    dept    |    phone   |\n");
		printf(" ————— ————— ———— —————— ——————\n");
			printf("|%10s|%10s|%8s|%12s|%12s|\n",p->sno,p->name,p->gemder,p->dept,p->phone);
			printf(" ————— ————— ———— —————— —————\n");
	}
 	printf("---请按顺序更新信息---\n");  //(问题:中途取消更新怎么退出? ) 
 	printf("请问学号需要修改吗?(Y/N)");
 	if(getch() == 'y'){
 		printf("请输入学号:"); 
		scanf("%s",p->sno); 
	}else{
		printf("\n"); 
	}
 	printf("请问姓名需要修改吗?(Y/N)");
 	if(getch() == 'y'){
 		printf("请输入姓名:");
		scanf("%s",p->name);
	}else{
		printf("\n"); 
	}
	printf("请问性别需要修改吗?(Y/N)");
 	if(getch() == 'y'){
 		printf("请输入性别:"); //(优化:输入限制) 
		scanf("%s",p->gemder);
	}else{
		printf("\n"); 
	}
	printf("请问班级需要修改吗?(Y/N)");
 	if(getch() == 'y'){
 		printf("请输入班级:");
		scanf("%s",p->dept);
	}else{
		printf("\n"); 
	}
	printf("请问手机号需要修改吗?(Y/N)");//(优化:格式判断) 
 	if(getch() == 'y'){
 		printf("请输入手机号:");
		scanf("%s",p->phone);
	}else{
		printf("\n"); 
	}
	printf("修改完成!\n"); 
}

//录入学生信息(尾插法)
void insertStuInfo(Student *stu){ // 录入成员信息 
	Student *s,*r;
	int m, i; 
	r = stu; //r始终指向尾结点,开始时指向头结点
	while (r->next != NULL){
		r = r->next;
	}
	printf("请输入需要录入的学生个数:  ");
	scanf("%d",&m);
	printf("现在输入学生信息\n\n");
	for(i = 0; i < m; i++){
		s = (Student *)malloc(sizeof(Student)); //生成新结点 
		printf("---请按顺序录入信息---\n");
		if (m>1){
			printf("--第%d个学生\n",i+1);  
		}
		printf("请输入学号:");   //重复输入相同学号问题 未解决 
		scanf("%s",s->sno); 
		printf("请输入姓名:");
		scanf("%s",s->name);
		printf("请输入性别:");  //(优化:格式判断,输入限制) 
		scanf("%s",s->gemder);
		printf("请输入班级:"); 
		scanf("%s",s->dept);
		printf("请输入手机号:");  //(优化:格式判断) 
		scanf("%s",s->phone);
		r->next = s; //将*s 插入到 *r 之后 
		r = s; //作用?
	}
	r->next = NULL;
	printf("录入学生信息完成\n"); 
} 

//删除学生信息
void deleteStuInfo(Student *stu){  
	Student *p,*q,*t;
	char sn[30];
	printf("请输入要删除的学生学号或姓名:");  //编号名字重复问题 未解决 
	scanf("%s",sn);
	p = stu->next;//检查是否存在这名学生
	do{
		if (strcmp(p->sno,sn)==0 || strcmp(p->name,sn)==0) {
			strcpy(sn,p->sno);
			break;
		}
		p = p->next;//注意指针要往后走
	}while(p != NULL);
	if(p==NULL){
		printf("对不起!无该名学生的信息!\n");
		return ;
	}
	t = stu;//t指向q的前一个节点,便于删除和释放
	q = stu->next;
	do {
		if(strcmp(q->sno,sn) == 0){
			t->next = q->next;
			free(q);
			printf("删除成功");
			break;
		}
		t = t->next;
		q = q->next; 
	} while (q != NULL);
	if (q == NULL){
		printf("对不起!表中没有您要删除的学生信息!\n"); 
	}
} 

//学生个人信息管理 
void studentInfoManage(Student *stu){  
	int back = 0;  //返回主菜单标记,0不返回,1返回 
	Student *r = stu;
	char n[8];
	do {
	   	system("cls"); 
		printf("############### 学生个人信息管理 ###############\n");
		printf("# 1. 学生信息列表                              #\n");
		printf("# 2. 录入学生信息                              #\n");
		printf("# 3. 更新学生信息                              #\n");
		printf("# 4. 删除学生信息                              #\n");
		printf("# 5. 查找学生信息                              #\n");
		printf("#                                              #\n");
		printf("#                               0. 返回主菜单  #\n"); 
		printf("##############################  by MR.DING #####\n");
		printf("请选择您的操作:");
		scanf("%s",n);  
		switch(getChooce(n)){
			case 1:
				StuInfoList(r);
				system("pause"); 
				break;
			case 2:
				insertStuInfo(r);
				if (saveStuDataFile(r)) {
					printf("文件保存成功!\n");
				}else{
					printf("文件保存失败!\n");
				}
				system("pause");
				break;
			case 3:
				StuInfoList(r); 
				updateStuInfo(r);
				if (saveStuDataFile(r)) {
					printf("文件保存成功!\n");
				}else{
					printf("文件保存失败!\n");
				}
				system("pause");
	  		    break;
			case 4:
				StuInfoList(r); 
				deleteStuInfo(r);
				if (saveStuDataFile(r)) {
					printf("文件保存成功!\n");
				}else{
					printf("文件保存失败!\n");
				}
				system("pause");
				break;
			case 5:
				selectAStuRecold(r);
				system("pause");
	 	 		break;
			case 0:
				back = 1;
	 	 		break;
			default:
				printf("输入错误!");
				system("pause");
			}
			if (back == 1) {
				break;
			}
	} while (1);
}

社团信息管理 association.c

//定义社团对象类型
typedef struct node2{
	char ano[10];    //社团编号
	char name[50];  //社团名称
	int creatTime;  //成立时间
	char personInCharge[30]; //主要负责人
	char  totlePerson[6]; //人数
	struct node2 *next;
}Association;


int getChooce(char n[]);

//初始化社团信息
void initAso(Association *aso){
	aso->next = NULL;
}

//读取储存在asodatafile.dat里的数据
int loadAsoDataFile(Association* aso){
	FILE* fp = fopen(".\\data\\asodata.dat", "rb");
	if(!fp){
		printf("不能读取文件!");
		return 0;
	}
	int num = 0,i;
	Association* r = aso;
	fread(&num, sizeof(int), 1, fp);
	for(i=0; i<num; i++){
		Association* newNode = (Association *)malloc(sizeof(Association));
		fread(newNode, sizeof(Association), 1, fp);
		newNode->next = 0;
		r->next = newNode;
		r = r->next;
	}
	fclose(fp);
	return 1;
}

//将数据存到asodatafile.dat里
int saveAsoDataFile(Association* aso){
	FILE *fp;
	if((fp = fopen(".\\data\\asodata.dat", "wb")) == NULL){
        printf("不能打开文件! \n");
        return 0;
    }
	int sNum = 0;
	Association* p;
	for(p=aso->next; p; p=p->next)sNum++;
	printf("正在保存文件......");
	Association* p1;
	fwrite(&sNum, sizeof(int), 1, fp);
	for(p1=aso->next; p1; p1 = p1->next){
		fwrite(p1, sizeof(Association), 1, fp);
	}
	if (fclose(fp) == 0){//关闭成功返回0,否则返回-1 
		return 1;//关闭成功
	}else{
		return 0;//关闭失败 
	}
}

//更新社团信息 
void updateAsoInfo(Association *aso){ 
	char sn[30];
	Association *p;
	printf("请输入要修改的社团的编号或者名字:");
	scanf("%s",sn);
	p = aso->next;//检查是否存在这个社团,若存在则将名字转换为对应的编号 
	do {
		if (strcmp(p->ano,sn) == 0 || strcmp(p->name,sn) == 0){
		strcpy(sn,p->ano);
		break;
		}
		p = p->next; 
	} while (p != NULL);
	if(p==NULL){
		printf("对不起!无该社团的信息!\n");
		return ;
	}
	if (strcmp(p->name,sn) == 0 || strcmp(p->ano,sn) == 0) {
		printf("                            社团信息表                            \n");
	 	printf("__________________________________________________________________\n");
	 	printf("|  编号  |      名称      |  成立时间  |  主要负责人  |   总人数  |\n");
	 	printf("|  ano   |      name      |  creatTime |personInCharge|totlePerson|\n");
	 	printf(" ———— ———————— —————— ——————— ——————\n"); 
		printf("|%8s|%16s|%12d|%14s|%11s|\n",p->ano,p->name,p->creatTime,p->personInCharge,p->totlePerson);
	 	printf(" ———— ———————— —————— ——————— ——————\n"); 
	}
 	printf("---请按顺序更新信息---\n");
 	printf("请问编号需要修改吗?(Y/N)"); //问题:输入两个非‘y’的缓冲字符会把下面的也输入 
 	if(getch() == 'y'){
 		printf("请输入编号:"); 
		scanf("%s",p->ano); 
	}else{
		printf("\n"); 
	}
 	printf("请问名字需要修改吗?(Y/N)");
 	if(getch() == 'y'){
 		printf("请输入名字:");
		scanf("%s",p->name);
	}else{
		printf("\n"); 
	}
	printf("请问需要成立时间修改吗?(Y/N)");
 	if(getch() == 'y'){
 		printf("请输入成立时间(年份):");
		scanf("%d",&p->creatTime);
	}else{
		printf("\n"); 
	}
	printf("请问主要负责人需要修改吗?(Y/N)");
 	if(getch() == 'y'){
 		printf("请输入主要负责人:");
		scanf("%s",p->personInCharge);
	}else{
		printf("\n"); 
	}
	printf("请问总人数需要修改吗?(Y/N)");
 	if(getch() == 'y'){
 		printf("请输入总人数:");
		scanf("%s",p->totlePerson);
	}else{
		printf("\n"); 
	}
	printf("修改完成!\n"); 
}

//查看所有社团,列表显示,按成立时间排序
int asoInfoList(Association *aso){
	Association *p = aso->next, *tmp, *subHead; //定义指针类型用以排序
	//按时间排序算法(没做成功,删去) 
		printf("                            社团信息表                            \n");
	 	printf("__________________________________________________________________\n");
	 	printf("|  编号  |      名称      |  成立时间  |  主要负责人  |   总人数  |\n");
	 	printf("|  ano   |      name      |  creatTime |personInCharge|totlePerson|\n");
	 	printf(" ———— ———————— —————— ——————— ——————\n"); 
	if(p == NULL){
		printf("                            没有记录                         \n\n");
	}else{
		do {
		printf("|%8s|%16s|%12d|%14s|%11s|\n",p->ano,p->name,p->creatTime,p->personInCharge,p->totlePerson);
	 	printf(" ———— ———————— —————— ——————— ——————\n"); 
		p = p->next;
		}while(p != NULL);
	}
}

//显示社团详细信息 
void dispAsoInfo(Association *aso){
	Association *p = aso->next;
	char an[30];
	printf("请输入你要查看的社团的编号或社团名:");
	scanf("%s",an);
 	if(strcmp(p->name,an) == 0 || strcmp(p->ano,an) == 0){
		printf("                            社团信息表                            \n");
	 	printf("__________________________________________________________________\n");
	 	printf("|  编号  |      名称      |  成立时间  |  主要负责人  |   总人数  |\n");
	 	printf("|  ano   |      name      |  creatTime |personInCharge|totlePerson|\n");
	 	printf(" ———— ———————— —————— ——————— ——————\n"); 	
 		printf("|%8s|%16s|%12d|%14s|%11d",p->ano,p->name,p->creatTime,p->personInCharge,p->totlePerson);
	 	printf(" ———— ———————— —————— ——————— ——————\n"); 
	}
	if (p == NULL){
		printf("该社团未找到!\n");
	}
} 

//添加社团信息(尾插法) 
void addAsoInfo(Association *aso){
	Association *s,*r, *r_t;
	r = aso; //r始终指向尾结点,开始时指向头结点
	while (r->next != NULL){
		r = r->next;
	}
	printf("现在为新增的社团输入社团信息\n\n");
	s = (Association *)malloc(sizeof(Association)); //生成新结点 
	printf("---请按顺序录入信息---\n");
	printf("请输入 编号:      "); //重复编号检查没做出来 
	scanf("%s",s->ano);
	printf("请输入 名字:      ");
	scanf("%s",s->name);
	printf("请输入 成立时间(年份):  ");
	scanf("%d",&s->creatTime);
	printf("请输入 主要负责人:");
	scanf("%s",s->personInCharge);
	printf("请输入 总人数:    ");
	scanf("%s",s->totlePerson);
	r->next = s; //将*s 插入到 *r 之后 
	r = s; //作用?
	r->next = NULL;
	printf("录入社团信息完成\n\n"); 
}

//删除社团信息 
void deleteAsoInfo(Association *aso){              
	Association *p,*q,*t;
	char sn[30];
	printf("请输入要删除的社团编号或姓名:");
	scanf("%s",sn);
	p = aso->next;//检查是否存在这名学生
	do{
		if (strcmp(p->ano,sn)==0 || strcmp(p->name,sn)==0) {
			strcpy(sn,p->ano);
			break;
		}
		p = p->next;//注意指针要往后走
	}while(p != NULL);
	if(p==NULL){
		printf("对不起!无该社团的信息!\n");
		return ;
	}
	t = aso;//t指向q的前一个节点,便于删除和释放
	q = aso->next;
	do {
		if(strcmp(q->ano,sn) == 0){
			t->next = q->next;
			free(q);
			printf("删除成功");
			break;
		}
		t = t->next;
		q = q->next; 
	} while (q != NULL);
	if (q == NULL){
		printf("对不起!表中没有您要删除的社团信息!\n"); 
	}
}



//社团信息管理 
void associationInfoManage(Association* aso){
	Association *r = aso;
	int back = 0;  //返回主菜单标记,0不返回,1返回 
	char n[8];
	do {
	   	system("cls");
		printf("################  社团信息管理  ################\n");
		printf("# 1. 查看社团列表(根据创建时间排序)           #\n");
		printf("# 2. 新增社团                                   #\n");
		printf("# 3. 查看社团详细信息                           #\n");
		printf("# 4. 更新社团信息                               #\n");
		printf("# 5. 删除社团                                   #\n");
		printf("#                                               #\n");
		printf("#                               0. 返回主菜单   #\n"); 
		printf("##############################  by MR.DING #####\n");
		printf("请选择您的操作:");
		scanf("%s",n);//参数以字符串的形式输入,以防用户不小心输入字符或字符串,导致系统进入死循环
		switch(getChooce(n)){
			case 1:
				asoInfoList(r);  
				system("pause");
				break;
			case 2:
				addAsoInfo(r);
				if (saveAsoDataFile(r)) {
					printf("文件保存成功!\n");
				}else{
					printf("文件保存失败!\n");
				}
				system("pause");
				break;
			case 3:
				system("pause");
	  		    break;
			case 4:
				asoInfoList(r);
				updateAsoInfo(r);
				if (saveAsoDataFile(r)) {
					printf("文件保存成功!\n");
				}else{
					printf("文件保存失败!\n");
				}
				system("pause");
				break;
			case 5:
				asoInfoList(r);
				deleteAsoInfo(r);
				if (saveAsoDataFile(r)) {
					printf("文件保存成功!\n");
				}else{
					printf("文件保存失败!\n");
				}
				system("pause");
	 	 		break;
			case 0:
				back = 1;
	 	 		break;
			default:
				printf("输入错误!");
				system("pause");
			}
			if (back == 1) {
				break;
			}
	} while (1);
} 

成员信息管理 member.c

//定义学生加入社团的信息对象类型
typedef struct node3{
	char sno[10];    //学生学号 
	char ano[10];    //社团编号
	char job[10];    //会员职务
	struct node3 *next;
}Member; 

int getChooce(char n[]);

//初始化社团成员信息 
void initMbe(Member *mbe){
	mbe->next = NULL;
}

//读取储存在mbedatafile.dat里的数据
int loadMbeDataFile(Member* mbe){
	FILE* fp = fopen(".\\data\\mbedata.dat", "rb");
	if(!fp){
		printf("不能读取文件!");
		return 0;
	}
	int num = 0,i;
	Member* r = mbe;
	fread(&num, sizeof(int), 1, fp);
	for(i=0; i<num; i++){
		Member* newNode = (Member *)malloc(sizeof(Member));
		fread(newNode, sizeof(Member), 1, fp);
		newNode->next = 0;
		r->next = newNode;
		r = r->next;
	}
	fclose(fp);
	return 1;
}



//将数据存到mbedata.dat里
int saveMbeDataFile(Member* mbe){
	FILE *fp;
	if((fp = fopen(".\\data\\mbedata.dat", "wb")) == NULL){
        printf("不能打开文件! \n");
        return 0;
    } 
	int sNum = 0;
	Member* p;
	for(p=mbe->next; p; p=p->next)sNum++;
	printf("正在保存文件......");
	Member* p1;
	fwrite(&sNum, sizeof(int), 1, fp);
	for(p1=mbe->next; p1; p1 = p1->next){
		fwrite(p1, sizeof(Member), 1, fp);
	}
	if (fclose(fp) == 0){//关闭成功返回0,否则返回-1 
		return 1;//关闭成功
	}else{
		return 0;//关闭失败 
	}
}

//用户输入社团会员信息数据
void insertMbeInfo(Student *stu, Association *aso, Member *mbe){ // 录入成员信息 
	char sn[20],an[20],job[10];
	Student *p;
	Association *q;
	Member *r,*s;
	r = mbe;
	printf("请输入社团会员信息:\n");
	printf("请输入学号或姓名:");
	scanf("%s",sn);
	p = stu->next; //检查是否存在这名学生,若存在则将姓名转换为对应的学号
	do{
		if(strcmp(p->sno,sn)==0 || strcmp(p->name,sn)==0){
			strcpy(sn,p->sno);
			break;
		}
		p = p->next;
	}while (p != NULL);
	if(p==NULL){
		printf("对不起!不存在该名学生,您不能添加其入团信息!\n");
		return ;
	}
	printf("请输入社团编号或社团名:");
	scanf("%s",an);
    q = aso->next; //检查是否存在该社团,若存在则将社团名转换为对应的编号
	do{
    	if(strcmp(an,q->name)==0 || strcmp(an,q->ano)==0){
			strcpy(an,q->ano);
			break;
		}
		q=q->next;
	}while(q != NULL);
   	if(q == NULL){
    	printf("对不起!您输入的社团信息有误!\n");
		return ;
	}
	s = (Member *)malloc(sizeof(Member));
	printf("请输入该学生在该社团担任的职务:");
	scanf("%s",job);
	strcpy(s->sno,sn);
	strcpy(s->ano,an);
	strcpy(s->job,job);
	while(r->next != NULL){
		r=r->next;
	}
	s->next = r->next; //循环链表?
	r->next = s;
	printf("成员信息添加成功!\n");
}

//查看社团成员信息 
int MbeInfoList(Student *stu, Association *aso, Member *mbe){ 
	int num = 0,i;
	Member *p = mbe->next;
	Student *r_s = stu->next;
	Association *r_a = aso->next;
	printf("                     会员信息表                  \n");
	printf("___________________________________________________\n");
	printf("|   学号   |   姓名   |     社团名     |   职务   |\n");
	printf("|   sno    |   name   |      name      |   job    |\n");
	printf(" ————— ————— ———————— ————— \n");
	if(p == NULL){
		printf("                      没有记录                 \n\n");
	}else{
		while(p != NULL){
			
			while (strcmp(p->sno,r_s->sno) != 0 && r_s != NULL){	//通过主键查找名字 
				  r_s = r_s->next;
 			} 
 			while (strcmp(p->ano,r_a->ano) != 0 && r_a != NULL){
 				  r_a = r_a->next;
			}
			printf("|%10s|%10s|%16s|%10s|\n",p->sno,r_s->name,r_a->name,p->job);
			printf(" ————— ————— ———————— ————— \n");
			p = p->next;
			r_s = stu; 
			r_a = aso;
		}
	}
	return 1;
}

//删除成员信息 
void deleteMbeInfo(Student *stu, Association *aso, Member *mbe){
	char sn[20];
	char an[20];
	Student *p;
	Association *q;
	Member *r;
	Member *t;
	printf("请输入要删除的学生学号或姓名和社团编号或社团名!\n");  //重复问题  未解决 
	printf("请输入学 号 或 姓 名:");
	scanf("%s",sn);
	p = stu->next; //检查是否存在这名学生
	do{
		if(strcmp(p->sno,sn)==0 || strcmp(p->name,sn)==0){
			strcpy(sn,p->sno);
			break;
		}
		p=p->next; //注意指针要往后走
	}while(p!=NULL);
	if(p == NULL){
		printf("对不起!无该名学生的信息!\n");
		return ;
	}
    printf("请输入社团编号或社团名:"); //社团编号或者社团名重复问题 
    scanf("%s",an);
    q = aso->next; //检查社团编号是否合法
    do{
    	if(strcmp(q->name,an)==0 || strcmp(q->ano,an)==0){
			strcpy(an,q->ano);
    		break;
		}
    	q = q->next;
	} while (q!=NULL);
    if(p == NULL){
    	printf("对不起!您输入的社团信息有误!\n");
		return ;
	}
    t = mbe; //t指向r的前一个节点,便于删除和释放
    r = mbe->next;
    do{
		if(strcmp(r->sno,sn)==0 && strcmp(r->ano,an)==0){
			t->next = r->next;
            free(r);
    	    printf("删除成功!\n");
			break;
		}
		t=t->next;
        r=r->next;
	}while(r!=NULL);
	if(r == NULL){
		printf("对不起!原表中没有您要删除的入团信息!\n");
	}
}

//更新成员信息 
void updateMbeInfo(Student *stu, Association *aso, Member *mbe){
	char sn[20],an[20],mn[20];
	Student *p;
	Association *q;
	Member *r, *t_m;
	printf("请按顺序输入您所要修改社团会员信息!\n");
	printf("社团编号或社团名:");
    scanf("%s",an);
    q = aso->next; //检查是否存在该社团,若存在则将社团名转换为对应的编号
    do{
    	if(strcmp(q->name,an)==0 || strcmp(q->ano,an)==0){
			strcpy(an,q->ano);
			break;
		}
		q = q->next;
	}while(q != NULL);
   	if(q == NULL){
    	printf("对不起!您输入的社团信息有误!\n");
		return ;
	}
	printf("学号或姓名:");
	scanf("%s",sn);
	p = stu->next; //检查是否存在这名学生,若存在则将姓名转换为对应的学号
	do{
		if(strcmp(p->sno,sn)==0 || strcmp(p->name,sn)==0){
			strcpy(sn,p->sno);
			break;
		}
		p=p->next;
	}while(p!=NULL);
	if(p==NULL){
		printf("对不起!无该名学生的信息!\n");
		return ;
	}
   	r = mbe->next;
   	do{
       	if(strcmp(r->sno,sn)==0 && strcmp(r->ano,an)==0){
    		printf("该名学生的当前入团信息为:\n");
			printf("                     会员信息表                  \n");
			printf("___________________________________________________\n");
			printf("|   学号   |   姓名   |     社团名     |   职务   |\n");
			printf("|   sno    |   name   |      name      |   job    |\n");
			printf(" ————— ————— ———————— ————— \n");
    		printf("|%10s|%10s|%16s|%10s|\n",r->sno,p->name,q->name,r->job);
			printf(" ————— ————— ———————— ————— \n");
    		break;
		}
       	r=r->next;
	}while(r!=NULL);
	if(r==NULL){
		printf("对不起!没有您要修改的入团信息!\n");
		return ;
	}
	printf("现在请您重置该名学生的入团信息!\n");
   	printf("学号 或 姓名:");
   	scanf("%s",sn);
   	p = stu->next; //检查学生信息表中是否存在这名学生
	do{
		if(strcmp(p->sno,sn)==0 || strcmp(p->name,sn)==0){
			strcpy(sn,p->sno);
			break;
		}
		p=p->next;
	}while(p != NULL);
	if(p == NULL){
		printf("对不起!您的输入有误!\n");
		return ;
	}
    printf("社团编号或社团名:");
	scanf("%s",an);
	q = aso->next;  //检查是否存在该社团,若存在则将社团名转换为对应的编号
    do{
    	if(strcmp(q->name,an)==0 || strcmp(q->ano,an)==0){
			strcpy(an,q->ano);
			break;
		}
		q = q->next;
	}while(q!=NULL);
   	if(q == NULL){
    	printf("对不起!您输入的社团信息有误!\n");
		return ;
	}
	strcpy(r->sno, sn);
	strcpy(r->ano, an);
    printf("所在社团职务:");
    scanf("%s", r->job);
    printf("成员信息修改成功!\n");
} 

//社团成员信息管理 
void memberInfoManage(Student *stu, Association *aso, Member *mbe){
	Student *p = stu;
	Association *q = aso; 
	Member *r = mbe;
	int back = 0;  //返回主菜单标记,0不返回,1返回 
	char n[8];
	do {
	   	system("cls");
		printf("##############  社团会员信息管理  ##############\n");
		printf("# 1. 查看全部社团会员                          #\n");
		printf("# 2. 录入会员                                  #\n");
		printf("# 3. 查看会员详细信息                          #\n");
		printf("# 4. 更新会员信息                              #\n");
		printf("# 5. 删除会员信息                              #\n");
		printf("# 6. 会员退社                                  #\n");
		printf("#                               0. 返回主菜单  #\n"); 
		printf("##############################  by MR.DING #####\n");
		printf("请选择您的操作:");
		scanf("%s",n); 
		switch(getChooce(n)){
			case 1:
				MbeInfoList(p, q, r);
				system("pause");
				break;
			case 2:
				insertMbeInfo(p, q, r);
				if (saveMbeDataFile(r)) {
					printf("文件保存成功!\n");
				}else{
					printf("文件保存失败!\n");
				}
				system("pause");
				break;
			case 3:
				// 查看会员详细信息(进一步还能看个人详细信息) 没做出来 
				system("pause");
	  		    break;
			case 4:
				MbeInfoList(p, q, r);
				updateMbeInfo(p, q, r); 
				if (saveMbeDataFile(r)) {
					printf("成员信息保存成功!\n");
				}else{
					printf("成员信息保存失败!\n");
				}
				system("pause");
				break;
			case 5:
				MbeInfoList(p, q, r);
				deleteMbeInfo(p, q, r); 
				system("pause");
	 	 		break;
	 	 	case 6:
				 //会员退社 没做出来 
				system("pause");
	 	 		break;
			case 0:
				back = 1;
	 	 		break;
			default:
				printf("输入错误!");
				system("pause");
			}
			if (back == 1) {
				break;
			}
	} while (1);
} 

 

  • 25
    点赞
  • 152
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值