C++程序設計譚浩強 第六章(指針)習題答案(部分有改進)

6.1輸入3個整數,按由小到大的順序輸出

#include <iostream>
using namespace std;
int main()
 {void swap(int *p1,int *p2);
  int n1,n2,n3;
  int *p1,*p2,*p3;
  cout<<"input three integers n1,n2,n3:";
  cin>>n1>>n2>>n3;
  p1=&n1;
  p2=&n2;
  p3=&n3;
  if(n1>n2) swap(p1,p2);
  if(n1>n3) swap(p1,p3);
  if(n2>n3) swap(p2,p3);
  cout<<"Now,the order is:"<<n1<<" "<<n2<<" "<<n3<<endl;
  return 0;
 }

 void swap(int *p1,int *p2)
  {int p;
   p=*p1; *p1=*p2; *p2=p;
  }

6.2輸入3個字符串,按由小到大順序輸出

#include <iostream>
#include <cstring>
using namespace std;
int main()
 {void swap(char *,char *);
  char str1[20],str2[20],str3[20];
  cout<<"input three line:"<<endl;
  gets(str1);
  gets(str2);
  gets(str3);
  if(strcmp(str1,str2)>0)  swap(str1,str2);
  if(strcmp(str1,str3)>0)  swap(str1,str3);
  if(strcmp(str2,str3)>0)  swap(str2,str3);
  cout<<endl<<"Now,the order is:"<<endl;
  cout<<str1<<endl<<str2<<endl<<str3<<endl;
  return 0;
 }
 void swap(char *p1,char *p2)          /* 交換兩個字符串 */
 {char p[20];
  strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p);
 }
#include <iostream>
#include <string>
using namespace std;
int main()
 {void change(string &,string &);
  string str1="                 ",
	     str2="                 ",
		 str3="                 ";
  char *p1=&str1[0],*p2=&str2[0],*p3=&str3[0];
  cout<<"input three line:"<<endl;
  gets(p1);
  gets(p2);
  gets(p3);
  if(str1>str2)change(str1,str2);
  if(str1>str3)change(str1,str3);
  if(str2>str3)change(str2,str3);
  cout<<endl<<"Now,the order is:"<<endl;
  cout<<str1<<endl<<str2<<endl<<str3<<endl;
  return 0;
 }
 void change(string &st1,string &st2)          /* 交換兩個字符串 */
 {string st;
  st=st1;st1=st2;st2=st;
 }

6.3輸入10個整數,將最小的數與第一個數對換,把最大的數與最後一個數對換。寫三個函數

#include <iostream>
using namespace std;
int main()
 { void input(int *number); 
   void max_min_value(int *number);  
   void output(int *number);
   int number[10];
   input(number);                           // 調用輸入10個數的函數 
   max_min_value(number);                   // 調用交換函數 
   output(number);                          // 調用輸出函數 
   return 0;
}

 void input(int *number)                 // 輸入10個數的函數 
 {int i;
  cout<<"input 10 numbers:";
  for (i=0;i<10;i++)
    cin>>number[i];
  }

 void max_min_value(int *number)            // 交換函數 
 { int *max,*min,*p,temp;
   max=min=number;
   for (p=number+1;p<number+10;p++)
     if (*p>*max) max=p;                 // 將大數地址賦給 max  
     else if (*p<*min) min=p;            // 將小數地址賦給 min  
     temp=number[0];number[0]=*min;*min=temp;  // 將最小數與第一數交換 
     temp=number[9];number[9]=*max;*max=temp;  // 將最小數與第一數交換 
  }

void output(int *number)                  // 輸出函數 
  {int *p;
   cout<<"now,they are:    ";
   for (p=number;p<number+10;p++)
     cout<<*p<<" ";
   cout<<endl;
   return;
   }

6.4有n個整數,使前面各數順序向後移m個位置,最後m個數變成最前面m個數。

