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

news2024/11/28 4:28:01

目录

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.coloradmin.cn/o/1300431.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【S32K3环境搭建】-0.4-使用SEGGER J-Link烧录调试程序

【S32K3_MCAL从入门到精通】合集&#xff1a; S32K3_MCAL从入门到精通https://blog.csdn.net/qfmzhu/category_12519033.html 导入一个编译没有报错的S32K312工程。接着在菜单栏中&#xff0c;依次选择Debug下拉箭头 -- > Debug Configuration&#xff1b; 在弹出的Create…

FL Studio 21注册机激活码序列号下载 附激活码

FL Studio 21 keygen激活码序列号是一款基于同名软件激活程序。操作非常简单。用户只需使用本激活工具生成激活码&#xff0c;即可一键激活软件所有功能&#xff0c;无需付费。去购买注册程序&#xff0c;永久免费使用所有功能。很多用户应该都知道&#xff0c;专业的编辑工具只…

SpringCloud-高级篇(六)

&#xff08;1&#xff09;Seata架构 &#xff08;2&#xff09;部署TC服务 修改注册中心&#xff1a;做服务注册&#xff0c;tc服务配置注册中心&#xff0c;tc服务可以做集群&#xff0c;他也是一个服务 &#xff0c;微服务里面RM 跟TM跟它建立联系肯定是基于注册中心去找&a…

using dapers on diffusers: Dreambooth, Texual Inversion, LoRA and IP-Adapter

using dapers on diffusers: Dreambooth, Texual Inversion, LoRA and IP-Adapter 参考自&#xff1a;https://huggingface.co/docs/diffusers/using-diffusers/loading_adapters 如今&#xff0c;对于 diffusion 模型&#xff0c;有许多高效的训练技术来微调一个定制化的模型&…

gittee使用教学

一、git简介 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效的处理任何大小项目的版本管理。 核心功能&#xff1a; 项目的版本管理 团队协同开发 二、准备工作 1、下载 Git 2、除了选择安装位置以外&#xff0c;其他都无脑安装 3、检查一下安装情况 win…

Android系统中使用Cunit测试C/C++接口

Android系统中使用Cunit测试C/C接口 Cunit是C/C语言的单元测试框架&#xff0c;但常用于Windows和Linux开发中。 Android系统中经常有jni、so库、hal service等都是C/C实现&#xff0c;本文讲解如何将Cunit嵌入Android中&#xff0c;用于测试一些C/C api。 Cunit简介 Cunit是很…

Post Quantum Fuzzy Stealth Signatures and Applications

目录 笔记后续的研究方向摘要引言贡献模块化框架模糊构造实施适用于FIDO Post Quantum Fuzzy Stealth Signatures and Applications CCS 2023 笔记 后续的研究方向 摘要 自比特币问世以来&#xff0c;基于区块链的加密货币中的私人支付一直是学术和工业研究的主题。隐形地址…

Java 何时会触发一个类的初始化

Java 何时会触发一个类的初始化&#xff1f; 使用new关键字创建对象访问类的静态成员变量 或 对类的静态成员变量进行赋值调用类的静态方法反射调用类时&#xff0c;如 Class.forName()初始化子类时&#xff0c;会先初始化其父类&#xff08;如果父类还没有进行过初始化的话&a…

动态规划_最小花费爬楼

//给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选择向上爬一个或者两个台阶。 // // 你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。 // // 请你计算并返回达到楼梯顶部的最低花费。 …

小模型学习(1)-人脸识别

【写作背景】因为最近一直在研究大模型&#xff0c;在与客户进行交流时&#xff0c;如果要将大模型的变革性能力讲清楚&#xff0c;就一定要能将AI小模型的一些原理和效果讲清楚&#xff0c;进而形成对比。当然这不是一件简单的事情&#xff0c;一方面大模型分析问题的的本质原…

C# 使用CancellationTokenSource 取消Task执行

写在前面 在Task创建并执行后&#xff0c;如果状态发生了变化&#xff0c;需要取消正在执行中的Task&#xff0c;除了使用主线程上的共享变量来判断之外&#xff0c;更优雅的方式就是就是用CancellationTokenSource来取消任务的执行。 代码实现 public static void CancelTas…

【AIGC】Midjourney高级进阶版

Midjourney 真是越玩越上头&#xff0c;真是给它的想象力跪了~ 研究了官方API&#xff0c;出一个进阶版教程 命令 旨在介绍Midjourney在Discord频道中的文本框中支持的指令。 1&#xff09;shorten 简化Prompt 该指令可以将输入的Prompt为模型可以理解的语言。模型理解语言…

(2022|ICLR,kNN检索,扩散,仅图像训练)KNN-Diffusion:通过大规模检索生成图像

KNN-Diffusion: Image Generation via Large-Scale Retrieval 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 3. 方法 3.1 仅文本图像处理 4. 实验 …

PyQt下使用OpenCV实现人脸检测与识别

背景&#xff1a; 一 数字图像处理与识别警务应用模型 基于前期所学知识&#xff0c;与公安实践相结合&#xff0c;综合设计数字图像处理与识别警务应用模型,从下列4个研究课题中选择2个进行实验实现&#xff1a;图像增强与复原、人脸检测与识别、虹膜内外圆检测与分割、车牌…

Android 11 适配——整理总结篇

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

redis数据淘汰策略:

面试官&#xff1a;了解redis数据淘汰策略吗&#xff1f; 就是当Redis内存使用达到设置的上限时&#xff0c; 此时需要使用redis数据淘汰机制来进行数据淘汰。&#xff08;有针对key的 和 针对value数据的&#xff09; Redis支持8种不同策略来选择要删除的key&#xff1a; n…

ant Design of vue 实现table每栏动态根据条件设置背景颜色(table栏每一栏颜色自定义)

效果图&#xff1a; 注意效果图中&#xff0c;table的表格每一栏颜色都要不一样 代码实现&#xff1a; 页面结构&#xff1a; <a-table :columns"columns" :loading"tableLoading" :data-source"tableData" rowKeyid size"middle&quo…

IntelliJ IDEA开启git版本控制的简单教程

这篇文章想要分享一下怎么在IntelliJ IDEA开启版本控制&#xff0c;博主使用的是gitee&#xff0c;首先需要安装git&#xff0c;关于git的安装这里就不介绍了&#xff0c;很简单。 目录 创建git仓库 创建项目 开启版本控制 拉取项目 创建git仓库 首先&#xff0c;需要登录…

C++ 模拟实现vector

目录 一、定义 二、模拟实现 1、无参初始化 2、size&capacity 3、reserve 4、push_back 5、迭代器 6、empty 7、pop_back 8、operator[ ] 9、resize 10、insert 迭代器失效问题 11、erase 12、带参初始化 13、迭代器初始化 14、析构函数 完整版代码 一、…

Python 调用 Halcon 模板匹配实现目标定位

一、Halcon 当谈及计算机视觉领域中强大的工具和框架时&#xff0c;Halcon&#xff08;由德国MVTec 公司开发&#xff09;无疑是一个备受关注的系统。Halcon被广泛用于工业视觉和机器视觉应用中&#xff0c;其强大的功能和灵活性使其成为许多开发人员和研究人员的首选选择。 …