【问题标题】:graphical editor with c program (programming challenges 110105)带有 c 程序的图形编辑器(编程挑战 110105)
【发布时间】:2014-04-21 05:04:08
【问题描述】:

Photoshop 等图形编辑器允许我们更改位图图像,就像文本编辑器允许我们修改文档一样。图像表示为 M x 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 在 Y1 和 Y2 行之间(包括 Y1 和 Y2 行)在 X 列中绘制一条颜色 (C) 的垂直线段。 H X1 X2 Y C 在 X1 和 X2 列(包括 X1 和 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 以外的字符定义的任何命令的整行,并传递到下一个命令。如果出现其他错误,程序的行为是不可预测的。

示例输入

我 5 6

L 2 3 A

S one.bmp

G 2 3 日

F 3 3 日

V 2 3 4 瓦

H 3 4 2 Z

S二.bmp

X

样本输出

一个.bmp

噢噢噢

噢噢噢

噢噢噢

噢噢噢

噢噢噢

噢噢噢

两个.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;
}

【问题讨论】:

    标签: c bitmap editor


    【解决方案1】:

    您的color 值是char,但您在scanf 调用中使用"%s" 读取它。您正在以相同的方式阅读 Input 字符。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 2015-09-18
      • 2016-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多