前情提示
這是本人大一的C語言程式設計的結課設計作業,由于這段時間一直在學習Java,C語言很久沒學了,所以在CSDN上找了很多代碼,經過對比最終發現博客C語言 學生成績管理系統 控制臺 檔案操作(未涉及資料庫)最符合我的需求,然后對這個程式進行了一些修改,于是我的結課設計就誕生了

程式簡介
本程式設計具有學生資訊的輸入、顯示、查詢、更新、洗掉、保存等功能,利用清屏函式使操作界面簡潔美觀,易于操作,程式用了指標、結構體、鏈表等知識點,運用選單實作互動式管理,用戶輕松的按鍵即可實作對軟體的操作,操作簡單易懂,功能豐富,可以很好的滿足需要
流程圖

源程式函式目錄

源代碼
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define max 100 //陣列定義統一大小
int g = 0; //全域變數,為登錄時輸入密碼次數
int student_number = 5; //全域變數,student_number為學生的人數
struct user //定義一個結構體,存盤用戶登錄賬號和密碼,并初始化五個管理員的資訊
{
char username[20];
char password[20];
}user[5] = {
{"蔣超", "1450824311"},
{"李佳樹", "2041775273"},
{"劉英杰", "395636706"},
{"胡友亮", "924056026"},
{"黃家楊", "2946644844"}
};
struct student //定義結構體,包含學生資訊,并初始化五個學生的資訊
{
char name[max]; //姓名
char num[max]; //學號
char sex[max]; //性別
int chinese; //語文成績
int mathematic; //數學成績
int english; //英語成績
int computer; //計算機成績
}s[5] = {
{ "蔣超", "00001", "boy", 80,90,80,90},
{ "李佳樹", "00002", "boy", 60,80,90,50},
{ "黃家楊", "00003", "girl", 85,65,75,90},
{ "胡友亮", "00004", "boy", 55,65,75,80},
{ "劉英杰", "00005", "girl", 90,95,98,99}
};
struct student* p; //定義一個結構體指標
//主選單函式宣告
void login(); //登入函式
void main_menu(); //主界面函式
void input_record(); //輸入學生成績處理 1
void show_record(); //顯示學生成績處理 2
void search_record(); //查詢學生成績處理 3
void change_record(); //更新學生成績處理 4
void delete_record(); //洗掉學生資訊 5
void calc_record(); //計算成績處理 6
void save_record(); //保存處理 7
void exit_record(); //退出 8
//查詢子函式宣告
void search_by_num(); //學號查詢
void search_by_name(); //姓名查詢
void search_by_sex(); //性別查詢
void search_by_exit(); //回傳上一級
//計算子函式宣告
void calc_sum(); //計算總成績
void calc_ave(); //計算平均成績
void calc_eixt(); //回傳上一級
//自定義函式
void print_table(); //表頭
void print_table_sum(); //總成績表格
void print_table_ave(); //平均分表格
void read(); //將檔案中的資料讀入到結構體陣列中
int main() //*主函式
{
login(); //首先進行管理員登錄
main_menu(); //登錄成功后顯示主界面
return 0;
}
void login() //登錄函式,管理員使用該系統前需進行登錄,定義密碼只允許輸錯三次
{
int i;
char id[20], password[20];
printf("****登錄界面****\n");
printf("請輸入賬號名:");
scanf("%s", id);
printf("請輸入密碼:");
scanf("%s", password);
for (i = 0; i < 5; i++) //遍歷五個管理員的資訊,如果輸入的資訊在初始化的資訊中存在則登錄成功
{
if (strcmp(id, user[i].username) == 0 && strcmp(password, user[i].password) == 0)
{
printf("登錄成功!\n");
system("cls"); //清屏函式
main_menu(); //登錄成功,列印主界面
break;
}
}
if (i == 5) //遍歷完一輪管理員資訊,此時i=5且未找到符合的管理員資訊,說明賬號密碼輸入錯誤
{
system("cls");
printf("登錄失敗!\n\n");
g++; //有三次登錄機會,每次登錄都遍歷一次user結構體
if (g >= 3) //若三次機會都用完,則退出系統
{
printf("你已經輸錯三次,將自動退出系統\n");
exit(1);
}
else
{
login(); //否則,登陸成功,進入主界面
}
}
}
void main_menu() //展示主選單,并對用戶的請求做出對應回應
{
read(); //將檔案中的學生資訊讀取到鏈表中
system("cls"); //清屏函式
int x;
//主選單
printf("*************************************************\n");
printf("*\t歡迎使用高校學生成績管理系統V2.0\t*\n");
printf("*************************************************\n");
printf("*\t\t1.輸入學生資訊\t\t\t*\n");
printf("*\t\t2.顯示學生資訊\t\t\t*\n");
printf("*\t\t3.查詢學生資訊\t\t\t*\n");
printf("*\t\t4.更新學生資訊\t\t\t*\n");
printf("*\t\t5.洗掉學生資訊\t\t\t*\n");
printf("*\t\t6.計算學生成績\t\t\t*\n");
printf("*\t\t7.保存\t\t\t\t*\n");
printf("*\t\t8.退出系統\t\t\t*\n");
printf("*************************************************\n");
printf("請輸入你要執行的操作:");
scanf("%d", &x);
if (x == 1)
input_record(); //輸入資訊
if (x == 2)
show_record(); //顯示資訊
if (x == 3)
search_record(); //查詢資訊
if (x == 4)
change_record(); //更新資訊
if (x == 5)
delete_record(); //洗掉資訊
if (x == 6)
calc_record(); //計算成績
if (x == 7)
save_record(); //保存
if (x == 8)
exit_record(); //退出
else
{
printf("輸入錯誤,即將重新進入主界面\n");
main_menu();
}
}
void input_record() //輸入學生成績函式 1
{
//定義兩個char型別變數來獲取用戶的輸入
char v, z;
//在開頭位置做一個標記
aa:
{
system("cls"); //清屏函式
printf("請輸入學生姓名:");
scanf("%s", s[student_number].name);
printf("請輸入學生學號(五位):");
scanf("%s", s[student_number].num);
printf("請輸入學生性別(boy/girl):");
scanf("%s", s[student_number].sex);
printf("請輸入學生語文成績:");
scanf("%d", &s[student_number].chinese);
printf("請輸入學生數學成績:");
scanf("%d", &s[student_number].mathematic);
printf("請輸入學生英語成績:");
scanf("%d", &s[student_number].english);
printf("請輸入學生計算機成績:");
scanf("%d", &s[student_number].computer);
printf("請選擇是否保存(y或n):");
scanf("%s", &z);
if (z == 'y') //若輸入為y,則保存資訊到檔案中
{
student_number++;
save_record();
}
printf("是否繼續添加,請選擇(y或n)(否會回到主界面):");
scanf("%s", &v);
if (v == 'y') //若輸入為y,則跳轉至開頭標記aa處
{
goto aa;
}
else
{
main_menu();
}
}
}
void show_record() //顯示學生資訊函式 2
{
system("cls"); //清屏函式
int i, k, x;
char get;
x = student_number;
print_table(); //列印表頭
for (i = 0; i < x; i++) //列印表格資料
{
printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
}
printf("\n1.回傳主界面\n2.回傳上一級\n");
printf("請輸入:");
scanf("%d", &k);
if (k == 1)
{
main_menu();
}
else if (k == 2)
{
main_menu();
}
}
void search_record() //查詢學生成績函式 3
{
system("cls"); //清屏函式
int x;
//列印選單
printf("1 按學號查詢\n");
printf("2 按姓名查詢\n");
printf("3 按性別查詢\n");
printf("4 回傳上一級\n");
printf("請輸入:");
scanf("%d", &x);
if (x == 1)
search_by_num(); //按學號查詢函式
if (x == 2)
search_by_name(); //按姓名查詢函式
if (x == 3)
search_by_sex(); //按性別查詢查詢
if (x == 4)
search_by_exit(); //回傳主界面
else
{
printf("輸入錯誤\n");
search_record(); //重新查詢
}
}
void print_table() //列印學生資訊表格的表頭函式
{
printf("+----------+----------+----------+------+------+------+------+\n");
printf("| 姓名 | 學號 | 性別 | 語文 | 數學 | 英語 |計算機|\n");
printf("+----------+----------+----------+------+------+------+------+\n");
}
void search_by_num() //查詢學生資訊函式的子函式——按學號查詢函式
{
int i, k;
char num1[max]; //用戶輸入學生學號
system("cls"); //清屏函式
printf("請輸入要查找的學號:");
scanf("%s", num1);
for (i = 0; i < student_number; i++) //遍歷鏈表,尋找是該學號是否存在
{
if (strcmp(num1, s[i].num) == 0)
{
print_table();
printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
break;
}
}
if (i == student_number) //student_number為全域變數學生的人數
{
printf("不存在這個學號!\n\n");
}
printf("1.回傳主界面\n2.繼續查詢\n");
printf("請輸入:");
scanf("%d", &k);
if (k == 1)
{
main_menu();
}
else
{
search_record();
}
}
void search_by_name() //詢學生資訊函式的子函式——按姓名查詢函式
{
int i, k;
char name1[max]; //用戶輸入學生姓名
system("cls"); //清屏函式
printf("請輸入查找的姓名:");
scanf("%s", name1);
for (i = 0; i < student_number; i++) //遍歷鏈表,看該名字是否存在
{
if (strcmp(name1, s[i].name) == 0)
{
print_table();
printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
break;
}
}
if (i == student_number)
{
printf("不存在這個姓名\n");
}
printf("1.回傳主界面\n2.繼續查詢\n");
printf("請輸入:");
scanf("%d", &k);
if (k == 1)
{
main_menu();
}
else
{
search_record();
}
}
void search_by_sex() //詢學生資訊函式的子函式——按性別查詢函式
{
int i, k;
char sex1[max]; //用戶輸入學生的性別
system("cls"); //清屏函式
printf("請輸入查找的性別(boy/girl):");
scanf("%s", sex1);
print_table(); //表格
for (i = 0; i < student_number; i++) //遍歷鏈表,看該性別是否存在
{
if (strcmp(sex1, s[i].sex) == 0)
printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
}
if (i == student_number)
{
printf("1.回傳主界面\n2.繼續查詢\n");
}
printf("請輸入:");
scanf("%d", &k);
if (k == 1)
{
main_menu();
}
else
{
search_record();
}
}
void search_by_exit() //回傳上一級(回傳主選單)的函式
{
main_menu();
}
void change_record() //更新學生成績函式 4
{
//輸入學生學號修改學生資訊并保持
system("cls"); //清屏函式
int i;
char name2[max], sex2[max];
int chinese2, mathematic2, english2, computer2;
char numbefor[max];
printf("請輸入要修改的學生的學號:"); //用戶輸入學生學號
scanf("%s", numbefor);
for (i = 0; i < student_number; i++) //遍歷鏈表,看該學號是否存在
{
if (strcmp(numbefor, s[i].num) == 0) //存在
{
printf("修改前:\n");
print_table(); //列印表格
printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
printf("請分別輸入修改后資訊\n");
printf("請輸入學生姓名:");
scanf("%s", name2);
printf("請輸入學生性別:");
scanf("%s", sex2);
printf("請輸入學生語文成績:");
scanf("%d", &chinese2);
printf("請輸入學生數學成績:");
scanf("%d", &mathematic2);
printf("請輸入學生英語成績:");
scanf("%d", &english2);
printf("請輸入學生計算機成績:");
scanf("%d", &computer2);
printf("請選擇是否保存(y或n):");
getchar();
if (getchar() == 'y') //修改學生資訊
{
strcpy(s[i].name, name2);
strcpy(s[i].sex, sex2);
s[i].chinese = chinese2;
s[i].mathematic = mathematic2;
s[i].english = english2;
s[i].computer = computer2;
save_record(); //保存學生資訊到檔案中
printf("修改后:\n");
printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
printf("\n");
}
break;
}
}
if (i == student_number)
{
printf("很抱歉!沒有這位學生\n");
}
printf("是否繼續修改,請選擇(y/n):");
getchar();
if (getchar() == 'y')
{
change_record(); //繼續修改
}
else
{
main_menu(); //回傳主界面
}
}
void delete_record() //洗掉學生資訊函式 5
{
//輸入學生學號洗掉學生資訊并保存
system("cls");
char num4[max];
char a;
int v;
printf("請輸入要刪學生的學號:\n");
scanf("%s", num4);
int i, j;
for (i = 0; i < student_number; i++) //遍歷鏈表,看學號是否存在
{
if (strcmp(num4, s[i].num) == 0) //存在,執行洗掉操作
{
printf("你將要洗掉該學生資訊\n");
printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer);
printf("\n");
printf("y 確認洗掉\tn 取消\n");
printf("請輸入:");
scanf("%s", &a);
if (a == 'y')
{
for (j = i; j < student_number; j++) //將鏈表中該節點指向下一節點以實作洗掉操作
{
strcpy(s[j].num, s[j + 1].num); strcpy(s[j].name, s[j + 1].name); strcpy(s[j].sex, s[j + 1].sex);
s[j].chinese = s[j + 1].chinese; s[j].mathematic = s[j + 1].mathematic; s[j].english = s[j + 1].english;
s[j].computer = s[j + 1].computer;
}
printf("洗掉成功!\n");
student_number--; //全域變數,student_number-1
save_record(); //將洗掉后的資訊保存到檔案中
}
else
{
printf("已取消操作\n");
}
}
}
if (i == student_number) //該學號不存在
{
printf("沒有這個學號的學生\n");
}
printf("1.繼續洗掉 2.回傳主界面\n");
printf("請輸入:");
scanf("%d", &v);
if (v == 1)
{
delete_record();
}
else
{
main_menu;
}
}
void calc_record() //計算學生成績函式 6
{
//有兩個功能,一個是計算總成績一個是計算平均分
system("cls"); //清屏函式
int x;
printf("1 計算總成績\n");
printf("2 計算平均分\n");
printf("3 回傳上一級\n");
printf("請輸入:");
scanf("%d", &x);
if (x == 1)
calc_sum(); //計算總成績
if (x == 2)
calc_ave(); //計算平均成績
if (x == 3)
main_menu(); //回傳主界面
else
{
printf("輸入錯誤\n");
calc_record(); //重新列印該界面
}
}
void print_table_sum() //計算總成績函式的子函式——列印總成績表格的表頭
{
printf("+----------+----------+----------+------+------+------+------+------+\n");
printf("| 姓名 | 學號 | 性別 | 語文 | 數學 | 英語 |計算機|總成績|\n");
printf("+----------+----------+----------+------+------+------+------+------+\n");
}
void print_table_ave() //計算平均分函式的子函式——列印平均成績表格的表頭
{
printf("+----------+----------+----------+------+------+------+------+------+\n");
printf("| 姓名 | 學號 | 性別 | 語文 | 數學 | 英語 |計算機|平均分|\n");
printf("+----------+----------+----------+------+------+------+------+------+\n");
}
void calc_sum() //計算學生成績函式的子函式——計算總成績函式
{
print_table_sum(); //列印表頭
int i, k, sum = 0; //sum為學生的總成績
int x = student_number; //student_number為學生人數
for (i = 0; i < x; i++)
{
sum = s[i].chinese + s[i].mathematic + s[i].english + s[i].computer;
printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|%6d\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer, sum);
}
printf("1 回傳上一級\n2 回傳主界面\n ");
printf("請輸入:");
scanf("%d", &k);
if (k == 1)
calc_record();
if (k == 2)
main_menu();
else
{
printf("輸入錯誤!\n");
calc_record();
}
}
void calc_ave() //計算學生成績函式的子函式——計算平均成績函式
{
print_table_ave(); //列印表頭
int i, k;
int x = student_number; //student_number為學生人數
float ave; //ave為學生平均成績
for (i = 0; i < x; i++)
{
ave = (s[i].chinese + s[i].mathematic + s[i].english + s[i].computer) * 0.25;
printf("|%10s|%10s|%10s|%6d|%6d|%6d|%6d|%6.2f\n", s[i].name, s[i].num, s[i].sex, s[i].chinese, s[i].mathematic, s[i].english, s[i].computer, ave);
if (i == 6)
{
break;
}
}
printf("1 回傳上一級\n2 回傳主界面\n ");
printf("請輸入:");
scanf("%d", &k);
if (k == 1)
calc_record();
if (k == 2)
main_menu();
else
{
printf("輸入錯誤!\n");
calc_record();
}
}
void calc_eixt() //回傳上一級(回傳主選單)函式
{
main_menu();
}
void save_record() //保存學生資訊函式 7(將結構體陣列學生資料寫入到檔案中)
{
FILE* fp; //定義一個檔案指標
int i;
//若檔案打開失敗
if ((fp = fopen("student-list", "wb")) == NULL) //以二進制方式對檔案進行讀寫
{
printf("cannot open file\n");
return;
}
fwrite(&student_number, 4, 1, fp); //將學生人數寫入檔案
for (i = 0; i < student_number; i++) //二進制寫
{
if (fwrite(&s[i], sizeof(struct student), 1, fp) != 1)
{
printf("file write error\n"); //出錯處理
}
else
{
printf("file write sucess\n"); //檔案寫入成功
}
}
fclose(fp); //關閉檔案指標
}
void read() //將檔案中的資料讀入到結構體陣列中
{
FILE* fp; //定義一個檔案指標
int i;
//若檔案打開失敗
if ((fp = fopen("student-list", "rb")) == NULL) //以二進制方式讀取檔案
{
printf("cannot open file\n");
return;
}
fread(&student_number, 4, 1, fp); //讀取學生人數
for (i = 0; i < student_number; i++) //二進制寫
{
if (fread(&s[i], sizeof(struct student), 1, fp) != 1)
{
printf("file read error\n"); //出錯處理
}
else
{
printf("file read sucess\n"); //檔案讀取成功
}
}
fclose(fp); //關閉檔案指標
}
void exit_record() //退出系統函式 8
{
printf("感謝您的使用,已退出!");
exit;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/287149.html
標籤:java
