国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C++習題與解析-類和對象

2019-11-17 05:21:20
字體:
來源:轉載
供稿:網友

  題 1.分析以下程序執行的結果
#include<iostream.h>
#include<stdlib.h>

class Sample
{
public:
int x,y;
Sample(){x=y=0;}
Sample(int a,int b){x=a;y=b;}
void disp()
{
cout<<"x="<<x<<",y="<<y<<endl;
}
};

void main()
{
Sample s1(2,3);
s1.disp();
}

解:本題說明了重載構造函數的定義方法。首先定義了一個類Sample,在main()中定義了它的一個對象,定義s1對象時調用其重載構造函數(x=2,y=3),然后,調用其成員函數輸出數據成員。所以輸出為:x=2,y=3。
注重:構造函數是唯一不能被顯式調用的成員函數,它在定義類的對象時自動調用,也稱為隱式調用。 -------------------------------------------------------- 題 2.分析以下程序的執行結果
#include<iostream.h>
class Sample
{
int x,y;
public:
Sample(){x=y=0;}
Sample(int a,int b){x=a;y=b;}
~Sample()
{
if(x==y)
cout<<"x=y"<<endl;
else
cout<<"x!=y"<<endl;
}
void disp()
{
cout<<"x="<<x<<",y="<<y<<endl;
}
};

void main()
{
Sample s1(2,3);
s1.disp();
}

解:本題說明了析構函數的定義方法。首先定義了一個類Sample,在main()中定義了它的一個對象,定義s1對象時調用其重載構造函數(x=2,y=3),然后,調用其成員函數輸出數據成員,最后在退出程序時自動調用析構函數。所以輸出為:
x=2,y=3
x!=y

注重:析構函數在對象的作用域結束時被自動隱式調用。 ---------------------------------------------------- 題 3.分析以下程序的輸出結果
#include<iostream.h>
class Sample
{
int x;
public:
Sample(int a)
{
x=a;
cout<<"constrUCting object:x="<<x<<endl;
}
};

void func(int n)
{
static Sample obj(n);
}

void main()
{
func(1);
func(10);
}

解:本題說明靜態對象構造函數的調用情況,由于在func()函數中定義的對象obj是靜態對象,故只被構造一次,所以輸出為:
counstructing object:x=1

注重:靜態對象和靜態變量一樣,只被構造一次。塊作用域的靜態變量,在首次進入到定義該靜態對象的函數時,構造該靜態對象,以后進入該函數時不再構造靜態對象。 ------------------------------------------------------ 題 1.4 分析以下程序的執行結果
#include<iostream.h>
class Sample
{
int x,y;
public:
Sample(){x=y=0;}
Sample(int a,int b){x=a;y=b;}
void disp()
{
cout<<"x="<<x<<",y="<<y<<endl;
}
};

void main()
{
Sample s(2,3), *p=&s;
p->disp();
}

解:本題說明了對象指針的使用方法。這里通過指向對象的指針來調用對象的成員函數。對象指針p指向對象s,p->disp()等價于s.disp()。所以輸出為: x=2,y=3.題 1.5 分析以下程序的執行結果
#include<iostream.h>
class Sample
{
public:
int x;
int y;
void disp()
{
cout<<"x="<<x<<",y="<<y<<endl;
}
};

void main()
{
int Sample::*pc;
Sample s;
pc=&Sample::x;
s.*pc=10;
pc=&Sample::y;
s.*pc=20;
s.disp();
}

解:本題說明了類數據成員指針的使用方法。在main()中定義的pc是一個指向Sample類數據成員的指針。執行pc=&Sample::x時,pc指向數據成員x,語句s.*pc=10等價于s.x=10(為了保證該語句正確執行,Sample類中的x必須是公共成員);執行pc=&Sample::y時,pc指向數據成員y,語句s.*pc=20等價于s.y=20(同樣,Sample類中的y必須是公共成員)。所以輸出為: x=10,y=20。
----------------------------------------------------- 題 1.6 下面是一個類的測試程序,設計出能使用如下測試程序的類。
void main()
{
Test a;
a.init(68,55);
a.PRint();
}

