數(shù)組的概念課件_第1頁
數(shù)組的概念課件_第2頁
數(shù)組的概念課件_第3頁
數(shù)組的概念課件_第4頁
數(shù)組的概念課件_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

數(shù)組的概念

1.定義一個長度為4的數(shù)組,

用于存儲用戶輸入的4個數(shù)。

求解并打印第1、4個元素的平均值

以及第2、3個元素的平均值。

#include<iostream>

usingnamespacestd;

voidmain()

(

doublea[4];

coukv"請輸入4個數(shù)字:

for(intb=0;b<4;b++)

(

cin?a[b];

)

cout?(a[0]+a[3])Z2?endl;

cout?(a[l]+a[2])/2?endl;

)

2.定義一個長度為12的整型數(shù)組

,其元素由隨機數(shù)發(fā)生器隨機產(chǎn)生,

并將該數(shù)組按照逆序打印出來。

#include<iostream>

#include<ctime>

usingnamespacestd;

voidmain()

(

constintN=12;

srand(time(O));

inta[N];

cout<〈"原數(shù)組:\n";

for(intb=0;b<N;b++)

(

a[b]=rand();

cout?a[b]?'

)

cout?endl;

cout<<"逆序輸出:\n";

for(intc=N-l;c>=O;c-)

cout?a[c]?'

)

cout?endl;

}

數(shù)組的應用

1.使用一個數(shù)組存儲一年中各月的天數(shù)

,試回答用戶某年某月的天數(shù)。

例:假設用戶輸入的年數(shù)為2012,

月數(shù)為2,則程序應輸出29。

要求:先編寫一個判斷閏年的函數(shù),

輸入:一個正整數(shù)(年份);輸出:真

(是閏年)或假(不是閏年)。并在主

函數(shù)中使用該函數(shù)來判斷閏年。

#include<iostream>

usingnamespacestd;

boolrunnian(int);

voidmain()

(

intyear,month;

防3[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};

coukv"請輸入年份和月份:,

cin?year?month;

if(year>0&&month>0&&month<=12)

(

if(runnian(year))

j[2]++;

cout<<year<<''年"<<month<<”月的天數(shù)是:"?j[month]?endl;

)

else

cout<<''輸入數(shù)據(jù)不合法!\n";

)

boolrunnian(intyear)

(

if(year%4==0&&year%100!=01|year%400==0)

returntrue;

else

returnfalse;

)

2.試編寫程序計算乘積矩陣。設矩陣A

、B如下圖片所示,計算乘積矩陣

C并打印出來。

注意矩陣的輸入形式按行進行輸入

#include<iostream>

#include<iomanip>

usingnamespacestd;

voidmain()

(

constintM=3,N=4,K=4;

inta[M][K]={{3,0,4,5},{6,2,l,7},{4,l,5,8}};

intb[K][N]={{l,0,4,3},{2,5,l,6},{0,7,4,4},{9,3,6,0}};

intc[M][N];

int

cout<<"原矩陣A:\n";

for(i=0;i<M;i++)

(

for(j=0;j<K;j++)

cout?setw(4)?a[i][j];

cout?endl;

}

cout<<"原矩陣B:\n";

for(i=0;i<K;i++)

(

for(j=0;j<N;j++)

cout?setw(4)?b[i][j];

cout?endl;

)

for(i=0;i<M;i++)

for(j=0;j<N;j++)

(

intt=0;

for(k=0;k<K;k++)

t+=a[i][k]*b[k][j];

c[i]U]=t;

)

cout<<"乘積矩陣C=A*B:\n";

for(i=0;i<M;i++)

for(j=0;j<N;j++)

cout?setw(4)?c[i][j];

cout?endl;

)

字符數(shù)組的應用

1.編程實現(xiàn):將michaeljackson的名字

保存在字符數(shù)組name中,并將其中兩個單

詞的首字符改為大寫后打印出來?

#include<iostream>

usingnamespacestd;

voidmain()

charname[]="michaeljackson";

cout?name?endl;

name[0]=toupper(name[0]);

name[8]=toupper(name[8]);

cout?name?endl;

2.將字符數(shù)組strl中下標為單號的元素

值賦給另一個字符數(shù)組str2,并打印輸

出strl和str2o其中strl中保存的字符

串可以由用戶輸入,假設不超過30個字符。

#include<iostream>

usingnamespacestd;

voidmain()

(

constintN=30;

charstrl[N+l]=""/str2[N/2+l]="";

cout<<"請輸入一個不超過30個字符的字符串:";

cin?strl;

for(inti=0;strl[i]!='\O';i++)

(

if(i%2==l)

str2[i/2]=strl[i];

)

cout?strl?endl;

cout?str2?endl;

)

3編程實現(xiàn):由用戶輸入一些字符,之后

求出其中英文字母、數(shù)字及其他字符各占多少百分比?

提示:假設輸入的字符不超過80個。

相關函數(shù)說明:

inttoupper(int):將一個小寫字母轉

換為大寫字母。輸入:一個小寫字母

;輸出:對應的大寫字母。

intisalpha(int):判斷一個字符是否

是英文字母。輸入:一個字符;輸出:

真(是個英文字母)或假(不是個英文字母)。

