課程設(shè)計報告---學(xué)生成績管理系統(tǒng)_第1頁
已閱讀1頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  學(xué)生成績管理系統(tǒng) </b></p><p>  本題目設(shè)計目的是訓(xùn)練學(xué)生的基本編程能力,了解管理信息系統(tǒng)的開發(fā)流程,熟悉C語言的文件和單鏈表的各種基本操作。本程序中涉及結(jié)構(gòu)體、單鏈表、文件等方面的知識。通過本程序的訓(xùn)練,使學(xué)生能對C語言的文件操作有一個更深刻的了解,掌握利用單鏈表存儲結(jié)構(gòu)實(shí)現(xiàn)對學(xué)生成績管理的原理,為進(jìn)一步開發(fā)出高質(zhì)量的管理信息系統(tǒng)打下堅實(shí)的基礎(chǔ)。

2、</p><p><b>  一、問題定義</b></p><p>  創(chuàng)建一個學(xué)生成績管理系統(tǒng)。假設(shè)系統(tǒng)中每個學(xué)生記錄只包括班級、學(xué)號、姓名、性別、數(shù)學(xué)成績、英語成績、計算機(jī)成績、總分、平均分、名次等信息。程序的運(yùn)行效果如下圖所示,選擇任意菜單后,實(shí)現(xiàn)相應(yīng)功能。</p><p>  圖1.1 學(xué)生成績管理系統(tǒng)功能需求</p>

3、<p><b>  二、系統(tǒng)設(shè)計</b></p><p><b>  2.1 總體設(shè)計</b></p><p>  采用模塊化的程序設(shè)計方法,即將較大的任務(wù)按照一定的原則分為一個個較小的任務(wù),然后分別設(shè)計各個小任務(wù)。</p><p>  本成績管理系統(tǒng)要求采用單鏈表實(shí)現(xiàn),如上圖2.1所示,它由如下五大功能模塊組成

4、:</p><p>  輸入記錄模塊。完成將數(shù)據(jù)存入單鏈表的工作。記錄可以從以二進(jìn)制形式存儲的數(shù)據(jù)文件中讀入,也可從鍵盤逐個輸入學(xué)生記錄。學(xué)生記錄由學(xué)生的基本信息和成績信息字段構(gòu)成。當(dāng)從數(shù)據(jù)文件中讀入記錄時,也就是把在以記錄為單位存儲的數(shù)據(jù)文件中,將記錄逐條復(fù)制到單鏈表中。</p><p>  查詢記錄模塊。完成在單鏈表中查找滿足相關(guān)條件的學(xué)生記錄。在此成績管理系統(tǒng)中,用戶可以按照學(xué)生的班

5、級、學(xué)號、名次或姓名在單鏈表中進(jìn)行查找。若找到該學(xué)生的記錄,則返回指向該學(xué)生的記錄的指針。否則返回一個值為NULL的空指針,并打印出未找到該學(xué)生記錄的提示信息。</p><p>  更新記錄模塊。完成對學(xué)生記錄的維護(hù)。在此成績管理系統(tǒng)中,它實(shí)現(xiàn)了對學(xué)生記錄的刪除和排序操作,并將修改后的數(shù)據(jù)存入源數(shù)據(jù)文件。</p><p>  統(tǒng)計記錄模塊。完成對各門功課最高分和不及格人數(shù)的統(tǒng)計。</

6、p><p>  輸出記錄模塊。一是實(shí)現(xiàn)對學(xué)生記錄的存盤,即將記錄寫入數(shù)據(jù)文件中;二是實(shí)現(xiàn)將記錄信息以表格的形式在屏幕上打印出來。 </p><p><b>  2.2 詳細(xì)設(shè)計</b></p><p>  2.2.1數(shù)據(jù)結(jié)構(gòu)設(shè)計</p><p><b>  學(xué)生成績信息結(jié)構(gòu)體</b></p>

7、<p>  #ifndef H_STUDENT_HH /*如果H_STUDENT_HH沒有定義*/</p><p>  #define H_STUDENT_HH /*那就定義 H_STUDENT_HH */</p><p>  #include <stdio.h></p><p>

8、  #include <string.h></p><p>  #include <malloc.h></p><p>  #define LEN sizeof(struct message_student) /*一個結(jié)構(gòu)體數(shù)組元素的長度*/</p><p>  #define numsubs 3

9、/*學(xué)科數(shù)目*/</p><p>  typedef struct message_student /*結(jié)構(gòu)體定義*/</p><p><b>  {</b></p><p>  char number[6]; /*學(xué)號*/</p><p>  char

10、 number1[6]; /*班級*/</p><p>  char name[20]; /*學(xué)生姓名*/</p><p>  char sex[4]; /*性別*/</p><p>  float subject[n

11、umsubs]; /*科目*/</p><p>  float score; /*總分*/</p><p>  float average; /*平均分*/</p><p>  int index;</p>

12、<p><b>  }student;</b></p><p>  extern int numstus; /*學(xué)生數(shù)目*/</p><p>  extern student *pointer; /*指向結(jié)構(gòu)體

13、數(shù)組*/</p><p>  extern int lens;</p><p>  int menu_select(); /*聲明函數(shù)*/</p><p>  int dakaiwenjian(student stu[]); /*打開文件*/<