#include <iostream>
using namespace std;
int main()
 {void move(int *array,int n,int m);
  int number[20],n,m,i; 
  cout<<"how many numbers?";               // 詢問共有多少個數 
  cin>>n;
  cout<<"input "<<n<<" numbers:"<<endl;    // 要求輸入n個數 
  for (i=0;i<n;i++)
    cin>>number[i];
  cout<<"how many places do you want move?";  // 詢問後移多少個位置
  cin>>m;
  move(number,n,m);                       //調用move 函數 
  cout<<"Now,they are:"<<endl;
  for (i=0;i<n;i++)
    cout<<number[i]<<" ";
  cout<<endl;
  return 0;
}

void move(int *array,int n,int m)             //使循環後移一次的函數
 {int *p,array_end;
  array_end=*(array+n-1);
  for (p=array+n-1;p>array;p--)
    *p=*(p-1);
  *array=array_end;
  m--;
  if (m>0) move(array,n,m); //遞歸調用,當循環次數m減至爲0時,停止調用 
 }

6.5有n個人圍成一圈,順序排號。從第一個人開始報數,反報到3的人退出圈子,最後留下的人原來排在第幾號。

#include <iostream>
using namespace std;
#define max 15
int main()
 {
	int i,k,m,n,num[max],*p;
	cout<<"input number of person: n="<<endl;
	cin>>n;
	p=num;
	for(i=0;i<n;i++)   //以1~n爲序給每個人編號
		*(p+i)=i+1;  
	i=0;  //每次循環計數變量
	k=0;  //按123報數時的計數變量
	m=0;  //退出人數
	while (m<n-1)  //退出人數比n-1少(即未退出人數>1)
	{
		if (*(p+i)!=0)
			k++;
		if(k==3)
		{
			cout<<*(p+i)<<"   "<<endl;//輸出out的人編號
			*(p+i)=0;  //出圈人設爲0  
			m++;   //圈外人+1
			k=0;   //重新開始報數
		}
		i++;  //向下移一位
		if (i==n)   //指針到最後一位時 重新賦值
			i=0;
	}

//	while(*p==0) 
//		p++;
	for (i=0;i<n;i++)
		if(*(p+i)!=0)
	cout <<"the last one is NO."<<*(p+i)<<endl;
	return 0;
}

6.6寫一函數,求字符串長度

#include <iostream>
using namespace std;
int main()
 {int length(char *p);
  int len;
  char str[20];
  cout<<"input string:";
  cin>>str;
  len=length(str);
  cout<<"The length of string is "<<len<<endl;
  return 0;
}
int length(char *p)            //求字符串長度的函數
{int n;
 n=0;
 while (*p!='\0')
  {n++;
   p++;
  }
 return(n);
}

6.7有一字符串,包含n個字符。寫一函數,將此字符串中從第m個字符開始的全部字符複製成爲另一個字符串

#include <iostream>
using namespace std;
int main()
 {void copystr(char *,char *,int);
  int m;
  char str1[20],str2[20];
  cout<<"input string:";
  gets(str1);
  cout<<"which character do you want begin to copy?";
  cin>>m;
  if (strlen(str1)<m)
    cout<<"input error!"<<endl;
  else
   {copystr(str1,str2,m);
    cout<<"result:"<<str2<<endl;
   }
  return 0;
}
/*字符串部分複製函數*/
void copystr(char *p1,char *p2,int m)
{int n;
 n=0;
 while (n<m-1)
  {n++;
   p1++;
  }
 while (*p1!='\0')
   {*p2=*p1;
    p1++;
    p2++;
   }
 *p2='\0';
}

6.8輸入一行文字,找出其中大寫字母小寫字母空格數字其他字符各有多少

#include <iostream>
using namespace std;
int main()
{int upper=0,lower=0,digit=0,space=0,other=0,i=0;
char *p,s[20];
cout<<"input string:";
while ((s[i]=getchar())!='\n') i++;
p=&s[0];
while (*p!='\n')
  {if (('A'<=*p) && (*p<='Z'))
     ++upper;
   else if (('a'<=*p) && (*p<='z'))
     ++lower;
   else if (*p==' ')
     ++space;
   else if ((*p<='9') && (*p>='0'))
     ++digit;
   else
     ++other;
   p++;
  }
cout<<"upper case:"<<upper<<endl<<"lower case:"<<lower<<endl;
cout<<"space:"<<space<<endl<<"digit:"<<digit<<endl<<"other:"<<other<<endl;
return 0;
}