其執行結果為:
測試結果:68-55=13

解:本題是要設計Test類,其設計方法很多,這里給出一種解法。Test類包含兩個私有數據成員x、y,以及兩個公共成員函數init()和print(),前者用于給數據成員賦值,后者用于x,y的減法運算和輸出相應的結果。
#include<iostream.h>
class Test
{
int x,y;
public:
void init(int,int);
void print();
};

void Test::init(int i,int j)
{
x=i;y=j;
}

void Test::print()
{
cout<<"測試結果:"<<x<<"-"<<y<<"="<<x-y<<endl;
}

注重:類是一個外殼,它包含了類實例化時數據和代碼的使用方法,它是一種模板,只有在定義類的對象時,才為對象分配空間,而不會為類分配空間。 ------------------------------------------------------ 題 1.7 設計一個Bank類,實現銀行某賬號的資金往來賬目治理,包括建賬號、存入、取出等。
解:Bank類包括私有數據成員top(當前賬指針),date(日期),money(金額),rest(余額)和sum(累計余額)。另有一個構造函數和三個成員函數bankin()(處理存入賬),bankout()處理取出賬)和disp() (輸出明細賬)。
本題程序如下:
#include<stdio.h>
#include<string.h>
#define Max 100
class Bank
{
int top;
char date[Max][10]; // 日期
int money[Max]; // 金額
int rest[Max]; // 余額
static int sum; // 累計余額
public:
Bank(){top=0;}
void bankin(char d[],int m)
{
strcpy(date[top],d);
money[top]=m;
sum=sum+m;
rest[top]=sum;
top++;
}
void bankout(char d[],int m)
{
strcpy(date[top],d);
money[top]=-m;
sum=sum-m;
rest[top]=sum;
top++;
}
void disp();
};

int Bank::sum=0;
void Bank::disp()
{
int i;
printf(" 日期存入 取出余額/n");
for(i=0;i<top;i++)
{
printf("%8s",date[i]);
if(money[i]<0)
printf(" %6d",-money[i]);
else
printf("%6d ",money[i]);
printf("%6d/n",rest[i]);
}
}


void main()
{
Bank obj;
obj.bankin("2001.2.5",1000);
obj.bankin("2001.3.2",2000);
obj.bankout("2001.4.1",500);
obj.bankout("2001.4.5",800);
obj.disp();
}

本程序的執行結果如下:
日期 存入 取出 余額
2001.2.5 1000 1000
2001.3.2 2000 3000
2001.4.1 500 2500
2001.4.5 800 1700
題 1 分析以下程序的執行結果
#include<iostream.h>
class Sample
{
int x,y;
public:
Sample(){x=y=0;}
Sample(int a,int b){x=a;y=b;}
void disp()
{
cout<<"x="<<x<<",y="<<y<<endl;
}
};

void main()
{
Sample s1,s2(2,3);
s1.disp();
s2.disp();
}

解:
本題說明了構造函數的調用順序。首先定義了一個類Sample,在main()中定義了它的兩個對象,定義s1對象時調用其默認構造函數(x=0,y=0),定義s2對象時調用其重載構造函數(x=2,y=3),然后,調用各自的成員函數輸出各自的數據成員。所以輸出為:
x=0,y=0
x=2,y=3 ----------------------------------------------- 題 2 分析以下程序執行的結果
#include<iostream.h>
class Sample
{
int x,y;
public:
Sample() {x=y=0;}
Sample(int a,int b) {x=a;y=b;}
~Sample()
{
if(x==y)
cout<<"x=y"<<endl;
else
cout<<"x!=y"<<endl;
}
void disp()
{
cout<<"x="<<x<<",y="<<y<<endl;
}
};

void main()
{
Sample s1(2,3);
s1.disp();
s1.~Sample();
}

