🌟 嗨,我是LucianaiB!
🌍 總有人間一兩風,填我十萬八千夢。
🚀 路漫漫其修遠兮,吾將上下而求索。
C語言之高校學生信息快速查詢系統的實現
目錄
- 任務陳述與分析
- 問題陳述
- 問題分析
- 數據結構設計
- 邏輯結構
- 存儲結構
- 算法設計
- 整體設計思路
- 模塊代碼實現
- 運行截圖與說明
- 主界面
- 添加學生
- 刪除學生
- 查詢學生
- 顯示所有學生
- 數據持久化
- 退出系統
- 系統說明
- 編程環境
- 數據持久化
- 性能優化
- 小結
任務陳述與分析
問題陳述:
在高校環境中,隨著學生數量的增加,傳統的線性搜索方法在查找效率上顯得力不從心。為了提高查詢效率,需要設計一個能夠快速響應不同查詢條件的學生信息管理系統。該系統需要有效管理大量學生數據,并能夠根據特定的查詢條件快速定位目標信息。
問題分析:
設計一個高效的學生信息查詢系統需要解決以下幾個關鍵問題:
- 數據結構選擇:選擇合適的數據結構來存儲學生信息,以支持快速的增刪改查操作。
- 查詢效率:系統應能夠快速響應各種查詢請求,包括但不限于按學號、姓名、學院、專業等條件的查詢。
- 用戶界面:提供簡潔明了的用戶界面,使用戶能夠輕松進行查詢和其他操作。
- 數據持久化:學生信息需要能夠持久化存儲,即使系統重啟后也能保留數據。
- 性能優化:隨著數據量的增加,系統性能可能會下降,需要考慮性能優化措施。
- 安全性:保護學生信息的安全,防止未授權訪問和數據泄露。
- 可擴展性:系統設計應考慮未來可能的功能擴展,如增加新的查詢條件或集成新的數據源。
數據結構設計
邏輯結構:
學生信息的邏輯結構通過 Student
結構體定義,包含學生的基本信息和用于查詢的特定信息。具體字段包括:
student_id
:學生的唯一標識符。name
:學生的姓名。gender
:學生的性別。college
:學生所屬的學院。major
:學生的專業。class_name
:學生所在的班級。avg_score
:學生的平均成績。
typedef struct {char student_id[20];char name[50];char gender[10];char college[50];char major[50];char class_name[10];float avg_score;
} Student;
存儲結構:
系統的存儲結構由以下兩個主要部分組成:
students
數組:用于存儲所有學生的信息,具有MAX_STUDENTS
的最大容量限制。student_count
變量:記錄當前存儲在students
數組中的學生數量。
算法設計
整體設計思路:
系統采用哈希表或平衡二叉樹(如 AVL 樹)作為底層數據結構,以提高查詢效率。對于更復雜的數據結構,可以考慮使用關系型數據庫來實現數據持久化。
模塊代碼實現:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>#define MAX_STUDENTS 1000Student students[MAX_STUDENTS];
int student_count = 0;void searchStudentsByCollege() {char college[50];printf("Enter college to search students: ");scanf("%49s", college);int found = 0;for (int i = 0; i < student_count; i++) {if (strcmp(students[i].college, college) == 0) {printf("ID: %s, Name: %s, College: %s\n", students[i].student_id, students[i].name, students[i].college);found++;}}if (!found) {printf("No students found in this college.\n");}
}void displayAllStudents() {for (int i = 0; i < student_count; i++) {printf("ID: %s, Name: %s, College: %s\n", students[i].student_id, students[i].name, students[i].college);}
}void saveToFile(const char* filename) {FILE *file = fopen(filename, "w");if (!file) {perror("Error opening file");return;}for (int i = 0; i < student_count; i++) {fprintf(file, "ID: %s, Name: %s, College: %s\n", students[i].student_id, students[i].name, students[i].college);}fclose(file);printf("Data saved successfully.\n");
}
運行截圖與說明
1.主界面
2.加入
3.刪除
4.查看信息
5.顯示所有學生
6.保存
7.退出
系統說明
- 編程環境:Visual Studio 2022。
- 數據持久化:使用文件系統存儲學生信息。
- 性能優化:通過哈希表或平衡二叉樹提高查詢效率。
小結
本學生信息管理系統是一個用C語言編寫的簡單而實用的程序,旨在幫助用戶管理學生數據。系統提供了以下核心功能:
- 添加學生:用戶可以輸入學生的各項信息,并將其存儲在內存中。
- 刪除學生:通過學生ID刪除特定的學生記錄。
- 查詢學生:支持按學院名稱搜索學生。
- 顯示所有學生:顯示所有存儲在內存中的學生信息。
- 數據持久化:將學生數據保存到文件中,確保數據不會因程序關閉而丟失。
盡管該系統提供了基本的 CRUD(創建、讀取、更新、刪除)操作,但它還有改進的空間,例如增加數據驗證、錯誤處理機制、更復雜的查詢功能以及用戶友好的圖形界面。
參考文獻
- 大廠性能優化的10大頂級方案 (萬字圖文史上最全)-阿里云開發者社區
- 通過關系型數據庫實現數據持久化-應用數據持久化-ArkData(方舟數據管理)-應用框架
- 數據結構教程:初學者必備指南_慕課手記
- AI智能客服實戰詳解從零到一搭建系統
- Python語言之學生信息管理系統設計-騰訊云開發者社區-騰訊云
附錄代碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define MAX_MENU 100 // 定義菜單項的最大數量
#define MAX_ORDER 100 // 定義訂單的最大數量// 定義菜單項結構體
typedef struct {int id; // 菜品IDchar name[50]; // 菜品名稱float price; // 菜品價格
} MenuItem;// 定義訂單結構體
typedef struct {int order_id; // 訂單IDchar customer_phone[20]; // 顧客電話char customer_name[50]; // 顧客姓名char address[100]; // 顧客地址char order_time[20]; // 訂單時間MenuItem items[MAX_MENU]; // 訂單包含的菜品列表int items_count; // 訂單中菜品的數量float total_amount; // 訂單總金額
} Order;// 定義全局變量
MenuItem menu[MAX_MENU] = {0};
Order orders[MAX_ORDER] = {0};
int menu_count = 0;
int order_count = 0;// 函數聲明
void addMenuItem(); // 添加菜單項
void modifyMenuItem(int id); // 修改菜單項
void displayMenu(); // 顯示菜單
void placeOrder(); // 下訂單
void cancelOrder(int order_id); // 取消訂單
void searchOrderByID(int order_id); // 通過訂單ID搜索訂單
void searchOrderByPhone(const char *phone); // 通過電話號碼搜索訂單
void statistics(); // 統計信息
void applyDiscount(float *amount); // 應用折扣
void printOrder(const Order *order); // 打印訂單詳情
void clearOrder(Order *order); // 清除訂單數據// 主函數
int main() {int choice;do {printf("\n1. 添加/修改菜單項\n2. 下訂單\n3. 取消訂單\n4. 搜索訂單\n5. 統計信息\n6. 退出\n");printf("輸入你的選擇: ");scanf("%d", &choice);switch (choice) {case 1:addMenuItem();break;case 2:placeOrder();break;case 3:printf("輸入要取消的訂單ID: ");scanf("%d", &choice);cancelOrder(choice);break;case 4:printf("通過 (1) 訂單ID 或 (2) 電話號碼搜索: ");scanf("%d", &choice);if (choice == 1) {int order_id;printf("輸入訂單ID: ");scanf("%d", &order_id);searchOrderByID(order_id);} else if (choice == 2) {char phone[20];printf("輸入電話號碼: ");scanf("%s", phone);searchOrderByPhone(phone);}break;case 5:statistics();break;case 6:printf("退出系統.\n");break;default:printf("無效選擇,請重新輸入.\n");}} while (choice != 6);return 0;
}// 添加菜單項
void addMenuItem() {if (menu_count >= MAX_MENU) {printf("菜單已滿,無法添加更多菜品。\n");return;}printf("輸入菜品ID,名稱和價格: ");scanf("%d %49s %f", &menu[menu_count].id, menu[menu_count].name, &menu[menu_count].price);menu_count++;
}// 修改菜單項
void modifyMenuItem(int id) {for (int i = 0; i < menu_count; i++) {if (menu[i].id == id) {printf("輸入新的名稱和價格: ");scanf("%49s %f", menu[i].name, &menu[i].price);return;}}printf("未找到菜品。\n");
}// 顯示菜單
void displayMenu() {printf("菜單:\n");for (int i = 0; i < menu_count; i++) {printf("%d. %s - $%.2f\n", menu[i].id, menu[i].name, menu[i].price);}
}// 下訂單
void placeOrder() {if (order_count >= MAX_ORDER) {printf("訂單數量已達上限,無法下新訂單。\n");return;}int item_id;float total = 0;orders[order_count].items_count = 0;displayMenu();printf("輸入顧客的電話、姓名、地址和下單時間: ");scanf("%19s %49s %99s %19s", orders[order_count].customer_phone, orders[order_count].customer_name, orders[order_count].address, orders[order_count].order_time);while (1) {printf("輸入菜品ID(0結束): ");scanf("%d", &item_id);if (item_id == 0) break;for (int i = 0; i < menu_count; i++) {if (menu[i].id == item_id) {if (orders[order_count].items_count < MAX_MENU) {orders[order_count].items[orders[order_count].items_count++] = menu[i];total += menu[i].price;} else {printf("一個訂單中不能添加超過 %d 個菜品。\n", MAX_MENU);break;}}}}applyDiscount(&total);orders[order_count].total_amount = total;orders[order_count].order_id = order_count + 1; // 簡單的訂單ID生成邏輯printf("訂單成功創建。訂單ID: %d\n", orders[order_count].order_id);order_count++;
}// 取消訂單
void cancelOrder(int order_id) {for (int i = 0; i < order_count; i++) {if (orders[i].order_id == order_id) {printf("訂單 %d 已取消。\n", order_id);clearOrder(&orders[i]); // 清除訂單數據for (int j = i; j < order_count - 1; j++) {memcpy(&orders[j], &orders[j + 1], sizeof(Order));}order_count--;return;}}printf("未找到訂單。\n");
}// 通過訂單ID搜索訂單
void searchOrderByID(int order_id) {int found = 0; // 用于標記是否找到訂單for (int i = 0; i < order_count; i++) {if (orders[i].order_id == order_id) {printOrder(&orders[i]);found = 1; // 標記找到訂單break;}}if (!found) {printf("沒有找到訂單。\n");}
}// 通過電話號碼搜索訂單
void searchOrderByPhone(const char *phone) {int found = 0; // 用于標記是否找到訂單for (int i = 0; i < order_count; i++) {if (strcmp(orders[i].customer_phone, phone) == 0) {printOrder(&orders[i]);found = 1; // 標記找到訂單}}if (!found) {printf("沒有找到該電話號碼的訂單。\n");}
}// 統計信息
void statistics() {// 示例統計信息 - 可以根據實際需求擴展int order_count_per_item[MAX_MENU] = {0};float total_revenue = 0;for (int i = 0; i < order_count; i++) {total_revenue += orders[i].total_amount;for (int j = 0; j < orders[i].items_count; j++) {int item_id = orders[i].items[j].id;order_count_per_item[item_id]++;}}printf("今日總收入: %.2f\n", total_revenue);for (int i = 0; i < menu_count; i++) {if (order_count_per_item[menu[i].id] > 0) {printf("%s 被訂購了 %d 次。\n", menu[i].name, order_count_per_item[menu[i].id]);}}
}// 應用折扣
void applyDiscount(float *amount) {if (*amount > 300) *amount *= 0.85f;else if (*amount > 200) *amount *= 0.9f;else if (*amount > 100) *amount *= 0.95f;
}// 打印訂單詳情
void printOrder(const Order *order) {if (order == NULL) {printf("訂單為空。\n");return;}// 打印訂單頭部信息printf("訂單ID: %d\n", order->order_id);printf("顧客電話: %s\n", order->customer_phone);printf("顧客姓名: %s\n", order->customer_name);printf("地址: %s\n", order->address);printf("下單時間: %s\n", order->order_time);// 檢查是否有訂單項if (order->items_count == 0) {printf("該訂單沒有包含任何菜品。\n");} else {printf("訂單項:\n");for (int i = 0; i < order->items_count; i++) {// 打印每個訂單項的名稱和價格printf(" - %s ($%.2f)\n", order->items[i].name, order->items[i].price);}}// 打印訂單總金額printf("總金額: $%.2f\n", order->total_amount);
}
// 清除訂單數據
void clearOrder(Order *order) {memset(order, 0, sizeof(Order));
}?
嗨,我是[LucianaiB](https://lucianaib.blog.csdn.net/ “LucianaiB”)。如果你覺得我的分享有價值,不妨通過以下方式表達你的支持:👍 點贊來表達你的喜愛,📁 關注以獲取我的最新消息,💬 評論與我交流你的見解。我會繼續努力,為你帶來更多精彩和實用的內容。
點擊這里👉[LucianaiB](https://lucianaib.blog.csdn.net/ “LucianaiB”) ,獲取最新動態,?? 讓信息傳遞更加迅速。