項目七 學(xué)生成績單制作_第1頁
項目七 學(xué)生成績單制作_第2頁
項目七 學(xué)生成績單制作_第3頁
項目七 學(xué)生成績單制作_第4頁
項目七 學(xué)生成績單制作_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、 在鍵盤中讀入一個班學(xué)生的相關(guān)數(shù)據(jù)(學(xué)號,姓名,三門課的成績),輸出按照平均分數(shù)從高到低進行排序后的成績單。程序的運行要求是:(程序運行時為了方便,只輸入五個學(xué)生記錄) 要完成學(xué)生成績單的制作,雖然可以用前面的項目四中的數(shù)組解決,但是如果用結(jié)構(gòu)體數(shù)組會顯得更科學(xué)。所以在本項目中將用結(jié)構(gòu)體數(shù)組進行操作。具體步驟是:首先進行學(xué)生信息的輸入輸出,第二是計算每個同學(xué)的三門課的平均分,第三是按平均分的高低排序后輸出成績單。所以將這一項目分成三個任務(wù)介紹:任務(wù)1是用結(jié)構(gòu)體數(shù)組進行學(xué)生信息的輸入輸出;任務(wù)2是求平均分最高學(xué)生的學(xué)號、姓名;任務(wù)3是輸出學(xué)生排序后的成績單。1任務(wù)1 用結(jié)構(gòu)體數(shù)組進行學(xué)生信息的輸

2、入輸出 一、問題情景 一個班40個同學(xué)參加了數(shù)學(xué)、語文、英語考試,現(xiàn)要將這個班的40個同學(xué)的相關(guān)信息(包括學(xué)號,姓名,三門課的成績)從鍵盤上輸入,然后輸出這40個同學(xué)的原始成績單。二、具體實現(xiàn)(為了程序運行方便,所以假設(shè)只有5個同學(xué)) #include stdio.h#define N 5struct stuchar id6;char name10;int m1,m2,m3;float avg;main()stu studentN;int i;for (i=0;iN;i+)printf(請輸入第%d個同學(xué)的記錄:,i+1);scanf(%s%s%d%d%d,studenti.id,&stude

3、,&studenti.m1,&studenti.m2,&studenti.m3);printf(他們的成績單為:n);for(i=0;iN;i+)printf(%st%st%d,%d,%dn,studenti.id,,studenti.m1,studenti.m2,studenti.m3);1、一個學(xué)生的屬性包括學(xué)號、姓名、幾門課的成績應(yīng)該定義成的數(shù)據(jù)類型,即結(jié)構(gòu)體;2、結(jié)構(gòu)體數(shù)組的輸入與輸出;2三、相關(guān)知識(一) 結(jié)構(gòu)體類型 1. 結(jié)構(gòu)體類型的定義如果有一個數(shù)據(jù)包含下列屬性:學(xué)號(id)、姓名(name)、性別(sex)、功課1(m1)、功課2(m1

4、)、功課3(m1)、平均分(avg) 。在C中我們可以用結(jié)構(gòu)體類型將這些不同類型的數(shù)據(jù)組合成一個有機的整體,以便引用。學(xué)號姓名性別功課1功課2功課3平均分idnamesexm1m2m3avg05李小明男89987888.3將不同類型的數(shù)據(jù)組合成一個有機的整體定義一個結(jié)構(gòu)體類型的一般形式為struct 結(jié)構(gòu)體名 成員列表;struct stu char id6; char name10; char sex4; int m1,m2,m3; float avg; 定義了一個叫stu的結(jié)構(gòu)體類型,它包括id、name、sex、m1,m2,m3,avg等不同類型的數(shù)據(jù)項。 (1) 結(jié)構(gòu)體類型名為:str

5、uct stu,其中struct是定義結(jié)構(gòu)體類型的關(guān)鍵字,它和系統(tǒng)提供的基本類型一樣具有同樣的地位和作用,都是可以用來定義變量的類型,stu叫結(jié)構(gòu)體名。 (2) 在 中定義的變量我們叫做成員,其定義方法和前面變量定義的方法一樣。3(1)先聲明結(jié)構(gòu)體類型再定義結(jié)構(gòu)體變量。 (1)先聲明結(jié)構(gòu)體類型再定義結(jié)構(gòu)體變量。 格式: struct 結(jié)構(gòu)體名成員表列;struct 結(jié)構(gòu)體名 變量名表列;struct stuchar id6,name10;int m1,m2,m3;float avg;main()struct stu x,y;struct stuchar id6,name10;int m1,m2

