C語言課設(shè)-唱歌比賽評分系統(tǒng)_第1頁
C語言課設(shè)-唱歌比賽評分系統(tǒng)_第2頁
C語言課設(shè)-唱歌比賽評分系統(tǒng)_第3頁
C語言課設(shè)-唱歌比賽評分系統(tǒng)_第4頁
C語言課設(shè)-唱歌比賽評分系統(tǒng)_第5頁
已閱讀5頁,還剩29頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、沈陽航空航天大學(xué)課程設(shè)計學(xué) 號班 級姓 名指導(dǎo)教師年 月 日沈陽航空航天大學(xué)課程設(shè)計任務(wù)書學(xué)院:學(xué)號:專業(yè): 班級:題目:唱歌比賽評委評分系統(tǒng)一、課程設(shè)計時間二、課程設(shè)計內(nèi)容參加唱歌比賽 3 位選手的名稱和出場順序存放在文件 file22.txt 中;評委共有 7 個。每當(dāng)一個選手表演之后, 7 個評委都分別評分 (010 分),而選手的最終得分計算規(guī)則為: 去掉 7 個評分的最高和最低分, 取剩下 5 個評分的平均值。 程 序最后打印出 3 位選手的成績。三、課程設(shè)計要求程序質(zhì)量:貫徹結(jié)構(gòu)化的程序設(shè)計思想。 用戶界面友好,功能明確,操作方便。 用戶界面中的菜單至少應(yīng)包括“讀取并顯示選手名 單

2、”、“表演與評分” 、“打印最后成績” 、“退出” 4項。 代碼應(yīng)適當(dāng)縮進(jìn),并給出必要的注釋,以增強程序的 可讀性。課程設(shè)計說明書:課程結(jié)束后,上交課程設(shè)計說明書和源程序。課程設(shè) 計說明書的內(nèi)容參見提供的模板。四、指導(dǎo)教師和學(xué)生簽字學(xué)生簽名: 指導(dǎo)教師: 五、成績六、教師評語一、需求分析 二、設(shè)計分析三、主要界面截圖四、技術(shù)要點五、個人總結(jié)六、參考文獻(xiàn)七、源程序一、需求分析根據(jù)任務(wù)書給定的“課程設(shè)計內(nèi)容”和“課程設(shè)計要求”作如 下的需求分析。該系統(tǒng)是一個分?jǐn)?shù)錄入以及評定系統(tǒng), 其使用者被假定為某歌 唱比賽的管理人員,系統(tǒng)應(yīng)該具有安全、穩(wěn)定、功能齊全的特點。1. 安全性分析 系統(tǒng)管理的數(shù)據(jù)涉及到

3、參賽的所有選手,為防止他人惡意修 改,所以在進(jìn)入評分系統(tǒng)前有密碼程序,只有掌握了正確的密碼才 能進(jìn)入程序進(jìn)行各項操作。2. 穩(wěn)定性分析 指系統(tǒng)比較健壯,只要是用戶的合理操作,系統(tǒng)都應(yīng)給出合理 正確的回應(yīng),而不是出現(xiàn)令用戶感到意外的系統(tǒng)錯誤或系統(tǒng)崩潰。3. 主要功能分析(1)密碼程序:在程序尾端設(shè)置好密碼,只有掌握密碼的管 理員才能進(jìn)入程序進(jìn)行成績錄入,修改等操作,避免信息被他人修 改,造成比賽不公(2)菜單:有一個功能強大又清晰明了的菜單能極大程度方 便管理員的操作(3)數(shù)據(jù)輸入:在每個輸入前都有詳細(xì)分類和提示,簡單明 了,根據(jù)提示輸入?yún)①愡x手號數(shù),姓名,各個評委打分成績(4)數(shù)據(jù)保存:對于輸

4、入的數(shù)據(jù),或被修改的數(shù)據(jù)應(yīng)該保存 到某個磁盤文件中,實現(xiàn)永久存儲。運用了指針函數(shù)后便可實現(xiàn)該 功能。將輸入的選手信息存儲到自動生成的文件中,以便于程序自動讀取或人工閱讀(5) 成績排名:利用冒泡程序?qū)?shù)組進(jìn)行排序,刪除一個最 高與最低然后進(jìn)行講剩下的值平均,得出選手最終得分,再根據(jù)分 數(shù)高低排名(6 )數(shù)據(jù)查詢:用戶輸入查詢條件,系統(tǒng)規(guī)則地在界面顯示 查詢結(jié)果,不光可以輸入號數(shù),查詢到該選手信息,每位評委打分; 還可以選擇排名查詢,顯示的數(shù)據(jù)全面。、設(shè)計分析主要有9個功能模塊,每個模塊對應(yīng)一個 C語言自定義函數(shù)這些函數(shù)原型及其功能簡述如下:(1)密碼程序plus()輸入密碼不正確(2)參賽選手