intisdigit(int):判斷一個字符是否是十

進制數(shù)字字符。輸入:一個字符;輸出

:真(是個數(shù)字字符)或假(不是個數(shù)字字符)。

#include<iostream>

usingnamespacestd;

voidmain()

(

constintN=80;

charstr[N+l];

int\,letter,num,chr;

cout<<"請輸入一個不超過80個字符的字符串:";

cin?str;

letter=num=chr=O;

for(i=0;str[i]!='\O';i++)

(

if(isalpha(str[i]))

letter++;

elseif(isdigit(str[i]))

num++;

else

chr++;

)

cout?"Alpha:"?(float)letter/i*100?"%"?endl;

cout?"Number:"?(float)num/i*100?"%"?endl;

cout?"Othercharacter:"?(float)chr/i*100?"%"?endl;

)

4.編程實現(xiàn):保存用戶輸入的12個英文名字

,并打印出其中的第1、3、5、7、9、11個名字。

#include<iostream>

usingnamespacestd;

voidmain()

(

constintM=12,N=30;

charname[M][N+l];

inti;

cout?"請輸入12個英文名字:\n";

for(i=0;i<M;i++){

cin?name[i];

)

coutcv"第1,3,5,7,9,11個人的名字是:\n";

for(i=0;i<12;i+=2){

cout?(i+l)?":\t"?name[i]?endl;

)

)

數(shù)組的綜合應用

L使用隨機數(shù)發(fā)生器產(chǎn)生50個

不超過100的正整數(shù),保存在數(shù)組

中,打印原始數(shù)組及降序排列后的數(shù)組

o并在數(shù)組中查找某個由用戶指定的整數(shù)

,若找到則打印出其下標,否則打印“未找到”。

要求:打印數(shù)組時按橫向制表位列對

齊的方式(數(shù)據(jù)以‘\t'間隔),每行10個數(shù)。

#include<iostream>

#include<ctime>

usingnamespacestd;

voidmain()

constintN=50;

inta[N];

int\,j;

srand(time(NULL));

coukv"原始數(shù)組:\n";

for(i=0;i<N;i++)//產(chǎn)生并打印原始數(shù)組

(

a[i]=rand()%100;

cout?a[i]?"\t";

if((i+l)%10==0)cout?endl;

}

cout?endl;

//選擇排序法

for(i=0;i<N-l;i++)

(

intk=i;

for(j=j+l;j<N;j++){

if(a[k]<a[j])k=j;//查找最大值元素,降序排列

}

intm=a[k];

a[k]=a[i];

a[i]=m;

)

cout<<"降序排列后的數(shù)組:\n";

for(i=0;i<N;i++){

cout?a[i]?"\t";

if((i+l)%10==0)cout?endl;

)

cout?endl;

intnum;

cout<<"請輸入一個要查找的100以內(nèi)的整數(shù):

cin?num;

//二分查找法

intlow=0,high=N-l;//查找空間的首尾元素的下標

while(low<=high)

intmid=(low+high)/2;//查找空間的中點元素的下標

if(a[mid]==num){

coutvv"找到a["?mid?"]="?num?endl;

break;

)

elseif(a[mid]<num)high=mid-l;〃查找空間縮小一半

elselow=mid+l;//查找空間縮小一半

)

if(low>high)cout<<"數(shù)組中未找到"vvnumvvendl;

)

2.編程實現(xiàn):保存用戶輸入的12個英文名字,排序后打印出來。

提示:比較兩個名字可以使用字符串比較函數(shù)intstrcmp(char*,

char*)o

#include<iostream>

usingnamespacestd;

voidmain()

(

constintM=12,N=30;

charname[M][N+l];

inti;

cout?"請輸入12個英文名字:\n";

for(i=0;i<M;i++){

cin?name[i];

)

//冒泡排序法

for(i=0;i<M-l;i++)

for(intj=M-l;j>i;j-)

(

chart[M];

if(strcmp(name[j],name[j-l])<0)//將值小的元素向前

交換,升序排列

(

strcpyft,name[j]);

strcpy(name[j],name[j-1]);

strcpy(name[j-1],t);

)

}

//打印升序排列后的數(shù)組

coukv"升序排列后:\n";

for(i=0;i<M;i++)

cout?name[i]?endl;

3.某學校有12名學生參加100米短跑比賽

,每個運動員號和成績?nèi)缦卤硭?,請按照?/p>

賽成績排名并輸出,要求每一行輸出名次,運

動員號和比賽成績?nèi)棓?shù)據(jù)。并在之后查找用

戶指定的運動員成績及其名次,例如用戶輸入

運動員號8,則程序應打印出8號運動員的成

績及名次。100米短跑比賽成績

運動員號成績(秒)運動員號成績(秒)

113.6214.9

314.8412.6

512.0613.4

712.7812.5

915.61015.3

1113.41212.7

#include<iostream>

usingnamespacestd;

voidmain()

(

constintN=12;

double

result[N][2]={{l,13.6},{2,14.9},{3,14.8},{4,12.6},{5,12.0},{6,13.4},{7,12.7

},{8,12.5},{9,15.6},{10,15.3},{11,13.4},{12,12.7}};

inti,num;

//插入排序法

for(i=l;i<N;i++)

(

doublek[2]={result[i][0],result[i][l]};//待插入的一行數(shù)據(jù)

先保存在數(shù)組k中

intj=i-l;

while(j>=O&&k[l]<result[j][l])//尋找插入點

{//較大的數(shù)據(jù)向后移動,升序排列

result[j+l][O]=result[j][0];

result[j+l][l]=result[j][l];

j--;

)

//在插入點后插入數(shù)據(jù)

result[j+l][O]=k[O];

result[j+l][l]=k[l];

)

cout<<"排序后:\n";

coukv"名次\t編號\t成績\n";

for(i=0;i<N;i++)

(

cout?i+l?":\t";

cout?result[i][0]?"\t";

cout?result[i][l]?endl;

)

cout<<"請輸入要查找的運動員的編號:

cin?num;

//順序查找法

for(i=0;i<N;i++)

(

if(result[i][O]==num)

(

cout<<"找到:\n名次\t編號\t成績\n";

cout?i+l?":\t";

cout?result[i][0]?"\t";

cout?result[i][l]?endl;

break;

)

)

if(i>=N)

cout<<"未找到\n";

}指針的概念和應用

1、假設有int型變量x、y,bool型變量f、g和double型數(shù)組a[5]。

按以下要求編寫程序:

(a)為x、y、f和g隨便賦一個值,請輸出各變量的值及其地址。

(b)輸出數(shù)組a的第一個元素和最后一個元素的地址。

思考:兩個地址之間差多少,為什么?

#include<iostream>

usingnamespacestd;

voidmain()

(

intx,y;

boolf,g;

doublea[5];

x=10,y=20;

int*xp=&x,*yp=&y;

cout?"x:"?*xp?'\t'?xp?encll;

cout?"y:"?*yp?'\t,?yp?endl;

f=true,g=false;

bool*fp=&f,*gp=&g;

cout?"f:"?*fp?'\t'?fp?encll;

cout?"g:"?*gp?'\t'?gp?encll;

/*存儲一個double型數(shù)據(jù)需要8Byte空間,

因此元素與的地址相差應為即

a[0]a[4]4*8Byte,32Byteo

需注意的是:顯示的地址是一個十六進制數(shù),

所以下面打印出的兩個地址應相差0x20。*/

cout?"a[0]:"?&a[0]?endl;

cout?"a[4]:"?&a[4]?endl;

)

2.將字符串常量"pointer"保存在一個字符數(shù)組中,打印以下三行內(nèi)

容:(1)該數(shù)組的首地址;(2)該字符串;(3)請使用指針變量輸出

該字符串,要求每個字符之間空一個格。

#include<iostream>

usingnamespacestd;

voidmain()

(

charstr[]="pointer";//定義字符數(shù)組str存儲該字符串

cout?(void*)str?endl;//打印輸出數(shù)組的首地址

cout?str?endl;//打印輸出字符串

char*p=str;//定義字符指針p指向數(shù)組中的第一個字符

while(*p){

cout?*p?'//循環(huán)打印數(shù)組中的每個字符,并以空格間

P++;

}

cout?endl;

)

3.試用指針實現(xiàn):判斷一個數(shù)組是否是對稱的。如{1,2,3,5,7,7,5,3,2,1}

是對稱的,而{123,5,7,5,3,2,1}或{1,235,7,5,3}都不是對稱的。

要求:數(shù)組的元素個數(shù)定義為常量N,N的值以及數(shù)組各元素的值自

定。

#include<iostream>

usingnamespacestd;

voidmain()

(

constintN=10;

inta[N]={l,2,3,5,7,7,5,3,2,l};

//其他試驗值intb[]={1,2,3,5,7,5,3,2,1};intc[]={1,2,3,5,7,5,3};

等等

forfinti=0;i<N;i++)//打印數(shù)組所有元素

cout?a[i]?"

cout?endl;

if(N%2==0)

(

int*headp=a;//定義首指針,指向數(shù)組第一個元素

int*tailp=a+N-l;//定義尾指針,指向數(shù)組最后一個元素

while(headp<tailp)

(

if(*headp!=*tailp)//如果兩個指針指向的數(shù)不相等

(

cout<<"該數(shù)組不對稱。\n";

break;

)

headp++;//首指針增1,即向后移動,指向下一個元素

tailp-;//尾指針減1,即向前移動,指向前一個元素

}

if(headp>=tailp)//如果首指針已大于或等于尾指針

cout<<"該數(shù)組對稱。\n";

)

else

cout<<"該數(shù)組不對稱。\n";

}

指針與函數(shù)的應用

1.試編寫一個實現(xiàn)三位正整數(shù)數(shù)字拆分功能的函數(shù)ChaiFen,其函數(shù)

原型如下:

boolChaiFen(intn,int&n2,int&nl,int&n0);

要求:函數(shù)檢查參數(shù)n是否是正數(shù),若是則進行拆分,并將百、十、

個位分別保存在引用型參數(shù)n2、nl和nO中,函數(shù)返回true表示拆

分成功;否則不進行拆分,函數(shù)返回false。

用寫主函數(shù),調(diào)用上述函數(shù)將用戶輸入的任意正整數(shù)進行拆分后顯

