C++程序设计谭浩强第三版 第六章习题第十题问题
原书中的题目和答案如下
- 要求用指针或引用方法处理:
将一个5 * 5的矩阵中最大的元素放在中心,4个角分别放4个最小的元素(顺序为从左到右,从上到下顺序依次从小到大存放),写一函数实现之。用main函数调用。
#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];
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++){
for(j=0;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;
for(i=0;i<5;i++){
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++){
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++){
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;
}
- 运行结果并没有达到题目的要求(最大放中间 左上角放最小)
输入样例:
input matrix:
35 34 33 32 31
30 29 28 27 26
25 24 11 22 21
20 19 18 17 16
15 14 13 12 23
实际输出却结果为:
Now,matrix:
35 34 33 32 11
30 29 28 27 26
25 24 31 22 21
20 19 18 17 16
12 14 23 15 13
问题出在了change函数里的第一次交换
void change(int *p){
int i,j,temp;
int *pmax,*pmin;
pmax=p;
pmin=p;
for(i=0;i<5;i++){
for(j=0;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); //如果pmin正好在最中间==p+12 此次交换结束后
*(p+12)=*pmax; //pmin原本指向的最小值已经被pmax换走
*pmax=temp;
if(pmin==p+12) pmin=pmax; //这个是关键 思路与本章习题第三题相同
temp=*p;
*p=*pmin;
*pmin=temp;
pmin=p+1;
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(i==0&&j==0) continue;
if(*pmin>*(p+5*i+j)) pmin=p+5*i+j;
}
}
修改后能运行出正确结果
input matrix:
35 34 33 32 31
30 29 28 27 26
25 24 11 22 21
20 19 18 17 16
15 14 13 12 23
Now,matrix:
11 34 33 32 12
30 29 28 27 26
25 24 35 22 21
20 19 18 17 16
13 23 15 31 14
以下附上本章习题第三题:
- 要求用指针或引用方法处理:输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。写3个函数:
(1) 输入10个数;
(2)进入处理;
(3)输出10个数。
#include <iostream>
using namespace std;
int main()
{
int number[10];
void input(int *number);
void max_min_number(int *number);
void output(int *number);
input(number); // 输入10个数的函数
max_min_number(number); // 调用交换函数
output(number); // 调用输出函数
return 0;
}
void input(int *number)
{
int i;
cout<<"input 10 numbers:";
for (i=0;i<10;i++)
cin >> number[i];
}
void max_min_number(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;
if(max==number) max=min; //如果第一个数刚好是最大数,则使max指向该最大数
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;
}