♻️ 资源

大小: 1.58MB

➡️ 资源下载:https://download.csdn.net/download/s1t16/87430285

学生信息管理系统设计

功能描述

学生信息管理设计:

学生信息包括:学生学号,姓名,电话号码,生日,电子邮箱,身份证号,籍贯,性别,班级代号,专业代号等,试设计一学生信息管理系统,使之能提供以下功能:

系统以菜单方式工作

学生信息录入功能(学生信息用文件保存)---输入

学生信息浏览功能---输出

查询、排序功能---算法

按学号查询

按姓名查询

学生信息的删除与修改

总体设计

程序算法分析:

1:本次课设中主要用到结构体数组以及结构体数组 ,结构数组就是具有相同结构类型的变量集合。

假如要定义一个班级 40 个同学的姓名、性别、年龄和住址,可以定义成一个结构数组。如下所示:

struct{
charname[8];
charsex[2];
intage;
charadd[40];
}student[40];

  也可定义为:

structstring{
charname[8];
charsex[2];
intage;
charadd[40];
};
structstringstudent[40];

需要指出的是结构数组成员的访问是以数组元素为结构变量的,其形式为:

结构数组元素.成员名

例如:

student[0].name
student[30].age

实际上结构数组相当于一个二维构造,第一维是结构数组元素,每个元素是

一个结构变量,第二维是结构成员。

模块设计

本次课设模块主要分为,预编译,main 函数,输入/出函数,查找函数,修改函数,删除函数,保存文件函数,读取文件,以及系统时间加密函数,延时函数。

⑴ 预编译主要是头文件的调取,宏定义,定义结构体,函数以及全局变量 count 的声明

代码实现:

# include<stdio.h>        //标准的输入输出函数文件头部说明
# include<math.h>              // 数学函数头部说明
# include<string>
# include<stdlib.h>    //通过该函数头部里的函数,改变控制台的背景和颜色
# include<windows.h>    //头文件声明,下文用到了改变控制台的宽度和高度
# include<time.h>    //用以获取系统时间 
# define N 100            //宏定义说明
typedef struct student
{
    char name[15]; //姓名
    char  num[15];//学号
    char phone[15];  //电话号码;
    char birthday[10]; //生日
    char e_mail[20];  //电子邮箱,
    char id_number[20]; //身份证号,
    char native [20];  //籍贯
    char sex[8];  //性别
    int grade;   //班级代号
    int special;   //专业代号
} Stu;
//********************函数声明**********************
void input (Stu stu[N]);   //输入函数
void output (Stu stu[N]);  //输出函数
void yanshi(char *p);  //延时函数
void lookfor(Stu stu[N]); //查找函数
void amend(Stu stu[N]); //修改函数
void delete_student(Stu stu[N]); //删除函数
void filewrite(Stu stu[N]) ;  //保存文件
void fileread(Stu stu[N])   ;//读取文件
int  time_protect(time_t times);  //利用系统时间加密
//**************************************************
int count=0;  //全局变量的声明

main 函数

main 函数作为本程序的核心程序,实现了本程序的菜单作用以及调用其他函数的以及改变控制台的属性的功能

流程图:

代码实现:

int main()
{
    int choice,sum=0,flag=0;
    time_t now; //声明time_t类型变量
    Stu stu[N];
    system("mode con:cols=400 lines=30000");        //调节控制台的宽度和高度
    system("color 0b");      //调节控制台的背景和字体颜色
    flag=time_protect(now);
    if(flag==0)//判断密码是否正确
    {
        printf("密码错误,请关闭程序重新输入" );
        return ;
    }
    system("cls");////清屏语句
    fflush(stdin); ////清除输入缓冲区
point1:
    sum=0;
    yanshi("\t\t\t\t\t\t\t\t\3\3\3\3\3\3\3\3\3\3\3\3\3欢迎你使用学生信息管理系统\3\3\3\3\3\3\3\3\3\3\n");
    do {
        time(&now);//获取当前系统时间
        printf("\nNOW is:%s\n",ctime(&now));//输出当前系统时间
        printf("\t\t\t\t\t\t\t\t-------------------------------------------------\n");
        printf("\t\t\t\t\t\t\t\t+		学生信息管理系统			+\n");
        printf("\t\t\t\t\t\t\t\t-------------------------------------------------\n");
        printf("\t\t\t\t\t\t\t\t\t\t ***************\n");
        printf("\t\t\t\t\t\t\t\t\t\t 1、添加学生信息\n");
        printf("\t\t\t\t\t\t\t\t\t\t 2、浏览学生信息\n");
        printf("\t\t\t\t\t\t\t\t\t\t 3、查询学生信息\n");
        printf("\t\t\t\t\t\t\t\t\t\t 4、修改学生信息\n");
        printf("\t\t\t\t\t\t\t\t\t\t 5、删除学生信息\n");
        printf("\t\t\t\t\t\t\t\t\t\t 6、读取文件学生\n");					//从文件读取
        printf("\t\t\t\t\t\t\t\t\t\t 7、保存到文件\n");					 //保存到文件
        printf("\t\t\t\t\t\t\t\t\t\t 8、退出系统\n");
        printf("\t\t\t\t\t\t\t\t\t\t ***************\n");
        printf("请输入你的选择\n");
        scanf("%d",&choice);
        fflush(stdin);       //清除输入缓冲区
        if (choice>9||choice<=0)
        {
            sum++;
            if (sum>=5)
            {
                printf("输入错误次数过多,程序将重新开始\n");
                system("pause");        //程序暂停
                system("cls");   //清屏语句
                goto point1;
            }
        }
        switch (choice)       //根据选择,调用不同的函数来完成不同的任务
        {
        case 1:
            input(stu);
            break;
        case 2:
            output(stu);
            break;
        case 3:
            lookfor(stu);
            break;
        case 4:
            amend(stu);
            break;
        case 5:
            delete_student(stu);
            break;
        case 6:
            fileread(stu);
            break;
        case 7:
            filewrite(stu);
            break;
        case 8:
            printf("感谢你使用学生信息管理系统,请关掉程序!!!\n");
            system("pause");
            break;
        default:
            printf("无效的选择!!!请重新输入!!!\n");
            break;
        }
    } while (choice!=9);
    printf("the program is over!!!\n");
    return 0;
}
  • 输入/出函数
  • 输入函数
  • 输入函数就是利用简单的输入函数 scanf 来进行输入。用全局变量 count 来记录输入的次数,好方便输出以及后期的操作

流程图:

代码实现:

void input(Stu stu[N])//自定义输入函数
{
    int len,size;
    system("cls");
    printf("请添加要输入学生的信息\n");
    do {
        printf("请输入由10位数字组成的学生学号\n");   //do-while循环应用,提示输入位数为一确定数
        scanf("%s",&stu[count].num);
        len=strlen(stu[count].num);
    } while(len!=10);
    printf("请输入同学的姓名\n");
    scanf("%s",stu[count].name);
    do {
        printf("请输入由18位数字组成的学生身份证号\n");   //同上
        scanf("%s",&stu[count].id_number);
        size=strlen(stu[count].id_number);
    } while(size!=18);
    printf("请输入学生的籍贯\n");
    scanf("%s",&stu[count].native);
    printf("请输入学生的生日\n");
    scanf("%s",&stu[count].birthday);
    printf("请输入学生的手机号码\n");
    scanf("%s",&stu[count].phone);
    printf("请输入所需要的专业代号:\n");
    scanf("%d",&stu[count].special);
    printf("请输入对应的学生班级代号: \n");
    scanf("%d",&stu[count].grade);
    printf("请输入性别(man 或woman)\n");
    scanf("%s",&stu[count].sex);
    printf("请输入电子邮箱\n");
    scanf("%s",&stu[count].e_mail);
    count++;
    if(count>=N)
        return ;
}

输出函数

输出函数就是利用 for 循环来控制结构体变量输出

流程图:

代码实现:

void output(Stu stu[N])//自定义输出函数
{
    int j;
    system("cls");
    if (count==0)
    {
        printf("当前已存学生信息为0个\n");
        return;
    }
    for (j=0; j<count; j++) //for循环控制输出
    {
        printf("该学生的姓名为:%s\n",&stu[j].name);
        printf("学号为:%s\n",&stu[j].num);
        printf("电话为:%s\n",&stu[j].phone);
        printf("生日为:%s\n",&stu[j].birthday);
        printf("e_mail:%s\n",&stu[j].e_mail);
        printf("身份证号:为%s\n",&stu[j].id_number);
        printf("籍贯为:%s\n",&stu[j].native);
        printf("性别为:%s\n",&stu[j].sex);
        printf("班级代号为:%d\n",stu[j].grade);
        printf("专业代号:%d\n",stu[j].special);
    }
}

查找函数

通过变量 flag 来控制是根据学号还是姓名来作为查找,然后利用 for 循环来一个一个查找,直到找出或阅览完全部。如果找到,输出其对应的数据,没有找到,则输出“很抱歉,没有你所需要的信息”

代码实现:

void lookfor(Stu stu[N])//自定义查找函数
{
    printf("请选择查找方式:1:按学号 2:按姓名");
    int j,flag=0;//通过flag来控制是按学号查还是姓名查
    scanf("%d",&flag);
    char look[25];
    system("cls");
    if (count==0)
    {
        printf("当前已存学生信息为0个,无法查询!!!\n");
        return;
    }
    else
    {
        if(flag==1)
        {
            printf("请输入你想要查看的同学学号\n");
        }
        if(flag==2)
        {
            printf("请输入你想要查看的同学姓名\n");
        }
        if(flag!=1 && flag!=2)
        {
            printf("输入错误,请重新输入");
            return ;
        }
        scanf("%s",look);
        fflush(stdin);
        for (j=0; j<count; j++)
        {
            if (strcmp(stu[j].num,look)==0 || strcmp(stu[j].name,look)==0)       //通过字符函数对已存入的学生信息进行比较,找出要查看的学生
            {
                printf("该学生的姓名为:\t学号为\t 电话为\t 生日为\t e_mail为\t身份证号为\t 籍贯为\t 性别为\t 班级和年级代号为\n");
                printf("%s\n",&stu[j].name);
                printf("%s\n",&stu[j].num);
                printf("%s\n",&stu[j].phone);
                printf("%s\n",&stu[j].birthday);
                printf("%s\n",&stu[j].e_mail);
                printf("%s\n",&stu[j].id_number);
                printf("%s\n",&stu[j].native);
                printf("%s\n",&stu[j].sex);
                printf("%d\n",stu[j].grade);
                printf("%d\n",stu[j].special);
            }
        }
    }

修改函数

通过学号作为条件,利用 for 循环找到与之对应的结构体数组,然后通过变量 choice 来选择要改变的变量

代码实现:

void amend (Stu stu[N])  //自定义修改函数
{
    int j,flag=0,choice;
    char alter[25];
    system("cls");
    if (count==0)
    {
        printf("当前已存学生信息为0个,无法修改!!!\n");
        return;
    }
    else
    {
        printf("请输入你想要修改的同学学号\n");
        scanf("%s",alter);
        fflush(stdin);
        for (j=0; j<count; j++)
            if (strcmp(stu[j].num,alter)==0)        //同上
            {
                printf("你确定要修改学生的信息吗???如果不确定的话,请关掉本程序吧!!!\n");
                printf("选择修改的数据:\n");
                printf(": 1、姓名 2、学号 3、电话号码 4、生日 5、电子邮箱\n");
                printf("6,身份证号 7,籍贯 8,性别 9,班级代号 10,专业代号\n") ;
                scanf("%d",&choice);
                printf("请输入你想要修改后的数据\n");
                switch(choice)
                {
                case 1:
                    scanf("%s",&stu[j].name);
                    break;
                case 2:
                    scanf("%s",&stu[j].num);
                    break;        //switch控制语句
                case 3:
                    scanf("%s",&stu[j].phone);
                    break;
                case 4:
                    scanf("%s",&stu[j].birthday);
                    break;
                case 5:
                    scanf("%s",&stu[j].e_mail);
                    break;
                case 6:
                    scanf("%s",&stu[j].id_number);
                    break;
                case 7:
                    scanf("%s",&stu[j].native);
                    break;
                case 8:
                    scanf("%s",&stu[j].sex);
                    break;
                case 9:
                    scanf("%d",&stu[j].grade);
                    break;
                case 10:
                    scanf("%d",&stu[j].special);
                    break;
                default:
                    printf("无效的选择!!!请重新输入!!!\n");
                    break;
                }
            }
    }
}

删除函数

通过学号作为条件,利用 for 循环找到与之对应的结构体数组,然后通过把其后所有的结构体数组向前移动一位来实现删除

代码实现:

void delete_student(Stu stu[N])
{
    int j,index=0,i=count;
    char omit[15];
    system("cls");
    if (count==0)
    {
        printf("当前已存学生信息为0个,无法删除!!!\n");
        return;
    }
    else
    {
        printf("请输入你所要删除的学号 \n");
        scanf("%s",omit);
        fflush(stdin);
        for (j=0; j<count; j++)
        {
            if (strcmp(stu[j].num,omit)==0)
            {
                for (j=index; j<count; j++)
                    stu[j]=stu[j+1];
                count--;
                if (count<i)
                    printf("删除成功\n");
            }
            index++;
        }
        if (i==count)
            printf("抱歉!!!没有你所需要删除的学生信息\n");
    }
}
  • ⑺ 文件操作函数
  • 文件读取函数
  • 此函数的主要功能是从磁盘读取已经保存了的数据并把数据输出到结构体数组,主要用到了 fread()函数

流程图:

代码实现:

void fileread(Stu stu[N])					//读取文件信息函数定义
{
    int j=0;
    char c;
    FILE *fp;
    system("cls");
    printf("请选择是否要存入已输入的学生信息:'y'还是'n'\n");
    scanf("%c",&c);
    fflush(stdin);
    while(c!='y'&&c!='n')
    {
        if (c!='y'&&c!='n')
            printf("输入错误,请重新输入\n");
        printf("以下操作将会覆盖已存储的数据,确定请输入'y'或'n'???\n");
        scanf("%c",&c);
        fflush(stdin);
    }
    if (c=='y')
    {
        if((fp=fopen("E:\\student.txt","rb"))==NULL)
        {
            printf("文件打开错误,程序无法进行\n");
            exit(0);
        }
        fread(&stu[j],sizeof(Stu),1,fp);
        count=0;
        count++;
        j++;
        while(fread(&stu[j],sizeof(Stu),1,fp))
        {
            j++;
            count++;
        }
        fclose(fp);
        printf("数据读取完毕!!!\n");
        system("pause");
    }
    else
        return;
}

文件保存函数

此函数的主要功能为将已经输入了的数据保存到磁盘文件中,主要运用了 fwrite()函数

流程图:

代码实现:

void filewrite(Stu stu[N])					//写入文件函数定义
{
    int j=0;
    char c;
    FILE *fp;
    printf("请选择是否要存入已输入的学生信息:'y'还是'n'?\n");
    scanf("%c",&c);
    fflush(stdin);
    while(c!='y'&&c!='n')
    {
        if (c!='y'&&c!='n')
            printf("输入错误,请重新输入\n");
        printf("以下操作将会覆盖已存储的数据,确定请输入'y'或'n'\n");
        scanf("%c",&c);
        fflush(stdin);
    }
    if (c=='y')
    {
        if((fp=fopen("E:\\student.txt","wb"))==NULL)
        {
            printf("文件打开错误,程序无法进行\n");
            exit(0);
        }
        for(j=0; j<count; j++)
        {
            fwrite(&stu[j],sizeof(Stu),1,fp);
        }
        fclose(fp);
        if(count==0)
            printf("没有文件,无法保存\n");
        else
            printf("数据存储完毕\n");
        system("pause");
    }
    else
        return;
}

延时函数

此函数的功能就是将字符串按一个个字符延时输出,函数功能是为了使系统界面不比较单调。

流程图:

代码实现:

void yanshi(char *p)              //延时函数的定义
{
    while (1)
    {
        if (*p!=0)
            printf("%c",*p++);
        else
            break;
        Sleep(100);               //延时控制间断语句
    }
}

系统时间加密函数

此函数通过电脑系统中的时间中的小时与分钟来进行加密。密码每过一分钟换一次,理论上会有 3600 个密码,每过 24 小时一重复。密码为当前时间从电脑系统获取的小时数乘以 100 加上分钟数乘以 10;

流程图:

代码实现:

int time_protect(time_t times)   //时间保护系统
{
    int number,flag=0;
    struct tm *tmpointer; //tm结构指针
    time(&times);
    tmpointer=localtime(&times);
    printf("\nNOW:%d-%d-%d\n",tmpointer->tm_mon+1,tmpointer->tm_mday,tmpointer->tm_year+1900);
    printf("%d:%d:%d\n",tmpointer->tm_hour,tmpointer->tm_min,tmpointer->tm_sec);
    printf("请输入密码:");
    scanf("%d",&number);
    if(number==(((tmpointer->tm_hour)*100)+((tmpointer->tm_min)*10)))
        flag=1;
    return flag;
}

附录:

# include<stdio.h>        //标准的输入输出函数文件头部说明
# include<math.h>              // 数学函数头部说明
# include<string.h>
# include<stdlib.h>    //通过该函数头部里的函数,改变控制台的背景和颜色
# include<windows.h>    //头文件声明,下文用到了改变控制台的宽度和高度
# include<time.h>    //用以获取系统时间 
# define N 100            //宏定义说明
typedef struct student
{
    char name[15]; //姓名
    char  num[15];//学号
    char phone[15];  //电话号码;
    char birthday[10]; //生日
    char e_mail[20];  //电子邮箱,
    char id_number[20]; //身份证号,
    char native [20];  //籍贯
    char sex[8];  //性别
    int grade;   //班级代号
    int special;   //专业代号
} Stu;
//********************函数声明**********************
void input (Stu stu[N]);   //输入函数
void output (Stu stu[N]);  //输出函数
void yanshi(char *p);  //延时函数
void lookfor(Stu stu[N]); //查找函数
void amend(Stu stu[N]); //修改函数
void delete_student(Stu stu[N]); //删除函数
void filewrite(Stu stu[N]) ;  //保存文件
void fileread(Stu stu[N])   ;//读取文件
int  time_protect(time_t times);  //利用系统时间加密
//**************************************************
int count=0;//全局变量声明
int main()
{
    int choice,sum=0,flag=0;
    time_t now; //声明time_t类型变量
    Stu stu[N];
    system("mode con:cols=400 lines=30000");        //调节控制台的宽度和高度
    system("color 0b");      //调节控制台的背景和字体颜色
    flag=time_protect(now);
    if(flag==0)//判断密码是否正确
    {
        printf("密码错误,请关闭程序重新输入" );
        return ;
    }
    system("cls");////清屏语句
    fflush(stdin); ////清除输入缓冲区
point1:
    sum=0;
    yanshi("\t\t\t\t\t\t\t\t\3\3\3\3\3\3\3\3\3\3\3\3\3欢迎你使用学生信息管理系统\3\3\3\3\3\3\3\3\3\3\n");
    do {
        time(&now);//获取当前系统时间
        printf("\nNOW is:%s\n",ctime(&now));//输出当前系统时间
        printf("\t\t\t\t\t\t\t\t-------------------------------------------------\n");
        printf("\t\t\t\t\t\t\t\t+		学生信息管理系统			+\n");
        printf("\t\t\t\t\t\t\t\t-------------------------------------------------\n");
        printf("\t\t\t\t\t\t\t\t\t\t ***************\n");
        printf("\t\t\t\t\t\t\t\t\t\t 1、添加学生信息\n");
        printf("\t\t\t\t\t\t\t\t\t\t 2、浏览学生信息\n");
        printf("\t\t\t\t\t\t\t\t\t\t 3、查询学生信息\n");
        printf("\t\t\t\t\t\t\t\t\t\t 4、修改学生信息\n");
        printf("\t\t\t\t\t\t\t\t\t\t 5、删除学生信息\n");
        printf("\t\t\t\t\t\t\t\t\t\t 6、读取文件学生\n");					//从文件读取
        printf("\t\t\t\t\t\t\t\t\t\t 7、保存到文件\n");					 //保存到文件
        printf("\t\t\t\t\t\t\t\t\t\t 8、退出系统\n");
        printf("\t\t\t\t\t\t\t\t\t\t ***************\n");
        printf("请输入你的选择\n");
        scanf("%d",&choice);
        fflush(stdin);       //清除输入缓冲区
        if (choice>9||choice<=0)
        {
            sum++;
            if (sum>=5)
            {
                printf("输入错误次数过多,程序将重新开始\n");
                system("pause");        //程序暂停
                system("cls");   //清屏语句
                goto point1;
            }
        }
        switch (choice)       //根据选择,调用不同的函数来完成不同的任务
        {
        case 1:
            input(stu);
            break;
        case 2:
            output(stu);
            break;
        case 3:
            lookfor(stu);
            break;
        case 4:
            amend(stu);
            break;
        case 5:
            delete_student(stu);
            break;
        case 6:
            fileread(stu);
            break;
        case 7:
            filewrite(stu);
            break;
        case 8:
            printf("感谢你使用学生信息管理系统,请关掉程序!!!\n");
            system("pause");
            break;
        default:
            printf("无效的选择!!!请重新输入!!!\n");
            break;
        }
    } while (choice!=9);
    printf("the program is over!!!\n");
    return 0;
}
void input(Stu stu[N])//自定义输入函数
{
    int len,size;
    system("cls");
    printf("请添加要输入学生的信息\n");
    do {
        printf("请输入由10位数字组成的学生学号\n");   //do-while循环应用,提示输入位数为一确定数
        scanf("%s",&stu[count].num);
        len=strlen(stu[count].num);
    } while(len!=10);
    printf("请输入同学的姓名\n");
    scanf("%s",stu[count].name);
    do {
        printf("请输入由18位数字组成的学生身份证号\n");   //同上
        scanf("%s",&stu[count].id_number);
        size=strlen(stu[count].id_number);
    } while(size!=18);
    printf("请输入学生的籍贯\n");
    scanf("%s",&stu[count].native);
    printf("请输入学生的生日\n");
    scanf("%s",&stu[count].birthday);
    printf("请输入学生的手机号码\n");
    scanf("%s",&stu[count].phone);
    printf("请输入所需要的专业代号(数字):\n");
    scanf("%d",&stu[count].special);
    printf("请输入对应的学生班级代号(数字): \n");
    scanf("%d",&stu[count].grade);
    printf("请输入性别(man 或woman)\n");
    scanf("%s",&stu[count].sex);
    printf("请输入电子邮箱\n");
    scanf("%s",&stu[count].e_mail);
    count++;
    if(count>=N)
        return ;
}
void output(Stu stu[N])//自定义输出函数
{
    int j;
    system("cls");
    if (count==0)
    {
        printf("当前已存学生信息为0个\n");
        return;
    }
    for (j=0; j<count; j++) //for循环控制输出
    {
        printf("该学生的姓名为:%s\n",&stu[j].name);
        printf("学号为:%s\n",&stu[j].num);
        printf("电话为:%s\n",&stu[j].phone);
        printf("生日为:%s\n",&stu[j].birthday);
        printf("e_mail:%s\n",&stu[j].e_mail);
        printf("身份证号为:%s\n",&stu[j].id_number);
        printf("籍贯为:%s\n",&stu[j].native);
        printf("性别为:%s\n",&stu[j].sex);
        printf("班级代号为:%d\n",stu[j].grade);
        printf("专业代号:%d\n",stu[j].special);
    }
}
void lookfor(Stu stu[N])//自定义查找函数
{
    printf("请选择查找方式:1:按学号 2:身份证号\n");
    int j,flag=0;//通过flag来控制是按学号查还是姓名查
    scanf("%d",&flag);
    char look[25];
    system("cls");
    if (count==0)
    {
        printf("当前已存学生信息为0个,无法查询!!!\n");
        return;
    }
    else
    {
        if(flag==1)
        {
            printf("请输入你想要查看的同学学号\n");
        }
        if(flag==2)
        {
            printf("请输入你想要查看的身份证号\n");
        }
        if(flag!=1 && flag!=2)
        {
            printf("输入错误,请重新输入");
            return ;
        }
        scanf("%s",look);
        fflush(stdin);
        for (j=0; j<count; j++)
        {
            if (strcmp(stu[j].num,look)==0 || strcmp(stu[j].id_number,look)==0)       //通过字符函数对已存入的学生信息进行比较,找出要查看的学生
            {
                printf("姓名为:%s\n",&stu[j].name);
                printf("学号为:%s\n",&stu[j].num);
                printf("电话为:%s\n",&stu[j].phone);
                printf("生日为:%s\n",&stu[j].birthday);
                printf("e_mail为:%s\n",&stu[j].e_mail);
                printf("身份证号为:%s\n",&stu[j].id_number);
                printf("籍贯为:%s\n",&stu[j].native);
                printf("性别:%s\n",&stu[j].sex);
                printf("班级代号为:%d\n",stu[j].grade);
                printf("专业代号为:%d\n",stu[j].special);
            }
        }
    }
}
void amend (Stu stu[N])  //自定义修改函数
{
    int j,flag=0,choice;
    char alter[25];
    system("cls");
    if (count==0)
    {
        printf("当前已存学生信息为0个,无法修改!!!\n");
        return;
    }
    else
    {
        printf("请输入你想要修改的同学学号\n");
        scanf("%s",alter);
        fflush(stdin);
        for (j=0; j<count; j++)
            if (strcmp(stu[j].num,alter)==0)        //同上
            {
                printf("你确定要修改学生的信息吗???如果不确定的话,请关掉本程序吧!!!\n");
                printf("选择修改的数据:\n");
                printf(": 1、姓名 2、学号 3、电话号码 4、生日 5、电子邮箱\n");
                printf("6,身份证号 7,籍贯 8,性别 9,班级代号 10,专业代号\n") ;
                scanf("%d",&choice);
                printf("请输入你想要修改后的数据\n");
                switch(choice)
                {
                case 1:
                    scanf("%s",&stu[j].name);
                    break;
                case 2:
                    scanf("%s",&stu[j].num);
                    break;        //switch控制语句
                case 3:
                    scanf("%s",&stu[j].phone);
                    break;
                case 4:
                    scanf("%s",&stu[j].birthday);
                    break;
                case 5:
                    scanf("%s",&stu[j].e_mail);
                    break;
                case 6:
                    scanf("%s",&stu[j].id_number);
                    break;
                case 7:
                    scanf("%s",&stu[j].native);
                    break;
                case 8:
                    scanf("%s",&stu[j].sex);
                    break;
                case 9:
                    scanf("%d",&stu[j].grade);
                    break;
                case 10:
                    scanf("%d",&stu[j].special);
                    break;
                default:
                    printf("无效的选择!!!请重新输入!!!\n");
                    break;
                }
            }
    }
}
void delete_student(Stu stu[N])
{
    int j,index=0,i=count;
    char omit[15];
    system("cls");
    if (count==0)
    {
        printf("当前已存学生信息为0个,无法删除!!!\n");
        return;
    }
    else
    {
        printf("请输入你所要删除的学号 \n");
        scanf("%s",omit);
        fflush(stdin);
        for (j=0; j<count; j++)
        {
            if (strcmp(stu[j].num,omit)==0)
            {
                for (j=index; j<count; j++)
                    stu[j]=stu[j+1];
                count--;
                if (count<i)
                    printf("删除成功\n");
            }
            index++;
        }
        if (i==count)
            printf("抱歉!!!没有你所需要删除的学生信息\n");
    }
}
void filewrite(Stu stu[N])					//写入文件函数定义
{
    int j=0;
    char c;
    FILE *fp;
    printf("请选择是否要存入已输入的学生信息:'y'还是'n'?\n");
    scanf("%c",&c);
    fflush(stdin);
    while(c!='y'&&c!='n')
    {
        if (c!='y'&&c!='n')
            printf("输入错误,请重新输入\n");
        printf("以下操作将会覆盖已存储的数据,确定请输入'y'或'n'\n");
        scanf("%c",&c);
        fflush(stdin);
    }
    if (c=='y')
    {
        if((fp=fopen("E:\\student.txt","wb"))==NULL)
        {
            printf("文件打开错误,程序无法进行\n");
            exit(0);
        }
        for(j=0; j<count; j++)
        {
            fwrite(&stu[j],sizeof(Stu),1,fp);
        }
        fclose(fp);
        if(count==0)
            printf("没有文件,无法保存\n");
        else
            printf("数据存储完毕\n");
        system("pause");
    }
    else
        return;
}
void fileread(Stu stu[N])					//读取文件信息函数定义
{
    int j=0;
    char c;
    FILE *fp;
    system("cls");
    printf("请选择是否要存入已输入的学生信息:'y'还是'n'\n");
    scanf("%c",&c);
    fflush(stdin);
    while(c!='y'&&c!='n')
    {
        if (c!='y'&&c!='n')
            printf("输入错误,请重新输入\n");
        printf("以下操作将会覆盖已存储的数据,确定请输入'y'或'n'???\n");
        scanf("%c",&c);
        fflush(stdin);
    }
    if (c=='y')
    {
        if((fp=fopen("E:\\student.txt","rb"))==NULL)
        {
            printf("文件打开错误,程序无法进行\n");
            exit(0);
        }
        fread(&stu[j],sizeof(Stu),1,fp);
        count=0;
        count++;
        j++;
        while(fread(&stu[j],sizeof(Stu),1,fp))
        {
            j++;
            count++;
        }
        fclose(fp);
        printf("数据读取完毕!!!\n");
        system("pause");
    }
    else
        return;
}
void yanshi(char *p)              //延时函数的定义
{
    while (1)
    {
        if (*p!=0)
            printf("%c",*p++);
        else
            break;
        Sleep(100);               //延时控制间断语句
    }
}
int time_protect(time_t times)   //时间保护系统
{
    int number,flag=0;
    struct tm *tmpointer; //tm结构指针
    time(&times);
    tmpointer=localtime(&times);
    printf("\nNOW:%d-%d-%d\n",tmpointer->tm_mon+1,tmpointer->tm_mday,tmpointer->tm_year+1900);
    printf("%d:%d:%d\n",tmpointer->tm_hour,tmpointer->tm_min,tmpointer->tm_sec);
    printf("请输入密码:");
    scanf("%d",&number);
    if(number==(((tmpointer->tm_hour)*100)+((tmpointer->tm_min)*10)))
        flag=1;
    return flag;
}

测试结果与分析

输入函数运行结果:

输出函数运行结果

查询函数运行结果:

修改函数运行结果:

删除函数运行结果:

课程设计总结:

  • ① 对 c 语言的编程实践有所认识。
  • ② 在遇到程序调试不通过时,会通过缩小范围的分析来锁定问题的所在。
  • ③ 在程序中设置合理的全局变量,可以减少程序编写的难度。
  • ④ 运用函数可以减少编写时的代码量,也使程序挑理清晰。
  • ⑤ 通过这次实验,熟悉了从自然语言转换为伪代码以及流程图的过程。

参考文献:

谭浩强.C 程序设计.北京:清华大学出版社,2005

《The C Programming Language》,by Brian

Kernighan and Dennis M Ritchie.,Pubbilished by Prentice-Hall in 1988
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