6、,m3;float avg;main()stu x,y;(2)在聲明類型的同時定義變量 格式如下: struct 結(jié)構(gòu)體名成員表列;變量名表列;main()struct stuchar id6,name10;int m1,m2,m3;float avg;x,y;main()struct char id6,name10;int m1,m2,m3;float avg;x,y;4 (二) 結(jié)構(gòu)體變量的引用 結(jié)構(gòu)體變量名. 成員名 “.”是成員(又叫分量)運算符。它的優(yōu)先級最高 例如:x.m1=78 scanf(“%s”,&x.id); /輸入一個字符串送給結(jié)構(gòu)體成員x.id printf(“%s”x

7、.id); scanf(“%s%s%d%d%d%d”,&x);能整體讀入結(jié)構(gòu)體變量的值嗎? printf(%st%st%5d%5d%5dn,x); 能整體輸出結(jié)構(gòu)體變量的值嗎?scanf(%s%s%d%d%d,x.id,,&x.m1,&x.m2,&x.m3);printf(%st%st%5d%5d%5dn,x.id,,x.m1,x.m2,x.m3);【例7-1】在鍵盤上輸入一個學(xué)生的信息(包含學(xué)號、姓名、三門課的成績)并在顯示器上輸出。 #include stdio.hmain()struct char id6,name10;int m1,m2,m3;float avg

8、;x;printf(請輸入學(xué)生的信息n);scanf(%s%s%5d%5d%5d,x.id,,&x.m1,&x.m2,&x.m3);printf(學(xué)生的信息為:n);printf(%st%st%5d%5d%5dn,x.id,,x.m1,x.m2,x.m3);5(三) 結(jié)構(gòu)體變量的初始化 和其他類型的變量一樣,對結(jié)構(gòu)體變量也可以初始化,大家要理解初始化的概念,即定義變量的同時給變量賦值叫初始化。 【例7-2】將例7-1的結(jié)構(gòu)體變量進行初始化。#include stdio.hmain()struct char id6,name10;int m1,m2,m3;float av

9、g;x=00101,李小明,87,88,92;printf(%st%st%5d%5d%5dn,x.id,,x.m1,x.m2,x.m3);輸出結(jié)果為: 00101 李小明 87 88 926(四) 結(jié)構(gòu)體數(shù)組 1. 結(jié)構(gòu)體數(shù)組的定義 (1)由于結(jié)構(gòu)體數(shù)組的成員為結(jié)構(gòu)體類型,所以在定義結(jié)構(gòu)體數(shù)組之前必須先定義結(jié)構(gòu)體類型。struct stuchar id6,name10;int m1,m2,m3;float avg;main()struct stu x10,y;struct stuchar id6,name10;int m1,m2,m3;float avg;main()stu x10

10、,y;(2)也可以直接定義結(jié)構(gòu)體數(shù)組main()struct stuchar id6,name10;int m1,m2,m3;float avg;x10,y;main()struct char id6,name10;int m1,m2,m3;float avg;x10,y;72. 結(jié)構(gòu)體數(shù)組的初始化 (1)不給出數(shù)組長度,數(shù)組長度由初始化的數(shù)據(jù)決定。 stu =,; 例:struct stuchar id6,name10;int m1,m2,m3;float avg;x = 001,李小明,78,89,90,008,陳小東,85,81,67,016,王永民,89,78,90;(2)直接給出值。

11、 例: struct stuchar id6,name10;int m1,m2,m3;float avg;x3= 001,李小明,78,89,90,008,陳小東,85,81,67,016,王永民,89,78,90;現(xiàn)在請同學(xué)們分析本任務(wù)中的具體實現(xiàn)#include stdio.h#define N 5struct stuchar id6;char name10;int m1,m2,m3;float avg;main()stu studentN;int i;for (i=0;iN;i+)printf(請輸入第%d個同學(xué)的記錄:,i+1);scanf(%s%s%d%d%d,studenti.id

12、,&,&studenti.m1,&studenti.m2,&studenti.m3);printf(他們的成績單為:n);for(i=0;iN;i+)printf(%st%st%d,%d,%dn,studenti.id,,studenti.m1,studenti.m2,studenti.m3);是定義一個結(jié)構(gòu)體,其結(jié)構(gòu)體名為stu,成員有id、name、m1、m2、m3、avg; 是定義一個結(jié)構(gòu)體數(shù)組student,共有N個元素,student0studentN-1。 輸入N個結(jié)構(gòu)體數(shù)組元素,每個需要輸入id、name、m1、m2、m3; 輸