14、/p><p>  int chaxunjilu(student stud[]); /*查詢記錄*/</p><p>  int cunchujilu(student stud[]); /*存儲記錄*/</p><p>  void huanying();

15、 /*歡迎界面*/</p><p>  void xianshijilu1(); /*顯示記錄*/</p><p>  void showtable(); /*顯示桌面*/</p><p>  void paixu(student

16、 stu[]); /*排序*/</p><p>  void shanchujilu(student stu[],int i); /*刪除*/</p><p>  void tianjiajilu(student stud[]); /*添加記錄*/</p>

17、<p>  void xianshijilu(student stud[],int n1,int n2); /*顯示記錄*/</p><p>  void xiugaijilu(student stud[]); /*修改記錄*/</p><p>  void jishu(student stud[]);

18、 /*為記錄計數(shù)*/</p><p>  void paixunum(student stud[]); /*為記錄排序*/</p><p>  void paixunum2(student stud[]); /*為記錄排序*/</p><p>  void pa

19、ixuname(student stud[]); /*為記錄排序*/</p><p>  void paixuname2(student stud[]); /*為記錄排序*/</p><p>  void paixujishu(student stud[]); /*為記錄排序*

20、/</p><p>  void paixujishu2(student stud[]); /*為記錄排序*/</p><p>  void tongjishuju(student stud[]); /*統(tǒng)計記錄*/</p><p>  void xianshijilu1();

21、 /*顯示記錄*/</p><p>  2.2.2 主控main()函數(shù)執(zhí)行流程</p><p>  本成績管理系統(tǒng)根據(jù)按鍵判斷。</p><p>  在判斷鍵值時,有效的輸入為本0至8之間的任意數(shù)值,其他輸入都被視為錯誤按鍵。若輸入為0(即變量select=0),它會繼續(xù)判斷,如果對記錄進(jìn)行過更新操作,那么是否已經(jīng)

22、保存過新的數(shù)據(jù),若沒有,則全局變量saveflage=1,系統(tǒng)會提示用戶是否需要進(jìn)行數(shù)據(jù)存盤操作,用戶輸入y或n,系統(tǒng)會自動進(jìn)行存盤操作后再執(zhí)行退出成績管理系統(tǒng)的操作。</p><p>  若選擇1,則調(diào)用tianjiajilu函數(shù),執(zhí)行增加學(xué)生記錄操作;</p><p>  若選擇2,則調(diào)用chaxunjilu函數(shù),執(zhí)行查詢學(xué)生記錄操作;</p><p>  若選

23、擇3,則首先調(diào)用chaxunjilu函數(shù),執(zhí)行查詢學(xué)生記錄操作,查找出學(xué)生紀(jì)錄后再調(diào)用shanchujilu函數(shù),執(zhí)行刪除學(xué)生記錄操作;</p><p>  若選擇4,則調(diào)用sort函數(shù),執(zhí)行按降序排序?qū)W生記錄操作;</p><p>  若選擇5,則調(diào)用tongjishuju函數(shù),執(zhí)行統(tǒng)計學(xué)生記錄操作;</p><p>  若選擇6,則調(diào)用dakaiwenjian函

24、數(shù),打開一個已儲存的文件;</p><p>  若選擇8,則調(diào)用cunchujilu函數(shù),執(zhí)行將學(xué)生記錄存入數(shù)據(jù)文件的操作;</p><p>  若選擇0,break,退出系統(tǒng);</p><p>  若輸入為0~9之外的值,default,給出按鍵錯誤的提示"輸入錯誤,請輸入數(shù)字0~8:"。</p><p><b&g

25、t;  函數(shù)功能描述</b></p><p>  函數(shù)名: strcmp 功  能: 串比較 用  法: int strcmp(char *str1, char *str2); 程序例: </p><p>  #include <string.h> #include <stdio.h> </p><p>

26、;  int main(void)  {     char *buf1 = "aaa", *buf2 = "bbb", *buf3 = "ccc";     int ptr; </p><p>  ptr = strcmp(buf2, buf1);   &#

27、160; if (ptr > 0)        printf("buffer 2 is greater than buffer 1\n");     else        printf("buffer 2 is less than buffer

28、 1\n"); </p><p>  ptr = strcmp(buf2, buf3);     if (ptr > 0)        printf("buffer 2 is greater than buffer 3\n");     else &

29、#160;      printf("buffer 2 is less than buffer 3\n"); </p><p>  return 0;  }</p><p>  函數(shù)名: getchar 功  能: 從stdin流中讀字符 用  法: int getchar(void)

30、; 程序例: </p><p>  #include <stdio.h> </p><p>  int main(void) {    int c; </p><p>  /* Note that getchar reads from stdin and       is li

31、ne buffered; this means it will       not return until you press ENTER. */ </p><p>  while ((c = getchar()) != '\n')       printf("%c", c

32、); </p><p>  return 0; }</p><p>  函數(shù)名: gets 功  能: 從流中取一字符串 用  法: char *gets(char *string); 程序例: </p><p>  #include <stdio.h> </p><p>  int main(void

33、) {    char string[80]; </p><p>  printf("Input a string:");    gets(string);    printf("The string input was: %s\n",    string);   

34、; return 0; }</p><p>  函數(shù)名: fopen 功  能: 打開一個流 用  法: FILE *fopen(char *filename, char *type); 程序例: </p><p>  #include <stdlib.h> #include <stdio.h> #include <dir.h&

