XHXD. 2023-03-09 15:20 采纳率: 100%
浏览 83
已结题

c语言学生成绩管理系统

看不懂78到85函数,谁能解释一下

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#define LEN sizeof(struct Student)
int main(){                 //首先定义主函数 
    void Menu();
    void Add();
    void View();
    void Delete();
    void Repair();
    void ViewAll();
    void Sclsearch();
    Menu();
    
}
struct Student{                 //声明结构体类型为student 
    char number[20];        //学号   //定义结构体成员 
    char name[10];        //姓名 
    
    float Chinese[30];            //c成绩 
    
    struct Student* next;    //指向下一个数据的指针 ,用于输入多个数据 
}Stud[100]; 
struct Student* head = NULL;    // 定义结构体的指针变量,后面做链表节点,而且要先对指针变量进行赋值0空地址,防止指向一个 事先未指定的单元 
struct Student* end = NULL;
void Menu(){
     void Menu();
    void Add();
    void View();
    void Delete();
    void Repair();
    void ViewAll();
    void Sclsearch();
    system("cls");
    printf("1、学生信息录入\n");
    printf("2、学生单个成绩查询\n");
    printf("3、查询全部学生成绩\n");
    printf("4、修改学生信息\n");
    printf("5、删除学生信息\n");
    printf("6、显示出某个分数段学生的信息\n");
    printf("7、退出系统\n");
    int choice;
    printf("请选择要使用的功能:\n");
    loop:
    scanf("%d",&choice);
    switch (choice) {
    case 1:
        Add();
        Menu();
    case 2:
        View();
        Menu();
    case 3:
        ViewAll();
        Menu();
    case 4:
        Repair();
        Menu();
    case 5:
        Delete();
        Menu();
    case 6:
        Sclsearch();
        Menu(); 
         
    case 7:
        exit(0);
    default:
            printf("输入有误,请重新选择:");
            goto loop;    
    }
}                             //每一个节点都包含一个指针变量,用来存放下一个地址 
 void Add(){
    system("cls");  //进行清屏 
    int count;       //声明一个count变量 ,用于计数 
    printf("请输入要录入信息的个数:");
    scanf("%d",&count);
    struct Student *s1,*s2,*temp;     //定义指向struct student类型数据的指针变量 
    s1=s2=(struct Student*)malloc(LEN);  //malloc用于开辟动态储存空间用于存储输入的学生数据 
    if(head==NULL){         //NUll符号常量0,空地址 
        head = s1;
    }else{
        end->next = s1 ;   //使用指向运算符 ,使其指向下一个节点 
    }
    int i = 1;    
    while(count>0){
        printf("请输入第%d位学生信息:\n",i++);
        printf("学号:\n");
        scanf("%s",&s1->number);  //s1指向结构体变量中的成员number,代表了学生的结构体成员的数据,相当于 (*s1).number 
        printf("姓名:\n");
        scanf("%s",&s1->name);
        
        printf("c语言成绩:\n");
        scanf("%f",&s1->Chinese[0]);
        
        count--;
        s2->next=s1;
        s2=s1;
        s1=(struct Student*)malloc(LEN);
        printf("添加成功!\n");
        system("pause");
        system("cls");
    }
    s2->next= NULL;
    end = s2;
    printf("全部添加成功!\n");
    system("pause");
}
void View(){
    system("cls");
    struct Student *VS;
    int choice;
    printf("请输入查询方式:\n");
    printf("1、按学号查询\n");
    printf("2、按姓名查询\n");
    loop:
    scanf("%d",&choice);
    if (choice != 1 && choice != 2) {
        printf("输入有误,请重新选择:");
        goto loop;
    }
    char str[20];
    if (choice == 1) {
        printf("请输入要查询信息的学生学号:\n");
        scanf("%s", str);
        for(VS=head;VS!=NULL;VS=VS->next){
            if(strcmp(VS->number,str)==0){
                printf("成功找到!\n");
                printf("学号:%s\t姓名:%s\n",VS->number,VS->name);
                printf("c语言:%f\n",VS->Chinese[0]);
                system("pause");
                return;
            }
        }
    } else if (choice == 2) {
        printf("请输入要查询信息的学生姓名:\n");
        scanf("%s", str);
        for(VS=head;VS!=NULL;VS=VS->next){
            if(strcmp(VS->name,str)==0){
                printf("成功找到!\n");
                printf("学号:%s\t姓名:%s\n",VS->number,VS->name);
                printf("c语言:%f\n",VS->Chinese[0]);
                system("pause");
                return;
            }
        }
    }
    printf("不好意思,未找到!\n");
    system("pause");
}
void ViewAll(){
    system("cls");
    struct Student *VA;
    if(head!=NULL){
        printf("所有学生成绩如下:\n");
        for(VA=head;VA!=NULL;){
            printf("学号:%s\t姓名:%s\tc语言:%f\n",VA->number,VA->name,VA->Chinese[0]);
         
            VA=VA->next;   //指向下一个节点 
        }
    }else{
        printf("该系统中还未录入信息");
    }    
    system("pause");
}
 
