intnum;
cout<<"请输入一个要查找的100以内的整数:
";
cin>>num;
//二分查找法
intlow=0,high=N-1;//查找空间的首尾元素的下标
while(low<=high)
{
intmid=(low+high)/2;//查找空间的中点元素的下标
if(a[mid]==num){
cout<<"找到a["<break;
}
elseif(a[mid]elselow=mid+1;//查找空间缩小一半
}
if(low>high)cout<<"数组中未找到"<10(编程实现:
保存用户输入的12个英文名字,排序后打印出来。
提示:
比较两个名字可以使用字符串比较函数intstrcmp(char*,
char*)。
#include
usingnamespacestd;
voidmain()
{
constintM=12,N=30;
charname[M][N+1];
inti;
cout<<"请输入12个英文名字:
\n";
for(i=0;icin>>name[i];
}
//冒泡排序法
for(i=0;ifor(intj=M-1;j>i;j--)
{
chart[M];//定义一个整型字符串,实现其中介的作用
if(strcmp(name[j],name[j-1])<0)//将值小的元素向前
交换,升序排列strcmp是比较函数,小为负值,等于为0,大于为
正。
{
strcpy(t,name[j]);
strcpy(name[j],name[j-1]);
strcpy(name[j-1],t);
}//字符串的赋值属于数组,不能用等号赋值,要用strcpy
函数,形式如上述所示,后者赋值给前者。
}
//打印升序排列后的数组
cout<<"升序排列后:
\n";
for(i=0;icout<}
11(某学校有12名学生参加100米短跑比赛
,每个运动员号和成绩如下表所示,请按照比
赛成绩排名并输出,要求每一行输出名次,运
动员号和比赛成绩三项数据。
并在之后查找用
户指定的运动员成绩及其名次,例如用户输入
运动员号8,则程序应打印出8号运动员的成
绩及名次。
100米短跑比赛成绩
运动员号成绩(秒)运动员号成绩(秒)
113.6214.9
314.8412.6
512.0613.4
712.7812.5
915.61015.3
1113.41212.7
#include
usingnamespacestd;
voidmain()
{
constintN=12;
double
result[N][2]={{1,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}};//double为双精度数定义
inti,num;
//插入排序法
for(i=1;i{
doublek[2]={result[i][0],result[i][1]};//待插入的一行数据先保存在数组k中
intj=i-1;
while(j>=0&&k[1]{//较大的数据向后移动,升序排列
result[j+1][0]=result[j][0];
result[j+1][1]=result[j][1];
j--;
}
//在插入点后插入数据
result[j+1][0]=k[0];
result[j+1][1]=k[1];
}
cout<<"排序后:
\n";
cout<<"名次\t编号\t成绩\n";
for(i=0;i{
cout<
\t";
cout<cout<}
cout<<"请输入要查找的运动员的编号:
";
cin>>num;
//顺序查找法
for(i=0;i{
if(result[i][0]==num)
{
cout<<"找到:
\n名次\t编号\t成绩\n";
cout<
\t";
cout<cout<break;
}
}
if(i>=N)
cout<<"未找到\n";
}
指针的概念和应用
12、假设有int型变量x、y,bool型变量f、g和double型数组a[5]。
按以下要求编写程序:
(a)为x、y、f和g随便赋一个值,请输出各变量的值及其地址。
(b)输出数组a的第一个元素和最后一个元素的地址。
思考:
两个地址之间差多少,为什么,
#include
usingnamespacestd;
voidmain()
{
intx,y;
boolf,g;
doublea[5];
x=10,y=20;
int*xp=&x,*yp=&y;
cout<<"x:
"<<*xp<<'\t'<cout<<"y:
"<<*yp<<'\t'<f=true,g=false;
bool*fp=&f,*gp=&g;
cout<<"f:
"<<*fp<<'\t'<cout<<"g:
"<<*gp<<'\t'<因此元素a[0]与a[4]的地址相差应为4*8Byte,即32Byte。
需注意的是:
显示的地址是一个十六进制数,
所以下面打印出的两个地址应相差0x20。
*/
cout<<"a[0]:
"<<&a[0]<cout<<"a[4]:
"<<&a[4]<13(将字符串常量"pointer"保存在一个字符数组中,打印以下三行内容:
(1)该数组的首地址;
(2)该字符串;(3)请使用指针变量输出该字符串,要求每个字符之间空一个格。
#include
usingnamespacestd;
voidmain()
{
charstr[]="pointer";//定义字符数组str存储该字符串
cout<<(void*)str<cout<char*p=str;//定义字符指针p指向数组中的第一个字符
while(*p){
cout<<*p<<'';//循环打印数组中的每个字符,并以空格间隔
p++;
}
cout<}
14(试用指针实现:
判断一个数组是否是对称的。
如
1,2,3,5,7,7,5,3,2,1,是对称的,而,1,2,3,5,7,5,3,2,1,或,1,2,3,5,7,5,3,都不是对称的。
要求:
数组的元素个数定义为常量N,N的值以及数组各元素的值自定。
#include
usingnamespacestd;
voidmain()
{
constintN=10;
inta[N]={1,2,3,5,7,7,5,3,2,1};
//其他试验值intb[]={1,2,3,5,7,5,3,2,1};intc[]={1,2,3,5,7,5,3};
等等
for(inti=0;icout<cout<if(N%2==0)
{
int*headp=a;//定义首指针,指向数组第一个元素
int*tailp=a+N-1;//定义尾指针,指向数组最后一个元素
while(headp{
if(*headp!
=*tailp)//如果两个指针指向的数不相等
{
cout<<"该数组不对称。
\n";
break;
}
headp++;//首指针增1,即向后移动,指向下一个元素
tailp--;//尾指针减1,即向前移动,指向前一个元素
}
if(headp>=tailp)//如果首指针已大于或等于尾指针
cout<<"该数组对称。
\n";
}
else
cout<<"该数组不对称。
\n";
}
指针与函数的应用
15(试编写一个实现三位正整数数字拆分功能的函数ChaiFen,其函数原型如下:
boolChaiFen(intn,int&n2,int&n1,int&n0);
要求:
函数检查参数n是否是正数,若是则进行拆分,并将百、十、个位分别保存在引用型参数n2、n1和n0中,函数返回true表示拆分成功;否则不进行拆分,函数返回false。
编写主函数,调用上述函数将用户输入的任意正整数进行拆分后显示。
#include
usingnamespacestd;
boolChaiFen(int,int&,int&,int&);
voidmain()
{
intx,bai,shi,ge;
cout<<"请输入任意一个三位正整数:
";
cin>>x;
if(x>=100&&x<1000&&ChaiFen(x,bai,shi,ge))//调用函数,形参n2,n1,n0将分别引用实参bai,shi,ge
{
cout<<}
else
cout<<"输入数据不合法。
\n";
}
boolChaiFen(intn,int&n2,int&n1,int&n0)//函数定义,n2,n1,n0声明为引用型参数
{
if(n<=0)
returnfalse;
n2=n/100;//百位保存在n2中,也即保存在main函数中的变量bai中
n1=n%100/10;//十位保存在n1中,也即保存在main函数中的变量shi中
n0=n%10;//个位保存在n0中,也即保存在main函数中的变量ge中
returntrue;
}//这里的拆分函数是文章后自己定义编写的前文只是提及引用。
16(试编写函数ChaZhao实现数组元素查找的功能。
若找到,返回其地址;否则,返回空指针NULL。
正确定义上述函数,使其功能可以在下面的主函数中得到测试。
voidmain()
{
constintN=12;
inta[N]={15,96,46,53,58,52,10,35,66,16,63,50};
intk1=30,k2=58;
int*p1=ChaZhao(a,N,k1),*p2=C