5、信息錄入creat正確密碼正確與否終止程序Printf參賽選手號數(shù)Printf開始進(jìn)入程序界面生名(3)(4)Printf7位評委打分是否繼續(xù)輸入是否重新執(zhí)行開頭返回主菜單瀏覽選手?jǐn)?shù)據(jù)browse()查詢選手成績search()(5) 刪除函數(shù)del()(6) 查詢選手信息print()(7) 菜單函數(shù)menu()(8) 修改函數(shù)update()(9) 指針函數(shù)rank() (10)保存函數(shù)save()三、主要界面截圖圖1進(jìn)入程序輸入密碼界面圖2程序主界面圖3選手信息錄入圖4選手信息瀏覽圖5單個選手成績查詢圖6選手排名查詢圖7選手信息修改圖8選手信息刪除圖9程序退出四、技術(shù)要點1冒泡程序應(yīng)用運

6、用冒泡程序?qū)Ω鱾€參賽選手排序, 并去除頭與尾即最高分和 最低分,將剩下的評委得分運算得出選手最終平均分, 然后再排序, 便能得出選手名次。for(i=0;i<N-1;i+)/冒泡排序法讓那個成績從小到大排列,然后選出最大值是最后一個, 最小值是第一個for(j=0;j<N-1-i;j+) if(p1->gradesj>p1->gradesj+1) t=p1->gradesj;p1->gradesj=p1->gradesj+1;p1->gradesj+1=t;p1->ave=(p1->ave-(p1->grades0+p1-

7、>grades9)/8;/ 去掉一個最高分,去掉一個這一低分,得出最后的平均分2、文件操作包括了文件的寫入和讀取兩個方面。 運用指針程序文件的寫入 操作,用于保存錄入的數(shù)據(jù),也用于保存所修改的數(shù)據(jù)。例如下段 程序。void save()/ 將數(shù)據(jù)保存到文件FILE *fp;S_MESSAGE *p1;/=(S_MESSAGE *)malloc(LEN);p1=head;fp=fopen(" 參賽選手名單 .txt","w");fprintf(fp,"|n");fprintf(fp," 編號 | 姓名 n");

8、while(p1 != NULL)fprintf(fp,"|n");fprintf(fp," %-9d%-6sn",p1->num,p1->name); p1=p1->next;fprintf(fp,"|n");fclose(fp);printf("nt 文件已將保存到 " 參賽選手名單 .txt"");3、關(guān)于刪除算法實現(xiàn)從系統(tǒng)中刪除某位同學(xué)的相關(guān)信息的算法稍微復(fù)雜一些,其實質(zhì)是對數(shù)組某個或某些元素的刪除操作。 對數(shù)組元素的刪除操 作完成后,再將數(shù)組寫入到文件中,就完整地實現(xiàn)

9、了“刪除” 。void del()S_MESSAGE *node;/=(S_MESSAGE *)malloc(LEN);S_MESSAGE *p1;int check=0; /用來進(jìn)行判斷,是否找到了要刪除的信息long del_num;printf("n 請輸入要刪除的選手的編號: ");scanf("%d",&del_num);if(head = NULL && tail =NULL)printf("n 當(dāng)前信息記錄為空,刪除失?。?n");elsenode=head;p1=head;while(node

10、!= NULL)if(node->num = del_num)printf("n刪除信息成功n");printf("|n");printf(" 編號 | 姓名 n");printf("|n");printf(" %-9d%-6sn",node->num,node->name);/ 在這里找到了要刪除的選手信息printf("|n");check=1;/ 找到要刪除的信息,賦為真if(node = head && head->next =

11、 NULL)/ 是頭結(jié)點,并且只有一個結(jié)點head=NULL;tail=head;free(node);printf("n 刪除信息成功n"); / 刪除唯一的節(jié)點else if(node = head && head->next != NULL)/ 刪除頭節(jié)點node=head;head=head->next;free(node);n"); /n"); /n"); /頭節(jié)點刪除成功n=n-1;else if(node ->next != NULL) / 刪除中間節(jié)點 p1->next=node->

