您好,登錄后才能下訂單哦!
小編給大家分享一下C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
具體內(nèi)容如下
一、本設(shè)計(jì)涉及的重要C語(yǔ)言知識(shí)有:
1.單鏈表的各種操作
2.文件流的操作
3.單鏈表的排序
二、本設(shè)計(jì)主要以下幾個(gè)模塊組成
1.學(xué)生成績(jī)添加模塊
2.學(xué)生成績(jī)刪除模塊
3.學(xué)生成績(jī)修改模塊
4.學(xué)生成績(jī)檢索模塊
5.學(xué)生成績(jī)顯示模塊(包括成績(jī)排序)
6.學(xué)生成績(jī)保存模塊
效果圖:
本設(shè)計(jì)大概5、6百行代碼左右,通過(guò)這個(gè)設(shè)計(jì),本人感覺(jué)C語(yǔ)言熟練了很多,
希望能對(duì)像我一樣的C語(yǔ)言菜鳥(niǎo)同學(xué)會(huì)有點(diǎn)幫助,廢話少說(shuō),咱們上代碼!
三、程序代碼
1.main.c
這個(gè)文件內(nèi)主要完成主菜單的跳轉(zhuǎn)和接受用戶信息完成到各個(gè)模塊的跳轉(zhuǎn)。
#include <stdio.h> #include "students.h" int select_menu(void); void hand_menu(int cmd, int *flag); void quit(); int main(int argc, char *argv[]) { int cmd; int flag = 0; while(1){ cmd = select_menu(); hand_menu(cmd, &flag); } } int select_menu(void) { int select = 0; printf("**************************************************************\n\n"); printf(" 學(xué)生管理系統(tǒng) \n"); printf(" 1:添加學(xué)生信息 2:刪除學(xué)生信息\n"); printf(" 3:修改學(xué)生信息 4:查詢學(xué)生信息\n"); printf(" 5:查看學(xué)生信息 6:保存\n"); printf(" 0:退出\n\n"); printf("**************************************************************\n"); printf("請(qǐng)選擇:"); select=getch(); while(select<'0'||select>'6'){ printf("\n輸入錯(cuò)誤,請(qǐng)重新選擇:"); select=getch(); } return select; } void hand_menu(int cmd, int *flag) { static STU *stu_head = NULL; if(*flag == 0){ stu_head = init_student(stu_head); *flag = 1; } switch(cmd){ case '0': save_student(stu_head); quit(); break; case '1': system("cls"); stu_head = add_student(stu_head); system("cls"); break; case '2': system("cls"); stu_head = del_student(stu_head); system("cls"); break; case '3': system("cls"); modify_student(stu_head); system("cls"); break; case '4': system("cls"); search_student(stu_head); system("cls"); break; case '5': system("cls"); stu_head = display_student(stu_head); system("cls"); break; case '6': system("cls"); save_student(stu_head); system("cls"); break; default: break; } } void quit() { printf("\n感謝使用學(xué)生管理系統(tǒng)!\n"); exit(0); }
2.students.h
這個(gè)文件主要包含students.c文件函數(shù)操作所需的定義。
#ifndef _STUDENTS_H_ #define _STUDENTS_H_ typedef struct st{ unsigned long ID; char name[10]; float chinese; float math; float english; double all_sub; float average; struct st* next; }STU; #define ASK_STU(p) do{p=(STU *)malloc(sizeof(STU));\ if(p==NULL){printf("malloc memory failed!\n");exit(1);}\ }while(0) STU *search_by_nb(STU *stu_head, unsigned long nb); STU *search_by_name(STU *stu_head, char name[]); STU *select_sort(STU *g, char flag); STU *add_student(STU *stu_head); STU *del_all(STU *stu_head); STU *del_one(STU *stu_head, int flag); STU *del_student(STU *stu_head); void modify_student(STU *stu_head); STU *display_student(STU *stu_head); STU *search_by_name(STU *stu_head, char name[]); STU *search_by_nb(STU *stu_head, unsigned long nb); #endif
3.store.h
#ifndef _STORE_H_ #define _STORE_H_ void save_student(STU *stu_head); STU *init_student(STU *stu_head); #endif
4.students.c
這個(gè)文件是本設(shè)計(jì)的核心部分,包括各個(gè)模塊的實(shí)現(xiàn)函數(shù),
包括添加,刪除,修改,查找,顯示學(xué)生信息這幾個(gè)模塊的實(shí)現(xiàn)。
#include <stdio.h> #include "students.h" STU *select_sort(STU *g, char flag) { STU *p,*q,*t,*s,*h; h=(STU *)malloc(sizeof(STU)); h->next=g; p=h; while(p->next->next!=NULL) { for(s=p,q=p->next;q->next!=NULL;q=q->next) { if(flag == '1') if(q->next->ID<s->next->ID) s=q; if(flag == '2') if(q->next->chinese<s->next->chinese) s=q; if(flag == '3') if(q->next->math<s->next->math) s=q; if(flag == '4') if(q->next->english<s->next->english) s=q; if(flag == '5') if(q->next->average<s->next->average) s=q; } if(s!=q) { t=s->next; s->next=t->next; t->next=p->next; p->next=t; } p=p->next; } g=h->next; free(h); return g; } STU *add_student(STU *stu_head) { STU *stu; STU *head = stu_head; STU *node = stu_head; STU *node_fd; int sel; ASK_STU(stu); stu->next = NULL; printf("請(qǐng)輸入學(xué)生學(xué)號(hào):"); scanf("%d", &stu->ID); while(search_by_nb(node, stu->ID)){ printf("已經(jīng)存在該學(xué)號(hào)!請(qǐng)重新輸入一個(gè)學(xué)號(hào):"); scanf("%d", &stu->ID); } printf("請(qǐng)輸入學(xué)生名字:"); scanf("%s", stu->name); printf("請(qǐng)輸入該學(xué)生英語(yǔ)成績(jī):"); scanf("%f", &stu->english); while(stu->english < 0.0 || stu->english > 100.0){ printf("輸入錯(cuò)誤,請(qǐng)重新輸入英語(yǔ)成績(jī):"); scanf("%f", &stu->english); } printf("請(qǐng)輸入該學(xué)生數(shù)學(xué)成績(jī):"); scanf("%f", &stu->math); while(stu->math < 0.0 || stu->math > 100.0){ printf("輸入錯(cuò)誤,請(qǐng)重新輸入數(shù)學(xué)成績(jī):"); scanf("%f", &stu->math); } printf("請(qǐng)輸入該學(xué)生語(yǔ)文成績(jī):"); scanf("%f", &stu->chinese); while(stu->chinese < 0.0 || stu->chinese > 100.0){ printf("輸入錯(cuò)誤,請(qǐng)重新輸入數(shù)學(xué)成績(jī):"); scanf("%f", &stu->chinese); } stu->all_sub = stu->chinese+stu->math+stu->english; stu->average = stu->all_sub/3; if(!head){ head = stu; return head; } while(node->next) node = node->next; node->next = stu; head = select_sort(head, '1'); return head; } STU *del_all(STU *stu_head) { if(!stu_head) return NULL; del_all(stu_head->next); free(stu_head); stu_head = NULL; return NULL; } STU *del_one(STU *stu_head, int flag) { STU *node = stu_head; STU *head = stu_head; STU *pre; char name[10]; unsigned long ID; if(head = NULL){ printf("沒(méi)有任何學(xué)生信息!\n"); return head; } if(flag == '2'){ printf("請(qǐng)輸入要?jiǎng)h除的學(xué)生姓名:"); scanf("%s", name); if(!strcmp(node->name, name)){ free(node); head = node->next; printf("成功刪除!按任意鍵返回。\n"); getch(); return head; } while(node){ if(!strcmp(node->name, name)){ pre->next = node->next; free(node); printf("成功刪除!按任意鍵返回。\n"); getch(); return head; } pre = node; node = node->next; } printf("沒(méi)有找到該學(xué)生信息!\n"); return head; } if(flag == '3'){ printf("請(qǐng)輸入要?jiǎng)h除的學(xué)生學(xué)號(hào):"); scanf("%d", &ID); if(node->ID == ID){ free(node); head = node->next; printf("成功刪除!按任意鍵返回。\n"); getch(); return head; } while(node){ if(!strcmp(node->name, name)){ pre->next = node->next; free(node); printf("成功刪除!按任意鍵返回。\n"); getch(); return head; } pre = node; node = node->next; } printf("沒(méi)有找到該學(xué)生信息!按任意鍵返回\n"); getch(); return head; } } STU *del_student(STU *stu_head) { int sel; STU *head = stu_head; printf("1:刪除全部 2:按名字刪除 3:按學(xué)號(hào)刪除 0:返回\n"); printf("請(qǐng)選擇:\n"); sel = getch(); while(sel<'0'||sel>'3'){ printf("輸入錯(cuò)誤,請(qǐng)重新選擇:\n"); sel = getch(); } if(sel == '0') return head; if(!head){ printf("沒(méi)有任何學(xué)生信息!按任意鍵返回.\n"); getch(); return head; } if(sel == '1'){ head = del_all(head); printf("刪除成功!按任意鍵返回."); getch(); return head; } if(sel == '2'||sel =='3'){ head = del_one(head, sel); return head; } } void modify_student(STU *stu_head) { STU *head = stu_head; STU *node_fd; int sel; char name[10]; unsigned long nb; recyc3: printf("1:修改指定學(xué)號(hào)的學(xué)生信息 2:修改指定姓名的學(xué)生信息 0:返回\n請(qǐng)選擇:\n"); sel = getch(); while(sel < '0'|| sel>'2'){ printf("輸入錯(cuò)誤!請(qǐng)重新選擇:\n"); sel = getch(); } if(sel == '1'||sel=='2'){ if(sel == '1'){ printf("請(qǐng)輸入要修改的學(xué)生學(xué)號(hào):"); scanf("%d", &nb); node_fd = search_by_nb(head, nb); } if(sel == '2'){ printf("請(qǐng)輸入要修改的學(xué)生姓名:"); scanf("%s", name); node_fd = search_by_name(head, name); } if(node_fd){ printf("請(qǐng)輸入該學(xué)生英語(yǔ)成績(jī):"); scanf("%f", &node_fd->english); while(node_fd->english < 0.0 || node_fd->english > 100.0){ printf("輸入錯(cuò)誤,請(qǐng)重新輸入英語(yǔ)成績(jī):"); scanf("%f", &node_fd->english); } printf("請(qǐng)輸入該學(xué)生數(shù)學(xué)成績(jī):"); scanf("%f", &node_fd->math); while(node_fd->math < 0.0 || node_fd->math > 100.0){ printf("輸入錯(cuò)誤,請(qǐng)重新輸入數(shù)學(xué)成績(jī):"); scanf("%f", &node_fd->math); } printf("請(qǐng)輸入該學(xué)生語(yǔ)文成績(jī):"); scanf("%f", &node_fd->chinese); while(node_fd->chinese < 0.0 || node_fd->chinese > 100.0){ printf("輸入錯(cuò)誤,請(qǐng)重新輸入數(shù)學(xué)成績(jī):"); scanf("%f", &node_fd->chinese); } node_fd->all_sub = node_fd->chinese+node_fd->math+node_fd->english; node_fd->average = node_fd->all_sub/3; printf("修改成功!\n"); goto recyc3; } else{ printf("沒(méi)有該學(xué)生信息!\n"); goto recyc3; } } } STU *display_student(STU *stu_head) { int sel; STU *head = stu_head; STU *node = stu_head; if(node == NULL){ printf("沒(méi)有任何學(xué)生信息,按任意鍵返回"); getch(); return head; } recyc: printf("學(xué)號(hào) 姓名 語(yǔ)文 數(shù)學(xué) 英文 平均分 總分\n"); while(node){ printf("%d %s %0.1f %0.1f %0.1f %0.1f %0.1f\n", node->ID, node->name,\ node->chinese, node->math, node->english, node->average, node->all_sub); node=node->next; } printf("排序方式: 1:按學(xué)號(hào)排序 2:按語(yǔ)文成績(jī)排序 3:按數(shù)學(xué)成績(jī)排序\n 4:按英文成績(jī)排序 5:按總分排序 0:返回\n請(qǐng)選擇:"); sel = getch(); while(sel < '0'|| sel>'5'){ printf("輸入錯(cuò)誤!請(qǐng)重新選擇:"); sel = getch(); } if(sel == '0') return head; head = node = select_sort(head, sel); system("cls"); goto recyc; return head; } STU *search_by_name(STU *stu_head, char name[]) { STU *node = stu_head; if(!node) return NULL; while(node){ if(!strcmp(node->name, name)) return node; node=node->next; } return NULL; } STU *search_by_nb(STU *stu_head, unsigned long nb) { STU *node = stu_head; if(!node) return NULL; while(node){ if(node->ID == nb) return node; node=node->next; } return NULL; } void search_student(STU *stu_head) { STU *head = stu_head; STU *node; int sel = 0; char name[10]; unsigned long ID; recyc2: printf("1:按姓名查找 2:按學(xué)號(hào)查找 0:返回\n請(qǐng)選擇:"); sel = getch(); while(sel<'0' || sel>'2'){ printf("\n輸入錯(cuò)誤,請(qǐng)重新選擇:"); sel = getch(); } if(sel == '0') return; if(sel == '1'||sel=='2'){ if(sel == '1'){ printf("\n請(qǐng)輸入你要查找的學(xué)生姓名:"); scanf("%s", name); node = search_by_name(head, name); } else{ printf("\n請(qǐng)輸入你要查找的學(xué)生學(xué)號(hào):"); scanf("%d", &ID); node = search_by_nb(head, ID); } if(node){ printf("學(xué)號(hào) 姓名 語(yǔ)文 數(shù)學(xué) 英文 平均分 總分\n"); printf("%d %s %0.1f %0.1f %0.1f %0.1f %0.1f\n", node->ID, node->name,\ node->chinese, node->math, node->english, node->average, node->all_sub); goto recyc2; } else{ printf("沒(méi)有找到該學(xué)生信息!\n"); goto recyc2; } } }
5.store.c
這個(gè)文件包含程序啟動(dòng)時(shí)讀取文件內(nèi)的學(xué)生成績(jī)信息,
和需要保存時(shí)或者退出時(shí)向文件保存學(xué)生成績(jī)信息的操作。
#include <stdlib.h> #include <stdio.h> #include "students.h" #define FILE_NAME "students" void save_student(STU *stu_head) { STU *node = stu_head; FILE *fp; fp = fopen(FILE_NAME, "w+"); while(node){ fprintf(fp, "%ld %s %0.1f %0.1f %0.1f %0.1lf %0.1f\n", node->ID, node->name,\ node->chinese, node->math, node->english, node->all_sub, node->average); node=node->next; } fclose(fp); printf("保存成功!按任意鍵返回。\n"); getch(); } STU *init_student(STU *stu_head) { STU *node = stu_head; STU *head = stu_head; STU *new_node; int i; FILE *fp; char name[10]; int num; ASK_STU(new_node); new_node->next=NULL; fp = fopen(FILE_NAME, "r+"); rewind(fp); while((i = fscanf(fp, "%ld%s%f%f%f%lf%f\n", &new_node->ID, new_node->name,\ &new_node->chinese, &new_node->math, &new_node->english, &new_node->all_sub, &new_node->average)) == 7){ if(!head) head = node = new_node; else{ while(node->next) node = node->next; node->next = new_node; } ASK_STU(new_node); new_node->next = NULL; } fclose(fp); return head; }
以上是“C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。