一、目的
1.掌握結(jié)構(gòu)體變量及數(shù)組的定義、賦值、初始化、輸入、輸出
2.結(jié)構(gòu)體數(shù)組的操作。
二、實(shí)習(xí)環(huán)境
Visual Stdio 2022
三、實(shí)習(xí)內(nèi)容、步驟與要求
1.定義一個(gè)結(jié)構(gòu)體數(shù)組,存放10個(gè)學(xué)生的學(xué)號(hào),姓名,三門課的成績
2.從鍵盤輸入10個(gè)學(xué)生的以上內(nèi)容
3.輸出單門課成績最高的學(xué)生的學(xué)號(hào)、姓名、以及該門課程的成績
4.輸出三門課程的平均分?jǐn)?shù)最高的學(xué)生的學(xué)號(hào)、姓名及其平均分
5.將10個(gè)學(xué)生按照平均分?jǐn)?shù)從高到低進(jìn)行排序,輸出結(jié)果,格式如下所示:
number ????name ??math ??Chinese???English????average
103 ???????tom ???90 ?????90 ??????100 ??????????95
101 ?????alice ???90 ?????80 ??????70 ???????????80
6.在實(shí)習(xí)報(bào)告中畫出程序流程圖,說明程序設(shè)計(jì)的算法,附主要程序段及運(yùn)行結(jié)果(屏幕截圖)。
7.在實(shí)習(xí)報(bào)告中說明知識(shí)點(diǎn)。
8.在實(shí)習(xí)報(bào)告中說明程序設(shè)計(jì)過程中的難點(diǎn)、解決辦法及編程小結(jié)或體會(huì)。
四、程序流程圖、算法及運(yùn)行結(jié)果
程序流程圖
?算法描述
1.定義結(jié)構(gòu)體數(shù)組,存放學(xué)號(hào),姓名,三門課的成績。
2.輸入10個(gè)學(xué)生的學(xué)號(hào),姓名,三門課的成績。
3.計(jì)算每個(gè)學(xué)生的平均分。
4.遍歷學(xué)生數(shù)組,通過獲取每個(gè)學(xué)生的成績,計(jì)算出數(shù)學(xué)成績最高、語文成績最高、英語成績最高、平均分最高單科最高成績。具體實(shí)現(xiàn)方式是,維護(hù)一個(gè)最大值變量,和一個(gè)下標(biāo)指針,依次遍歷每個(gè)學(xué)生,若發(fā)現(xiàn)該學(xué)生的指定成績超過了最大值,則更新最大值,并將該學(xué)生的下標(biāo)記錄在對(duì)應(yīng)的下標(biāo)指針中。若有多個(gè)學(xué)生的指定成績都等于最大值,則將多個(gè)學(xué)生的下標(biāo)都分別記錄在下標(biāo)指針數(shù)組中。
5.遍歷學(xué)生數(shù)組,通過獲取每個(gè)學(xué)生的成績,統(tǒng)計(jì)出數(shù)學(xué)、語文、英語以及平均分?jǐn)?shù)最高的學(xué)生人數(shù)。具體實(shí)現(xiàn)方式是,遍歷每個(gè)學(xué)生,若該學(xué)生的指定成績等于最高成績,則將該學(xué)生的下標(biāo)記錄在對(duì)應(yīng)的人數(shù)記錄器以及下標(biāo)指針數(shù)組中。
6.輸出數(shù)學(xué)成績最高的學(xué)生信息。
7.輸出語文成績最高的學(xué)生信息。
8.輸出英語成績最高的學(xué)生信息。
9.輸出平均分?jǐn)?shù)最高的學(xué)生信息。
10.將學(xué)生數(shù)組按照平均分?jǐn)?shù)從高到低排序,通過選擇排序?qū)崿F(xiàn)
11.輸出學(xué)生信息表格,包括學(xué)號(hào)、姓名、三科成績以及平均分?jǐn)?shù)。
?程序代碼
#include<stdio.h>
#include<string.h>
//定義結(jié)構(gòu)體數(shù)組,存放學(xué)號(hào),姓名,三門課的成績
struct stu
{
char num[100];
int math, chinese, english;
double ave;
char name[100];
};
int imaxm[100], imaxc[100], imaxe[100],iave[100];分別記錄三門課成績最高的下標(biāo),以及平均分成績最高的下標(biāo)
int max1, max2, max3;
double max4;//記錄三門課的單科最高成績以及平均分的最高成績
int cnt1, cnt2, cnt3,cnt4;//若某門課成績最高不止一個(gè)人,則記錄成績最高的人數(shù)
int main()
{
struct stu s[10];
int i,j;
double temp;
char tmp[100];
printf("輸入10個(gè)學(xué)生的學(xué)號(hào),姓名,三門課的成績(分別為math,chines,english):\n");
//輸入10個(gè)學(xué)生的學(xué)號(hào),姓名,三門課的成績
for (i = 0; i < 10; i++) scanf("%s%s%d%d%d",s[i].num,s[i].name,& s[i].math, &s[i].chinese, &s[i].english);
//算出每個(gè)學(xué)生的平均分
for (i = 0; i < 10; i++) s[i].ave = (double)(s[i].math + s[i].chinese + s[i].english) / 3;
//先將第一個(gè)學(xué)生的三科成績視作最高分,通過和其它學(xué)生分?jǐn)?shù)的比較得到三科單科最高成績
max1 = s[0].math;
max2 = s[0].chinese;
max3 = s[0].english;
max4 = s[0].ave;
for (i = 1; i < 10; i++)
{
if (s[i].math > max1) max1=s[i].math;//max1記錄math成績最高分
if (s[i].chinese > max2) max2=s[i].chinese;//max2記錄chinese成績最高分
if (s[i].english > max3) max3=s[i].english;//max3記錄english成績最高分
if (s[i].ave > max4) max4 = s[i].ave;//max4記錄ave成績最高分
}
//通過再次比較看單科有幾個(gè)學(xué)生成績最高
for (i = 0; i < 10; i++)
{
if (s[i].math == max1)
{
cnt1++;
imaxm[cnt1] = i;
}
if (s[i].chinese == max2)
{
cnt2++;
imaxc[cnt2] = i;
}
if (s[i].english == max3)
{
cnt3++;
imaxe[cnt3] = i;
}
if (s[i].ave == max4)
{
cnt4++;
iave[cnt4] = i;
}
}
printf("math成績最高:\n");
for(i=1;i<=cnt1;i++)
printf("學(xué)號(hào):%s 姓名:%s 成績:%d\n", s[imaxm[i]].num, s[imaxm[i]].name, s[imaxm[i]].math);
printf("chinese成績最高:\n");
for(i=1;i<=cnt2;i++)
printf("學(xué)號(hào):%s 姓名:%s 成績:%d\n", s[imaxc[i]].num, s[imaxc[i]].name, s[imaxc[i]].chinese);
printf("english成績最高:\n");
for(i=1;i<=cnt3;i++)
printf("學(xué)號(hào):%s 姓名:%s 成績:%d\n", s[imaxe[i]].num, s[imaxe[i]].name, s[imaxe[i]].english);
printf("三門課程的平均分最高:\n");
for (i = 1; i <= cnt4; i++)
printf("學(xué)號(hào):%s 姓名:%s 成績:%.2f\n", s[iave[i]].num, s[iave[i]].name, s[iave[i]].ave);
//10個(gè)學(xué)生按照平均分?jǐn)?shù)從高到低進(jìn)行排序
for (i = 0; i < 9; i++)
for (j = i + 1; j < 10; j++)
{
if (s[i].ave < s[j].ave)
{
temp = s[i].math, s[i].math = s[j].math ,s[j].math = temp;
temp = s[i].chinese, s[i].chinese = s[j].chinese, s[j].chinese = temp;
temp = s[i].english, s[i].english = s[j].english, s[j].english = temp;
temp = s[i].ave, s[i].ave = s[j].ave, s[j].ave = temp;
strcpy(tmp, s[i].num), strcpy(s[i].num, s[j].num), strcpy(s[j].num,tmp);
strcpy(tmp, s[i].name), strcpy(s[i].name, s[j].name), strcpy(s[j].name, tmp);
}
}
printf("10個(gè)學(xué)生按照平均分?jǐn)?shù)從高到低進(jìn)行排序:\n");
printf("num name math chinese english average\n");
for (i = 0; i < 10; i++)
printf("%-10s%-6s%12d%10d%15d%17.2f\n", s[i].num, s[i].name, s[i].math, s[i].chinese, s[i].english, s[i].ave);
return 0;
}
運(yùn)行結(jié)果?
?
五、知識(shí)點(diǎn)、難點(diǎn)及解決辦法。
知識(shí)點(diǎn)
1.結(jié)構(gòu)體:定義了一個(gè)名為”stu”的結(jié)構(gòu)體,其中包含了學(xué)號(hào)、姓名、三門課的成績以及平均分(ave)等成員變量。
2.數(shù)組:使用了結(jié)構(gòu)體數(shù)組s[10]存儲(chǔ)了10個(gè)學(xué)生的信息。
3.遍歷數(shù)組:用for循環(huán)遍歷了結(jié)構(gòu)體數(shù)組s,實(shí)現(xiàn)輸入和計(jì)算每個(gè)學(xué)生的平均分。
4.比較大?。和ㄟ^比較得到了三門課的單科最高成績以及平均分的最高成績。同時(shí)也用for循環(huán)和if語句得到了每門課成績最高的學(xué)生。
5.排序:使用選擇排序?qū)?0個(gè)學(xué)生按照平均分?jǐn)?shù)從高到低進(jìn)行排序。
6.輸入輸出:使用了scanf函數(shù)輸入,printf函數(shù)輸出學(xué)生的信息。
7.字符串操作:主要用于存儲(chǔ)和打印學(xué)生的學(xué)號(hào)和姓名,使用了strcpy函數(shù)進(jìn)行字符串的復(fù)制。
難點(diǎn)及解決方法
1.最高成績可能不止一個(gè)人,可能有多個(gè)人成績相同,所以先求出最高成績,再找出和最高成績相同分?jǐn)?shù)的學(xué)生并記錄下來
2.字符串是常量,不是變量,因此不能直接用等號(hào)賦值,所以交換時(shí)用中間變量字符串來作為中轉(zhuǎn)站,用strcpy實(shí)現(xiàn)賦值
3.最后要輸出學(xué)生信息表格,要想美觀,需使用%5d等,來使得數(shù)據(jù)整齊
4.排序時(shí)需要多個(gè)屬性交換,切不可只交換平均分?jǐn)?shù)
六、編程小結(jié)或體會(huì)。文章來源:http://www.zghlxwxcb.cn/news/detail-468115.html
這是一段使用C語言編寫的學(xué)生成績統(tǒng)計(jì)程序,實(shí)現(xiàn)了對(duì)10個(gè)學(xué)生的學(xué)號(hào)、姓名、數(shù)學(xué)、語文、英語三門課程成績的輸入、計(jì)算平均分、求出每個(gè)科目的最高分以及平均分的最高分、按照平均分從高到低排序等功能,知識(shí)點(diǎn)比較基礎(chǔ),但是要注意很多細(xì)節(jié),比如最高成績可能不止一個(gè)人,字符串常量不能直接用等號(hào)賦值,排序時(shí)要交換多個(gè)屬性,通過寫這個(gè)程序,對(duì)結(jié)構(gòu)體有了更進(jìn)一步的理解,認(rèn)識(shí)到了結(jié)構(gòu)體關(guān)于數(shù)據(jù)管理的巨大優(yōu)勢(shì)文章來源地址http://www.zghlxwxcb.cn/news/detail-468115.html
到了這里,關(guān)于程序設(shè)計(jì)綜合實(shí)習(xí)(C語言):學(xué)生成績單制作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!