1.有9月数按从大到小的顺序放在一个数组中,输入一个数,要求用折半查找法求出该数是数组中第几个元素的值。如果该数不在数组中,则打印出“无此数”。
程序代码为:
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int num;
int a[9]={99,87,78,72,69,60,53,43,21};
cout<<"请输入一个整数:"<<endl;
cin>>num;
for(int i=0;i<9;i++)
if(num==a[i])
break;
if(i==9)
cout<<"该数不存在!!"<<endl;
int begin=0,end=8,mid;
mid=(begin+end)/2;
while(begin<=mid)
{
if(num==a[mid])
{
cout<<num<<"是该数组的第"<<mid+1<<"个元素。"<<endl;
break;
}
else if(num>a[mid])
{
begin=mid;
mid=(begin+end)/2;
}
else
{
end=mid;
mid=(begin+end)/2;
}
}
return 0;
}
2.输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写3个函数:1>输入10个数;2>进行处理;3>输出10个数。
程序代码为:
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
#define N 10
void Get(int *a)//输入10个数字
{
int *p;
cout<<"请输入10个整数:"<<endl;
for(p=a;p<a+10;p++)
cin>>*p;
}
void exchange(int *a)//进行处理
{
int max=*a,min=*a;//将a[0]的值赋给max和min
int *pt,temp;
for(pt=a;pt<a+10;pt++)//找到数组中的最大值和最小值
{
if(*pt>max)
max=*pt;
else if(*pt<min)
min=*pt;
}
pt=a;//pt重新指向数组首地址
temp=min;//将最小的数和第一个数交换
min=*pt;
*pt=temp;
temp=max;
max=*(pt+9);
*(pt+9)=temp;
}
void print(int *a)
{
int *pt;
cout<<"排列后的10个数位:"<<endl;
for(pt=a;pt<a+10;pt++)
cout<<*pt<<" ";
cout<<endl;
}
int main()
{
int a[N];
Get(a);
exchange(a);
print(a);
return 0;
}
3.将一个5*5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(按从左到右,从上到下顺序依次从小到大存放),写一函数实现之。用main函数调用。
程序代码为:
方法一:
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
#define N 5
void exchange(int *a)
{
int *pmax,*pmin,temp,*pt;
int i,j;
pmax=a;//对最大值指针和最小值指针赋值
pmin=a;
pt=a;
for(i=0;i<N;i++)//利用循环找到矩阵的最大值和最小值
for(j=0;j<N;j++)
{
if(*(pt+i*5+j)>*pmax)
pmax=pt+i*5+j;
if(*(pt+i*5+j)<*pmin)
pmin=pt+i*5+j;
}
//将最大值放在中心
temp=*pmax;
*pmax=*(pt+2*5+2);
*(pt+2*5+2)=temp;
//将最小值放在左上角
temp=*pmin;
*pmin=*pt;
*pt=temp;
pmin=pt+1;//对指针赋初始值
for(i=0;i<N;i++)//找第二小的元素
for(j=0;j<N;j++)
if((*(pt+i*5+j)<*pmin) && (pt+5*i+j!=pt))
pmin=pt+5*i+j;
//将第二小元素放在右上方
temp=*pmin;
*pmin=*(pt+4);
*(pt+4)=temp;
pmin=pt+1;
for(i=0;i<N;i++)//找第三小的元素
for(j=0;j<N;j++)
if((*(pt+i*5+j)<*pmin) && ((*pt+5*i+j)!=*pt) && (*(pt+i*5+j)!=*
(pt+4)))
pmin=pt+5*i+j;
//将第三小元素放在左下方
temp=*pmin;
*pmin=*(pt+4*5);
*(pt+4*5)=temp;
pmin=pt+1;
for(i=0;i<N;i++)//找第四小的元素
for(j=0;j<N;j++)
if((*(pt+i*5+j)<*pmin) && ((*pt+5*i+j)!=*pt) && (*(pt+i*5+j)!=*
(pt+4)) && (*(pt+i*5+j)!=*(pt+4*5)))
pmin=pt+5*i+j;
//将第四小元素放在右下方
temp=*pmin;
*pmin=*(pt+4*5+4);
*(pt+4*5+4)=temp;
}
int main()
{
int i,j;
int a[N][N],*pt=&a[0][0];
for(i=0;i<N;i++)
for(j=0;j<N;j++)
cin>>*(pt+i*5+j);
exchange(&a[0][0]);
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
方法二:
#include <iostream>
using namespace std;
int main()
{void change(int *p);
int a[5][5],*p,i,j;
cout<<"input matrix:"<<endl;
for (i=0;i<5;i++) //输入矩阵
for (j=0;j<5;j++)
cin>>a[i][j];
p=&a[0][0]; //使p指向0行0列元素
change(p); //调用函数,实现交换
cout<<"Now,matrix:"<<endl;
for (i=0;i<5;i++) //输出已交换的矩阵
{for (j=0;j<5;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}
void change(int *p) //交换函数
{int i,j,temp;
int *pmax,*pmin;
pmax=p;
pmin=p;
for (i=0;i<5;i++) //找最大值和最小值的地址,并赋给 pmax,pmin
for (j=i;j<5;j++)
{if (*pmax<*(p+5*i+j)) pmax=p+5*i+j;
if (*pmin>*(p+5*i+j)) pmin=p+5*i+j;
}
temp=*(p+12); //将最大值与中心元素互换
*(p+12)=*pmax;
*pmax=temp;
temp=*p; //将最小值与左上角元素互换
*p=*pmin;
*pmin=temp;
pmin=p+1;
//将a[0][1]的地址赋给pmin,从该位置开始找最小的元素
for (i=0;i<5;i++) //找第二最小值的地址赋给 pmin
for (j=0;j<5;j++)
{if(i==0 && j==0) continue;
if (*pmin > *(p+5*i+j)) pmin=p+5*i+j;
}
temp=*pmin; //将第二最小值与右上角元素互换
*pmin=*(p+4);
*(p+4)=temp;
pmin=p+1;
for (i=0;i<5;i++) //找第三最小值的地址赋给pmin
for (j=0;j<5;j++)
{if((i==0 && j==0) ||(i==0 && j==4)) continue;
if(*pmin>*(p+5*i+j)) pmin=p+5*i+j;
}
temp=*pmin; // 将第三最小值与左下角元素互换
*pmin=*(p+20);
*(p+20)=temp;
pmin=p+1;
for (i=0;i<5;i++) // 找第四最小值的地址赋给pmin
for (j=0;j<5;j++)
{if ((i==0 && j==0) ||(i==0 && j==4)||(i==4 && j==0)) continue;
if (*pmin>*(p+5*i+j)) pmin=p+5*i+j;
}
temp=*pmin; //将第四最小值与右下角元素互换
*pmin=*(p+24);
*(p+24)=temp;
}
字符数组与字符串string在比较和赋值方面的不同。
4.输入一个字符串,内有数字和非数字字符,如:a123x456*17960?302tab5876将其中连续的数字作为一个整数,依次存放到一数组a中。例如,123放在a[0]中,456放在a[1]中……统计共有多少个整数,并输出这些数。
程序代码为:
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int main()
{
char s1[20];
int a[10],i=0;
int j=0;//记录连续的数字有多少位
int ndigit=0;//记录整数的个数
int digit;//记录整数的大小
int *pa;//整数数组的指针
char *pstr;//字符串的指针
int e10;//整数的因子,如十位为10,百位为100
cout<<"请输入一个字符串:";
gets(s1);
pstr=s1;
pa=a;
while(*(pstr+i)!='\0')
{
if(*(pstr+i)>='0' && *(pstr+i)<='9')//如果字符为数字,则记录数字的位数
j++;
else//字符串中出现非数字字符,且数字个数>0
{
if(j>0)
{
digit=0;//整数个位,48为数字0的ASCII
for(int k=0;k<j;k++)//计算整数digit
{
e10=1;
for(int m=1;m<=k;m++)
e10=e10*10;
digit+=(*(pstr+i-1-k)-48)*e10;
}
*pa=digit;
pa++;//数组a的指针后移
j=0;
ndigit++;
}
}
i++;
}
if(j>0)//如果字符串以数字结束
{
digit=0;//整数个位,48为数字0的ASCII
for(int k=0;k<j;k++)//计算整数digit
{
e10=1;
for(int m=1;m<=k;m++)
e10=e10*10;
digit+=(*(pstr+i-1-k)-48)*e10;
}
*pa=digit;
j=0;
ndigit++;
}
cout<<"共有"<<ndigit<<"个整数,分别为:"<<endl;
pa=a;
for(int p=0;p<ndigit;p++)
cout<<*(pa+p)<<" ";
cout<<endl;
return 0;
}
5.写一个用矩阵法求定积分的通用函数,分别求sinx在[0,1]区间的定积分,cosx在[0,1]区间的定积分,e^x在[0,1]区间的定积分(说明:sin,cos,e^x已在系统的数学函数库中,程序开头要用#include<cmatn>)。
程序代码为:
#include <iostream>
#include <cmath>
using namespace std;
float integral(float (*p)(float),float a,float b,int n);
float a1,b1,a2,b2,a3,b3,c,(*p)(float);
float fsin(float); // 对fsin函数作声明
float fcos(float); // 对fcos函数作声明
float fexp(float); // 对fexp函数作声明
int main()
{
int n=20;
cout<<"input a1,b1:"; //输入求sin(x) 定积分的下限和上限
cin>>a1>>b1;
cout<<"input a2,b2:"; // 输入求cos(x) 定积分的下限和上限
cin>>a2>>b2;
cout<<"input a3,b3:"; // 输入求#include <iostream>
cin>>a3>>b3;
p=fsin;
c=integral(p,a1,b1,n); // 求出sin(x)的定积分
cout<<"The integral of sin(x) is :"<<c<<endl;
p=fcos;
c=integral(p,a2,b2,n); // 求出cos(x)的 定积分
cout<<"The integral of cos(x) is :"<<c<<endl;;
p=fexp;
c=integral(p,a3,b3,n); // 求出 的定积分
cout<<"The integral of exp(x) is :"<<c<<endl;
return 0;
}
float integral(float (*p)(float),float a,float b,int n)
//用矩形法求定积分的通用函数
{
int i;
float x,h,s;
h=(b-a)/n;//对应的小矩阵
x=a;
s=0;
for (i=1;i<=n;i++)
{
x=x+h;
s=s+(*p)(x)*h;//(*p)(x)代表相应的函数
}
return(s);
}
float fsin(float x) // 计算sin(x) 的函数
{
return sin(x);
}
float fcos(float x) // 计算cos(x) 的函数
{
return cos(x);
}
float fexp(float x) // 计算exp(x)的函数
{
return exp(x);
}
6.有n个人围成一圈,顺序排号。从第1个人开始报数(从1~3报数),凡报到3的人退出圈子,问最后留下的人原来排在第几号?
程序代码为:
#include<iostream>
#include<cmath>
using namespace std;
#define N 10
int main()
{
int i,a[N];
int j=0;//用j记录报数的人数
int k=0;//记录指针的移动
int count=0;//记录退出圈子的人数
int *pt=a;
for(i=0;i<N;i++)
a[i]=i+1;
while(count<N)
{
if(a[k]!=0)
j++;
if(j==3)
{
cout<<a[k]<<" ";
a[k]=0;
count++;
j=0;
}
k++;
if(k>=9)
k=0;
}
cout<<endl;
return 0;
}