12、next; free(node);printf("n 刪除信息成功中間節(jié)點刪除成功n=n-1;else if(node->next = NULL) / 刪除尾節(jié)點 p1->next=NULL; tail=p1; free(node); printf("n 刪除信息成功尾節(jié)點刪除成功 n=n-1;getchar();return;elsep1= node;node=no de->n ext;if(head != NULL && check = 0)prin tf("n對不起,你要刪除的選手信息不存在!n");getchar

13、();五、個人總結(jié)自從拿到題目到完成整個編程,從理論到實踐,在整整一個星期的日子里,可以學(xué)到很多很多的的東西,同時不僅可以鞏固了以前所學(xué)過的知識,而且 學(xué)到了很多在書本上所沒有學(xué)到過的知識。通過這次課程設(shè)計使我懂得了理 論與實際相結(jié)合是很重要的,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理 論知識與實踐相結(jié)合起來,從理論中得出結(jié)論,才能真正為社會服務(wù),從而 提高自己的實際動手能力和獨立思考的能力。在設(shè)計的過程中遇到問題,這 畢竟獨立做的,難免會遇到過各種各樣的問題,同時在設(shè)計的過程中發(fā)現(xiàn)了 自己的不足之處,對以前所學(xué)過的知識理解得不夠深刻,掌握得不夠牢固, 比如說結(jié)構(gòu)體 通過這次課程設(shè)計之后,一定

14、把以前所學(xué)過的知識重新溫 故。這次課程設(shè)計終于順利完成了,在設(shè)計中遇到了很多編程問題,最后在謝老 師的辛勤指導(dǎo)下,終于游逆而解。對給過我?guī)椭乃型瑢W(xué)和各位指導(dǎo)老師 再次表示忠心的感謝!六、參考文獻(xiàn)(參考的書籍或互聯(lián)網(wǎng)資源)1 譚浩強 C 程序設(shè)計北京:清華大學(xué)出版社, 20052 網(wǎng)絡(luò)資源加密程序七、源程序/* 密碼:123456 只有密碼輸入正確 , 才能進(jìn)入 plus 程序.*/#include <stdio.h>#include <stdlib.h>#include <conio.h>#include <string.h>#include

15、 <malloc.h>#define LEN sizeof(S_MESSAGE)#define N 7typedef struct songerr/定義選手信息鏈表結(jié)構(gòu)long num;/選手編號char name20;/選手姓名float gradesN;/選手成績double ave;/平均成績struct songer * next;/鏈表的結(jié)點, next 是指針變量,指向結(jié)構(gòu)體變量S_MESSAGE;S_MESSAGE *head;/定義鏈表的頭指針S_MESSAGE *tail;/定義鏈表的尾指針int n=0;/n 為全局變量,用于統(tǒng)計結(jié)點的個數(shù)void creat(

16、);/建立單向動態(tài)鏈表。此函數(shù)帶回一個指向鏈表頭的指針 , 用于參賽選手的錄入void del();/用于刪除結(jié)點,用于參賽選手的刪除void search();/參賽選手成績的查詢void print();/用于輸出鏈表void rank();/按個人平均成績從高到低的順序進(jìn)行排序void update();/參賽選手的修改void menu();/操作系統(tǒng)菜單界面void menu_select();/菜單選擇界面void browse();/選手信息瀏覽void save();/選手信息保存void quit();/退出系統(tǒng)界面/* rank函數(shù)*/void rank()S_MESSAG

17、E *p1,*p2,*endpt,*p; / *endpt/* 控制循環(huán)比較*/ *p/* 臨時指針變量 */ n=0;p1=head;if(head = NULL && tail = NULL) printf("n 當(dāng)前信息記錄為空 n");elsep1 = (S_MESSAGE *)malloc(LEN);p1->next = head; /* 注意理解:我們增加一個節(jié) 點,放在第一個節(jié)點的前面,主要是為了便于比較。因為第一個節(jié) 點沒有前驅(qū),我們不能交換地址。 */head = p1;/*讓head指向pl節(jié)點,排序完成后,我們再把 p1 節(jié)點釋放

18、掉 */for(endpt=NULL; endpt!=head; endpt=p) /* 結(jié)合第 6 點 理解*/for(p=p1=head; p1->next->next!=endpt;p1=p1->next)if(p1->next->ave < p1->next->next->ave)/* 如果前面的節(jié)點鍵值比后面節(jié)點的鍵值小,則交換 */p2 = p1->next->next;/1、排序后q節(jié)點指向p節(jié)點,在調(diào)整指向之前,我們要保存原 p的指向 節(jié)點地址,即: p2=p1->next->nextp1->n

