(C語言)學生信息表(基于通訊錄改版)(測試版)(C語言項目)

?1.首先是頭文件:
//student.h
//頭文件//防止頭文件被重復包含#pragma once//宏定義符號常量,方便維護和修改
#define ID_MAX 20
#define NAME_MAX 20
#define AGE_MAX 5
#define SEX_MAX 5
#define CLA_MAX 20
//定義初始最大容量
#define MAX 1//定義結構體學生
struct Student
{//定義學生信息char id[ID_MAX];char name[NAME_MAX];char age[AGE_MAX];char sex[SEX_MAX];char cla[CLA_MAX];
};//定義結構體學生信息本
struct Book
{//數據struct Student* data;//當前學生個數int sz;//當前容量int capacity;
};//項目函數聲明
void menu();
void InitBook(struct Book* stu);
void ReadBook(struct Book* stu);
void WriteBook(struct Book* stu);
void CheckBook(struct Book* stu);
void clear_screen();
void AddBook(struct Book* stu);
void ShowBook(struct Book* stu);
void CheckCapacity(struct Book* stu);
void ExitBook(struct Book* stu);
void ClearBook(struct Book* stu);
2. 然后是功能函數student.c文件
//student.c
//函數體文件//調用頭文件
#include "student.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>//定義函數體//定義清屏函數
//清屏操作
void clear_screen() {//判斷是否為Windows系統
#ifdef _WIN32system("cls");//其他系統
#elsesystem("clear");
#endif
}//菜單函數
void menu()
{printf("*********************************************\n");printf("******** 1.添加        2.刪除  **************\n");printf("******** 3.查詢        4.修改  **************\n");printf("******** 5.查看        6.排序  **************\n");printf("******** 7.清空        0.退出  **************\n");printf("*********************************************\n");
}//檢查容量是否溢出
void CheckCapacity(struct Book* stu) {if (stu->sz == 0) {printf("當前學生信息本為空!\n");}printf("當前容量為:%d\n", stu->capacity);printf("當前學生為:%d\n", stu->sz);
}//檢查容量函數
void CheckBook(struct Book* stu) {//檢查是否溢出if (stu->sz == stu->capacity) {printf("容量已滿!開始擴容!\n");int newcapacity = (stu->capacity == 0) ? MAX : stu->capacity * 2;struct Student* cap = (struct Student*)realloc(stu->data, newcapacity * sizeof(struct Student));if (cap == NULL) {printf("擴容失敗!\n");return;}stu->data = cap;stu->capacity = newcapacity;printf("擴容成功!\n");}
}//初始化學生信息函數
void InitBook(struct Book* stu) {//初始化為0或空stu->sz = 0;stu->data = NULL;stu->capacity = 0;//讀取文件信息ReadBook(stu);//如果文件沒有數據,初始化空間內存if (stu->sz == 0) {stu->data = (struct Student*)calloc(MAX, sizeof(struct Student));if (stu->data == NULL) {printf("初始化空間內存失敗!\n");return;}stu->capacity = MAX;}
}
//讀取文件函數
void ReadBook(struct Book* stu) {//打開文件FILE* fp = fopen("Studentbook.txt", "rb");if (fp == NULL) {return;}//定義一個臨時結構體struct Student tmp;while (fread(&tmp,sizeof(struct Student),1,fp)) {//檢查容量是否溢出CheckBook(stu);stu->data[stu->sz] = tmp;stu->sz++;CheckCapacity(stu);}fclose(fp);fp = NULL;
}//寫入文件
void WriteBook(struct Book* stu) {FILE* fp = fopen("Studentbook.txt", "wb");if (fp == NULL) {printf("讀取文件失敗!\n");return;}for (int i = 0; i < stu->sz; i++) {fwrite((stu->data + i), sizeof(struct Student), 1, fp);}fclose(fp);fp = NULL;
}//添加學生信息
void AddBook(struct Book* stu) {CheckBook(stu);printf("請輸入學號:");scanf("%s", stu->data[stu->sz].id);printf("請輸入姓名:");scanf("%s", stu->data[stu->sz].name);printf("請輸入年齡:");scanf("%s", stu->data[stu->sz].age);printf("請輸入性別:");scanf("%s", stu->data[stu->sz].sex);printf("請輸入班級:");scanf("%s", stu->data[stu->sz].cla);printf("添加成功!\n");(stu->sz)++;CheckCapacity(stu);
}//查詢學生信息本
void ShowBook(struct Book* stu) {CheckCapacity(stu);printf("%-19s\t%-15s\t%-5s\t%-8s\t%-30s\n", "學號","姓名", "年齡", "性別", "班級");for (int i = 0; i < stu->sz; i++) {printf("%-19s\t%-15s\t%-5s\t%-8s\t%-30s\n", stu->data[i].id,stu->data[i].name,stu->data[i].age, stu->data[i].sex, stu->data[i].cla);}
}//退出學生信息本函數
void ExitBook(struct Book* stu) {WriteBook(stu);printf("退出成功!歡迎下次使用!\n");
}//釋放空間函數
void ClearBook(struct Book* stu) {free(stu->data);stu->data = NULL;stu->sz = 0;stu->capacity = 0;
}
3.最后是主程序test.c文件:
//test.c
//測試文件//調用頭文件
#include "student.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>enum Option
{EXIT,//0,對應退出通訊錄ADD,//1,對應添加聯系人DEL,//2,對應刪除聯系人SEARCH,//3,對應查詢聯系人MODIFY,//4,對應修改聯系人SHOW,//5,對應查看通訊錄SORT,//6,對應排序通訊錄CLEAR,//7,對應清空通訊錄
};//程序主函數
int main() {//定義結構體變量struct Book stu;//初始化學生信息InitBook(&stu);int input = 0;int menu_0 = 0;do {//打印菜單while (1) {printf("************按1繼續************\n");if (scanf("%d", &menu_0) != 1 && menu_0 != 1) {printf("輸入不合法,請按1繼續\n");return 1;}clear_screen();if (menu_0 == 1){menu();break;}}printf("請選擇對應模式(0-7):\n");if (scanf("%d", &input) != 1 || input < 0 || input > 7) {printf("輸入不合法,請輸入整數0-7\n");return 1;}switch (input){case ADD: {clear_screen();AddBook(&stu);break;}case SHOW: {clear_screen();ShowBook(&stu);break;}case EXIT: {clear_screen();ExitBook(&stu);break;}default:break;}} while (input);ClearBook(&stu);return 0;
}

