C语言学生信息管理系统

(重邮2020复试第二题,做了个大概)

用C语言通过对文件的操作来实现该系统

说明:数据写入文件后,肉眼看到的是乱码,但读出来正常,这个乱码我没改,写烦了。

涉及到的文件相关函数:

  • fopen(文件名,使用文件的方式);           //文件名写清楚路径
  •  

  • fread(buffer,size,count,fp) ;           
  • fwrite(buffer,size,count,fp) ; 

解决的迷惑 :     

  • scanf() 用完后缓冲区会遗留‘\n’
  • c=getchar()  会遗留'\n'
  • gets()   不会遗留‘\n'
  • 所以在会遗留‘\n’的操作后面输入字符或者字符串时要加一个getchar()来取走多余的‘\n’
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
using namespace std;
const char PASS[]="1";          //密码
const int N=1000;
typedef struct student          //学生信息
{
    char stu_num[15];           //学号
    char name[15];              //姓名
    char stu_id[20];            //身份证号
    char institute[50];         //学院
    char stu_type;              //学生类型
    char major[50];             //专业
    char route[100];            //返校路线
    char TrafficTools[100];     //交通工具
    char isCloseContact;        //近14天是否有密切接触确诊人员
    char temperature[10];       //入校时温度
    char isFever;               //是否发烧
    char isCough;               //是否咳嗽
    char time[20];              //进校时间

}Student;
bool cmp(Student stu1,Student stu2)
{
    if(stu1.stu_type<stu2.stu_type)
        return stu1.stu_type<stu2.stu_type;         //按照学生类型由小到大
    else if(strcmp(stu1.major,stu2.major))
        return strcmp(stu1.major,stu2.major)<0;               //按照专业由小到大
    return strcmp(stu1.stu_num,stu2.stu_num)<0;               //按照学号由小到大
}

int main()
{
    void Instruction();                //导航界面
    void WriteStuInfo();               //录入成绩
    void Search();                     //查找学生信息
    void Print(Student stu);           //输出学生信息
    void Alter();                      //修改学生信息
    void print_Sort();                 //排序,并将排好序的学生信息写入到新的文件中

    char password[20];
    printf("\n\n");
    printf("====================欢迎使用学生返校信息管理系统====================\n\n");
    printf("请输入登录密码:");

    while(strcmp(gets(password),PASS)!=0){
        printf("密码不正确!\n请重新输入:");
    }
    char c='y';
    Instruction();
    while(c=='y'){
        printf("请输入您需要的操作(按5请求帮助): \n");
        int flag=0;
        scanf("%d",&flag);
        getchar();
        if(flag==1){                    //录入
            WriteStuInfo();
        }
        else if(flag==2){               //查找
            Search();
        }
        else if(flag==3){               //修改
            Alter();
        }
        else if(flag==4){               //排序
            print_Sort();
        }
        else if(flag==5){               //导航
            Instruction();
        }
        else if(flag==6){               //退出系统
            return 0;
        }
        else {
            printf("输入有误!请重新输入!\n ");
            continue;
        }
        printf("是否继续使用该系统(y/n):");
        scanf("%c",&c);

    }

    return 0;
}
void WriteStuInfo()                 //录入学生信息
{
    void Print(Student stu);
    char c='y';
    //freopen("C:\\Users\\miaoyy\\Desktop\\in.txt","r",stdin);
    while(c=='y'){
        Student stu;
        printf("请按照下列提示完成信息录入:\n\n");

        printf("请输入学号:\n");
        gets(stu.stu_num);
        printf("\n\n");

        printf("请输入姓名:\n");
        //getchar();
        gets(stu.name);
        printf("\n\n");

        printf("请输入身份证号:\n");
        //getchar();
        gets(stu.stu_id);
        printf("\n\n");

        printf("请输入学生类型(本科生:1/硕士生:2/博士生:3):\n");
        //getchar();
        stu.stu_type=getchar();
        printf("\n\n");

        printf("请输入所在学院:\n");
        getchar();
        gets(stu.institute);
        printf("\n\n");

        printf("请输入所在专业:\n");
        //getchar();
        gets(stu.major);
        printf("\n\n");

        printf("请输入返校所经城市:\n");
        //getchar();
        gets(stu.route);
        printf("\n\n");

        printf("请输入交通工具:\n");
        //getchar();
        gets(stu.TrafficTools);
        printf("\n\n");

        printf("过去14天是否密切接触确诊人员(是:1/否:0):\n");
        //getchar();
        stu.isCloseContact=getchar();
        printf("\n\n");

        printf("请输入入校时的温度:\n");
        getchar();
        gets(stu.temperature);
        printf("\n\n");

        printf("是否发烧(是:1/否:0):\n");
        //getchar();
        stu.isFever=getchar();
        printf("\n\n");

        printf("是否咳嗽(是:1/否:0):\n");
        getchar();
        stu.isCough=getchar();
        printf("\n\n");

        printf("请输入入校时间:\n");
        getchar();
        gets(stu.time);
        printf("\n\n");

        FILE *fp;
        char file[50]="C:\\Users\\miaoyy\\Desktop\\";
        strcat(file,stu.institute);
        strcat(file,".txt");

        fp=fopen(file,"a");            //用“a”的方式打开文件,向文件末尾继续添加新的数据(不删除原有数据)
        if(fp==NULL)
        {
            printf("文件无法打开!");
            exit(0);
        }
        if(fwrite(&stu,sizeof(Student),1,fp)!=1)
        {
            printf("无法录入!");
        }
        fclose(fp);

        printf("是否继续录入(y/n):\n");
        scanf("%c",&c);
        getchar();
    }

    return ;
}
void Search()                       //查找学生
{
    void Print(Student stu);
    char c='y';
    while(c=='y'){
        char stu_info[50],ins[50],file[50]="C:\\Users\\miaoyy\\Desktop\\";
        printf("请输入学生所在学院:\n");
        gets(ins);
        strcat(file,ins);
        strcat(file,".txt");

        FILE *fp;
        fp=fopen(file,"r");                                      //打开该学院的文件

        printf("请输入查找方式(学号:1/姓名:2/身份证号:3):\n");
        int flag;
        scanf("%d",&flag);
        getchar();

        printf("请输入学生信息:\n");
        gets(stu_info);

        Student stu;
        int isSearch=0;                                         //是否查找到该学生
        while(fread(&stu,sizeof(Student),1,fp)==1)
        {
            if(flag==1)                                         //按学号查找
            {
                if(!strcmp(stu.stu_num,stu_info))
                {
                    Print(stu);
                    isSearch=1;
                    break;
                }
            }
            if(flag==2)                                         //按姓名查找
            {
                if(!strcmp(stu.name,stu_info))
                {
                    Print(stu);
                    isSearch=1;
                }
            }
            if(flag==3)
            {
                if(!strcmp(stu.stu_id,stu_info))                //按身份证号查找
                {
                    Print(stu);
                    isSearch=1;
                    break;
                }
            }

        }
        if(!isSearch)
            printf("查无此人\n");
        fclose(fp);

        printf("是否继续查找(y/n):\n");
        scanf("%c",&c);
        getchar();

    }

    return ;

}
void Print(Student stu)             //输出学生信息
{
    printf("\n*****************学生信息*****************\n\n");
    printf("学号: %s\n姓名: %s\n身份证号: %s\n学生类型: %c\n",stu.stu_num,stu.name,stu.stu_id,stu.stu_type);
    printf("学院: %s\n专业: %s\n返校路线: %s\n交通工具: %s\n",stu.institute,stu.major,stu.route,stu.TrafficTools);
    printf("过去14天是否密切接触确诊人员(是:1/否:0): %c\n返校温度: %s\n",stu.isCloseContact,stu.temperature);
    printf("是否发烧(是:1/否:0): %c\n是否咳嗽(是:1/否:0): %c\n返校时间: %s\n",stu.isFever,stu.isCough,stu.time);
    return ;
}
void Alter()                        //修改学生信息
{
    void Print(Student stu);
    char c='y';
    while(c=='y'){
        char stu_info[50],ins[50],file[50]="C:\\Users\\miaoyy\\Desktop\\";
        printf("请输入学生所在学院:\n");
        gets(ins);
        strcat(file,ins);
        strcat(file,".txt");

        FILE *fp;
        fp=fopen(file,"r");                                      //打开该学院的文件

        printf("请输入学生身份证号:\n");
        gets(stu_info);

        Student all_stu[N],goal_stu,stu;
        int isSearch=0;                                          //是否查找到该学生
        int pos=0,num=0;
        for(pos=0;fread(&stu,sizeof(Student),1,fp)==1;pos++){
            if(!strcmp(stu.stu_id,stu_info)){
                goal_stu=stu;
                isSearch=1;
            }
            else {
                all_stu[num++]=stu;
            }
        }


        if(isSearch){
            fclose(fp);
            fp=fopen(file,"w");
            for(int i=0; i<num; i++){
                fwrite(&all_stu[i],sizeof(Student),1,fp);
            }
            fclose(fp);

            printf("请按照下列提示完成该学生信息修改:\n\n");

            printf("请输入学号:");
            gets(stu.stu_num);
            printf("\n");

            printf("请输入姓名:");
            //getchar();
            gets(stu.name);
            printf("\n");

            printf("请输入身份证号:");
            //getchar();
            gets(stu.stu_id);
            printf("\n");

            printf("请输入学生类型(本科生:1/硕士生:2/博士生:3):");
            //getchar();
            stu.stu_type=getchar();
            printf("\n");

            printf("请输入所在学院:");
            getchar();
            gets(stu.institute);

            printf("\n");

            printf("请输入所在专业:");
            //getchar();
            gets(stu.major);
            printf("\n");

            char newfile[]="C:\\Users\\miaoyy\\Desktop\\";
            strcat(newfile,stu.institute);
            strcat(newfile,".txt");
            fp=fopen(newfile,"a");
            fwrite(&stu,sizeof(Student),1,fp);
        }
        else
            printf("查无此人\n");

//        fclose(fp);                                       //输出一下原来文件内目前的信息
//        puts(file);
//        fp=fopen(file,"r");
//        while(fread(&stu,sizeof(Student),1,fp)==1){
//            Print(stu);
//        }

        printf("是否继续修改(y/n):\n");
        scanf("%c",&c);
        getchar();

    }

    return ;
}
void print_Sort()                   //排序
{
    char ins[20],file[50]="C:\\Users\\miaoyy\\Desktop\\";
    printf("请输入学院名称:");
    gets(ins);
    strcat(file,ins);
    strcat(file,".txt");

    FILE *fp;
    fp=fopen(file,"r");                                         //打开文件

    Student all_stu[N],stu;
    int num=0;
    while(fread(&all_stu[num++],sizeof(Student),1,fp)==1){
        //Print(all_stu[num-1]);
    }
    fclose(fp);

//    for(int i=0;i<num-1;i++){                                  //按照学号从小到大排序(选择排序)
//        int Min=i;
//        for(int j=i+1;j<num;j++){
//            if(strcmp(all_stu[Min].stu_num,all_stu[j].stu_num)>0){
//                Min=j;
//            }
//        }
//        if(Min!=i){
//            Student temp=all_stu[i];
//            all_stu[i]=all_stu[Min];
//            all_stu[Min]=temp;
//        }
//    }

    sort(all_stu,all_stu+num,cmp);                             //结构体自定义排序,也可以用上面的选择排序(上面的选择排序只写了一个关键字排序)

    char newfile[50]="C:\\Users\\miaoyy\\Desktop\\sort_";      //将排好序的学生信息放进新的文件中(文件名已改变!)
    strcat(newfile,ins);
    strcat(newfile,".txt");

    fp=fopen(newfile,"w");                                     //用“w”的方式打开文件
    for(int i=0;i<num;i++){
        fwrite(&all_stu[i],sizeof(Student),1,fp);
    }
    fclose(fp);

    fp=fopen(newfile,"r");                                      //输出排序好的文件内容
    while(fread(&stu,sizeof(Student),1,fp)==1){
        Print(stu);
    }
    fclose(fp);
    return ;
}
void Instruction()                  //帮助
{
    printf("====================学生返校信息管理系统====================\n");
    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");
    printf("=                                                          =\n");
    printf("============================================================\n");
    return ;
}



 

