带有c程序的图形编辑器(编程挑战110105)

时间:2014-03-15 21:16:58

标签: c bitmap editor

Photoshop等图形编辑器允许我们以与文本编辑器允许我们修改文档相同的方式更改位图图像。图像表示为M×N像素阵列,其中每个像素具有给定的颜色。

您的任务是编写一个模拟简单交互式图形编辑器的程序。

输入

输入由一系列编辑器命令组成,每行一个。每个命令由一个大写字母表示,该大写字母作为该行的第一个字符。如果命令需要参数,它们将在由空格分隔的同一行上给出。

像素坐标由两个整数表示,列号介于1 ... M之间,行号介于1 ... N之间,其中1 $ \ le $ M,N $ \ le $ 250。原点位于表格的左上角。颜色由大写字母指定。

编辑器接受以下命令:

I M N创建一个新的M x N图像,所有像素最初都是白色(O)。 C通过将所有像素设置为白色(O)来清除表格。大小保持不变。 L X Y C将颜色(C)中的像素(X,Y)着色。 V X Y1 Y2 C在X行中,在行Y1和Y2之间绘制一个垂直的颜色(C)段。 H X1 X2 Y C在列X和X2(包括列)之间的行Y中绘制颜色(C)的水平段。 K X1 Y1 X2 Y2 C绘制一个填充的C颜色矩形,其中(X1,Y1)是左上角,(X2,Y2)是右下角。 F X Y C用颜色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以外的字符定义的任何命令的整行,并传递给下一个命令。如果出现其他错误,程序行为是不可预测的。

示例输入

I 5 6

L 2 3 A

S one.bmp

G 2 3 J

F 3 3 J

V 2 3 4 W

H 3 4 2 Z

S two.bmp

X

示例输出

one.bmp

OOOOO

OOOOO

OAOOO

OOOOO

OOOOO

OOOOO

two.bmp

JJJJJ

JJZZJ

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;
}

1 个答案:

答案 0 :(得分:0)

您的color值为char,但您在"%s"来电中使用scanf正在阅读该值。您以同样的方式阅读Input字符。

使用%c转换说明符读取单个字符。