解:
本題說明了可以顯式調用析構函數。首先定義了一個類Sample,在main()中定義了它的一個對象,定義s1對象時調用其重載構造函數(x=2,y=3),然后,調用其成員函數輸出數據成員,然后調用一次析構函數,最后在退出程序時又自動調用析構函數,所以輸出為:
x=2,y=3
x!=y
x!=y
注重:析構函數不同于構造函數,析構函數既能被顯式調用,也能被隱式調用。

---------------------------------------------------- 題 3 分析以下程序的執行結果
#include<iostream.h>
class Sample
{
int x,y;
public:
Sample() {x=y=0;}
Sample(int a,int b) {x=a;y=b;}
~Sample()
{
if(x==y)
cout<<"x=y"<<endl;
else
cout<<"x!=y"<<endl;
}
void disp()
{
cout<<"x="<<x<<",y="<<y<<endl;
}
};

void main()
{
Sample s1,s2(2,3);
s1.disp();
s2.disp();
}

解:
本題說明了析構函數的調用順序,這里定義了兩個對象,先順序調用s1和s2對象的構造函數,再調用各自的成員函數disp(),最后順序調用s2和s1的析構函數。所以輸出為:
x=0,y=0
x=2,y=3
x!=y
x=y 題4.分析以下程序的執行結果
#include<iostream.h>
#include<stdlib.h>
class Sample
{
public:
int x,y;
Sample(){x=y=0;}
Sample(int a,int b){x=a;y=b;}
void disp()
{
cout<<"x="<<x<<",y="<<y<<endl;
}
~Sample()
{
if(x==y)
cout<<"x=y"<<endl;
else
cout<<"x!=y"<<endl;
}
};

void main()
{
Sample s1(2,3);
s1.disp();
if(s1.x==2)
exit(0);
}

解:
本題說明了非正常退出程序時析構函數調用的情況。定義了一個類Sample,在main()中定義了它的一個對象,定義s1對象時調用其重載構造函數(x=2,y=3),然后,調用其成員函數輸出數據成員,由于if條件成立,執行exit非正常退出,不會隱式調用析構函數,所以輸出為:
x=2,y=3
注重:假如程序使用exit、abort非正常退出,不會隱式調用析構函數,這樣造成對象申請資源無法回收,從而導致操作系統的資源緊張而使應用程序無法運行。因此在通常情況下,應使用return語句正常退出。

----------------------------------------------- 題5.分析以下程序的執行結果
#include<iostream.h>
class Sample
{
int x,y;
public:
Sample(){x=y=0;}
Sample(int a,int b){x=a,y=b;}
~Sample()
{
if(x==y)
cout<<"x=y"<<endl;
else
cout<<"x!=y"<<endl;
}
void disp()
{
cout<<"x="<<x<<",y="<<y<<endl;
}
};

void main()
{
Sample(2,3);
}

解:
本題說明了常量對象的構造函數和析構函數的調用情況。在main()中定義了一個常量對象,常量對象在構造之后立即析構。所以輸出為:
x!=y
注重:常量對象的作用域不是整個main()函數,而是僅限于包含該常量的值表達式,表達式一旦計算完成,其中的對象就按構造的逆序析構。

--------------------------------------------------------

題6.分析以下程序的執行結果
#include<iostream.h>
class Sample
{
public:
Sample();
Sample(int);
~Sample();
void display();
protected:
int x;
};

Sample::Sample()
{
x=0;
cout<<"constructing normally/n";
}

Sample::Sample(int m)
{
x=m;
cout<<"constructing with a number:"<<x<<endl;
}

void Sample::display()
{
cout<<"display a number:"<<x<<endl;
}

Sample::~Sample()
{
cout<<"destructing/n";
}

void main()
{
Sample obj1;
Sample obj2(20);
obj1.display();
obj2.display();
}

解:
本題構造函數與析構函數的調用順序。這里定義了兩個對象,先順序調用obj1和obj2對象的構造函數,再調用各自的成員函數disp(),最后順序調用obj2和obj1的析構函數。所以輸出為:
constructing nomally
constructing with a number:20
display a number:0
display a number:20
destructing
destructing

--------------------------------------------------------

題7.分析以下程序的執行結果
#include<iostream.h>
class Sample
{
int n;
static int sum;
public:
Sample(int x){n=x;}
void add(){sum+=n;}
void disp()
{
cout<<"n="<<n<<",sum="<<sum<<endl;
}
};

int Sample::sum=0; // 靜態數據成員賦初值

void main()
{
Sample a(2),b(3),c(5);
a.add();
a.disp();
b.add();
b.disp();
c.add();
c.disp();
}

解:
本題說明靜態數據成員的使用方法。在類中定義了一個靜態數據成員sum,在main()之前給它賦初值0,然后在main()中定義了三個對象,并執行各自的add()和disp()方法。所以輸出為:
n=2,sum=2
n=3,sum=5
n=5,sum=10
注重:靜態數據成員脫離具體的對象獨立存在,其存儲單元不是任何對象存儲空間的一部分,但邏輯上所有對象都共享這一存儲單元,對靜態數據成員的任何操作都會訪問這一存儲單元,從而影響這一存儲單元的所有對象。所以說靜態數據成員不是對象成員,在引用時不需要用對象名。
題8.分析以下程序執行的結果
#include<iostream.h>
class Sample
{
int A;
static int B;
public:
Sample(int a){A=a,B+=a;}
static void func(Sample s);
};

void Sample::func(Sample s)
{
cout<<"A="<<s.A<<",B="<<B<<endl;
}

int Sample::B=0;

void main()
{
Sample s1(2),s2(5);
Sample::func(s1);
Sample::func(s2);
}

解:
本題說明了靜態成員函數的使用方法。其中的數據成員B是靜態數據成員,求B之值是在構造函數中進行的。所以輸出為:
A=2,B=7
A=5,B=7
注重:靜態成員函數與靜態數據成員一樣,也不是對象成員。靜態成員函數的調用不同于普通的成員函數。在靜態成員函數的實現中,引用類的非靜態數據成員是通過對象進行的,如本題中s.A,引用類的靜態數據成員是直接進行的,如本題中的B。

-----------------------------------------------------------

題9.分析以下程序的執行結果
#include<iostream.h>
class Sample
{
char c1,c2;
public:
Sample(char a){c2=(c1=a)-32;}
void disp()
{
cout<<c1<<"轉換為"<<c2<<endl;
}
};

void main()
{
Sample a('a'),b('b');
a.disp();
b.disp();
}

解:
本題說明了構造函數的調用方法。對于對象定義<對象名>(c),構造函數執行c1=c,c2=c-32(小寫轉大寫)。所以輸出為:
a轉換為A
b轉換為B

------------------------------------------------------------

題10.分析以下程序執行的結果
#include<iostream.h>
class Sample
{
int x,y;
public:
Sample(){x=y=0;}
Sample(int a,int b){x=a;y=b;}
void disp()
{
cout<<"x="<<x<<",y="<<y<<endl;
}
};

void main()
{
Sample s1,s2(1,2),s3(10,20);
Sample *pa[3]={&s1,&s2,&s3};
for(int i=0;i<3;i++)
pa[i]->disp();
}

解:
本題說明對象指針數組賦初值方法。定義三個對象和一個對象指針數組,通過賦初值使后者的元素分別指向前面三個對象,然后使用for語句循環調用各個對象的disp()成員函數。所以輸出為:
x=0,y=0
x=1,y=2
x=10,y=20

---------------------------------------------------------- 題11. 分析以下程序的執行結果
#include<iostream.h>
class Sample
{
int x,y;
public:
Sample(){x=y=0;}
Sample(int a,int b){x=a,y=b;}
void disp()
{
cout<<"x="<<x<<",y="<<y<<endl;
}
};

void main()
{
Sample s1,s2(1,2),s3(10,20);
Sample *Pa[3];
Pa[0]=&s1;
Pa[1]=&s2;
Pa[2]=&s3;
for(int i=0;i<3;i++)
Pa[i]->disp();
}

