首頁 > 軟體

C語言編寫實現學生管理系統

2022-07-21 22:00:11

本文範例為大家分享了C語言實現學生管理系統的具體程式碼,供大家參考,具體內容如下

專案介紹

學生資訊管理系統是一個基於C語言開發的系統,其中有用到氣泡排序、指標、結構體、二位陣列等知識。通過模組化的方法編寫各個函數,其中在主介面函數呼叫各個模組的函數的實現以下具體功能:

1、學生資訊的增刪改查
2、學生成績的排序
3、統計學生人數
4、顯示所有學生的資訊。
5、對學生資訊存檔

總體設計

本實驗通過在main函數開啟儲存資料結果的檔案和呼叫主介面函數;在主介面函數welcom()中實現邊框的繪製,以及顯示各個功能及各個功能對應的函數實現方法。

錄入資訊函數addInfo():此函數通過結構體student來儲存錄入的資訊,其中為了確保資料的後續操作的準確性,通過學號的唯一性來標識每個學生的資訊,通過編寫及呼叫一個isIdSame()函數,該函數通過遍歷所有學號確認學號來保障學號的唯一性,學號重複會提示使用者需要重新輸入函數。

查詢學生資訊函數:通過學號查詢學生的資訊,編寫並呼叫一個findIndex()函數,該函數會遍歷結構體的學號資訊,查詢到會返回該學號的座標,沒有找到該學號則返回-1;通過變數target來儲存返回的結果。如果target不等於-1,則程式找到了該學號,通過編寫並呼叫一個showInfo()函數來輸出所有該學生的資訊;否則輸出查詢此人,因為下標不可能為負數。

更新學生資訊函數update():通過學號來找到該學生,呼叫findIndex()函數來確定該學生的位置,如果返回結果是小於0則函數結束,查無此人;若大於0則找到該學生,通過do…while函數switch選擇語句的巢狀來進行使用者需要求改某一項的內容。

刪除函數del():查詢學生的步驟跟更新學生資訊函數的流程一樣,如果findIndex()函數小於0則函數結束,否則通過一個for迴圈把結構體的陣列從遊標開始往前覆蓋從而達到刪除效果。

插入學生資訊函數inserInfo():通過要求使用者輸入位置來定位插入到位置,輸入使用者輸入的大於結構體陣列的總數則插入到最後一個陣列。否則通過一個for迴圈,把陣列從最後開始往後移一位,把使用者輸入的位置的結果移到後一陣列就編寫並呼叫插入函數inserCurrentInfo()對當前位置陣列進行覆蓋插入。inserCurrentInfo()函數只負責對接收到的該位置的元素所有資訊的寫入。

排序函數sortTotal():建立一個臨時變數提供元素與元素之間交換資訊。通過雙迴圈巢狀結構進行結構體的分數進行大小對比、交換位置來進行氣泡排序。最後排序完成之後輸出分數由高到低排序的所有學生的資訊。

顯示學生資訊函數showAllInfo():該函數通過全域性變數count(該變數記錄了所有新增、插入或刪除過的學生資訊,能準確記錄學生的總人數)通過for迴圈去遍歷student結構體,從而輸出所有的所生資訊。

學生資料存檔函數writeData():該函數定義一個指標,以寫入方式開啟”stu.txt文字”,並把該文字的地址賦給指標fp。通過一個for迴圈遍歷結構體裡的元素,把結構體裡的元素的屬性輸入到”stu.txt文字”。

