C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)小設(shè)計(jì)
本文實(shí)例為大家分享了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百行代碼左右,通過這個(gè)設(shè)計(jì),本人感覺C語(yǔ)言熟練了很多,
希望能對(duì)像我一樣的C語(yǔ)言菜鳥同學(xué)會(huì)有點(diǎn)幫助,廢話少說,咱們上代碼!
三、程序代碼
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("沒有任何學(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("沒有找到該學(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("沒有找到該學(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("沒有任何學(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("沒有該學(xué)生信息!\n");
goto recyc3;
}
}
}
STU *display_student(STU *stu_head)
{
int sel;
STU *head = stu_head;
STU *node = stu_head;
if(node == NULL){
printf("沒有任何學(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("沒有找到該學(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;
}
四、總結(jié)
菜鳥修煉C語(yǔ)言基礎(chǔ)部分到此告一段落了,通過這段時(shí)間的修煉對(duì)C語(yǔ)言有了更加深入的理解,
能夠熟練運(yùn)用指針、數(shù)組、結(jié)構(gòu)體和鏈表進(jìn)行代碼的編寫了。
如果以后有時(shí)間,可能會(huì)修煉一下C算法,下一段時(shí)間我會(huì)修煉C++。
希望能對(duì)像我一樣的C語(yǔ)言菜鳥能提供到幫助,大家共同努力,共同奮斗!
- C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)源代碼
- C語(yǔ)言版學(xué)生成績(jī)管理系統(tǒng)
- 基于C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
- C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單學(xué)生成績(jī)管理系統(tǒng)
- C語(yǔ)言利用結(jié)構(gòu)體數(shù)組實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)
- C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)設(shè)計(jì)
- C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)實(shí)戰(zhàn)教學(xué)
相關(guān)文章
讓應(yīng)用程序只運(yùn)行一個(gè)實(shí)例的實(shí)現(xiàn)方法
我們?cè)谑褂谩?60軟件管家》時(shí)發(fā)現(xiàn),在《360軟件管家》已經(jīng)運(yùn)行了的情況下,再次點(diǎn)擊《360軟件管家》的圖標(biāo),那么它不會(huì)再運(yùn)行另外一個(gè)《360軟件管家》,而是將已有的《360軟件管家》給激活,始終只能運(yùn)行一個(gè)《360軟件管家》的實(shí)例2013-05-05
C++中事件機(jī)制的簡(jiǎn)潔實(shí)現(xiàn)及需要放棄的特性
事件模型是被廣泛使用的好東西,但是C++標(biāo)準(zhǔn)庫(kù)里沒有現(xiàn)成的,現(xiàn)在VC11可以用在XP下了,那么就痛快的拿起C++11提供的先進(jìn)設(shè)施組合出一個(gè)輕便的實(shí)現(xiàn)吧感興趣的朋友可以了解下,或許對(duì)你有所幫助2013-02-02
C語(yǔ)言深入了解自定義數(shù)據(jù)類型的使用
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言自定義數(shù)據(jù)類型的結(jié)構(gòu)體、枚舉和聯(lián)合的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
詳解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0
這篇文章主要介紹了詳解VS2019+OpenCV-4-1-0+OpenCV-contrib-4-1-0,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
linux c語(yǔ)言操作數(shù)據(jù)庫(kù)(連接sqlite數(shù)據(jù)庫(kù))
linux下c語(yǔ)言操作sqlite數(shù)據(jù)庫(kù)實(shí)例方法,大家參考使用吧2013-12-12
C語(yǔ)言表達(dá)式求值中類型轉(zhuǎn)換和優(yōu)先級(jí)等問題詳解
表達(dá)式求值是一個(gè)常見的問題,可以用C語(yǔ)言實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言表達(dá)式求值中類型轉(zhuǎn)換和優(yōu)先級(jí)等問題的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-05-05

