大一C语言课程设计——班级档案管理系统

时间:2024-02-24 09:36:02

记录我在大一第二学期期末做的C语言课程毕业设计

1. 班级档案管理系统运用到的主要结构体

typedef struct birthday //出生日期
{
int year;
int month;
int day;
}Birthday;
struct file //学生档案信息
{
char id[20];//学号
char name[20];//姓名
char sex[2];//性别
int age;//年龄
Birthday birthday;//出生日期
char desc[20];//备注
}File[N];

2.班级档案管理系统任务目标

对一个有N个学生的班级,通过该系统实现对该班级学生的基本信息进行录入、显示、修改、删除、保存等操作的管理。
功能要求:
(1)本系统采用一个包含N个数据的结构体数组,每个数据的结构应当包括:学号、姓名、性别、年龄、备注。
(2)本系统显示这样的菜单:
请选择系统功能项:
a 学生基本信息录入
b 学生基本信息显示
c 学生基本信息保存
d 学生基本信息删除
e 学生基本信息修改(要求先输入密码)
f 学生基本信息查询
(1)按学号查询
(2)按姓名查询
(3)按性别查询
(4)按年龄查询
g. 退出系统
(3)执行一个具体的功能之后,程序将重新显示菜单。
(4)将学生基本信息保存到文件中。
(5)进入系统之前要先输入密码。

3.程序框图或流程图,程序清单与调用关系

(1)系统结构程序框图

 

 

 

 

 

 

 

 

 

2)程序清单

各函数的主要功能:

函数

功能

void load()

系统登陆验证

save_password(charstr[])

保存密码

void menu()

菜单功能

void input(int n)

录入学生信息

void output()

显示学生信息

void save(int n)

保存学生信息

void dele()

删除学生信息

void change()

修改学生信息

void invest()

查询学生信息

void change_password()

修改密码

void over()

退出系统

(3)函数调用关系图

 

 

 

 

 

4.c程序源码

#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#define N 200
typedef struct birthday
{
    int year;
    int month;
    int day;
}Birthday;
struct file
{
    char id[20];//学号
    char name[20];//姓名
    char sex[2];//性别
    int age;//年龄
    Birthday birthday;//出生日期
    char desc[20];//备注
}File[N];

void toxy(int x, int y)      //将光标移动到X,Y坐标处
{
COORD pos = { x , y };
HANDLE Out = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(Out, pos); 
}



void load();//系统登陆页面
void save_password(char str[]);//保存密码
void menu();//系统主菜单
void input(int n);//学生信息录入
void output();//学生信息显示
void save(int n);//学生信息保存
void dele();//学生信息删除
void change();//学生信息修改
void invest();//学生信息查询
void change_password();//修改密码
void over();//退出系统

void input(int n)//信息录入,录入学生的基本信息
{   
    int i;
    for(i=0;i<n;i++)
    {
        system("cls");//清屏
        toxy(15,6);
        printf("请输入学生学号:");
        scanf("%s",File[i].id);
        toxy(15,7);
        printf("请输入学生姓名:");
        scanf("%s",File[i].name);
        toxy(15,8);
        printf("请输入学生性别(男/女):");
        scanf("%s",File[i].sex);
        toxy(15,9);
        printf("请输入学生年龄:");
        scanf("%d",&File[i].age);
        toxy(15,10);
        printf("请输入学生的出生日期(年月日,以空格隔开):");
        scanf("%d%d%d",&File[i].birthday.year,&File[i].birthday.month,&File[i].birthday.day);
        toxy(15,11);
        printf("请输入备注:");
      scanf("%s",File[i].desc);
    }
    system("cls");//清屏
    toxy(15,6);
    printf("录入完毕,请记得返回保存(*^▽^*)");
    toxy(15,8);
    printf("按任意键可返回主菜单!");
    getch();

}

void output()//信息显示,将学生的基本信息显示到屏幕上
{
    system("cls");//清屏
    system("color F");//字体颜色为亮白色
    int i;
    FILE*fp;
    toxy(15,6);
    printf("***********学生基本信息*************\n");
    toxy(15,8);
    printf(" 学号       姓名     性别     年龄    出生日期    备注");
    toxy(15,10);
    if((fp=fopen("stu","r"))==NULL)//只用读,用r打开stu文件
    {
        system("cls");
        toxy(15,6);
        printf("cannot open file");
        toxy(15,8);
        exit(0);
    }
    else
    {

      for(i=0;i<N;i++)
      {
        fread(&File[i],sizeof(struct file),1,fp);//从文件中读取数据到File中
        if(feof(fp))//判断文件是否读到了最后
            break;
        printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s\n",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc);
        toxy(15,11+i);  
      }
    memset(File,NULL,sizeof(File));//重置File
    }
    printf("显示完毕,请按任意键返回主菜单");
    getch();

}

void save(int n) //信息保存,将录入的学生信息保存到文件中
{   
    system("cls");//清屏
    system("color F");//字体颜色为亮白色
    FILE*fp;
    fp=fopen("stu","a+");//以追加的方式打开文件,结束时指针停在文件尾
    int i;
    for(i=0;i<n;i++)
    {
        if(File[i].age==NULL) continue;//避免空白数据
         fwrite(&File[i],sizeof(struct file),1,fp);//向指定的文件中写入数据
    }
    fclose(fp);
    n=NULL;//重置
    memset(File,NULL,sizeof(File));//重置结构体数组File
    toxy(15,8);
    printf("档案保存成功!即将返回主菜单……");
    Sleep(800);

}

void dele()//信息删除,把不要的学生基本信息删除
{
  
   system("cls");//清屏
   system("color F");//字体颜色为亮白色
   int i,flag=0;//flag是否找到删除学生的标志
   char number[20];
   char name[20];
   char c;
 do
 {
     toxy(15,6);
     printf("请输入要删除学生的学号和姓名:");
     toxy(15,8);
  scanf("%s%s",number,name);
  FILE*fp1,*fp2;
  fp1=fopen("stu","r+");//为了读和写,用r+打开stu文本文件
  fp2=fopen("linshi","w+");//用w+打开一个临时的文本文件
  if(fp1==NULL||fp2==NULL)
  {
      toxy(15,10);
      printf("cannot open file!");
      toxy(15,12);
      exit(0);
  }
  for(i=0;i<N;i++)
  {
      while(fread(&File[i],sizeof(struct file),1,fp1))//从文件中读取数据到File
      {
          if(feof(fp1))// 判断文件是否读到了最后
              break;
          if(strcmp(number,File[i].id)==0&&strcmp(name,File[i].name)==0)//判断要删除的学号和姓名是否与文件数据有相同,若相同则跳过这次循环
          {
              flag=1;
              continue;
          }
          else
          {
              fwrite(&File[i],sizeof(struct file),1,fp2);//将File的信息写入文件
          }
      }
  }
  fclose(fp1);
  fclose(fp2);
  if(system("copy linshi stu")==0)//将linshi文件的内容复制覆盖到stu文件,若成功则返回0
  {   
      system("cls");//清屏
      system("DEL linshi");//删除linshi文件
      system("cls");//清屏
  }
  if(flag==1)//找到删除学生            
  {
                    
      toxy(15,10);   
      printf("成功删除该学生,系统将自动帮您更新并保存档案\n");
      Sleep(800);
      menu();
                     
  }
  if(flag==0)//无法找到被删除学生
  {
      toxy(15,10);
      printf("删除失败!学号或姓名输入错误");
      toxy(15,11);
      printf("按1返回主菜单,按2重新输入\n");
      toxy(15,11);
      while(1)
      {
          c=getch();
          if(c==\'1\')
          {
              menu();
          }
          else if(c==\'2\')
              dele();
      }
  }
 
 }while(1);
}
void change()//修改信息,修改错误的学生信息
{   
    int sign=0;//用来标志密码验证成功或否
    int j=3;//每次进入此功能,用户有3次验证密码机会
    do
    {
    system("cls");//清屏
    system("color F");//字体颜色为亮白色
    char str[18];
    FILE*fp;
    if((fp=fopen("password","r"))==NULL)
    {
        printf("cannot open file\n");
        exit(0);
    }
    fgets(str,18,fp);//从文件中读取密码数据保存到str数组中
    fclose(fp);
    toxy(15,6);
    printf("进入该功能,须再次验证登陆密码:\n");
    toxy(15,8);
        char c;
        char password[18];
        int i=0;
        for(;;)//此处为输入密码不回显操作
        {
            c=getch();//输入c
            if(c==\'\r\')//如果输入c为回车,则跳出循环
            {
                break;
            }
            if(c==\'\b\') //如果输入c为删除键
            {
                printf("\b");
                printf(" ");
                printf("\b");
            }
            else
            {
                password[i]=c;
                printf("*");
                i++;
            }
        }
        password[i]=\'\0\';//在字符串结尾作结束符标记
        if(strcmp(str,password)==0)//验证密码是否正确
        {
          system("cls");//清屏
          toxy(15,10);
          printf("验证成功!即将进入修改功能!");
          Sleep(600);
          sign=1;
          break;
        }
        else
        {
            toxy(15,10);
            j--;
            printf("密码错误!您还有%d次验证机会",j);
            Sleep(600);
        }
    }while(j>0);//验证机会不为0
    if(j==0)
    {
        system("cls");
        toxy(15,6);
        printf("验证机会已用完,即将返回主菜单……");
        Sleep(600);
        menu();
    }
    
    int select,i;
    char number[20];
    int count=0;
    if(sign)
    {
        system("cls");
        while(select!=7)
        {
        system("cls");
        toxy(15,6);
        printf("--------------1.修改学号-------------");
        toxy(15,7);
        printf("--------------2.修改姓名-------------");
        toxy(15,8);
        printf("--------------3.修改性别-------------");
        toxy(15,9);
        printf("--------------4.修改年龄-------------");
        toxy(15,10);
        printf("--------------5.修改出生日期---------");
        toxy(15,11);
        printf("--------------6.修改备注 ------------");
        toxy(15,12);
        printf("--------------7. 退出 ---------------");
        toxy(15,13);
        printf("请输入1~6进行选择:");
        toxy(15,14);
        scanf("%d",&select);
        FILE*fp1;
        toxy(15,15);
     if((fp1=fopen("stu","r+"))==NULL)//为了读和写,用r+打开stu文件
     {
         system("cls");//清屏
         toxy(15,6);
        printf("cannot open file!");
        toxy(15,8);
        exit(0);
     }  
     for(i=0;i<N;i++)
    {
        fread(&File[i],sizeof(struct file),1,fp1);//从文件中读取数据到File
         if(feof(fp1))//判断文件是否读到了最后
            break;
        count++;//每次成功从stu文件中读取信息,则学生数据个数加1
    }
     int flag=0;
        switch(select)
        {
        case 1://修改学号
                system("cls");//清屏
                toxy(15,5);
                printf("请输入要修改学生的学号:");
                toxy(15,6);
                scanf("%s",number);
                for(i=0;i<count;i++)
                {
                    if((strcmp(number,File[i].id))==0)
                    {
                        toxy(15,7);
                        printf("*********************学生基本信息*********************");
                        toxy(15,8);
                        printf(" 学号       姓名     性别     年龄    出生日期    备注");
                        toxy(15,9);
                        printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc);
                        toxy(15,10);
                        printf("重新输入该学生的学号进行修改:");
                        toxy(15,11);
                        scanf("%s",File[i].id);
                        flag=1;
                        break;
                    }
                }
                fclose(fp1);
                if(flag==1)
                {
                    system("cls");//清屏
                    toxy(15,12);
                    printf("修改成功!系统已自动保存!");
                    toxy(15,13);
                    printf("正在自动跳转到主菜单....");
                    FILE*fp2;
                    if((fp2=fopen("stu","w+"))==NULL)//用w+打开stu文件同时清空文件内容
                    {
                        printf("cannot open file!");
                        exit(0);
                    }
                    for(i=0;i<count;i++)
                        fwrite(&File[i],sizeof(file),1,fp2);//将File的信息写入stu文件
                    fclose(fp2);
                    Sleep(600);
                    menu();
                    
                }
                if(flag==0)
                {
                    toxy(15,12);
                    printf("该学生不存在!");
                    toxy(15,13);
                    char c;
                    printf("1.返回上一级  2.返回主菜单");
                    toxy(15,14);
                    c=getch();
                    if(c==\'1\') break;
                    if(c==\'2\') menu();
                }

        case 2://修改姓名
            system("cls");//清屏
            toxy(15,5);
                printf("请输入要修改学生的学号:");
                toxy(15,6);
                scanf("%s",number);
                for(i=0;i<count;i++)
                {
                    if((strcmp(number,File[i].id))==0)
                    {
                        toxy(15,7);
                        printf("*********************学生基本信息*********************");
                        toxy(15,8);
                        printf(" 学号       姓名     性别     年龄    出生日期    备注");
                        toxy(15,9);
                        printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc);
                        toxy(15,10);
                        printf("重新输入该学生的姓名进行修改:");
                        toxy(15,11);
                        scanf("%s",File[i].name);
                        flag=1;
                        break;
                    }
                }
                if(flag==1)
                {
                    system("cls");//清屏
                    toxy(15,12);
                    printf("修改成功!系统已自动保存!");
                    toxy(15,13);
                    printf("正在自动跳转到主菜单....");
                    FILE*fp2;
                    if((fp2=fopen("stu","w+"))==NULL)//用w+打开stu文件同时清空文件内容
                    {
                        printf("cannot open file!");
                        exit(0);
                    }
                    for(i=0;i<count;i++)
                        fwrite(&File[i],sizeof(file),1,fp2);//将File的信息写入stu文件
                    fclose(fp2);
                    Sleep(600);
                    menu();
                    
                }
                if(flag==0)
                {
                    toxy(15,12);
                    printf("该学生不存在!");
                    toxy(15,13);
                    char c;
                    printf("1.返回上一级  2.返回主菜单");
                    toxy(15,14);
                    c=getch();
                    if(c==\'1\') break;
                    if(c==\'2\') menu();
                }

        case 3://修改性别
            system("cls");//清屏
            toxy(15,5);
                printf("请输入要修改学生的学号:");
                toxy(15,6);
                scanf("%s",number);
                for(i=0;i<count;i++)
                {
                    if((strcmp(number,File[i].id))==0)
                    {
                        toxy(15,7);
                        printf("*********************学生基本信息*********************");
                        toxy(15,8);
                        printf(" 学号       姓名     性别     年龄    出生日期    备注");
                        toxy(15,9);
                        printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc);
                        toxy(15,10);
                        printf("重新输入该学生的性别进行修改:");
                        toxy(15,11);
                        scanf("%s",File[i].sex);
                        flag=1;
                        break;
                    }
                }
                if(flag==1)
                {
                    system("cls");//清屏
                    toxy(15,12);
                    printf("修改成功!系统已自动保存!");
                    toxy(15,13);
                    printf("正在自动跳转到主菜单....");
                    FILE*fp2;
                    if((fp2=fopen("stu","w+"))==NULL)//用w+打开stu文件同时清空文件内容
                    {
                        printf("cannot open file!");
                        exit(0);
                    }
                    for(i=0;i<count;i++)
                        fwrite(&File[i],sizeof(file),1,fp2);//将File的信息写入stu文件
                    fclose(fp2);
                    Sleep(600);
                    menu();
                    
                }
                if(flag==0)
                {
                    toxy(15,12);
                    printf("该学生不存在!");
                    toxy(15,13);
                    char c;
                    printf("1.返回上一级  2.返回主菜单");
                    toxy(15,14);
                    c=getch();
                    if(c==\'1\') break;
                    if(c==\'2\') menu();
                }
        case 4://修改年龄
            system("cls");//清屏
            toxy(15,5);
                printf("请输入要修改学生的学号:");
                toxy(15,6);
                scanf("%s",number);
                for(i=0;i<count;i++)
                {
                    if((strcmp(number,File[i].id))==0)
                    {
                        toxy(15,7);
                        printf("*********************学生基本信息*********************");
                        toxy(15,8);
                        printf(" 学号       姓名     性别     年龄    出生日期    备注");
                        toxy(15,9);
                        printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc);
                        toxy(15,10);
                        printf("重新输入该学生的年龄进行修改:");
                        toxy(15,11);
                        scanf("%d",&File[i].age);
                        flag=1;
                    }
                }
                if(flag==1)
                {
                    system("cls");//清屏
                    toxy(15,12);
                    printf("修改成功!系统已自动保存!");
                    toxy(15,13);
                    printf("正在自动跳转到主菜单....");
                    FILE*fp2;
                    if((fp2=fopen("stu","w+"))==NULL)//用w+打开stu文件同时清空文件内容
                    {
                        printf("cannot open file!");
                        exit(0);
                    }
                    for(i=0;i<count;i++)
                        fwrite(&File[i],sizeof(file),1,fp2);//将File的信息写入stu文件
                    fclose(fp2);
                    Sleep(600);
                    menu();
                    
                }
                if(flag==0)
                {
                    toxy(15,12);
                    printf("该学生不存在!");
                    toxy(15,13);
                    char c;
                    printf("1.返回上一级  2.返回主菜单");
                    toxy(15,14);
                    c=getch();
                    if(c==\'1\') break;
                    if(c==\'2\') menu();
                }

        case 5://修改出生日期
            system("cls");//清屏
            toxy(15,5);
            printf("请输入要修改学生的学号:");
            toxy(15,6);
                scanf("%s",number);
                for(i=0;i<count;i++)
                {
                    if((strcmp(number,File[i].id))==0)
                    {
                        toxy(15,7);
                        printf("*********************学生基本信息*********************");
                        toxy(15,8);
                        printf(" 学号       姓名     性别     年龄    出生日期    备注");
                        toxy(15,9);
                        printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc);
                        toxy(15,10);
                        printf("重新输入该学生的出生日期(年 月 日)进行修改:");
                        toxy(15,11);
                        scanf("%d%d%d",&File[i].birthday.year,&File[i].birthday.month,&File[i].birthday.day);
                        flag=1;
                    }
                }
                if(flag==1)
                {
                    system("cls");//清屏
                    toxy(15,12);
                    printf("修改成功!系统已自动保存!");
                    toxy(15,13);
                    printf("正在自动跳转到主菜单....");
                    FILE*fp2;
                    if((fp2=fopen("stu","w+"))==NULL)//用w+打开stu文件同时清空文件内容
                    {
                        printf("cannot open file!");
                        exit(0);
                    }
                    for(i=0;i<count;i++)
                        fwrite(&File[i],sizeof(file),1,fp2);//将File的信息写入stu文件
                    fclose(fp2);
                    Sleep(600);
                    menu();
                    
                }
                if(flag==0)
                {
                    toxy(15,12);
                    printf("该学生不存在!");
                    toxy(15,13);
                    char c;
                    printf("1.返回上一级  2.返回主菜单");
                    toxy(15,14);
                    c=getch();
                    if(c==\'1\') break;
                    if(c==\'2\') menu();
                }

        case 6://修改备注
        system("cls");//清屏
            toxy(15,5);
                printf("请输入要修改学生的学号:");
                toxy(15,6);
                scanf("%s",number);
                for(i=0;i<count;i++)
                {
                    if((strcmp(number,File[i].id))==0)
                    {
                        toxy(15,7);
                        printf("*********************学生基本信息*********************");
                        toxy(15,8);
                        printf(" 学号       姓名     性别     年龄    出生日期    备注");
                        toxy(15,9);
                        printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc);
                        toxy(15,10);
                        printf("重新输入该学生的备注进行修改:");
                        toxy(15,11);
                        scanf("%s",&File[i].desc);
                        flag=1;
                    }
                }
                if(flag==1)
                {
                    system("cls");//清屏
                    toxy(15,12);
                    printf("修改成功!系统已自动保存!");
                    toxy(15,13);
                    printf("正在自动跳转到主菜单....");
                    FILE*fp2;
                    if((fp2=fopen("stu","w+"))==NULL)//用w+打开stu文件同时清空文件内容
                    {
                        printf("cannot open file!");
                        exit(0);
                    }
                    for(i=0;i<count;i++)
                        fwrite(&File[i],sizeof(file),1,fp2);//将File的信息写入stu文件
                    fclose(fp2);
                    Sleep(600);
                    menu();
                    
                }
                if(flag==0)
                {
                    toxy(15,12);
                    printf("该学生不存在!");
                    toxy(15,13);
                    char c;
                    printf("1.返回上一级  2.返回主菜单");
                    toxy(15,14);
                    c=getch();
                    if(c==\'1\') break;
                    if(c==\'2\') menu();
                }

        case 7:system("cls");//清屏
        default:break;
        }
        }

    }
}
void invest()//查询信息,可按学号、姓名、性别、年龄、出生日期查询学生的基本信息
{   
    system("cls");//清屏
    system("color F");//字体颜色为亮白色
    int i,x,flag,year,month,day,age;
    char number[20];
    char name[20];
    char sex[5];
    while(x!=6)
    {
    system("cls");
    toxy(15,6);
    printf("请选择查询功能:\n");
    toxy(15,7);
    printf("\t1.查询学号\n");
    toxy(15,8);
    printf("\t2.查询姓名\n");
    toxy(15,9);
    printf("\t3.查询性别\n");
    toxy(15,10);
    printf("\t4.查询出生日期\n");
    toxy(15,11);
    printf("\t5.查询年龄\n");
    toxy(15,12);
    printf("\t6.退出\n");
    toxy(15,13);
    printf("请输入选择:");
    scanf("%d",&x);
    FILE*fp;
    if((fp=fopen("stu","r"))==NULL)//只用读,用r打开stu文件
    {
        system("cls");//清屏
        toxy(15,6);
        printf("cannot open file\n");
        toxy(15,8);
        exit(0);
    }
    int count=0;//用来记录文件中学生数据的个数
    for(i=0;i<N;i++)
        {
        fread(&File[i],sizeof(struct file),1,fp);//将stu文件信息传到File中
        if(feof(fp))//判断文件是否读到了最后
             break;
        count++;//每次成功从stu文件中读取信息,则学生数据个数加1
        }
    fclose(fp);
    switch(x)
    {
    case 1:
        system("cls");//清屏
        toxy(15,6);
        printf("请输入学号:");
        toxy(15,8);
        scanf("%s",number);
        system("cls");//清屏
        flag=0;
        toxy(15,6);
        printf("学号为%s的学生信息如下:",number);
        for(i=0;i<count;i++)
        {   
            if((strcmp(number,File[i].id))==0)
            {
                toxy(15,7+i);
                printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc);
                flag=1;
            }
        }
        if(flag==0)
        {   
            toxy(15,8);
            printf("无法找到你要找的学生!");
        }
        toxy(15,11+count);
        printf("按任意键后可返回……");
                getch();
        break;
    case 2:
        system("cls");//清屏
        toxy(15,6);
        printf("请输入姓名:");
        toxy(15,8);
         scanf("%s",name);
         flag=0;
         system("cls");//清屏
         toxy(15,6);
         printf("姓名为%s的学生信息如下:",name);
        for(i=0;i<count;i++)
        {
            if(strcmp(name,File[i].name)==0)
            {
               toxy(15,7+i);
               printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc);
               flag=1;
            }
        }
        if(flag==0)
        {
            toxy(15,8);
            printf("无法找到你要找的学生!");
        }
        toxy(15,11+count);
        printf("按任意键后可返回……");
        getch();
        break;
    case 3:
        system("cls");//清屏
        toxy(15,6);
        printf("请输入性别(男/女):");
        toxy(15,8);
        scanf("%s",sex);
        system("cls");//清屏
        flag=0;
        toxy(15,6);
        printf("性别为%s的学生信息如下:",sex);
        for(i=0;i<count;i++)
        {     
            if(strcmp(sex,File[i].sex)==0)
            {
               toxy(15,7+i);
               printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc);
               flag=1;
            }
        }
        if(flag==0)
        {
            toxy(15,8);
            printf("无法找到你要找的学生!");
        }
        toxy(15,11+count);
        printf("按任意键后可返回……");
        getch();
            break;
    case 4:
        system("cls");//清屏
        toxy(15,6);
        printf("请输入出生日期(年 月 日):");
        toxy(15,8);
        scanf("%d%d%d",&year,&month,&day);
        system("cls");//清屏
        flag=0;
        toxy(15,6);
        printf("出生日期为%d年%d月%d日的学生信息如下:",year,month,day);
        for(i=0;i<count;i++)
        {
           if(year==File[i].birthday.year&&year==File[i].birthday.month&&year==File[i].birthday.day)
           {
               toxy(15,7+i);
               printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc);
               flag=1;
           }
        }
        if(flag==0)
        {
            toxy(15,8);
            printf("无法找到你要找的学生!");
        }
        toxy(15,11+count);
        printf("按任意键后可返回……");
        getch();
        break;
    case 5:
        system("cls");//清屏
        toxy(15,6);
        printf("请输入年龄:");
        toxy(15,8);
        scanf("%d",&age);
        system("cls");//清屏
        flag=0;
        toxy(15,6);
        printf("年龄为%d的学生信息如下:",age);
       for(i=0;i<count;i++)
       {
           if(age==File[i].age)
           {
               toxy(15,7+i);
               printf("%-10s  %-10s%-s %7d    %d-%d-%d  %7s",File[i].id,File[i].name,File[i].sex,File[i].age,File[i].birthday.year,File[i].birthday.month,File[i].birthday.day,File[i].desc);
               flag=1;
           }
        }
       if(flag==0)
       {
           toxy(15,8);
           printf("无法找到你要找的学生!");
       }
       toxy(15,11+count);
       printf("按任意键后可返回……");
        getch();
       break;
    case 6:system("cls");//清屏
        toxy(15,8);
        printf("即将返回主菜单……");
        Sleep(700);
        break;
    }
    }
}
void over()//退出功能,显示退出软件的提示 
{
    char t;
    system("color F");//字体颜色为亮白色
    toxy(15,11);
    printf("--------------------------");
    toxy(15,12);
    printf("|    您确定要退出吗?    |");
    toxy(15,14);
    printf("|  1.确定      2.取消    |");
    toxy(15,15);
    printf("--------------------------");
    while(1)
    {
        t=getch();         //输入t
        switch(t)
        {
            case \'1\':
            system("cls");//清屏
            system("color F");//字体颜色为亮白色
            toxy(15,10);
            printf("正在安全退出....");
            Sleep(1000);     //暂停1秒 
            system("cls");
            system("color F");//字体颜色为亮白色
            toxy(15,10);
            printf("已安全退出软件");
            toxy(15,12);
            printf("谢谢使用!");
            toxy(15,14);
            printf("bye-bye^_^");
            toxy(15,16);
            exit(0);  break; //终止程序 
            case \'2\':
            menu(); break;   //调用函数,进入菜单 
            default :break;
        }
    }
}

void menu()//菜单功能,显示各种操作功能
{ 
    system("cls");//清屏
    fflush(stdin);//清空缓存
    char x;
    int n;
    while(x!=\'h\')
    {
        system("color F");//字体颜色为亮白色
        system("cls");
        toxy(15,4);
        printf("-----班级档案管理系统-----");
        toxy(15,5);
        printf("|                        |");
        toxy(15,6);
        printf("|    a.学生基本信息录入  |");
        toxy(15,7);
        printf("|                        |");
        toxy(15,8);
        printf("|    b.学生基本信息显示  |");
        toxy(15,9);
        printf("|                        |");
        toxy(15,10);
        printf("|    c.学生基本信息保存  |");
        toxy(15,11);
        printf("|                        |");
        toxy(15,12);
        printf("|    d.学生基本信息删除  |");
        toxy(15,13);
        printf("|                        |");
        toxy(15,14);
        printf("|    e.学生基本信息修改  |");
        toxy(15,15);
        printf("|                        |");
        toxy(15,16);
        printf("|    f.学生基本信息查询  |");
        toxy(15,17);
        printf("|                        |");
        toxy(15,18);
        printf("|    g.修  改   密   码  |");
        toxy(15,19);
        printf("|                        |");
        toxy(15,20);
        printf("|    h.退  出   系   统  |");
        toxy(15,21);
        printf("|                        |");
        toxy(15,22);
        printf("--------------------------");
        toxy(15,23);
        printf("请输入选择:");
        x=getch();
        if(x<\'A\'||x>\'H\'&&x<\'a\'||x>\'h\')//如果输入的范围不是在A-H或a-h
        {
            toxy(15,25);
            printf("输入选项有误,请重新输入");
            Sleep(700);
            continue;
        }
        if(x>=\'A\'&&x<=\'H\')
            x=x+32;//将大写转换为小写
        switch(x)
        {
        case \'a\':
            system("cls");
            system("color F");//字体颜色为亮白色
            toxy(15,8);
            printf("请输入录入学生人数:");
            scanf("%d",&n);
            input(n);
            break;
        case \'b\':
            output();
                 break;
        case \'c\':
            save(n);
                 break;
        case \'d\':dele();
                 break;
        case \'e\':
            change();
                break;
        case \'f\':invest();break;
        case \'g\':change_password();
            break;
        case\'h\':
            over();
            break;
            
        default:break;
        }
    }
}

void save_password(char str[])//保存密码到password文本文件中
{
    FILE*fp;
    fp=fopen("password","w");//打开文本文件
    if(fp==NULL)
    {
        printf("cannot open file");
    }
    if(fputs(str,fp)!=0)//使用fputs将密码写入密码文件,成功则返回0,否则返回非0值
    {
        printf("write error!");
    }
    fclose(fp);
}

void load()//密码登陆,通过验证读取文件的密码与用户输入的密码是否一致,从而进入系统
{
    char _password[18];
    int p=3;//有3次验证密码机会
    do
    {
        system("cls");//清屏
        system("color F");//字体颜色为亮白色
        int i=0;
        char password[18];
        char str[]="hstc2018";//第一次登陆的初始密码
        char k;
        FILE*fp;
        if((fp=fopen("password","a+"))==NULL)
        {
            printf("cannot open file");
            exit(0);
        }
        fseek(fp,0L,SEEK_END);//把文件指针移到最后
        int size=ftell(fp);//用ftell函数测定文件位置标记的当前位置
        rewind(fp);//使文件位置标记重新返回文件的开头
        if(size==0)//如果文件的长度为空,则说明是第一次登陆使用
        {
            strcpy(password,str);//将初始密码复制到password数组
            save_password(password);//保存密码到文件中
        }
        else
            fgets(password,18,fp);//从文件中读取密码
        toxy(15,6);
        printf("----------学生档案管理系统---------\n");
        toxy(15,8);
        printf("请输入管理者密码:");
        for(;;)//此处为输入密码不回显操作 
        {
            k=getch();//输入k
            if(k==\'\r\') //如果输入k为回车,则跳出循环 
            {
                break;
            }
            if(k==\'\b\')//如果输入k为删除键 
            {
                if(i>0)//如果密码还没完全删除 
                {
                    printf("\b");
                    printf(" ");
                    printf("\b");
                    i--;
                }
            }
            else  //如果输入的k既不是删除键,也不是回车键
            {
                _password[i]=k;
                printf("*");
                i++;
            }
        }
        _password[i]=\'\0\';//在字符串结尾作结束符标记
        if(strcmp(password,_password)==0)//判断密码是否输入正确
        {
            system("cls");//清屏
            toxy(15,10);
            printf("正在登陆……");
            Sleep(500);
            menu();
        }
        else
        {
            toxy(15,10);
            p--;
            printf("密码错误!您还有%d次机会",p);
            Sleep(600);
        }

    }while(p>0);//验证机会不为0
    if(p==0)
    {
        system("cls");//清屏
        toxy(15,6);
        printf("机会已用完!");
        toxy(15,8);
    }
}
void change_password()//修改密码,需要输入旧密码和新密码,如果旧密码验证正确则可成功修改
{
    system("cls");//清屏
    system("color F");//字体颜色为亮白色
    char str[18];
    FILE*fp;
    if((fp=fopen("password","r"))==NULL)//只用读,用r打开stu文件
    {
        printf("cannot open file");
        exit(0);
    }
    fgets(str,18,fp);//从fp指向的password文件读入字符串,存放到字符数组str中
    fclose(fp);
    do
    {
        system("cls");//清屏
        char password[18],newpassword[18],c,t;
        int i=0;
        toxy(15,6);
        printf("学生管理系统");
        toxy(15,8);
        printf("修改密码");
        toxy(15,10);
        printf("请输入旧密码:");
        for(;;)//此处为密码不回显操作
        {
            c=getch();
            if(c==\'\r\')//如果输入为回车键
            {
                break;
            }
            else if(c==\'\b\')//如果输入c为删除键
            {
                if(i>0) //如果密码还没完全删除
                {
                    printf("\b");
                    printf(" ");
                    printf("\b");
                    i--;
                }
            }
            else  //如果输入的c既不是删除键,也不是回车键
            {
                password[i]=c;
                printf("*");
                i++;
            }
        }
        password[i]=\'\0\';//在字符串结尾作结束符标记
        i=0;
        toxy(15,12);
        printf("请输入新密码:");
        for(;;)//此处为输入密码不回显操作
        {
            c=getch();
            if(c==\'\r\') //如果输入c为回车,则跳出循环
            {
                break;
            }
            else if(c==\'\b\')//如果输入c为删除键
            {
                if(i>0)//如果密码还没完全删除
                {
                    printf("\b");
                    printf(" ");
                    printf("\b");
                    i--;
                }
            }
            else
            {
                newpassword[i]=c;
                printf("*");
                i++;
            }
        }
        newpassword[i]=\'\0\';//在字符串结尾作结束符标记
        if(strcmp(str,password)==0)//如果旧密码与原来密码验证成功
        {
            save_password(newpassword);//保存新密码
            system("cls");//清屏
            toxy(15,6);
            printf("修改成功,即将返回主菜单……");
            Sleep(600);
            menu();
        }
        else
        {
            system("cls");//清屏
                toxy(15,8);
                printf("-------------------------------------");
                toxy(15,9);
                printf("|                                   |");
                toxy(15,10);
                printf("|        密码错误!是否继续?        |");
                toxy(15,11);
                printf("|                                   |");
                toxy(15,12);
                printf("| 1.是                      2.否    |");
                toxy(15,13);
                printf("|                                   |");
                toxy(15,14);
                printf("-------------------------------------");
                while(1)
                {
                    t=getch();
                    if(t==\'1\')
                    {
                        system("cls");//清屏
                        break;
                    }
                    else if(t==\'2\')
                    {
                        menu();
                    }
                }
        }
    }while(1);

}
int main()
{
    load();
    return 0;
}

5.程序的运行效果图

 

 

 

     

 

    

 

 

6.总结与展望

完成了该课程设计后,对文件的输入输出有了更深一层的了解。还学会了利用windows.h函数库里的system函数去进行
清屏-system("cls"),
延时-Sleep(),
设置字体颜色-system("color X")
删除文件-system("DEL XX")
复制文件-system("copy X1 X2")
虽然较为成功地完成了课程设计,但由于知识和时间的局限性,系统仍然存在缺陷。我认为此系统还可以链接数据库,增加用户权限等,这样能够使系统更具有实用性。