⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c语言成绩记录查询系统.cpp

📁 一个学生成绩管理系统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
}

/*查询成绩*/
void search()
{
     int i,k=0;
     info *p; /* 移动指针*/
     char number[10],number_[10],judge[20];
     
     do
     {
            system("cls");
            printf("请输入学生学号或姓名进行查找:");
            gets(number);
            p=read();/*将头指针赋给p*/
            while(strcmp(number,ltoa(p->num,number_,10))&&strcmp(p->name,number)&&p->next!=NULL) /*当记录的姓名或学号不是要找的,或指针不为空时*/
            p=p->next; /*移动指针,指向下一结点*/
            if(p->next!=NULL) 
            {
                     printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
		     printf("        学号                  姓名                          分数           \n");
		     printf("        %-6ld                %-20s           %-3d           \n", p->num,p->name,p->score);
		     printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
            }
            else
            {
                     for(i=0;i<strlen(number);i++)
                     {
                             if(number[i]<'0'||number[i]>'9')
                             {
                                      k=1;
                                      break;
                             }
                     }
                     if(k!=1)
                             printf("\n对不起,没有学号为%s学生成绩记录!\n",number);
                     else
                             printf("\n对不起,没有姓名为%s学生成绩记录!\n",number);
             } 
             printf("\n是否要返回目录?\nY返回,任意键+回车继续."); /*提示是否要回目录*/
             gets(judge);
             if((judge[0]=='y'&&judge[1]=='\0')||(judge[0]=='Y'&&judge[1]=='\0')) break;
             else continue;
     }while(1);
}

/*删除记录*/
void delete_()
{
     int i=0,k=0;
     info *head,*p1,*p2; /*p1为查找到要删除的结点指针,p2为其前驱指针*/
     char judge[20],number[20],number_[10];
     
     do
     {
            system("cls");
            p1=head=read(); /*给p1和p2赋初值头指针*/
            if(p1==NULL)
            {      
                     printf("\n\n\t没有任何学生成绩记录...");
                     printf("\n是否要返回目录?\nY返回,任意键+回车继续."); /*提示是否要回目录*/
                     gets(judge);
                     if((judge[0]=='y'&&judge[1]=='\0')||(judge[0]=='Y'&&judge[1]=='\0')) break;
                     else continue;
            }
            else
            {
                     printf("请输入要删除学生的的学号或姓名: ");
                     gets(number);
                     while(strcmp(number,ltoa(p1->num,number_,10))&&strcmp(number,p1->name)&&p1->next!=NULL) /*当记录的学号或姓名不是要找的,或指针不为空时*/
                     {
                             p2=p1; /*将p1指针值赋给p2作为p1的前驱指针*/
                             p1=p1->next; /*将p1指针指向下一条记录*/
                     }
                     if(strcmp(number,ltoa(p1->num,number_,10))==0||strcmp(number,p1->name)==0) /*学号*/
                     {
                             printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
			     printf("        学号                   姓名                      分数           \n");
			     printf("        %-6ld                %-20s          %-3d           \n", p1->num,p1->name,p1->score);
			     printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
                             for(;;)
                             {
                                      printf("\n是否要删除?\nY删除,任意键+回车返回."); /*提示是否要删除,输入Y删除,N则退出*/
                                      gets(judge);
                                      if((judge[0]=='y'&&judge[1]=='\0')||(judge[0]=='Y'&&judge[1]=='\0'))/*如果不删除,则跳出本循环*/
                                      {
                                               if(p1==head) /*若p1==head,说明被删结点是首结点*/
                                               head=p1->next; /*把第二个结点地址赋予head*/
                                               else
                                               p2->next=p1->next; /*否则将一下结点地址赋给前一结点地址*/
                                               for(i=0;i<strlen(number);i++)
                                               {
                                                       if(number[i]<'0'||number[i]>'9')
                                                       {
                                                                k=1;
                                                                break;
                                                       }
                                               }
                                               if(k!=1)
                                                       printf("\n学号为%s学生已被删除!\n",number);
                                               else
                                                       printf("\n姓名为%s学生已被删除!\n",number); 
                                               break;
                                       }
                                       else 
                                               break;
                             }
                             save_(head);
                     }
                     else
                             printf("\n学号或姓名为%s的学生不存在",number); /*找不到该结点*/
                     printf("\n是否要返目录?\nY返回,任意键+回车继续."); /*提示是否要回目录*/
                     gets(judge);
                     if((judge[0]=='y'&&judge[1]=='\0')||(judge[0]=='Y'&&judge[1]=='\0')) break;
                     else continue;
             }
     }while(1);
}

