各値の10進数、16進数、2進数を表示するプログラム

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

各値の10進数、16進数、2進数を表示するプログラム

#1

投稿記事 by takeru » 12年前

数値を-13~13まで2刻みで変化し、各値の、10進数、16進数、2進数を表示。
文字をA~Zまで1刻みで変化し、各値の文字、10進数、16進数、2進数を表示。
文字を'0'~'9'まで1刻みで変化し、各値の文字、10進数、16進数、2進数を表示。
2進数の表示は以下のサブ関数を参考にします。

 void sori(int a)
{ int i,wc;
for (i=31;i>=0,i--) {
wc=(a>>i) & 0x01;
if (i%4==3) printf(" ");
printf("%1d",wc);
}
printf("\n");
return;
}

数値を扱う場合、データ型は「int」を使用し、文字を扱う場合、データ型は「char」を使用し、サブ関数もそれに合わせたサブ関数を作る。
という問題なんですがなにぶんビギナーなためまったくわかりません。簡単なプログラムを教えていただけると幸いです。

non
記事: 1097
登録日時: 13年前

Re: 各値の10進数、16進数、2進数を表示するプログラム

#2

投稿記事 by non » 12年前

まず、最低限でも、-13から13まで10進数で出力するプログラムを作って添付してくださいよ。
ビギナーだから勉強するのでしょうから。
non

takeru

Re: 各値の10進数、16進数、2進数を表示するプログラム

#3

投稿記事 by takeru » 12年前

#include<stdio.h>
int main(void)
{
int x;
char y;
printf("-13から13までを表示\n");
for (x=-13; x<=13; x=x+1) {
printf("10進数:%d 16進数:%x\n",x,x);
}
printf("\nAからZまでを表示\n");
for (y='A'; y<='Z'; y=y+1) {
printf("アルファベット:%C 10進数:%d 16進数:%x \n",y,y,y);
}
return(0);
}
これであってますか?

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 各値の10進数、16進数、2進数を表示するプログラム

#4

投稿記事 by beatle » 12年前

コードを貼り付ける場合は codeタグ で囲って下さい。
takeru さんが書きました:これであってますか?
出力は合ってますか?それくらいは自分で確かめられるはずです。

さて、なかなかいい線行ってます。あとは2進数の表示だけですね。
sori関数はint型の数値を一つ引数にとりますから、試しに何か渡し、sori関数を実行してみればどんなものか分かると思います。
それが分かれば、sori関数を文字用に改造するにはどうすればいいか、分かるかもしれません。

non
記事: 1097
登録日時: 13年前

Re: 各値の10進数、16進数、2進数を表示するプログラム

#5

投稿記事 by non » 12年前

