溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)的示例分析

發(fā)布時(shí)間:2021-08-15 12:12:07 來(lái)源:億速云 閱讀:219 作者:小新 欄目:編程語(yǔ)言

小編給大家分享一下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ī)保存模塊

效果圖:

C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)的示例分析

C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)的示例分析

本設(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è)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI