1. 程式人生 > >使我困擾的幾個C++程式

使我困擾的幾個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;
}