詳細程式碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <windows.h>
void addInfo();// 新增
void welcom(); //主介面 
void showAllInfo();//展示所有資訊 
void showInfo(struct Student student);//展示學生資訊 
int findIndex(struct Student student[],int id);// 根據學號 返回對應下標 
void del(); //刪除 
void search();// 查詢學生資訊 
void updata();//更新 
void sortTotal();//按總分排序 
void writeData();//資料寫入檔案中 
void initData();//初始化資料 從檔案中讀取資料,初始化陣列
void showCount(); // 展示儲存學生個數 
void inserInfo();//插入學生資訊 
void inserCurrentInfo(int site); //當前位置插入 
void con();//按任意鍵繼續 
int find1(struct Student student[],int id); //判斷學號是否有重複 重複返回1 不重複返回0 
void isIdSame(int x); //校驗所輸入學號是否重複 
void gotoxy(int x,int y);//遊標定位
int color(int c); //設定顏色輸出 
struct Student{
    int id;
    char name[20];
    int _math;
    int _chinese;
    int _english;
    int total;// 總分 
} student[500]; 
int count=0;// 記錄當前陣列中儲存學生個數 
//主函數 
int main(){
    initData(); 
    welcom(); 
    return 0;
}
// 遊標定位 
void gotoxy(int x, int y)
{
    COORD pos;
     pos.X = x;      //橫座標
     pos.Y = y;      //縱座標
     SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
//設定顏色輸出 
int color(int c)
{
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);        //更改文字顏色
    return 0;
}; 
// 主介面 
void welcom()
{
    while(1){
        system("cls");
            int n;
            int i,j = 1;
            color(10);                                          //淡綠色邊框
            for (i = 5; i <= 35; i++)                               //迴圈y軸座標,列印輸出上下邊框===
            {
                for (j = 10; j <= 57; j++)                      //迴圈x軸座標,列印輸出左右邊框||
                {
                    gotoxy(j, i);
                    if (i == 5 || i == 35) printf("=");            //輸出上下邊框===
                    else if (j == 10 || j == 56) printf("||");    //輸出左右邊框||
                }
            }
             color(15);//白色 
             gotoxy(25,8);
             printf("學生資訊管理系統");
            color(14);                //設定字型顏色為黃色
            gotoxy(15, 12);
            printf("1:錄入學生資訊");
            gotoxy(35, 12);
            printf("2.查詢學生資訊");
            gotoxy(15, 16);
            printf("3.刪除學生資訊");
            gotoxy(35,16);
            printf("4.修改學生資訊");
            gotoxy(15, 20);
            printf("5.插入學生資訊");
            gotoxy(35,20);
            printf("6.按照學生成績排序");     
            gotoxy(15, 24);
            printf("7.統計學生總數");
            gotoxy(35,24);
            printf("8.顯示所有學生資訊");
            gotoxy(15, 28);
            printf("9.學生資料存檔並退出");
            gotoxy(25,32); 
            int choose;
            printf("請選擇:[ ]bb"); //b 遊標回退一格  
            color(15); //  顏色變回白色 
             scanf("%d", &choose);
                 switch (choose){
                      case 1:addInfo(); break;
                      case 2:search(); break;
                      case 3:del(); break;
                      case 4:updata(); break;
                      case 5:inserInfo();break; 
                      case 6:sortTotal(); break;
                      case 7:showCount(); break;
                      case 8:showAllInfo(); break;
                      case 9:writeData();exit(0);
                      } 
    }                
}
// 新增 
void addInfo(){
    system("cls");
    printf("t新增學生資訊n");
    printf("請輸入學號n");
    isIdSame(count);
    printf("請輸入姓名n");
    scanf("%s",&student[count].name);
    printf("請輸入語文成績n");
    scanf("%d",&student[count]._chinese);
    printf("請輸入數學成績n");
    scanf("%d",&student[count]._math);
    printf("請輸入英語成績n");
    scanf("%d",&student[count]._english);
    student[count].total=student[count]._chinese+student[count]._english+student[count]._math;
    printf("%s的資訊錄入成功nn",student[count].name);
    int choose;
    printf("1繼續 2返回主介面n"); 
    count++;  
    scanf("%d",&choose);
    if(choose==1){
        addInfo();
    } 
    system("cls"); 
 
} 
 
// 查詢 展示結果 
void search(){
    system("cls");
    int id;
    printf("請輸入你想查詢學生的學號n");
    scanf("%d",&id);
    int target = findIndex(student,id);  //目標下表
    int flag=1;//是否存在要查詢的學號 
    
    //for迴圈對比 
    if(target != -1) 
    {
        printf("nt查詢結果nn");
        showInfo(student[target]);
        con();  
        
    }
 
    else{ // 輸出查詢結果 
            printf("n查無此人n"); 
                con();
    } 
}
 
 
// 更新 
void updata(){
    system("cls");
    int id;
    printf("請輸入你要修改學生的學號n");
    scanf("%d",&id);
    int    target = findIndex(student,id);
 
    if(target<0){
        printf("查無此人");
        con(); 
    }else{
        int flag=1;    
    do{
        int choose=0;
        printf("請輸入需要修改的選項t(1.學號t2.姓名t3.語文t4.數學t5.英語):n");
        scanf("%d",&choose); 
            switch (choose) {
                case 1:
                    printf("請輸入學號n");
//                    scanf("%d",&student[target].id);
                    isIdSame(target);            
                    break;
                case 2:
                    printf("請輸入姓名n");
                    scanf("%s",&student[target].name);
                    break;
                case 3:
                    printf("請輸入語文成績n");
                    scanf("%d",&student[target]._chinese);
                    break; 
                case 4:
                    printf("請輸入數學成績n");
                    scanf("%d",&student[target]._math);
                    break;    
                case 5:
                    printf("請輸入英語成績n");
                    scanf("%d",&student[target]._english);
                    break;        
 
            } 
            student[target].total=student[target]._chinese+student[target]._english+student[target]._math;
            printf("%s的資訊修改成功n",student[target].name);
            printf("n按1繼續 按2退出修改n");
            int choose2; 
            scanf("%d",&choose2);
            if(choose2==1){
                flag=1;
            }else{
                flag=0;
            } 
            
    }while(flag);
 
    }    
} 
//刪除
void del(){
    system("cls");    
    int id;
    int target;//目標元素的下標 
    printf("n請輸入你想刪除學生的學號n");
    scanf("%d",&id);
    target=findIndex(student, id);
    if(target<0){
        printf("n查無此人n");
        con();
        
    } else{
         for(int i=target;i<count;i++){
             student[i]=student[i+1]; //刪除操作 後一位元素覆蓋前一位元素 
         }
        printf("刪除成功n");
        con();
    count--; 
    } 
}
 