整個項目只有三個文件,頭文件和兩個源代碼

下面是部分重要代碼解析:

代碼結構與核心知識點

1. 頭文件?student.h
  • 知識點:頭文件保護、宏定義、結構體聲明、函數原型。

    #pragma once  // 防止重復包含
    #define ID_MAX 20  // 宏定義常量,便于維護struct Student {  // 學生信息結構體char id[ID_MAX];  // 字符串存儲,避免溢出// ...其他字段
    };struct Book {     // 學生信息管理結構體struct Student* data;  // 動態數組指針int sz;       // 當前學生數量int capacity; // 當前容量
    };void InitBook(struct Book* stu);  // 函數原型聲明
    // ...其他函數聲明
2. 核心功能文件?student.c
(1) 動態內存管理
  • 知識點realloc?擴容、calloc?初始化。

    void CheckBook(struct Book* stu) {if (stu->sz == stu->capacity) {int newcapacity = (stu->capacity == 0) ? MAX : stu->capacity * 2;  // 初始容量為 MAX=1struct Student* cap = realloc(stu->data, newcapacity * sizeof(struct Student));  // 動態擴容// ...錯誤處理}
    }
(2) 文件讀寫
  • 知識點:二進制文件操作(fread/fwrite)。

    void ReadBook(struct Book* stu) {FILE* fp = fopen("Studentbook.txt", "rb");  // 二進制讀模式while (fread(&tmp, sizeof(struct Student), 1, fp) {  // 逐條讀取數據CheckBook(stu);  // 確保內存足夠stu->data[stu->sz] = tmp;  // 存儲到動態數組stu->sz++;}// ...關閉文件
    }void WriteBook(struct Book* stu) {FILE* fp = fopen("Studentbook.txt", "wb");  // 二進制寫模式for (int i = 0; i < stu->sz; i++) {fwrite(&stu->data[i], sizeof(struct Student), 1, fp);  // 逐條寫入}// ...關閉文件
    }
(3) 用戶交互
  • 知識點:控制臺輸入、格式化輸出。

    void AddBook(struct Book* stu) {CheckBook(stu);  // 檢查容量scanf("%s", stu->data[stu->sz].id);  // 輸入學號(未限制長度,有溢出風險!)// ...其他輸入stu->sz++;  // 更新學生數量
    }void ShowBook(struct Book* stu) {printf("%-19s\t...\n", "學號");  // 格式化對齊輸出for (int i = 0; i < stu->sz; i++) {printf("%-19s\t...\n", stu->data[i].id, ...);  // 顯示所有學生}
    }
3. 主程序?test.c
  • 知識點:枚舉類型、菜單驅動、循環控制。

    enum Option { EXIT, ADD, DEL, ... };  // 用枚舉提高可讀性int main() {struct Book stu;InitBook(&stu);  // 初始化do {menu();      // 打印菜單scanf("%d", &input);  // 讀取用戶選項switch(input) {case ADD: AddBook(&stu); break;  // 調用對應功能// ...其他選項}} while (input != EXIT);ClearBook(&stu);  // 釋放內存return 0;
    }

