首頁 > 軟體

C語言實現學生資訊管理系統(檔案操作)

2022-06-20 14:00:41

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

前言:與上篇文章相比,增加了檔案操作,可將任意時期的的學生資料儲存再檔案中,選單也隨之改動,增加了檔案操作一欄,是否儲存到相應檔案中由使用者決定

新增函數——檔案操作;

//學生資料檔案儲存 
//儲存任意時期的學生資料 
void Store_List(Link head)
{
    //檔案操作 
    ofstream ofs;
    ofs.open("Std_Information.txt",ios::out);
    
    if(head==NULL)
    {
        printf("學生為空n");
        return; 
    }
    else
    {
        Link p=head->next;
        while(p)
        {
            ofs<< "姓名:"<<p->data.studentName<<"    學號:"<<p->data.studentNo<<"  成績:"<<p->data.score<<endl; 
            p=p->next;
        }
        
    }
}

1.標頭檔案和預處理

#include <stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdbool.h>
#include<iostream>
#include<fstream>//檔案操作所需標頭檔案 
using namespace std;
#define NO_LENGTH  20
#define NAME_LENGTH 11

/* 定義學生結構體的資料結構 */
typedef struct Student{
    char studentNo[NO_LENGTH];
    char studentName[NAME_LENGTH];
    int score;
}st;

/* 定義每條記錄或節點的資料結構 */
typedef struct node
{
    struct Student data; //資料域
    struct node *next; //指標域
}Node,*Link;  //Node為node型別的別名,Link為node型別的指標別名

2.定義學生結構體的資料結構

typedef struct Student{
    char studentNo[NO_LENGTH];
    char studentName[NAME_LENGTH];
    int score;
}st;

3.定義每條記錄或節點的資料結構

/* 定義每條記錄或節點的資料結構 */
typedef struct node
{
    struct Student data; //資料域
    struct node *next; //指標域
}Node,*Link;  //Node為node型別的別名,Link為node型別的指標別名

4.函數介面程式碼.

1.定義提示選單

//定義提示選單
void myMenu(){

    printf("*****************************選單*****************************n"); 
    printf("***********************1 增加學生記錄*************************n"); 
    printf("***********************2 刪除學生記錄*************************n"); 
    printf("***********************3 查詢學生記錄*************************n"); 
    printf("***********************4 修改學生記錄*************************n"); 
    printf("***********************5 統計學生人數 ************************n"); 
    printf("***********************6 顯示學生記錄*************************n"); 
    printf("***********************7 資訊檔案列印*************************n");
    printf("***********************8 退出系統 ****************************n"); 
    
}

2.增加學生記錄

void inputStudent(Link l){
     printf("請輸入學生學號:");
     scanf("%s",l->data.studentNo);
     printf("請輸入學生的姓名:");
     scanf("%s",l->data.studentName);
    printf("請輸入學生的成績:");
     scanf("%s",&(l->data.score));
     //每個新建立的節點的next域都初始化為NULL
     l->next = NULL;
     system("cls");
}

3.輸入學號介面·

void inputStudentNo(char s[],char no[]){
    printf("請輸入要%s的學生學號:",s);
    scanf("%s",no);
}

4.遍歷表中學生

//遍歷表中學生 
void displayNode(Link head){
    if(head==NULL)
    {
        printf("學生為空n");
        return; 
    }
    else
    {
        Link p=head->next;
        while(p)
        {
            cout<<"姓名:"<<p->data.studentName<<"    學號"<<p->data.studentNo<<"  成績:"<<p->data.score<<endl; 
            p=p->next;
        }
        
    }
   // 填寫程式碼,根據傳入的連結串列head頭指標,掃描連結串列顯示所有節點的資訊
   system("pause");
   system("cls");
}

5.增加學生記錄

/* 增加學生記錄 */
bool addNode(Link head){
     Link p,q;   //p,q兩個節點一前一後
     Link node;  //node指標指向新建立的節點
     node=(Link)malloc(sizeof(Node));
     inputStudent(node);

     q = head;
     p = head->next;  //q指向head後面的第一個有效節點
     if(head->next==NULL)
         //連結串列為空時
        head->next = node;
     else {
         //迴圈存取連結串列中的所有節點
        while(p != NULL){
            if (node->data.studentNo < p->data.studentNo){
                //如果node節點的學號比p節點的學號小,則插在p的前面,完成插入後,提前退出子程式
                q->next = node;
                node->next = p;
                return true;
            }
            else{
                //如果node節點的學號比p節點的學號大,繼續向後移動指標(依然保持pq一前一後)
                q = p;
                p = p->next;

            }
        }
        //如果沒能提前退出迴圈,則說明之前沒有插入,那麼當前node節點的學號是最大值,此時插在連結串列的最後面
        q->next = node;

    }
     return true;
     system("pause");
   system("cls");
}

