ページ 1 / 1
二次元配列について
Posted: 2018年1月04日(木) 12:09
by ギル
以下のコードを数字ではなくアルファベットを繰り返すように変換するにはどうすればよいでしょうか??
どのように変えればうまく処理ができるでしょうか。
(編集依頼を受けて管理人が文章の一部を変更しました)
コード:
#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;
}
よろしくお願いします。
Re: 二次元配列について
Posted: 2018年1月04日(木) 12:45
by みけCAT
ギル さんが書きました:どのように変えればうまく処理ができるでしょうか。
うまく処理ができるコードに変えれば、うまく処理ができると思います。
また、インデントも整えた方がいいでしょう。
ギル さんが書きました:これを1~26までいくとまた1~26に戻り、それを26回繰り返すコードに変えてから1~26をA~Zに変えて
アルファベットを渦巻状に繰り返すコードを作りたいと考えているのですが中々うまくいきません。
「うまくいきません」だけでは、何がどううまくいかないのかわかりません。
具体的なエラーや失敗するコードを提示していただけますか?
Re: 二次元配列について
Posted: 2018年1月04日(木) 13:51
by girupre
みけCATさん 返信ありがとうございます。
C言語初心者でして今のところまでもさぐりさぐりで書きました。
ここまでは頑張って書けたのですが数字の繰り返しからアルファベットへの変換の書き方が全く分かりません。
そもそもこのやり方から作れるのでしょうか。
また、他の方針もあるのでしょうか。
要領を得ない返信ですみません、よろしくお願いします。
Re: 二次元配列について
Posted: 2018年1月04日(木) 14:54
by みけCAT
xに1~26の数値が入るとし、ASCIIなどのアルファベットが連続した文字コードを仮定すると、
でxに対応する文字が得られます。
yに1~676の数列が入るとすると、
で1~26の繰り返しが得られます。
printfで1文字出力するには、書式%cを使います。
Re: 二次元配列について
Posted: 2018年1月04日(木) 15:02
by たいちう
慣れてないならば26×26は大きすぎます。
最初は4×4で考えてみませんか?
その場合、1~4の数字を配置することになるのだと思いますが、
完成形はどうなってほしいのですか?
またその完成形はどのようなルールで作りましたか?
そのときのルールをC言語で書くことがプログラミングです。
4×4でうまくいったら、26×26に取り組みましょう。
数値からアルファベットへの変換は難しくないので、
そのアプローチも間違ってないと思います。
その場合、数字を正しく表示できるようになってから取り組めばよいでしょう。
Re: 二次元配列について
Posted: 2018年1月04日(木) 16:19
by girupre
みけ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");
よろしくお願いいたします。
Re: 二次元配列について
Posted: 2018年1月04日(木) 16:25
by girupre
たいちう さん 返信ありがとうございます。
ただ今最終的にアルファベットを表示する課題に取り組んでいまして、逆算して26×26の数字の表示から試していました。
たしかにおっしゃるとおりいきなりやるには力量が足りていないので、4×4から理解して少しずつ進めていきたいと思います。
ただ課題ですので早めにこなしたいという思いもありますのでこちらの修正にも取り組みたいと思います。
ご助言、ありがとうございます。初心者で終わらないように頑張っていきます。
Re: 二次元配列について
Posted: 2018年1月04日(木) 17:29
by たいちう
> ただ課題ですので早めにこなしたいという思いもありますので
> こちらの修正にも取り組みたいと思います。
26×26があと一歩、という完成度ならともかく、
4×4を理解した方が最終的に早くこなせると思いますが。
まぁ私の課題ではないので、お好きなようにどうぞ。
Re: 二次元配列について
Posted: 2018年1月04日(木) 17:50
by みけCAT
girupre さんが書きました:どこが違い
このコード片をどこに挿入したのか、もとのコードの修正や削除を(どのように)行ったのかが不明なのでよくわかりませんが、ほとんど違いそうです。
特にaの要素を指定する添字を範囲外?にしたり、意味のない変換を行っていたりしているのがかなりおかしいです。
girupre さんが書きました:どのように修正すればよいでしょうか。
もとのコードの
・%4dを%cにする
・a
[j]をそのまま渡すのではなく、対応する文字に変換してから渡すようにする (数値から対応する文字に変換する関数を作ってもいいかも)
といいと思います。
Re: 二次元配列について
Posted: 2018年1月04日(木) 17:56
by みけCAT
まずは渦巻から一旦離れて、
コード:
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;
}
とするのではなく、後で渦巻のプログラムに応用して組み込めるような感じで考えてみましょう。
Re: 二次元配列について
Posted: 2018年1月04日(木) 18:47
by みけCAT
たいちうさんが言う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
と出力するプログラムを作るのもいいでしょう。
Re: 二次元配列について
Posted: 2018年1月04日(木) 20:21
by girupre
たいちうさん、みけCATさん
お二人の言うようにまず1~16まででA~Dをループさせるプログラムを作成したところ、問題なく作動しました。
これを26のアルファベットに拡張することも成功しました。
しかしこの要領で先ほどのコードの埋め込んでもうまく表示されません、、。
これ以上考えても正解が出ないと思われますので、どなたか正解のコードを教えていただけると幸いです、、、。
Re: 二次元配列について
Posted: 2018年1月04日(木) 21:14
by みけCAT
girupre さんが書きました:お二人の言うようにまず1~16まででA~Dをループさせるプログラムを作成したところ、問題なく作動しました。
これを26のアルファベットに拡張することも成功しました。
しかしこの要領で先ほどのコードの埋め込んでもうまく表示されません、、。
うまくいったコードと、うまくいかないコードを提示してください。
girupre さんが書きました:これ以上考えても正解が出ないと思われますので、どなたか正解のコードを教えていただけると幸いです、、、。
提示されたコードをもとに修正したいと思います。
Re: 二次元配列について
Posted: 2018年1月05日(金) 00:19
by girupre
みけ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: 二次元配列について
Posted: 2018年1月05日(金) 00:43
by かずま
渦巻は 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;
}
インデントを直しておきました。
Re: 二次元配列について
Posted: 2018年1月05日(金) 00:49
by girupre
かずま さん ありがとうございます。
正解みて納得しました。
ijにいれる値がしっかりと理解できていませんでした。
もう一度二次元配列を勉強しなおしてみます、本当にありがとうございました。
また、お手伝いしていただいた皆様ありがとうございます。