学生信息管理系统2.0

奋斗奋斗奋斗

/*
@copyright from LZY. 
@time:23.11.2016.
@name:学生信息管理系统
@界面:DOS.
@版本:2.0 
*/
#include<stdio.h>
#include<stdlib.h>
#include<process.h>
#include<string.h>
#include<conio.h> 
#define N 10
typedef struct student
  {
    char name[8];
    unsigned No;
    float math,Chinese,English;
    float ave;
    struct student *next;/*保存下一个stu的地址*/
   }NODE,*linklist;
void zhu();

void scan(int a[],int n)
{
    int i;
    printf("\n请输入%d个人成绩\n",n);
    for(i=0;i<n;i++)
     scanf("%d",&a[i]);
}
/*****************************************************************************/
void sort(int a[],int n, char style)
{
 int i,j,t;
if(style=='a')
 { 
 for(i=0;i<n-1;i++)
   for(j=0;j<n-1-i;j++)
   {if(a[j]>a[j+1])
     {t=a[j];a[j]=a[j+1];a[j+1]=t;}
   }
   printf("按照升序排列的结果:\n");
   for(i=0;i<n;i++)
    printf("%d\t",a[i]);
    printf("\n");
    
}   
   if(style=='d')
 {
     for(i=0;i<n-1;i++)
       for(j=0;j<n-1-i;j++)
       {
          if(a[j+1]>a[j])
         { t=a[j];a[j]=a[j+1];a[j+1]=t;}
       }
    printf("按照降序排列的结果:\n");
    for(i=0;i<n;i++)
    printf("%d\t",a[i]);
    printf("\n");
   
    }

}
/*****************************************************************************/
void scan_1(int a[],int n)
{
    int i;
	printf("定义一个数组stu[10]存放10个学生的成绩,从键盘输入数据\n ");
    for(i=0;i<n;i++)
     scanf("%d",&a[i]);
}
/*****************************************************************************/

void sort_stu (int a[],int n)
    {
        int i,j,t;
		printf("\n将成绩数组按照从高到低进行排序\n");
        for(i=0;i<n-1;i++)
         for(j=0;j<n-1-i;j++)
         if(a[j+1]>a[j])
          {t=a[j+1];a[j+1]=a[j];a[j]=t;}
   }

/*****************************************************************************/
void print_stu(int a[],int n)
    {
        int i;
		printf("\n将数组stu[10]的内容输出到屏幕上\n");
        for(i=0;i<n;i++)
         printf("%d\t",a[i]);
         printf("\n");
    }

/*****************************************************************************/
void  scan_str(char str[])
    {
       int i=0;
        printf("输入字符串‘student score’ ,复制该字符串并输出\n"); 
        fflush(stdin);
        gets( str);
        printf("输出该字符串\n");
        printf("%s",str);
        printf("\n");
    }   

 /*****************************************************************************/   
void  scan_con(struct student *p,int n)
{
    int i;
    printf("格式:姓名,学号,成绩(数学,语文,英语)\n\n"); 
    for(i=0;i<n;i++,p++)
    {
   printf("请输入第%d个学生数据\n",i+1);
    scanf("%s%d%f%f%f",(*p).name,&(*p).No,&(*p).math,&(*p).Chinese,&(*p).English);
    }
    
}
/*****************************************************************************/
int  Max1(struct student *p)
{
	int i,a;
	float max1=p->math;
  for(i=0;i<10;i++){
  if((p+i)->math>max1){  max1=(p+i)->math; a=i; }} 
   return a;
 }
int  Max2(struct student *p){
	int i,b;
	float max2=p->Chinese;
     for(i=0;i<10;i++){
  if((p+i)->Chinese>max2)  {max2=(p+i)->Chinese; b=i;}} 
  return b;

}
int  Max3(struct student *p){
	int i,c;
	float max3=p->English;
	 for(i=0;i<10;i++){
  if((p+i)->English>max3)  {max3=(p+i)->English; c=i;}} 
  return c;
}
/*****************************************************************************/
void  print_con(struct student *p)
    
{   
    int m=0,c=0,e=0;
    m=Max1(p);
    c=Max2(p);
    e=Max3(p);
    printf("\n\n输出单门课成绩最高的学生的学号、姓名、以及该门课程的成绩\n");      
    printf("max math:");      
    printf("%s\t%d\t%.2f\n",(p+m)->name,(p+m)->No,(p+m)->math);
    printf("max Chinese:");
    printf("%s\t%d\t%.2f\n",(p+c)->name,(p+c)->No,(p+c)->Chinese);
    printf("max English:");
    printf("%s\t%d\t%.2f\n",(p+e)->name,(p+e)->No,(p+e)->English);
    }
/******************************************************************************/    

 void  print_aver(struct student *p,int n)
       {
        int i,e=0;
        float max;
        for(i=0;i<n;i++){
         p[i].ave=(p+i)->math+(p+i)->Chinese+(p+i)->English;
		 }
         for(i=0;i<n;i++){
          p[i].ave=(1.0/3.0)*p[i].ave;
         }
         max=p[0].ave;
      for(i=0;i<n;i++){
		if(p[i].ave>max)   {max=p[i].ave;   e=i;}
      }
	
        printf("\n输出三门课程的平均分数最高的学生的学号、姓名及其平均分\n");
        printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",(p+e)->No,(p+e)->name,(p+e)->math,(p+e)->Chinese,(p+e)->English,(p+e)->ave);
    
  }
 /*****************************************************************************/   
    
void        sort_aver(struct student *p,int n)
        {
            int i,j;
           struct student t;
            for(i=0;i<n-1;i++)
             for(j=0;j<n-1-i;j++)
              {
                if(p[j+1].ave>p[j].ave){
                t=*(p+j);*(p+j)=*(p+j+1);*(p+j+1)=t; 
				 }
              } 
             printf("\n将10个学生按照平均分数从高到低进行排序\n"); 
            printf("number\t\tname\tmath\tChinese\tEnglish\tave\n") ;
          
        for(i=0;i<n;i++)
            printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",(p+i)->No,(p+i)->name,(p+i)->math,(p+i)->Chinese,(p+i)->English,(p+i)->ave);
     }
/*****************************************************************************/
void  scan_con_1(FILE *fp,struct student *p,int n)
{
    int i;
    for(i=0;i<n;i++,p++)
    {
    fprintf(stdout,"请输入第%d个学生数据(姓名,学号,成绩(数学,语文,英语))\n",i+1);
    fscanf(stdin,"%s%d%f%f%f",(*p).name,&(*p).No,&(*p).math,&(*p).Chinese,&(*p).English);
    }
    
}
/*****************************************************************************/
void  print_con_1(FILE *fp,struct student *p)
    {   
    int m=0,c=0,e=0;
    m=Max1(p);
    c=Max2(p);
    e=Max3(p);
    fprintf(stdout,"\n\n输出单门课成绩最高的学生的学号、姓名、以及该门课程的成绩\n"); 
    fprintf(stdout,"max math:");      
    fprintf(stdout,"%s\t%d\t%.2f\n",(p+m)->name,(p+m)->No,(p+m)->math);
    fprintf(stdout,"max Chinese:");
    fprintf(stdout,"%s\t%d\t%.2f\n",(p+c)->name,(p+c)->No,(p+c)->Chinese);
    fprintf(stdout,"max English:");
    fprintf(stdout,"%s\t%d\t%.2f\n",(p+e)->name,(p+e)->No,(p+e)->English);
    }