/*修改记录*/
void amend()
{
     int i=0,k=0,w=0,score_;
     info *head,*p; /*p1为查找到要删除的结点指针,p2为其前驱指针*/
     char judge[20],number[20],number_[10],score[20];
     
     do
     {
            system("cls");
            p=head=read(); /*给p1和p2赋初值头指针*/
            if(p==NULL)
            {      
                     printf("\n\n\t对不起,目前没有任何学生成绩记录...");
                     printf("\n是否要返回目录?\nY返回,任意键+回车继续."); /*提示是否要回目录*/
                     gets(judge);
                     if((judge[0]=='y'&&judge[1]=='\0')||(judge[0]=='Y'&&judge[1]=='\0')) break;
                     else continue;
            }
            else
            {
                     printf("请输入要修改成绩的学生的学号或姓名: ");
                     gets(number);
                     while(strcmp(number,ltoa(p->num,number_,10))&&strcmp(number,p->name)&&p->next!=NULL) /*当记录的学号或姓名不是要找的,或指针不为空时*/
                             p=p->next; /*将p1指针指向下一条记录*/
                     if(strcmp(number,ltoa(p->num,number_,10))==0||strcmp(number,p->name)==0) /*学号或姓名找到了*/
                     {
                             printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
			     printf("        学号                      姓名                      分数           \n");
			     printf("        %-6ld                %-20s          %-3d           \n", p->num,p->name,p->score);
			     printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
                             for(;;)
                             { 
                                      for(;;)
                                      {
                                               do
                                               {
                                                       printf("输入成绩:");/*提示开始输入成绩*/
                                                       gets(score);
                                                       w=1;
                                                       for(i=0;i<strlen(score);i++)
                                                       {
                                                                 if(score[i]<'0'||score[i]>'9')
                                                                 {        
                                                                          printf("成绩输入错误,请重新输入:");
                                                                          w=0;
                                                                          break;
                                                                 }
                                                       }
                                               }while(w==0);
                                               score_=atoi(score);
                                               if(score_>=0&&score_<=100)
                                               break;
                                               printf("成绩输入错误,请重新输入:");
                                      }
                                      printf("\n是否要修改,输入Y修改,任意键+回车返回."); /*提示是否要删除,输入Y删除,N则退出*/
                                      gets(judge);
                                      if((judge[0]=='y'&&judge[1]=='\0')||(judge[0]=='Y'&&judge[1]=='\0'))/*如果不删除,则跳出本循环*/
                                      {
                                               p->score=score_;
                                               for(i=0;i<strlen(number);i++)
                                               {
                                                       if(number[i]<'0'||number[i]>'9')
                                                       {
                                                                k=1;
                                                                break;
                                                       }
                                               }
                                               if(k!=1)
                                                       printf("\n学号为%s学生已修改成功!\n",number);
                                               else
                                                       printf("\n姓名为%s学生已修改成功!\n",number); 
                                               break;
                                       }
                                       else 
                                               break;
                             }
                             save_(head);
                     }
                     else
                             printf("\n对不起,学号或姓名为%s的学生不存在",number); /*找不到该结点*/
                     printf("\n是否要返回菜单,输入Y返回,任意键+回车继续."); /*提示是否要回目录*/
                     gets(judge);
                     if((judge[0]=='y'&&judge[1]=='\0')||(judge[0]=='Y'&&judge[1]=='\0')) break;
                     else continue;
             }
     }while(1);
}

/*排序*/
info *order(info *head)
{
      info *h,*n1,*n2,*temp,*n3;
      h=head;
      n1=NULL;
  
      while(h!=NULL)
      {
             temp=(info *)malloc(LEN);
             temp->score=h->score;
             temp->num=h->num;
             strcpy(temp->name,h->name);
             temp->next=NULL;
             if(n1==NULL)
             {
                     n1=temp;
                     h=h->next;
                     continue;
             }
             if(n1->score<=temp->score)
             {
                     temp->next=n1;
                     n1=temp;
                     h=h->next;
                     continue;
             }
             n2=n1;
             while(n2!=NULL)
             {
                     if(n2->next==NULL)
                     {
                             n2->next=temp;
                             h=h->next;
                             break;
                     }
                     if(n2->score>temp->score&&n2->next->score<temp->score) 
                     {
                             temp->next=n2->next;
                             n2->next=temp;
                             n2=temp;
                             h=h->next;
                             break;
                     }  
                     n2=n2->next;     
             }
  
       }
       return n1;
}

/*分类显示输出学生的成绩菜单*/
void sort()
{    
     char action[2];
     
     while(1)
     {
            do
            {
                   system("cls");
                   printf("\n\n\n\n\n~~~~~~~~~~~~~~~~~~~~~~~~~显示指定分数段学生成绩~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
                          "\n\t\t 1、显示90分以上学生记录" 
 	                  "\n\t\t 2、显示80-90上学生记录"
 	                  "\n\t\t 3、显示70-80上学生记录"
 	                  "\n\t\t 4、显示60-70上学生记录"
 	                  "\n\t\t 5、显示60分以下上学生记录"
 	                  "\n\t\t 0、返回");
                   printf("\n\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
                   printf("\n\t\t\t请选择(0~5):");
                   gets(action);
            }while(action[0]<'0'||action[0]>'5'||action[1]!='\0'); /*如果选择项不在0-5之间则重输*/
     if(action[0]=='0'&&action[1]=='\0')/*如果选择0则退出*/
            break;
     if(action[0]=='1'&&action[1]=='\0')
     {      print_(atoi(action));continue; }
     if(action[0]=='2'&&action[1]=='\0')
     {      print_(atoi(action));continue; }       
     if(action[0]=='3'&&action[1]=='\0')
     {      print_(atoi(action));continue; }       
     if(action[0]=='4'&&action[1]=='\0')
     {      print_(atoi(action));continue; }       
     if(action[0]=='5'&&action[1]=='\0')
     {      print_(atoi(action));continue; }
     }
}

/*分类显示输出学生的成绩*/
void print_(int sort)
{
     int i=0,score,score_; /* 统计记录条数*/
     info *head,*p; /*移动指针*/
     
     head=order(read());
     system("cls");
     switch(sort)
     {
            case 1:score=90;score_=100;break;
            case 2:score=80;score_=89;break;
            case 3:score=70;score_=79;break;
            case 4:score=60;score_=69;break;
            case 5:score=0;score_=59;
     }
     if(head==NULL)
            printf("\n\n\t打不开文件或文件为空文件...");
     else
     {
            printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
	    printf("                学号                 姓名                  分数        \n");
	    p=head;
            do
            {
                    if(p->score>=score&&p->score<=score_)
                    {
                             i++;
                             printf("    %-3d         %-6d            %-20s         %-3d        \n",i, p->num,p->name,p->score);
                    }
                    p=p->next;
            }while(p!=NULL);
	    printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
     }
     printf("\n\n\t按回车键结束...");
     getchar();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -