数组的概念课件_第1页
数组的概念课件_第2页
数组的概念课件_第3页
数组的概念课件_第4页
数组的概念课件_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数组的概念

1.定义一个长度为4的数组,

用于存储用户输入的4个数。

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

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

#include<iostream>

usingnamespacestd;

voidmain()

(

doublea[4];

coukv"请输入4个数字:

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的整型数组

,其元素由随机数发生器随机产生,

并将该数组按照逆序打印出来。

#include<iostream>

#include<ctime>

usingnamespacestd;

voidmain()

(

constintN=12;

srand(time(O));

inta[N];

cout<〈"原数组:\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;

}

数组的应用

1.使用一个数组存储一年中各月的天数

,试回答用户某年某月的天数。

例:假设用户输入的年数为2012,

月数为2,则程序应输出29。

要求:先编写一个判断闰年的函数,

输入:一个正整数(年份);输出:真

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

函数中使用该函数来判断闰年。

#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<<”月的天数是:"«j[month]«endl;

)

else

cout<<''输入数据不合法!\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;

)

字符数组的应用

1.编程实现:将michaeljackson的名字

保存在字符数组name中,并将其中两个单

词的首字符改为大写后打印出来?

#include<iostream>

usingnamespacestd;

voidmain()

charname[]="michaeljackson";

cout«name«endl;

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

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

cout«name«endl;

2.将字符数组strl中下标为单号的元素

值赋给另一个字符数组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编程实现:由用户输入一些字符,之后

求出其中英文字母、数字及其他字符各占多少百分比?

提示:假设输入的字符不超过80个。

相关函数说明:

inttoupper(int):将一个小写字母转

换为大写字母。输入:一个小写字母

;输出:对应的大写字母。

intisalpha(int):判断一个字符是否

是英文字母。输入:一个字符;输出:

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

intisdigit(int):判断一个字符是否是十

进制数字字符。输入:一个字符;输出

:真(是个数字字符)或假(不是个数字字符)。

#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.编程实现:保存用户输入的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;

)

)

数组的综合应用

L使用随机数发生器产生50个

不超过100的正整数,保存在数组

中,打印原始数组及降序排列后的数组

o并在数组中查找某个由用户指定的整数

,若找到则打印出其下标,否则打印“未找到”。

要求:打印数组时按横向制表位列对

齐的方式(数据以‘\t'间隔),每行10个数。

#include<iostream>

#include<ctime>

usingnamespacestd;

voidmain()

constintN=50;

inta[N];

int\,j;

srand(time(NULL));

coukv"原始数组:\n";

for(i=0;i<N;i++)//产生并打印原始数组

(

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<<"降序排列后的数组:\n";

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

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

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

)

cout«endl;

intnum;

cout<<"请输入一个要查找的100以内的整数:

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<<"数组中未找到"vvnumvvendl;

)

2.编程实现:保存用户输入的12个英文名字,排序后打印出来。

提示:比较两个名字可以使用字符串比较函数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);

)

}

//打印升序排列后的数组

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

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

cout«name[i]«endl;

3.某学校有12名学生参加100米短跑比赛

,每个运动员号和成绩如下表所示,请按照比

赛成绩排名并输出,要求每一行输出名次,运

动员号和比赛成绩三项数据。并在之后查找用

户指定的运动员成绩及其名次,例如用户输入

运动员号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]};//待插入的一行数据

先保存在数组k中

intj=i-l;

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

{//较大的数据向后移动,升序排列

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

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

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型数组a[5]。

按以下要求编写程序:

(a)为x、y、f和g随便赋一个值,请输出各变量的值及其地址。

(b)输出数组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型数据需要8Byte空间,

因此元素与的地址相差应为即

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

需注意的是:显示的地址是一个十六进制数,

所以下面打印出的两个地址应相差0x20。*/

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

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

)

2.将字符串常量"pointer"保存在一个字符数组中,打印以下三行内

容:(1)该数组的首地址;(2)该字符串;(3)请使用指针变量输出

该字符串,要求每个字符之间空一个格。