?現在只做了3個功能,添加,查看,退出

后續將會繼續完善和更新,代碼部分運行結果如下:

容量已滿!開始擴容!
擴容成功!
請輸入學號:232
請輸入姓名:李四
請輸入年齡:13
請輸入性別:女
請輸入班級:C語言3班
添加成功!
當前容量為:4
當前學生為:3
************按1繼續************
當前容量為:4
當前學生為:3
學號                    姓名            年齡    性別            班級
1                       1               1       1               1
231                     張三            12      男              C語言2班
232                     李四            13      女              C語言3班
************按1繼續************
退出成功!歡迎下次使用!E:\Study\VS\VS Project\XIANGMU\1\StudentBook\x64\Debug\StudentBook.exe (進程 24368)已退出,代碼為 0 (0x0)。
要在調試停止時自動關閉控制臺,請啟用“工具”->“選項”->“調試”->“調試停止時自動關閉控制臺”。
按任意鍵關閉此窗口. . .

源代碼如下:?

雙葉/學生信息表

注:該代碼是本人自己所寫,可能不夠好,不夠簡便,歡迎大家指出我的不足之處。如果遇見看不懂的地方,可以在評論區打出來,進行討論,或者聯系我。上述內容全是我自己理解的,如果你有別的想法,或者認為我的理解不對,歡迎指出!!!如果可以,可以點一個免費的贊支持一下嗎?謝謝各位彥祖亦菲!!!!!??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73739.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73739.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73739.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Problem D: 抽象類

1.題目問題 2.輸入 3.輸出 4.代碼實現 補充&#xff1a; 沒錯&#xff0c;你沒看錯&#xff0c;沒有 abstract class Vehicle &#xff0c;才能過。 惡心人 答案&#xff1a; {abstract void NoOfWheels(); }class Car extends Vehicle {Overridepublic void NoOfWheels()…

UniApp開發多端應用——流式語音交互場景優化

一、問題背景&#xff1a;UniApp默認方案的局限性 在流式語音交互場景&#xff08;如AI語音助手、實時字幕生成&#xff09;中&#xff0c;UniApp默認的uni.getRecorderManager 和uni.createInnerAudioContext 存在以下瓶頸&#xff1a; 錄音端&#xff1a; 延遲高&#xff1…

