使我困扰的几个C++程序

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

 
 
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值