C语言--学生管理系统案例

/**
 *案例问题
 * ①数据条数   自己定的 前后一致即可
 * ②结构体成员name 是单引号还是双引号的问题   汉字 == 3字节
 * ③查找  修改的时候 为什么一致是查无此人  return -1;放错了地方  正确的是应该放到循环外的
 * ④案例删除是真正的删除
 * ⑤删除逻辑
 *
*/

#include <stdio.h>
#include <string.h>
// 定义总的学生数 
#define NUM 100
// 数据结构

typedef struct st
{
    char name[30];
    int age;
    char sex[5];

    /* data */
}STU;

STU s[NUM] = {
    {"张三",18,"男" },
    {"李四",28,"男" },
    {"王嘉瑞",18,"男" }
};

// 帮助菜单显示函数定义
void help_menu() {
    printf("\n");
    printf("     欢迎使用本学生信息管理系统\n");
    printf("* ================================ *\n");
    printf("* 1. 添加                          *\n");
    printf("* 2. 显示                          *\n");
    printf("* 3. 查询                          *\n");
    printf("* 4. 修改                          *\n");
    printf("* 5. 删除                          *\n");
    printf("* 6. 退出                          *\n");
    printf("* ================================ *\n");
}
// 现有数据条数
int n = 3;

void add() {
    if (n > NUM) {
        printf("容量不足\n");
        return;
    }

    printf("请输入用户名:");
    scanf("%s", s[n].name);
    printf("请输入年龄:");
    scanf("%d", &s[n].age);
    printf("请输入性别:");
    scanf("%s", s[n].sex);
    printf("添加成功:姓名:%s 年龄:%d 性别:%s\n", s[n].name, s[n].age, s[n].sex);
    n++;
}

void show() {
    for (int i = 0; i < n; i++)
    {
        printf("姓名:%s 年龄:%d 性别:%s\n", s[i].name, s[i].age, s[i].sex);
    }

}

// 抽离查找的代码
// 字符串比较  ==  s[i].name === sname  strcmp

int find_index(char* p) {
    for (int i = 0; i < n; i++)
    {

        if (strcmp(s[i].name, p) == 0) {
            return i;
        }

    }
    return -1;
}

void find() {
    printf("请输入查询用户名:");
    char sname[30];
    scanf("%s", sname);
    int i = find_index(sname);
    if (i != -1)
    {
        printf("姓名:%s 年龄:%d 性别:%s\n", s[i].name, s[i].age, s[i].sex);

        /* code */
    }
    else {
        printf("查无此人\n");
    }

    printf("===%d\n", i);

}
// 修改的步骤
// 1.查询修改的哪条数据 
// 2.回显
// 和添加的逻辑一致  不需要处理下标  下标就是原来数据的下标
// 
void edit() {
    printf("请输入修改用户名:");
    char sname[30];
    scanf("%s", sname);
    // 查找要修改的姓名数据下标
    int i = find_index(sname);
    if (i != -1) {
        printf("修改前的信息为:姓名:%s 年龄:%d 性别:%s\n", s[i].name, s[i].age, s[i].sex);
        printf("请输入用户名:");
        scanf("%s", s[i].name);
        printf("请输入年龄:");
        scanf("%d", &s[i].age);
        printf("请输入性别:");
        scanf("%s", s[i].sex);
        printf("修改成功:姓名:%s 年龄:%d 性别:%s\n", s[i].name, s[i].age, s[i].sex);
    }
    else {
        printf("未找到\n");
    }
}
//  输入用户名
// 根据用户名 进行查找  return i
// 根据下标  删除对应的一条数据  i = 4 位置替换    总的条数  是发生改变的

// 今天晚上的作业 :学生管理系统
delete() {
    printf("请输入修改用户名:");
    char sname[30];
    scanf("%s", sname);
    int i = find_index(sname);
    if (i != -1)
    {

        s[i] = s[n - 1];
        printf("删除成功\n");


    }
    else {
        printf("查无此人\n");
    }

}



int main() {

    // ①死循环 while while(1)  while(true)
    // ②提示信息  让我们输入对应的数字  scanf(%d,num);
    // ③根据提示信息进行操作  switch case 1 case2  
    // ④根据输入的对应数字  进行相应操作  case 1 add case 2 show 



    while (1)
    {
        help_menu();
        printf("请输入对应的数字:");
        int num;
        scanf("%d", &num);
        switch (num)
        {
        case 1:
            add();
            break;
        case 2:
            show();
            break;
        case 3:
            find();
            break;
        case 4:
            edit();
            break;
        case 5:
            delete();
            break;
        default:
            break;
        }
        if (num == 6)
        {
            break;
        }

    }


    return 0;
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值