嵌入式开发C语言学习day15-华清作业7.18

学习笔记

作业

学生管理系统

//student.h
#ifndef STUDENT_H
#define STUDENT_H
#include <myhead.h>

// 定义数据表最大容量
#define MAX 50
// 定义数据元素类型
typedef int datatype_ID;       // 学号
typedef char datatype_Name;    // 姓名
typedef double datatype_Score; // 成绩
// 定义数据表结构类型
typedef struct
{
    struct
    {
        datatype_ID studentId[20];       // 学号
        datatype_Name studentName[20];   // 班级
        datatype_Score studentScore[20]; // 姓名
    } student[MAX];
    int len; // 顺序表长度
} StudentList, *StudentListPtr;

// 在堆区创建顺序表
StudentListPtr create_list();
// 菜单
void menu();
// 判断是否为空
int list_empty(StudentListPtr L);
// 判断是否为满
int list_full(StudentListPtr L);
// 输入
void input_student(StudentListPtr L);
// 输出
void show_student(StudentListPtr L);
// 增加
int add_student(StudentListPtr L, int pos,
                int studentID, char studentName[], double studentScore);
// 删除
int delete_student(StudentListPtr L,char studentName[]);
// 修改
void modify_student(StudentListPtr L, char studentName[]);
// 按名字查找
int find_student_by_name(StudentListPtr L, char studentName[]);
// 排序
void sort_students(StudentListPtr L);

#endif
//student.c
#include <myhead.h>
#include "student.h"

// 菜单
void menu()
{
    printf("\t\t==>1.录入学生成绩\n");
    printf("\t\t==>2.查看学生成绩\n");
    printf("\t\t==>3.按照位置增加学生成绩\n");
    printf("\t\t==>4.删除学生成绩\n");
    printf("\t\t==>5.修改学生成绩\n");
    printf("\t\t==>6.按名字查找学生成绩\n");
    printf("\t\t==>7.按升序排序学生成绩\n");
    printf("\t\t==>0.退出程序\n");
};

// 在堆区创建顺序表  ???
StudentListPtr create_list()
{
    StudentListPtr L = (StudentListPtr)malloc(sizeof(StudentList));
    if (NULL == L)
    {
        printf("创建顺序表失败\n");
        return NULL;
    }
    memset(L->student, 0, sizeof(L->student));
    L->len = 0; // 顺序长度为0
    printf("创建顺序表成功\n");
    return L;
};

// 判断是否为空
int list_empty(StudentListPtr L)
{
    return L->len == 0;
};

// 判断是否为满
int list_full(StudentListPtr L)
{
    return L->len == MAX;
};

// 输入
void input_student(StudentListPtr L)
{
    printf("请输入学生的人数:");
    scanf("%d", &L->len);
    printf("\n");
    // 判断 len>0 len<max
    if (L->len >= 0 && L->len <= MAX)
    {
        for (int i = 0; i < L->len; i++)
        {
            printf("请输入第%d个学生的学号:", i + 1);
            scanf("%d", L->student[i].studentId);
            printf("请输入第%d个学生的姓名:", i + 1);
            scanf("%s", L->student[i].studentName);
            printf("请输入第%d个学生的成绩:", i + 1);
            scanf("%lf", L->student[i].studentScore);
        }
        if (NULL != L || list_empty(L))
        {
            printf("\n");
            printf("录入学生成功\n");
        }
    }
};

// 输出
void show_student(StudentListPtr L)
{
    if (NULL != L || list_empty(L))
    {
        for (int i = 0; i < L->len; i++)
        {
            printf("学号:%d 姓名:%s 成绩:%lf\n",
                   L->student[i].studentId[0],
                   L->student[i].studentName,
                   L->student[i].studentScore[0]);
        }
        printf("\n");
    }
    else
        printf("查看学生成绩失败\n");
};
// 增加
int add_student(StudentListPtr L, int pos,
                int studentID, char studentName[], double studentScore)
{
    if (NULL == L || list_full(L) || pos < 0 || pos > L->len)
    {
        printf("插入失败\n");
        return 0;
    }
    for (int i = L->len; i > pos - 1; i--)
    {
        L->student[i + 1] = L->student[i];
    }

    L->student[pos - 1].studentId[0] = studentID; // 直接赋值给数组的第一个元素

    strcpy(L->student[pos - 1].studentName, studentName); // 使用 strcpy 复制字符串

    L->student[pos - 1].studentScore[0] = studentScore; // 直接赋值给数组的第一个元素

    L->len++; // 增加顺序表的长度

    return 1;
}
// 删除
int delete_student(StudentListPtr L, char studentName[])
{
    int found = 0;
    for (int i = 0; i < L->len; i++)
    {
        if (strcmp(L->student[i].studentName, studentName) == 0)
        {
            found = 1;
            for (int j = i; j < L->len - 1; j++)
            {
                L->student[j] = L->student[j + 1];
            }
            L->len--;
            break;
        }
    }
    if (found)
    {
        printf("删除成功\n");
        return 1;
    }
    else
    {
        printf("未找到该学生,删除失败\n");
        return 0;
    }
}

// 修改
void modify_student(StudentListPtr L, char studentName[])
{
    int found = 0;
    for (int i = 0; i < L->len; i++)
    {
        if (strcmp(L->student[i].studentName, studentName) == 0)
        {
            found = 1;
            printf("请输入修改后的学号: ");
            scanf("%d", &L->student[i].studentId[0]);
            printf("请输入修改后的姓名: ");
            scanf("%s", L->student[i].studentName);
            printf("请输入修改后的成绩: ");
            scanf("%lf", &L->student[i].studentScore[0]);
            break;
        }
    }
    if (found)
    {
        printf("修改成功\n");
    }
    else
    {
        printf("未找到该学生,修改失败\n");
    }
}

// 按名字查找
int find_student_by_name(StudentListPtr L, char studentName[])
{
    for (int i = 0; i < L->len; i++)
    {
        if (strcmp(L->student[i].studentName, studentName) == 0)
        {
            printf("学号: %d  姓名: %s  成绩: %lf\n",
                   L->student[i].studentId[0],
                   L->student[i].studentName,
                   L->student[i].studentScore[0]);
            return 1;
        }
    }
    printf("未找到该学生\n");
    return 0;
}

// 排序(按成绩升序)
void sort_students(StudentListPtr L)
{
    for (int i = 0; i < L->len - 1; i++)
    {
        for (int j = 0; j < L->len - i - 1; j++)
        {
            if (L->student[j].studentScore[0] > L->student[j + 1].studentScore[0])
            {
                // 交换学生信息
                struct
                {
                    datatype_ID studentId;
                    datatype_Name studentName[20];
                    datatype_Score studentScore;
                } temp;

                temp.studentId = L->student[j].studentId[0];
                strcpy(temp.studentName, L->student[j].studentName);
                temp.studentScore = L->student[j].studentScore[0];

                L->student[j].studentId[0] = L->student[j + 1].studentId[0];
                strcpy(L->student[j].studentName, L->student[j + 1].studentName);
                L->student[j].studentScore[0] = L->student[j + 1].studentScore[0];

                L->student[j + 1].studentId[0] = temp.studentId;
                strcpy(L->student[j + 1].studentName, temp.studentName);
                L->student[j + 1].studentScore[0] = temp.studentScore;
            }
        }
    }
    printf("排序成功\n");
}
//studentmain.c
#include <myhead.h>
#include "student.h"
int main(int argc, char const *argv[])
{
    int key = 0;
    int studentID, pos;
    char studentName[MAX];
    double studentScore;
    StudentListPtr L = create_list();
    if (NULL == L)
    {
        return -1;
    }
    while (1)
    {
        menu();
        printf("\n");
        printf("请输入你要进行的操作:");
        scanf("%d", &key);
        printf("\n");
        switch (key)
        {
        case 1:
            // 输入
            input_student(L);
            break;
        case 2:
            // 输出
            show_student(L);
            break;
        case 3:
            // 增加
            {
                printf("请输入插入位置: ");
                scanf("%d", &pos);
                printf("请输入学生学号: ");
                scanf("%d", &studentID);
                printf("请输入学生姓名: ");
                scanf("%s", studentName);
                printf("请输入学生成绩: ");
                double studentScore;
                scanf("%lf", &studentScore);

                add_student(L, pos, studentID, studentName, studentScore);
            }
            break;
        case 4:
            // 删除
            {
                char studentName[20];
                printf("请输入要删除的学生姓名: ");
                scanf("%s", studentName);
                delete_student(L, studentName);
            }
            break;
        case 5:
            // 修改
            {
                char studentName[20];
                printf("请输入要修改的学生姓名: ");
                scanf("%s", studentName);
                modify_student(L, studentName);
            }
            break;
        case 6:
            // 按名字查找
            {
                char studentName[20];
                printf("请输入要查找的学生姓名: ");
                scanf("%s", studentName);
                find_student_by_name(L, studentName);
            }
            break;
        case 7:
            // 排序
            sort_students(L);
            break;
        case 0:
            // 退出
            break;
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值