6.9     3*3整型矩陣轉置 (函數)

#include <iostream>
using namespace std;
int main()
{void move(int *);
 int a[3][3],*p,i;
 cout<<"input matrix:"<<endl;
 for (i=0;i<3;i++)
   cin>>a[i][0]>>a[i][1]>>a[i][2];
 p=&a[0][0];
 move(p);
 cout<<"Now,matrix:"<<endl;
 for (i=0;i<3;i++)
   cout<<a[i][0]<<" "<<a[i][1]<<" "<<a[i][2]<<endl;
 cout<<endl;
 return 0;
}

 void move(int *pointer)
  {int i,j,t;
   for (i=0;i<3;i++)
     for (j=i;j<3;j++)
       {t=*(pointer+3*i+j);
        *(pointer+3*i+j)=*(pointer+3*j+i);
        *(pointer+3*j+i)=t;
	 }
 }

6.10 將一個5*5矩陣中最大的元素放在中心,四個角分別放四個最小號的元素(依次)

#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;
  //找最大值和最小值的地址,並賦給 pmax,pmin
  for (i=0;i<5;i++) 
    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  (((p+5*i+j)!=p) && (*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(((p+5*i+j)!=(p+4)) && ((p+5*i+j)!=p) &&(*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 (((p+5*i+j)!=p) &&((p+5*i+j)!=(p+4)) && ((p+5*i+j)!=(p+20)) && (*pmin>*(p+5*i+j)))
        	 pmin=p+5*i+j;
  temp=*pmin;   //將第四最小值與右下角元素互換
  *pmin=*(p+24);
  *(p+24)=temp;
  } 

6.11 在主函數中輸入10個等長字符串,用另一函數排序。在主函數中輸出

#include <iostream>
using namespace std;
int main()
{void sort(char (*p)[6]);
 int i;
 char str[10][6];
 char (*p)[6];
 cout<<"input 10 strings:"<<endl;
 for (i=0;i<10;i++)
   cin>>str[i];
 p=str;
 sort(p);
 cout<<"Now,the sequence is:"<<endl;
 for (i=0;i<10;i++)
   cout<<str[i]<<endl;
 return 0;
}

void sort(char (*s)[6])
{int i,j;
 char temp[6],*t=temp;
 for (i=0;i<9;i++)
   for (j=0;j<9-i;j++)
     if (strcmp(s[j],s[j+1])>0)
      {strcpy(t,s[j]);
       strcpy(s[j],s[+j+1]);
       strcpy(s[j+1],t);
      }
}
#include <iostream>
#include <string>
using namespace std;
int main()
{void sort(string *);
 int i;
 string str[10],*p=str;
 cout<<"input 10 strings:"<<endl;
 for (i=0;i<10;i++)
   cin>>str[i];
 sort(p);
 cout<<"Now,the sequence is:"<<endl;
 for (i=0;i<10;i++)
   cout<<str[i]<<endl;
 return 0;
}

void sort(string *s)
{int i,j;
 string temp;
 for (i=0;i<9;i++)
   for (j=0;j<9-i;j++)
     if (s[j]>s[j+1])
      {temp=s[j];
       s[j]=s[+j+1];
       s[j+1]=temp;
      }
}

6.12 字符串不等長

#include <iostream>
using namespace std;
int main()
{void sort(char *[]);
 int i;
 char *p[10],str[10][20];
 for (i=0;i<10;i++)
   p[i]=str[i];        //將第i個字符串的首地址賦予指針數組p的第i個元素
 cout<<"input 10 strings:"<<endl;
 for (i=0;i<10;i++)
   cin>>p[i];
 sort(p);
 cout<<"Now,the sequence is:"<<endl;
 for (i=0;i<10;i++)
   cout<<p[i]<<endl;
 return 0;
}

void sort(char *s[])
{int i,j;
 char *temp;
 for (i=0;i<9;i++)
   for (j=0;j<9-i;j++)
     if (strcmp(*(s+j),*(s+j+1))>0)
       {temp=*(s+j);
        *(s+j)=*(s+j+1);
        *(s+j+1)=temp;
       }
}

6.13 用矩形法求定積分的通用函數

#include <iostream>
#include <cmath>
using namespace std;
int main()
{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 n=20;
 cout<<"input a1,b1:"; //輸入求sin(x)定積分的下限和上限 
 cin>>a1>>b1;          
 cout<<"input a2,b2:"; //輸入求cos(x)定積分的下限和上限 
 cin>>a2>>b2;
 cout<<"input a3,b3:"; //輸入求  e^x 定積分的下限和上限
 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;
  }
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.14將n個數按輸入時逆序排列

#include <iostream>
using namespace std;
int main()
{ void sort (char *p,int m);
  int i,n;
  char *p,num[20];
  cout<<"input n:";
  cin>>n;
  cout<<"please input these numbers:"<<endl;
  for (i=0;i<n;i++)
   cin>>num[i];
  p=&num[0];
  sort(p,n);
  cout<<"Now,the sequence is:"<<endl;
  for (i=0;i<n;i++)
    cout<<num[i]<<" ";
  cout<<endl;
  return 0;
 }

 void sort (char *p,int m)// 將n個數逆序排列 
 {int i;
  char temp, *p1,*p2;
  for (i=0;i<m/2;i++)
  {p1=p+i;
   p2=p+(m-1-i);
   temp=*p1;
   *p1=*p2;
   *p2=temp;
  }
 }

6.15 有一個班4個學生,5門課。

       求第一門課的平均分

       找出兩門以上課程不及格的學生,輸出學號全部成績平均成績

       找出平均成績在90以上或全部成績85以上的學生

#include <iostream>
using namespace std;
int main()
{void avsco(float *,float *);
 void avcour1(char (*)[10],float *);
 void fail2(char course[5][10],int num[],float *pscore,float aver[4]);
 void good(char course[5][10],int num[4],float *pscore,float aver[4]);
 int i,j,*pnum,num[4];
 float score[4][5],aver[4],*pscore,*paver;
 char course[5][10],(*pcourse)[10];
 cout<<"input course:"<<endl;
 pcourse=course;
 for (i=0;i<5;i++)
   cin>>course[i];
 cout<<"input NO. and scores:"<<endl;
 cout<<"NO.";
 for (i=0;i<5;i++)
   cout<<","<<course[i];
 cout<<endl;
 pscore=&score[0][0];
 pnum=&num[0];
 for (i=0;i<4;i++)
 {cin>>*(pnum+i);
  for (j=0;j<5;j++)
    cin>>*(pscore+5*i+j);
 }
 paver=&aver[0];
 cout<<endl<<endl;              
 avsco(pscore,paver);  // 求出每個學生的平均成績 
 avcour1(pcourse,pscore);  // 求出第一門課的平均成績 
 cout<<endl<<endl;
 fail2(pcourse,pnum,pscore,paver);  // 找出兩門課不及格的學生 
 cout<<endl<<endl;
 good(pcourse,pnum,pscore,paver); // 找出成績好的學生 
 return 0;
}

// 求每個學生的平均成績
void avsco(float *pscore,float *paver)   
 {int i,j;
  float sum,average;
  for (i=0;i<4;i++)
   {sum=0.0;
    for (j=0;j<5;j++)
      sum=sum+(*(pscore+5*i+j)); //累計每個學生的各科成績
    average=sum/5;  //計算平均成績
    *(paver+i)=average;
   }
}

// 求第一課程的平均成績
void avcour1(char (*pcourse)[10],float *pscore)  
 {int i;
  float sum,average1;
  sum=0.0;
  for (i=0;i<4;i++)
    sum=sum+(*(pscore+5*i));  //累計每個學生的得分
  average1=sum/4;   //計算平均成績
  cout<<"course 1: "<<*pcourse<<",average score:"<<average1<<endl;
}
// 找兩門以上課程不及格的學生的函數 
void fail2(char course[5][10],int num[],float *pscore,float aver[4])  
 {int i,j,k,labe1;
  cout<<"   ==========Student who failed in two courses =======  "<<endl;
  cout<<"NO.   ";
  for (i=0;i<5;i++)
    cout<<course[i]<<"  ";
  cout<<"  average"<<endl;
  for (i=0;i<4;i++)
  {labe1=0;
   for (j=0;j<5;j++)
     if (*(pscore+5*i+j)<60.0) labe1++;
   if (labe1>=2)
    {cout<<num[i]<<"      ";
     for (k=0;k<5;k++)
       cout<<*(pscore+5*i+k)<<"      ";
     cout<<"    "<<aver[i]<<endl;
    }
  }
}

// 找成績優秀學生(全部課程成績在85分以上或平均成績在90分以上)的函數 
void good(char course[5][10],int num[4],float *pscore,float aver[4])
 {int i,j,k,n;
  cout<<"    ======Students whose score is good======"<<endl;
  cout<<"NO.   ";
  for (i=0;i<5;i++)
    cout<<course[i]<<"  ";
  cout<<"  average"<<endl;
  for (i=0;i<4;i++)
   {n=0;
    for (j=0;j<5;j++)
      if (*(pscore+5*i+j)>85.0) n++;
    if ((n==5)||(aver[i]>=90))
     {cout<<num[i]<<"      ";
      for (k=0;k<5;k++)
        cout<<*(pscore+5*i+k)<<"      ";
      cout<<"    "<<aver[i]<<endl;
     }
 }
}

6.16 輸入一個字符串,將其中連續的數字作爲一個整數,依次存放到數組a中,統計共有多少個整數,並輸出這些數

#include <iostream>
using namespace std;
int main()
{char str[50],*pstr;
 int i,j,k,m,e10,digit,ndigit,a[10],*pa;
 cout<<"input a string:"<<endl;
gets(str);
cout<<endl;
pstr=&str[0];    //字符指針pstr指向數組str首元素 
pa=&a[0];        //指針pa指向a數組首元素
ndigit=0;        //ndigit代表有多少個整數 
i=0;             //i代表字符串中的第幾個字符 
j=0;             //j代表連續數字的位數 
while(*(pstr+i)!='\0')
 {if((*(pstr+i)>='0') && (*(pstr+i)<='9'))
    j++;
  else
   {if (j>0)
     {digit=*(pstr+i-1)-48;  //將個數位賦予digit
      k=1;
      while (k<j)     //將含有兩位以上數的其它位的數值累計於digit
       {e10=1;
        for (m=1;m<=k;m++)
        e10=e10*10;      //e10代表該位數所應乘的因子
        digit=digit+(*(pstr+i-1-k)-48)*e10;  //將該位數的數值累加於digit
        k++;     //位數k自增
       }
      *pa=digit;  //將數值放在數組a中
      ndigit++;
      pa++;    //指針pa指向a數組下一元素
      j=0;
     }
   }
  i++;
 }
 if (j>0)   //以數字結尾字符串的最後一個數據
  {digit=*(pstr+i-1)-48;  //將個數位賦予digit
   k=1;
   while (k<j)   // 將含有兩位以上數的其它位的數值累加於digit
    {e10=1;
     for (m=1;m<=k;m++)
       e10=e10*10;  //e10代表位數所應乘的因子
     digit=digit+(*(pstr+i-1-k)-48)*e10;  //將該位數的數值累加於digit
     k++;  /*位數K自增*/
    }
   *pa=digit;   //將數值放到數組a中
   ndigit++;
   j=0;
  }
  printf("There are %d numbers in this line. They are:\n",ndigit);
  j=0;
  pa=&a[0];
  for (j=0;j<ndigit;j++)  //打印數據
    cout<<*(pa+j)<<endl;
  cout<<endl;
  return 0;
}

6.17 實現兩個字符串的比較

#include <iostream>
using namespace std;
int main()
{int strcmp(char *p1,char *p2);
 int m;
 char str1[20],str2[20],*p1,*p2;
 cout<<"input two strings:"<<endl;
 cin>>str1;
 cin>>str2;
 p1=&str1[0];
 p2=&str2[0];
 m=strcmp(p1,p2);
 cout<<"result:"<<m<<endl;
 return 0;
}

int strcmp(char *p1,char *p2) // 字符串比較函數 
{int i;
 i=0;
 while(*(p1+i)==*(p2+i))
   if (*(p1+i++)=='\0') return(0); //全部字符相同時返回結果0 
 return(*(p1+i)-*(p2+i)); //不相同時返回結果爲第一對不相同字符的ASCII碼的差值 
} 

6.18 輸入月份號,輸出英文月名,用指針數組處理

#include <iostream>
using namespace std;
int main()
{char *month_name[13]={"illegal month","January",
"February","March","April","May","June","July","August",
"September","October", "November","December"};
int n;
cout<<"input month:"<<endl;
cin>>n;
if (((n>=1) && n<=12))
   cout<<"It is "<<*(month_name+n)<<endl;
else
  cout<<"It is wrong"<<endl;
return 0;
} 

6.19 用指向指針的指針的方法對5個字符串排序並輸出

#include <iostream>
using namespace std;
            
int main()
{void sort(char **p);
 const int m=20;        //定義字符串的最大長度
 int i;
 char **p,*pstr[5],str[5][m];
 for (i=0;i<5;i++)
   /*將第i個字符串的首地址賦予指針數組 pstr 的第i個元素*/
   pstr[i]=str[i];   
 cout<<"input 5 strings:"<<endl;
 for (i=0;i<5;i++)
    cin>>pstr[i];
 p=pstr;
 sort(p);
 cout<<"strings sorted:"<<endl;
 for (i=0;i<5;i++)
    cout<<pstr[i]<<endl;
 return 0;
}

void sort(char **p) //冒泡法對5個字符串排序函數
{int i,j;
 char *temp;
 for (i=0;i<5;i++)
  {for (j=i+1;j<5;j++)
    {if (strcmp(*(p+i),*(p+j))>0) //比較後交換字符串地址
      {temp=*(p+i);
       *(p+i)=*(p+j);
       *(p+j)=temp;
      }
     }
  }
} 

6.20用指向指針的指針的方法對n個整數排序並輸出(排序單獨寫成函數)

#include <iostream>
using namespace std;
int main()
{void sort(int **p,int n);
 int i,n,data[10],**p,*pstr[10];
 cout<<"input n:";
 cin>>n;
 for (i=0;i<n;i++)
   /*將第i個整數的地址賦予指針數組 pstr 的第i個元素*/
   pstr[i]=&data[i];   
 cout<<"input "<<n<<" integer numbers:"<<endl;
 for (i=0;i<n;i++)
   cin>>*pstr[i];
 p=pstr;
 sort(p,n);
 cout<<"Now,the sequence is:"<<endl;
 for (i=0;i<n;i++)
   cout<<*pstr[i]<<"  ";
 cout<<endl;
 return 0;
}

void sort(int **p,int n)
{int i,j,*temp;
 for (i=0;i<n-1;i++)
  {for (j=i+1;j<n;j++)
     {if (**(p+i)>**(p+j)) //比較後交換整數地址
       {temp=*(p+i);
        *(p+i)=*(p+j);
        *(p+j)=temp; 
       }
     }
  }
} 

int *p :一級指針,表示p所指向的地址裏面存放的是一個int類型的值
int **p :二級指針,表示p所指向的地址裏面存放的是一個指向int類型的指針(即p指向的地址裏面存放的是一個指向int的一級指針)
例如:
int i=10;               //定義了一個整型變量
int *p=&i;             //定義了一個指針指向這個變量
int **p1=&p;        //定義了一個二級指針指向p指針
那麼取出10的值方式爲:
printf(“i=[%d]\n”,*p);
printf(“i=[%d]\n”,**p1);


就突然開始 學不會     覺得很充實

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章