void Repair(){
    system("cls");
    struct Student *RS;
    int choice;
    printf("请输入查询方式:\n");
    printf("1.按照查询学号方式修改\n");
    printf("2.按照查询姓名方式修改\n");
    loop:
    scanf("%d",&choice);
    if (choice !=1&&choice !=2) {
        printf("输入有误,请重新输入");
        goto loop;
    }
    char str[20];
 
 
   if (choice == 1) {
       printf("请输入学号:\n");
       scanf("%s",&str);
 
    for(RS=head;RS!=NULL;RS=RS->next){
        if(strcmp(RS->number,str)==0){
            printf("成功找到该学生");
            printf("学号:%s\t姓名:%s\n",RS->number,RS->name);
            printf("c语言:%f\n",RS->Chinese[0]);
  
           
            printf("c语言成绩:\n");
            scanf("%f",&RS->Chinese[0]);
            printf("修改成功");
            system("pause");
            return;
        }
    }
    }
   else  if (choice ==2) {
       printf("请输入姓名:\n");
       scanf("%s",&str);
 
       for(RS=head;RS!=NULL;RS=RS->next) {
           if(strcmp(RS->name,str)==0) {
               printf("成功找到该学生");
               printf("学号:%s\t姓名:%s\n",RS->number,RS->name);
            printf("c语言:%f\n",RS->Chinese[0]);
 
           
            printf("c语言成绩:\n");
            scanf("%f",&RS->Chinese[0]);
            printf("修改成功");
            system("pause");
            return;
           }
       }
   }
   else {
        printf("输入信息有误,未查询到 \n");
        system("pause");
     
    }
}
void Delete(){
    system("cls");
    int flag =1;
    while(flag){
        printf("请输入要删除的学生学号:");
        char num[10];
        scanf("%s",&num);
        struct Student * DS,*temp;
        for(DS=head;DS!=NULL;){
            if(strcmp(DS->number,num)==0){
                if(DS==head){
                    head = DS->next;
                    flag = 0;
                    printf("删除成功!\n");
                    system("pause");
                }else{
                    flag = 0;
                    printf("删除成功!\n");
                    temp->next= DS->next;
                    free(DS);
                    system("pause");
                }
                
            }
            temp = DS;
            DS=DS->next;
        }
        if(flag){
            printf("未找到该学生学号!\n");
            system("pause");
        }
    }
}
void Sclsearch() 
{ 
system("cls");
struct Student *SC;
printf("90 分以上:\n"); 
printf("学号 姓名 c语言成绩\n");
for(SC=head;SC!=NULL;){
    if(SC->Chinese[0]>=90)
    {
        printf("学号:%s\t姓名:%s\tc语言:%f\n",SC->number,SC->name,SC->Chinese[0]);
    }
    SC=SC->next; 
}
printf("80~89:\n"); 
printf("学号 姓名 c语言成绩\n"); 
for(SC=head;SC!=NULL;){
    if(SC->Chinese[0]>=80&&SC->Chinese[0]<90)
    {
        printf("学号:%s\t姓名:%s\tc语言:%f\n",SC->number,SC->name,SC->Chinese[0]);
    }
    SC=SC->next; 
}
printf("70~79:\n"); 
printf("学号 姓名 c语言成绩\n"); 
for(SC=head;SC!=NULL;){
    if(SC->Chinese[0]>=70&&SC->Chinese[0]<80)
    {
        printf("学号:%s\t姓名:%s\tc语言:%f\n",SC->number,SC->name,SC->Chinese[0]);
    }
    SC=SC->next; 
}
printf("60~69:\n"); 
printf("学号 姓名 c语言成绩\n"); 
for(SC=head;SC!=NULL;){
    if(SC->Chinese[0]>=60&&SC->Chinese[0]<70)
    {
        printf("学号:%s\t姓名:%s\tc语言:%f\n",SC->number,SC->name,SC->Chinese[0]);
    }
    SC=SC->next; 
}
printf("60 分以下:\n"); 
printf("学号 姓名 c语言成绩\n"); 
for(SC=head;SC!=NULL;){
    if(SC->Chinese[0]<60)
    {
        printf("学号:%s\t姓名:%s\tc语言:%f\n",SC->number,SC->name,SC->Chinese[0]);
    }
    SC=SC->next; 
}
system("pause");
}

  • 写回答

4条回答 默认 最新

  • 快乐鹦鹉 2023-03-09 15:26
    关注

    很简单啊,head是链表头,end是链表尾。当新增一个节点时,先判断head是否为空,如果是,那么新节点就是head;如果不是,那么使用尾插法,新节点就挂接到当前尾节点end的next。在这个函数最后,end会指向新增的节点

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月17日
  • 已采纳回答 3月9日
  • 创建了问题 3月9日

悬赏问题

  • ¥15 mmocr的训练错误,结果全为0
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