记录我的课程设计(C语言+数据结构)
目录
题目12:高校社团管理系统
编写一个系统完成高校社团的管理,包括录入、查询、删除、修改、排序等操作。社团信息包括:社团名称、创建的时间、主要职责、主要负责人、社团成员等。
功能要求:
- 录入:采用交互式方式录入社团信息后存入文件,之后可导入;
- 查询:可以特定条件查询社团信息;
- 删除
- 修改:根据给出的条件查询出社团信息后进行相应的修改;
- 排序:根据社团的创建时间进行排序。
-------- 界面预览 --------
-------- 以下贴上我的源代码 --------
主菜单 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);
}