Zj\o

#include<iostream>

usingnamespacestd;

boolChaiFen(int,int&,int&,int&);

voidmain()

(

intx,bai,shi,ge;

cout<<''請輸入任意一個三位正整數(shù):

cln?x;

if(x>=100&&x<1000&&ChaiFen(x,bai,shi,ge))//調(diào)用函數(shù),形參

n2,nl,nO將分別引用實參bai,shi,ge

(

coutvvxvv"拆分顯示為"

?bai?""?shi?""?ge?endl;

)

else

coukv"輸入數(shù)據(jù)不合法。\n";

)

boolChaiFen(intn,int&n2,int&nl,int&n0)//函數(shù)定義,n2,nl,

nO聲明為引用型參數(shù)

(

if(n<=0)

returnfalse;

n2=n/100;//百位保存在n2中,也即保存在main函數(shù)中的變

量bai中

nl=n%100/10;〃十位保存在nl中,也即保存在main函數(shù)中

的變量shi中

n0=n%10;//個位保存在nO中,也即保存在main函數(shù)中的變

量ge中

returntrue;

2.試編寫函數(shù)ChaZha。實現(xiàn)數(shù)組元素查找的功能。若找到,返回其

地址;否則,返回空指針NULL。

正確定義上述函數(shù),使其功能可以在下面的主函數(shù)中得到測試。

voidmain()

(

constintN=12;

inta[N]={15,96,46,53,58,52,10,35,66,16,63,50);

intkl=30,k2=58;

int*pl=ChaZhao(a,N,kl),*p2=ChaZhao(a/N,k2);

if(pl!=NULL)cout<<“找至!Ja["?pl-a?"]="?*pl?endl;

elsecout<<"未找至『'(〈klvvendl;

if(p2!=NULL)cout<<"找至!]a["?p2-a?"]="?*p2?endl;

elsecout<<"未找到"<<k2?endl;

)

答案:

#include<iostream>

usingnamespacestd;

int*ChaZhao(int[],int,int);

voidmain()

(

constintN=12;

inta[N]={15,96,46,53,58,52,10,35,66,16,63,50);

intkl=30,k2=58;

int*pl=ChaZhao(a,N,kl),*p2=ChaZhao(a,N,k2);

if(pl!=NULL)cout<<"找至!Ja["?pl-a?"]="?*pl?endl;

elsecout<<"未找到"<<kl?endl;

if(p2!=NULL)cout<<"找到a["?p2"a?"]="?*p2?endl;

elsecout<<"未找至!j"<<k2?endl;

)

int*ChaZhao(inta[],intN,intk)

(

for(inti=0;i<N;i++)

if(a[i]==k)

return&a[i];//找到元素a[i]與k相等,return語句返回該

元素的地址并結束函數(shù)

returnNULL;〃未找到,return語句返回空指針NULL并結束函

數(shù)

)

指針的綜合應用

1.輸入一行英文單詞,假定單詞由一個或多個空格隔開,統(tǒng)計有幾

個單詞。

要求:假設輸入的字符數(shù)不超過80個,將該值保存在常量N中。

提示:輸入有空格的字符串可使用cin對象的成員函數(shù)getline。

調(diào)用方法:cin.getline(str,n);

功能:讀入用戶輸入的一行不超過n個的字符(可以有空格),并存

放在字符數(shù)組str中。

#include<iostream>

usingnamespacestd;

voidmain()

(

constintN=80;

charstr[N+l];

cout<<"請輸入單詞加空格構成的字符串:";

cin.getline(strzN);

char*p=str;〃指針p先指向第一個字符

intk=0;〃單詞數(shù)開始為0

while(*p){〃當p指向的不是結束符'\0'時繼續(xù)循環(huán)

while(*p=='')p++;〃當p指向的是空格時,p向后移動,循

環(huán),直到p指向的不是空格

if(*p=='\O')break;〃如果p指向的是結束符,停止循環(huán)

while(*p!=''&&*p)p++;/*當p指向的既不是空格也不是結

束符時,p向后移動,循環(huán),直到p指向的是空格或結束符*/

k++;〃單詞數(shù)增加一個

)

coukv"共有單詞個\n";

)

/*參考解答2:

#include<iostream>

usingnamespacestd;

voidmain()

(

constintN=80;

charstr[N+l];

cout<<"請輸入單詞加空格構成的字符串:,

cin.getline(str,N);

char*p=str;〃指針p先指向第一個字符

intk=0;〃單詞數(shù)開始為0

while(*p){〃當p指向的不是結束符'\0'時繼續(xù)循環(huán)

if(*p!=',&&*(p+l)=='')k++;//如果p指向的字符不是空格,

而下一個字符是空格,則單詞數(shù)增加一個

P++;

)

if(*(p-l)!='')k++;//如果結束符(p指向的字符)前面的字符(最

后一個字符)不是空格,則單詞數(shù)增加一個

cout<<"共有單詞""kvv"個\n";

)*/

2.試編程實現(xiàn),重排一個偶數(shù)長度的數(shù)值數(shù)組,即將其后半部分元

素依次插入前半部分元素之間。例如,假設一個長度為8的數(shù)組,其

