質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

717閲覧

C言語による2進数の生成

YudaiTakahashi

総合スコア13

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/11/12 16:43

前提・実現したいこと

任意の桁数の2進数の全通りを配列に格納してそれを出力するようなプログラムを作りたいです.
例えば,2桁であれば
[1,1]
[0,1]
[1,0]
[1,1]
三桁であれば
[1,1,1]
[0,1,1]
[1,0,1]
[0,0,1]
[1,1,0]
[0,1,0]
[1,0,0]
[0,0,0]
というふうに格納・出力をしたいですが,以下のような出力になってしまいます.
どこがおかしいのか,どなたか教えてください...

発生している問題・エラーメッセージ

3桁の時について,
出力すると
0 0 1
1 0 0
0 0 32563
0 32765 0
32765 0 0
1664188935 3 -1
というように,代入がうまくできていないようです...

エラーメッセージ

該当のソースコード

#include<stdio.h>

int pow_2(int digit); /2の引数乗を戻す/
void make_binary(int len1,int len2, int n, int (*a)[n]); /len1(=len2)×nの二次元配列に0または1を代入し,n桁?の全ての2進数を作成/
int main(void){
int i,j;
int digit,len;
digit=3;
len=pow_2(digit);
int a[len][digit]; /ここでは,3桁の二進数(先頭が0でも良い)が8通り存在するので8×3の配列を用意/
make_binary(len, len, digit-1,a);

for(i=0; i<len; i++)『 for(j=0; j<digit; j++){ printf("%d ",a[i][j]); } printf("\n"); } return 0;

}
int pow_2(int digit){
int i;
int a=1;
for(i=0; i<digit; i++){
a=a*2;
}
return a;
}
void make_binary(int len1,int len2, int n, int (*a)[n]){
int i,j;
i=0;
if (n==-1){
return ;
}
else{
while(i<len1){
for(j=0; j<len2/2; j++){
printf("%d %d ",i,j);
printf("\n");
a[i++][n]=1;
}
for(j=len2/2; j<len2; j++){
printf("%d %d ",i,j);
printf("\n");
a[i++][n]=0;
}
}
make_binary(len1, len2/2, n-1, a);
}
}

C言語 ソースコード

試したこと

make_binary()関数内のi,jを出力したところ,
(i,j)=
(0 0) (1 1) (2 2) (3 3) (4 4) (5 5) (6 6) (7 7)
(0 0) (1 1) (2 2) (3 3) (4 0) (5 1) (6 2) (7 3)
(0 0) (1 1) (2 0) (3 1) (4 0) (5 1) (6 0) (7 1)
となり,i,jは期待していた通りにfor文,while文を回っていることはわかりました.

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

C99規格とは珍しいですね

c

1void make_binary(int len1,int len2, int n, int (*a)[n]);

が問題です。

C言語における2次元配列はポインタの配列とは違います。

int a[height][width]; int b[height*width]; a[i][j] == b[i*width + j]

擬似コードですがこんな感じです。

結果の情報が抜け落ちると使えなくなります。

c

1void make_binary(int len1,int len2, int n, int digit, int a[len1][digit]);

にしてやると動くことでしょう。(C99非対応コンパイラを除く…VCとか)

投稿2018/11/12 18:23

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YudaiTakahashi

2018/11/13 01:28

回答ありがとうございます! 自分のプログラムに即した形で回答していただいたのでベストアンサーにさせていただきました! C99規格っていうんですね・・・ 昨日一日中できなかったので本当に助かりました泣
guest

0

void printbinary(int n){int i; for(i=0;i<8;i++){ printf("%d ",n&1); n>>=1;}}

というのでどうでしょう(下位8ビット)

投稿2018/11/13 00:09

y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YudaiTakahashi

2018/11/13 01:25

回答ありがとうございます! ビット演算は勉強不足でした... これを機に取り組んでみます!
guest

0

Cなど不要。そう、シェル芸ならね!

bash

1$ n=3;eval echo `yes '{0..1}'|head -$n|xargs|tr ' ' ','`|xargs -n1 -I@ echo "[@]" 2[0,0,0] 3[0,0,1] 4[0,1,0] 5[0,1,1] 6[1,0,0] 7[1,0,1] 8[1,1,0] 9[1,1,1]

投稿2018/11/12 21:41

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問