短学期实践

学生成绩管理系统

现在用的结构体数组,(才不是链表改不来,到时候再看看吧=。=)


菜单转跳的两个方式
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);
}
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值