元素記為0~7,則重排后的順序應為{0,4,1,5,2,6,3,7}。

要求:定義常量N作為數(shù)組的長度,數(shù)組的元素由隨機數(shù)發(fā)生器產(chǎn)

生,不超過50,可帶一位小數(shù)。

編寫如下函數(shù):

voidinit_array(double*a,intn),功能:產(chǎn)生數(shù)組的每個元素。輸

入:待填云的數(shù)組a,數(shù)組的長度n。輸出:無。

voidprint_array(double*a,intn),功能:打印數(shù)組,元素之間以空

格間隔。待打印的數(shù)組a,數(shù)組的長度n。輸出:無。

voidrearrange_array(double*a,intn),功能:重排數(shù)組的元素。輸

入:待重排的數(shù)組a,數(shù)組的長度n,其中n必須為正偶數(shù)。輸出:

無。

并在以下主函數(shù)中調(diào)用上述函數(shù),實現(xiàn)重排數(shù)組元素的功能。(若缺

少某些需要的語句,可自行添加。)

#include<iostream>

usingnamespacestd;

voidmain()

(

constintN=24;

doublea[N];

init_array(a,N);//初始化數(shù)組

coukv"原始數(shù)組:\n";

print_array(a,N);〃打印原始數(shù)組

rearrange_array(a,N);〃重排數(shù)組

cout?"重排后的數(shù)組:\n";

print_array(a,N);//打印重排后的數(shù)組

)

答案:

#include<iostream>

#include<ctime>

usingnamespacestd;

voidinit_array(double*,int);//數(shù)組初始化函數(shù)的聲明語句

voidrearrange_array(double*,int);//數(shù)組重排函數(shù)的聲明語句

voidprint_array(double*,int);//數(shù)組打印輸出函數(shù)的聲明語句

voidmain()

(

constintN=24;

doublea[N];

init_array(a,N);//初始化數(shù)組

cout<<"原始數(shù)組:\n";

print_array(a,N);//打印原始數(shù)組

rearrange_array(a,N);〃重排數(shù)組

coukv"重排后的數(shù)組:\n";

print_array(a,N);//打印重排后的數(shù)組

)

voidinit_array(double*a,intn)

{一

srand(time(O));

for(inti=0;i<n;i++)a[i]=rand()%500*0.1;

}

voidprint_array(double*a,intn)

(~

for(inti=0;i<n;i++)

cout?a[i]?'

cout?endl;

)

voidrearrange_array(double*a,intn)

(一

if(n%2){

cout?"數(shù)組元素個數(shù)非偶數(shù),無法重排!\n";

return;

)

double*b=newdouble[n];

double*one=a,*two=a+n/2;

for(inti=0;i<n;i+=2){

b[i]=*one,b[i+l]=*two;

one++,two++;

)

for(i=0;i<n;i++)

a[i]=b[i];

)

/*數(shù)組重排函數(shù)的另一種方案

voidrearrange_array(double*a,intn)

(一

if(n%2){

coukv"數(shù)組元素個數(shù)非偶數(shù),無法重排!\n";

return;

)

double*start=a+l,*end=a+n/2;

while(end<(a+n)){

double*p=end,k=*p;

while(p>start){

*p=*(p-l);

P--;

)

*p=k;

start+=2,end++;

)

}*/

3.試編寫程序,將用戶輸入的一個十進制正整數(shù)轉化為十六進制輸

出。

提示:將十進制數(shù)轉換為N進制數(shù)可采用“除N取余法”。可參看課

件上的分析。

#include<iostream>

usingnamespacestd;

intmain()

(

constintN=16;

inta,b,n,i=0;

cout<<''請輸入要轉換的整數(shù):

cin?a;

b=a;//將原始值保存在另一變量b中,以備后面再次使用

while(a){//計算轉換成的N進制數(shù)的位數(shù)

a/=N;

i++;

)

n=i;//十進制數(shù)a可以轉換成n位N進制數(shù)

int*p=newint[n];//分配n個整數(shù)空間用來存放轉換成的進

制數(shù)的各個位

if(p){//如果動態(tài)內(nèi)存分配成功則進行如下轉換

a=b;//將原始值再次保存在變量a中

for(i=0;i<n;i++){

p[i]=a%N;//用“除N取余法”求余數(shù),并保存在數(shù)組

a/=N;//將a縮小N倍

)

for(i=n-l;i>=0;i-){//打印輸出轉換后的各個位,順序與上

面存儲的順序相反

if(p[i]<10)//10以內(nèi)的直接輸出

cout?p[i];

else//10及以上的輸出'A'-'F'

cout?char(p[i]-10+'A');

}

cout?endl;

)

else{//內(nèi)存分配不成功

coukv"動態(tài)內(nèi)存分配失敗!\n";

)

return0;

4.(選做)N個小孩圍成一圈做游戲,1~N順序編號,從第一個人開

始從1到D(k=D<=N)報數(shù),報到D的人退出圈子,循環(huán)進行,問最

后留下的人是最初編號為多少的人。

試編寫函數(shù)模擬該過程,函數(shù)參數(shù)為人數(shù)N與報數(shù)值D,返回值為最

后人的編號。并編寫主函數(shù)測試該函數(shù)的功能。

提示:動態(tài)分配N個內(nèi)存空間,存放小孩最初的編號。

//解法1:利用數(shù)組和指針實現(xiàn)

#include<iostream>

usingnamespacestd;

intmain()

(

intN;

intD;

cout<<''請輸入?yún)⒓佑螒虻娜藬?shù):",cin?N;

