【数据结构实践课设】新生报道注册管理信息系统

目录

1.主要框架

2.写入文件

3.读取文件

4.注册学生信息

5.增加学生信息

6.删除学生信息

7.按姓名查询

8.按班级查询

9.按专业查询

10.打印学生信息

11.完整代码


🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。

💡本文由Filotimo__✍️原创,首发于CSDN📚。

📣如需转载,请事先与我联系以获得授权⚠️。

🎁欢迎大家给我点赞👍、收藏⭐️,并在留言区📝与我互动,这些都是我前进的动力!

🌟我的格言:森林草木都有自己认为对的角度🌟。

完整代码在最后面。

这次我们的目标是用C语言实现新生报道注册管理信息系统。

这是我们要用到 C 语言中的三个头文件,分别是:

#include <stdio.h>:它包含了一些输入输出的函数,例如printf()和scanf()。

#include <stdlib.h>:它包含了实用的函数,例如动态内存分配函数malloc() 和free()。

#include <string.h>:它包含了一些操作字符串的函数,例如strcpy() 和strcat()。

1.主要框架

我们首先定义了一个表示学生的结构体,然后声明了要用到的函数,接着编写主函数,搭建好了大致的系统框架:

// 定义一个表示学生的结构体
struct student {
    char nam[10];       // 学生姓名
    char sex[4];        // 学生性别
    char spec[20];      // 学生专业
    char classid[10];   // 学生班级ID
    char phone[15];     // 学生电话号码
    char bedroom[8];    // 学生宿舍号码
};

// 函数声明
void createdata(struct student *stu, int *len);        // 注册学生信息
void add(struct student *stu, int *len);               // 增加学生信息
void delete_student(struct student *stu, int *len);    // 删除学生信息
void search_name(struct student *stu, int len);        // 按姓名查询
void search_class(struct student *stu, int len);       // 按班级查询
void search_specialty(struct student *stu, int len);   // 按专业查询
void print_fun(struct student *stu, int len);          // 打印学生信息

// 主函数
int main() {
    int choice;
    struct student p[1024];
    int len = 0;
    while (1) {
        printf("\n                         新生报到信息注册系统\n\n");
        printf("**********************************************************************\n");
        printf("1. 注册学生信息\n");
        printf("2. 增加学生信息\n");
        printf("3. 删除学生信息\n");
        printf("4. 按姓名查询\n");
        printf("5. 按班级查询\n");
        printf("6. 按专业查询\n");
        printf("7. 打印学生信息\n");
        printf("8. 退出系统\n");
        printf("**********************************************************************\n");
        printf("请输入选项:");
        scanf("%d", &choice);

        switch (choice) {
            case 1: // 注册学生信息
                createdata(p, &len);
                break;
            case 2: // 增加学生信息
                add(p, &len);
                break;
            case 3: // 删除学生信息
                delete_student(p, &len);
                break;
            case 4: // 按姓名查询
                search_name(p, len);
                break;
            case 5: // 按班级查询
                search_class(p, len);
                break;
            case 6: // 按专业查询
                search_specialty(p, len);
                break;
            case 7: // 打印学生信息
                print_fun(p, len);
                break;
            case 8: // 退出系统
                printf("谢谢您的使用!\n\n");
                exit(0); // 退出程序
            default:
                printf("输入有误!请重新输入。\n\n");
                break;
        }
    }
    return 0;
}

接下来,我们要编写前面声明了的函数。

2.写入文件

// 定义一个名为regis的函数
// 参数为一个指向struct student类型的指针p和一个整型变量len
void regis(struct student *p, int len) {
    // 定义一个FILE类型的指针,用于打开/关闭文件
    FILE *fp;
    // 打开名为student_info.txt的文件,使用写入模式打开,即将内容写入到文件尾部
    fp = fopen("student_info.txt", "w");
    // 循环遍历学生信息数组
    for (int i = 0; i < len; i++) {
        // 将学生信息按指定格式写入到文件中
        fprintf(fp, "%s %s %s %s %s %s\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);
    }
    // 关闭文件
    fclose(fp);
}

函数regis用于将结构体数组中的数据写入到文件中。它首先使用fopen函数打开一个名为"student_info.txt"的文件,并指定模式为"w",表示以写入方式打开文件。然后,使用fprintf函数将结构体数组中的数据按照指定的格式写入文件。最后,使用fclose函数关闭文件。

3.读取文件

// 定义一个名为read_data的函数
// 参数为一个指向struct student类型的指针p和一个指向整型变量len的指针
void read_data(struct student *p, int *len) {
    // 定义一个FILE类型的指针,用于打开/关闭文件
    FILE *fp;
    // 打开名为student_info.txt的文件,使用读取模式打开
    fp = fopen("student_info.txt", "r");
    // 检查文件是否打开成功
    if (fp == NULL) {
        printf("文件打开失败\n");
        return;
    }
    // 循环读取文件中的学生信息,直到遇到文件结尾或读取出错
    while (fscanf(fp, "%s %s %s %s %s %s", p[*len].nam, p[*len].sex, p[*len].spec, p[*len].classid, p[*len].phone, p[*len].bedroom) == 6) {
        // 每读取一行信息,增加len的值
        (*len)++;
    }
    // 关闭文件
    fclose(fp);
}

函数read_data用于从文件中读取数据并存入结构体数组中。它首先使用fopen函数打开名为"student_info.txt"的文件,并指定模式为"r",表示以只读方式打开文件。然后,它使用fscanf函数按照指定的格式逐行读取文件中的数据,并将读取的数据存入结构体数组p中的相应位置。同时,使用指针len来记录读取的数据行数。最后,使用fclose函数关闭文件。

regis和read_data这两个函数配合使用可以实现将结构体数组中的数据写入文件,以及从文件中读取数据并存入结构体数组中的功能。

4.注册学生信息

void createdata(struct student *p, int *len) {
    int n;      // 定义变量n,用于存储学生人数
    printf("报到学生人数:");
    scanf("%d", &n);   // 从用户输入中获取学生人数信息
    printf("请输入学生信息:\n");
    // 循环获取每个学生的信息,共n次
    for (int i = 0; i < n; i++) {
        printf("学生%d:\n", i+1);
        printf("姓名:");
        scanf("%s", p[i].nam);
        printf("性别:");
        scanf("%s", p[i].sex);
        printf("专业:");
        scanf("%s", p[i].spec);
        printf("班级:");
        scanf("%s", p[i].classid);
        printf("电话号码:");
        scanf("%s", p[i].phone);
        printf("宿舍号:");
        scanf("%s", p[i].bedroom);
        printf("\n");
    }
    *len = n;   // 将len的值设为学生人数n
    regis(p, n);    // 将学生信息写入文件
}

首先,该函数会从用户输入中获取学生人数,并将其存储在变量`n`中。然后,函数会通过循环获取每个学生的信息,并将其存储在结构体数组`p`的相应位置。每次循环,函数会提示用户输入学生的姓名、性别、专业、班级、电话号码和宿舍号,并使用`scanf`函数读取用户的输入。接下来,函数将学生人数`n`存储到通过指针`len`传递的变量中,以便在后续的代码中可以使用。然后,函数会调用`regis`函数,将结构体数组中的学生信息写入文件中。

5.增加学生信息

void add(struct student *p, int *len) {
    int c = 1;   // 定义变量c,用于存储用户的选择
    // 循环添加学生信息,直到用户选择退出
    while (c == 1) {
        int mylen = *len;   // 将len的值赋给mylen
        struct student st;   // 定义一个struct student类型的变量st,用于存储要添加的学生信息
        printf("请输入要添加学生的信息:\n");
        printf("姓名:");
        scanf("%s", st.nam);
        printf("性别:");
        scanf("%s", st.sex);
        printf("专业:");
        scanf("%s", st.spec);
        printf("班级:");
        scanf("%s", st.classid);
        printf("电话号码:");
        scanf("%s", st.phone);
        printf("宿舍号:");
        scanf("%s", st.bedroom);
        printf("\n");
        p[mylen] = st;   // 将学生信息添加到数组p的末尾
        *len = mylen + 1;   // 将len的值增加1
        print_fun(p, *len);   // 打印所有学生的信息
        printf("\n");
        printf("是否继续添加?输入:\n1.继续\n2.退出\n");
        scanf("%d", &c);   // 获取用户的选择
    }
    regis(p, *len);   // 将学生信息写入文件
}

函数首先定义变量c,用于存储用户的选择,然后通过循环添加学生信息,直到用户选择退出。循环内部,函数先将指针len指向的值存储到变量mylen中,然后定义一个新的结构体变量st,用来存储要添加的学生信息。接着,函数会提示用户输入要添加的学生信息,使用scanf函数获取用户的输入,并将输入的信息存储到结构体变量st中。然后,将st所存储的学生信息添加到原有学生信息的结构体数组p的末尾。另外,通过指针len传递的值增加1,以便在后续的代码中可以使用。

接下来,函数调用print_fun函数,将所有学生的信息打印出来以便修改验证。然后,函数会提示用户选择是否继续添加,如果用户选择退出,则跳出循环。最后,函数调用regis函数将更新后的学生信息写入文件中,以便下次使用时可以使用。

6.删除学生信息

void delete_student(struct student *p, int *len) {
    char nam[10];   // 定义一个字符数组,用于存储要删除的学生姓名
    printf("请输入要删除的学生姓名: ");
    scanf("%s", nam);   // 获取用户输入的学生姓名
    int flag = 0;   // 定义一个标志变量,用于记录是否找到匹配的学生姓名
    // 循环查找学生姓名,并删除匹配的学生记录
    for (int i = 0; i < *len; i++) {
        if (strcmp(p[i].nam, nam) == 0) {   // 如果找到匹配的学生姓名
            // 将后面的学生记录依次向前移动
            for (int j = i; j < *len - 1; j++) {
                strcpy(p[j].nam, p[j + 1].nam);
                strcpy(p[j].sex, p[j + 1].sex);
                strcpy(p[j].spec, p[j + 1].spec);
                strcpy(p[j].classid, p[j + 1].classid);
                strcpy(p[j].phone, p[j + 1].phone);
                strcpy(p[j].bedroom, p[j + 1].bedroom);
            }
            (*len)--;   // 更新学生记录数量
            flag = 1;   // 设置标志变量为1,表示找到了匹配的学生姓名
            break;   // 跳出循环
        }
    }
    if (flag) {   // 如果找到了匹配的学生姓名
        printf("删除成功!\n");
        regis(p, *len);   // 将更新后的学生信息写入文件
    } else {   // 如果没有找到匹配的学生姓名
        printf("学生姓名不存在!\n");
    }
}

函数首先定义一个字符数组`nam`,用于存储要删除的学生姓名,并提示用户输入要删除的学生姓名。然后使用`scanf`函数获取用户输入的学生姓名。接着,函数定义一个标志变量`flag`,用于记录是否找到匹配的学生姓名。

接下来,函数通过循环遍历已有的学生记录,从中查找匹配的学生姓名,并删除匹配的学生记录。当找到匹配的学生姓名时,函数使用一个内层循环将后面的学生记录依次向前移动,以覆盖被删除的学生记录。在移动学生记录后,通过`strcpy`函数将后面学生记录的属性值依次复制到当前学生记录中。同时,通过递减指针`len`所指向的值,以更新学生记录的数量。

如果成功删除了学生记录,则将标志变量`flag`设置为1表示找到了匹配的学生姓名,并跳出循环。否则,如果没有找到匹配的学生姓名,则标志变量`flag`保持为0。

最后,函数根据标志变量`flag`的值,判断是否成功删除了学生记录。如果成功删除了学生记录,则打印"删除成功!"的提示,并调用`regis`函数将更新后的学生信息写入文件。否则,如果没有找到匹配的学生姓名,则打印"学生姓名不存在!"的提示。

7.按姓名查询

void search_name(struct student *p, int len) {
    char nam1[100];   // 定义一个字符数组,用于存储要查询的学生姓名
    printf("请输入要查询学生姓名:");
    scanf("%s", nam1);   // 获取用户输入的学生姓名
    printf("姓名\t性别\t专业\t班级\t电话号码\t宿舍号\t\n");
    int flag = 0;   // 定义一个标志变量,用于记录是否找到匹配的学生姓名
    // 循环查找学生姓名,并输出匹配的学生记录
    for (int i = 0; i < len; i++) {
        if (strcmp(p[i].nam, nam1) == 0) {   // 如果找到匹配的学生姓名
            printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);
            flag = 1;   // 设置标志变量为1,表示找到了匹配的学生姓名
            break;   // 跳出循环
        }
    }
    if (!flag) {   // 如果没有找到匹配的学生姓名
        printf("姓名输入有误!\n");
    }
}

函数首先定义一个字符数组`nam1`,用于存储要查询的学生姓名,并提示用户输入要查询的学生姓名。然后使用`scanf`函数获取用户输入的学生姓名。接着,函数打印一个表头,用于显示学生信息的各个属性。同时,函数定义一个标志变量`flag`,用于记录是否找到匹配的学生姓名。

接下来,函数通过循环遍历已有的学生记录,从中查找匹配的学生姓名,并输出匹配的学生记录。当找到匹配的学生姓名时,函数使用`printf`函数按照指定的格式输出匹配的学生的姓名、性别、专业、班级、电话号码和宿舍号。同时,将标志变量`flag`设置为1表示找到了匹配的学生姓名,并跳出循环。

最后,函数根据标志变量`flag`的值,判断是否成功找到了匹配的学生姓名。如果没有找到匹配的学生姓名,则打印"姓名输入有误!"的提示。

8.按班级查询

void search_class(struct student *p, int len) {
    char classid[10];   // 定义一个字符数组,用于存储要查询的班级
    printf("请输入要查询的班级: ");
    scanf("%s", classid);   // 获取用户输入的班级
    printf("姓名\t性别\t专业\t班级\t电话号码\t宿舍号\t\n");
    int flag = 0;   // 定义一个标志变量,用于记录是否找到匹配的班级
    // 循环查找班级,并输出匹配的学生记录
    for (int i = 0; i < len; i++) {
        if (strcmp(p[i].classid, classid) == 0) {   // 如果找到匹配的班级
            printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);
            flag = 1;   // 设置标志变量为1,表示找到了匹配的班级
        }
    }
    if (!flag) {   // 如果没有找到匹配的班级
        printf("没有找到该班级的学生信息!\n");
    }
}