//插入學生資訊
void inserInfo(){
    system("cls");
    int site; //位置 
    printf("請輸入你要插入學生資訊的位置(從0開始):n");
    scanf("%d",&site);
    //插入位置大於總數,則插入在陣列最後一位
    if ( site > count){
        inserCurrentInfo(count); 
        printf("%s的資訊插入成功n", student[count].name);
        
    }else{
        //不是最後一位 從當前位置 陣列全部後移一位 
        for (int i = count; i >= site; i--){
                student[i + 1] = student[i];
            }
        //在當前位置新增學員
        inserCurrentInfo(site);
        printf("%s同學的資訊插入成功n", student[site].name);
        con(); 
        }
 
} 
//當前位置插入
void inserCurrentInfo(int site){
     printf("請輸入學號n");
     isIdSame(site);
     printf("請輸入姓名n");
     scanf("%s", student[site].name);
     printf("請輸入語文成績n");
     scanf("%d", &student[site]._chinese);
     printf("請輸入數學成績n");
     scanf("%d", &student[site]._math);
     printf("請輸入英語成績n");
     scanf("%d", &student[site]._english);
    student[site].total= student[site]._chinese+student[site]._english+student[site]._math;
     count++;
     con();
 }
// 判斷學號是否重複 重複返回1 否則返回0 
int find1(struct Student student[],int id)
{
 int temp = 0;
 for(int i=0;i<count;i++)
  {
   if(student[i].id==id)
    {
     temp=1;
     break;
    }
  } 
 return temp;
} 
//校驗所新增學號是否重複
void isIdSame(int x){
 
    int inputId;    
    scanf("%d",&inputId);
     do{
       if(find1(student,inputId)){
         printf("學號有重複,請重新輸入n");
         scanf("%d",&inputId);
        }
       else
        {
         student[x].id=inputId;
         break;
        }
      }while(1);
}
 
// 根據學號 返回下標 
int findIndex (struct Student student[],int id){
    int temp;
    for(int i=0;i<count;i++){
        if(student[i].id==id){
            temp=i;
            break; 
        } else {
            temp = -1; 
        } 
    }
    
    return temp;
}
//按總分排序
 void sortTotal(){
     //氣泡排序 
    struct Student temp;// 元素與元素交換的臨時容器 
    for (int i = 0; i < count - 1; i++){
        for (int j = 0; j < count - 1 - i; j++){
            if (student[j].total<student[j+1].total){
                temp = student[j + 1];
                student[j + 1] = student[j];
                student[j]= temp;
            }
        }
    }
    printf("排序完成");
    showAllInfo();     
 }
 //按任意鍵繼續 
 void con(){
     printf("n按任意鍵繼續n"); 
     getch();
 }; 
 //展示學生總個數 
 void showCount(){
     system("cls"); 
     printf("nt學生總個數為:%d個n",count); 
    con(); 
 } 
 //初始化資料 
 void initData(){
     FILE * fp = NULL;
     fp = fopen("stu.txt", "r");
     if (!fp){
         printf("檔案開啟失敗n");
         exit(0);// 退出程式 
     }
     while (1){    //讀取資料 賦值給陣列 
         fscanf(fp, "%d%s%d%d%d%d", &student[count].id, student[count].name, &student[count]._chinese, &student[count]._math, &student[count]._english, &student[count].total);
         if (feof(fp)){ //檔案末尾 跳出迴圈 
             break;
         }
         count++;
     }
 }
 //資料寫入檔案中 
 void writeData(){
    FILE * fp = NULL;
    fp = fopen("stu.txt", "w");
    for (int i = 0; i < count; i++){
        fprintf(fp, "%dt%st%dt%dt%dt%dn", student[i].id, student[i].name, student[i]._chinese, student[i]._math, student[i]._english,student[i].total);
    }
    printf("資料儲存成功n");     
 }
 
 
// 展示所有資訊
void showAllInfo(){
    system("cls");//清屏 
    for(int i=0;i<count;i++){
        showInfo(student[i]);     
    } 
    con(); 
} 
// 展示學生資訊
void showInfo(struct Student stu){//傳入陣列裡的元素 
    printf("學號:%dt姓名:%st語文:%dt數學:%dt英語:%dt總分:%d",stu.id,stu.name,stu._chinese,stu._math,stu._english,stu.total);
    printf("n-----------------分割線-----------------------n"); 
} 

主介面

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com