用函数指针,数组指针和二维数组完成数据表的输入输出问题
问题描述:
工作生活中常常需要处理一些数据,小到个人的日常开支,大到公司的整体运营,为了使数据处理的效率更高,操作更加方便,常常使用各式各样的数据表来存储这些数据。例如使用一张表格记录全班学生成绩,针对该表格,可以执行基于行的操作,求出某个学生的总成绩,也可以执行基于列的操作,求得某个科目的成绩,进而得出本班学生某科目的平均分。
思路分析:
- 创建一个二维数组
- 定义一个函数指针,通过它调用输入函数,传入二维数组的首地址,从而实现数据表的输入
- 通过数组指针循环输出数据表的元素
- 定义另外一个数组指针,利用分支结构选择将行求和函数或将列求和函数的存储空间首地址赋给这个数组指针
- 通过第二个数组指针调用行或列函数,并输出求和结果
代码明细:
#include<stdio.h>
int scan(int (*s)[5],int n); //定义输入函数scan;
void sumbyrow(int (*arr)[5],int row,int *sum); //定义行求和函数sumbyrow;
void sumbycol(int (*arr)[5],int col,int *sum); //定义列求和函数sumbycol;
int main()
{
int datetable[5][5]; //定义数据表datetable;
int n;
printf("请输入行数\n");
scanf("%d",&n);
int (*x)(int (*)[5],int ); //定义函数指针;
x=scan; //把函数scan的数据存储空间的入口赋给函数指针x;
(*x)(datetable,n); //通过函数指针调用scan函数;
int (*p)[5]=datetable; //定义数组指针p,并把datatable[5][5]的第一个元素的地址付给p;
printf("输出数据表\n");
for( int i=0;i<5;i++)
{ for(int j=0;j<5;j++)
printf("%d ",*(*(p+i)+j)); //利用数组指针实现对数据表的输出;
printf("\n");}
int select,pos,sum;
void(*q)(int (*)[5],int ,int *); //定义函数指针q;
printf("请输入求和方式(行1,列2)\n");
input: //goto函数的标志;
scanf("%d",&select);
if(select==1) //如果输入的值为1,把sumbyrow函数的首地址赋给q;
{
q=sumbyrow;
}
else if(select==2) //如果输入的值为2,把sumbyrow函数的首地址赋给q;
{
q=sumbycol;
}
else //如果都不满足,使用goto语句跳转到标记所在语句,实现重新输入;
{
printf("错误,请重新输入\n");
goto input;
}
printf("请输入行数或列数 :\n");
scanf("%d",&pos);
(*q)(datetable,pos,&sum); //通过函数指针q调用sumbyrow/sumbycol函数;
return 0;
}
void sumbyrow(int (*arr)[5],int row,int *sum) //sumbyrow函数定义;
{
*sum=0;
for(int i=0;i<5;i++)
*sum=*sum+(*(*(arr+row-1)+i));
printf("第%d 行的和为%d\n",row,*sum);
}
void sumbycol(int (*arr)[5],int col,int *sum) //sumbycol函数定义;
{
*sum=0;
for(int j=0;j<5;j++)
*sum=*sum+(*(*(arr+j)+col-1));
printf("第%d 列的和为%d\n",col,*sum);
}
int scan(int (*s)[5],int n) //scan函数定义;
{
for(int i=0;i<n;i++)
for(int j=0;j<5;j++)
scanf("%d",*(s+i)+j);
return 0;
}
运行结果: