欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言學(xué)生成績管理系統(tǒng)小設(shè)計(jì)

 更新時間:2018年01月15日 09:22:21   作者:IT人Key  
這篇文章主要為大家詳細(xì)介紹了C語言學(xué)生成績管理系統(tǒng)小設(shè)計(jì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C語言學(xué)生成績管理系統(tǒng)的具體代碼,供大家參考,具體內(nèi)容如下

一、本設(shè)計(jì)涉及的重要C語言知識有:

1.單鏈表的各種操作
2.文件流的操作
3.單鏈表的排序

二、本設(shè)計(jì)主要以下幾個模塊組成

1.學(xué)生成績添加模塊

2.學(xué)生成績刪除模塊

3.學(xué)生成績修改模塊

4.學(xué)生成績檢索模塊

5.學(xué)生成績顯示模塊(包括成績排序)

6.學(xué)生成績保存模塊

效果圖:

本設(shè)計(jì)大概5、6百行代碼左右,通過這個設(shè)計(jì),本人感覺C語言熟練了很多,

希望能對像我一樣的C語言菜鳥同學(xué)會有點(diǎn)幫助,廢話少說,咱們上代碼!

三、程序代碼

1.main.c

這個文件內(nèi)主要完成主菜單的跳轉(zhuǎn)和接受用戶信息完成到各個模塊的跳轉(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("請選擇:"); 
  
 select=getch(); 
 while(select<'0'||select>'6'){ 
  printf("\n輸入錯誤,請重新選擇:"); 
  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

這個文件主要包含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

這個文件是本設(shè)計(jì)的核心部分,包括各個模塊的實(shí)現(xiàn)函數(shù),
包括添加,刪除,修改,查找,顯示學(xué)生信息這幾個模塊的實(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("請輸入學(xué)生學(xué)號:"); 
 scanf("%d", &stu->ID);  
 
 while(search_by_nb(node, stu->ID)){ 
  printf("已經(jīng)存在該學(xué)號!請重新輸入一個學(xué)號:"); 
  scanf("%d", &stu->ID); 
 } 
  
 printf("請輸入學(xué)生名字:"); 
 scanf("%s", stu->name); 
 printf("請輸入該學(xué)生英語成績:"); 
  
 scanf("%f", &stu->english); 
 while(stu->english < 0.0 || stu->english > 100.0){ 
  printf("輸入錯誤,請重新輸入英語成績:"); 
  scanf("%f", &stu->english); 
 } 
 printf("請輸入該學(xué)生數(shù)學(xué)成績:"); 
 scanf("%f", &stu->math); 
 while(stu->math < 0.0 || stu->math > 100.0){ 
  printf("輸入錯誤,請重新輸入數(shù)學(xué)成績:"); 
  scanf("%f", &stu->math); 
 } 
 printf("請輸入該學(xué)生語文成績:"); 
 scanf("%f", &stu->chinese); 
 while(stu->chinese < 0.0 || stu->chinese > 100.0){ 
  printf("輸入錯誤,請重新輸入數(shù)學(xué)成績:"); 
  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("請輸入要刪除的學(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("請輸入要刪除的學(xué)生學(xué)號:"); 
  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é)號刪除 0:返回\n"); 
 printf("請選擇:\n"); 
  
 sel = getch(); 
 while(sel<'0'||sel>'3'){ 
  printf("輸入錯誤,請重新選擇:\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é)號的學(xué)生信息 2:修改指定姓名的學(xué)生信息 0:返回\n請選擇:\n"); 
  
 sel = getch(); 
 while(sel < '0'|| sel>'2'){ 
  printf("輸入錯誤!請重新選擇:\n"); 
  sel = getch(); 
 } 
 if(sel == '1'||sel=='2'){ 
  if(sel == '1'){ 
   printf("請輸入要修改的學(xué)生學(xué)號:"); 
   scanf("%d", &nb);  
   node_fd = search_by_nb(head, nb); 
  } 
  if(sel == '2'){ 
   printf("請輸入要修改的學(xué)生姓名:"); 
   scanf("%s", name); 
   node_fd = search_by_name(head, name); 
  } 
  
  if(node_fd){ 
    
   printf("請輸入該學(xué)生英語成績:"); 
   scanf("%f", &node_fd->english); 
   while(node_fd->english < 0.0 || node_fd->english > 100.0){ 
    printf("輸入錯誤,請重新輸入英語成績:"); 
    scanf("%f", &node_fd->english); 
   } 
   printf("請輸入該學(xué)生數(shù)學(xué)成績:"); 
   scanf("%f", &node_fd->math); 
   while(node_fd->math < 0.0 || node_fd->math > 100.0){ 
    printf("輸入錯誤,請重新輸入數(shù)學(xué)成績:"); 
    scanf("%f", &node_fd->math); 
   } 
   printf("請輸入該學(xué)生語文成績:"); 
   scanf("%f", &node_fd->chinese); 
   while(node_fd->chinese < 0.0 || node_fd->chinese > 100.0){ 
   printf("輸入錯誤,請重新輸入數(shù)學(xué)成績:"); 
   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é)號  姓名  語文 數(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é)號排序 2:按語文成績排序 3:按數(shù)學(xué)成績排序\n   4:按英文成績排序 5:按總分排序 0:返回\n請選擇:"); 
 
 sel = getch(); 
 while(sel < '0'|| sel>'5'){ 
  printf("輸入錯誤!請重新選擇:"); 
  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é)號查找 0:返回\n請選擇:"); 
 sel = getch(); 
 while(sel<'0' || sel>'2'){ 
  printf("\n輸入錯誤,請重新選擇:"); 
  sel = getch(); 
 } 
  
 if(sel == '0') 
  return; 
 if(sel == '1'||sel=='2'){ 
  if(sel == '1'){ 
   printf("\n請輸入你要查找的學(xué)生姓名:"); 
   scanf("%s", name); 
   node = search_by_name(head, name); 
  } 
  else{ 
   printf("\n請輸入你要查找的學(xué)生學(xué)號:"); 
   scanf("%d", &ID); 
   node = search_by_nb(head, ID); 
  } 
  
  if(node){ 
   printf("學(xué)號  姓名  語文 數(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

這個文件包含程序啟動時讀取文件內(nèi)的學(xué)生成績信息,
和需要保存時或者退出時向文件保存學(xué)生成績信息的操作。

#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語言基礎(chǔ)部分到此告一段落了,通過這段時間的修煉對C語言有了更加深入的理解,
能夠熟練運(yùn)用指針、數(shù)組、結(jié)構(gòu)體和鏈表進(jìn)行代碼的編寫了。
如果以后有時間,可能會修煉一下C算法,下一段時間我會修煉C++。
希望能對像我一樣的C語言菜鳥能提供到幫助,大家共同努力,共同奮斗!

相關(guān)文章

  • QT網(wǎng)絡(luò)通信TCP客戶端實(shí)現(xiàn)詳解

    QT網(wǎng)絡(luò)通信TCP客戶端實(shí)現(xiàn)詳解

    這篇文章主要為大家詳細(xì)介紹了QT網(wǎng)絡(luò)通信TCP客戶端實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++采用openfilename打開文件對話框用法實(shí)例

    C++采用openfilename打開文件對話框用法實(shí)例

    這篇文章主要介紹了C++采用openfilename打開文件對話框用法實(shí)例,是C++文件操作中非常實(shí)用的技巧,需要的朋友可以參考下
    2014-10-10
  • C/C++獲取主機(jī)網(wǎng)卡MAC地址的三方法

    C/C++獲取主機(jī)網(wǎng)卡MAC地址的三方法

    MAC地址(Media Access Control address),又稱為物理地址或硬件地址,是網(wǎng)絡(luò)適配器(網(wǎng)卡)在制造時被分配的全球唯一的48位地址,通過獲取MAC地址可以判斷當(dāng)前主機(jī)的唯一性可以與IP地址綁定并實(shí)現(xiàn)網(wǎng)絡(luò)準(zhǔn)入控制,本文給大家介紹了使用C/C++獲取主機(jī)網(wǎng)卡MAC地址的三方法
    2023-11-11
  • 深入Windows下的回車是回車換行(\r\n)還是換行回車(\n\r)的詳解

    深入Windows下的回車是回車換行(\r\n)還是換行回車(\n\r)的詳解

    本篇文章對Windows下的回車是回車換行(\r\n)還是換行回車(\n\r)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 基于C++內(nèi)存分配、函數(shù)調(diào)用與返回值的深入分析

    基于C++內(nèi)存分配、函數(shù)調(diào)用與返回值的深入分析

    本篇文章是對C++中的內(nèi)存分配、函數(shù)調(diào)用與返回值進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語言實(shí)現(xiàn)堆的簡單操作的示例代碼

    C語言實(shí)現(xiàn)堆的簡單操作的示例代碼

    堆(heap)是計(jì)算機(jī)科學(xué)中一類特殊的數(shù)據(jù)結(jié)構(gòu)的統(tǒng)稱。堆通常是一個可以被看做一棵樹的數(shù)組對象。本文介紹了C語言中堆的一些簡單操作,需要的可以參考一下
    2022-11-11
  • 手把手教你如何優(yōu)化C語言程序

    手把手教你如何優(yōu)化C語言程序

    程序進(jìn)行優(yōu)化,通常是指優(yōu)化程序代碼或程序執(zhí)行速度。優(yōu)化代碼和優(yōu)化速度實(shí)際上是一個予盾的統(tǒng)一,一般是優(yōu)化了代碼的尺寸,就會帶來執(zhí)行時間的增加,如果優(yōu)化了程序的執(zhí)行速度,通常會帶來代碼增加的副作用,很難魚與熊掌兼得,只能在設(shè)計(jì)時掌握一個平衡點(diǎn)
    2013-07-07
  • C++第三方日志庫Glog基本語法詳解

    C++第三方日志庫Glog基本語法詳解

    這篇文章主要介紹了C++第三方日志庫Glog基本語法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • C++實(shí)現(xiàn)簡單通訊錄系統(tǒng)

    C++實(shí)現(xiàn)簡單通訊錄系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡單通訊錄系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 基于Matlab圖像處理的公路裂縫檢測實(shí)現(xiàn)

    基于Matlab圖像處理的公路裂縫檢測實(shí)現(xiàn)

    隨著公路的大量投運(yùn),公路日常養(yǎng)護(hù)和管理已經(jīng)成為制約公路運(yùn)營水平提高的瓶頸,特別是路面狀態(tài)采集、檢測維護(hù)等工作更是對傳統(tǒng)的公路運(yùn)維模式提出了挑戰(zhàn)。這篇文章主要介紹了如何通過Matlab圖像處理實(shí)現(xiàn)公路裂縫檢測,感興趣的可以了解一下
    2022-02-02

最新評論