cout<<"請輸入報數(shù)的值:",cin?D;

int*a=newint[N+l];

if(!a){

cout<<"內(nèi)存不足!\n";

return-1;

}

int*intp=a;

intlastNum;

for(inti=0;i<N;i++)a[i]=i+l;

a[N]=0;

while(*a){

for(intj=l;j<D;j++){

intp++;

if(*intp==O)intp=a;

)

lastNum=*intp;

j=0;

while(intp[j])intp[j]=intp[j+l]J++;

if(*intp==O)intp=a;

)

cout?"\n最后留下的人是"?lastNum?"號。"<<endl;

delete[]a;

return0;

)

/*解法2:利用鏈表實現(xiàn)

#include<iostream>

usingnamespacestd;

structnode{

intn;

node*next;

);

intmain()

(

intN;

intD;

cout<<"請輸入?yún)⒓佑螒虻娜藬?shù):",cin?N;

cout<<"請輸入報數(shù)的值:",cin?D;

node*head=newnode;

if(head==NULL){

coukv"內(nèi)帝分配失敗!\n";

return-1;

}

head->n=l;

node*np=head;

for(inti=l;i<N;i++){

np->next=newnode;

if(np->next==NULL){

cout<〈"內(nèi)存分配失?。n";

return-1;

}

np=np->next;

np->n=i+l;

)

np->next=head;

while(np!=np->next){

for(i=l;i<D;i++){

np=np->next;

}

node*tmp=np->next;

np->next=tmp->next;

deletetmp;

)

cout?np->n?endl;

deletenp;

return0;

)*/

結構體的概念及應用

1..定義一個結構類型employee來保存雇員信息,包括姓名、性另U、

年齡和工資收入。并編寫主函數(shù),存儲并輸出男雇員王杰的信息,

28歲,月收入3000元;存儲并輸出女雇員趙麗的信息,45歲,月

收入5300元。

#include<iostream>

usingnamespacestd;

//定義employee結構體類型

structEmployee

(

charname[31];

boolgender;//true為男性,false為女性

intage;

intsalary;

);

voidmain()

(

Employeewj={"王杰",true,28,3000},zl={“趙麗”,false,45,5300);

cout??":

if(wj.gender)cout<<"男,";

elsecout<<"女,,

cout?wj.age<<"歲,月收入"<<wj.salary<<"元。\n";

cout??":

if(zl.gender)cout<<',男,";

elsecout<<"女,”;

cout?zl.age?"^,月收入"<<zl.salary<<"元。\n";

}

2.已知結構類型Student的定義(參見ppt課件),數(shù)組group存儲

了5個學生的信息,試用隨機數(shù)發(fā)生器產(chǎn)生這些人的成績(100以內(nèi)

的整數(shù)),并按成績從高到低的順序輸出他們的信息(一人一行,各

項信息按列對齊)。請補充以下代碼完成上述功能。

//補充以下代碼,包含所需頭文件

〃補充以下代碼,定義Student結構體類型

//主函數(shù)

voidmain()

(

constintN=5;

Studentgroup[N]={{"Mike","11010502010"},{"Jane",

"11010502031"},

{"Henry","11010502018"},{"Marry","11010502012"},

{"Alex","11010502025"}};

//補充以下代碼,產(chǎn)生并保存每個學生的成績

//補充以下代碼,將這些學生按成績從高到低排序

//補充以下代碼,打印輸出所有學生的信息

//補充以下代碼,包含所需頭文件

#include<iostream>

#include<iomanip>

#include<ctime>

usingnamespacestd;

〃補充以下代碼,定義Student結構體類型

structStudent

(

charname[31];

charnum[12];

intscore;

);

//主函數(shù)

voidmain()

(

constintN=5;

Studentgroup[N]={{"Mike","11010502010"},{"Jane",

"11010502031"},

{"Henry","11010502018"},{"Marry",

"11010502012"},

{"Alex","11010502025"}};

//補充以下代碼,產(chǎn)生并保存每個學生的成績

srand(time(0));

for(inti=0;i<N;i++)

group[i].score=rand()%100;

//補充以下代碼,輸出所有學生的信息

cout.setf(ios::left);

cout?setw(15)?"姓名"?setw(15)?"學號"?setw(8)?"成績

"?endl;

for(i=0;i<N;i++){

cout?setw(15)?group[i].name;

cout?setw(15)?group[i].num;

cout?setw(8)?group[i].score?endl;

)

//補充以下代碼,將這些學生按成績從高到低排序

for(i=0;i<N-l;i++){

intk=i;

for(intj=k+l;j<N;j++)

if(group[j].score>group[k].score)k=j;

//交換group[k]和group[i]

if(k!=i){

Studenttemp=group[i];

group[i]=group[k];

group[k]=temp;

)

}

//補充以下代碼,打印輸出所有學生的信息

cout?"\n按成績排序后:\n";

cout?setw(15)?"姓名"?setw(15)?"學號"?setw(8)?"成績

"?endl;

for(i=0;i<N;i++){

cout?setw(15)?group[i].name;

cout?setw(15)?group[i].num;

cout?setw(8)?group[i].score?endl;

)

)

3.定義Clock結構體類型(成員包括hour,minute,second),24小時

制,編寫時間設置函數(shù)setclocks時間顯示函數(shù)showclock,并在主

函數(shù)中測試Clock類型的使用。

函數(shù)格式說明:

boolsetclock(Clock&clk,inth,Intm,ints);輸入:elk為待設置的Clock

變量,h、m、s為欲設置的時分秒,需先檢查這些數(shù)據(jù)是否在合理的

范圍內(nèi);輸出:若輸入數(shù)據(jù)合理而設置了時間,返回true,否則返回

falseo

voidshowclock(Clock&clk);輸入:elk為待顯示的時間;輸出:無。

時間顯示格式要求為"時:分:秒”形式。

#include<iostream>

usingnamespacestd;

//定義Clock結構體類型

structClock

(

inthour,minute,second;

);

boolsetclock(Clock&clk,inth,intm,ints);

voidshowclock(constClock&clk);

voidmain()

Clockmytime={10,25,36);

showclock(mytime);

ints,f,m;

cout<<"請輸入想設置的時間(按時分秒順序):";

cin?s?f?m;

if(setclock(mytime,s,f,m))

showclock(mytime);

else

cout<<"時間設置失敗!\n";

)

