请教一下下面的问题怎么解决????十分着急
#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: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循环中累加求和。
看起来你在尝试创建一个用于管理学生信息的系统,但是你的代码中存在一些问题。我会尝试帮助你解决这些问题。
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 。
这只是一些基本的修复,你可能还需要对代码进行更多的调试和优化。如果你遇到更多的问题,欢迎继续提问。 Threebody1 发表于 2023-6-18 00:45
该段代码是一个使用链表实现学生信息管理系统的程序,主要涉及创建数据、增加新记录、按要求查询信息、修改 ...
神速回复真的谢谢
Threebody1 发表于 2023-6-18 00:45
该段代码是一个使用链表实现学生信息管理系统的程序,主要涉及创建数据、增加新记录、按要求查询信息、修改 ...
对第二点不是很清楚 WFR 发表于 2023-6-18 00:55
对第二点不是很清楚
意思是说,Quit() 函数中的 choice 参数并没有被使用,所以可以省略。同时,函数中应该使用 return 返回函数值,而不是将 choice 赋值为 '#' 后返回 choice。
具体来说,函数可以这样修改:
char Quit()
{
printf("退出菜单");
return '#';
}
这样就省略了无用的参数 choice,同时函数也更加简洁和规范。在函数中,直接输出退出菜单的信息,然后使用 return 返回一个字符值 '#',表示退出程序。 Threebody1 发表于 2023-6-18 00:59
意思是说,Quit() 函数中的 choice 参数并没有被使用,所以可以省略。同时,函数中应该使用 return 返回 ...
大佬,我的第create函数有错误但不知道该如何修改 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]