解:
本題說明對象指針數組的賦值方法。定義三個對象和一個對象指針數組,通過賦值語句使后者的元素分別指向前面的三個對象(而不是采用上題的賦初值方法),然后使用for語句循環調用各個對象的disp()成員函數。所以輸出為:
x=0,y=0
x=1,y=2
x=10,y=20 題12. 分析以下程序的執行結果
#include<iostream.h>
class Sample
{
public:
int x;
int y;
void disp()
{
cout<<"x="<<x<<",y="<<y<<endl;
}
};

void main()
{
int Sample::*pc;
Sample s,*p=&s;
pc=&Sample::x;
p->*pc=10;
pc=&Sample::y;
p->*pc=20;
p->disp();
}

解:
本題說明了類數據成員指針的使用方法。這里通過指向對象的指針來給類數據成員賦值,其原理與上題相似。輸出為:
x=10,y=20
------------------------------------------------------
題13.分析以下程序的執行結果
#include<iostream.h>
class Sample
{
int x;
int y;
public:
Sample(int a,int b)
{
x=a;y=b;
}
int getx(){return x;}
int gety(){return y;}
};

void main()
{
int (Sample::*fp)();
fp=&Sample::getx;
Sample s(2,7);
int v=(s.*fp)();
fp=&Sample::gety;
int t=(s.*fp)();
cout<<"v="<<v<<",t="<<t<<endl;
}

解:
本題說明了類成員函數指針的使用方法。在main()中定義的fp是一個指向Sample類成員函數的指針。執行fp=Sample::getx后。fp指向成員函數getx(),int v=(s.*fp)()語句等價于int v.getx(),v=x=2;執行fp=Sample::gety之后,fp指向成員函數gety(),int t=(s.*fp)()語句等價于int t=s.gety(),t=x=7。所以輸出為:
v=2,t=7

------------------------------------------------------

題14 .分析以下程序的執行結果
#include<iostream.h>
class Sample
{
int x;
int y;
public:
Sample(int a,int b)
{
x=a;y=b;
}
int getx(){return x;}
int gety(){return y;}
};

void main()
{
int (Sample::*fp)();
fp=&Sample::getx;
Sample s(2,7),*p=&s;
int v=(p->*fp)();
fp=&Sample::gety;
int t=(p->*fp)();
cout<<"v="<<v<<",t="<<t<<endl;
}

解:
本題說明了類成員函數指針的使用方法。這里通過指向對象的指針來調用指向類成員函數的指針,其原理與上題相似。輸出仍為:
v=2,t=7

-----------------------------------------------------

題15.設計一個立方體類Box,它能計算并輸出立方體的體積和表面積。

解:
Box類包含三個私有數據成員a(立方體邊長)、volume(體積)和area(表面積),另有兩個構造函數以及seta()(設置立方體邊長)、getvolume()(計算體積)、getarea()(計算表面積)和disp()(輸出結果)。
本題程序如下:
#include<iostream.h>
class Box
{
float a;
float volume;
float area;
public:
Box(){}
Box(float r){a=r;}
void seta(float r){a=r;}
void getvolume(){volume=a*a*a;}
void getarea(){area=6*a*a;}
void disp()
{
cout<<"體積:"<<volume<<",表面積:"<<area<<endl;
}
};

void main()
{
Box obj1(4.5),obj2;
obj2.seta(6.4);
obj1.getvolume();
obj1.getarea();
cout<<"obj1=>";
obj1.disp();
obj2.getvolume();
obj2.getarea();
cout<<"obj2=>";
obj2.disp();
}

