首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言實戰:陣列與指標應用的成績統計系統設計

     編輯:關於C語言

專案背景

在嵌入式開發學習一年後,發現雖掌握 Linux、ARM、驅動等課程,但動手寫代碼能力仍薄弱。決定透過「C語言小設計」系列,從淺入深鞏固核心知識。本專案聚焦陣列、指標陣列、動態記憶體管理,實現班級成績統計功能。

需求分析

原始資料

科目平均分
數學75
物理80
外語83
政治85
體育86
人數30

輸出要求

  • 全班各科平均成績列表
  • 人數、平均成績、最低分科目及分數

資料結構設計

陣列用途說明
int *a數值資料5科分數 + 人數 + 平均分 + 最低分 = 8 個整數
char *name[6]科目名稱5科 + "科目"標題
char *mean_low[4]統計項標題人數、平均成績、最低分、最低分科目

三種實現層次

  1. 陣列版:靜態陣列 + 指標陣列操作
  2. 動態記憶體版:malloc 分配 a 陣列,指標存取運算
  3. 全動態版:字串亦動態分配,指標完整管理

本文展示第 2 種:核心數值動態分配,字串用靜態指標陣列。

核心代碼實現

主程式架構

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define SUB_NUM 5

void init_name(char *name[]);
void init_mean_low(char *mean_low[]);
void input_message(char *name[], char *mean_low[], int *a);
void analysis_message(int *a, char *name[]);
void print_message(char *name[], char *mean_low[], int *a);
void recycle_memory(char *name[], char *mean_low[], int *a);

int main() {
    int *a = (int *)malloc(8 * sizeof(int));
    memset(a, 0, 8 * sizeof(int));

    char *name[SUB_NUM + 1];
    char *mean_low[4];

    init_name(name);
    init_mean_low(mean_low);
    input_message(name, mean_low, a);
    analysis_message(a, name);
    print_message(name, mean_low, a);
    recycle_memory(name, mean_low, a);

    return 0;
}

初始化函式

void init_name(char *name[]) {
    name[0] = "數學"; name[1] = "物理"; name[2] = "外語";
    name[3] = "政治"; name[4] = "體育"; name[5] = "科目";
}

void init_mean_low(char *mean_low[]) {
    mean_low[0] = "人數"; mean_low[1] = "平均成績";
    mean_low[2] = "最低分科目成績"; mean_low[3] = "最低分科目";
}

輸入驗證模組

void input_message(char *name[], char *mean_low[], int *a) {
    int i;
    printf("請輸入各科成績:\n");
    for (i = 0; i < SUB_NUM; i++) {
        printf("%s: ", name[i]);
        scanf("%d", a + i);
        while (a[i] > 100 || a[i] < 0) {
            printf("輸入錯誤,重新輸入\n%s: ", name[i]);
            scanf("%d", a + i);
        }
    }
    printf("請輸入班級人數: ");
    scanf("%d", a + SUB_NUM);  // a[5] 存人數
}

統計分析核心

void analysis_message(int *a, char *name[]) {
    int i, sum = 0, min = 200, min_idx = 0;
    for (i = 0; i < SUB_NUM; i++) {
        sum += a[i];
        if (a[i] < min) { min = a[i]; min_idx = i; }
    }
    a[SUB_NUM + 1] = sum / SUB_NUM;  // 平均分 → a[6]
    a[SUB_NUM + 2] = min;            // 最低分 → a[7]
    name[SUB_NUM] = name[min_idx];   // 最低分科目名 → name[5]
}

結果輸出與記憶體釋放

void print_message(char *name[], char *mean_low[], int *a) {
    int i;
    printf("分析結果:\n");
    for (i = 0; i < SUB_NUM; i++)
        printf("%s:%d\n", name[i], a[i]);
    printf("人數:%d\n平均成績:%d\n最低科目成績:%d\n最低科目:%s\n",
           a[SUB_NUM], a[SUB_NUM+1], a[SUB_NUM+2], name[SUB_NUM]);
}

void recycle_memory(char *name[], char *mean_low[], int *a) {
    free(a); a = NULL;
    // 注意:name/mean_low 指向字串常量,不可 free
    // 若為動態分配字串,需逐個釋放
}

關鍵知識點總結

  • 指標陣列:char *name[] 存放字串地址,靈活引用
  • 指標算術:a+i 等價 &a[i],簡化存取
  • 動態記憶體:malloc/free 配對,防洩漏
  • 模組化設計:功能拆分為獨立函式,降低耦合

擴展練習

  1. 將字串陣列亦改為動態分配(strdup 或 malloc+strcpy)
  2. 增加最高分統計、標準差計算
  3. 支援多班級資料,建立二維動態陣列
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved