二次元配列について

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

二次元配列について

#1

投稿記事 by ギル » 6年前

以下のコードを数字ではなくアルファベットを繰り返すように変換するにはどうすればよいでしょうか??
どのように変えればうまく処理ができるでしょうか。

(編集依頼を受けて管理人が文章の一部を変更しました)

コード:


#include <stdio.h>

 
int main(void)
{
    int  a[26][26],row=26, col=26;
        int left = -1, top = 0, right = col-1, bottom = row-1;
        int i, j,k=0, n = col*row;
        while (k<n) {
            for (j = ++left; j <= right; j++) a[top][j] = ++k;
            for (i = ++top; i <= bottom; i++) a[i][right] = ++k;
        if (k > n) break;
            for (j = --right; j >= left; j--) a[bottom][j] = ++k;
            for (i = --bottom; i >= top; i--) a[i][left] = ++k;
                     }

         for (i = 0; i <row; i++){ 
            for (j = 0; j < col; j++)

		 printf("%4d",a[i][j]);
            printf("\n");


     
	}	

    return 0;
}
よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 二次元配列について

#2

投稿記事 by みけCAT » 6年前

ギル さんが書きました:どのように変えればうまく処理ができるでしょうか。
うまく処理ができるコードに変えれば、うまく処理ができると思います。
また、インデントも整えた方がいいでしょう。
ギル さんが書きました:これを1~26までいくとまた1~26に戻り、それを26回繰り返すコードに変えてから1~26をA~Zに変えて
アルファベットを渦巻状に繰り返すコードを作りたいと考えているのですが中々うまくいきません。
「うまくいきません」だけでは、何がどううまくいかないのかわかりません。
具体的なエラーや失敗するコードを提示していただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

girupre
記事: 6
登録日時: 6年前

Re: 二次元配列について

#3

投稿記事 by girupre » 6年前

みけCATさん 返信ありがとうございます。

C言語初心者でして今のところまでもさぐりさぐりで書きました。

ここまでは頑張って書けたのですが数字の繰り返しからアルファベットへの変換の書き方が全く分かりません。

そもそもこのやり方から作れるのでしょうか。
また、他の方針もあるのでしょうか。

要領を得ない返信ですみません、よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 二次元配列について

#4

投稿記事 by みけCAT » 6年前

xに1~26の数値が入るとし、ASCIIなどのアルファベットが連続した文字コードを仮定すると、

コード:

'A' + (x - 1)
でxに対応する文字が得られます。

yに1~676の数列が入るとすると、

コード:

(y - 1) % 26 + 1
で1~26の繰り返しが得られます。

printfで1文字出力するには、書式%cを使います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

たいちう
記事: 418
登録日時: 13年前

Re: 二次元配列について

#5

投稿記事 by たいちう » 6年前

慣れてないならば26×26は大きすぎます。
最初は4×4で考えてみませんか?
その場合、1~4の数字を配置することになるのだと思いますが、
完成形はどうなってほしいのですか?

またその完成形はどのようなルールで作りましたか?
そのときのルールをC言語で書くことがプログラミングです。

4×4でうまくいったら、26×26に取り組みましょう。
数値からアルファベットへの変換は難しくないので、
そのアプローチも間違ってないと思います。
その場合、数字を正しく表示できるようになってから取り組めばよいでしょう。

girupre
記事: 6
登録日時: 6年前

Re: 二次元配列について

#6

投稿記事 by girupre » 6年前

みけcat さん 返信ありがとうございます。

解説してくださった文章から色々修正してみたのですが
うまく表示されません。

どこが違い、どのように修正すればよいでしょうか。

独学かつ学習しはじめたばかりのため、根本的な理解ができていない事を痛感しています。

コード:


int x=i,y=j; 

         for (x = 0; x<row ; x++){ 
            for (y = 0; y < col; y++)
		   
        	 printf("%c",a['A' + (x - 1)][(y - 1) % 26 + 1]);	
                 printf("\n");
よろしくお願いいたします。

girupre
記事: 6
登録日時: 6年前

Re: 二次元配列について

#7

投稿記事 by girupre » 6年前

たいちう さん 返信ありがとうございます。

ただ今最終的にアルファベットを表示する課題に取り組んでいまして、逆算して26×26の数字の表示から試していました。
たしかにおっしゃるとおりいきなりやるには力量が足りていないので、4×4から理解して少しずつ進めていきたいと思います。
ただ課題ですので早めにこなしたいという思いもありますのでこちらの修正にも取り組みたいと思います。


ご助言、ありがとうございます。初心者で終わらないように頑張っていきます。

たいちう
記事: 418
登録日時: 13年前

Re: 二次元配列について

#8

投稿記事 by たいちう » 6年前

> ただ課題ですので早めにこなしたいという思いもありますので
> こちらの修正にも取り組みたいと思います。

26×26があと一歩、という完成度ならともかく、
4×4を理解した方が最終的に早くこなせると思いますが。
まぁ私の課題ではないので、お好きなようにどうぞ。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 二次元配列について

#9

投稿記事 by みけCAT » 6年前

girupre さんが書きました:どこが違い
このコード片をどこに挿入したのか、もとのコードの修正や削除を(どのように)行ったのかが不明なのでよくわかりませんが、ほとんど違いそうです。
特にaの要素を指定する添字を範囲外?にしたり、意味のない変換を行っていたりしているのがかなりおかしいです。
girupre さんが書きました:どのように修正すればよいでしょうか。
もとのコードの
・%4dを%cにする
・a[j]をそのまま渡すのではなく、対応する文字に変換してから渡すようにする (数値から対応する文字に変換する関数を作ってもいいかも)
といいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 二次元配列について

#10

投稿記事 by みけCAT » 6年前

まずは渦巻から一旦離れて、

コード:

1 A
2 B
3 C
4 D
5 E
6 F
7 G
8 H
9 I
10 J
11 K
12 L
13 M
14 N
15 O
16 P
17 Q
18 R
19 S
20 T
21 U
22 V
23 W
24 X
25 Y
26 Z
27 A
28 B
29 C
30 D
31 E
32 F
33 G
34 H
35 I
36 J
37 K
38 L
39 M
40 N
41 O
42 P
43 Q
44 R
45 S
46 T
47 U
48 V
49 W
50 X
51 Y
52 Z
と出力するプログラムを作ってみるのもいいかもしれません。
単純に

コード:

#include <stdio.h>

int main(void) {
	puts("1 A");
	puts("2 B");
	puts("3 C");
	/* 省略 */
	puts("52 Z");
	return 0;
}
とするのではなく、後で渦巻のプログラムに応用して組み込めるような感じで考えてみましょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 二次元配列について

#11

投稿記事 by みけCAT » 6年前

たいちうさんが言う4×4を想定して、

コード:

1 A
2 B
3 C
4 D
5 A
6 B
7 C
8 D
9 A
10 B
11 C
12 D
13 A
14 B
15 C
16 D
と出力するプログラムを作るのもいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

girupre
記事: 6
登録日時: 6年前

Re: 二次元配列について

#12

投稿記事 by girupre » 6年前

たいちうさん、みけCATさん

お二人の言うようにまず1~16まででA~Dをループさせるプログラムを作成したところ、問題なく作動しました。

これを26のアルファベットに拡張することも成功しました。


しかしこの要領で先ほどのコードの埋め込んでもうまく表示されません、、。

これ以上考えても正解が出ないと思われますので、どなたか正解のコードを教えていただけると幸いです、、、。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: 二次元配列について

#13

投稿記事 by みけCAT » 6年前

girupre さんが書きました:お二人の言うようにまず1~16まででA~Dをループさせるプログラムを作成したところ、問題なく作動しました。

これを26のアルファベットに拡張することも成功しました。


しかしこの要領で先ほどのコードの埋め込んでもうまく表示されません、、。
うまくいったコードと、うまくいかないコードを提示してください。
girupre さんが書きました:これ以上考えても正解が出ないと思われますので、どなたか正解のコードを教えていただけると幸いです、、、。
提示されたコードをもとに修正したいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

girupre
記事: 6
登録日時: 6年前

Re: 二次元配列について

#14

投稿記事 by girupre » 6年前

みけCATさん ありがとうございます。

まずA~Zまでの書き出しのループのコードがこちらです。

コード:

//A~Z繰り返し
#include <stdio.h>
int main(void)
{
int i,j,k;
for(i=1;i<677;i++){
printf("%d",i);
j=i;
if(j>26)
j=(j - 1) % 26 + 1;
printf("%c\n",'A' + (j - 1));
}
return 0;
}

これを上の元々のコードに入れ込むために
新しくx,yの変数を作りi,jに対応させたつもりなのですが出力がされません。

コード:

#include <stdio.h>
int main(void)
{
    int  a[26][26],row=26, col=26;
        int left = -1, top = 0, right = col-1, bottom = row-1;
        int i, j,k=0, n = col*row,x=i,y=j;
        while (k<n) {
            for (j = ++left; j <= right; j++) a[top][j] = ++k;
            for (i = ++top; i <= bottom; i++) a[i][right] = ++k;
        if (k > n) break;
            for (j = --right; j >= left; j--) a[bottom][j] = ++k;
            for (i = --bottom; i >= top; i--) a[i][left] = ++k;
                     } 	
         for (i = 0;i<row ;i++){ 
            for (j = 0; j < col; j++)
             if(y>26) y=(y-1)%26+1;
        	 printf("%c",a[x]['A'+(y-1)]);
                 printf("\n");
     }
   return 0;
}

色々試してみたのですが一向に出力されません。

すみませんが、よろしくお願いいたします。

かずま

Re: 二次元配列について

#15

投稿記事 by かずま » 6年前

渦巻は 26x26 で出来ていたのですから、
4x4 を試す必要はありません。
最初のプログラムで、21行目の printf を
変更するだけです。

コード:

#include <stdio.h>

int main(void)
{
    int  a[26][26], row = 26, col = 26;
    int left = -1, top = 0, right = col-1, bottom = row-1;
    int i, j, k = 0, n = col*row;
    while (k < n) {
        for (j = ++left; j <= right; j++) a[top][j] = ++k;
        for (i = ++top; i <= bottom; i++) a[i][right] = ++k;
        if (k > n) break;
        for (j = --right; j >= left; j--) a[bottom][j] = ++k;
        for (i = --bottom; i >= top; i--) a[i][left] = ++k;
    }  
    for (i = 0; i < row ; i++) { 
        for (j = 0; j < col; j++)
            printf(" %c", (a[i][j] - 1) % 26 + 'A'); // 変更箇所
        printf("\n");
    }
    return 0;
}
インデントを直しておきました。

girupre
記事: 6
登録日時: 6年前

Re: 二次元配列について

#16

投稿記事 by girupre » 6年前

かずま さん ありがとうございます。

正解みて納得しました。
ijにいれる値がしっかりと理解できていませんでした。
もう一度二次元配列を勉強しなおしてみます、本当にありがとうございました。

また、お手伝いしていただいた皆様ありがとうございます。

返信

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