6.刪除學生資訊

//刪除學生資訊
bool deleteNode(Link head){
    // 按照給定的學號刪除學生記錄,如果刪除成功返回true,如果沒找到學號返回false

    //輸入要處理的學號
        char no[NO_LENGTH];
    inputStudentNo("刪除",no);
        Link p=head->next;
    Link q=head;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            cout<<"成功刪除該學生"<<endl; 
            q->next=p->next;
            free(p);
            system("pause");
               system("cls");
            return true;
        }
        else
        {
            q=p;
            p=p->next;
        }
    }
    cout<<"未找到該學生"<<endl; 
        system("pause");
           system("cls");
    return false;
}

7.查詢學生資訊

//查詢學生資訊 
bool queryNode(Link head){
    // 按照給定的學號查詢學生記錄,如果查詢成功返回true,如果沒找到學號返回false

    //輸入要處理的學號
    char no[NO_LENGTH];
    inputStudentNo("查詢",no);
        Link p=head->next;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            
               system("cls");
               cout<<"姓名:"<<p->data.studentName<<"    學號:"<<p->data.studentNo<<"  成績:"<<p->data.score<<endl; 
            return true;
        }
        else
        {
            p=p->next;
        }
    }
    cout<<"未找到該學生"<<endl; 
   system("cls");

    return false;
}

8.修改學生資訊

//修改學生資訊 
bool modifyNode(Link head){
    // 按照給定的學號找到學生記錄節點,如果修改成功返回true,如果沒找到學號返回false
    
    //輸入要處理的學號
    char no[NO_LENGTH];
    inputStudentNo("修改",no);
    Link p=head->next;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            cout<<"請輸入修改後的姓名"<<endl; 
            cin>>p->data.studentName;
            cout<<"請輸入修改後的學號"<<endl; 
            cin>>p->data.studentNo;
            cout<<"請輸入修改後的成績"<<endl; 
            cin>>p->data.score;
            system("cls");
            return true;
        }
        else
        {
            p=p->next;
        }
    }
    cout<<"未找到該學生,請重新輸入學號"<<endl; 
    system("cls");
    return false;
}

9.統計學生人數

//統計學生人數
int countNode(Link head){
    //統計學生人數,掃描連結串列統計節點個數,返回節點數
    Link p;
    int count = 0;
    p = head->next;
    while(p)
    {
        p=p->next;
        count++;
    }
    //填充程式碼
    system("cls");
    return count;
}

10.清空連結串列

//清空連結串列 
void clearLink(Link head){
    Link q,p;
    p=head->next;
    q=head;
    while(p)
    {
        q->next=p->next;
        free(p);
        p=q->next;
    }
        //遍歷連結串列,用free語句刪除連結串列中用malloc建立起的所有的節點
}

11.檔案操作

//學生資料檔案儲存 
//儲存任意時期的學生資料 
void Store_List(Link head)
{
    //檔案操作 
    ofstream ofs;
    ofs.open("Std_Information.txt",ios::out);
    
    if(head==NULL)
    {
        printf("學生為空n");
        return; 
    }
    else
    {
        Link p=head->next;
        while(p)
        {
            ofs<< "姓名:"<<p->data.studentName<<"    學號:"<<p->data.studentNo<<"  成績:"<<p->data.score<<endl; 
            p=p->next;
        }
        
    }
}

5.main函數

int main() {
    int select;
        int count;
    Link head;  // 定義連結串列

    //建立head頭結點,在這個程式中head指向頭結點,頭結點data部分沒有內容,其後續節點才有真正的資料
    head = (Link)malloc(sizeof(Node));
    head->next = NULL;

    while(1)
    {
        myMenu();
        printf("n請輸入你的選擇(0-7):");  //顯示提示資訊
        scanf("%d",&select);
        switch(select)
        {
        case 1:
            //增加學生記錄
            if(addNode(head))
                printf("成功插入一個學生記錄。nn");
            break;
        case 2:
            //刪除學生記錄
            if(deleteNode(head))
                printf("成功刪除一個學生記錄。nn");
            else
                printf("沒有找到要刪除的學生節點。nn");
            break;
        case 3:
            //查詢學生記錄
            if(queryNode(head))
                printf("成功找到學生記錄。nn");
            else
                printf("沒有找到要查詢的學生節點。nn");
            break;
        case 4:
            //修改學生記錄
            if(modifyNode(head))
                printf("成功修改一個學生記錄。nn");
            else
                printf("沒有找到要修改的學生節點。nn");
            break;
        case 5:
            //統計學生人數
            count = countNode(head);
            printf("學生人數為:%dnn",count);
            break;
        case 6:
            //顯示學生記錄
            displayNode(head);
            break;
        case 7:
            //退出前清除連結串列中的所有結點
            clearLink(head);
            return 0;
        default:
            printf("輸入不正確,應該輸入0-7之間的數。nn");
            system("cls"); 
            break;
        }
    }
    return 0;
}

