|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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);
}
}
本帖最后由 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循环中累加求和。
|
|