docker構建并啟動前端

docker文件示例代碼&#xff1a; # Use a minimal image for development FROM node:18-alpine# Set working directory inside the container WORKDIR /app# Copy package.json and package-lock.json (or yarn.lock) into the container COPY package.json package-lock.jso…

25大唐杯賽道一本科B組大綱總結(上)

25大唐杯省賽馬上要開始&#xff0c;還沒開始準備的要抓緊了 可看我之前發的備賽攻略&#xff0c;理論的準備要先將大綱整理成思維導圖框架 然后根據重點&#xff0c;在資料中尋找&#xff0c;記憶 這里幫大家整理好了&#xff0c;后續其他組別會相繼更新 基于競賽大綱做的思…

【Python3教程】Python3基礎篇之Lambda(匿名函數)

博主介紹:?全網粉絲22W+,CSDN博客專家、Java領域優質創作者,掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域? 技術范圍:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大數據、物聯網、機器學習等設計與開發。 感興趣的可…

重試機制之指針退避策略算法

一、目的&#xff1a;隨著重試次數增加&#xff0c;逐步延長重連等待時間&#xff0c;避免加重服務器負擔。 二、計算公式&#xff1a; 每次重試的延遲時間 初始間隔 (退避基數 ^ 重試次數) 通常設置上限防止等待時間過長。 const delay Math.min(initialDelay * Math.pow…

SSE SseEmitter.completeWithError(e) 觸發的處理邏輯

在 Java 客戶端使用 OkHttp 監聽 SSE&#xff08;Server-Sent Events&#xff09; 的情況下&#xff0c;當服務端調用 SseEmitter.completeWithError(e)&#xff0c;客戶端會觸發 EventSourceListener 的 onFailure() 方法&#xff08;而不是 onError&#xff09;。 1. 服務端&…

4月手機新品前瞻,影像,性能與設計卷得起飛

在智能手機市場中,4月向來是新品頻發的黃金時段。各大手機廠商紛紛摩拳擦掌,準備推出自家的重磅機型,在影像、性能與設計等核心領域展開激烈角逐,一場沒有硝煙的“科技大戰”即將拉開帷幕。接下來,讓我們一同深入了解那些備受矚目的新品,提前感受科技進步帶來的魅力。 一…

設計審查效率革命|CAD原生數據直通自動公差驗證

“為何 90% 的 GD&T 問題在設計評審時未被發現&#xff1f;怎樣避免因 GD&T 考慮不周導致的批量返工&#xff1f;” 這正是 CETOL 自動輔助審查設計系統要解決的核心問題&#xff1a;通過200結構化審查規則攔截潛在設計疏漏。 功能一&#xff1a;裝配約束健康診斷&…

k8s scheduler幾種擴展方式的關系及區別

網上關于scheduler擴展介紹的文章很多&#xff0c;但都是東說一句西說一嘴&#xff0c;完全沒有邏輯性&#xff0c;對于邏輯建構者看著很痛苦&#xff0c;這篇文章不會深入教你怎么擴展&#xff0c;而是教你幾種擴展方式的關系和邏輯結構&#xff1a; 目前Kubernetes支持五種方…

近場探頭的選型

近場探頭包括磁場探頭和電場探頭。 下圖中畫圈的是電場探頭&#xff1a; 左側3只是磁場探頭&#xff0c;最右側一只是電場探頭。不同孔徑的磁場探頭的有效測量距離和分辨率不同 電場探頭和磁場探頭分別在什么情況下使用&#xff1a; 一般近場測試&#xff0c;使用的都是磁場探…

Pycharm運行時報“Empty suite”,可能是忽略了這個問題

