目錄
1.主要框架
2.寫入文件
3.讀取文件
4.注冊學生信息
5.增加學生信息
6.刪除學生信息
7.按姓名查詢
8.按班級查詢
9.按專業查詢
10.打印學生信息
11.完整代碼
🌈嗨!我是Filotimo__🌈。很高興與大家相識,希望我的博客能對你有所幫助。
💡本文由Filotimo__??原創,首發于CSDN📚。
📣如需轉載,請事先與我聯系以獲得授權??。
🎁歡迎大家給我點贊👍、收藏??,并在留言區📝與我互動,這些都是我前進的動力!
🌟我的格言:森林草木都有自己認為對的角度🌟。
完整代碼在最后面。
這次我們的目標是用C語言實現新生報道注冊管理信息系統。
這是我們要用到 C 語言中的三個頭文件,分別是:
#include <stdio.h>:它包含了一些輸入輸出的函數,例如printf()和scanf()。
#include <stdlib.h>:它包含了實用的函數,例如動態內存分配函數malloc() 和free()。
#include <string.h>:它包含了一些操作字符串的函數,例如strcpy() 和strcat()。
1.主要框架
我們首先定義了一個表示學生的結構體,然后聲明了要用到的函數,接著編寫主函數,搭建好了大致的系統框架:
// 定義一個表示學生的結構體
struct student {char nam[10]; // 學生姓名char sex[4]; // 學生性別char spec[20]; // 學生專業char classid[10]; // 學生班級IDchar phone[15]; // 學生電話號碼char bedroom[8]; // 學生宿舍號碼
};// 函數聲明
void createdata(struct student *stu, int *len); // 注冊學生信息
void add(struct student *stu, int *len); // 增加學生信息
void delete_student(struct student *stu, int *len); // 刪除學生信息
void search_name(struct student *stu, int len); // 按姓名查詢
void search_class(struct student *stu, int len); // 按班級查詢
void search_specialty(struct student *stu, int len); // 按專業查詢
void print_fun(struct student *stu, int len); // 打印學生信息// 主函數
int main() {int choice;struct student p[1024];int len = 0;while (1) {printf("\n 新生報到信息注冊系統\n\n");printf("**********************************************************************\n");printf("1. 注冊學生信息\n");printf("2. 增加學生信息\n");printf("3. 刪除學生信息\n");printf("4. 按姓名查詢\n");printf("5. 按班級查詢\n");printf("6. 按專業查詢\n");printf("7. 打印學生信息\n");printf("8. 退出系統\n");printf("**********************************************************************\n");printf("請輸入選項:");scanf("%d", &choice);switch (choice) {case 1: // 注冊學生信息createdata(p, &len);break;case 2: // 增加學生信息add(p, &len);break;case 3: // 刪除學生信息delete_student(p, &len);break;case 4: // 按姓名查詢search_name(p, len);break;case 5: // 按班級查詢search_class(p, len);break;case 6: // 按專業查詢search_specialty(p, len);break;case 7: // 打印學生信息print_fun(p, len);break;case 8: // 退出系統printf("謝謝您的使用!\n\n");exit(0); // 退出程序default:printf("輸入有誤!請重新輸入。\n\n");break;}}return 0;
}
接下來,我們要編寫前面聲明了的函數。
2.寫入文件
// 定義一個名為regis的函數
// 參數為一個指向struct student類型的指針p和一個整型變量len
void regis(struct student *p, int len) {// 定義一個FILE類型的指針,用于打開/關閉文件FILE *fp;// 打開名為student_info.txt的文件,使用寫入模式打開,即將內容寫入到文件尾部fp = fopen("student_info.txt", "w");// 循環遍歷學生信息數組for (int i = 0; i < len; i++) {// 將學生信息按指定格式寫入到文件中fprintf(fp, "%s %s %s %s %s %s\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);}// 關閉文件fclose(fp);
}
函數regis用于將結構體數組中的數據寫入到文件中。它首先使用fopen函數打開一個名為"student_info.txt"的文件,并指定模式為"w",表示以寫入方式打開文件。然后,使用fprintf函數將結構體數組中的數據按照指定的格式寫入文件。最后,使用fclose函數關閉文件。
3.讀取文件
// 定義一個名為read_data的函數
// 參數為一個指向struct student類型的指針p和一個指向整型變量len的指針
void read_data(struct student *p, int *len) {// 定義一個FILE類型的指針,用于打開/關閉文件FILE *fp;// 打開名為student_info.txt的文件,使用讀取模式打開fp = fopen("student_info.txt", "r");// 檢查文件是否打開成功if (fp == NULL) {printf("文件打開失敗\n");return;}// 循環讀取文件中的學生信息,直到遇到文件結尾或讀取出錯while (fscanf(fp, "%s %s %s %s %s %s", p[*len].nam, p[*len].sex, p[*len].spec, p[*len].classid, p[*len].phone, p[*len].bedroom) == 6) {// 每讀取一行信息,增加len的值(*len)++;}// 關閉文件fclose(fp);
}
函數read_data用于從文件中讀取數據并存入結構體數組中。它首先使用fopen函數打開名為"student_info.txt"的文件,并指定模式為"r",表示以只讀方式打開文件。然后,它使用fscanf函數按照指定的格式逐行讀取文件中的數據,并將讀取的數據存入結構體數組p中的相應位置。同時,使用指針len來記錄讀取的數據行數。最后,使用fclose函數關閉文件。
regis和read_data這兩個函數配合使用可以實現將結構體數組中的數據寫入文件,以及從文件中讀取數據并存入結構體數組中的功能。
4.注冊學生信息
void createdata(struct student *p, int *len) {int n; // 定義變量n,用于存儲學生人數printf("報到學生人數:");scanf("%d", &n); // 從用戶輸入中獲取學生人數信息printf("請輸入學生信息:\n");// 循環獲取每個學生的信息,共n次for (int i = 0; i < n; i++) {printf("學生%d:\n", i+1);printf("姓名:");scanf("%s", p[i].nam);printf("性別:");scanf("%s", p[i].sex);printf("專業:");scanf("%s", p[i].spec);printf("班級:");scanf("%s", p[i].classid);printf("電話號碼:");scanf("%s", p[i].phone);printf("宿舍號:");scanf("%s", p[i].bedroom);printf("\n");}*len = n; // 將len的值設為學生人數nregis(p, n); // 將學生信息寫入文件
}
首先,該函數會從用戶輸入中獲取學生人數,并將其存儲在變量`n`中。然后,函數會通過循環獲取每個學生的信息,并將其存儲在結構體數組`p`的相應位置。每次循環,函數會提示用戶輸入學生的姓名、性別、專業、班級、電話號碼和宿舍號,并使用`scanf`函數讀取用戶的輸入。接下來,函數將學生人數`n`存儲到通過指針`len`傳遞的變量中,以便在后續的代碼中可以使用。然后,函數會調用`regis`函數,將結構體數組中的學生信息寫入文件中。
5.增加學生信息
void add(struct student *p, int *len) {int c = 1; // 定義變量c,用于存儲用戶的選擇// 循環添加學生信息,直到用戶選擇退出while (c == 1) {int mylen = *len; // 將len的值賦給mylenstruct student st; // 定義一個struct student類型的變量st,用于存儲要添加的學生信息printf("請輸入要添加學生的信息:\n");printf("姓名:");scanf("%s", st.nam);printf("性別:");scanf("%s", st.sex);printf("專業:");scanf("%s", st.spec);printf("班級:");scanf("%s", st.classid);printf("電話號碼:");scanf("%s", st.phone);printf("宿舍號:");scanf("%s", st.bedroom);printf("\n");p[mylen] = st; // 將學生信息添加到數組p的末尾*len = mylen + 1; // 將len的值增加1print_fun(p, *len); // 打印所有學生的信息printf("\n");printf("是否繼續添加?輸入:\n1.繼續\n2.退出\n");scanf("%d", &c); // 獲取用戶的選擇}regis(p, *len); // 將學生信息寫入文件
}
函數首先定義變量c,用于存儲用戶的選擇,然后通過循環添加學生信息,直到用戶選擇退出。循環內部,函數先將指針len指向的值存儲到變量mylen中,然后定義一個新的結構體變量st,用來存儲要添加的學生信息。接著,函數會提示用戶輸入要添加的學生信息,使用scanf函數獲取用戶的輸入,并將輸入的信息存儲到結構體變量st中。然后,將st所存儲的學生信息添加到原有學生信息的結構體數組p的末尾。另外,通過指針len傳遞的值增加1,以便在后續的代碼中可以使用。
接下來,函數調用print_fun函數,將所有學生的信息打印出來以便修改驗證。然后,函數會提示用戶選擇是否繼續添加,如果用戶選擇退出,則跳出循環。最后,函數調用regis函數將更新后的學生信息寫入文件中,以便下次使用時可以使用。
6.刪除學生信息
void delete_student(struct student *p, int *len) {char nam[10]; // 定義一個字符數組,用于存儲要刪除的學生姓名printf("請輸入要刪除的學生姓名: ");scanf("%s", nam); // 獲取用戶輸入的學生姓名int flag = 0; // 定義一個標志變量,用于記錄是否找到匹配的學生姓名// 循環查找學生姓名,并刪除匹配的學生記錄for (int i = 0; i < *len; i++) {if (strcmp(p[i].nam, nam) == 0) { // 如果找到匹配的學生姓名// 將后面的學生記錄依次向前移動for (int j = i; j < *len - 1; j++) {strcpy(p[j].nam, p[j + 1].nam);strcpy(p[j].sex, p[j + 1].sex);strcpy(p[j].spec, p[j + 1].spec);strcpy(p[j].classid, p[j + 1].classid);strcpy(p[j].phone, p[j + 1].phone);strcpy(p[j].bedroom, p[j + 1].bedroom);}(*len)--; // 更新學生記錄數量flag = 1; // 設置標志變量為1,表示找到了匹配的學生姓名break; // 跳出循環}}if (flag) { // 如果找到了匹配的學生姓名printf("刪除成功!\n");regis(p, *len); // 將更新后的學生信息寫入文件} else { // 如果沒有找到匹配的學生姓名printf("學生姓名不存在!\n");}
}
函數首先定義一個字符數組`nam`,用于存儲要刪除的學生姓名,并提示用戶輸入要刪除的學生姓名。然后使用`scanf`函數獲取用戶輸入的學生姓名。接著,函數定義一個標志變量`flag`,用于記錄是否找到匹配的學生姓名。
接下來,函數通過循環遍歷已有的學生記錄,從中查找匹配的學生姓名,并刪除匹配的學生記錄。當找到匹配的學生姓名時,函數使用一個內層循環將后面的學生記錄依次向前移動,以覆蓋被刪除的學生記錄。在移動學生記錄后,通過`strcpy`函數將后面學生記錄的屬性值依次復制到當前學生記錄中。同時,通過遞減指針`len`所指向的值,以更新學生記錄的數量。
如果成功刪除了學生記錄,則將標志變量`flag`設置為1表示找到了匹配的學生姓名,并跳出循環。否則,如果沒有找到匹配的學生姓名,則標志變量`flag`保持為0。
最后,函數根據標志變量`flag`的值,判斷是否成功刪除了學生記錄。如果成功刪除了學生記錄,則打印"刪除成功!"的提示,并調用`regis`函數將更新后的學生信息寫入文件。否則,如果沒有找到匹配的學生姓名,則打印"學生姓名不存在!"的提示。
7.按姓名查詢
void search_name(struct student *p, int len) {char nam1[100]; // 定義一個字符數組,用于存儲要查詢的學生姓名printf("請輸入要查詢學生姓名:");scanf("%s", nam1); // 獲取用戶輸入的學生姓名printf("姓名\t性別\t專業\t班級\t電話號碼\t宿舍號\t\n");int flag = 0; // 定義一個標志變量,用于記錄是否找到匹配的學生姓名// 循環查找學生姓名,并輸出匹配的學生記錄for (int i = 0; i < len; i++) {if (strcmp(p[i].nam, nam1) == 0) { // 如果找到匹配的學生姓名printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);flag = 1; // 設置標志變量為1,表示找到了匹配的學生姓名break; // 跳出循環}}if (!flag) { // 如果沒有找到匹配的學生姓名printf("姓名輸入有誤!\n");}
}
函數首先定義一個字符數組`nam1`,用于存儲要查詢的學生姓名,并提示用戶輸入要查詢的學生姓名。然后使用`scanf`函數獲取用戶輸入的學生姓名。接著,函數打印一個表頭,用于顯示學生信息的各個屬性。同時,函數定義一個標志變量`flag`,用于記錄是否找到匹配的學生姓名。
接下來,函數通過循環遍歷已有的學生記錄,從中查找匹配的學生姓名,并輸出匹配的學生記錄。當找到匹配的學生姓名時,函數使用`printf`函數按照指定的格式輸出匹配的學生的姓名、性別、專業、班級、電話號碼和宿舍號。同時,將標志變量`flag`設置為1表示找到了匹配的學生姓名,并跳出循環。
最后,函數根據標志變量`flag`的值,判斷是否成功找到了匹配的學生姓名。如果沒有找到匹配的學生姓名,則打印"姓名輸入有誤!"的提示。
8.按班級查詢
void search_class(struct student *p, int len) {char classid[10]; // 定義一個字符數組,用于存儲要查詢的班級printf("請輸入要查詢的班級: ");scanf("%s", classid); // 獲取用戶輸入的班級printf("姓名\t性別\t專業\t班級\t電話號碼\t宿舍號\t\n");int flag = 0; // 定義一個標志變量,用于記錄是否找到匹配的班級// 循環查找班級,并輸出匹配的學生記錄for (int i = 0; i < len; i++) {if (strcmp(p[i].classid, classid) == 0) { // 如果找到匹配的班級printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);flag = 1; // 設置標志變量為1,表示找到了匹配的班級}}if (!flag) { // 如果沒有找到匹配的班級printf("沒有找到該班級的學生信息!\n");}
}
函數首先定義一個字符數組`classid`,用于存儲要查詢的班級,并提示用戶輸入要查詢的班級。然后使用`scanf`函數獲取用戶輸入的班級。接著,函數打印一個表頭,用于顯示學生信息的各個屬性。同時,函數定義一個標志變量`flag`,用于記錄是否找到匹配的班級。
接下來,函數通過循環遍歷已有的學生記錄,從中查找匹配的班級,并輸出匹配的學生記錄。當找到匹配的班級時,函數使用`printf`函數按照指定的格式輸出匹配的學生的姓名、性別、專業、班級、電話號碼和宿舍號。同時,將標志變量`flag`設置為1表示找到了匹配的班級。
最后,函數根據標志變量`flag`的值,判斷是否成功找到了匹配的班級。如果沒有找到匹配的班級,則打印"沒有找到該班級的學生信息!"的提示。
9.按專業查詢
void search_specialty(struct student *p, int len) {char spec[20]; // 定義一個字符數組,用于存儲要查詢的專業printf("請輸入要查詢的專業: ");scanf("%s", spec); // 獲取用戶輸入的專業printf("姓名\t性別\t專業\t班級\t電話號碼\t宿舍號\t\n");int flag = 0; // 定義一個標志變量,用于記錄是否找到匹配的專業// 循環查找專業,并輸出匹配的學生記錄for (int i = 0; i < len; i++) {if (strcmp(p[i].spec, spec) == 0) { // 如果找到匹配的專業printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);flag = 1; // 設置標志變量為1,表示找到了匹配的專業}}if (!flag) { // 如果沒有找到匹配的專業printf("沒有找到該專業的學生信息!\n");}
}
函數首先定義一個字符數組`spec`,用于存儲要查詢的專業,并提示用戶輸入要查詢的專業。然后使用`scanf`函數獲取用戶輸入的專業。接著,函數打印一個表頭,用于顯示學生信息的各個屬性。同時,函數定義一個標志變量`flag`,用于記錄是否找到匹配的專業。
接下來,函數通過循環遍歷已有的學生記錄,從中查找匹配的專業,并輸出匹配的學生記錄。當找到匹配的專業時,函數使用`printf`函數按照指定的格式輸出匹配的學生的姓名、性別、專業、班級、電話號碼和宿舍號。同時,將標志變量`flag`設置為1表示找到了匹配的專業。
最后,函數根據標志變量`flag`的值,判斷是否成功找到了匹配的專業。如果沒有找到匹配的專業,則打印"沒有找到該專業的學生信息!"的提示。
10.打印學生信息
void print_fun(struct student *p, int len) {printf("姓名\t性別\t專業\t班級\t電話號碼\t宿舍號\t\n");// 循環輸出所有學生記錄for (int i = 0; i < len; i++) {printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);}
}
函數首先打印一個表頭,用于顯示學生信息的各個屬性。接著,函數通過循環遍歷已有的學生記錄,并使用`printf`函數按照指定的格式輸出每個學生的姓名、性別、專業、班級、電話號碼和宿舍號。
11.完整代碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 定義一個表示學生的結構體
struct student {char nam[10]; char sex[4]; char spec[20]; char classid[10]; char phone[15]; char bedroom[8];
};// 函數聲明
void createdata(struct student *stu, int *len); // 注冊學生信息
void add(struct student *stu, int *len); // 增加學生信息
void delete_student(struct student *stu, int *len); // 刪除學生信息
void search_name(struct student *stu, int len); // 按姓名查詢
void search_class(struct student *stu, int len); // 按班級查詢
void search_specialty(struct student *stu, int len); // 按專業查詢
void print_fun(struct student *stu, int len); // 打印學生信息// 主函數
int main() {int choice;struct student p[1024];int len = 0;while (1) {printf("\n 新生報到信息注冊系統\n\n");printf("**********************************************************************\n");printf("1. 注冊學生信息\n");printf("2. 增加學生信息\n");printf("3. 刪除學生信息\n");printf("4. 按姓名查詢\n");printf("5. 按班級查詢\n");printf("6. 按專業查詢\n");printf("7. 打印學生信息\n");printf("8. 退出系統\n");printf("**********************************************************************\n");printf("請輸入選項:");scanf("%d", &choice);switch (choice) {case 1: createdata(p, &len);break;case 2: add(p, &len);break;case 3: delete_student(p, &len);break;case 4: search_name(p, len);break;case 5: search_class(p, len);break;case 6: search_specialty(p, len);break;case 7: print_fun(p, len);break;case 8: printf("謝謝您的使用!\n\n");exit(0); default:printf("輸入有誤!請重新輸入。\n\n");break;}}return 0;
}//寫入文件
void regis(struct student *p, int len) {FILE *fp;fp = fopen("student_info.txt", "w");for (int i = 0; i < len; i++) {fprintf(fp, "%s %s %s %s %s %s\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);}fclose(fp);
}// 讀取文件
void read_data(struct student *p, int *len) {FILE *fp;fp = fopen("student_info.txt", "r");if (fp == NULL) {printf("文件打開失敗\n");return;}while (fscanf(fp, "%s %s %s %s %s %s", p[*len].nam, p[*len].sex, p[*len].spec, p[*len].classid, p[*len].phone, p[*len].bedroom) == 6) {(*len)++;}fclose(fp);
}// 注冊學生信息
void createdata(struct student *p, int *len) {int n; printf("報到學生人數:");scanf("%d", &n); printf("請輸入學生信息:\n");for (int i = 0; i < n; i++) {printf("學生%d:\n", i+1);printf("姓名:");scanf("%s", p[i].nam);printf("性別:");scanf("%s", p[i].sex);printf("專業:");scanf("%s", p[i].spec);printf("班級:");scanf("%s", p[i].classid);printf("電話號碼:");scanf("%s", p[i].phone);printf("宿舍號:");scanf("%s", p[i].bedroom);printf("\n");}*len = n; regis(p, n);
}// 增加學生信息
void add(struct student *p, int *len) {int c = 1; while (c == 1) {int mylen = *len; struct student st; printf("請輸入要添加學生的信息:\n");printf("姓名:");scanf("%s", st.nam);printf("性別:");scanf("%s", st.sex);printf("專業:");scanf("%s", st.spec);printf("班級:");scanf("%s", st.classid);printf("電話號碼:");scanf("%s", st.phone);printf("宿舍號:");scanf("%s", st.bedroom);printf("\n");p[mylen] = st; *len = mylen + 1; print_fun(p, *len); printf("\n");printf("是否繼續添加?輸入:\n1.繼續\n2.退出\n");scanf("%d", &c); }regis(p, *len);
}// 刪除學生信息
void delete_student(struct student *p, int *len) {char nam[10]; printf("請輸入要刪除的學生姓名: ");scanf("%s", nam); int flag = 0; for (int i = 0; i < *len; i++) {if (strcmp(p[i].nam, nam) == 0) { for (int j = i; j < *len - 1; j++) {strcpy(p[j].nam, p[j + 1].nam);strcpy(p[j].sex, p[j + 1].sex);strcpy(p[j].spec, p[j + 1].spec);strcpy(p[j].classid, p[j + 1].classid);strcpy(p[j].phone, p[j + 1].phone);strcpy(p[j].bedroom, p[j + 1].bedroom);}(*len)--; flag = 1; break; }}if (flag) { printf("刪除成功!\n");regis(p, *len); } else { printf("學生姓名不存在!\n");}
}// 按姓名查詢
void search_name(struct student *p, int len) {char nam1[100]; printf("請輸入要查詢學生姓名:");scanf("%s", nam1); printf("姓名\t性別\t專業\t班級\t電話號碼\t宿舍號\t\n");int flag = 0; for (int i = 0; i < len; i++) {if (strcmp(p[i].nam, nam1) == 0) { printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);flag = 1; break; }}if (!flag) { printf("姓名輸入有誤!\n");}
}// 按班級查詢
void search_class(struct student *p, int len) {char classid[10]; printf("請輸入要查詢的班級: ");scanf("%s", classid); printf("姓名\t性別\t專業\t班級\t電話號碼\t宿舍號\t\n");int flag = 0; for (int i = 0; i < len; i++) {if (strcmp(p[i].classid, classid) == 0) { printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);flag = 1; }}if (!flag) { printf("沒有找到該班級的學生信息!\n");}
}// 按專業查詢
void search_specialty(struct student *p, int len) {char spec[20]; printf("請輸入要查詢的專業: ");scanf("%s", spec); printf("姓名\t性別\t專業\t班級\t電話號碼\t宿舍號\t\n");int flag = 0; for (int i = 0; i < len; i++) {if (strcmp(p[i].spec, spec) == 0) { printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);flag = 1; }}if (!flag) { printf("沒有找到該專業的學生信息!\n");}
}// 打印學生信息
void print_fun(struct student *p, int len) {printf("姓名\t性別\t專業\t班級\t電話號碼\t宿舍號\t\n");for (int i = 0; i < len; i++) {printf("%s\t%s\t%s\t%s\t%s\t\t%s\t\n", p[i].nam, p[i].sex, p[i].spec, p[i].classid, p[i].phone, p[i].bedroom);}
}
運行截圖:
說明:輸入選項1后,填寫報到學生人數最好不要超過10人,主要是一條一條數據輸入得輸半天。