#include<iostream>

usingnamespacestd;

voidmain()

(

charstr[]="pointer";//定义字符数组str存储该字符串

cout«(void*)str«endl;//打印输出数组的首地址

cout«str«endl;//打印输出字符串

char*p=str;//定义字符指针p指向数组中的第一个字符

while(*p){

cout«*p«'//循环打印数组中的每个字符,并以空格间

P++;

}

cout«endl;

)

3.试用指针实现:判断一个数组是否是对称的。如{1,2,3,5,7,7,5,3,2,1}

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

要求:数组的元素个数定义为常量N,N的值以及数组各元素的值自

定。

#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++)//打印数组所有元素

cout«a[i]«"

cout«endl;

if(N%2==0)

(

int*headp=a;//定义首指针,指向数组第一个元素

int*tailp=a+N-l;//定义尾指针,指向数组最后一个元素

while(headp<tailp)

(

if(*headp!=*tailp)//如果两个指针指向的数不相等

(

cout<<"该数组不对称。\n";

break;

)

headp++;//首指针增1,即向后移动,指向下一个元素

tailp-;//尾指针减1,即向前移动,指向前一个元素

}

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

cout<<"该数组对称。\n";

)

else

cout<<"该数组不对称。\n";

}

指针与函数的应用

1.试编写一个实现三位正整数数字拆分功能的函数ChaiFen,其函数

原型如下:

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

要求:函数检查参数n是否是正数,若是则进行拆分,并将百、十、

个位分别保存在引用型参数n2、nl和nO中,函数返回true表示拆

分成功;否则不进行拆分,函数返回false。

用写主函数,调用上述函数将用户输入的任意正整数进行拆分后显

Zj\o

#include<iostream>

usingnamespacestd;

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

voidmain()

(

intx,bai,shi,ge;

cout<<''请输入任意一个三位正整数:

cln»x;

if(x>=100&&x<1000&&ChaiFen(x,bai,shi,ge))//调用函数,形参

n2,nl,nO将分别引用实参bai,shi,ge

(

coutvvxvv"拆分显示为"

«bai«""«shi«""«ge«endl;

)

else

coukv"输入数据不合法。\n";

)

boolChaiFen(intn,int&n2,int&nl,int&n0)//函数定义,n2,nl,

nO声明为引用型参数

(

if(n<=0)

returnfalse;

n2=n/100;//百位保存在n2中,也即保存在main函数中的变

量bai中

nl=n%100/10;〃十位保存在nl中,也即保存在main函数中

的变量shi中

n0=n%10;//个位保存在nO中,也即保存在main函数中的变

量ge中

returntrue;

2.试编写函数ChaZha。实现数组元素查找的功能。若找到,返回其

地址;否则,返回空指针NULL。

正确定义上述函数,使其功能可以在下面的主函数中得到测试。

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语句返回该

元素的地址并结束函数

returnNULL;〃未找到,return语句返回空指针NULL并结束函

)

指针的综合应用

1.输入一行英文单词,假定单词由一个或多个空格隔开,统计有几

个单词。

要求:假设输入的字符数不超过80个,将该值保存在常量N中。

提示:输入有空格的字符串可使用cin对象的成员函数getline。

调用方法:cin.getline(str,n);

功能:读入用户输入的一行不超过n个的字符(可以有空格),并存

放在字符数组str中。

#include<iostream>

usingnamespacestd;

voidmain()

(

constintN=80;

charstr[N+l];

cout<<"请输入单词加空格构成的字符串:";

cin.getline(strzN);

char*p=str;〃指针p先指向第一个字符

intk=0;〃单词数开始为0

while(*p){〃当p指向的不是结束符'\0'时继续循环

while(*p=='')p++;〃当p指向的是空格时,p向后移动,循

环,直到p指向的不是空格

if(*p=='\O')break;〃如果p指向的是结束符,停止循环

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

束符时,p向后移动,循环,直到p指向的是空格或结束符*/

k++;〃单词数增加一个

)

coukv"共有单词个\n";

)

/*参考解答2:

#include<iostream>

usingnamespacestd;

voidmain()

(

constintN=80;

charstr[N+l];

cout<<"请输入单词加空格构成的字符串:,

cin.getline(str,N);

char*p=str;〃指针p先指向第一个字符

intk=0;〃单词数开始为0

while(*p){〃当p指向的不是结束符'\0'时继续循环

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

而下一个字符是空格,则单词数增加一个

P++;

)

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

后一个字符)不是空格,则单词数增加一个

cout<<"共有单词""kvv"个\n";

)*/

2.试编程实现,重排一个偶数长度的数值数组,即将其后半部分元

素依次插入前半部分元素之间。例如,假设一个长度为8的数组,其

元素记为0~7,则重排后的顺序应为{0,4,1,5,2,6,3,7}。

要求:定义常量N作为数组的长度,数组的元素由随机数发生器产

生,不超过50,可带一位小数。

编写如下函数:

voidinit_array(double*a,intn),功能:产生数组的每个元素。输

入:待填云的数组a,数组的长度n。输出:无。

voidprint_array(double*a,intn),功能:打印数组,元素之间以空

格间隔。待打印的数组a,数组的长度n。输出:无。

voidrearrange_array(double*a,intn),功能:重排数组的元素。输

入:待重排的数组a,数组的长度n,其中n必须为正偶数。输出:

无。

并在以下主函数中调用上述函数,实现重排数组元素的功能。(若缺

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

#include<iostream>

usingnamespacestd;

voidmain()

(

constintN=24;

doublea[N];

init_array(a,N);//初始化数组

coukv"原始数组:\n";

print_array(a,N);〃打印原始数组

rearrange_array(a,N);〃重排数组

cout«"重排后的数组:\n";

print_array(a,N);//打印重排后的数组

)

答案:

#include<iostream>

#include<ctime>

usingnamespacestd;

voidinit_array(double*,int);//数组初始化函数的声明语句

voidrearrange_array(double*,int);//数组重排函数的声明语句

voidprint_array(double*,int);//数组打印输出函数的声明语句

voidmain()

(

constintN=24;

doublea[N];

init_array(a,N);//初始化数组

cout<<"原始数组:\n";

print_array(a,N);//打印原始数组

rearrange_array(a,N);〃重排数组

coukv"重排后的数组:\n";

print_array(a,N);//打印重排后的数组

)

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«"数组元素个数非偶数,无法重排!\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];

)

/*数组重排函数的另一种方案

voidrearrange_array(double*a,intn)

(一

if(n%2){

coukv"数组元素个数非偶数,无法重排!\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.试编写程序,将用户输入的一个十进制正整数转化为十六进制输

出。

提示:将十进制数转换为N进制数可采用“除N取余法”。可参看课

件上的分析。

#include<iostream>

usingnamespacestd;

intmain()

(

constintN=16;

inta,b,n,i=0;

cout<<''请输入要转换的整数:

cin»a;

b=a;//将原始值保存在另一变量b中,以备后面再次使用

while(a){//计算转换成的N进制数的位数

a/=N;

i++;

)

n=i;//十进制数a可以转换成n位N进制数

int*p=newint[n];//分配n个整数空间用来存放转换成的进

制数的各个位

if(p){//如果动态内存分配成功则进行如下转换

a=b;//将原始值再次保存在变量a中

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

p[i]=a%N;//用“除N取余法”求余数,并保存在数组

a/=N;//将a缩小N倍

)

for(i=n-l;i>=0;i-){//打印输出转换后的各个位,顺序与上

面存储的顺序相反

if(p[i]<10)//10以内的直接输出

cout«p[i];

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

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

}

cout«endl;

)

else{//内存分配不成功

coukv"动态内存分配失败!\n";

)

return0;

4.(选做)N个小孩围成一圈做游戏,1~N顺序编号,从第一个人开

始从1到D(k=D<=N)报数,报到D的人退出圈子,循环进行,问最

后留下的人是最初编号为多少的人。

试编写函数模拟该过程,函数参数为人数N与报数值D,返回值为最

后人的编号。并编写主函数测试该函数的功能。

提示:动态分配N个内存空间,存放小孩最初的编号。

//解法1:利用数组和指针实现

#include<iostream>

usingnamespacestd;

intmain()

(

intN;

intD;

cout<<''请输入参加游戏的人数:",cin»N;

cout<<"请输入报数的值:",cin»D;

int*a=newint[N+l];

if(!a){

cout<<"内存不足!\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:利用链表实现

#include<iostream>

usingnamespacestd;

structnode{

intn;

node*next;

);

intmain()

(

intN;

intD;

cout<<"请输入参加游戏的人数:",cin»N;

cout<<"请输入报数的值:",cin»D;

node*head=newnode;

if(head==NULL){

coukv"内帝分配失败!\n";

return-1;

}

head->n=l;

node*np=head;

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

np->next=newnode;

if(np->next==NULL){

cout<〈"内存分配失败!\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、

年龄和工资收入。并编写主函数,存储并输出男雇员王杰的信息,

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课件),数组group存储

了5个学生的信息,试用随机数发生器产生这些人的成绩(100以内

的整数),并按成绩从高到低的顺序输出他们的信息(一人一行,各

项信息按列对齐)。请补充以下代码完成上述功能。

//补充以下代码,包含所需头文件

〃补充以下代码,定义Student结构体类型

//主函数

voidmain()

(

constintN=5;

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

"11010502031"},

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

{"Alex","11010502025"}};

//补充以下代码,产生并保存每个学生的成绩

//补充以下代码,将这些学生按成绩从高到低排序

//补充以下代码,打印输出所有学生的信息

//补充以下代码,包含所需头文件

#include<iostream>

#include<iomanip>

#include<ctime>

usingnamespacestd;

〃补充以下代码,定义Student结构体类型

structStudent

(

charname[31];

charnum[12];

intscore;

);

//主函数

voidmain()

(

constintN=5;

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

"11010502031"},

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

"11010502012"},

{"Alex","11010502025"}};

//补充以下代码,产生并保存每个学生的成绩

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小时

制,编写时间设置函数setclocks时间显示函数showclock,并在主

函数中测试Clock类型的使用。

函数格式说明:

boolsetclock(Clock&clk,inth,Intm,ints);输入:elk为待设置的Clock

变量,h、m、s为欲设置的时分秒,需先检查这些数据是否在合理的

范围内;输出:若输入数据合理而设置了时间,返回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成员函数,并在主函数中测试。

#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.设计和实现Clock时钟类(成员变量包括hour,minute,second)成

员函数包括时间设置函数setclock、时间显示函数showclock和增加

时间函数time_add),并在主函数中测试Clock类和对象的使用。

#include<iostream>

usingnamespacestd;

//定义Clock类

classClock

(

public:

boolsetclock(int,int,int);

voidshowclock();

booltime_add(int,int,int);

private:

inthour,minute,second;

);

voidmain()

Clockmytime;〃创建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时钟类添加构造函数Clock(inth=0,

intm=0,ints=0),并在主函数中测试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);//创建Clock对象tl,t2

Clockt3(22),t4;//创建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;

)

构造函数与析构函数

1、请设计一个立方体类Box,它能计算并输出立方体的体积和表面

积。

提示:Box的成员变量包括长、宽、高;Box的成员函数包括构造函

数、体积计算显示函数、表面积计算显示函数。

#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;

拷贝构造函数

1.请设计和实现图书类Book(成员变量包括书名,作者,出版社,价

格,成员函数包括构造函数(默认情况下将各名称设为空字符串、价

格设为0)、析构函数、拷贝构造函数、书名设置函数set_name、作

者名设置函数set_author、出版社名称设置函数sejpress、价格设置

函数set_price、信息打印输出函数showjnfo。并在以下主函数中测

试该类而对象的使用。

voidmain()

(

Bookbl("C++程序设计”,“杨长兴”,“中国铁道出版社”,29.00),

b2(“数据结构”);

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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论