这个其实是我之前为了进入学校的实验室而写的一个小项目,关于需要实现的功能(在菜单里)和具体思路就都写在代码里了,所以直接看完整的代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include<malloc.h>
#include<ctype.h>
typedef struct project{
char progname[50];
char host[50];
char members[100];
char conductor[50];
int membernum;
char progkind[50];
char prognum[50];
struct project *next;
}PROJECT;
//定义一些全局变量
char prognam[50];
char hos[50];
char member[100];
char conducto[50];
int membernu;
char progkin[50];
char prognu[50];
//针对输入非法的改正
int check1()
{
while (true)
{
char s[50];
scanf("%s", s);
int res = 0;
bool flag = true;
for (int i = 0; i < strlen(s); i ++ ) {
if (s[i] >= '0' && s[i] <= '9')
{
res = res * 10 + s[i] - '0';
}
else
{
flag = false;
}
}
if (flag == false) printf("输入非法! 请重新输入:");
else
{
return res;
}
}
}
int check2()
{
while (true)
{
char s[50];
scanf("%s", s);
int res = 0;
bool flag = true;
for (int i = 0; i < strlen(s); i ++ ) {
if (s[i] >= '0' && s[i] <= '9')
{
res = res * 10 + s[i] - '0';
}
else
{
flag = false;
}
}
if (flag == false || res >= 9) printf("输入非法! 请重新输入一个1-8的数字:");
else
{
return res;
}
}
}
//随机输入一个七个字符长度的项目编号
char*prognumBuild()
{
char mysql1[]="0123456789";
char mysql2[]="abcdefghljklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
int i;
int num_size1;
int num_size2;
int random;
char *prognum=(char *)malloc(sizeof(char));
srand((unsigned)time(NULL));
num_size1=rand()%1+6;
num_size2=rand()%1+1;
for(i=0;i<num_size2;i++)
{
random=rand()%(strlen(mysql2));
*(prognum+i)=mysql2[random];
}
for(i=num_size2;i<7;i++)
{
random=rand()%(strlen(mysql1));
*(prognum+i)=mysql1[random];
}
return prognum;
}
void menu()/* 菜单界面*/
{
printf("\t\t\t **************************************************\n\n");
printf("\t\t\t * 学生信息管理系统 * \n\n");
printf("\t\t\t ******************************************************\n\n");
printf("\t\t\t*********************系统功能菜单*************************\n");
printf("\t\t\t ---------------------- ---------------------- \n");
printf("\t\t\t ********************************************* \n");
printf("\t\t\t * 1.插入项目信息 * \n");
printf("\t\t\t ********************************************* \n");
printf("\t\t\t * 2.降序输出项目信息 * * 3.删除学生信息 * \n");
printf("\t\t\t ********************************************* \n");
printf("\t\t\t * 4.按项目编号修改学生信息 * * 5.按项目类别查询信息 * \n");
printf("\t\t\t ********************************************* \n");
printf("\t\t\t * 6.按项目编号查询信息 * * 7.显示更新后的所有项目信息*\n");
printf("\t\t\t ********************** ********************** \n");
printf("\t\t\t * 8.退出系统 * \n");
printf("\t\t\t ********************** \n");
printf("\t\t\t ---------------------- ---------------------- \n");
}
//关于第3,4,6个功能要求支持模糊搜索(就是输入一个关键字,相关的项目信息都会显示出来)
void InitList(PROJECT *&L)//初始化链表
{
L=(PROJECT *)malloc(sizeof(PROJECT));
L->next=NULL;
}
//查找尾结点
PROJECT *findLast(PROJECT *L)
{
PROJECT *pt;
pt=L;
while(pt->next!=NULL)
{
pt=pt->next;
}
return pt;
}
//插入项目信息
void prog_add(PROJECT *&L)
{
PROJECT *prePt,*pt;
pt=(PROJECT *)malloc(sizeof(PROJECT));
printf("项目名为:");
scanf("%s",prognam);
strcpy(pt->progname,prognam);
printf("负责人为:");
scanf("%s",hos);
strcpy(pt->host,hos);
printf("队员为:");
scanf("%s",member);
strcpy(pt->members,member);
printf("指导老师为:");
scanf("%s",conducto);
strcpy(pt->conductor,conducto);
printf("队员人数为:");
membernu = check1();
pt->membernum=membernu;
printf("项目类型为:");
scanf("%s",progkin);
strcpy(pt->progkind,progkin);
printf("项目编号为:%s\n",prognumBuild());
strcpy(pt->prognum,prognumBuild());
prePt=findLast(L);
prePt->next=pt;
pt->next=NULL;
printf("增加成功!\n");
}
//浏览全部项目信息
void display(PROJECT *&L)
{
PROJECT *pt=L->next;
if(pt==NULL)
{
printf("还没有项目信息,请增加项目信息!\n");
return;
}
while(pt)
{
printf("项目名为:%s\t",pt->progname);
printf("负责人为:%s\t",pt->host);
printf("队员为:%s\t",pt->members);
printf("指导老师为:%s\t",pt->conductor);
printf("队员人数为:%d\t",pt->membernum);
printf("项目类别为:%s\t",pt->progkind);
printf("项目编号为:%s\n",pt->prognum);
pt=pt->next;
}
}
//按项目编号降序输出项目信息
void low_print(PROJECT *L)
{
PROJECT *p,*q,*r;
r=L->next;
while(r!=NULL)
{
p=r;
q=r->next;
PROJECT *temp;
InitList(temp);
while(q!=NULL)
{
if(strcmp(p->prognum,q->prognum)<0)
{
//项目名
strcpy(temp->progname,p->progname);
strcpy(p->progname,q->progname);
strcpy(q->progname,temp->progname);
//负责人
strcpy(temp->host,p->host);
strcpy(p->host,q->host);
strcpy(q->host,temp->host);
//队员
strcpy(temp->members,p->members);
strcpy(p->members,q->members);
strcpy(q->members,temp->members);
//指导老师
strcpy(temp->conductor,p->conductor);
strcpy(p->conductor,q->conductor);
strcpy(q->conductor,temp->conductor);
//队员人数
temp->membernum=p->membernum;
p->membernum=q->membernum;
q->membernum=temp->membernum;
//项目类型
strcpy(temp->progkind,p->progkind);
strcpy(p->progkind,q->progkind);
strcpy(q->progkind,temp->progkind);
//项目编号
strcpy(temp->prognum,p->prognum);
strcpy(p->prognum,q->prognum);
strcpy(q->prognum,temp->prognum);
}
q=q->next;
}
r=r->next;
}
printf("排序后的项目信息为:\n");
display(L);
}
//模糊搜索,按项目编号删除项目信息
void prog_delete(PROJECT *L)
{
char ch[10];
PROJECT *pt,*prePt;
prePt=L;
pt=prePt->next;
printf("请输入一个关键字:");
scanf("%s",&ch);
int flag=0;
while(pt!=NULL)
{
if(strstr(pt->prognum,ch)!=NULL)
{
printf("需要删除项目的项目编号为:%s\n",pt->prognum);
prePt->next=pt->next;
free(pt);
flag=1;
break;
}
else
{
prePt=pt;
pt=pt->next;
}
}
if(flag==1)
{
printf("删除项目信息成功!\n");
}
else
{
printf("抱歉,未找到相关的项目信息!\n");
}
}
//模糊搜索,按项目编号修改项目信息
void prog_change(PROJECT *L)
{
char ch[10];
PROJECT *pt;
pt=L->next;
printf("请输入一个关键字:\n");
scanf("%s",&ch);
int flag=0;
while(pt!=NULL)
{
if(strstr(pt->prognum,ch)!=NULL)
{
printf("%s",pt->prognum);
flag=1;
printf("请输入需要修改的项目信息:(1.项目名 2.负责人 3.队员 4.指导老师 5.队员人数 6.项目类别)\n");
int choose;
scanf("%d",&choose);
switch(choose)
{
case 1:
printf("请输入您要修改的项目名:\n");
scanf("%s",prognam);
printf("修改后的项目名为:%s\n",prognam);
strcpy(pt->progname,prognam);
printf("修改成功!\n");
break;
case 2:
printf("请输入您要修改的负责人:\n");
scanf("%s",hos);
printf("修改后的负责人为:%s\n",hos);
strcpy(pt->host,hos);
printf("修改成功!\n");
break;
case 3:
printf("请输入您要修改的队员:\n");
scanf("%s",member);
printf("修改后的队员为:%s\n",member);
strcpy(pt->members,member);
printf("修改成功!\n");
break;
case 4:
printf("请输入要修改的指导老师:\n");
scanf("%s",conducto);
printf("修改后的指导老师为:%s\n",conducto);
strcpy(pt->conductor,conducto);
printf("修改成功!\n");
break;
case 5:
printf("请输入要修改的队员人数:\n");
scanf("%d",&membernu);
printf("修改后的队员人数为:%d\n",membernu);
pt->membernum=membernu;
printf("修改成功!\n");
break;
case 6:
printf("请输入要修改的项目类别:\n");
scanf("%s",progkin);
printf("修改后的项目类别为:%s\n",progkin);
strcpy(pt->progkind,progkin);
printf("修改成功!\n");
break;
default :
printf("请重新输入1-6的数字\n");
break;
}
}
pt=pt->next;
}
if(flag==0)
{
printf("抱歉,未找到相关的项目信息!\n");
}
}
//按项目类别查询项目信息
void kind_search(PROJECT *L)
{
int flag=0;
PROJECT *pt;
pt=L->next;
printf("请输入相关项目类别,便于您查找相关项目信息:\n");
char s[100];
scanf("%s",s);
while(pt!=NULL)
{
if(strcmp(s,pt->progkind)==0)
{
flag=1;
printf("该项目的项目名为:%s\n",pt->progname);
printf("该项目的负责人为:%s\n",pt->host);
printf("该项目的队员为:%s\n",pt->members);
printf("该项目的指导老师为:%s\n",pt->conductor);
printf("该项目的队员人数为:%d\n",pt->membernum);
printf("该项目的项目编号为:%s\n",pt->prognum);
break;
}
else
{
pt=pt->next;
}
}
if(flag==0)
{
printf("抱歉,未找到相关的项目信息!\n");
}
}
//模糊搜索,按项目编号查询项目信息
void num_search(PROJECT *L)
{
char ch[10];
PROJECT *pt;
pt=L->next;
printf("请输入一个关键字:");
scanf("%s",ch);
int flag=0;
while(pt!=NULL)
{
if(strstr(pt->prognum,ch)!=NULL)
{
flag=1;
printf("%s\n",pt->prognum);
printf("该项目的项目名为:%s\n",pt->progname);
printf("该项目的负责人为:%s\n",pt->host);
printf("该项目的队员为:%s\n",pt->members);
printf("该项目的指导老师为:%s\n",pt->conductor);
printf("该项目的队员人数为:%d\n",pt->membernum);
printf("该项目的项目类别为:%s\n",pt->progkind);
}
pt=pt->next;
}
if(flag==0)
{
printf("抱歉,未找到相关的项目信息!\n");
}
}
//将项目信息保存在文本文件中
void saveProjectFile(PROJECT *&L)
{
FILE *fp;
PROJECT *pt;
pt=L->next;
if((fp=fopen("project.txt","w"))==NULL)//对文件进行写操作
{
printf("文件不能打开!\n");
exit(0);
}
while(pt!=NULL)
{
fprintf(fp,"%s %s %s %s %d %s %s\n",pt->progname,pt->host,pt->members,pt->conductor,pt->membernum,pt->progkind,pt->prognum);
pt=pt->next;
printf("保存成功!\n");
}
fclose(fp);
}
int main()
{
PROJECT *L;
InitList(L);
printf("请输入需要管理的项目信息数量:");
int n = check1();
for(int i = 0; i < n; i ++ )
{
printf("请输入第%d个项目的相关信息:\n",i+1);
prog_add(L);
}
int choose,x;
while(1)
{
menu();
printf("\n");
printf("请输入您的选择:\n");
choose = check2();
switch(choose)
{
case 1:
prog_add(L);
break;
case 2:
low_print(L);
break;
case 3:
prog_delete(L);
break;
case 4:
prog_change(L);
break;
case 5:
kind_search(L);
break;
case 6:
num_search(L);
break;
case 7:
display(L);
saveProjectFile(L);
break;
case 8:
printf("谢谢使用!\n");
exit(0);
default:
break;
}
}
return 0;
}
这是我大一上学期期中时写的项目,所以可能会有许多还可以改进的地方,如果小伙伴们有什么更好的建议,欢迎在评论区写下你们的宝贵建议,谢谢各位小伙伴!