35、gt; </p><p>  int main(void) {     char *s;     char drive[MAXDRIVE];     char dir[MAXDIR];     char file[MAXFILE];     char e

36、xt[MAXEXT];     int flags; </p><p>  s=getenv("COMSPEC"); /* get the comspec environment parameter */     flags=fnsplit(s,drive,dir,file,ext); </p><p> 

37、 printf("Command processor info:\n");     if(flags & DRIVE)        printf("\tdrive: %s\n",drive);     if(flags & DIRECTORY) 

38、0;      printf("\tdirectory: %s\n",dir);     if(flags & FILENAME)        printf("\tfile: %s\n",file);     if

39、(flags & EXTENSION)        printf("\textension: %s\n",ext); </p><p>  return 0; }</p><p>  函數(shù)名: fscanf 功  能: 從一個流中執(zhí)行格式化輸入 用  法: int fsca

40、nf(FILE *stream, char *format[,argument...]); 程序例: </p><p>  #include <stdlib.h> #include <stdio.h> </p><p>  int main(void) {    int i; </p><p>  printf(&

41、quot;Input an integer: "); </p><p>  /* read an integer from the       standard input stream */    if (fscanf(stdin, "%d", &i))    

42、0;  printf("The integer read was: %i\n",              i);    else    {       fprintf(stderr, &qu

43、ot;Error reading an \               integer from stdin.\n");       exit(1);    }    return 0; }</

44、p><p>  函數(shù)名: fgetc 功  能: 從流中讀取字符 用  法: int fgetc(FILE *stream); 程序例: </p><p>  #include <string.h> #include <stdio.h> #include <conio.h> </p><p>  int

45、main(void) {    FILE *stream;    char string[] = "This is a test";    char ch; </p><p>  /* open a file for update */    stream = fopen("DUMMY.FIL&

46、quot;, "w+"); </p><p>  /* write a string into the file */    fwrite(string, strlen(string), 1, stream); </p><p>  /* seek to the beginning of the file */    fsee

47、k(stream, 0, SEEK_SET); </p><p>  do    {       /* read a char from the file */       ch = fgetc(stream); </p><p>  /* display the

48、character */       putch(ch);    } while (ch != EOF); </p><p>  fclose(stream);    return 0; }</p><p>  函數(shù)名: fprintf 功  能: 傳送格式化輸出到一個流中 用&

49、#160; 法: int fprintf(FILE *stream, char *format[, argument,...]); 程序例: </p><p>  /* Program to create backup of the    AUTOEXEC.BAT file */ </p><p>  #include <stdio.h> </p&

50、gt;<p>  int main(void) {    FILE *in, *out; </p><p>  if ((in = fopen("\\AUTOEXEC.BAT", "rt"))        == NULL)    {  &#

51、160;    fprintf(stderr, "Cannot open input \        file.\n");       return 1;    } </p><p>  if ((out = fopen(&qu

52、ot;\\AUTOEXEC.BAK", "wt"))        == NULL)    {       fprintf(stderr, "Cannot open output \        fi

53、le.\n");       return 1;    } </p><p>  while (!feof(in))       fputc(fgetc(in), out); </p><p>  fclose(in);    fcl

54、ose(out);    return 0; }</p><p>  函數(shù)名: strcpy 功  能: 串拷貝 用  法: char *strcpy(char *str1, char *str2); 程序例: </p><p>  #include <stdio.h> #include <string.h> &l

55、t;/p><p>  int main(void)  {     char string[10];     char *str1 = "abcdefghi"; </p><p>  strcpy(string, str1);     printf("%s\n

56、", string);     return 0;  }</p><p><b>  三、總結(jié)</b></p><p>  為期三周的高級語言程序設(shè)計結(jié)束了。這學(xué)期后期,我們被通知要進(jìn)行三周的課程設(shè)計。當(dāng)時有點(diǎn)懵,感覺學(xué)的東西很少,很零散,不知該怎么聯(lián)到一起,就要課程設(shè)計,是不是太難為我們了。 第一天基本上

57、都是在看書,把基本知識再熟悉一邊。老師發(fā)過來20道設(shè)計題目題,但我們幾乎不知道怎樣完成這些任務(wù),不過任務(wù)中還附帶著一些設(shè)計樣例,從這幾道樣例上我得到了不少啟發(fā),然后我們組把整個程序的思路理清了,開始著手寫程序。第一周結(jié)束的時候,我感覺自己收獲挺大的,從一開始的迷茫,不知道從何下手到把程序中的幾個模塊編寫出來,心里挺開心的。但是,到了第二周,我們由不得不再次陷入困境。在整個程序的編寫過程中。最難的就是修改和刪除這兩個模塊,這也是我們第二

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論