boolsetclock(Clock&clk,inth,intm,ints)

{

if(h>=0&&h<=24&&m>0&&m<=60&&s>=0&&s<=60){

clk.hour=h;

clk.minute=m;

clk.second=s;

returntrue;

)

elsereturnfalse;

)

voidshowclock(constClock&clk)

(

cout?clk.hour?":"?clk.minute?":,,?clk.second?encll;

)

1.在ppt課件10-12頁上Person類的定義基礎上,添加setage及

getname成員函數(shù),并在主函數(shù)中測試。

#include<iostream>

usingnamespacestd;

classPerson

(

public:

intgrow(int);

voidsay(char*);

voidshow_info();

boolset_age(int);

intget_age();

boolset_name(char[]);

constchar*get_name();

private:

charname[10];

intage;

);

intPerson::grow(intn)

{age+=n;

returnage;}

voidPerson::say(char*str)

(

cout?name?"said:"?str?endl;

)

voidPerson::show_info()

(~

cout?"Name:"?name?endl;

cout?"Age:"?age?endl;

)

boolPerson::set_age(intn)

(一

if(n>=0&&n<=150)

{

age=n;

returntrue;

)

else

returnfalse;

)

intPerson::get_age()

(一

returnage;

)

boolPerson::set_name(charnm[])

(

if(strlen(nm)<10)

(

strcpy(nameznm);

returntrue;

)

else

returnfalse;

)

constchar*Person::get_name()

returnname;

)

voidmain()

(

Personzhang,wang,psn=zhang;

Person*psnp=&wang;

zhang.set_name("zhangsan");

wang.set_name("wangwu");

zhang.set_age(30);

psnp->set_age(28);

cout?zhang.get_name()?",

cout?zhang.get_age()?endl;

cout?psnp->get_name()?",

cout?psnp->get_age()?endl;

zhang.grow(3);

zhang.show_info();

wang.grow(8);

wang.show_info();

)"

2.設計和實現(xiàn)Clock時鐘類(成員變量包括hour,minute,second)成

員函數(shù)包括時間設置函數(shù)setclock、時間顯示函數(shù)showclock和增加

時間函數(shù)time_add),并在主函數(shù)中測試Clock類和對象的使用。

#include<iostream>

usingnamespacestd;

//定義Clock類

classClock

(

public:

boolsetclock(int,int,int);

voidshowclock();

booltime_add(int,int,int);

private:

inthour,minute,second;

);

voidmain()

Clockmytime;〃創(chuàng)建Clock對象mytime

mytime.showclock();〃顯示時間

mytime.setclock(16,25,28);//設置時間

mytime.showclock();//顯示時間

mytime.time_add(10,45,58);//增加時間

mytime.showclock();//顯示時間

)

boolClock::setclock(inth,intm,ints)

(

if(h>=0&&h<=24&&m>=0&&m<=60&&s>=0&&s<=60){

hour=h;

minute=m;

second=s;

returntrue;

}

elsereturnfalse;

)

voidClock::showclock()

(

cout?"ltis"?hour?":"?minute?":"?second?"now.\n";

)

boolClock::time_add(inth,intm,ints)

(

if(h>=0&&h<=24&&m>=0&&m<=60&&s>=0&&s<=60){

intsl=s+second,ml=m+minute,hl=h+hour;//計算增加后

的時分秒的原值

intcarry=s3/5O;//計算秒到分的進位carry

second=sl%60,minute=(ml+carry)%60;//計算秒和分

carry=(ml+carry)/50;//計算分到小時的進位carry

hour=(hl+carry)%24;//計算小時(24進制)

returntrue;

)

elsereturnfalse;

)

在上面實驗程序的基礎上,為Clock時鐘類添加構造函數(shù)Clock(inth=0,

intm=0,ints=0),并在主函數(shù)中測試Clock類和對象的使用。

#include<iostream>

usingnamespacestd;

//定義Clock類

classClock

(

public:

Clock(inth=0,intm=0,ints=0)

{

hour=minute=second=0;

if(h>=0&&h<=24&&m>=0&&m<=60&&s>=0&&s<=60){

hour=h;

minute=m;

second=s;

}

)

boolsetclock(int,int,int);

voidshowclock();

booltime_add(int,int,int);

private:

inthour,minute,second;

};

voidmain()

(

Clocktl(16,25,28),t2(10,30);//創(chuàng)建Clock對象tl,t2

Clockt3(22),t4;//創(chuàng)建Clock對象t3,t4

tl.showclock();//顯示tl的時間

t2.showclock();//顯示t2的時間

t3.showclock();//顯示t3的時間

t4.showclock();//顯示t4的時間

}

boolClock::setclock(inth,intm,ints)

(

if(h>=0&&h<=24&&m>=0&&m<=60&&s>=0&&s<=60){

hour=h;

minute=m;

second=s;

returntrue;

)

elsereturnfalse;

)

voidClock::showclock()

(

cout?"ltis"?hour?":"?minute?":"?seconcl?"now.\n";

)

boolClock::time_add(inth,intm,ints)

(-

if(h>=0&&h<=24&&m>=0&&m<=60&&s>=0&&s<=60){

intsl=s+second,ml=m+minute,hl=h+hour;〃計算增加后

的時分秒的原值

intcarry=sl/50;//計算秒到分的進位carry

second=sl%60,minute=(ml+carry)%60;//計算秒和分

carry=(ml+carry)/50;//計算分到小時的進位carry

hour=(hl+carry)%24;//計算小時(24進制)

returntrue;

)

elsereturnfalse;

)

構造函數(shù)與析構函數(shù)

1、請設計一個立方體類Box,它能計算并輸出立方體的體積和表面

積。

提示:Box的成員變量包括長、寬、高;Box的成員函數(shù)包括構造函

數(shù)、體積計算顯示函數(shù)、表面積計算顯示函數(shù)。

#include<iostream>

usingnamespacestd;

//定義Box類

classBox

(

public:

Box(doublech=l,doublek=l,doubleg=l)

(

chang=kuan=gao=l;

if(ch>0)chang=ch;

if(k>0)kuan=k;

if(g>0)gao=g;

)

doubleshow_tiji();

doubleshow_biaomianji();

private:

doublechang,kuan,gao;

};

voidmain()

(

Boxbl(10.3,22.16,25.8),b2(30,12.5),b3(8.37),b4;

bl.show_tiji(),bl.show_biaomianji();

b2.show_tiji(),b2.show_biaomianji();

b3.show_tiji(),b3.show_biaomianji();

b4.show_tiji(),b4.show_biaomianji();

}~

doubleBox::show_tiji()

(一

doublev=chang*kuan*gao;

cout<<"立方體的體積="

?chang?"*"?kuan?"*"?gao

?"="?v?endl;

returnv;

)

doubleBox::show_biaomianji()

(一

doubles=(chang*kuan+kuan*gao+chang*gao)*2;

cout<<"立方體的表面積=("

?chang?"*"?kuan?"+"?kuan?"*"?gao

?,,+"?chang?"*"?gao?")*2="?s?endl;

returns;

拷貝構造函數(shù)

1.請設計和實現(xiàn)圖書類Book(成員變量包括書名,作者,出版社,價

格,成員函數(shù)包括構造函數(shù)(默認情況下將各名稱設為空字符串、價

格設為0)、析構函數(shù)、拷貝構造函數(shù)、書名設置函數(shù)set_name、作

者名設置函數(shù)set_author、出版社名稱設置函數(shù)sejpress、價格設置

函數(shù)set_price、信息打印輸出函數(shù)showjnfo。并在以下主函數(shù)中測

試該類而對象的使用。

voidmain()

(

Bookbl("C++程序設計”,“楊長興”,“中國鐵道出版社”,29.00),

b2(“數(shù)據(jù)結構”);

Bookb3(b2);

b2.set_author("葉核亞");

b3.set_price(28.80);

bl.show_info();

b2.show_info();

b3.show_info();

)一

答案:

#include<iostream>

usingnamespacestd;

classBook

(

public:

Book(charbname[]=""/charaname[]=""/charpname[]=""/double

prc=0)

(

if(strlen(bname)<51)strcpy(book_name,bname);

elsestrcpy(book_name,"");

if(strlen(aname)<31)strcpy(author_name,aname);

elsestrcpy(author_name,

if(strlen(pname)<51)strcpy(press_name,pname);

elsestrcpy(press_name,"");

if(prc>0)price=prc;

elseprice=0;

cout?book_name?"============Constructor

==================\n";

)

Book(constBook&bk)

strcpy(book_name,bk.book_name);

strcpy(author_name,bk.author_name);

strcpy(press_name,bk.press_name);

price=bk.price;

cout?book_name?"============CopyConstructor

============\n";

)

~Book()

{

cout?book_name?"==============Destructor

)

void

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論