函数首先定义一个字符数组`classid`,用于存储要查询的班级,并提示用户输入要查询的班级。然后使用`scanf`函数获取用户输入的班级。接着,函数打印一个表头,用于显示学生信息的各个属性。同时,函数定义一个标志变量`flag`,用于记录是否找到匹配的班级。

接下来,函数通过循环遍历已有的学生记录,从中查找匹配的班级,并输出匹配的学生记录。当找到匹配的班级时,函数使用`printf`函数按照指定的格式输出匹配的学生的姓名、性别、专业、班级、电话号码和宿舍号。同时,将标志变量`flag`设置为1表示找到了匹配的班级。

最后,函数根据标志变量`flag`的值,判断是否成功找到了匹配的班级。如果没有找到匹配的班级,则打印"没有找到该班级的学生信息!"的提示。

9.按专业查询

void search_specialty(struct student *p, int len) {
    char spec[20];   // 定义一个字符数组,用于存储要查询的专业
    printf("请输入要查询的专业: ");
    scanf("%s", spec);   // 获取用户输入的专业
    printf("姓名\t性别\t专业\t班级\t电话号码\t宿舍号\t\n");
    int flag = 0;   // 定义一个标志变量,用于记录是否找到匹配的专业
    // 循环查找专业,并输出匹配的学生记录
    for (int i = 0; i < len; i++) {
        if (strcmp(p[i].spec, spec) == 0) {   // 如果找到匹配的专业
            printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);
            flag = 1;   // 设置标志变量为1,表示找到了匹配的专业
        }
    }
    if (!flag) {   // 如果没有找到匹配的专业
        printf("没有找到该专业的学生信息!\n");
    }
}

