WFR 发表于 2023-6-18 00:41:57

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

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

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

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

stu_listCreat(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;
};

charQuit(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;
        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 = q->data.score;

                q = q->Next;
        }
        //        求出成绩的均值
        for (int c =0;c<p;c++)
        {
               
                sum = +avg;
        }
        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);       
        }
       
}

Threebody1 发表于 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循环中累加求和。

isdkz 发表于 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 。

这只是一些基本的修复,你可能还需要对代码进行更多的调试和优化。如果你遇到更多的问题,欢迎继续提问。

WFR 发表于 2023-6-18 00:51:44

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

神速回复真的谢谢

WFR 发表于 2023-6-18 00:55:31

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

对第二点不是很清楚

Threebody1 发表于 2023-6-18 00:59:00

WFR 发表于 2023-6-18 00:55
对第二点不是很清楚

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

具体来说,函数可以这样修改:

char Quit()
{
    printf("退出菜单");
    return '#';
}
这样就省略了无用的参数 choice,同时函数也更加简洁和规范。在函数中,直接输出退出菜单的信息,然后使用 return 返回一个字符值 '#',表示退出程序。

WFR 发表于 2023-6-18 01:21:55

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

大佬,我的第create函数有错误但不知道该如何修改

Threebody1 发表于 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,并返回新结点的地址。
页: [1]
查看完整版本: 请教一下下面的问题怎么解决????十分着急