鱼C论坛

 找回密码
 立即注册
查看: 574|回复: 7

[已解决]请教一下下面的问题怎么解决????十分着急

[复制链接]
发表于 2023-6-18 00:41:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>//2.学生信息管理系统的设计与实现(1)学生信息包括:学号(char num[10])、姓名(char name[10])、性别(char sex[10])、成绩(float score)

#include<stdlib.h>
#define Max 100
typedef struct studentnode {
        char num[10];
        char name[10];
        char sex[10];
        float score;

}stu;
typedef struct S_node {
        stu data;
        struct S_list* Next;
}S_list;
typedef S_list* stu_list;//指针形式的结点

stu_list  Creat(stu_list stu_node)
{
        stu_node = (stu_list)malloc(sizeof(S_list));
       
        scanf_s("输入学生姓名:%s", stu_node->data.name);//经网上找着得知,使用scanf_s更加安全
        scanf_s("输入学生学号:%s", stu_node->data.num);
        scanf_s("输入学生性别:%s", stu_node->data.sex);
        scanf_s("输入学生成绩:%.2f", &stu_node->data.score);
        stu_node->Next = NULL;
       
        return stu_node;
};

char  Quit(char choice)
{
        choice ='#' ;
        printf("退出菜单");

        return choice;
}
void mean()
{
       
       
       
                        printf("1.退出菜单");
                        printf("2.创建数据");
                        printf("3.增加新的数据记录,并返回选单");
                        printf("4.按要求查询相关的信息");
                        printf("5.修改某条记录的信息");
                        printf("6.删除某条记录");
                        printf("7。显示所有记录\n");
                       
       
       
}
stu_list Find(stu_list stunode,int i )
{
        int j = 1;
        stu_list p;
        p = stunode->Next;
        if (!stunode->Next)
        {
                printf("该链表为空");
                exit(1);//存在于stdlib头文件中(1)表示异常退出(0)表示正常退出;
        }
        while (stunode->Next&&j<i)
        {
                p = stunode->Next;
                j++;
        }
        mean();
        return p;
}

void Add(stu_list L,int i,stu_list M)//在L向第i个后面加上M//等待实验
{
        Find(L, i);
        L->Next = M;
}
void Alter(stu_list L, int i)//修改L中的第i个值
{
        int j=0;
       
        Find(L, i);
        printf("修改的值1.姓名2.学号3。性别 4.分数");
        switch(j){
        case 1:
        {  
                scanf_s("%s",L->data.name);
        }
                 
        case 2: {
                scanf_s("%s", L->data.num);
        }
        case 3: {
                scanf_s("%s", L->data.sex);
        }
        case 4:
        {
                scanf_s("%.2f", &L->data.score);
        }
               
}
               
       

}
void Delete(stu_list L, int i)//删除链表中的第i个元素
{
        stu_list p,m;
        p=Find(L, i-1);
        m = p->Next;
        p->Next = m->Next;
        free(m);

       
}
void List(stu_list L)//显示
{
        float avg[Max];
        int p=0,m=0,n=0;
        float sum = 0;

        stu_list q=L;
        while (q) {
                printf("输出学生的姓名:%s",&q->data.name);
                printf("输出学生的学号:%s", &q->data.num);
                printf("输出学生的性别:%s", &q->data.sex);
                printf("输出学生的成绩;%s", &q->data.score);
                if (q->data.score > 60)
                        m++;
                else
                        n++;
                avg[p] = q->data.score;

                q = q->Next;
        }
        //        求出成绩的均值
        for (int c =0;c<p;c++)
        {
               
                sum = +avg[c];
        }
        printf("同学中成绩及格的有%d", m);
        printf("同学中不及格的有%d", n);
        printf("同学的成绩均值为%.2f", sum / p);
       
}

       
int main(void)
{
        int k=0,g=0;
        stu_list student=NULL,L=NULL,M=NULL;
        while (g=1) {
                int choice = 0;
                mean();
                printf("请输入你要进行的操作:");
                scanf_s("%d",choice);
                switch (choice)
                {
                        case 1:Quit(choice); break;//退出菜单
                        case 2:M=Creat(student); break;//创建break;
                        case 3: {
                               
                                printf("添加在链表的那个位置:");
                                scanf_s("%d", &k);
                                Add(L, k, M);
                                break;
                        }
                        case 4:
                        {
                                scanf_s("%d", k);
                                Find(L, k); break;
                        }
                        case 5:
                        {
                                scanf_s("%d", k);
                                Alter(L, k); break;
                        }
                        case 6: {
                                scanf_s("%d", k);
                                Delete(L, k); break;
                        }
                        case 7: {
                                List(L); break;
                        }
                scanf_s("输入下一步操作:%d", choice);
                }
               
        printf("是否重新进如菜单界面?(0|1)");
        scanf_s("%d", &g);       
        }
       
}
最佳答案
2023-6-18 00:45:54
本帖最后由 Threebody1 于 2023-6-18 00:59 编辑

该段代码是一个使用链表实现学生信息管理系统的程序,主要涉及创建数据、增加新记录、按要求查询信息、修改某条记录信息、删除某条记录和显示所有记录等功能。

代码存在一些问题:

  • 在函数Creat()中,scanf_s()函数的格式串应该为 "%s" 而不是 "输入学生姓名:%s" 等形式。
  • 在函数Quit()中,choice变量作为参数传递,实际上没有任何意义,可以省略。此外,在函数内部应该使用 return 而不是将 choice 赋值为 '#' 后返回 choice。
  • mean()函数中,缺少换行符 "\n",导致输出没有换行。
  • Find()函数中,while 循环条件写错了,应该是 p->Next!=NULL&&j<i,而不是 stunode->Next&&j<i。此外,应该在函数开头添加判断链表是否为空的代码,以避免在空链表上进行操作,导致程序异常退出。
  • Alter()函数中,switch 语句中的 j 变量一直为0,无法进入任何 case 分支,导致无法修改数据。应该改为使用 scanf_s() 函数读入一个整型变量,表示修改哪个属性,然后再使用 scanf_s() 函数读入相应的属性值。
  • List() 函数中,avg 数组没有初始化,导致程序可能会读取未初始化的内存,产生未定义行为。应该将 avg 数组初始化为0。
  • main()函数中,scanf_s() 函数的参数错误,应该是 &choice 而不是 choice。while 循环的条件应该是 g==1 而不是 g=1,否则会将 g 的值赋值为1。在 switch 语句的各个 case 分支中,scanf_s() 函数都没有正确读入变量,应该是 &k 而不是 k。
  • 在 Add() 函数中,Find(L, i) 找到的是第 i 个元素,而不是第 i 个后面。应该修改成找到第 i - 1 个元素。
  • List() 函数中,输出学生信息的 printf 函数参数写错了。应该使用 %s 输出字符串时,传入的是字符串本身,而不是指向字符串的指针。此外,求平均分的代码有误,应该将 sum 的初值设为0,并在for循环中累加求和。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-18 00:45:54 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Threebody1 于 2023-6-18 00:59 编辑

该段代码是一个使用链表实现学生信息管理系统的程序,主要涉及创建数据、增加新记录、按要求查询信息、修改某条记录信息、删除某条记录和显示所有记录等功能。

代码存在一些问题:

  • 在函数Creat()中,scanf_s()函数的格式串应该为 "%s" 而不是 "输入学生姓名:%s" 等形式。
  • 在函数Quit()中,choice变量作为参数传递,实际上没有任何意义,可以省略。此外,在函数内部应该使用 return 而不是将 choice 赋值为 '#' 后返回 choice。
  • mean()函数中,缺少换行符 "\n",导致输出没有换行。
  • Find()函数中,while 循环条件写错了,应该是 p->Next!=NULL&&j<i,而不是 stunode->Next&&j<i。此外,应该在函数开头添加判断链表是否为空的代码,以避免在空链表上进行操作,导致程序异常退出。
  • Alter()函数中,switch 语句中的 j 变量一直为0,无法进入任何 case 分支,导致无法修改数据。应该改为使用 scanf_s() 函数读入一个整型变量,表示修改哪个属性,然后再使用 scanf_s() 函数读入相应的属性值。
  • List() 函数中,avg 数组没有初始化,导致程序可能会读取未初始化的内存,产生未定义行为。应该将 avg 数组初始化为0。
  • main()函数中,scanf_s() 函数的参数错误,应该是 &choice 而不是 choice。while 循环的条件应该是 g==1 而不是 g=1,否则会将 g 的值赋值为1。在 switch 语句的各个 case 分支中,scanf_s() 函数都没有正确读入变量,应该是 &k 而不是 k。
  • 在 Add() 函数中,Find(L, i) 找到的是第 i 个元素,而不是第 i 个后面。应该修改成找到第 i - 1 个元素。
  • List() 函数中,输出学生信息的 printf 函数参数写错了。应该使用 %s 输出字符串时,传入的是字符串本身,而不是指向字符串的指针。此外,求平均分的代码有误,应该将 sum 的初值设为0,并在for循环中累加求和。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-6-18 00:50:34 | 显示全部楼层
