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