XHXD. 2023-03-08 09:05 采纳率: 100%
浏览 134
已结题

c语言学生成绩管理系统链表

请问如何将代码修改成链表,可以储存到磁盘文件

 
 
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> //字符串处理  
#include<windows.h> 
int n=4; 
struct student 
{ 
int num; //学号 
char name[10]; //名字 
float score[3]; //成绩 
}stud[100];
int i,choose,a,t=0; 
long int num;
 
int main () 
{ 
void save(void); 
void input(void); 
void output(void); 
void scoremodify();
void namemodify(); 
void scorecheck();
void namecheck(); 
void Addstudent(); 
void sclsearch(); 
while(1) 
{ 
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(" 【8】-------------------------- 按分数段显示学生的信息 \n");
printf(" 【0】-------------------------- 退出 \n");
printf(" ********************************************************* \n");
printf(" 请输入相应菜单编号: ");
scanf("%d",&a);
switch(a)
{ 
case 1: 
input(); //输入 
save(); //保存 
break; 
case 2: 
output(); //输出 
printf("\n"); 
system("PAUSE"); 
system("CLS"); //清屏 
break; 
case 3: 
Addstudent(); 
printf("\n"); 
system("PAUSE"); 
system("CLS"); 
break; 
case 4: 
scorecheck(); 
printf("\n"); 
system("PAUSE"); 
system("CLS"); 
break;
case 5: 
namecheck(); 
printf("\n"); 
system("PAUSE"); 
system("CLS"); 
break; 
case 6: 
scoremodify(); 
printf("\n"); 
system("PAUSE"); 
system("CLS"); 
break;
case 7: 
namemodify(); 
printf("\n"); 
system("PAUSE"); 
system("CLS"); 
break;  
case 8: 
sclsearch(); 
printf("\n"); 
system("PAUSE"); 
system("CLS"); 
break;
case 0:exit(0); 
default: ; 
} 
} 
return 0; 
} 
 