soriの関数ですが
for (i=31;i>=0,i--) {
の部分、間違ってますから、よく見てください。
あとは、呼び出すだけですね。

最初の-13から13までは、2つ刻みですからどうしましょう。

文字を'0'~'9'までは、A~Zまでとやり方は同じです。
non

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 各値の10進数、16進数、2進数を表示するプログラム

#6

投稿記事 by beatle » 12年前

non さんが書きました:soriの関数ですが
for (i=31;i>=0,i--) {
の部分、間違ってますから、よく見てください。
よく見たら、sori関数の他の部分にもミスがありました。括弧が足りないとか。

takeru

Re: 各値の10進数、16進数、2進数を表示するプログラム

#7

投稿記事 by takeru » 12年前

すいませんよく分かんないんですけどまず文字'0’から'9’ってどういうことですか?
普通の0から9とは違うんですか?

non
記事: 1097
登録日時: 13年前

Re: 各値の10進数、16進数、2進数を表示するプログラム

#8

投稿記事 by non » 12年前

takeru さんが書きました:すいませんよく分かんないんですけどまず文字'0’から'9’ってどういうことですか?
普通の0から9とは違うんですか?
文字の'0'はJISコードなら0x30です。
文字の'A'なら0x41。
文字と数値は違います。
やり方は、for (y='A'; y<='Z'; y=y+1) と同じようにすればOKです。
non

takeru

Re: 各値の10進数、16進数、2進数を表示するプログラム

#9

投稿記事 by takeru » 12年前

ちょっと色々自分でやってみたのですが全然うまくいきません。

コード:

 
#include<stdio.h>
void sori(int a)
{ 
int i,wc;
for (i=-13;i<=13;i=i+2) {
wc=(a>>i) & 0x01;
if (i%4==3) printf(" ");
printf("%d",wc);
}
printf("\n");
return;
}
void sori2(char t)
{ 
int o,w;
for (o=-13;o<=13;o=o+1) {
w=(t>>o) & 0x01;
if (o%4==3) printf(" ");
printf("%d",w);
}
printf("\n");
return;
}
int main(void)
{
	int a,t,x;
	char y;
	printf("-13から13までを表示\n");
	for (x=-13; x<=13; x=x+2) {
	printf("10進数:%d 16進数:%x 2進数:%d\n",x,x,a);
	}
	printf("\nAからZまでを表示\n");
	for (y='A'; y<='Z'; y=y+1) {
	printf("アルファベット:%C 10進数:%d 16進数:%x 2進数%d\n",y,y,y,t);
	}
	printf("\n'0'から'9'までを表示\n");
	for (y='0'; y<='9'; y=y+1) {
	printf("10進数:%d 16進数:%x 2進数%d\n",y,y,a);
	}
	return(0);
}
多分わかる人が見たら根本的に違うと思いますがこのプログラムをどう書き換えたらうまくいくか教えて下さい。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 各値の10進数、16進数、2進数を表示するプログラム

#10

投稿記事 by beatle » 12年前

まず、その非常に見にくいインデント(字下げ)をどうにかしないと、取れるバグも取れないと思いますよ。
もしかして、自分でソースコードを書いているときはちゃんとインデントされているけれど、掲示板に貼り付けるときにダメになってしまうのでしょうか?

takeru

Re: 各値の10進数、16進数、2進数を表示するプログラム

#11

投稿記事 by takeru » 12年前

私がインデントしていないだけです。すいません。
この課題月曜に提出しなくてはいけなくて今日も一日本などを読みながらやっていましたが、一向にうまくいきません。
ホント困っています。どこをどう書き換えたらうまくいくか教えてください。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 各値の10進数、16進数、2進数を表示するプログラム

#12

投稿記事 by beatle » 12年前

プログラムの回答でなくて申し訳ありませんが。興味本位で聞かせていただきます。
また後ほどプログラムの方に回答したいと思います。
takasiさんによる「アルファベット」という質問があり、その中のNo.11でtakasiさんが「sori関数」を持ちだしています。
sori関数って流行っているのですか?どういう意味でしょう。「処理」関数?

takeru

Re: 各値の10進数、16進数、2進数を表示するプログラム

#13

投稿記事 by takeru » 12年前

多分takasiさんも同じ先生から情報を習いこの課題を出されて、この場でお聞きしているためだと思います。
その先生の教え方がサブ関数やsori関数などということを教えたうえでこの課題を出しています。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 各値の10進数、16進数、2進数を表示するプログラム

#14

投稿記事 by beatle » 12年前

まず2進数の基本から。
2進数とは0と1だけで表す数ですね。
例えば10進数で10という数字を2進数にすると 1010 となります。
以下、N進数でXというのを X_N と書くことにします。

10_10 = 1010_2 = A_16
255_10 = 11111111_2 = FF_16

2進数の1桁のことを「ビット」と呼びます。1010_2は4ビットで、11111111_2は8ビットの数字ですね。

コンピュータの内部は全て2進数という話は聞いたことがあるかもしれません。
例えばint型の変数も内部は2進数になっています。

コード:

int i = 10;
質問者さんの環境では、多分ですけれどint型は32ビット分の長さを持っています。
ですから、iに10を入れた場合、iの中身は
00000000 00000000 00000000 00001010
となっているのです。(2進数を8ビット毎に区切っています)
iに-10を入れた場合、iの中身は
11111111 11111111 11111111 11110110
となります。(2の補数というやつです)


次はビット論理演算です。ソースコードの中で

コード:

(a>>i) & 0x01
というような処理をしていますね。この >> と & について説明します。

まず >> は「右シフト演算子」と呼びます。参考:http://www.geocities.jp/ky_webid/c/050.html

コード:

(データ) >> (シフト量)
という風に使います。これは、「データ」を「右」に「シフト量」ビットだけずらします。

コード:

10 >> 1
とやると、10_10 = 1010_2 でしたから、結果は 101_2 となります。
00001010 >> 1 の結果が 00000101 になるのです。(32ビット全部書くのは面倒なので、最下位8ビット分だけ書きます)
同様に

コード:

10 >> 2
の結果は 10_2 となります。
00001010 >> 2 の結果が 00000010 になったわけです。
左側には、iが正の数の場合は0が、負の数の場合は1がコピーされます。

次に & は「ビット積演算子」と呼びます。参考:http://www.geocities.jp/ky_webid/c/049.html

コード:

(データ) >> (マスク)
という風に使います。これは、「マスク」の中で1になっているビットに対応する「データ」のビットを残し、
「マスク」の中で0になっているビットに対応する「データ」のビットを0にする、といいう演算です。
どういうことかというと、こういうことです。

コード:

10 & 3
とやると、10_10 = 1010_2 であり、3_10 = 11_2 ですから、結果は 10_2 です。
00001010 & 00000011 の結果が 00000010 になるのです。

コード:

X X X X X X X X : データ
0 0 0 0 0 0 1 1 : マスク
----------------
0 0 0 0 0 0 X X : ビット積演算結果
となります。


さて、本題に入ります。ここでの目標は「int型変数aに入れた値を、2進数として表示する」です。
上で説明しました「右シフト演算」と「ビット積演算」を組み合わせますと、「aのNビット目が0か1かを判断する」ことができます。
Nビット目というのは、ここでは0から数えることにします。Nビット目はN+1桁目に該当します。
0010_2 の「0ビット目は0」、「1ビット目は1」、「2ビット目は0」、「3ビット目は0」ということです。

aのNビット目が0か非0かを判断するにはこうします。
まず、aのNビット目が0ビット目に来るまで右にずらします。

コード:

a >> N
例えば a = 000XD000 であり、N = 3 ならば a >> N == 000000XD となり、aのNビット目が0ビット目に来ます。
次に、ずらした数値の0ビット目を取り出します。

コード:

(a >> N) & 1
マスクは「1」、つまり 00000001 ですから、a = 000XD000, N = 3の場合、
(a >> N) & 1
= (000XD000 >> 3) & 00000001
= 000000XD & 00000001
= 0000000D
となります。ですから、aのNビット目を画面に出力するには

コード:

int wc = ((a >> N) & 1);
if (wc == 0)
{
    printf("0");
}
else
{
    printf("1");
}
とやればいいのです。でもこれはもっと簡単に書けまして、

コード:

int wc = ((a >> N) & 1);
printf("%1d", wc);
これでいいのです。

以上で、aのNビット目を画面に表示できるようになりました。
あとは、このNを31から0まで変化させて、上の処理を32回繰り返せばいいわけです。
31ビット目を表示
30ビット目を表示
29ビット目を表示
...
0ビット目を表示
なんで31なのかというと、intが32ビットだからです。(32ビットじゃない場合もあるのですが、
恐らく質問者さんの環境だったらintは32ビットでしょう)

多分繰り返し処理は出来ると思いますが一応書いておきましょう。
「本当に」分からない時だけ開いて読んで下さい。
► スポイラーを表示
今まではint型で説明しましたが、char型の場合も格納できるビット数がint型より少ない、という点を除き
int型と同じですから、まったく同様の考え方で2進数に変換して表示ができます。
がんばってください。
最後に編集したユーザー beatle on 2011年11月20日(日) 09:03 [ 編集 1 回目 ]

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 各値の10進数、16進数、2進数を表示するプログラム

#15

投稿記事 by softya(ソフト屋) » 12年前

横からすいません。
takeruさんとtakasiさんが同じ方の場合はフォーラムルールに違反していることになりますので名前の統一をお願いします。
もし疑問がありましたら、画像まで連絡を頂ければと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

takeru

各値の10進数、16進数、2進数を表示するプログラム

#16

投稿記事 by takeru » 12年前

>beatleさん細かくありがとうございます。なんとか今日1日かけて頑張って作ってみたいと思います。ただ、またうまくいかないことがあるかもしれないのでそのときはお願いします。


>softya(ソフト屋) さんすいません。takasiさんは友達で今パソコンが壊れているらしく私のパソコンをかしているためにそのようなことになってしまっているのです。今後は気を付けます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: 各値の10進数、16進数、2進数を表示するプログラム

#17

投稿記事 by softya(ソフト屋) » 12年前

書かれていることがかなり矛盾していますので統一をなさって下さいとだけ言っておきます。
【補足】私としては無用な混乱を生まないようにして頂きたいだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

takeru

Re: 各値の10進数、16進数、2進数を表示するプログラム

#18

投稿記事 by takeru » 12年前

とりあえず数値を‐13から13まで変化させて10進数、16進数、2進数で表示するプログラムを作ったつもりだったんですがどうしても思っているように表示できません。
私的には
10進数:-13 16進数:fffffff3 2進数:1111 1111 1111 1111 1111 1111 1111 0011
                 ・
                 ・
                 ・
10進数:13 16進数:d 2進数:0000 0000 0000 0000 0000 0000 0000 1101
といった感じに表示させたいのですがどこをどう直したらいいのか教えてください。

コード:

#include<stdio.h>
int shori(int N,int wc,int x)
{
	for (x=-13;x<=13;x++){
	   printf("\n");
	 	for (N = 31; N >= 0; N--){    
    	            wc = (x >> N) & 1;
    			if ((N % 4) == 3){
         			printf(" ");
    			   }
        	printf("%1d", wc); 
		}
	}
	printf("\n");
	return(N,wc,x);
}

int main(void)
{
	int x,N,wc,b;
	printf("-13から13までを表示\n");
	b=shori(N,wc,x);
	for (x=-13; x<=13; x=x+1) {
	     printf("10進数:%d 16進数:%x 2進数:%d\n",x,x,b);
	}
	return(0);
}

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 各値の10進数、16進数、2進数を表示するプログラム

#19

投稿記事 by beatle » 12年前

インデントをしっかりしましょう。見難くて答えるのが大変です。
提示されたソースコードに対してコメントしてみました。

コード:

#include<stdio.h>
int shori(int N,int wc,int x)
{
	for (x=-13;x<=13;x++){ // 引数xの値を使う前に値を代入している。xを引数にした意味が無い
		printf("\n");
		for (N = 31; N >= 0; N--){ // 引数Nの値を使う前に値を代入している。Nを引数にした意味が無い
			wc = (x >> N) & 1; // 引数wcの値を使う前に値を代入している。wcを引数にした意味が無い
			if ((N % 4) == 3){
				printf(" ");
			}
			printf("%1d", wc); 
		}
	}
	printf("\n");
	return(N,wc,x); // これはreturn x;とほぼ同じ意味。
}

int main(void)
{
	int x,N,wc,b;
	printf("-13から13までを表示\n");
	b=shori(N,wc,x); // 未初期化の変数N, wc, xを利用している。やっちゃダメ。
	for (x=-13; x<=13; x=x+1) {
		printf("10進数:%d 16進数:%x 2進数:%d\n",x,x,b); // 2進数は%dで表示できない。
	}
	return(0);
}
まずおかしいところは、shori関数は3つの引数を取るのに、その3つとも値を読み出す前にデータを書き込んでいます。
引数にした意味がまったく有りません。変数を使いたいだけなら、普通に変数定義しましょう。

コード:

int shori(void)
{
    int N, wc, x;
    for (x=-13;x<=13;x++){
        printf("\n");
        for (N = 31; N >= 0; N--){    
            wc = (x >> N) & 1;
            if ((N % 4) == 3){
                printf(" ");
            }
            printf("%1d", wc); 
        }
    }
    printf("\n");
    return(N,wc,x);
}
こんな感じで。

それから、main関数の中でforループを使い、xを-13から13まで変化させているのは正しいと思いますが、
shori関数はforループの外にあり、一度しか呼び出されていません。
xの各値に対して、2進数表示を求めるわけですから、forループの中でshori関数を呼ばねばなりません。
最後に編集したユーザー beatle on 2011年11月20日(日) 19:18 [ 編集 2 回目 ]

takeru

Re: 各値の10進数、16進数、2進数を表示するプログラム

#20

投稿記事 by takeru » 12年前

未初期化の変数N, wc, xを初期化するにはどこに何を入れればいいか教えてください。
あと2進数を表示するには%何とすればいいんでしょうか?本読んでもわからなくて・・・

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 各値の10進数、16進数、2進数を表示するプログラム

#21

投稿記事 by beatle » 12年前

変数の初期化は

コード:

int x = 10;
のようにします。

printfでは2進数を直接表示する%指定はありません。
存在しないので、わざわざshori関数を作って1ビットずつ表示させているのです。

takeru

Re: 各値の10進数、16進数、2進数を表示するプログラム

#22

投稿記事 by takeru » 12年前

やってみたんですがどこが間違っているのでしょうか?

コード:

  
#include<stdio.h>
int shori(void)
{
    int N, wc, x;
    for (x=-13;x<=13;x++){
       printf("\n");
        for (N = 31; N >= 0; N--){    
                    wc = (x >> N) & 1;
                if ((N % 4) == 3){
                    printf(" ");
                   }
            printf("%ld", wc); 
        }
    }
    printf("\n");
    return(N,wc,x);
} 


int main(void)
{
	int x=-13,N=0,wc=0,b;
	printf("-13から13までを表示\n");
	for (x=-13; x<=13; x=x+1) {
		b=shori();     
	     printf("10進数:%d 16進数:%x 2進数:\n",x,x,b);
	}
	return(0);
}
直していただけないでしょうか?

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 各値の10進数、16進数、2進数を表示するプログラム

#23

投稿記事 by beatle » 12年前

何度も言っているのですが、インデントをしっかりしましょう。
特にshori関数のインデントは良くありません。

さて、main関数内部でのprintf関数の呼び出しでは、%が2つしかありません。
にも関わらず、x, x, bと3つの数値を渡しています。おかしいですよね?

あなたはご自分で「10進数:-13 16進数:fffffff3 2進数:1111 1111 1111 1111 1111 1111 1111 0011」と表示させたいとおっしゃいました。
にも関わらず、「2進数:」の後で改行してしまっています。おかしいですよね?

僕が全て直しちゃうのは簡単ですが、それではtakeruさんが力を伸ばすチャンスを奪ってしまうかもしれません。
僕は今夜、この掲示板をちょくちょく確認する予定ですから、もう少し頑張ってみませんか?

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 各値の10進数、16進数、2進数を表示するプログラム

#24

投稿記事 by beatle » 12年前

ちなみにshori関数の実装に関してのヒントです。
shori関数をxを引数として呼び出すと、xの2進数表示を出力するようにしてみましょう。
つまり、shori関数は

コード:

void shori(int x)
{
    ...
}
という形になります。そして

コード:

shori(10);
と呼び出すと、画面に

コード:

0000 0000 0000 0000 0000 0000 0000 1010
とだけ表示されるようにします。

まずは以上の動作をするshori関数と、その処理関数を呼び出すだけのシンプルなmain関数だけを作ってみましょう。

コード:

int main(void)
{
    shori(-13);
    shori(13);
    return 0;
}
これを動作させると正確に以下の出力をするようになるまで頑張りましょう。

コード:

 1111 1111 1111 1111 1111 1111 1111 0011
 0000 0000 0000 0000 0000 0000 0000 1101

takeru

Re: 各値の10進数、16進数、2進数を表示するプログラム

#25

投稿記事 by takeru » 12年前

作ってみました。ちょっと自分で考えて‐13から13を2進数で表示するようなプログラムにしてみました。

コード:

#include<stdio.h>
void shori(int x)
{
	int N,wc;
	for (N = 31; N >= 0; N--){    
    	    wc = (x >> N) & 1;
    	    if ((N % 4) == 3){
                printf(" ");
    	    }
            printf("%ld", wc); 
       	}
	printf("\n");
}
int main(void)
{
    int x;
    for (x=-13; x<=13; x=x+1){
    		shori(x);
    	}
    return(0);
} 

これをどうしたら
10進数:-13 16進数:fffffff3 2進数:1111 1111 1111 1111 1111 1111 1111 0011
                 ・
                 ・
                 ・
10進数:13 16進数:d 2進数:0000 0000 0000 0000 0000 0000 0000 1101
のようにできるのでしょうか?

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 各値の10進数、16進数、2進数を表示するプログラム

#26

投稿記事 by beatle » 12年前

なかなかいいですね!。進化してますよ。
さあ、あとは少しです。

ヒントを差し上げます。
hello, worldと画面に表示するには2通りのやり方があります。
まずはごく普通のやり方。

コード:

printf("hello, world\n");
今度は2回に分けるやり方。

コード:

printf("hello, "); // ここでは改行しない
printf("world\n");
どちらのやり方でも

コード:

hello, world
と表示されます。

takeru

Re: 各値の10進数、16進数、2進数を表示するプログラム

#27

投稿記事 by takeru » 12年前

これのどこにshori(x);を入れたらいいんでしょうか?いろいろやってみたんですがどれも違うみたいで・・・

コード:

#include<stdio.h>
void shori(int x)
{
	int N,wc;
	for (N = 31; N >= 0; N--){    
    	    wc = (x >> N) & 1;
    	    if ((N % 4) == 3){
                printf(" ");
    	    }
            printf("%ld", wc); 
       	}
	printf("\n");
}
int main(void)
{
    int x;
    for (x=-13; x<=13; x=x+1){
    		printf("10進数:%d 16進数:%x",x,x);
		printf(" 2進数:%\n");
    	}
    return(0);
}

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 各値の10進数、16進数、2進数を表示するプログラム

#28

投稿記事 by beatle » 12年前

shori関数は、値を渡すとそれを2進数表示する、いわばprintf関数みたいなものです。
shori(13)とやると 0000 0000 0000 0000 0000 0000 0000 1101<改行> と表示する。shoriを特殊なprintfだと思えば、

コード:

printf("10進数:%d", x); // 「10進数:13」と表示
printf(" 2進数:"); // 「 2進数:」と表示
shori(x); // 「 0000 0000 0000 0000 0000 0000 0000 1101」と表示
とできる、ということが分かるかと思います。

takeru

Re: 各値の10進数、16進数、2進数を表示するプログラム

#29

投稿記事 by takeru » 12年前

ありがとうございます。これを応用して残りの文字を表示するプログラムを書き足して完成させたいと思います。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 各値の10進数、16進数、2進数を表示するプログラム

#30

投稿記事 by beatle » 12年前

完成しましたら、完成版のソースコードを投稿してくださいね。
後から見た人の参考になるように。

takeru

Re: 各値の10進数、16進数、2進数を表示するプログラム

#31

投稿記事 by takeru » 12年前

完成版ソースコードです。

コード:

#include<stdio.h>
void sori1(int x)
{
	int N,wc;
	for (N = 31; N >= 0; N--){    
    	    wc = (x >> N) & 1;
    	    if ((N % 4) == 3){
                printf(" ");
    	    }
            printf("%ld", wc); 
       	}
}
void shor2(int y)
{
	int N,wc;
	for (N = 31; N >= 0; N--){    
    	    wc = (y >> N) & 1;
    	    if ((N % 4) == 3){
                printf(" ");
    	    }
            printf("%ld", wc); 
       	}
}
int main(void)
{
    	int x;
    	char y;
		for (x=-13; x<=13; x=x+2){
    		printf("10進数:%d 16進数:%x",x,x);
		printf(" 2進数:");sori1(x);
		printf("\n");
    	}
		for (y='A'; y<='Z'; y=y+1) {
		printf("10進数:%d 16進数:%x",y,y);
		printf(" 2進数:");sori2(y);
		printf("\n");
	}
		for (y='0'; y<='9'; y=y+1) {
		printf("10進数:%d 16進数:%x",y,y);
		printf(" 2進数:");sori2(y);
		printf("\n");
	}
    return(0);
} 
約4日間ありがとうございました。これで無事課題が提出できそうです。

non
記事: 1097
登録日時: 13年前

Re: 各値の10進数、16進数、2進数を表示するプログラム

#32

投稿記事 by non » 12年前

sori1とsori2の2つあることが、大減点。
インデントができていないのが小減点。
私が、先生なら突き返す。
non

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: 各値の10進数、16進数、2進数を表示するプログラム

#33

投稿記事 by beatle » 12年前

      sori1とsori2の2つあるのがまずい
      のではなくて、
2つの中身が同じなのがまずいです。
    char型は8ビットしかないのに、
    sori2関数の中身は32ビット分表示する    ような中身になっております。
   インデントがダメな文章は
   読みにくい
       ですよね。

takeru

Re: 各値の10進数、16進数、2進数を表示するプログラム

#34

投稿記事 by takeru » 12年前

ほんとインデントについては今後どうやったら正しいのか慣れていきたいと思います。
char型が8ビットなのはしりませんでした。31の部分を変えて直したいと思います。
プログラムは私としては正直納得いっているんですが、やはりレベルの高い方から見るとおかしいんですね、できたら模範解答を示してもらえないでしょうか?興味があります。

かずま

Re: 各値の10進数、16進数、2進数を表示するプログラム

#35

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

tekeru さんが書きました:ほんとインデントについては今後どうやったら正しいのか慣れていきたいと思います。

コード:

        for (x=-13; x<=13; x=x+2){
            printf("10進数:%d 16進数:%x",x,x);
        printf(" 2進数:");sori1(x);
        printf("\n");
        }
        for (y='A'; y<='Z'; y=y+1) {
        printf("10進数:%d 16進数:%x",y,y);
        printf(" 2進数:");sori2(y);
        printf("\n");
    }
次のようにすれば正しいのです。分かりますか?

コード:

    for (x=-13; x<=13; x=x+2){             // for文の始まり
        printf("10進数:%d 16進数:%x",x,x); //     for文の中の文
        printf(" 2進数:");sori1(x);        //     for文の中の文
        printf("\n");                      //     for文の中の文
    }                                      // for文の終わり
    for (y='A'; y<='Z'; y=y+1) {           // for文の始まり
        printf("10進数:%d 16進数:%x",y,y); //     for文の中の文
        printf(" 2進数:");sori2(y);        //     for文の中の文
        printf("\n");                      //     for文の中の文
    }                                      // for文の終わり
次はこれです。

コード:

void sori1(int x)
{
    int N,wc;
    for (N = 31; N >= 0; N--){    
            wc = (x >> N) & 1;
            if ((N % 4) == 3){
                printf(" ");
            }
            printf("%ld", wc); 
        }
}
インデントの基本ルールは、
1. if文や for文や関数定義の始まりと終わりの開始位置を揃える。
2. 中の文や宣言は一段下げる。

コード:

void sori1(int x)              // 関数定義の始まり
{                              // 関数定義の始まり
    int N,wc;                  //     関数定義の中の宣言
    for (N = 31; N >= 0; N--){ //     関数定義の中の for文の始まり   
        wc = (x >> N) & 1;     //         for文の中の文
        if ((N % 4) == 3){     //         for文の中の if文の始まり
            printf(" ");       //             if文の中の文
        }                      //         for文の中の if文の終わり
        printf("%ld", wc);     //         for文の中の文
    }                          //   関数定義の中の for文の終わり
}                              // 関数定義の終わり	

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: 各値の10進数、16進数、2進数を表示するプログラム

#36

投稿記事 by bitter_fox » 12年前

takeru さんが書きました:ほんとインデントについては今後どうやったら正しいのか慣れていきたいと思います。
参考までにお聞きしたいのですが、プログラムの作成においてどのようなエディタを使用していますか?
プログラマ向けのエディタの多くにはスマートインデント機能が付いており、プログラマがインデントを意識しなくても”良い”インデントを自動で行ってくれます。
もしそのようなエディタを使っていないのであれば、そのようなエディタを使って”良い”インデントを学ぶことをお勧めします。
takeru さんが書きました: プログラムは私としては正直納得いっているんですが、やはりレベルの高い方から見るとおかしいんですね、できたら模範解答を示してもらえないでしょうか?興味があります。
こんな感じでしょうか?

コード:

#include <stdio.h>
#include <limits.h>

void print_binary(int x, int bit_size)
{
	int i;

	for (i = bit_size - 1; i >= 0; i--)
	{
		if (i % 4 == 3)
		{
			printf(" ");
		}
		printf("%d", (x >> i) & 1);
	}
}

void print(int x, int bit_size)
{
	printf("10進数:%d 16進数:%x 2進数:", x, x);
	print_binary(x, bit_size);
	printf("\n");
}

int main(void)
{
	int x;
	char y;

	for (x = -13; x <= 13; x += 2)
	{
		print(x, sizeof(x) * CHAR_BIT);
	}

	for (y = 'A'; y <= 'Z'; y++)
	{
		print(y, CHAR_BIT);
	}

	for (y = '0'; y <= '9'; y++)
	{
		print(y, CHAR_BIT);
	}

	return 0;
}

charをintにキャストしてるのが気になるけど、大丈夫かな?

non
記事: 1097
登録日時: 13年前

Re: 各値の10進数、16進数、2進数を表示するプログラム

#37

投稿記事 by non » 12年前

bitter_fox さんが書きました:charをintにキャストしてるのが気になるけど、大丈夫かな?
カタカナだとまずいかも。でも、恐らく今回の課題では許容範囲。
non

takeru

Re: 各値の10進数、16進数、2進数を表示するプログラム

#38

投稿記事 by takeru » 12年前

自分のプログラムのどこがインデントを間違っているかわかりやすかったです。気を付けます。
ちなみにエディタってプログラムを作るソフトですよね?なんかあんまりよく分からないんですけどbcpad231ってのが学校から渡されてます。

お手本のプログラムを見てさすがだなぁと思いました。自分はまだはじめて1ヶ月くらいなんで全然わかっていないんですが今後はもっと本を読んで勉強していきたいと思います。


閉鎖

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