本程序的執行結果如下:
obj1=>體積:91.125, 表面積:121.5
obj2=>體積:262.144,表面積:245.76 題16.創建一個employee類,該類中有字符數組,表示姓名、街道地址、市、省和郵政編碼。把表示構造函數、changname()、display()的函數的原型放在類定義中,構造函數初始化每個成員,display()函數把完整的對象數據打印出來。其中的數據成員是保護的,函數是公共的。
解:
#include<iostream.h>
#include<string.h>
class employee
{
protected:
char name[10]; // 姓名
char street[20]; // 街道地址
char city[10]; // 市
char prov[10]; // 省
char post[7]; // 郵政編碼
int no; // 記錄序號
public:
employee(char [],char [],char [],char [],char [],int);
void changename(char str[]);
void display();
};
employee::employee(char n[],char s[],char c[],char p1[],char p2[],int num)
{
strcpy(name,n);
strcpy(street,s);
strcpy(city,c);
strcpy(prov,p1);
strcpy(post,p2);
no=num;
}

void employee::changename(char n[])
{
strcpy(name,n);
}

void employee::display()
{
cout<<"輸出記錄 "<<no<<endl;
cout<<" 姓名:"<<name<<endl;
cout<<"街道地址:"<<street<<endl;
cout<<" 市:"<<city<<endl;
cout<<" 省:"<<prov<<endl;
cout<<"郵政編碼"<<post<<endl;
}

void main()
{
employee obj1("王華","中華路15號","武漢市","湖北省","430070",1);
employee obj2("楊麗","天津路30號","南京市","江蘇市","210020",2);
obj1.display();
obj2.display();
}

本程序的執行結果如下:
輸出記錄1
姓名:王華
街道地址:中華路15號
市:武漢市
省:湖北省
郵政編碼:430070
輸出記錄2
姓名:楊麗
街道地址:天津路30號
市:南京市
省:江蘇省
郵政編碼:210020

-------------------------------------------------------------

題17.修改前一題的類,將姓名構成類name,其名和姓在該類中為保護數據成員,其構造函數為接收一個指向完整姓名字符串的指針,其display()函數輸出姓名。然后將employee類中的姓名成員(字符數組)換成name類對象。編制主函數如下:
void main()
{
employee obj("王華","中華路15號"."武漢市","湖北省","430070",1);
obj.display();
obj.changename("王國強");
obj.display();
}

解:
#include<iostream.h>
#include<string.h>
class name
{
protected:
char fname[4]; // 姓
char sname[6]; // 名
public:
name(){}
name(char *);
void changename(char *);
void display();
};

class employee
{
protected:
name na; // 姓名
char street[20]; // 街道地址
char city[10]; // 市
char prov[10]; // 省
char post[7]; // 郵政編碼
int no; // 記錄序號
public:
employee(char [],char [],char [],char [],char [],int);
void changename(char str[]);
void display();
};

name::name(char *p)
{
int i=0;
while(*p!=' ')
fname[i++]=*p++;
fname[i]='/0';
i=0;
p++;
while(*p!='/0')
sname[i++]=*p++;
sname[i]='/0';
}

void name::changename(char *p)
{
int i=0;
while(*p!=' ')
fname[i++]=*p++;
fname[i]='/0';
i=0;
p++;
while(*p!='/0')
sname[i++]=*p++;
sname[i]='/0';
}

void name::display()
{
cout<<fname<<sname;
}

employee::employee(char n[],char s[],char c[],char p1[],char p2[],int num)
{
changename(n);
strcpy(street,s);
strcpy(city,c);
strcpy(prov,p1);
strcpy(post,p2);
no=num;
}

void employee::changename(char n[])
{
na.changename(n);
}

void employee::display()
{
cout<<post<<"/n/n";
cout<<"/t"<<prov<<city<<street<<"/n/n";
cout<<"/t/t";
na.display();
cout<<"(收)"<<"/n/n";
}

void main()
{
employee obj("王華","中華路15號","武漢市","湖北省","430070",1);
obj.display();
obj.changename("王國強");
obj.display();
}
本程序的執行結果如下:
430070
湖北省武漢市中華路15號
王 華(收)
430070
湖北省武漢市中華路15號
王國強(收)
---------------------------------------------------------

題18.編寫一個程序,在已設置好若干個用戶名/口令后,通過輸入用戶名,查找對應的口令,連續執行這一過程直到用戶輸入結束標記(“end“)為止。
解:
設計一個User類,數據成員有User和pass兩個字符數組,存儲用戶名和口令,另有一個構造函數和getuaer()、getpass()兩個成員函數,用于獲取用戶名和口令。在main()中設計一個對象數組ua,當用戶輸入一個用戶名后,在ua中查找,找到后輸出對應的口令,找不到時輸出相應的提示信息。
本題程序如下:
#include<iostream.h>
#include<string.h>
class User
{
char user[10];
char pass[7];
public:
User(char [],char []);
char *getuser();
char *getpass();
};

User::User(char u[],char p[])
{
strcpy(user,u);
strcpy(pass,p);
}

char *User::getuser()
{
return user;
}

char *User::getpass()
{
return pass;
}

void main()
{
User ua[]={User("Li","123456"),User("wang","654321"),
User("Chen","213412"),User("Xu","878616"),
User("Ma","876574"),User("Song","666666")};
char name[10];
while(1)
{
cout<<"輸入用戶名:";
cin>>name;
if(strcmp(name,"end")==0)
break;
for(int i=0;i<6;i++)
if(strcmp(name,ua[i].getuser())==0)
{
cout<<" 用戶口令:"<<ua[i].getpass()<<endl;
break;
}
if(i==6)
cout<<" 用戶名不存在"<<endl;
}
}
本程序的執行結果如下:
輸入用戶名: Li
用戶口令:123456
輸入用戶名:Wang
用戶口令:654321
輸入用戶名:He
用戶名不存在
輸入用戶名:end

題19.編寫一個程序,輸入N個學生數據,包括學號、姓名、成績,要求輸出這些學生數據并計算平均分。
解:
設計一個學生類Stud,除了包括no(學號)、name(姓名)和deg(成績)數據成員外,有兩個靜態變量sum和num,分別存放總分和人數,另有兩個普通成員函數setdata()和disp(),分別用于給數據成員賦值和輸出數據成員的值,另有一個靜態成員函數avg(),它用于計算平均分。在main()函數中定義了一個對象數組用于存儲輸入的學生數據。
本題程序如下:
#include<stdio.h>
#include<string.h>
#define N 3
class Stud
{
int no;
char name[10];
int deg;
static int num;
static int sum;
public:
void setdata(int n,char na[],int d)
{
no=n; deg=d;
strcpy(name,na);
sum+=d;
num++;
}
static double avg()
{
return sum/num;
}
void disp()
{
printf(" %-5d%-8s%3d/n",no,name,deg);
}
};
int Stud::sum=0;
int Stud::num=0;

void main()
{
Stud st[N];
int i,n,d;
char na[10];
for(i=0;i<N;i++)
{
printf("輸入學號 姓名 成績:");
scanf("%d%s%d",&n,na,&d);
st[i].setdata(n,na,d);
}
printf("輸出數據/n");
printf(" 學號 姓名 成績/n");
for(i=0;i<N;i++)
st[i].disp();
printf(" 平均分=%g/n/n",Stud::avg());
}

本程序的執行結果如下:
輸入學號 姓名 成績: 1 stud1 89
輸入學號 姓名 成績: 2 stud2 78
輸入學號 姓名 成績: 3 stud 84
輸出數據
學號 姓名 成績
1 stud1 89
2 stud2 78
3 stud3 84
平均分=83

-------------------------------------------------------

題20.編寫一個程序,已有若干個學生數據,這些數據包括學號、姓名、語文成績、數學成績和英語成績,求各門功課的平均分。要求設計不同的成員函數求各門課程的平均分,并使用成員函數指針調用它們。
解:
設計一個學生類student,包括no(學號)、name(姓名)、deg1(語文成績)、deg2(數學成績)、deg3(英語成績)數據成員和三個靜態數據成員sum1(累計語文總分)、sum2(累計數學部分)、sum3(累計英語總分);另外有一個構造函數和三個求平均分的成員函數和一個disp()成員函數。
本題程序如下:
#include<stdio.h>
#include<string.h>
#define N 4
class student
{
int no;
char name[10];
int deg1; // 語文成績
int deg2; // 數學成績
int deg3; // 英語成績
static int sum1; // 語文總分
static int sum2; // 數學總分
static int sum3; // 英語總分
public:
student(int n,char na[],int d1,int d2,int d3)
{
no=n;
strcpy(name,na);
deg1=d1;deg2=d2;deg3=d3;
sum1+=deg1;sum2+=deg2;sum3+=deg3;
}
double avg1(){return (sum1*1.0)/N;}
double avg2(){return (sum2*1.0)/N;}
double avg3(){return (sum3*1.0)/N;}
void disp()
{
printf(" %4d%10s%6d%6d%6d/n",no,name,deg1,deg2,deg3);
}
};
int student::sum1=0;
int student::sum2=0;
int student::sum3=0;

void main()
{
double (student::*fp)(); // 定義成員函數指針
student s1(1,"Li",67,89,90);
student s2(2,"Ma",67,89,90);
student s3(3,"Zheng",67,89,90);
student s4(4,"Chen",67,89,90);
printf("輸出結果/n");
s1.disp();
s2.disp();
s3.disp();
s4.disp();
fp=student::avg1;
printf(" 語文平均分:%g/n",(s1.*fp)());
fp=student::avg2;
printf(" 數學平均分:%g/n",(s1.*fp)());
fp=student::avg3;
printf(" 英語平均分:%g/n",(s1.*fp)());
}
本程序的執行結果如下:
輸出結果
1 Li 67 89 90
2 M 89 89 90
3 Zheng 67 89 90
4 Chen 67 89 90
語文平均分:67
數學平均分:89
英語平均分:90

--------------------------------------------------------

題21.編寫一個程序,輸入N個學生數據,包括學號、姓名、成績,要求只輸出成績在80~89分的學生數據。
解:
設計一個學生類Stud,包括no(學號)、name(姓名)和deg(成績)數據成員,另有兩個普通成員函數setdata()和disp(),前者用于設置對象數據,后者用于只輸出成績在80~89分數段的學生數據。在main()函數中定義了一個對象數組,用于存儲輸入的學生數據。
本題程序如下:
#include<stdio.h>
#include<string.h>
#define N 3
class Stud
{
int no;
char name[10];
int deg;
public:
void setdata(int n,char na[],int d)
{
no=n; deg=d;
strcpy(name,na);
}
void disp()
{
if(deg>=80&&deg<=89)
printf(" %-5d%-8s%3d/n",no,name,deg);
}
};

void main()
{
Stud st[N];
int i,n,d;
char na[10];
for(i=0;i<N;i++)
{
printf("輸入學號 姓名 成績:");
scanf("%d%s%d",&n,na,&d);
st[i].setdata(n,na,d);
}
printf("輸出數據/n");
printf(" 學號 姓名 成績/n");
for(i=0;i<N;i++)
st[i].disp();
}
本程序執行結果如下:
輸入學號 姓名 成績: 1 stud1 78
輸入學號 姓名 成績: 2 stud2 85
輸入學號 姓名 成績: 3 stud3 89
輸出數據
學號 姓名 成績
2 stud2 85
3 stud3 89



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 莲花县| 石嘴山市| 启东市| 东至县| 申扎县| 澄城县| 宁陕县| 正安县| 丁青县| 浦北县| 霍州市| 遂平县| 山东| 嘉定区| 桂东县| 塔城市| 左云县| 丰镇市| 伊金霍洛旗| 新河县| 绥棱县| 通化市| 开封县| 龙泉市| 中阳县| 西宁市| 广东省| 保山市| 清丰县| 沙田区| 襄樊市| 凌源市| 芦山县| 道真| 郧西县| 陆丰市| 昭通市| 博爱县| 历史| 乐陵市| 大安市|