13、出N個同學(xué)的id、name、m1、m2、m3 8【例7-3】計算三個同學(xué)的總成績、平均成績。 分析:(1)需要定義一個結(jié)構(gòu)體,其成員有學(xué)號,姓名,三門課的成績,總分,平均分;(2)定義一個結(jié)構(gòu)體數(shù)組,并賦初值;(3)計算三個同學(xué)的總分及平均分;(4)輸出這三個同學(xué)的信息;#include stdio.h#define N 3struct stuchar id6;char name10;int m1,m2,m3;float avg,sum;main()stu studentN=001,李小明,78,89,90,008,陳小東,85,81,67,016,王永民,89,78,90;int i;for

14、 (i=0;iN;i+)studenti.sum=studenti.m1+studenti.m2+studenti.m3;studenti.avg=studenti.sum/3.0;printf(他們的成績單為:n);printf(學(xué)號t姓名t數(shù)學(xué) 英語 語文 總分 平均分n);for(i=0;i成員名例如: (*sp).id,(*sp).name, (*sp).avg 或 sp-id,sp-name,sp-avg10【例7-4】將例7-2的程序改為用結(jié)構(gòu)體指針變量引用 #include stdio.hmain()struct char id6,name10;int m1,m2,m3;floa

15、t avg;x=00101,李小明,87,88,92,*sp;sp=&x;printf(%st%st%5d%5d%5dn,sp-id,sp-name,sp-m1,sp-m2,sp-m3);printf(%st%st%5d%5d%5dn,(*sp).id,(*sp).name,(*sp).m1,(*sp).m2,(*sp).m3);112. 指向結(jié)構(gòu)體數(shù)組的指針 前面介紹過指向數(shù)組和數(shù)組元素的指針,同理結(jié)構(gòu)體數(shù)組及其元素也可以用指針來指向。 struct studentchar id6;char name10;int m1,m2,m3;float avg,sum; /定義結(jié)構(gòu)體數(shù)組。 struc

16、t student *sp,stu110; /定義結(jié)構(gòu)體類型指針。 sp=stu1; /將結(jié)構(gòu)體數(shù)組首地址送給結(jié)構(gòu)體指針。 當前sp指針指向數(shù)組首地址。 執(zhí)行sp+后指針指向下一個數(shù)組單元;執(zhí)行sp-后指針指向上一個數(shù)組單元。所以使用指針變量可以方便的在結(jié)構(gòu)體數(shù)組中移動。 12【例7-5】將例7-3改為用結(jié)構(gòu)體指針變量引用。#include stdio.h#define N 3struct stuchar id6;char name10;int m1,m2,m3;float avg,sum;main()stu studentN=001,李小明,78,89,90,008,陳小東,85,81,67

17、,016,王永民,89,78,90,*sp;int i;sp=student;for (i=0;isum=sp-m1+sp-m2+sp-m3;sp-avg=sp-sum/3.0;sp=student;printf(他們的成績單為:n);printf(學(xué)號t姓名t數(shù)學(xué) 英語 語文 總分 平均分n);for(i=0;iN;i+,sp+)printf(%st%st%d%6d%7d%7.1f%6.1fn,(*sp).id,(*sp).name,(*sp).m1,(*sp).m2,(*sp).m3,(*sp).sum,(*sp).avg);13任務(wù)2 求平均分最高學(xué)生的學(xué)號、姓名一、問題情景從鍵盤中輸入

18、一個班40個學(xué)生的姓名及數(shù)學(xué)、英語、語文三門課的成績,輸出平均分最高同學(xué)的信息。#include stdio.h#define N 3 /*假設(shè)只有3個同學(xué) */main()struct char id6,name10;int m1,m2,m3;float avg;stu1N,max,*sp;int i;printf(請輸入學(xué)生的信息n);for(i=0;iN;i+)scanf(%s%s%d%d%d,stu1i.id,,&stu1i.m1,&stu1i.m2,&stu1i.m3);for(i=0;iN;i+)stu1i.avg=(stu1i.m1+stu1i.m2+stu1

19、i.m3)/3.0;max.avg=stu10.avg;for(i=1;iN;i+)if(max.avgstu1i.avg)max=stu1i;printf(成績單為:n);sp=stu1;for(i=0;iid,sp-name, sp-m1,sp-m2,sp-m3,sp-avg);printf(平均分為最高分的學(xué)生是:n);printf(%st%st%dt%dt%dt%.1fn,max.id,,max.m1,max.m2,max.m3,max.avg);分析:首先要定義一個能存放40個學(xué)生姓名、數(shù)學(xué)、英語、語文、平均分的結(jié)構(gòu)體數(shù)組,第二從鍵盤上輸入40個同學(xué)的姓名、數(shù)學(xué)、英語

20、、語文信息,第三求平均分,最后,就是求平均分最高同學(xué)的信息。14三、相關(guān)知識本任務(wù)中的具體實現(xiàn)中的程序段struct char id6,name10;int m1,m2,m3;float avg;stu1N,max,*sp;是定義結(jié)構(gòu)體數(shù)組stu1N、存放最高記錄的max,及結(jié)構(gòu)體指針變量;for(i=0;iN;i+)scanf(%s%s%d%d%d,stu1i.id,,&stu1i.m1,&stu1i.m2,&stu1i.m3); 是從鍵盤輸入N個學(xué)生的信息,其中有學(xué)號,姓名,三門課的成績 for(i=0;iN;i+)stu1i.avg=(stu1i.m1+stu1i.m

21、2+stu1i.m3)/3.0;是求每個學(xué)生的平均分;max.avg=stu10.avg;for(i=1;iN;i+)if(max.avgstu1i.avg)max=stu1i;是求平均分最高同學(xué)的信息;sp=stu1;for(i=0;iid,sp-name, sp-m1,sp-m2,sp-m3,sp-avg);輸出成績單,用結(jié)構(gòu)體指針變量引用;printf(%st%st%dt%dt%dt%.1fn,max.id,,max.m1,max.m2,max.m3,max.avg);是輸出平均分最高同學(xué)的信息。15任務(wù)3 排序后的學(xué)生成績單一、問題情景從鍵盤中輸入一個班40個學(xué)生的學(xué)號

22、、姓名及數(shù)學(xué)、英語、語文三門課的成績,按三門課總分的高低進行排序,輸出排序后的成績單(每條記錄包含姓名、數(shù)學(xué)、英語、語文、總分、平均分的信息)。分析:(1)首先要定義一個能存放40個學(xué)生學(xué)號、姓名、數(shù)學(xué)、英語、語文、總分、平均分的結(jié)構(gòu)體數(shù)組;(2)然后從鍵盤上輸入40個同學(xué)的學(xué)號、姓名、數(shù)學(xué)、英語、語文信息;(3)第三求每個同學(xué)的總分、平均分;(4)接下來就是求對總分進行排序;(5)最后輸出排序后的成績單。其中(1)、(2)、(3)在任務(wù)2中已學(xué)過,現(xiàn)在本題主要是想解決如何在結(jié)構(gòu)體數(shù)組中進行排序。16二、用C語言解決的程序#include stdio.h#define N 5/* 假設(shè)只有5個

23、同學(xué)*/main()struct char id6,name10;int m1,m2,m3;float sum,avg;stu1N,t;int i,j;printf(請輸入學(xué)生的信息n);for(i=0;iN;i+)scanf(%s%s%d%d%d,stu1i.id,,&stu1i.m1,&stu1i.m2,&stu1i.m3);for(i=0;iN;i+)stu1i.sum=stu1i.m1+stu1i.m2+stu1i.m3;stu1i.avg=stu1i.sum/3.0;for(i=0;iN-1;i+)for(j=0;jN-1-i;j+)if(stu1j.sumstu

24、1j+1.sum)t=stu1j;stu1j=stu1j+1;stu1j+1=t;printf(排序后的成績單為:n);printf(學(xué)號t姓名t數(shù)學(xué)t語文t英語t總分t平均分n);for(i=0;iN;i+)printf(%st%st%dt%dt%dt%.1ft%.1fn,stu1i.id,,stu1i.m1, stu1i.m2,stu1i.m3,stu1i.sum,stu1i.avg);17三、相關(guān)知識struct char id6,name10;int m1,m2,m3;float sum,avg;stu1N,t;是定義一個結(jié)構(gòu)體數(shù)組stu1N,而定義結(jié)構(gòu)體變量t的作

25、用是作為排序中交換時的中間變量;for(i=0;iN;i+)scanf(%s%s%d%d%d,stu1i.id,,&stu1i.m1,&stu1i.m2,&stu1i.m3);是輸入N個學(xué)生的信息,每條學(xué)生要輸入的信息包括學(xué)號、姓名、三門課的成績 for(i=0;iN;i+)stu1i.sum=stu1i.m1+stu1i.m2+stu1i.m3;stu1i.avg=stu1i.sum/3.0;對N個同學(xué)求總分及平均分 for(i=0;iN-1;i+)for(j=0;jN-1-i;j+)if(stu1j.sumstu1j+1.sum)t=stu1j;stu1j=stu1j+

26、1;stu1j+1=t;用冒泡法排序 for(i=0;iN;i+)printf(%st%st%dt%dt%dt%.1ft%.1fn,stu1i.id,,stu1i.m1,stu1i.m2,stu1i.m3,stu1i.sum,stu1i.avg);是輸出N個同學(xué)的信息 18任務(wù)4 舉一反三【例7-6】利用結(jié)構(gòu)體類型編制一程序,實現(xiàn)輸入一個學(xué)生的數(shù)學(xué)期中和期末成績,然后計算并輸出總評成績。(總評成績=期中成績*0.4+期末成績*0.6) 分析:(1)定義一結(jié)構(gòu)體變量,成員有姓名、期中成績、期末成績、總評成績 (2)輸入這個學(xué)生的期中成績、期末成績 (3)計算這個學(xué)生的總評成績

27、 (4)輸出這條記錄#include stdio.hstruct student char name10;int score1,score2;float zcj;main()student stu1; int i; printf(請輸入學(xué)生的姓名、期中成績、期末成績n);scanf(%s%d%d,,&stu1.score1,&stu1.score2);stu1.zcj=stu1.score1*0.4+stu1.score2*0.6;printf(該學(xué)生的成績?yōu)閚);printf(%st%dt%dt%.1fn,,stu1.score1,stu1.score2,

28、stu1.zcj);19【例7-7】自定義一個結(jié)構(gòu)體類型的變量,其成員包括學(xué)號、姓名、年齡、性別,并將其類型聲明為student,然后用該類型定義一個stu1的變量,進行賦值操作,并輸出其值。 分析:(1)定義的結(jié)構(gòu)體應(yīng)為:struct studentchar id6,name10,sex4;int age;(2)student stu1 表示定義一個變量,其名為stu1,類型是student。(3)下面就可以進行賦值,因為字符數(shù)組的賦值須用strcpy()函數(shù),所以有:strcpy(,”李小明”);(4) 最后用輸出語句輸出就行。#include stdio.h#inclu