函数首先定义一个字符数组`spec`,用于存储要查询的专业,并提示用户输入要查询的专业。然后使用`scanf`函数获取用户输入的专业。接着,函数打印一个表头,用于显示学生信息的各个属性。同时,函数定义一个标志变量`flag`,用于记录是否找到匹配的专业。

接下来,函数通过循环遍历已有的学生记录,从中查找匹配的专业,并输出匹配的学生记录。当找到匹配的专业时,函数使用`printf`函数按照指定的格式输出匹配的学生的姓名、性别、专业、班级、电话号码和宿舍号。同时,将标志变量`flag`设置为1表示找到了匹配的专业。

最后,函数根据标志变量`flag`的值,判断是否成功找到了匹配的专业。如果没有找到匹配的专业,则打印"没有找到该专业的学生信息!"的提示。

10.打印学生信息

void print_fun(struct student *p, int len) {
    printf("姓名\t性别\t专业\t班级\t电话号码\t宿舍号\t\n");
    // 循环输出所有学生记录
    for (int i = 0; i < len; i++) {
        printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);
    }
}

函数首先打印一个表头,用于显示学生信息的各个属性。接着,函数通过循环遍历已有的学生记录,并使用`printf`函数按照指定的格式输出每个学生的姓名、性别、专业、班级、电话号码和宿舍号。

11.完整代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义一个表示学生的结构体
struct student {
    char nam[10];       
    char sex[4];        
    char spec[20];      
    char classid[10];   
    char phone[15];     
    char bedroom[8];    
};

// 函数声明
void createdata(struct student *stu, int *len);        // 注册学生信息
void add(struct student *stu, int *len);               // 增加学生信息
void delete_student(struct student *stu, int *len);    // 删除学生信息
void search_name(struct student *stu, int len);        // 按姓名查询
void search_class(struct student *stu, int len);       // 按班级查询
void search_specialty(struct student *stu, int len);   // 按专业查询
void print_fun(struct student *stu, int len);          // 打印学生信息

// 主函数
int main() {
    int choice;
    struct student p[1024];
    int len = 0;
    while (1) {
        printf("\n                         新生报到信息注册系统\n\n");
        printf("**********************************************************************\n");
        printf("1. 注册学生信息\n");
        printf("2. 增加学生信息\n");
        printf("3. 删除学生信息\n");
        printf("4. 按姓名查询\n");
        printf("5. 按班级查询\n");
        printf("6. 按专业查询\n");
        printf("7. 打印学生信息\n");
        printf("8. 退出系统\n");
        printf("**********************************************************************\n");
        printf("请输入选项:");
        scanf("%d", &choice);

        switch (choice) {
            case 1: 
                createdata(p, &len);
                break;
            case 2: 
                add(p, &len);
                break;
            case 3: 
                delete_student(p, &len);
                break;
            case 4: 
                search_name(p, len);
                break;
            case 5: 
                search_class(p, len);
                break;
            case 6: 
                search_specialty(p, len);
                break;
            case 7: 
                print_fun(p, len);
                break;
            case 8: 
                printf("谢谢您的使用!\n\n");
                exit(0); 
            default:
                printf("输入有误!请重新输入。\n\n");
                break;
        }
    }
    return 0;
}

//写入文件 
void regis(struct student *p, int len) {
    FILE *fp;
    fp = fopen("student_info.txt", "w");
    for (int i = 0; i < len; i++) {
        fprintf(fp, "%s %s %s %s %s %s\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);
    }
    fclose(fp);
}

// 读取文件
void read_data(struct student *p, int *len) {
    FILE *fp;
    fp = fopen("student_info.txt", "r");
    if (fp == NULL) {
        printf("文件打开失败\n");
        return;
    }
    while (fscanf(fp, "%s %s %s %s %s %s", p[*len].nam, p[*len].sex, p[*len].spec, p[*len].classid, p[*len].phone, p[*len].bedroom) == 6) {
        (*len)++;
    }
    fclose(fp);
}

// 注册学生信息
void createdata(struct student *p, int *len) {
    int n;      
    printf("报到学生人数:");
    scanf("%d", &n);   
    printf("请输入学生信息:\n");
    for (int i = 0; i < n; i++) {
        printf("学生%d:\n", i+1);
        printf("姓名:");
        scanf("%s", p[i].nam);
        printf("性别:");
        scanf("%s", p[i].sex);
        printf("专业:");
        scanf("%s", p[i].spec);
        printf("班级:");
        scanf("%s", p[i].classid);
        printf("电话号码:");
        scanf("%s", p[i].phone);
        printf("宿舍号:");
        scanf("%s", p[i].bedroom);
        printf("\n");
    }
    *len = n;   
    regis(p, n);    
}

// 增加学生信息
void add(struct student *p, int *len) {
    int c = 1;   
    while (c == 1) {
        int mylen = *len;   
        struct student st;   
        printf("请输入要添加学生的信息:\n");
        printf("姓名:");
        scanf("%s", st.nam);
        printf("性别:");
        scanf("%s", st.sex);
        printf("专业:");
        scanf("%s", st.spec);
        printf("班级:");
        scanf("%s", st.classid);
        printf("电话号码:");
        scanf("%s", st.phone);
        printf("宿舍号:");
        scanf("%s", st.bedroom);
        printf("\n");
        p[mylen] = st;   
        *len = mylen + 1;   
        print_fun(p, *len);   
        printf("\n");
        printf("是否继续添加?输入:\n1.继续\n2.退出\n");
        scanf("%d", &c);   
    }
    regis(p, *len);   
}

// 删除学生信息
void delete_student(struct student *p, int *len) {
    char nam[10];   
    printf("请输入要删除的学生姓名: ");
    scanf("%s", nam);   
    int flag = 0;   
    for (int i = 0; i < *len; i++) {
        if (strcmp(p[i].nam, nam) == 0) {   
            for (int j = i; j < *len - 1; j++) {
                strcpy(p[j].nam, p[j + 1].nam);
                strcpy(p[j].sex, p[j + 1].sex);
                strcpy(p[j].spec, p[j + 1].spec);
                strcpy(p[j].classid, p[j + 1].classid);
                strcpy(p[j].phone, p[j + 1].phone);
                strcpy(p[j].bedroom, p[j + 1].bedroom);
            }
            (*len)--;   
            flag = 1;   
            break;   
        }
    }
    if (flag) {   
        printf("删除成功!\n");
        regis(p, *len);   
    } else {   
        printf("学生姓名不存在!\n");
    }
}

// 按姓名查询
void search_name(struct student *p, int len) {
    char nam1[100];   
    printf("请输入要查询学生姓名:");
    scanf("%s", nam1);   
    printf("姓名\t性别\t专业\t班级\t电话号码\t宿舍号\t\n");
    int flag = 0;   
    for (int i = 0; i < len; i++) {
        if (strcmp(p[i].nam, nam1) == 0) {   
            printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);
            flag = 1;   
            break;   
        }
    }
    if (!flag) {   
        printf("姓名输入有误!\n");
    }
}

// 按班级查询
void search_class(struct student *p, int len) {
    char classid[10];   
    printf("请输入要查询的班级: ");
    scanf("%s", classid);   
    printf("姓名\t性别\t专业\t班级\t电话号码\t宿舍号\t\n");
    int flag = 0;   
    for (int i = 0; i < len; i++) {
        if (strcmp(p[i].classid, classid) == 0) {   
            printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);
            flag = 1;   
        }
    }
    if (!flag) {   
        printf("没有找到该班级的学生信息!\n");
    }
}

// 按专业查询
void search_specialty(struct student *p, int len) {
    char spec[20];   
    printf("请输入要查询的专业: ");
    scanf("%s", spec);   
    printf("姓名\t性别\t专业\t班级\t电话号码\t宿舍号\t\n");
    int flag = 0;   
    for (int i = 0; i < len; i++) {
        if (strcmp(p[i].spec, spec) == 0) {   
            printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);
            flag = 1;   
        }
    }
    if (!flag) {   
        printf("没有找到该专业的学生信息!\n");
    }
}

// 打印学生信息
void print_fun(struct student *p, int len) {
    printf("姓名\t性别\t专业\t班级\t电话号码\t宿舍号\t\n");
    for (int i = 0; i < len; i++) {
        printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);
    }
}

运行截图:

说明:输入选项1后,填写报到学生人数最好不要超过10人,主要是一条一条数据输入得输半天。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/234253.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】强化学习(四)强化学习的值函数

文章目录 一、强化学习问题1、交互的对象2、强化学习的基本要素3、策略&#xff08;Policy&#xff09;4、马尔可夫决策过程5、强化学习的目标函数6、值函数1. 状态值函数&#xff08;State Value Function&#xff09;a. 状态值函数的定义b. 贝尔曼方程&#xff08;Bellman Eq…

Android 11 适配——整理总结篇

背景 > 经过检测&#xff0c;我们识别到您的应用&#xff0c;目前未适配安卓11&#xff08;API30&#xff09;&#xff0c;请您关注适配截止时间&#xff0c;尽快开展适配工作&#xff0c;避免影响应用正常发布和经营。 > targetSdkVersion30 升级适配工作参考文档&am…

107.管道(有名、无名管道)

目录 管道 无名管道 无名管道的创建 无名管道的基本用法 有名管道 写管道的进程&#xff1a; 读管道的进程&#xff1a; 管道 管道是一种进程间通信的机制&#xff0c;允许一个进程的输出直接作为另一个进程的输入。在Linux 系统中&#xff0c;管道通过 pipe 系统调用来…

javaSwing酒店管理系统

一、 使用方法&#xff1a; 在使用前&#xff0c;需要到druid.properties 配置文件中&#xff0c;修改自己对应于自己数据库的属性&#xff1b;如用户名&#xff0c;密码等 driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql:///hotel?useUnicodetrue&characterEn…

【C++ 程序设计入门基础】- 第3节-循环结构02

目录 while 语句 案例 while 循环 输入一个整数 n &#xff0c;输出 1~n 的所有整数。 查看运行结果&#xff1a; while 语句结构解析 do while 语句 案例 do while 循环 输入一个整数n&#xff0c;输出1&#xff5e;n的所有整数。 查看运行结果 while、do while的区别 …

Go压测工具

前言 在做Go的性能分析调研的时候也使用到了一些压测方面的工具&#xff0c;go本身也给我们提供了BenchMark性能测试用例&#xff0c;可以很好的去测试我们的单个程序性能&#xff0c;比如测试某个函数&#xff0c;另外还有第三方包go-wrk也可以帮助我们做http接口的性能压测&…

TCP为什么可靠之“重传机制”

TCP重传机制 TCP针对数据包丢失的情况&#xff0c;会通过重传机制解决&#xff0c;包括像超时重传、快速重传、选择确认SACK、D-SACK 超时重传 TCP会设置一个定时器&#xff0c;如果在发送数据之后的规定时间内&#xff0c;没有收到对方的ACK报文&#xff0c;就会触发重新发…

【Qt开发流程】之容器类2:使用STL风格迭代器进行遍历

概述 对于每个容器类&#xff0c;都有两种stl风格的迭代器类型:一种提供只读访问&#xff0c;另一种提供读写访问。应该尽可能使用只读迭代器&#xff0c;因为它们比读写迭代器快。 STL迭代器的API以数组中的指针为模型。例如&#xff0c;操作符将迭代器推进到下一项&#xf…

vue2+datav可视化数据大屏(1)

开始 &#x1f4d3; 最近打算出一个前端可视化数据大屏的系列专栏&#xff0c;这次将很全面的教大家设计可视化大屏&#xff0c;从开始到打包结束&#xff0c;其中&#xff0c;包括如何设计框架&#xff0c;如何封装axios&#xff0c;等等&#xff0c;本次使用的数据均为mock数…

关于AllowBeanDefinitionOverriding属性设置问题

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…

二叉树的OJ练习(二)

通过前序遍历数组构建二叉树 题目&#xff1a;通过前序遍历的数组&#xff08;ABD##E#H##CF##G##&#xff09;构建二叉树 TreeNode* TreeCreat(char* a,int* pi) {if(a[*pi] #){(*pi);return NULL; }TreeNode* root (TreeNode*)malloc(sizeof(TreeNode));if(root NULL){p…

【Unity动画】Avatar Mask

创建 Avatar Mask可以设置那一部分骨骼运动和不运动 然后放在状态机里面的层中来混合 【后续完善】

前端入门:HTML初级指南,网页的简单实现!

代码部分&#xff1a; <!DOCTYPE html> <!-- 上方为DOCTYPE声明&#xff0c;指定文档类型为HTML --> <html lang"en"> <!-- html标签为整个页面的根元素 --> <head> <!-- title标签用于定义文档标题 --> <title>初始HT…

快速测试 3节点的redis sentinel集群宕机2个节点以后是否仍能正常使用

有同事问我&#xff0c;三个redis sentinel节点&#xff0c;宕机两个节点以后&#xff0c;是否还能够正常的通过redis sentinel正常访问redis的数据。我想了想&#xff0c;理论上是可以的&#xff0c;但是我没试过&#xff0c;今天有时间就测试了一下。搭建环境和测试代码的过程…

Linux Component概述和高通component的使用

1 Linux为什么要引入Component框架&#xff1f; 为了让subsystem按照一定顺序初始化设备才提出来的。 subsystem中由很多设备模块&#xff0c;内核加载这些模块的时间不确定。子系统内有些模块是需要依赖其它模块先初始化才能进行自己初始化工作(例如v4l2 subdev和v4l2 video …

虚拟化之通用计时器

Arm架构包含通用定时器(Generic Timer),这是每个处理器中都有的一组标准化定时器。通用定时器包括一组比较器,这些比较器与一个共同的系统计数进行比较。当比较器的值等于或小于系统计数时,该比较器会生成中断。在下图中,我们可以看到系统中的通用定时器(橙色)以及其比…

HTML+CSS+JavaScript制作简单轮播图

一 运行效果 二 图片资源 三 代码 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title><style>img{position:absolute;top:6%;left:20%;width:800px;height:240px;}.picture {back…

【FMCW毫米波雷达设计 】 — FMCW波形

原书&#xff1a;FMCW Radar Design 1 引言 本章研究驱动FMCW雷达的主要波形:线性调频(LFM)波形。我们研究信号的行为及其性质。随后&#xff0c;本章讨论了匹配滤波理论&#xff0c;并研究了压缩这种波形的技术&#xff0c;特别是所谓的拉伸处理&#xff0c;它赋予FMCW雷达极…

最长子序列问题(LCS)--动态规划解法

题目描述&#xff1a; 如果Z既是X的子序列&#xff0c;又是Y的子序列&#xff0c;则称Z为X和Y的公共子序列。 如果给定X、Y&#xff0c;求出最长Z及其长度。 示例&#xff1a; 输入 ABCPDSFJGODIHJOFDIUSHGD OSDIHGKODGHBLKSJBHKAGHI 输出 SDIHODSHG 9 分析&#xff1a…

课堂练习4.2:页式内存管理

4-3 课堂练习4.2:页式内存管理 创建一个进程(创建进程是在磁盘中),进程以字节为单位编号,然后再进程分为许多页(每页 4KB ),内存中有对应的页框(设定同页)。通过页表(记录页和页框的对应关系),将最需要的页调入内存,其他页留在磁盘中。根据 CPU 的需要动态的更新…
最新文章