鱼生富贵 2022-02-09 23:58 采纳率: 97.4%
浏览 1314
已结题

定义一个包含学生信息(学号,姓名,成绩)的顺序表(采用结构体数组存储),这大题还是比较全面了,包含了结构体里主要题型。

题目要求:定义一个包含学生信息(学号,姓名,成绩)的顺序表(采用结构体数组存储),使其具有如下功能:
(1) 根据指定学生个数,逐个输入学生信息;
(2) 逐个显示学生表中所有学生的相关信息;
(3) 根据姓名进行查找,返回此学生的学号和成绩;
(4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩);
(5) 给定一个学生信息,插入到表中指定的位置;
(6) 删除指定位置的学生记录;
(7) 统计表中学生个数。
我把每个功能都分成函数了,但是第七个统计学生个数的函数就是无法输出。还有一个问题就是,我在第五个函数中插入了一个学生信息,但在第六个删除函数中,删除的数组还是基于原来的结构体数组,并不是基于插入后的,若我想基于插入后的删除应该如何呢?


#include<stdio.h>
#include<string.h>
typedef struct
{
    char no[8];//8位学号
    char name[20];//姓名
    int price;//成绩
}Student;
int main()
{ 
    void Input(Student stu[], int n);
    void Print(Student stu[], int n);
    int Name_Search(Student stu[], int n);
    Student* Designate(Student stu[], int n);
    void Insert(Student stu[], int n);
    void Delete(Student stu[], int n);
    void State(Student stu[], int n);
    Student stu[1000], * p;
    int n, place = -1;
    printf("How many students?");
    scanf_s("%d", &n);
    //根据指定学生个数,逐个输入学生信息
    Input(stu, n);
    //逐个显示学生表中所有学生的相关信息
    Print(stu, n);
    //根据姓名进行查找,返回此学生的学号和成绩
    place = Name_Search(stu, n);
    if (place >= 0)
        printf("Result:\nNO.:%8s NAME:%10s SCORE:%5d\n", stu[place].no, stu[place].name, stu[place].price);
    //根据指定的位置可返回相应的学生信息(学号,姓名,成绩)
    p = Designate(stu, n);
    printf("Print:\nNO.:%8s NAME:%10s SCORE:%5d\n", p->no, p->name, p->price);
    //给定一个学生信息,插入到表中指定的位置
    Insert(stu, n);
    //删除指定位置的学生记录
    Delete(stu, n);
    //统计表中学生个数
    State(stu, n);
    return 0;
}
void Input(Student stu[],int n)
{
    int i;
    for (i = 0; i < n; i++)
    {
        printf("NO.:");
        scanf_s("%s", stu[i].no, 8);
        printf("NAME:");
        scanf_s("%s", stu[i].name, 20);
        printf("SCORE:");
        scanf_s("%d", &stu[i].price);
    }
}
void Print(Student stu[], int n)
{
    int i;
    printf("-------Student List--------\n");
    printf("NO.         NAME      SCORE\n");
    for (i = 0; i < n; i++)
        printf("%-10s%-10s%-5d\n", stu[i].no, stu[i].name, stu[i].price);
}
int Name_Search(Student stu[], int n)
{
    int i, find = 0, place = -1;//find标志是否找到,place标记位置
    char search_name[20], c;
    while (!find)
    {
        printf("You want to find:");
        scanf_s("%s", search_name, 20);
        for (i = 0; i < n; i++)
            if (strcmp(search_name, stu[i].name) == 0)
            {
                find = 1;
                place = i;
                return place;
            }
        if (find == 0)
            printf("Cannot found!\n");
        getchar();
        printf("found again?(N/Y)");
        scanf_s("%c", &c, 1);
        if (c == 'y' || c == 'Y')
            find = 0;
        else if ((c == 'n' || c == 'N') && find == 0)
            return place;
    }
}
Student* Designate(Student stu[], int n)
{
    Student* p = NULL;
    int i = 0, design_locate, flag = 0;//design_locate指定位置,flag标志输入是否有效
    while (!flag)
    {
        printf("You want to print:");
        scanf_s("%d", &design_locate);
        if (design_locate >= 0 && design_locate < n)
            flag = 1;
        else
            printf("Data error.again!\n");
    }
    p = stu;
    while (i != design_locate)
    {
        i++;
        p = stu + i;
    }
    return p;
}
void Insert(Student stu[], int n)
{
    Student insert, t1, t2;//insert为插入学生信息
    int i, insert_appoint;//insert_appoint为指定插入位置
    printf("insert information:\n");
    printf("NO.:");
    scanf_s("%s", insert.no, 8);
    printf("NAME:");
    scanf_s("%s", insert.name, 20);
    printf("SCORE:");
    scanf_s("%d", &insert.price);
    printf("the information locate on:");
    scanf_s("%d", &insert_appoint);
    if (insert_appoint < 0 || insert_appoint > n)
        printf("Data error!\n");
    else
    {
        t2 = insert;
        for (i = insert_appoint; i < n; i++)
        {
            t1 = stu[i];
            stu[i] = t2;
            t2 = t1;
        }
        stu[i] = t2;
        n = n + 1;
        printf("-------New Student List-------\n");
        printf("NO.         NAME      SCORE\n");
        for (i = 0; i < n ; i++)
            printf("%-10s%-10s%-5d\n", stu[i].no, stu[i].name, stu[i].price);
    }
}
void Delete(Student stu[], int n)
{
    int i, delete_appoint;//delete_appoint为指定删除位置
    printf("delete information:");
    scanf_s("%d", &delete_appoint);
    if (delete_appoint < 0 || delete_appoint >= n)
        printf("Data error!\n");
    else
    {
        for (i = delete_appoint; i + 1 < n; i++)
            stu[i] = stu[i + 1];
        printf("-------New Student List-------\n");
        printf("NO.         NAME      SCORE\n");
        for (i = 0; i < n - 1; i++)
            printf("%-10s%-10s%-5d\n", stu[i].no, stu[i].name, stu[i].price);
    }
}
void State(Student stu[], int n)
{
    int num = 0, i = 0;//num为统计的表中学生人数
    while (stu[i].no)
    {
        num++;
        i++;
    }
    printf("The number of students: %d", num);
}
  • 写回答

1条回答 默认 最新

  • SmallAntJ 2022-02-10 05:06
    关注
    1. State函数陷入死循环了,Student类中数组no在实例化时已经分配了存储空间,所以stu[i].no不是NULL。要判断stu[i].no为空,162行可以改成:
      while (strlen(stu[i].no))
      
    2. Insert函数和delete函数的第二个参数可以改成传指针,实参为&n,这样可以直接在函数内更新n的值:
      void Insert(Student stu[], int* pn);
      void Delete(Student stu[], int* pn);
      
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 2月18日
  • 已采纳回答 2月10日
  • 创建了问题 2月9日

悬赏问题

  • ¥15 DIFY API Endpoint 问题。
  • ¥20 sub地址DHCP问题
  • ¥15 delta降尺度计算的一些细节,有偿
  • ¥15 Arduino红外遥控代码有问题
  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突