#include<stdio.h>
#define SIZE_X 3
#define SIZE_Y 3
struct point_2d
{
int x;
int y;
};
struct Image
{
int data_[SIZE_Y][SIZE_X];
int size_x_;
int size_y_;
int default_value_;
void(*image_)(Image*,int);
void(*set_value)(Image*,point_2d,int);
int(*get_value)(Image*,point_2d);
void(*image_print)(Image*);
};
void image(Image* img,int default_value);
void set_value(Image* img,point_2d pt,int value);
int get_value(Image* img,point_2d pt);
void image_print(Image* img);
int main(){
Image img{};
img.image_=image;
img.image_(&img,0);
img.image_print(&img);
img.set_value(&img,point_2d{2,1},1);
img.image_print(&img);
printf("(%d,%d)= %d\n",2,1, img.get_value(&img,point_2d{2,1}));
}
void set_value(Image* img,point_2d pt,int value){
if(pt.x>img->size_x_||pt.x<0||pt.y>img->size_y_||pt.y<0){
printf("pt error!\n");
return;
}
img->data_[pt.y][pt.x]=value;
}
/*!
*
* @param img 你的描述
* @param pt 你的描述
* @return 你的描述
* @note 你的描述
*/
int get_value(Image* img,point_2d pt)
{
if(pt.x>img->size_x_||pt.x<0||pt.y>img->size_y_||pt.y<0)
{
printf("pt error!\n");
return -1;
}
return img->data_[pt.y][pt.x];
}
void image_print(Image* img)
{
printf("size_x = %d,size_y = %d \n",img->size_x_,img->size_y_);
printf("data is: \n");
for (int y=0;y<img->size_y_;y++)
{
for(int x=0;x<img->size_x_;x++)
printf(" %d", get_value(img,point_2d{x,y}));
printf("\n");
}
printf("\n");
}
void image(Image* img,int default_value)
{
img->default_value_=default_value;
img->size_y_=sizeof(img->data_)/sizeof(img->data_[0]);
img->size_x_=sizeof(img->data_[0])/sizeof(img->data_[0][0]);
img->get_value=get_value;
img->set_value=set_value;
img->image_print=image_print;
for (int y=0;y<img->size_y_;y++)
for(int x=0;x<img->size_x_;x++)
img->set_value(img,point_2d{x,y},img->default_value_);
}
函数功能注释如下:
#include<stdio.h>
#define SIZE_X 3
#define SIZE_Y 3
struct point_2d
{
int x;
int y;
};
struct Image
{
int data_[SIZE_Y][SIZE_X];
int size_x_;
int size_y_;
int default_value_;
//这部分都是函数指针
void (*image_)(Image*, int);
void (*set_value)(Image*, point_2d, int);
int(*get_value)(Image*, point_2d);
void(*image_print)(Image*);
};
//声明函数
void image(Image* img, int default_value);
void set_value(Image* img, point_2d pt, int value);
int get_value(Image* img, point_2d pt);
void image_print(Image* img);
int main() {
Image img{};//声明Image类型的img实例
img.image_ = image; //设置img实例的函数指针
img.image_(&img, 0); //相当于image(&img,0);初始化img实例
img.image_print(&img);//打印img图像的值
img.set_value(&img, point_2d{ 2,1 }, 1); //设置img图像在点(2,1)处的值为1
img.image_print(&img); //打印img图像的值
printf("(%d,%d)= %d\n", 2, 1, img.get_value(&img, point_2d{ 2,1 }));
}
/*!
*
@param img 需要操作的图像指针
@param pt 需要修改数据的点坐标
@param value 点上需要更新的数据
@return 无
@note 将img图像上点pt位置的值更改为value
*/
void set_value(Image* img, point_2d pt, int value) {
//判断点pt的坐标是否在img图像范围内,如果不在,退出
if (pt.x > img->size_x_ || pt.x<0 || pt.y>img->size_y_ || pt.y < 0) {
printf("pt error!\n");
return;
}
img->data_[pt.y][pt.x] = value; //将img图像上点pt位置的值更改为value
}
/*!
*
@param img 需要操作的图像指针
@param pt 需要获取数据的图像上的点坐标
@return img图像上点pt所在的值
@note 获取img图像上点pt处的值
*/
int get_value(Image* img, point_2d pt)
{
//判断点pt的坐标是否在img图像范围内,如果不在,返回-1
if (pt.x > img->size_x_ || pt.x<0 || pt.y>img->size_y_ || pt.y < 0)
{
printf("pt error!\n");
return -1;
}
return img->data_[pt.y][pt.x];//返回img图像上点pt处的值
}
/*!
*
@param img 需要操作的图像指针
@return 无
@note 显示整个图像的值
*/
void image_print(Image* img)
{
printf("size_x = %d,size_y = %d \n", img->size_x_, img->size_y_);
printf("data is: \n");
//双层for循环遍历img图像
for (int y = 0; y < img->size_y_; y++)
{
for (int x = 0; x < img->size_x_; x++)
printf(" %d", get_value(img, point_2d{ x,y }));
printf("\n");
}
printf("\n");
}
/*!
*
@param img 图像指针
@param default_value 默认大熊啊
@return 无
@note 初始化图像实例
*/
void image(Image* img, int default_value)
{
//用img初始化Image的各元素
img->default_value_ = default_value;
img->size_y_ = sizeof(img->data_) / sizeof(img->data_[0]);
img->size_x_ = sizeof(img->data_[0]) / sizeof(img->data_[0][0]);
img->get_value = get_value;
img->set_value = set_value;
img->image_print = image_print;
//双层for循环赋值
for (int y = 0; y < img->size_y_; y++)
for (int x = 0; x < img->size_x_; x++)
img->set_value(img, point_2d{ x,y }, img->default_value_);
}
注释如下:
#include<stdio.h>
#define SIZE_X 3
#define SIZE_Y 3
//定义一个坐标点位结构体
struct point_2d
{
int x;
int y;
};
//定义图像结构体
struct Image
{
int data_[SIZE_Y][SIZE_X];
int size_x_;
int size_y_;
int default_value_;
void(*image_)(Image*,int);
void(*set_value)(Image*,point_2d,int);
int(*get_value)(Image*,point_2d);
void(*image_print)(Image*);
};
//函数声明部分(函数实现在main方法下面,需要在main方法上面声明)
void image(Image* img,int default_value);
void set_value(Image* img,point_2d pt,int value);
int get_value(Image* img,point_2d pt);
void image_print(Image* img);
int main(){
//定义Image的实例对象
Image img{};
//初始化img对象中的image属性为函数指针
img.image_=image;
//调用void(*image_)(Image*,int); 方法
img.image_(&img,0);
// 调用 void(*image_print)(Image*);方法
img.image_print(&img);
//调用 void(*set_value)(Image*,point_2d,int);方法
img.set_value(&img,point_2d{2,1},1);
// 调用 void(*image_print)(Image*);方法
img.image_print(&img);
//输出当前image的坐标点位
printf("(%d,%d)= %d\n",2,1, img.get_value(&img,point_2d{2,1}));
}
/*!
*
* @param img 参数为图像指针对象
* @param pt 点位对象
* @param value int类型的值
* @note 给图像上pt点位设置value值,如果pt点位不在图像点位范围内,则输出“pt error“
*/
void set_value(Image* img,point_2d pt,int value){
//判断当前 点位x的是否大于图像对应x的值,当前点位y是否大于图像对应y的值
//目的是用来判断当前pt点位坐标是否在图像坐标范围内,如果在则添加到data中。
if(pt.x>img->size_x_||pt.x<0||pt.y>img->size_y_||pt.y<0){
printf("pt error!\n");
return;
}
img->data_[pt.y][pt.x]=value;
}
/*!
*
* @param img 图像指针对象
* @param pt 点位对象
* @return 返回图像上pt点位所对应的值
* @note 得到图像上pt点位对应的值,如果pt点位不在图像点位范围内,则输出“pt error”,并返回-1
*/
int get_value(Image* img,point_2d pt)
{
//目的是用来判断当前pt点位坐标是否在图像坐标范围内,如果不在说明当前pt是异常的点位
if(pt.x>img->size_x_||pt.x<0||pt.y>img->size_y_||pt.y<0)
{
printf("pt error!\n");
return -1;
}
return img->data_[pt.y][pt.x];
}
/*
打印图像上的所有pt点位对应的值
*/
void image_print(Image* img)
{
//输出图像的x、y大小
printf("size_x = %d,size_y = %d \n",img->size_x_,img->size_y_);
printf("data is: \n");
//输出所有的pt点位对应的值
for (int y=0;y<img->size_y_;y++)
{
for(int x=0;x<img->size_x_;x++)
printf(" %d", get_value(img,point_2d{x,y}));
printf("\n");
}
printf("\n");
}
//构造函数,用来初始化img对象
void image(Image* img,int default_value)
{
img->default_value_=default_value;
img->size_y_=sizeof(img->data_)/sizeof(img->data_[0]);
img->size_x_=sizeof(img->data_[0])/sizeof(img->data_[0][0]);
img->get_value=get_value;
img->set_value=set_value;
img->image_print=image_print;
for (int y=0;y<img->size_y_;y++)
for(int x=0;x<img->size_x_;x++)
img->set_value(img,point_2d{x,y},img->default_value_);
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!