6.學生資訊管理系統總原始碼(可直接複製執行)

#include <stdio.h>
#include<string.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdbool.h>
#include<iostream>
#include<fstream>//檔案操作所需標頭檔案 
using namespace std;
#define NO_LENGTH  20
#define NAME_LENGTH 11

/* 定義學生結構體的資料結構 */
typedef struct Student{
    char studentNo[NO_LENGTH];
    char studentName[NAME_LENGTH];
    int score;
}st;

/* 定義每條記錄或節點的資料結構 */
typedef struct node
{
    struct Student data; //資料域
    struct node *next; //指標域
}Node,*Link;  //Node為node型別的別名,Link為node型別的指標別名

//定義提示選單
void myMenu(){

    printf("*****************************選單*****************************n"); 
    printf("***********************1 增加學生記錄*************************n"); 
    printf("***********************2 刪除學生記錄*************************n"); 
    printf("***********************3 查詢學生記錄*************************n"); 
    printf("***********************4 修改學生記錄*************************n"); 
    printf("***********************5 統計學生人數 ************************n"); 
    printf("***********************6 顯示學生記錄*************************n"); 
    printf("***********************7 資訊檔案列印*************************n");
    printf("***********************8 退出系統 ****************************n"); 
    
}

void inputStudent(Link l){
     printf("請輸入學生學號:");
     scanf("%s",l->data.studentNo);
     printf("請輸入學生的姓名:");
     scanf("%s",l->data.studentName);
    printf("請輸入學生的成績:");
     scanf("%d",&(l->data.score));
     //每個新建立的節點的next域都初始化為NULL
     l->next = NULL;
     system("cls");
}

void inputStudentNo(char s[],char no[]){
    printf("請輸入要%s的學生學號:",s);
    scanf("%s",no);
}
//遍歷表中學生 
void displayNode(Link head){
    if(head==NULL)
    {
        printf("學生為空n");
        return; 
    }
    else
    {
        Link p=head->next;
        while(p)
        {
            cout<<"姓名:"<<p->data.studentName<<"    學號"<<p->data.studentNo<<"  成績:"<<p->data.score<<endl; 
            //ofs<< "姓名:"<<p->data.studentName<<"    學號"<<p->data.studentNo<<"  成績:"<<p->data.score<<endl; 
            p=p->next;
        }
        
    }
   // 填寫程式碼,根據傳入的連結串列head頭指標,掃描連結串列顯示所有節點的資訊
   system("pause");
   system("cls");
}

/* 增加學生記錄 */
bool addNode(Link head){
     Link p,q;   //p,q兩個節點一前一後
     Link node;  //node指標指向新建立的節點
     node=(Link)malloc(sizeof(Node));
     inputStudent(node);

     q = head;
     p = head->next;  //q指向head後面的第一個有效節點
     if(head->next==NULL)
         //連結串列為空時
        head->next = node;
     else {
         //迴圈存取連結串列中的所有節點
        while(p != NULL){
            if (node->data.studentNo < p->data.studentNo){
                //如果node節點的學號比p節點的學號小,則插在p的前面,完成插入後,提前退出子程式
                q->next = node;
                node->next = p;
                return true;
            }
            else{
                //如果node節點的學號比p節點的學號大,繼續向後移動指標(依然保持pq一前一後)
                q = p;
                p = p->next;

            }
        }
        //如果沒能提前退出迴圈,則說明之前沒有插入,那麼當前node節點的學號是最大值,此時插在連結串列的最後面
        q->next = node;

    }
     return true;
     system("pause");
   system("cls");
}

bool deleteNode(Link head){
    // 按照給定的學號刪除學生記錄,如果刪除成功返回true,如果沒找到學號返回false

    //輸入要處理的學號
        char no[NO_LENGTH];
    inputStudentNo("刪除",no);
        Link p=head->next;
    Link q=head;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            cout<<"成功刪除該學生"<<endl; 
            q->next=p->next;
            free(p);
            system("pause");
               system("cls");
            return true;
        }
        else
        {
            q=p;
            p=p->next;
        }
    }
    cout<<"未找到該學生"<<endl; 
system("pause");
   system("cls");
    return false;
}

//查詢學生資訊 
bool queryNode(Link head){
    // 按照給定的學號查詢學生記錄,如果查詢成功返回true,如果沒找到學號返回false

    //輸入要處理的學號
    char no[NO_LENGTH];
    inputStudentNo("查詢",no);
        Link p=head->next;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            
               system("cls");
               cout<<"姓名:"<<p->data.studentName<<"    學號:"<<p->data.studentNo<<"  成績:"<<p->data.score<<endl; 
            return true;
        }
        else
        {
            p=p->next;
        }
    }
    cout<<"未找到該學生"<<endl; 
   system("cls");

    return false;
}

//修改學生資訊 
bool modifyNode(Link head){
    // 按照給定的學號找到學生記錄節點,如果修改成功返回true,如果沒找到學號返回false
    
    //輸入要處理的學號
    char no[NO_LENGTH];
    inputStudentNo("修改",no);
    Link p=head->next;
    while(p)
    {
        if(strcmp(p->data.studentNo,no)==0)
        {
            cout<<"請輸入修改後的姓名"<<endl; 
            cin>>p->data.studentName;
            cout<<"請輸入修改後的學號"<<endl; 
            cin>>p->data.studentNo;
            cout<<"請輸入修改後的成績"<<endl; 
            cin>>p->data.score;
            system("cls");
            return true;
        }
        else
        {
            p=p->next;
        }
    }
    cout<<"未找到該學生,請重新輸入學號"<<endl; 
    system("cls");
    return false;
}

//統計學生人數
int countNode(Link head){
    //統計學生人數,掃描連結串列統計節點個數,返回節點數
    Link p;
    int count = 0;
    p = head->next;
    while(p)
    {
        p=p->next;
        count++;
    }
    //填充程式碼
    system("cls");
    return count;
}

//清空連結串列 
void clearLink(Link head){
    Link q,p;
    p=head->next;
    q=head;
    while(p)
    {
        q->next=p->next;
        free(p);
        p=q->next;
    }
        //遍歷連結串列,用free語句刪除連結串列中用malloc建立起的所有的節點
}

//學生資料檔案儲存 
//儲存任意時期的學生資料 
void Store_List(Link head)
{
    //檔案操作 
    ofstream ofs;
    ofs.open("Std_Information.txt",ios::out);
    
    if(head==NULL)
    {
        printf("學生為空n");
        return; 
    }
    else
    {
        Link p=head->next;
        while(p)
        {
            ofs<< "姓名:"<<p->data.studentName<<"    學號:"<<p->data.studentNo<<"  成績:"<<p->data.score<<endl; 
            p=p->next;
        }
        
    }
}
int main() {
    int select;
        int count;
    Link head;  // 定義連結串列
    
    
    //建立head頭結點,在這個程式中head指向頭結點,頭結點data部分沒有內容,其後續節點才有真正的資料
    head = (Link)malloc(sizeof(Node));
    head->next = NULL;

    while(1)
    {
        myMenu();
        printf("n請輸入你的選擇(0-8):");  //顯示提示資訊
        scanf("%d",&select);
        switch(select)
        {
        case 1:
            //增加學生記錄
            if(addNode(head))
                printf("成功插入一個學生記錄。nn");
            break;
        case 2:
            //刪除學生記錄
            if(deleteNode(head))
                printf("成功刪除一個學生記錄。nn");
            else
                printf("沒有找到要刪除的學生節點。nn");
            break;
        case 3:
            //查詢學生記錄
            if(queryNode(head))
                printf("成功找到學生記錄。nn");
            else
                printf("沒有找到要查詢的學生節點。nn");
            break;
        case 4:
            //修改學生記錄
            if(modifyNode(head))
                printf("成功修改一個學生記錄。nn");
            else
                printf("沒有找到要修改的學生節點。nn");
            break;
        case 5:
            //統計學生人數
            count = countNode(head);
            printf("學生人數為:%dnn",count);
            break;
        case 6:
            //顯示學生記錄
            displayNode(head);
            break;
        case 7:Store_List(head);
                cout<<"列印成功"<<endl; 
                system("pause");
                   system("cls");
            break;
        case 8:
            //退出前清除連結串列中的所有結點
            clearLink(head);
            return 0;
        default:
            printf("輸入不正確,應該輸入0-8之間的數。nn");
            system("pause");
            system("cls"); 
            break;
        }
    }
    return 0;
}

7.測試結果

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


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