#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#define STU_NUM 40 /* 最多的學(xué)生人數(shù) */
#define COURSE_NUM 10 /* 最多的考試科目 */
struct student
{
int number; /* 每個(gè)學(xué)生的學(xué)號(hào) */
char name[10]; /* 每個(gè)學(xué)生的姓名 */
int score[COURSE_NUM]; /* 每個(gè)學(xué)生M門(mén)功課的成績(jī) */
int sum; /* 每個(gè)學(xué)生的總成績(jī) */
float average; /* 每個(gè)學(xué)生的平均成績(jī) */
};
typedef struct student STU;
/* 函數(shù)功能: 向鏈表的末尾添加從鍵盤(pán)輸入學(xué)生的學(xué)號(hào)、姓名和成績(jī)等信息
函數(shù)參數(shù): 結(jié)構(gòu)體指針head,指向存儲(chǔ)學(xué)生信息的結(jié)構(gòu)體數(shù)組的首地址
整型變量n,表示學(xué)生人數(shù)
整型變量m,表示考試科目
函數(shù)返回值: 無(wú)
*/
void AppendScore(STU *head, int n, int m)
{
int j;
STU *p;
for (p=head; p<head+n; p++)
{
printf("\nInput number:");
scanf("%d", &p->number);
printf("Input name:");
scanf("%s", p->name);
for (j=0; j<m; j++)
{
printf("Input score%d:", j+1);
scanf("%d", p->score+j);
}
}
}
/* 函數(shù)功能: 打印n個(gè)學(xué)生的學(xué)號(hào)、姓名和成績(jī)等信息
函數(shù)參數(shù): 結(jié)構(gòu)體指針head,指向存儲(chǔ)學(xué)生信息的結(jié)構(gòu)體數(shù)組的首地址
整型變量n,表示學(xué)生人數(shù)
整型變量m,表示考試科目
函數(shù)返回值: 無(wú)
*/
void PrintScore(STU *head, int n, int m)
{
STU *p;
int i;
char str[100] = {'\0'}, temp[3];
strcat(str, "Number Name ");
for (i=1; i<=m; i++)
{
strcat(str, "Score");
itoa(i,temp, 10);
strcat(str, temp);
strcat(str, " ");
}
strcat(str," sum average");
printf("%s", str); /* 打印表頭 */
for (p=head; p<head+n; p++) /* 打印n個(gè)學(xué)生的信息 */
{
printf("\nNo.%3d%8s", p->number, p->name);
for (i=0; i<m; i++)
{
printf("%7d", p->score[i]);
}
printf("%11d%9.2f\n", p->sum, p->average);
}
}
/* 函數(shù)功能: 計(jì)算每個(gè)學(xué)生的m門(mén)功課的總成績(jī)和平均成績(jī)
函數(shù)參數(shù): 結(jié)構(gòu)體指針head,指向存儲(chǔ)學(xué)生信息的結(jié)構(gòu)體數(shù)組的首地址
整型變量n,表示學(xué)生人數(shù)
整型變量m,表示考試科目
函數(shù)返回值: 無(wú)
*/
void TotalScore(STU *head, int n, int m)
{
STU *p;
int i;
for (p=head; p<head+n; p++)
{
p->sum = 0;
for (i=0; i<m; i++)
{
p->sum = p->sum + p->score[i];
}
p->average = (float)p->sum / m;
}
}
/* 函數(shù)功能: 用選擇法按總成績(jī)由高到低排序
函數(shù)參數(shù): 結(jié)構(gòu)體指針head,指向存儲(chǔ)學(xué)生信息的結(jié)構(gòu)體數(shù)組的首地址
整型變量n,表示學(xué)生人數(shù)
函數(shù)返回值: 無(wú)
*/
void SortScore(STU *head, int n)
{
int i, j, k;
STU temp;
for (i=0; i<n-1; i++)
{
k = i;
for (j=i; j<n; j++)
{
if ((head+j)->sum > (head+k)->sum)
{
k = j;
}
}
if (k != i)
{
temp = *(head+k);
*(head+k) = *(head+i);
*(head+i) = temp;
}
}
}
/* 函數(shù)功能: 查找學(xué)生的學(xué)號(hào)
函數(shù)參數(shù): 結(jié)構(gòu)體指針head,指向存儲(chǔ)學(xué)生信息的結(jié)構(gòu)體數(shù)組的首地址
整型變量num,表示要查找的學(xué)號(hào)
整型變量n,表示學(xué)生人數(shù)
函數(shù)返回值: 如果找到學(xué)號(hào),則返回它在結(jié)構(gòu)體數(shù)組中的位置,否則返回-1
*/
int SearchNum(STU *head, int num, int n)
{
int i;
for (i=0; i<n; i++)
{
if ((head+i)->number == num) return i;
}
return -1;
}
/* 函數(shù)功能: 按學(xué)號(hào)查找學(xué)生成績(jī)并顯示查找結(jié)果
函數(shù)參數(shù): 結(jié)構(gòu)體指針head,指向存儲(chǔ)學(xué)生信息的結(jié)構(gòu)體數(shù)組的首地址
整型變量n,表示學(xué)生人數(shù)
整型變量m,表示考試科目
函數(shù)返回值: 無(wú)
*/
void SearchScore(STU *head, int n, int m)
{
int number, findNo;
printf("Please Input the number you want to search:");
scanf("%d", &number);
findNo = SearchNum(head, number, n);
if (findNo == -1)
{
printf("\nNot found!\n");
}
else
{
PrintScore(head+findNo, 1, m);
}
}
/* 函數(shù)功能: 顯示菜單并獲得用戶(hù)鍵盤(pán)輸入的選項(xiàng)
函數(shù)參數(shù): 無(wú)
函數(shù)返回值: 用戶(hù)輸入的選項(xiàng)
*/
char Menu(void)
{
char ch;
printf("\nManagement for Students' scores\n");
printf(" 1.Append record\n");
printf(" 2.List record\n");
printf(" 3.Search record\n");
printf(" 4.Sort record\n");
printf(" 0.Exit\n");
printf("Please Input your choice:");
scanf(" %c", &ch); /*在%c前面加一個(gè)空格,將存于緩沖區(qū)中的回車(chē)符讀入*/
return ch;
}
標(biāo)簽: it |
摘
Student result management the system is the part of education unit indispensability, its contents says all to the pass importance for the decision maker of school and the governor, so student the result manage the system should be able to provide ample information and fast search means for customer.But always people use the way management of traditional artificial document file, this management way exists much weakness.Along with science technique of continuously raise, calculator science is gradual maturity, it the strong function have already profoundly known for people, it has already got into mankind's each realm of society to erupt to flick a more and more important function.As a part of the calculator application, usage the calculator carry on a management to student's information and the result and have the handicraft management cans not compare to of advantage.
一.課程設(shè)計(jì)目的
1、熟練掌握C語(yǔ)言課程中所學(xué)的理論知識(shí);
2、通過(guò)綜合C語(yǔ)言的基本知識(shí)來(lái)解決實(shí)際問(wèn)題;
3、加強(qiáng)分析和解決問(wèn)題的能力。
通過(guò)這次的課程設(shè)計(jì),能加強(qiáng)我們對(duì)程序設(shè)計(jì)的思考、設(shè)計(jì)、分析、理解和解決問(wèn)題的能力。對(duì)于我們初學(xué)者來(lái)說(shuō),主要是學(xué)習(xí)成長(zhǎng)設(shè)計(jì)的方法,進(jìn)行程序設(shè)計(jì)的基本訓(xùn)練為將來(lái)進(jìn)一步學(xué)習(xí)打下基礎(chǔ)。課程設(shè)計(jì)不能之掌握概念,還要?jiǎng)邮志幊?、上機(jī)調(diào)試運(yùn)行。只有自己動(dòng)手,才能學(xué)的更多。
二.課程設(shè)計(jì)題目描述和要求
1.題目:學(xué)生成績(jī)管理系統(tǒng). 在程序設(shè)計(jì)時(shí)將其逐步細(xì)化,每個(gè)模塊由一個(gè)函數(shù)實(shí)現(xiàn),整個(gè)程序通過(guò)函數(shù)調(diào)用聯(lián)系。使用函數(shù)思想編寫(xiě)程序,程序中的每個(gè)模塊都做成函數(shù)形式,由主函數(shù)調(diào)用子函數(shù)。在各個(gè)功能模塊設(shè)計(jì)時(shí)根據(jù)其具體功能使用所學(xué)知識(shí)進(jìn)行設(shè)計(jì),例如:在需要循環(huán)輸出時(shí)可以使用 for循環(huán),需要條件控制時(shí)可以使用if語(yǔ)句,在排序時(shí)可以使用冒泡法等。
2.要求:設(shè)計(jì)包含N個(gè)學(xué)生的數(shù)據(jù)信息的學(xué)生成績(jī)管理系統(tǒng),包括以下信息:
學(xué)號(hào) — num[10](字符串)、 姓名(拼音)— name[25](字符串)、
性別 — sex(字符,M或F)、 年齡 — age
三門(mén)課程成績(jī)(高數(shù)、英語(yǔ)、計(jì)算機(jī))— score [3](整型)。
三、課程設(shè)計(jì)報(bào)告內(nèi)容、算法分析及調(diào)試
1.設(shè)計(jì)步驟
(1)、需求分析:對(duì)系統(tǒng)的應(yīng)實(shí)現(xiàn)的功能進(jìn)行分析。
(2)、概要設(shè)計(jì):對(duì)系統(tǒng)功能進(jìn)行模塊分解,對(duì)模塊的功能及模塊之間的相互關(guān)系進(jìn)行說(shuō)明(如用到函數(shù),則對(duì)函數(shù)間的接口進(jìn)行說(shuō)明),對(duì)系統(tǒng)使用的數(shù)據(jù)結(jié)構(gòu)(各數(shù)組、主要變量的設(shè)置及其代表的含義)進(jìn)行說(shuō)明。
(3)、詳細(xì)設(shè)計(jì):用流程圖、偽代碼等方法對(duì)各主要算法進(jìn)行描述。
(4)、編寫(xiě)代碼:根據(jù)設(shè)計(jì)編寫(xiě)。源程序要按照程序的格式規(guī)范來(lái)編寫(xiě),要求結(jié)構(gòu)清晰,界面友好,關(guān)鍵部分有必要的注釋。
(5)、調(diào)試分析:準(zhǔn)備充分的測(cè)試數(shù)據(jù)對(duì)系統(tǒng)進(jìn)行調(diào)試(對(duì)錯(cuò)誤的數(shù)據(jù)輸入也要進(jìn)行測(cè)試,保證程序的容錯(cuò)性),并通過(guò)測(cè)試對(duì)系統(tǒng)提出改進(jìn)設(shè)想。
經(jīng)過(guò)我們這個(gè)小組一天的調(diào)試,我們終于把各自的模塊整合起來(lái)了,在這過(guò)程中,我們遇到了很多問(wèn)題,像數(shù)據(jù)不匹配,括號(hào)不配對(duì),賦值重復(fù)等。因?yàn)镃語(yǔ)言的語(yǔ)法限制不太嚴(yán)格,對(duì)變量的類(lèi)型約束不嚴(yán)格,影響程序的安全性,對(duì)數(shù)組下標(biāo)越界不作檢查等原因。但經(jīng)過(guò)我們這小組共同的努力,終于完成了。首先,我們用DO
四.總結(jié)
課程設(shè)計(jì)是培養(yǎng)學(xué)生綜合運(yùn)用所學(xué)知識(shí),發(fā)現(xiàn),提出,分析和解決實(shí)際問(wèn)題,鍛煉實(shí)踐能力的重要環(huán)節(jié),是對(duì)學(xué)生實(shí)際工作能力的具體訓(xùn)練和考察過(guò)程.隨著科學(xué)技術(shù)發(fā)展的日新日異,當(dāng)今計(jì)算機(jī)應(yīng)用在生活中可以說(shuō)得是無(wú)處不在。因此作為二十一世紀(jì)的大學(xué)來(lái)說(shuō)掌握計(jì)算機(jī)開(kāi)發(fā)技術(shù)是十分重要的。
總的來(lái)說(shuō),本次課程設(shè)計(jì),實(shí)在是受益匪淺。本來(lái)這門(mén)課的知識(shí)學(xué)的就不夠扎實(shí),當(dāng)剛開(kāi)始要設(shè)計(jì)的時(shí)候,還真不知道從哪里下手,結(jié)果第一天的上機(jī),我只是做了一個(gè)下午,什么也沒(méi)干!回去以后,我想,這樣不行,這樣下去還得了!后來(lái)我們這組的組長(zhǎng)把整個(gè)程序的各個(gè)模塊都分配好任務(wù),我主要負(fù)責(zé)查找那一個(gè)模塊的。第二天因?yàn)橛辛舜_實(shí)的任務(wù),所以我就靜下心來(lái)去編程,首先想到的是如何定義類(lèi)型,想用數(shù)組的話(huà)很麻煩,我們也只學(xué)了這么多內(nèi)容,后來(lái)組長(zhǎng)說(shuō)如果用結(jié)構(gòu)體的話(huà)就比較方便,所以我們就決定自己在學(xué)一下結(jié)構(gòu)體那方面的知識(shí)。我選用了順序查找法編寫(xiě)了查找函數(shù),并且通過(guò)編寫(xiě)使該程序可以進(jìn)行多次查找,界面友好,并且輸出的畫(huà)面美觀。在設(shè)計(jì)的過(guò)程中遇到問(wèn)題,可以說(shuō)得是困難重重,這畢竟第一次做的,難免會(huì)遇到過(guò)各種各樣的問(wèn)題,例如編寫(xiě)的程序在計(jì)算機(jī)上識(shí)別的是沒(méi)有錯(cuò)誤的,但是運(yùn)行的結(jié)果確實(shí)不對(duì)的,總是兩個(gè)字符串一起輸出,怎么看我的源程序都沒(méi)有錯(cuò)誤,后來(lái)經(jīng)過(guò)老師的指導(dǎo)才知道字符串輸出是以回車(chē)鍵識(shí)別結(jié)束語(yǔ)句的,解決的辦法是在輸出語(yǔ)句中間加一個(gè)輸入字符語(yǔ)句;后來(lái)在我們團(tuán)隊(duì)的合作下,一一攻破了困難,最后把一個(gè)完整的程序設(shè)計(jì)完成,感覺(jué)特別有成就感的。雖然課程設(shè)計(jì)只有短短的幾天,但是我發(fā)現(xiàn)我學(xué)到的知識(shí)比整整一個(gè)學(xué)期學(xué)到的都多。理論和實(shí)踐的相結(jié)合是學(xué)習(xí)最有效的方法。在設(shè)計(jì)的過(guò)程中發(fā)現(xiàn)了自己的不足之處,對(duì)以前所學(xué)過(guò)的知識(shí)理解得不夠深刻,掌握得不夠牢固,通過(guò)這次課程設(shè)計(jì)之后,一定把以前所學(xué)過(guò)的知識(shí)重新溫故。
回顧起此次課程設(shè)計(jì),至今我仍感慨頗多,的確,從從拿到題目到完成整個(gè)編程,從理論到實(shí)踐,在整整一個(gè)星期的日子里,可以學(xué)到很多很多的的東西,同時(shí)不僅可以鞏固了以前所學(xué)過(guò)的知識(shí),而且學(xué)到了很多在書(shū)本上所沒(méi)有學(xué)到過(guò)的知識(shí)。通過(guò)這次課程設(shè)計(jì)使我懂得了理論與實(shí)際相結(jié)合是很重要的,只有理論知識(shí)是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識(shí)與實(shí)踐相結(jié)合起來(lái),從理論中得出結(jié)論,才能真正為社會(huì)服務(wù),從而提高自己的實(shí)際動(dòng)手能力和獨(dú)立思考的能力。
六、附錄的源程序及各模塊說(shuō)明
1、主函數(shù)
定義結(jié)構(gòu)體,對(duì)要調(diào)用的函數(shù)進(jìn)行聲明。通過(guò)輸出控制顯示歡迎界面,通過(guò)函數(shù)getch(),putchar(‘*’)控制密碼的輸入輸出,系統(tǒng)調(diào)用菜單函數(shù)密碼登陸。
#include <stdio.h>
#include <string.h>
#include <conio.h>
#define N 100
int M=0;
struct student
char name[25];
char sex;
int age;
float score[3];
}stu[N];
void main()
{void system();
void del();
void search();
void modify();
void sort();
int k,i;
char str[10];
{printf("請(qǐng)輸入六位數(shù)密碼:");
for(i=0;(str[i]=getch())!='\r';i++)
putchar('*');
printf("\n");
str[i]='\0';
if(strcmp(str,"123456")!=0)
printf("密碼錯(cuò)誤!\n");
else break;
}
printf("登陸成功!");
printf("\n\n\n");
system("cls");
menu();
}
2、 菜單函數(shù)
定義菜單函數(shù),通過(guò)輸出函數(shù)顯示系統(tǒng)功能。利用switch語(yǔ)句實(shí)現(xiàn)多分支選擇結(jié)構(gòu)。
void menu()
{int c;printf("
printf("請(qǐng)選擇操作:");
if(c<1 || c>6)c=0;
switch(c)
{case 0:printf("輸入錯(cuò)誤!\n");break;
case 1: add();break;
case 2: del();break;
case 3: search();break;
case 4: modify();break;
case 5: sort();break;
case 6: break;
}}
3、 錄入函數(shù)
多次使用輸入輸出函數(shù)輸入信息,通過(guò)標(biāo)記flag控制多次輸入。
system("cls");printf("
printf("請(qǐng)輸入第%d個(gè)學(xué)生的學(xué)號(hào):",i);
scanf("%s",stu[i-1].num);
printf("請(qǐng)輸入第%d個(gè)學(xué)生的姓名:",i);
scanf("%s",stu[i-1].name);
printf("請(qǐng)輸入第%d個(gè)學(xué)生的性別:",i);getchar();
scanf("%c",&stu[i-1].sex);
printf("請(qǐng)輸入第%d個(gè)學(xué)生的年齡:",i);
scanf("%d",&stu[i-1].age);
printf("輸入第%d個(gè)學(xué)生的數(shù)學(xué)成績(jī):",i);
scanf("%f",&stu[i-1].score[0]);
printf("輸入第%d個(gè)學(xué)生的英語(yǔ)成績(jī):",i);
scanf("%f",&stu[i-1].score[1]);
printf("輸入第%d個(gè)學(xué)生的計(jì)算機(jī)成績(jī):",i);
scanf("%f",&stu[i-1].score[2]);
M++;printf("\n\n");
printf("序號(hào): %d\n",i);
printf("學(xué)號(hào):%s\n",stu[i-1].num);
printf("姓名:%s\n",stu[i-1].name);
printf("性別:%c\n",stu[i-1].sex);
printf("數(shù)學(xué):%.2f\n",stu[i-1].score[0]);
printf("英語(yǔ):%.2f\n",stu[i-1].score[1]);
printf("計(jì)算機(jī):%.2f\n",stu[i-1].score[2]); printf("\n\n");
printf("繼續(xù)或退出(y/n):");getchar();scanf("%c",&k);
if(k=='n' || k=='N')
flag=0;}
system("cls");
menu();
}
4、 刪除函數(shù)
輸入學(xué)號(hào),通過(guò)學(xué)號(hào)找到對(duì)應(yīng)的學(xué)生,從刪除項(xiàng)起后面對(duì)應(yīng)的信息前移。同時(shí),用標(biāo)記flag控制多次刪除。
void del()
{void system();
char c;
system("cls");
printf("歡迎進(jìn)入學(xué)生信息的刪除成
while(flag)
{printf("請(qǐng)輸入要?jiǎng)h
for(i=0;i<N;i++)
if(strcmp(str,stu[i].num)
==0)
if(c=='n' || c=='N')flag=0;
}
system("cls");
menu();
}
5查找函數(shù)
|