主頁 > 後端開發 > 大一C語言課程設計——班級檔案管理系統

大一C語言課程設計——班級檔案管理系統

2020-09-17 17:37:25 後端開發

記錄我在大一第二學期期末做的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")
雖然較為成功地完成了課程設計,但由于知識和時間的局限性,系統仍然存在缺陷,我認為此系統還可以鏈接資料庫,增加用戶權限等,這樣能夠使系統更具有實用性,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/67322.html

標籤:C

上一篇:C語言是什么

下一篇:Linux平臺上常用到的c語言開發程式

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more