void save() 
{ 
FILE *fp; 
if ((fp=fopen("stu.dat","wb"))==NULL)/*以只写的方式打开文件*/   
{ 
printf("无法打开文件!\n"); 
return ; 
} 
for(i=0;i<n;i++) 
if (fwrite (&stud[i],sizeof(struct student),1,fp)!=1)/*写入字节为 1 的信息在文件中*/ 
printf("文件写入错误!\n"); 
fclose(fp);/*关闭文件*/ 
} 
void input()//录入学生成绩
{ 
int i; 
char a; 
for(i=0;i<n;i++) 
{ 
printf("\n 请输入学生成绩信息:\n"); 
printf("\n 请依次输入 学号 姓名 c语言成绩:\n"); 
scanf("%d%s%f",&stud[i].num,stud[i].name,&stud[i].score[0]); 
printf("输入:y(继续),n(终止)!\n"); 
fflush(stdin);   //清除输入缓存 
scanf("%c",&a); 
if(a=='n' || a=='N') 
break; 
} 
n=i+1; 
} 
void Addstudent() 
{ 
FILE *fp; 
struct student s; 
fp=fopen("stu.dat","ab"); 
if((fp=fopen("stu.dat","ab"))==NULL) 
printf("File open error!\n"); 
else 
{ 
printf("请输入所增加学生的 学号 姓名 c语言成绩:\n"); 
scanf("%d",&s.num ); 
scanf("%s",s.name); 
scanf("%f",&s.score[0]); 
fwrite (&s,sizeof(struct student),1,fp); 
fclose(fp);/*关闭文件*/ 
} 
printf("写入成功!\n"); 
}//end function Addstudent; 
void output() 
{ 
int i; 
//float s; 
FILE *fp; 
if((fp=fopen("stu.dat","rb"))==NULL) 
{ 
printf("cannot open file\n"); 
exit(0); 
} 
printf("\n 学号 姓名 c语言成绩\n"); 
for(i=0;fread(&stud[i],sizeof(struct student),1,fp)==1;i++) 
{ 
printf("%d %10s % 10.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
} 
fclose(fp); 
n=i; 
} 
void scoremodify() 
{ 
int number,i; 
printf("请输入要修改信息的学生学号:"); 
scanf("%d",&number); 
for(i=0;i<n;i++) 
if(number==stud[i].num) 
break;/*查找判断*/ 
if(i<n)/*查找判断*/ 
{ 
printf("请输入修改后的学生的信息:"); 
printf("\n 请输入学生的 c语言成绩:"); 
scanf("%f",&stud[i].score[0]);
printf("\n学号 姓名 c语言成绩\n");
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
save(); 
} 
else 
printf("没找到该学生的信息\n"); 
system("pause");system("cls"); 
} 
void namemodify() 
{ 
int i;
char name[10];
printf("请输入要修改信息的学生姓名:"); 
scanf("%s",&name); 
for(i=0;i<n;i++) 
if(strcmp(stud[i].name,name)==0) 
break;/*查找判断*/ 
if(i<n)/*查找判断*/ 
{ 
printf("请输入修改后的学生的信息:"); 
printf("\n 请输入学生的 c语言成绩:"); 
scanf("%f",&stud[i].score[0]);
printf("\n学号 姓名 c语言成绩\n");
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
save(); 
} 
else 
printf("没找到该学生的信息\n"); 
system("pause");system("cls"); 
} 
void namecheck() 
{ 
char name[10]; 
printf("按照姓名查询请按\n"); 
printf("\n 请输入姓名:"); 
scanf("%s",&name); 
printf("查询结果\n"); 
printf("学号 姓名 c语言成绩\n");
for(i=0;i<n;i++)
if(strcmp(stud[i].name,name)==0) 
{ 
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
} 
} 
void scorecheck() 
{ 
int b; 
printf("按照学号查询请按\n"); 
{ 
printf("\n 请输入学号:"); 
scanf("%d",&b); 
printf("查询结果\n"); 
printf("学号 姓名 c语言成绩\n"); 
for(i=0;i<n;i++) 
if(stud[i].num ==b) 
{ 
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
} 
} 
} 
void sclsearch() 
{ 
int i; 
printf("90 分以上:\n"); 
printf("学号 姓名 c语言成绩\n"); 
for(i=0;i<n;i++) 
{ 
if(stud[i].score[0]>=90) 
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
} 
printf("80~89:\n"); 
printf("学号 姓名 c语言成绩\n"); 
for(i=0;i<n;i++) 
{ 
if(stud[i].score[0]>=80&&stud[i].score[0]<90) 
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
} 
printf("70~79:\n"); 
printf("学号 姓名 c语言成绩\n"); 
for(i=0;i<n;i++) 
{ 
if(stud[i].score[0]>=70&&stud[i].score[0]<80) 
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
} 
printf("60~69:\n"); 
printf("学号 姓名 c语言成绩\n"); 
for(i=0;i<n;i++) 
{ 
if(stud[i].score[0]>=60&&stud[i].score[0]<70) 
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
} 
printf("60 分以下:\n"); 
printf("学号 姓名 c语言成绩\n"); 
for(i=0;i<n;i++) 
{ 
if(stud[i].score[0]<60) 
printf("%d %s %.2f\n",stud[i].num,stud[i].name,stud[i].score[0]); 
} 
}

  • 写回答

2条回答 默认 最新

  • 「已注销」 2023-03-08 09:11
    关注

    “Devil组”引证GPT后的撰写:
    需要将其修改为链表结构,可以储存到磁盘文件中。修改后的代码应该可以实现以下功能:

    1.创建学生记录;
    2.将学生记录存储到磁盘文件中;
    3.从磁盘文件中读取学生记录;
    4.在链表中添加学生记录;
    5.按学号查询学生记录;
    6.按姓名查询学生记录;
    7.按学号修改学生记录;
    8.按姓名修改学生记录;
    9.按分数段显示学生记录;
    10.退出程序。

    定义链表结构体,包括成绩信息和指向下一个节点的指针。

    struct node {
        int num; // 学号
        char name[10]; // 姓名
        float score[3]; // 成绩
        struct node *next; // 指向下一个节点的指针
    };
    
    
    

    将原代码中的 stud 数组改为指向链表头结点的指针。

    struct node *head = NULL;
    
    
    

    修改录入函数 input(),使用 malloc() 函数为每个节点分配内存空间,同时使用指针操作将节点连接起来,最后释放不需要的内存空间。

    void input()
    { 
        char a;
        struct node *p, *q;
        p = (struct node*)malloc(sizeof(struct node));
        printf("\n请输入学生成绩信息:\n");
        printf("\n请依次输入 学号 姓名 c语言成绩:\n");
        scanf("%d%s%f", &p->num, p->name, &p->score[0]);
        head = p;
        printf("输入:y(继续),n(终止)!\n");
        fflush(stdin);   //清除输入缓存 
        scanf("%c", &a);
        while (a != 'n' && a != 'N')
        {
            q = (struct node*)malloc(sizeof(struct node));
            printf("\n请依次输入 学号 姓名 c语言成绩:\n");
            scanf("%d%s%f", &q->num, q->name, &q->score[0]);
            p->next = q;
            p = q;
            printf("输入:y(继续),n(终止)!\n");
            fflush(stdin);   //清除输入缓存 
            scanf("%c", &a);
        }
        p->next = NULL;
    }
    
    
    

    修改输出函数 output(),使用指针遍历链表输出每个节点的信息。

    void output()
    {
        struct node *p;
        FILE *fp;
        if ((fp = fopen("stu.dat", "rb")) == NULL)
        {
            printf("cannot open file\n");
            exit(0);
        }
        printf("\n学号\t姓名\tc语言成绩\n");
        p = head;
        while (p != NULL)
        {
            printf("%d\t%s\t%.2f\n", p->num, p->name, p->score[0]);
            p = p->next;
        }
        fclose(fp);
    }
    
    
    

    修改其他函数中的变量类型,将结构体数组中的元素改为链表节点中的元素,使用指针遍历链表进行相关操作。

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

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 IDEA中圈复杂度如何具体设置
  • ¥50 labview采集不了数据
  • ¥15 请上面代码做什么处理或什么混淆
  • ¥15 英雄联盟自定义房间置顶
  • ¥15 W5500网线插上无反应
  • ¥15 如何用字典的Key,显示在WPF的xaml中
  • ¥15 weautomate读取Excel表格信息然后填写到网页一直报错,如何解决?
  • ¥15 C#如何在Webview2中获取网页验证码
  • ¥15 esp32烧录失败,具体情况在图片上
  • ¥15 selenium安装报错