学生成绩管理系统
现在用的结构体数组,(才不是链表改不来,到时候再看看吧=。=)
菜单转跳的两个方式
1 switch的
while(1)
{
system("cls"); //清屏
printf(" 主菜单--********* \n");
printf("| 1.******** |\n");
printf("| 0.退出系统 |\n");
printf(" 请输入菜单编号:");
scanf("%d", &n);
while(n<0||n>1)
{
printf("输入错误,请重新输入:");
scanf("%d", &n);
}
if(n==0)
{
printf("感谢您的使用,谢谢!\n");
break;
}
switch(n)
{
case 1:
break;
case 2:
break;
}
}
2 调用函数的
分成多段函数,每次结束后调用相应函数。
代码部分
准备工作
struct stu//结构体
{
char num [20];
char name[20];
int math;
int chengxu;
int sum;
}pp[1000];
int flag=0;//记录人数
1.文件读写
void savedata()//信息保存子函数:将结构体数组中的所存的人员信息保存在PersonInfo.txt文件中
{
int i;
FILE *fp;
if((fp=fopen("PersonInfo.txt","w"))==NULL)
{
printf("cannot open the file\n");
exit(0);
}
for(i=flag-1;i>=0;i--)
{
fprintf(fp,"%s %s %d %d\n",pp[i].num,pp[i].name,pp[i].math,pp[i].chengxu);
}
printf("文件修改已保存!\n");
flose(fp);
}
void inputdata()//信息录入子函数:录入文件中已存在的人员信息
{
int i=0,j=0,n,item=0;
FILE *fp;
fp=fopen("PersonInfo.txt","r");
if(fp==NULL)//如果文件不存在,输出无法打开提示消息
{
printf("无法找到文件,请新建文件\n");
system("pause");
return ;
}
fscanf(fp,"%s%s%d%d",pp[i].num,pp[i].name,&pp[i].math,&pp[i].chengxu);
while(!feof(fp))
{
fscanf(fp,"%s%s%d%d",pp[i].num,pp[i].name,&pp[i].math,&pp[i].chengxu);
pp[i].sum=pp[i].math+pp[i].chengxu;
i++;
item++;//记录文件中数据的数目
}
flag=item;
fclose(fp);
printf("文件内容已录入\n");
system("pause");
stu t;
for(i=0;i<flag-1;i++)//以升序形式对通讯录进行排序
for(j=i+1;j<flag;j++)
{
if(strcmp(pp[i].num,pp[j].num)>0)
{
t=pp[i];
pp[i]=pp[j];
pp[j]=t;
}
}
}
2.主菜单界面
void mainmenu()//主菜单函数:用户输入操作序号,调用程序
{
system("cls");//清屏函数
printf("================================\n");
printf("| 主菜单 |\n");
printf("--------------------------------\n");
printf("| [1]----新建数据 |\n");
printf("| [2]----添加数据 |\n");
printf("| [3]----删除数据 |\n");
printf("| [4]----排序 |\n");
printf("| [5]----查询 |\n");
printf("| [0]----退出并保存 |\n");
printf("================================\n");
printf("请选择你想进行的操作相应序号:");
int x;
while(scanf("%d",&x)&&x<0||x>5)
printf("输入错误,请重输\n");
if(x==1)builddata();
else if(x==2)adddata();
else if(x==3)deletedata();
else if(x==4)sortdata();
else if(x==5)finddata();
else return;
}
3.数据修改
void builddata()//信息查看子函数:用以查看结构体数组中的所有数据
{
int x;
system("cls");
if(flag!=0)printf("已有数据,无需新建\n");
else
{
printf("请输入要新建的人数:\n");
scanf("%d",&x);
flag+=x;
printf("请依次输入\n学号\t 姓名 数学 程序设计\n");
for(int i=0;i<x;i++)
{
scanf("%s%s%d%d",pp[i].num,pp[i].name,&pp[i].math,&pp[i].chengxu);
pp[i].sum=pp[i].math+pp[i].chengxu;
}
}
system("pause");
mainmenu();
}
void adddata()//增加数据
{
system("cls");
printf("请依次输入\n学号\t 姓名 数学 程序设计\n");
scanf("%s%s%d%d",pp[flag].num,pp[flag].name,&pp[flag].math,&pp[flag].chengxu);
pp[flag].sum=pp[flag].math+pp[flag].chengxu;
flag++;
system("pause");
mainmenu();
}
void deletedata()//信息删除
{
system("cls");
char str[10];
int t,i,j;
printf("请输入需要删除的信息的学号:");
scanf("%s",str);
for(i=0;i<flag;i++)
{
if(!strcmp(str,pp[i].num))
{
printf("删除成功,删除的数据为:\n");
printf("学号\t\t姓名\t数学成绩\t程序设计成绩\n");
printf("%s\t%s\t%d\t%d\n",pp[i].num,pp[i].name,pp[i].math,pp[i].chengxu);
t=i;
break;
}
}
if(i==flag)
{
printf("未查到此记录,无法删除,请重新输入!\n");
}
else
{
for(j=t;j<flag-1;j++)
pp[j]=pp[j+1];
flag--;
}
system("pause");
mainmenu();
}
4.排序
void sortdata()
{
system("cls");
printf("================================\n");
printf("| 排序菜单 |\n");
printf("--------------------------------\n");
printf("| [1]----数学成绩排序 |\n");
printf("| [2]----程序设计成绩排序 |\n");
printf("| [3]----总分排序 |\n");
printf("| [4]----退出 |\n");
printf("================================\n");
printf("请选择你想进行的操作相应序号:");
int x;
while(scanf("%d",&x)&&x<1||x>4)
printf("输入错误,请重输\n");
if(x==1)mathsort();
else if(x==2)chengxusort();
else if(x==3)sumdata();
else if(x==4)mainmenu();
}
void mathsort()//其他排序都差不多
{
int i,j;
stu t;
for(i=0;i<flag-1;i++)
{
for(j=0;j<flag-i-1;j++)
{
if(pp[j].math > pp[j+1].math)
{
t=pp[j];pp[j]=pp[j+1];pp[j+1]=t;
}
}
}
printf("已经按数学成绩排序\n");
system("pause");
sortdata();
}
5.查询
void finddata()//主菜单
{
system("cls");
printf("================================\n");
printf("| 查询菜单 |\n");
printf("--------------------------------\n");
printf("| [1]----学号查询 |\n");
printf("| [2]----姓名查询 |\n");
printf("| [3]----数学成绩查询 |\n");
printf("| [4]----程序设计成绩查询 |\n");
printf("| [5]----总分查询 |\n");
printf("| [6]----整体浏览 |\n");
printf("| [7]----退出 |\n");
printf("================================\n");
printf("请选择你想进行的操作相应序号:");
int x;
while(scanf("%d",&x)&&x<1||x>7)
printf("输入错误,请重输\n");
if(x==1)numfind();
else if(x==2)namefind();
else if(x==3)mathfind();
else if(x==4)chengxufind();
else if(x==5)sumfind();
else if(x==6)viewfind();
else if(x==7)mainmenu();
}
比较字符串查找,用strcmp(str,pp[i].num)即可。
void numfind()
{
system("cls");
char str[10];
int t,i;
printf("请输入需要查询的人员信息的学号:");
scanf("%s",str);
for(i=0;i<flag;i++)
{
if(!strcmp(str,pp[i].num))
{
printf("\n学号\t\t姓名\t数学成绩 程序设计成绩\t总成绩\n");
printf("%s\t%s\t%d\t %d\t\t%d\n",pp[i].num,pp[i].name,pp[i].math,pp[i].chengxu,pp[i].sum);
break;
}
}
if(i==flag)
{
printf("记录不存在\n");
}
system("pause");
finddata();
}
成绩查询
void mathfind()
{
system("cls");
int t,i,res=0;//res记录人数
printf("请输入需要查询的人员信息的数学成绩:");
scanf("%d",&t);
printf("\n学号\t\t姓名\t数学成绩\n");
for(i=0;i<flag;i++)
{
if(t<=pp[i].math)
{
res++;
printf("%s\t%s\t%d\n",pp[i].num,pp[i].name,pp[i].math);
}
}
if(res==0)
{
printf("没有学生比此成绩高\n");
}
else printf("共%d人\n",res);
system("pause");
finddata();
}
职工信息管理
链表版本(懒得列功能,直接上全代码了)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct node
{
int num;
char name[50];
char sex[10];
int age;
char xueli[20];
char zhiwu[50];
int gongzi ;
char zhuzhi[50];
char number[20];
struct node* next;
};
struct node *head=NULL ,*end=NULL ;//全局变量方便使用
void save();
void read();
void print();
void add(int n);
struct node*find1(int n);
void gongzifind(int n);
void del(int n);
void numsort();
void gongzisort();
bool judge(struct node* p0);
//工号、姓名、性别、年龄、学历、职务、工资、住址、电话
int main()
{
read();
int n;
while(1)
{
system("cls"); //清屏
printf(" 主菜单--职工信息管理 \n");
printf("------------------------\n");
printf("| 1.职工信息浏览 |\n");
printf("| 2.增加职工信息 |\n");
printf("| 3.修改职工信息 |\n");
printf("| 4.删除职工信息 |\n");
printf("| 5.查询职工信息 |\n");
printf("| 0.退出系统 |\n");
printf("------------------------\n");
printf(" 请输入菜单编号:");
scanf("%d", &n);
while(n<0||n>5)
{
printf("输入错误,请重新输入:");
fflush(stdin);
scanf("%d", &n);
}
if(n==0)
{
printf("感谢您的使用,谢谢!\n");
break;
}
int n1,n2;
switch(n)
{
case 1:
system("cls");
numsort();
print();
system("pause");
break;
case 2:
system("cls");
printf("请输入新增职工人数:");
scanf("%d",&n1);
while(n1<1)
{
printf("输入错误,请重新输入:");
scanf("%d", &n1);
}
add(n1);
fflush(stdin);//清空缓存区
system("pause");
break;
case 3:
{
system("cls");
printf("请输入你要找的工号:");
scanf("%d", &n1);
struct node* temp=find1(n1);
printf("工号\t姓名\t性别\t年龄\t学历\t职务\t工资\t住址\t电话 \n");
if(temp!=NULL)
{
system("cls");
printf("%d\t%s\t%s\t%d\t%s",temp->num,temp->name,temp->sex,temp->age,temp->xueli);
printf("\t%s\t%d\t%s\t%s\n",temp->zhiwu,temp->gongzi,temp->zhuzhi,temp->number);
//工号、姓名、性别、年龄、学历、职务、工资、住址、电话
printf(" 菜单--修改职工信息 \n");
printf("--------------------------\n");
printf("| 1.工号 2.姓名 |\n");
printf("| 3.性别 4.年龄 |\n");
printf("| 5.学历 6.职务 |\n");
printf("| 7.工资 8.住址 |\n");
printf("| 9.电话 0.退出 |\n");
printf("--------------------------\n");
printf(" 请输入菜单编号:");
scanf("%d", &n2);
while(n2<0||n2>9)
{
printf("输入错误,请重新输入:");
scanf("%d", &n2);
}
int res;
char a[100];
if(n2==0)break;
else
switch(n2)
{
case 1:
printf("请输入修改后的工号:");
scanf("%d",&res);
temp->num=res;
break;
case 2:
printf("请输入修改后的姓名:");
scanf("%s",a);
strcpy(temp->name,a);
break;
case 3:
printf("请输入修改后的性别:");
scanf("%s",a);
strcpy(temp->sex,a);
break;
case 4:
printf("请输入修改后的年龄:");
scanf("%d",&res);
temp->age=res;
break;
case 5:
printf("请输入修改后的学历:");
scanf("%s",a);
strcpy(temp->xueli,a);
break;
case 6:
printf("请输入修改后的职务:");
scanf("%s",a);
strcpy(temp->zhiwu,a);
break;
case 7:
printf("请输入修改后的工资:");
scanf("%d",&res);
temp->gongzi=res;
break;
case 8:
printf("请输入修改后的住址:");
scanf("%s",a);
strcpy(temp->zhuzhi,a);
break;
case 9:
printf("请输入修改后的电话:");
scanf("%s",a);
strcpy(temp->number,a);
break;
}
}
}
fflush(stdin);
system("pause");
break;
case 4:
system("cls");
printf("请输入要删除的工号:");
scanf("%d", &n1);
del(n1);
fflush(stdin);
system("pause");
break;
case 5:
{
system("cls");
printf(" 菜单--查询职工信息 \n");
printf("--------------------------\n");
printf("| 1.工号 2.工资 |\n");
printf("| 0.退出 |\n");
printf("--------------------------\n");
printf(" 请输入菜单编号:");
scanf("%d", &n1);
while(n1<0||n1>2)
{
printf("输入错误,请重新输入:");
scanf("%d", &n1);
}
if(n1==0)break;
else
switch(n1)
{
case 1:
{
printf("请输入要查找的工号:");
scanf("%d",&n2);
struct node* temp=find1(n2);
if(temp!=NULL)
{
printf("工号\t姓名\t性别\t年龄\t学历\t职务\t工资\t住址\t电话 \n");
printf("%d\t%s\t%s\t%d\t%s",temp->num,temp->name,temp->sex,temp->age,temp->xueli);
printf("\t%s\t%d\t%s\t%s\n",temp->zhiwu,temp->gongzi,temp->zhuzhi,temp->number);
}
else printf("未找到该工号\n");
break;
}
case 2:
{
printf("请输入要查找的工资:");
scanf("%d",&n2);
gongzifind(n2);
break;
}
}
fflush(stdin);
system("pause");
}
break;
//default:
//printf("输入错误,请重新输入:");
//scanf("%d", &n);
//break;
}
}
save();
return 0;
}
void print()// 输出
{
printf("工号\t姓名\t性别\t年龄\t学历\t职务\t工资\t住址\t电话 \n");
struct node*temp=head;
while(temp!=NULL)
{
printf("%d\t%s\t%s\t%d\t%s",temp->num,temp->name,temp->sex,temp->age,temp->xueli);
printf("\t%s\t%d\t%s\t%s\n",temp->zhiwu,temp->gongzi,temp->zhuzhi,temp->number);
temp = temp->next;
}
}
void add(int n)//添加
{
printf("依次输入(按空格隔开)\n工号\t姓名\t性别\t年龄\t学历\t职务\t工资\t住址\t电话 \n");
int i=0;
while(i<n)
{
struct node *temp=(struct node*)malloc(sizeof(struct node));
scanf("%d %s %s %d %s",&temp->num,temp->name,temp->sex,&temp->age,temp->xueli);
scanf(" %s %d %s %s",temp->zhiwu,&temp->gongzi,temp->zhuzhi,temp->number);//数据
if(judge(temp))
{
continue;
}
temp->next=NULL;
if(head==NULL) //没有节点
{
head=temp;
end=temp;
}
else //有节点
{
end->next=temp;
end=temp;
}
i++;
}
}
struct node*find1(int n)//找到该工号的链表
{
struct node*temp=head;
while(temp!=NULL)
{
if(temp->num==n)break;
temp = temp->next;
}
if(temp==NULL){
printf("未找到该工号\n");
return NULL;
}
return temp;
}
void gongzifind(int n)//找到该工资的
{
struct node*temp=head;
int res=0;
printf("工号\t姓名\t性别\t年龄\t学历\t职务\t工资\t住址\t电话 \n");
while(temp!=NULL)
{
if(temp->gongzi==n)
{
res++;
printf("%d\t%s\t%s\t%d\t%s",temp->num,temp->name,temp->sex,temp->age,temp->xueli);
printf("\t%s\t%d\t%s\t%s\n",temp->zhiwu,temp->gongzi,temp->zhuzhi,temp->number);
}
temp = temp->next;
}
if(res==0){
printf("未找到对应工资的人\n");
}
}
void del(int n)//删除
{
struct node *p1,*p2;
if(head==NULL)
{
printf("没有找到该工号\n");
return;
}
printf("工号\t姓名\t性别\t年龄\t学历\t职务\t工资\t住址\t电话 \n");
p1=head;
while(n!=p1->num&&p1->next!=NULL)
{
p2=p1;
p1=p1->next;
}
if(n==p1->num)
{
if(p1==head)head=p1->next; //如果头指针是要删除的
else p2->next=p1->next;
printf("删除的工号是:%d\n",n);
printf("%d %s %s %d %s",p1->num,p1->name,p1->sex,p1->age,p1->xueli);
printf(" %s %d %s %s\n",p1->zhiwu,p1->gongzi,p1->zhuzhi,p1->number);
free(p1);
}
else printf("没有找到该工号\n");
}
void numsort() //排序
{
int k=0;
struct node *p1=head,*p2;
char a[100];
int temp;
while(1)
{
while(p1->next!=NULL)
{
p2=p1->next;
if(p1 ->num > p2 ->num)
{
temp=p1->num;p1->num=p2->num;p2->num=temp;
temp=p1->age;p1->age=p2->age;p2->age=temp;
temp=p1->gongzi;p1->gongzi=p2->gongzi;p2->gongzi=temp;
strcpy(a,p1->name);strcpy(p1->name,p2->name);strcpy(p2->name,a);
strcpy(a,p1->sex);strcpy(p1->sex,p2->sex);strcpy(p2->sex,a);
strcpy(a,p1->xueli);strcpy(p1->xueli,p2->xueli);strcpy(p2->xueli,a);
strcpy(a,p1->zhiwu);strcpy(p1->zhiwu,p2->zhiwu);strcpy(p2->zhiwu,a);
strcpy(a,p1->zhuzhi);strcpy(p1->zhuzhi,p2->zhuzhi);strcpy(p2->zhuzhi,a);
strcpy(a,p1->number);strcpy(p1->number,p2->number);strcpy(p2->number,a);
k++;
}
p1=p1->next;
}
p1 = head;
if(k>0)k=0;
else break;
}
}
void gongzisort() //排序
{
int k=0;
struct node *p1=head,*p2;
char a[100];
int temp;
while(1)
{
while(p1->next!=NULL)
{
p2=p1->next;
if(p1 ->gongzi > p2 ->gongzi)
{
temp=p1->num;p1->num=p2->num;p2->num=temp;
temp=p1->age;p1->age=p2->age;p2->age=temp;
temp=p1->gongzi;p1->gongzi=p2->gongzi;p2->gongzi=temp;
strcpy(a,p1->name);strcpy(p1->name,p2->name);strcpy(p2->name,a);
strcpy(a,p1->sex);strcpy(p1->sex,p2->sex);strcpy(p2->sex,a);
strcpy(a,p1->xueli);strcpy(p1->xueli,p2->xueli);strcpy(p2->xueli,a);
strcpy(a,p1->zhiwu);strcpy(p1->zhiwu,p2->zhiwu);strcpy(p2->zhiwu,a);
strcpy(a,p1->zhuzhi);strcpy(p1->zhuzhi,p2->zhuzhi);strcpy(p2->zhuzhi,a);
strcpy(a,p1->number);strcpy(p1->number,p2->number);strcpy(p2->number,a);
k++;
}
p1=p1->next;
}
p1 = head;
if(k>0)k=0;
else break;
}
}
bool judge(struct node *p0)
{
struct node *temp=head;
if(head==NULL)return false;
while(temp!=NULL)
{
if(temp->num==p0->num)
{
printf("该工号已存在 请重新输入\n");
free(p0);
return true;
}
temp=temp->next;
}
return false;
}
void read()//信息录入子函数:录入文件中已存在的人员信息
{
int n=0;
struct node*p1,*p2;
FILE *fp;
fp=fopen("zhigong.txt","r");
if(fp==NULL)//如果文件不存在,输出无法打开提示消息
{
printf("无法找到文件,请新建文件\n");
system("pause");
return ;
}
head = NULL;
p1=(struct node*)malloc(sizeof(struct node));
fscanf(fp,"%d %s %s %d %s %s %d %s %s",&p1->num,p1->name,p1->sex,&p1->age,p1->xueli,p1->zhiwu,&p1->gongzi,p1->zhuzhi,p1->number);
while(!feof(fp))
{ if(n==0)head=p1;
else p2->next=p1;
p1->next=NULL;
p2=p1; n++;
p1=(struct node*)malloc(sizeof(struct node));
fscanf(fp,"%d %s %s %d %s %s %d %s %s",&p1->num,p1->name,p1->sex,&p1->age,p1->xueli,p1->zhiwu,&p1->gongzi,p1->zhuzhi,p1->number);
}
end=p2;
fclose(fp);
}
//工号、姓名、性别、年龄、学历、职务、工资、住址、电话
void save()
{
struct node*p1=head;
FILE *fp;
if((fp=fopen("zhigong.txt","w"))==NULL)
{
printf("cannot open the file\n");
exit(0);
}
while(p1!=NULL)
{
fprintf(fp,"%d %s %s %d %s %s %d %s %s\n",p1->num,p1->name,p1->sex,p1->age,p1->xueli,p1->zhiwu,p1->gongzi,p1->zhuzhi,p1->number);
p1=p1->next;
}
printf("文件修改已保存!\n");
fclose(fp);
}