[英]graphical editor with c program (programming challenges 110105)
Photoshop 等图形编辑器允许我们以与文本编辑器允许我们修改文档相同的方式修改位图图像。 图像表示为 M x N 像素阵列,其中每个像素具有给定的颜色。
您的任务是编写一个程序来模拟一个简单的交互式图形编辑器。
输入
输入由一系列编辑器命令组成,每行一个。 每个命令由一个大写字母表示,作为该行的第一个字符。 如果命令需要参数,它们将在以空格分隔的同一行中给出。
像素坐标由两个整数表示,列号介于 1...M 之间,行号介于 1...N 之间,其中 1$\\le$M,N$\\le$250。 原点位于表格的左上角。 颜色由大写字母指定。
编辑器接受以下命令:
IMN 创建一个新的 M x N 图像,所有像素最初都为白色 (O)。 C 通过将所有像素设置为白色 (O) 来清除表格。 大小保持不变。 LXYC 以颜色 (C) 为像素 (X, Y) 着色。 VX Y1 Y2 C 在 X 列中,在 Y1 和 Y2 行之间(包括 Y1 和 Y2)绘制一条垂直的颜色 (C) 线段。 H X1 X2 YC 在 Y 行中,在 X1 和 X2 列之间(包括 X1 和 X2)绘制一条颜色 (C) 的水平线段。 K X1 Y1 X2 Y2 C 画一个颜色为C 的实心矩形,其中(X1, Y1) 是左上角,(X2, Y2) 是右下角。 FXYC 用颜色 C 填充区域 R,其中 R 的定义如下。 像素(X,Y)属于R。与像素(X,Y)颜色相同并与R中的任何像素共享公共边的任何其他像素也属于该区域。 S 名称 以 MSDOS 8.3 格式写入文件名,后跟当前图像的内容。 X 终止会话。 输出
在每个命令 S NAME 上,打印文件名 NAME 和当前图像的内容。 每行由每个像素的颜色内容表示。 请参阅示例输出。
忽略由 I、C、L、V、H、K、F、S 或 X 以外的字符定义的任何命令的整行,并传递到下一个命令。 万一出现其他错误,程序行为是不可预测的。
样本输入
我 5 6
L 2 3 A
一个.bmp
G 2 3 J
F 3 3 J
电压 2 3 4 瓦
高 3 4 2 Z
S二.bmp
X
样本输出
一个.bmp
呜呜呜
呜呜呜
噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢噢
呜呜呜
呜呜呜
呜呜呜
二.bmp
JJJJJ
锦江锦江
JWJJJ
JWJJJ
JJJJJ
JJJJJ
这是我的代码。 它使用 gcc 编译器进行编译,但不会像我预期的那样创建 char 数组。 指针或malloc有什么问题吗?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char **Pixel;
int *m, *n;
void Create(int m, int n) {
int i, j;
Pixel = malloc(sizeof (char*)*n * n);
for (i = 0; i < m * n; i++)
Pixel[i] = malloc(sizeof (char*)*m);
for (i = 0; i < m; i++)
for (j = 0; j < n; j++) {
Pixel[i][j] = '0';
}
}
void ColorOneSpot(int x, int y, char color) {
Pixel[x - 1][y - 1] = color;
}
void ColorColumn(int x, int y1, int y2, char color) {
int i;
for (i = y1; i <= y2; i++)
Pixel[x - 1][i] = color;
}
void ColorRow(int x1, int x2, int y, char color) {
int i;
for (i = x1; i <= x2; i++)
Pixel[i][y - 1] = color;
}
void ColorSquare(int *x1, int x2, int y1, int y2, char color) {
int i, j;
for (i = x1 - 1; i < x2; i++)
for (j = y1 - 1; j < y2; j++)
Pixel[i][j] = color;
}
void ColorNeighbor(int x, int y, char color) {
int i, j;
Pixel[y][x] = color;
for (i = x; i <= x + 2; i++)
if (i >= 0 && i <= m) {
for (j = y; j <= y + 2; j++) {
if (Pixel[i][j] == 0 && j >= 0 && j <= n)
Pixel[i][j] = color;
ColorNeighbor(x, y - 1, color);
ColorNeighbor(x, y + 1, color);
ColorNeighbor(x - 1, y, color);
ColorNeighbor(x + 1, y, color);
}
}
}
int main(void) {
int i, j;
char Input;
while (Input != 'X') {
int x, y, x1, y1, x2, y2;
char color, name[20];
scanf("%1s", &Input);
switch (Input) {
case 'I':
scanf("%d%d", &m, &n);
Create(*m, *n);
break;
case 'L':
scanf("%d%d%s", &x, &y, &color);
ColorOneSpot(x, y, color);
break;
case 'V':
scanf("%d%d%d%s", &x, &y1, &y2, &color);
ColorColumn(x, y1, y2, color);
break;
case 'H':
scanf("%d%d%d%s", &x1, &x2, &y, &color);
ColorRow(x1, x2, y, color);
break;
case 'K':
scanf("%d%d%d%d%s", &x1, &x2, &y1, &y2, &color);
ColorSquare(x1, x2, y1, y2, color);
break;
case 'F':
scanf("%d%d%s", &x, &y, &color);
ColorNeighbor(x, y, color);
break;
case 'S':
scanf("%s", &name);
printf("%s\n", name);
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++)
printf("%s ", Pixel[i][j]);
printf("\n");
}
break;
case 'X':break;
}
}
free(Pixel);
return 0;
}
您的color
值是一个char
但您在scanf
调用中使用"%s"
读取它。 您正在以相同的方式读取Input
字符。
使用%c
转换说明符读取单个字符。
图形编辑器允许用户以与文本编辑器让我们修改文档相同的方式编辑图像。 图像表示为 M x N 像素阵列,每个像素给定颜色。 制作一个模拟简单交互式图形编辑器的程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.