第11章实验 指针与数组
- 题目11.3:
从键盘任意输入一个整型表示的月分值,用指针数姐编程输出该月分的英文,表示,若输入的月份值不在1~12之间,则输出“Ilegal month。
1、解题思路:
定义指针一维数组,do while循环,输入月份代表的数组,如果不在1-12,输出Illegel month,若在范围内,指针带出月份字符。
2、源代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p[12]={"January","February","March","April","May","June","July","August","September","October","November","December"};
int m;
do
{
printf("Please input month:");
scanf("%d",&m);
if(m<1||m>12)
printf("Illegel month");
}while(m<1||m>12);
printf("%s",p[m-1]);
return 0;
}
3、程序运行效果截图:
- 题目11.4:
利用例9.6程序中的函数Swap(),分别按如下函数原型编程计算并输出nXn阶矩阵的转置矩阵。其中,n由用户从键盘输入。已知n值不超过10。
void Transpose (int a[][N], int n) ;void Transpose (int (*a)[N], intn) ;void Transpose (int *a,int n);
- 解题思路:
外层函数,用指针交换位置。三种方法,一一进行原型声明。主函数中,定义二维数组,输入阶数,for循环输入数组值。输出原矩阵,printf显示三种选择,switch选择,调用外层函数,输出转置后的矩阵。第一种,数组下表示方法,直接循环交换行与列,调用。第二种,行指针,swap改变指针形势。第三中,列指针,swap,改变指针形势,就可以实现交换。
2、源代码:
#include <stdio.h>
#define N 10
void Swap(int *p1,int *p2);
void Transpose2(int *a,int n);
void Transpose(int a[][N],int n);
void Transpose1(int (*a)[N],int n);
int main()
{
int n,i,j;
int a[N][N];
int m;
do
{
printf("Input 阶数 n: ");
scanf("%d",&n);
}while(n>10);
for(i=0;i<n;i++)
{
printf("输入第 %d 行:\n",i+1);
for(j=0;j<n;j++)
{
printf("输入第 %d 行第 %d 列: ",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
printf("原矩阵:\n");
for(i=0;i<n;i++)
{
printf("\n");
for(j=0;j<n;j++)
{
printf("%d",a[i][j]);
}
}
printf("\n 1.引用数组下表法\n 2.行指针法\n 3.列指针法\n");
printf("Switch:");
scanf("%d",&m);
switch(m)
{
case 1:
Transpose(a,n);
break;
case 2:
Transpose1(a,n);
break;
case 3:
Transpose2(*a,n);
break;
}
printf("转置矩阵是: \n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
return 0;
}
void Swap(int *p1,int *p2)
{
int temp;
temp=*p1;
*p1=*p2;
*p2=temp;
}
void Transpose(int a[][N],int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
Swap(&a[i][j],&a[j][i]);
}
}
}
void Transpose1(int (*a)[N],int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
Swap(*(a+i)+j,*(a+j)+i);
}
}
}
void Transpose2(int *a,int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=i;j<n;j++)
{
Swap(a+i*n+j,a+j*n+i);
}
}
}
3、程序运行效果截图:
- 题目3:
参考习题11.5按如下函数原型编程从键盘输入一个m行n列的二维数组然后计算数组中元素的最大值及其所在的行列下标志。其中m和n的值由用户键盘输入。已知m和n的值都不超过10。
Void InputArray(int *p,int m,int n);
Int FindMax(int *p, int m, int n, int *pRow, int *pCol);
- 解题思路:
指针行位置,列位置,二维数组,定义行列,对二位数组指针进行初始化,输入行列,取一定的内存,若空值,exit结束程序。输入数组,寻找最大值,外层进行原型声明。主函数中调用,输出最大值,行位置,列位置,释放内存。输入数组,for循环。寻找最大值,if判断,指针指向一一比较,返回此值。
2、源代码:
#include <stdio.h>
#include <stdlib.h>
#define N 10
#define M 10
void InputArray(int *p[N][M],int n,int m);
void FindMax(int *p,int n,int m,int *prow,int *pcol);
int main()
{
int m,n,row,col,a;
int *p=NULL;
printf("Input row: ");
scanf("%d",&n);
printf("Input col: ");
scanf("%d",&m);
p=(int *)calloc(n*m,sizeof(int));
if(*p=NULL)
{
printf("error \n");
exit(1);
}
InputArray(p,n,m);
FindMax(p,n,m,&row,&col);
free(p);
}
void InputArray(int *p[N][M],int n,int m)
{
int i,j;
for(i=0;i<n;i++)
{
printf("输入第 %d 行:\n",i+1);
for(j=0;j<m;j++)
{
printf("输入第 %d 行第 %d 列: ",(i+1),(j+1));
scanf("%d",p++);
}
}
}
void FindMax(int *p,int n,int m,int *prow,int *pcol)
{
int c,d;
int *a=p;
for(c=0;c<n;c++)
{
for(d=0;d<m;d++)
{
if(*p < *(a+c*m+d))
{
p=(a+c*m+d);
*prow=c;
*pcol=d;
}
}
}
printf("Max = %d, row = %d, col = %d",*p,c-1,d-1);
}
3、程序运行效果截图:
- MOOC网课程测试结果:
- 测试1:
六、实验心得与总结:
对于本章的学习,感觉比上章轻松,通过做的题,对指针的学习更为深刻,熟悉,掌握。