看起来你在尝试创建一个用于管理学生信息的系统,但是你的代码中存在一些问题。我会尝试帮助你解决这些问题。

1.  S_node  结构体中的  Next  成员的类型定义错误,应为  struct S_node* Next;

2. 使用  scanf_s  函数时,应该将字符串的格式标识符("%s")和参数分开。例如: scanf_s("%s", stu_node->data.name, sizeof(stu_node->data.name));

3.  scanf_s  用于接收用户输入的  choice  和  k  时,你需要在变量前加上  &  符号,因为  scanf_s  需要接收变量的地址作为参数。

4. 在你的  mean  函数中,我建议你在每个 printf 语句后添加一个换行符  \n ,以提高程序的可读性。

5. 在  Find  函数中,你需要在遍历链表之前检查链表是否为空,而不是在遍历过程中检查。

6.  Alter  函数中的  scanf_s  函数应该在  switch  语句的  case  子句中,并且缺少了  default  子句。

7. 在  List  函数中,你应该使用  %f  格式标识符来打印学生成绩,而不是  %s 。

8. 主函数  main  中的循环条件  g=1  是错误的,这实际上是一个赋值操作,而不是比较。应改为  g == 1 。

这只是一些基本的修复,你可能还需要对代码进行更多的调试和优化。如果你遇到更多的问题,欢迎继续提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-18 00:51:44 | 显示全部楼层
Threebody1 发表于 2023-6-18 00:45
该段代码是一个使用链表实现学生信息管理系统的程序,主要涉及创建数据、增加新记录、按要求查询信息、修改 ...

神速回复真的谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-18 00:55:31 | 显示全部楼层
Threebody1 发表于 2023-6-18 00:45
该段代码是一个使用链表实现学生信息管理系统的程序,主要涉及创建数据、增加新记录、按要求查询信息、修改 ...

对第二点不是很清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-18 00:59:00 | 显示全部楼层
WFR 发表于 2023-6-18 00:55
对第二点不是很清楚

意思是说,Quit() 函数中的 choice 参数并没有被使用,所以可以省略。同时,函数中应该使用 return 返回函数值,而不是将 choice 赋值为 '#' 后返回 choice。

具体来说,函数可以这样修改:
char Quit()
{
    printf("退出菜单");
    return '#';
}
这样就省略了无用的参数 choice,同时函数也更加简洁和规范。在函数中,直接输出退出菜单的信息,然后使用 return 返回一个字符值 '#',表示退出程序。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2023-6-18 01:21:55 | 显示全部楼层
Threebody1 发表于 2023-6-18 00:59
意思是说,Quit() 函数中的 choice 参数并没有被使用,所以可以省略。同时,函数中应该使用 return 返回 ...

大佬,我的第create函数有错误但不知道该如何修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-18 01:33:05 | 显示全部楼层
WFR 发表于 2023-6-18 01:21
大佬,我的第create函数有错误但不知道该如何修改

根据你提供的代码看,Creat() 函数存在以下问题:

1.函数名应该是 Create(),而不是 Creat()。

2.函数中,使用 malloc() 动态分配内存时,申请的结构体类型应该是 S_list 而不是 stu_list,因为 stu_list 是一个指向结构体指针类型的别名,而不是结构体本身。

3.函数中使用了 scanf_s() 函数读取数据,但是格式串写错了。应该将 "%s"、"%.2f" 等格式串中的双引号去掉,也不需要在其后面加上冒号。

综合来看,Create() 函数应该修改为如下代码:
stu_list Create()
{
    stu_list newNode = (stu_list)malloc(sizeof(S_list));
    if (newNode == NULL) {
        printf("Error: Out of memory\n");
        exit(1);
    }
    printf("输入学生姓名:");
    scanf_s("%s", newNode->data.name, sizeof(newNode->data.name));

    printf("输入学生学号:");
    scanf_s("%s", newNode->data.num, sizeof(newNode->data.num));

    printf("输入学生性别:");
    scanf_s("%s", newNode->data.sex, sizeof(newNode->data.sex));

    printf("输入学生成绩:");
    scanf_s("%f", &newNode->data.score);

    newNode->Next = NULL;
    return newNode;
}
在函数中,首先使用 malloc() 动态分配内存,然后使用 scanf_s() 读取学生的姓名、学号、性别和成绩,最后将新结点的 Next 指针置为 NULL,并返回新结点的地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 08:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表