問題&#xff1a;使用Pycharm運行testcases目錄下的.py文件&#xff0c;報“Empty suite”&#xff0c;沒有找到測試項。 排查過python解釋器、pytest框架安裝等等&#xff0c;依然報這個錯&#xff0c;依然沒找到&#xff0c;最后終端運行&#xff1a; pytest test_demo.py&a…

鴻蒙北向應用開發:deveco 5.0 kit化文件相關2

鴻蒙北向應用開發:deveco 5.0 kit化文件相關 在kit化時,有時候會出現這樣一種場景即你想把已有的d.ts導出換個名字,這樣從名字上更貼合你的kit聚合 什么意思呢?比如現在有 ohos.hilog.d.ts 導出了hilog,現在你想kit化hilog,使得hilog導出名字為usrhilog,這樣用戶在使用你的k…

《Python實戰進階》No37: 強化學習入門:Q-Learning 與 DQN-加餐版1 Q-Learning算法可視化

在《Python實戰進階》No37: 強化學習入門&#xff1a;Q-Learning 與 DQN 這篇文章中&#xff0c;我們介紹了Q-Learning算法走出迷宮的代碼實踐&#xff0c;本文加餐&#xff0c;把Q-Learning算法通過代碼可視化呈現。我嘗試了使用Matplotlib實現&#xff0c;但局限于Matplotli…

Linux 搭建dns主域解析,和反向解析

#!/bin/bash # DNS主域名服務 # user li 20250325# 檢查當前用戶是否為root用戶 # 因為配置DNS服務通常需要較高的權限&#xff0c;只有root用戶才能進行一些關鍵操作 if [ "$USER" ! "root" ]; then# 如果不是root用戶&#xff0c;輸出錯誤信息echo "…

GenBI 中如何引入 LLM 做意圖路由,區分查數據還是閑聊

寫在前面 生成式商業智能(Generative BI, GenBI)的魅力在于其能夠理解用戶的自然語言,并將復雜的數據查詢和分析過程自動化。用戶不再需要學習 SQL 或操作復雜的界面,只需像與同事交談一樣提出問題,就能獲得數據洞察。然而,一個現實的挑戰是:用戶的輸入并非總是明確的數…

OmniPlan Pro for Mac 項目管理流程

OmniPlan Pro for Mac 項目管理流程 文章目錄 OmniPlan Pro for Mac 項目管理流程一、介紹二、效果三、下載 一、介紹 OmniPlan Pro mac是一款項目管理流程軟件。能被用來優化資源、精簡預算快速共享或添加任務&#xff0c;旨在能夠幫助您可視化維護和簡化項目&#xff0c;包含…

人工智能之數學基礎:矩陣的相似變換

本文重點 矩陣的相似變換是線性代數中一個至關重要的概念,它揭示了矩陣之間的一種特殊關系,并通過可逆矩陣將一個矩陣轉化為另一個相似矩陣,同時保持矩陣的某些本質特征不變。在機器學習領域,矩陣的相似變換發揮著不可或缺的作用,廣泛應用于數據降維、聚類分析、分類推薦…

2025藍橋杯備賽Day12——P8598 [藍橋杯 2013 省 AB] 錯誤票據

&#x1f50d; 2025藍橋杯備賽Day12——P8598 [藍橋杯 2013 省 AB] 錯誤票據 &#x1f680; 題目速覽 題目難度&#xff1a;??&#xff08;適合掌握基礎字符串處理與數組操作&#xff09; 考察重點&#xff1a;輸入處理、數組排序、邏輯判斷 P8598 [藍橋杯 2013 省 AB] 錯…

3.28日,NBA,歐籃聯全掃盤,太陽VS森林狼

3.28日歐籃聯掃盤 301費內巴切 vs 巴斯克 (-10.5)&#xff0c;總分預設&#xff1a;170.5 背景&#xff1a;比賽于2025年3月28日在費內巴切的烏爾克體育館舉行&#xff0c;費內巴切為主隊。根據EuroLeague排名&#xff0c;費內巴切位列第二&#xff08;21勝10負&#xff09;&am…