概述: 1)在已完成的版本中,通过链表的操作已可实现学生信息系统的建立,添加,删除,查找,输出。(学生信息的排序未实现) 2)在Windows环境下,通过调用vbs文件实现对指定文本的朗读。 已知问题: 1)菜单中有显示学生信息系统的载入,但是实际运行过程中,载入后不能对文件进行操作。 2)通过"Add"添加的学生信息在程序运行过程中可以进行操作,但是无法保存至文件。 3)在xp环境下,会提示“没有找到MSVCR100D.dll”以及缺少“windows.h”。具体解决方案分析中。 4)由于vbs文件的调用,Linux环境下应该会报错。 5)杀毒软件会对vbs文件拦截。 注意: 1)vbs文件应该与源文件或exe执行程序在同一目录下。 2)不要中途退出程序,否则记录不能保存。应该通过菜单“0”-“0”选择退出 Logs: 1)有一个问题是偶然发现的。我在写这个程序的时候使用的环境是Microsoft Visual Studio 2010 SP1。按照默认的设置编译了程序之后,将DEMO发给一个电脑上没有装VS环境的XP用户,但是程序运行提示缺失“MSVCR100D.dll”。后来经过网上的查证,发现是VS的编译设置的问题。 解决方案如下: 在VS的界面键盘快捷键Alt+F7,可以打开项目的属性窗口。左侧选择“配置属性”->“C/C++”->“代码生成”,右侧窗口中“运行库”一项默认为“多线程调试 DLL (/MDd)”,将该选项修改为“多线程 (/MT)”或“多线程调试 (/MTd)”,重新编译即可。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值