合計 昨日 今日

二次元配列について

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: ギル
[URL]
Date: 2018年1月04日(木) 12:09
No: 1
(OFFLINE)

 二次元配列について

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

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

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
 
#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;
}


よろしくお願いします。

Name: みけCAT
[URL]
伝説なるハッカー(689,686 ポイント)
Date: 2018年1月04日(木) 12:45
No: 2
(OFFLINE)

 Re: 二次元配列について

ギル さんが書きました:どのように変えればうまく処理ができるでしょうか。

うまく処理ができるコードに変えれば、うまく処理ができると思います。
また、インデントも整えた方がいいでしょう。

ギル さんが書きました:これを1~26までいくとまた1~26に戻り、それを26回繰り返すコードに変えてから1~26をA~Zに変えて
アルファベットを渦巻状に繰り返すコードを作りたいと考えているのですが中々うまくいきません。

「うまくいきません」だけでは、何がどううまくいかないのかわかりません。
具体的なエラーや失敗するコードを提示していただけますか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: girupre
[URL]
ぴよぴよ(417 ポイント)
Date: 2018年1月04日(木) 13:51
No: 3
(OFFLINE)

 Re: 二次元配列について

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

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

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

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

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

Name: みけCAT
[URL]
伝説なるハッカー(689,686 ポイント)
Date: 2018年1月04日(木) 14:54
No: 4
(OFFLINE)

 Re: 二次元配列について

xに1~26の数値が入るとし、ASCIIなどのアルファベットが連続した文字コードを仮定すると、
コード[C]: 全て選択
1
'A' + (x - 1)
でxに対応する文字が得られます。

yに1~676の数列が入るとすると、
コード[C]: 全て選択
1
(y - 1) % 26 + 1
で1~26の繰り返しが得られます。

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

Name: たいちう
[URL]
ハッカー(142,310 ポイント)
Date: 2018年1月04日(木) 15:02
No: 5
(OFFLINE)

 Re: 二次元配列について

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

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

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

Name: girupre
[URL]
ぴよぴよ(417 ポイント)
Date: 2018年1月04日(木) 16:19
No: 6
(OFFLINE)

 Re: 二次元配列について

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

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

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

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

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
 
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");


よろしくお願いいたします。

Name: girupre
[URL]
ぴよぴよ(417 ポイント)
Date: 2018年1月04日(木) 16:25
No: 7
(OFFLINE)

 Re: 二次元配列について

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

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


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

Name: たいちう
[URL]
ハッカー(142,310 ポイント)
Date: 2018年1月04日(木) 17:29
No: 8
(OFFLINE)

 Re: 二次元配列について

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

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

Name: みけCAT
[URL]
伝説なるハッカー(689,686 ポイント)
Date: 2018年1月04日(木) 17:50
No: 9
(OFFLINE)

 Re: 二次元配列について


このコード片をどこに挿入したのか、もとのコードの修正や削除を(どのように)行ったのかが不明なのでよくわかりませんが、ほとんど違いそうです。
特にaの要素を指定する添字を範囲外?にしたり、意味のない変換を行っていたりしているのがかなりおかしいです。

girupre さんが書きました:どのように修正すればよいでしょうか。

もとのコードの
・%4dを%cにする
・a[i][j]をそのまま渡すのではなく、対応する文字に変換してから渡すようにする (数値から対応する文字に変換する関数を作ってもいいかも)
といいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: みけCAT
[URL]
伝説なるハッカー(689,686 ポイント)
Date: 2018年1月04日(木) 17:56
No: 10
(OFFLINE)

 Re: 二次元配列について

まずは渦巻から一旦離れて、
コード[Text]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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
と出力するプログラムを作ってみるのもいいかもしれません。
単純に
コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main(void) {
    puts("1 A");
    puts("2 B");
    puts("3 C");
    /* 省略 */
    puts("52 Z");
    return 0;
}
とするのではなく、後で渦巻のプログラムに応用して組み込めるような感じで考えてみましょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: みけCAT
[URL]
伝説なるハッカー(689,686 ポイント)
Date: 2018年1月04日(木) 18:47
No: 11
(OFFLINE)

 Re: 二次元配列について

たいちうさんが言う4×4を想定して、
コード[Text]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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で殴ればいい!(死亡フラグ)

Name: girupre
[URL]
ぴよぴよ(417 ポイント)
Date: 2018年1月04日(木) 20:21
No: 12
(OFFLINE)

 Re: 二次元配列について

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

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

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


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

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

Name: みけCAT
[URL]
伝説なるハッカー(689,686 ポイント)
Date: 2018年1月04日(木) 21:14
No: 13
(OFFLINE)

 Re: 二次元配列について

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

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


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

うまくいったコードと、うまくいかないコードを提示してください。
girupre さんが書きました:これ以上考えても正解が出ないと思われますので、どなたか正解のコードを教えていただけると幸いです、、、。

提示されたコードをもとに修正したいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Name: girupre
[URL]
ぴよぴよ(417 ポイント)
Date: 2018年1月05日(金) 00:19
No: 14
(OFFLINE)

 Re: 二次元配列について

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

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

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//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に対応させたつもりなのですが出力がされません。

コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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;
}


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

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

Name: かずま
[URL]
Date: 2018年1月05日(金) 00:43
No: 15
(OFFLINE)

 Re: 二次元配列について

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

コード[C]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#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;
}

インデントを直しておきました。

Name: girupre
[URL]
ぴよぴよ(417 ポイント)
Date: 2018年1月05日(金) 00:49
No: 16
(OFFLINE)

 Re: 二次元配列について

[解決!]

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

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

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


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[28人]