學生信息管理系統C語言代碼詳解

一、項目簡介

學生信息管理系統是一個基於C語言實現的小型控制台應用程序。通過該程序,管理員可以添加、刪除、修改、查詢學生信息,還可以對學生成績數據進行統計分析。

二、代碼剖析

1. 主體函數:main()

int main() {
  int choice;
  while (1) {
    menu();
    scanf("%d", &choice);
    switch (choice) {
      case 1:
        add();
        break;
      case 2:
        del();
        break;
      case 3:
        update();
        break;
      case 4:
        search();
        break;
      case 5:
        stat();
        break;
      case 0:
        exit(0);
        break;
      default:
        printf("\n請輸入正確的選項!\n");
    }
    putchar('\n');
  }
  return 0;
}

主要是提供一個互動式界面,提供菜單選項供管理員進行學生信息管理操作,每次操作後可以繼續進行下次操作。

2. 菜單函數:menu()

void menu() {
  printf("**************************************\n");
  printf("********** 1. 新增學生信息 ***********\n");
  printf("********** 2. 刪除學生信息 ***********\n");
  printf("********** 3. 修改學生信息 ***********\n");
  printf("********** 4. 查詢學生信息 ***********\n");
  printf("********** 5. 統計分析 **************\n");
  printf("********** 0. 退出管理系統 ***********\n");
  printf("**************************************\n");
  printf("請輸入您的選項(0 ~ 5):");
}

顯示一個簡單的菜單界面,供管理員選擇學生信息管理操作。

3. 新增函數:add()

void add() {
  int num;
  char name[10];
  float score1, score2, score3;
  struct student *p, *tail;
  FILE *fp = fopen("stu.dat", "a+");
  printf("\n請輸入學生學號:");
  scanf("%d", &num);
  while (1) {
    p = head;
    while (p != NULL) {
      if (p -> num == num) {
        printf("\n該學號已存在,請重新輸入學號:");
        scanf("%d", &num);
        break;
      } else {
        p = p -> next;
      }
    }
    if (p == NULL) {
      break;
    }
  }
  printf("請輸入學生姓名:");
  scanf("%s", name);
  printf("請輸入學生三門課程的成績:\n");
  printf("高數:");
  scanf("%f", &score1);
  printf("英語:");
  scanf("%f", &score2);
  printf("C語言編程:");
  scanf("%f", &score3);
  p = (struct student *) malloc(sizeof(struct student));
  p -> num = num;
  strcpy(p -> name, name);
  p -> score[0] = score1;
  p -> score[1] = score2;
  p -> score[2] = score3;
  p -> aver = (score1 + score2 + score3) / 3.0;
  p -> next = NULL;
  if (head == NULL) {
    head = p;
  } else {
    tail = head;
    while (tail -> next != NULL) {
      tail = tail -> next;
    }
    tail -> next = p;
  }
  fwrite(p, sizeof(struct student), 1, fp);
  fclose(fp);
  printf("\n學生[%d|%s]添加成功!\n", p -> num, p -> name);
}

管理員輸入學生基本信息和成績信息,系統自動生成平均分。將學生信息以二進位形式寫入文件中,同時將學生信息添加到鏈表中。

4. 刪除函數:del()

void del() {
  int num;
  struct student *p, *prev;
  FILE *fp1 = fopen("stu.dat", "r");
  FILE *fp2 = fopen("tmp.dat", "w");
  printf("\n請輸入要刪除的學生學號:");
  scanf("%d", &num);
  p = head;
  prev = NULL;
  while (p != NULL) {
    if (p -> num == num) {
      if (p == head) {
        head = p -> next;
      } else {
        prev -> next = p -> next;
      }
      printf("\n學生[%d|%s]刪除成功!\n", p -> num, p -> name);
      free(p);
      writeToFile(fp1, fp2);
      fclose(fp1);
      fclose(fp2);
      remove("stu.dat");
      rename("tmp.dat", "stu.dat");
      return;
    } else {
      prev = p;
      p = p -> next;
    }
  }
  printf("\n沒有找到要刪除的學生!\n");
  fclose(fp1);
  fclose(fp2);
  remove("tmp.dat");
}

管理員輸入要刪除的學生學號,程序在鏈表中查找學號,找到則刪除該學生在鏈表中的節點,並將鏈表中的數據覆蓋寫入到臨時文件中。最後將臨時文件覆蓋原始文件實現刪除。

5. 修改函數:update()

