[英]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.