19、ext->next = p2->next; /2 、順著這一步一步往下推 , 排序后 p1->next->next 要指的是 p2->next,所以 p1->next->next=p2->nextp2->next = p1->next;/3 、p2->next 原是 q 發(fā)出來的指向,排序后 q 的指向要變?yōu)橹赶?p 的, 而原來 p1->next 是指向 p 的,所以 p2->next=p1->nextp1->next = p2; /4 、 p1->next 原是指向 p 的,排序后圖 16 中

20、p1->next 要指向 q, 原來 p1->next->next(即 p2)是指向 q 的,所以 p1->next=p2p = p1->next->next;/5、至此,完成了相鄰兩節(jié)點的順序交換把pl的信息去掉*/讓head指向排序后的第一個釋放 p1*/選手成績排名信息如下p1 = head;/*head = head->next; /* 節(jié)點*/free(p1);/*printf("nn");printf("|n");printf(" 編號 | 姓名 | 平均成績 | 名次 n");p

21、1=head;while(p1 != NULL)printf("|n");printf(" %-9d%-9s%-9.1lf%-5dn",p1->num,p1->name,p1- >ave,n+1);n+;p1=p1->next;printf("|n");getchar();/* print函數(shù)*/void print()S_MESSAGE * p1=(S_MESSAGE *)malloc(LEN);int check=0,i;long seeknum;printf("n 請輸入要查找的選手編號: &q

22、uot;);scanf("%d",&seeknum);if(head = NULL && tail = NULL )printf("n 對不起,當(dāng)前記錄為空 !n");elsep1=head;printf("n 你要找的選手的成績?nèi)缦?n");/在這里找到了要查找的選手成績printf("|-|n");printf(" 編號 | 姓名 | 成績| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 平均成績 n");printf("|-|n");w

23、hile(p1 != NULL)if(p1->num = seeknum)printf(" %-7d%-6s",p1->num,p1->name); printf(" ");for(i=0;i<N;i+)printf(" %.1f ",p1->gradesi);printf(" %-6.2lfn",p1->ave);check=1;getchar();return;else p1=p1->next;if(head != NULL && check = 0)p

24、rintf("n 對不起,你查看的選手成績不存在 !n");getchar();/* search函數(shù)*/void search()int c;printf("n 請選擇查詢內(nèi)容: n");printf("1. 選手詳細(xì)成績查詢 2. 選手排名查詢 n 請輸入您 的選擇: ");scanf("%d",&c);switch(c)case 1:system("cls");print();break;case 2:system("cls");rank();break;/*

25、save 函數(shù)*/void save()/ 將數(shù)據(jù)保存到文件FILE *fp;S_MESSAGE *p1;/=(S_MESSAGE *)malloc(LEN); p1=head;fp=fopen(" 參賽選手名單 .txt","w");fprintf(fp,"|n");fprintf(fp," 編號 | 姓名 n");while(p1 != NULL)fprintf(fp,"|n");fprintf(fp," %-9d%-6sn",p1->num,p1->name

26、); p1=p1->next;fprintf(fp,"|n");fclose(fp);printf("nt 文件已將保存到 " 參賽選手名單 .txt""); /* update函數(shù)*/void update()S_MESSAGE *p1;/=(S_MESSAGE *)malloc(LEN);int check=0; / 用來進(jìn)行判斷,是否找到了要修改的信息 long updatenum;printf("n 請輸入要修改的選手編號 :"); scanf("%d",&updatenu

27、m);/ 查找到要修改的選手 if(head = NULL && tail = NULL)printf("n 當(dāng)前信息記錄為空 n");elsep1=head;while(p1 != NULL)if(p1->num = updatenum)printf("n 你要修改的選手信息如下n");printf("|n");printf("編號 | 姓名n");printf("|n");printf(" %-9d%-6sn",p1->num,p1->n

28、ame);printf("|n");printf("n 請重新寫入此選手信息:n");check=1;/ 從新寫入修改項目 printf("n 修改選手編號為: "); scanf("%d",&p1->num);printf("n 修改選手姓名為: "); scanf("%s",p1->name); return;elsep1=p1->next;if(head != NULL && check = 0)!n");printf