void update() {
  int num;
  struct student *p;
  FILE *fp1 = fopen("stu.dat", "r");
  FILE *fp2 = fopen("tmp.dat", "w");
  printf("\n請輸入要修改的學生學號:");
  scanf("%d", &num);
  p = head;
  while (p != NULL) {
    if (p -> num == num) {
      printf("請輸入新的姓名:");
      scanf("%s", p -> name);
      printf("請輸入新的高數成績:");
      scanf("%f", &p -> score[0]);
      printf("請輸入新的英語成績:");
      scanf("%f", &p -> score[1]);
      printf("請輸入新的C語言編程成績:");
      scanf("%f", &p -> score[2]);
      p -> aver = (p -> score[0] + p -> score[1] + p -> score[2]) / 3.0;
      printf("\n學生[%d|%s]修改成功!\n", p -> num, p -> name);
      writeToFile(fp1, fp2);
      fclose(fp1);
      fclose(fp2);
      remove("stu.dat");
      rename("tmp.dat", "stu.dat");
      return;
    } else {
      p = p -> next;
    }
  }
  printf("\n沒有找到要修改的學生!\n");
  fclose(fp1);
  fclose(fp2);
  remove("tmp.dat");
}

管理員輸入要修改的學生學號,程序在鏈表中查找學號,找到後修改學生姓名和3個科目成績,更新該學生平均分,並將鏈表中的數據覆蓋寫入到臨時文件中。最後將臨時文件覆蓋原始文件實現更新。

6. 查詢函數:search()

void search() {
  int num;
  struct student *p;
  FILE *fp = fopen("stu.dat", "r");
  printf("\n請輸入要查詢的學生學號:");
  scanf("%d", &num);
  p = head;
  while (p != NULL) {
    if (p -> num == num) {
      printf("\n學生[%d|%s]\n", p -> num, p -> name);
      printf("高數成績:%.2f\n", p -> score[0]);
      printf("英語成績:%.2f\n", p -> score[1]);
      printf("C語言編程成績:%.2f\n", p -> score[2]);
      printf("平均分:%.2f\n", p -> aver);
      fclose(fp);
      return;
    } else {
      p = p -> next;
    }
  }
  printf("\n沒有找到要查詢的學生!\n");
  fclose(fp);
}

管理員輸入要查詢學生的學號,程序在鏈表中查找學號,找到後輸出該學生的學號、姓名、3個科目成績和平均分。

7. 統計函數:stat()

void stat() {
  int n = 0, sum1 = 0, sum2 = 0, sum3 = 0;
  float aver1, aver2, aver3;
  struct student *p = head;
  FILE *fp = fopen("stu.dat", "r");
  while (p != NULL) {
    n++;
    sum1 += p -> score[0];
    sum2 += p -> score[1];
    sum3 += p -> score[2];
    p = p -> next;
  }
  aver1 = (float) sum1 / n;
  aver2 = (float) sum2 / n;
  aver3 = (float) sum3 / n;
  printf("\n[統計信息]\n");
  printf("共有%d名學生\n", n);
  printf("高數平均分:%.2f\n", aver1);
  printf("英語平均分:%.2f\n", aver2);
  printf("C語言編程平均分:%.2f\n", aver3);
  fclose(fp);
}

程序對所有學生的高數、英語、C語言編程成績進行統計計算,並輸出各科目平均分。

三、總結

學生信息管理系統是一個綜合性高強度的應用程序,管理員通過該程序可以在控制台進行學生信息管理的增刪改查和統計等操作,該項目以C語言為編程語言,可以在Windows、Linux、macOS等平台上運行。以上是對該項目的詳細剖析和代碼解釋。

原創文章,作者:ULIZA,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/333208.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ULIZA的頭像ULIZA
上一篇 2025-01-27 13:34
下一篇 2025-01-27 13:35

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python字元串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字元串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字元串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變數和數…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 倉庫管理系統代碼設計Python

    這篇文章將詳細探討如何設計一個基於Python的倉庫管理系統。 一、基本需求 在著手設計之前,我們首先需要確定倉庫管理系統的基本需求。 我們可以將需求分為以下幾個方面: 1、庫存管…

    編程 2025-04-29
  • 寫代碼新手教程

    本文將從語言選擇、學習方法、編碼規範以及常見問題解答等多個方面,為編程新手提供實用、簡明的教程。 一、語言選擇 作為編程新手,選擇一門編程語言是很關鍵的一步。以下是幾個有代表性的編…

    編程 2025-04-29
  • Python實現簡易心形代碼

    在這個文章中,我們將會介紹如何用Python語言編寫一個非常簡單的代碼來生成一個心形圖案。我們將會從安裝Python開始介紹,逐步深入了解如何實現這一任務。 一、安裝Python …

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29

發表回復

登錄後才能評論