/*****************************************************************************/
void  print_aver1(FILE *fp,struct student *p,int n)
       {
       int i,e=0;
        for(i=0;i<n;i++){
         p[i].ave=(p+i)->math+(p+i)->Chinese+(p+i)->English;
		 }
         for(i=0;i<n;i++){
          p[i].ave=(1.0/3.0)*p[i].ave;
         }
      for(i=0;i<n;i++){
		if(p[i].ave>p[0].ave)   e=i;}
        fprintf(stdout,"\n输出三门课程的平均分数最高的学生的学号、姓名及其平均分\n");
        fprintf(stdout,"%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",(p+e)->No,(p+e)->name,(p+e)->math,(p+e)->Chinese,(p+e)->English,(p+e)->ave);
}
 /*****************************************************************************/   
void       print_aver_con(FILE *fp,struct student *p,int n)
        {
            int i,j,e=0;
            float t=0;
        for(i=0;i<n;i++){
         p[i].ave=(p+i)->math+(p+i)->Chinese+(p+i)->English;
		 }
         for(i=0;i<n;i++){
          p[i].ave=(1.0/3.0)*p[i].ave;
         }
            for(i=0;i<n-1;i++)
             for(j=0;j<n-1-i;j++)
              {
                if(p[j+1].ave>p[j].ave){
                t=p[j].ave;p[j].ave=p[j+1].ave;p[j+1].ave=t; 
				 }
              } 
             fprintf(stdout,"\n将10个学生按照平均分数从高到低进行排序\n");
            fprintf(stdout,"number\t\tname\tmath\tChinese\tEnglish\tave\n") ;
            for(i=0;i<n;i++)
            fprintf(stdout,"%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\n",(p+i)->No,(p+i)->name,(p+i)->math,(p+i)->Chinese,(p+i)->English,(p+i)->ave);
 }
/*****************************************************************************/
void print_aver_con2(FILE *fp,struct student *p )
{
int i;
fprintf(stdout,"\n从studsort.dat 文件中读取第2,4,6,8,10个学生的数据。\n");
for(i=2;i<=10;i=i+2)
{
 fprintf(stdout,"%d\t%s\t%.2f\t%.2f\t%.2f",(p+i-1)->No,(p+i-1)->name,(p+i-1)->math,(p+i-1)->Chinese,(p+i-1)->English);
 fprintf(stdout,"\n");
}
}
/******************************************************************************/
/*struct stu *h;===>NoDE *h or linklist h;等价;定义一个单链表*/
 linklist create(int n)
 {
    linklist h,f,p;
    int i;

   h=(linklist) malloc(sizeof(NODE));/*申请空间*/
   f=p=h;
   printf("请输入姓名,学号以及三门课成绩\n"); 
  scanf("%s%d%f%f%f",(*p).name,&(*p).No,&(*p).math,&(*p).Chinese,&(*p).English);
   for(i=1;i<n;i++)
   {   f=p;
      p=(linklist) malloc(sizeof(NODE));/*申请空间*/
     scanf("%s%d%f%f%f",(*p).name,&(*p).No,&(*p).math,&(*p).Chinese,&(*p).English);
   f->next=p;
   }
   p->next=NULL;
   return(h);
 }
 /*****************************************************************************/
 void pt(linklist h)
 {
    linklist p=h; 
    printf("\n输出的结果是:\n");
    while(p!=NULL)
    {
      printf("%s\t%d\t%.2f\t%.2f\t%.2f\n",p->name,p->No,p->math,p->Chinese,p->English);
    p=p->next;
    }
 }
/*****************************************************************************/
linklist del_xh(linklist h,int num)
 {
  	linklist current_node=h;
    linklist previous=0;
	while(current_node!=0&&(current_node->No!=num))
{
	previous=current_node;
	current_node=current_node->next;
}
if(current_node!=0&&previous==0)
{
	h=current_node->next;
	delete current_node;
	printf("学号:%d成功删除 \n",num);
}
else if(current_node!=0&&previous!=0)
{
	previous->next=current_node->next;
	delete current_node;
	printf("学号:%d成功删除 \n",num);
}
else 
 printf("对不起,链表中没有这个人员的信息 \n");
return (h);
}
/*****************************************************************************/ 
 linklist del_xm(linklist h,char str[])
 {
  linklist current_node=h;
    linklist previous=0;
	while(current_node!=0&&strcmp(current_node->name,str)!=0)
{
	previous=current_node;
	current_node=current_node->next;
}
if(current_node!=0&&previous==0)
{
	h=current_node->next;
	delete current_node;
	printf("姓名:%s成功删除 \n",str);
}
else if(current_node!=0&&previous!=0)
{
	previous->next=current_node->next;
	delete current_node;
	printf("姓名:%s成功删除 \n",str);
}
else
 printf("对不起,链表中没有这个人员的信息 \n");
return (h);
 }
 /*************************链表的插入*****************************************/ 
linklist insert(linklist head,linklist  stud)
{
linklist p1,p2,p3;
  p1=head;
  p2=stud;
  while( (p2->No>p1->No)&&(p1->next!=NULL))
   {
   	p3=p1;
   	p1=p1->next;}
   if(p2->No<=p1->No)                          
  {
      if(head==p1)  head=p2;
	  else p3->next=p2;
	  p2->next=p1;	}
    else  
     { p1->next=p2;p2->next=NULL;} 
    return(head);
}
/*****************************************************************************/
 void case1(){
   
     char style;
     int stu[N]={0};
   /* n个学生成绩从高到低排名 */
    printf("please input a(升序) or d(降序)\t");
    scanf(" %c",&style);
    scan( stu,N);
    sort(stu,N, style);
    printf("按任意键返回主菜单:\n");
     getch();
     system("cls");
     zhu();
 }
/*****************************************************************************/
  void case2(){
  	
     char stu_score[20]={0}; 
	 int stu[N];
    /* 定义一个数组stu[10]存放10个学生的成绩,从键盘输入数据 */
    scan_1(stu,N);
    /* 将数组stu[10]的内容输出到屏幕上 */
    print_stu(stu,N);
    /* 将成绩数组按照从高到低进行排序 */
    sort_stu(stu,N);
    /* 将数组stu[10]的内容输出到屏幕上(排序后) */
    print_stu(stu,N);
    /* 输入字符串"student score ",复制该字符串并输出 */

    scan_str(stu_score);
    printf("\n");
    printf("按任意键返回主菜单:\n");
    getch();
    system("cls");
    zhu();
    }
/*****************************************************************************/   
  void case3(){
   	struct student s[N];
    float a[N]={0};
   
    /* 从键盘输入10个学生的以上内容 */
    scan_con(s,N) ;
    /* 输出单门课成绩最高的学生的学号、姓名、以及该门课程的成绩 */
    print_con(s);
    /* 输出三门课程的平均分数最高的学生的学号、姓名及其平均分 */
    print_aver(s,N);
    /* 将10个学生按照平均分数从高到低进行排序 */
    sort_aver(s,N);
     printf("\n");
     printf("按任意键返回主菜单:\n");
    getch();
    system("cls");
    zhu();
 }
 /*****************************************************************************/
 void case4(){
 		struct student s[N];
 	    FILE *fp;   
/* 从键盘输入10个学生的以上内容,存入文件stud.dat,关闭文件 */
if((fp=fopen("stud.dat","w"))==NULL){
printf("FILE OPEN ERROR!\n");
exit(0);
}
scan_con_1(fp,s,N);
/* 打开stud.dat文件,将数据读出,查看是否正确写入,关闭文件。 */
print_con_1(fp,s);
fclose(fp);

/*打开文件stud.dat文件,读出数据,将10个学生按照平均分数从高到低进行排序,
分别将结果输出到屏幕上和另一文件studsort.dat中。   */

if((fp=fopen("stud.dat","r"))==NULL){
printf("FILE OPEN ERROR!\n");
exit(0);
}
print_aver_con(fp,s,N);
fclose(fp);
print_aver_con2(fp,s);
printf("\n");
printf("按任意键返回主菜单:\n");
getch();
system("cls");
zhu();
}
/*****************************************************************************/
void case5(){
   int s,m,j,i=0; 
   char k[8]; 
   linklist l,h,p;
   NODE stu;
   printf("请输入学生人数\n");
   scanf("%d",&m);
   l=create(m);
   pt(l);
   printf("请根据学号或姓名修改数据:\n1.学号\t2.姓名\n");
   printf("你的选择:\t");
   scanf("%d",&j);
   if(j>=1&&j<=2){
    switch(j){
   case 1:{
   printf("\n请输入要删除的学号\t");
   scanf("%d",&s);
   printf("\n");
   h=del_xh(l,s);
   pt(h);
   printf("\n");
   }break;
   case 2:{
   printf("\n请输入要删除的姓名\t");
   scanf("%s",k);
   printf("\n");
   h=del_xm(l,k);
   pt(h);
   printf("\n");}break;
   }
   }
   p=h;
   while(p!=NULL)
   {
   	i++;
   	p=p->next;
   }
   if(i<m){
   printf("请输入新的数据:\t\n");
   printf("格式:姓名,学号,成绩\n");
   scanf("%s%d%f%f%f",&stu.name,&stu.No,&stu.math,&stu.Chinese,&stu.English); 
   h=insert(h,&stu);
   pt(h);
   }
   
   printf("按任意键返回主菜单:\n");
   getch();
  system("cls");
  zhu();  
  }
/*****************************************************************************/ 
void case6()
{
printf("\n\n\n\t****************************************************************\n");	
printf("\t\tcopyright from liangZY\n");
printf("\t\t学号:15115011040 班级:计科一班\n");
printf("\t****************************************************************\n");
printf("按任意键返回主菜单:\n");
getch();
system("cls");
zhu();  
} 
/*****************************************************************************/ 
 int main()
{ 
  int j;
   
  printf("\n\n\n\t=======================================================\n");
  printf("\t=======================================================\n");
  printf("\t**************欢迎进入学生管理系统*********************\n");
  printf("\t=======================================================\n");
  printf("\t=======================================================\n\n\n");
char	f[]="888888";
  	  printf("请输入密码并以回车键结束:");
      scanf("%s",f);
	  if(strcmp(f,"15115011040")==0)	 
	  {
  	  system("cls");
	  zhu();//密码正确时进入系统
	  }
	  else  
	  j=1; 
	  printf("密码错误!请重新选择按键!\n");
	  printf("请输入第2次\t");
	  scanf("%s",f);
	  while(strcmp(f,"149074303")!=0&&j<=4)  {
	  printf("密码错误!请重新选择按键!\n");
	  printf("请输入第%d次\t",j+2);	scanf("%s",f); j++;
	  }
	  if(j>4) {printf("输错次数大于6次\n");   getch(); exit(0);}
	  system("cls");
	  zhu();//密码正确时进入系统
	  return 0;
}
/*****************************************************************************/
  void   zhu(){
     int i;
 	 while(1){
     printf("\t****************************************************************\n");
	 printf("\t\t1: 根据条件进行学生成绩排名\n\t\t2:用指针优化学生成绩排名\n\t\t3:学生成绩单制作\n\t\t");
	 printf("4:学生成绩文件管理\n\t\t5:修改学生信息(链表)\n\t\t6: 查看版本信息\n\t\t7: 离开\n");
	 printf("\t****************************************************************\n\n");
	 printf("\t\t请选择:\t");
 	scanf("%d",&i);
 	switch(i)
 	{
	 	case 1: system("cls");case1();break;
	 	case 2: system("cls");case2();break;
        case 3: system("cls");case3();break;
		case 4: system("cls");case4();break;
		case 5: system("cls");case5();break;
		case 6: system("cls");case6();break;
		case 7: exit(0);break;
		default:
		{system("cls");
		printf("\n输入错误,请重新输入\n"); 
	    printf("按任意键返回主菜单:\n");
        getch();
        system("cls");
        zhu();  
		}
	 }
 	 }
  }
 /*****************************************************************************/ 

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值