29、("n 對不起,你要修改的選手信息不存在getchar();/* browse函數(shù)*/void browse()S_MESSAGE *p1;if(head = NULL && tail = NULL)printf("n 當(dāng)前信息記錄為空 n");elseprintf("n 你要瀏覽的選手信息如下n");printf("|n");printf("編號 | 姓名 n");p1=head;while(p1 != NULL)printf("|n");printf("

30、%-9d%-6sn",p1->num,p1->name); p1=p1->next;printf("|n");/* del 函數(shù)*/void del()S_MESSAGE *node;/=(S_MESSAGE *)malloc(LEN);S_MESSAGE *p1;int check=0; / 用來進(jìn)行判斷,是否找到了要刪除的信息 long del_num;printf("n 請輸入要刪除的選手的編號: "); scanf("%d",&del_num);if(head = NULL &&am

31、p; tail =NULL)printf("n 當(dāng)前信息記錄為空,刪除失?。?n");elsenode=head;p1=head;while(node != NULL)if(node->num = del_num)printf("n 要刪除的選手信息n");printf("|n");printf(" 編號 | 姓名 n");printf("|n");printf(" %-9d%-6sn",node->num,node->name);/ 在這里找到了要刪除的選

32、手信息printf("|n");check=1;/ 找到要刪除的信息,賦為真if(node = head && head->next = NULL)/ 是頭結(jié)點,并且只有一個結(jié)點head=NULL;tail=head;free(node);printf("n 刪除信息成功n"); / 刪除唯一的節(jié)點else if(node = head && head->next != NULL)/ 刪除頭節(jié)點node=head; head=head->next; free(node);printf("n 刪除

33、信息成功n"); / 頭節(jié)點刪除成功n=n-1;刪除中間節(jié)點else if(node ->next != NULL) /p1->next=node->next; free(node);printf("n 刪除信息成功n"); / 中間節(jié)點刪除成功n=n-1;else if(node->next = NULL) / 刪除尾節(jié)點 p1->next=NULL; tail=p1; free(node);printf("n 刪除信息成功n"); / 尾節(jié)點刪除成功n=n-1;getchar(); return;elsep1=

34、node; node=node->next;if(head != NULL && check = 0)!n");printf("n 對不起,你要刪除的選手信息不存在 getchar();/* creat 函數(shù) */void creat()int i,j;float t;char c='y'while(c = 'y' | c = 'Y')S_MESSAGE *p1=(S_MESSAGE *)malloc(LEN); printf("n 請輸入要錄入的選手信息: n"); printf(&

35、quot;n 選手編號: ");scanf("%d",&p1->num);printf("n 選手姓名: "); scanf("%s",p1->name);printf("n 請輸入 7 位評委點評成績: "); p1->ave = 0;for(i=0;i<N;i+)scanf("%f",&(p1->gradesi); /runtimep1->ave += p1->gradesi;for(i=0;i<N-1;i+) /序法

36、讓那個成績從小到大排列,然后選出最大值是最后一個, 值是第一個for(j=0;j<N-1-i;j+)if(p1->gradesj>p1->gradesj+1)t=p1->gradesj;p1->gradesj=p1->gradesj+1;p1->gradesj+1=t; p1->ave=(p1->ave-(p1->grades0+p1->grades9)/8;/ 掉一個最高分,去掉一個這一低分,得出最后的平均分 p1->next=NULL;if(p1=NULL)printf("n 內(nèi)存分配失敗 n"

37、;);n=n-1;if(head = NULL && tail = NULL) /當(dāng)前沒有結(jié)點,一個結(jié)點error冒泡排最小創(chuàng)建第head=p1;head->next=NULL;tail=head;printf("n 選手信息錄入成功 n");else / 如果當(dāng)前還有節(jié)點則插入到尾部tail->next=p1; tail=p1;tail->next=NULL;printf("n 選手信息錄入成功 n");printf(" 是否繼續(xù) (Y/N):");getchar();scanf("%c&

38、quot;,&c);/* quit函數(shù)*/void quit()printf("nnt= 感謝您使用歌唱比賽評分系統(tǒng)=nn");/* menu 函數(shù)*/void menu()printf("nnt* 歌唱比賽評分系統(tǒng)(制作人況思雨)*nn");printf("1.選手信息瀏覽2.n");printf("3.選手信息保存4.n");printf("5.選手信息修改6.n");printf("7.退出系統(tǒng)n");printf("n *系統(tǒng)菜單選擇界面選手信息錄入選手成績查詢選手信息刪除*n"););函數(shù)不管用戶輸入的是數(shù)字鍵或是字printf("t>> 請根據(jù)您想執(zhí)行的命令, 輸入對應(yīng)功能

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論