29、de string.h /因為下面用到了strcpy()函數(shù)struct student char id6,name10,sex4;int age;main()student stu1;strcpy(stu1.id,0012);strcpy(,李小明);strcpy(stu1.sex,男);stu1.age=20;printf(%st%st%st%dn,stu1.id,,stu1.sex,stu1.age);程序的運行結(jié)果是:0012 李小明 男 2020【例7-8】將上述程序改為4個學(xué)生,用結(jié)構(gòu)體數(shù)組實現(xiàn)輸入輸出學(xué)生的基本信息,輸出要求每行一個學(xué)生記錄。分

30、析:(1)定義的結(jié)構(gòu)體也是一樣的,因為有4個學(xué)生,所以就定義一個結(jié)構(gòu)體數(shù)組。(3)因為需要給4個學(xué)生的信息賦初值,所以用賦值語句太麻煩,不如一邊定義結(jié)構(gòu)體數(shù)組,一邊賦初值。(4)輸出就用一個循環(huán)即可。#include stdio.hstruct student char id6,name10,sex4;int age;main()student stu14=0012,張小明,男,20,0015,王剛強,男,20,0017,李芳芳,女,18,0018,周大發(fā),男,21; int i;for(i=0;i4;i+)printf(%st%st%st%dn,stu1i.id,,stu1i.sex,stu1i.age);21【例7-9】某公司有5個職員,包括職員工號、姓名、性別和工資,編程要求如下: 以工資的高低進行排序并輸出。 輸出工資最高和最低的員工姓名。以下表為原始數(shù)據(jù),進行調(diào)試運行,記錄其結(jié)果。分析:本題和任務(wù)3的問題幾乎一樣,所以首先是定義一個結(jié)構(gòu)體數(shù)組

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論