ドット文字の回転について、どなたかご教授お願いします

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
gan

ドット文字の回転について、どなたかご教授お願いします

#1

投稿記事 by gan » 5年前

8x8のドット文字「A」を回転して返す関数を作成しています。
以下プログラムです。

コード:

#include <stdio.h>

/*
	名称	rotation
	引数	const char in_buf[8][9]:8X8ドット文字
			char out_buf[8][9]:回転後の文字
			int direc:回転方向(0:左へ,1:右へ)
			int angle:回転角度(0:90度,1:180度,2:270度)
	戻り値	無し
*/
/*----- ここより下に解答を記述してください -----*/
void rotation(const char in_buf[8][9], char out_buf[8][9], int direc, int angle)
{
	int i, j;

	if(direc == 1){										
		switch (angle) {
			case 0 : for(i = 0; i < 8; i++){
						for(j = 0; j < 9; j++){
							out_buf[j][9 - i] = in_buf[i][j];
						}
					 }
					 break;

			case 1 : for(i = 0; i < 8; i++){
						for(j = 0; j < 9; j++){
							out_buf[9 - i][j] = in_buf[i][j];
						}
					 }
					 break;

			case 2 : for(i = 0; i < 8; i++){
						for(j = 0; j < 9; j++){
							out_buf[j][9 - i] = in_buf[i][j];
							out_buf[i][9 - j] = out_buf[i][j];
						}
					 }
					 break;
		}
																		
	} else {
		switch (angle) {							
			case 0 : for(i = 0; i < 8; i++){
						for(j = 0; j < 9; j++){
							out_buf[9 - j][i] = in_buf[i][j];
						}
					 }
					 break;

			case 1 : for(i = 0; i < 8; i++){
						for(j = 0; j < 9; j++){
							out_buf[i][9 - j] = in_buf[i][j];
						}
					 }
					 break;

			case 2 : for(i = 0; i < 8; i++){
						for(j = 0; j < 9; j++){
							out_buf[9 - j][i] = in_buf[i][j];
							out_buf[9 - i][j] = out_buf[i][j];
						}
					 }
					 break;
		}
	}

	return;
}
/*----- ここより上に解答を記述してください -----*/

int main(void)
{
	char in_buf[8][9] = {	{"   A    "},
					{"   A    "},
					{"  A A   "},
					{"  A A   "},
					{" A   A  "},
					{" AAAAA  "},
					{"A     A "},
					{"A     A "}	};
	char out_buf[8][9] = { { 0 } };
	int i, direc, angle;
	
	printf("回転方向(0:左へ,1:右へ)=");
	scanf("%d", &direc);
	
	printf("回転角度(0:90度,1:180度,2:270度)=");
	scanf("%d", &angle);
	
	/*----- ここより下に解答を記述してください -----*/
	rotation(in_buf, out_buf, direc, angle);
	/*----- ここより上に解答を記述してください -----*/
	
	for(i = 0; i < 8; i++)
		printf("%s\n", out_buf[i]);
	
	return 0;
}
下手ですが一応、表示例も2つ程、載せておきます。
回転方向:0 (左へ)    回転角度:0 (90度)
             AA
         AA
     AA  A
 AA      A
     AA  A
         AA
             AA

回転方向:0 (左へ)    回転角度:1 (180度)
A           A
A           A
   AAAAA
   A      A
     A  A
     A  A
       A
       A
回転方向・回転角度別にswitch文で処理を分けています。
コンパイルエラーは起きていないのですが、デバッグエラーで途中までしか表示されなかったり
文字化けされたものがたくさんでてきたり・・・という状況です。
デバッグもしてみましたが何が原因なのかもわからずじまいです。
個人的には、最後に「文字列として」結果を出力する事がなにか関係してるのかなと考えています。
ちなみに8x8ドットなのに列数が9なのは最後に\0があるからです。
表示例もコードの最後に2つ程載せておきました。
関数部分全部書き直しでも構わないのでうまく表示させる方法をどなたかご教授お願いします。

長文失礼しました。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: ドット文字の回転について、どなたかご教授お願いします

#2

投稿記事 by usao » 5年前

コード:

char Buff[8];
というとき,有効なindexは0から7だ.すわなち

コード:

Buff[8] = 1;
とかはダメなのだ.

では,

コード:

char out_buf[8][9]
のindexの範囲は各次元でどこからどこまでなのか?
それを逸脱した場所にアクセスするような処理を書いていないのかをチェックすべし(まぁ,どうみてもやってるわけですが).

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: ドット文字の回転について、どなたかご教授お願いします

#3

投稿記事 by usao » 5年前

別の話:

・「左に90度回す」というのは,「右に270度回す」ことと等しいのではないか?
・同様に,「左に180度」「左に270度」も,右に回す処理に置き換えることができるのではないか?

であれば,馬鹿正直に6パターンの処理を個別に書かなくても3パターン書けば済むのでは?
さらに,

・「180度回す」というのは【「90度回す」ことを2回行うこと】
・「270度回す」というのは【「90度回す」ことを3回行うこと】

だということを使うならば,回転の処理は,「90度回転」を1つ実装しさえすれば,全パターンの処理を達成できるのではないか?

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: ドット文字の回転について、どなたかご教授お願いします

#4

投稿記事 by usao » 5年前

また別の話:

やることは,角度がいくつだろうとも,
「out_bufの各要素をin_bufのどこかの要素の値で埋めること」なのだから,全てのパターンを総合してこう書ける.

コード:

for( out_bufの全ての要素(x,y)について )
{
  (x,y)に対応する,in_buf側の要素(X,Y)を求む.
  X = ...;
  Y = ...;

  out_buf[y][x] = in_buf[Y][X];
}
既に述べたように,左回りか右回りかで分岐する必要は無いから,XとYを求める箇所の処理は単純に{90度,180度,270度}の3パターンだ.
このくらいなら,ifなりswitchなりで書いてしまってもよいであろう.

gan

Re: ドット文字の回転について、どなたかご教授お願いします

#5

投稿記事 by gan » 5年前

アドバイスありがとうございます。
逸脱した場所にアクセス~の所なのですがin_bufの値をout_bufに入れる処理自体が間違っているのでしょうか?
一応iの部分が7まで、jの部分が8までループするのを直したのと、90度回転の回数で6パターン書かなくても
3パターンでできることは分かりました。しかし、今度は何も表示されません。デバッグで見るとout_bufの中に
空白やAが入ったのは確認できたのですが・・・原因が分からないです。

返信

“C言語何でも質問掲示板” へ戻る