首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言實現面向對象生日統計:結構體封裝與排序算法完整方案

     編輯:程式設計綜合問答

題目需求分析

輸入若干學生(姓名、出生年月日),輸出生日相同的學生總數。要求用 C 語言模擬面向對象:封裝日期結構、重載比較運算、學生結構包含日期。

核心數據結構設計

// 日期結構:封裝年月日,提供比較函數
typedef struct {
    int year, month, day;
    int key; // 年*10000 + 月*100 + 日,便於快速比較
} Date;

// 學生結構:包含姓名指針與日期結構
typedef struct {
    char *name;
    Date birthday;
} Student;

// 學生列表:動態數組
typedef struct {
    Student *data;
    int count, capacity;
} StudentList;

關鍵操作函數實現

// 日期初始化並計算 key
Date make_date(int y, int m, int d) {
    Date dt = {y, m, d, y*10000 + m*100 + d};
    return dt;
}

// 學生創建
Student make_student(const char *name, int y, int m, int d) {
    Student s;
    s.name = strdup(name); // 需後續 free
    s.birthday = make_date(y, m, d);
    return s;
}

// 比較函數:供 qsort 使用
int cmp_student(const void *a, const void *b) {
    return ((Student*)a)->birthday.key - ((Student*)b)->birthday.key;
}

// 統計相同生日總人數
int count_same_birthday(StudentList *list) {
    if (list->count == 0) return 0;
    qsort(list->data, list->count, sizeof(Student), cmp_student);
    
    int total = 0;
    int i = 0;
    while (i < list->count) {
        int j = i + 1;
        while (j < list->count && list->data[j].birthday.key == list->data[i].birthday.key)
            j++;
        int group_size = j - i;
        if (group_size > 1) total += group_size; // 只有同組>1人才計入
        i = j;
    }
    return total;
}

完整主程序示例

int main() {
    StudentList list = {0};
    list.capacity = 10;
    list.data = malloc(list.capacity * sizeof(Student));
    
    // 示例數據(實際可從 stdin 讀取)
    list.data[list.count++] = make_student("XiaoZhang", 1994, 5, 1);
    list.data[list.count++] = make_student("XiaoWang", 1994, 5, 1);
    list.data[list.count++] = make_student("XiaoLi", 1994, 6, 3);
    list.data[list.count++] = make_student("XiaoChen", 1994, 6, 3);
    list.data[list.count++] = make_student("XiaoDong", 1994, 8, 1);
    
    int result = count_same_birthday(&list);
    printf("生日相同的學生總數:%d\n", result); // 輸出 4
    
    // 釋放內存
    for (int i = 0; i < list.count; i++) free(list.data[i].name);
    free(list.data);
    return 0;
}

算法複雜度與優化方向

方案時間複雜度空間複雜度備註
排序+線性掃描O(n log n)O(1) 額外通用、穩定
哈希表計數O(n) 平均O(n)需實現哈希表或用第三方庫
位圖/計數排序O(n + range)O(range)生日範圍固定(365*年數)可行

C 語言模擬 OOP 核心技巧總結

  • 封裝:結構體 + 操作函數(首參數傳結構體指針)
  • 繼承:結構體首字段嵌入父結構體
  • 多態:結構體包含函數指針表(虛表)
  • 構造/析構:init()/destroy() 約定俗成命名
  • 運算符重載:對應比較/運算函數,配合 qsort/bsearch
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved