各値の10進数、16進数、2進数を表示するプログラム
各値の10進数、16進数、2進数を表示するプログラム
数値を-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」を使用し、サブ関数もそれに合わせたサブ関数を作る。
という問題なんですがなにぶんビギナーなためまったくわかりません。簡単なプログラムを教えていただけると幸いです。
文字を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」を使用し、サブ関数もそれに合わせたサブ関数を作る。
という問題なんですがなにぶんビギナーなためまったくわかりません。簡単なプログラムを教えていただけると幸いです。
Re: 各値の10進数、16進数、2進数を表示するプログラム
まず、最低限でも、-13から13まで10進数で出力するプログラムを作って添付してくださいよ。
ビギナーだから勉強するのでしょうから。
ビギナーだから勉強するのでしょうから。
non
Re: 各値の10進数、16進数、2進数を表示するプログラム
#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);
}
これであってますか?
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);
}
これであってますか?
Re: 各値の10進数、16進数、2進数を表示するプログラム
コードを貼り付ける場合は codeタグ で囲って下さい。
さて、なかなかいい線行ってます。あとは2進数の表示だけですね。
sori関数はint型の数値を一つ引数にとりますから、試しに何か渡し、sori関数を実行してみればどんなものか分かると思います。
それが分かれば、sori関数を文字用に改造するにはどうすればいいか、分かるかもしれません。
出力は合ってますか?それくらいは自分で確かめられるはずです。takeru さんが書きました:これであってますか?
さて、なかなかいい線行ってます。あとは2進数の表示だけですね。
sori関数はint型の数値を一つ引数にとりますから、試しに何か渡し、sori関数を実行してみればどんなものか分かると思います。
それが分かれば、sori関数を文字用に改造するにはどうすればいいか、分かるかもしれません。
Re: 各値の10進数、16進数、2進数を表示するプログラム
soriの関数ですが
for (i=31;i>=0,i--) {
の部分、間違ってますから、よく見てください。
あとは、呼び出すだけですね。
最初の-13から13までは、2つ刻みですからどうしましょう。
文字を'0'~'9'までは、A~Zまでとやり方は同じです。
for (i=31;i>=0,i--) {
の部分、間違ってますから、よく見てください。
あとは、呼び出すだけですね。
最初の-13から13までは、2つ刻みですからどうしましょう。
文字を'0'~'9'までは、A~Zまでとやり方は同じです。
non
Re: 各値の10進数、16進数、2進数を表示するプログラム
よく見たら、sori関数の他の部分にもミスがありました。括弧が足りないとか。non さんが書きました:soriの関数ですが
for (i=31;i>=0,i--) {
の部分、間違ってますから、よく見てください。
Re: 各値の10進数、16進数、2進数を表示するプログラム
すいませんよく分かんないんですけどまず文字'0’から'9’ってどういうことですか?
普通の0から9とは違うんですか?
普通の0から9とは違うんですか?
Re: 各値の10進数、16進数、2進数を表示するプログラム
文字の'0'はJISコードなら0x30です。takeru さんが書きました:すいませんよく分かんないんですけどまず文字'0’から'9’ってどういうことですか?
普通の0から9とは違うんですか?
文字の'A'なら0x41。
文字と数値は違います。
やり方は、for (y='A'; y<='Z'; y=y+1) と同じようにすればOKです。
non
Re: 各値の10進数、16進数、2進数を表示するプログラム
ちょっと色々自分でやってみたのですが全然うまくいきません。
多分わかる人が見たら根本的に違うと思いますがこのプログラムをどう書き換えたらうまくいくか教えて下さい。
#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);
}
Re: 各値の10進数、16進数、2進数を表示するプログラム
まず、その非常に見にくいインデント(字下げ)をどうにかしないと、取れるバグも取れないと思いますよ。
もしかして、自分でソースコードを書いているときはちゃんとインデントされているけれど、掲示板に貼り付けるときにダメになってしまうのでしょうか?
もしかして、自分でソースコードを書いているときはちゃんとインデントされているけれど、掲示板に貼り付けるときにダメになってしまうのでしょうか?
Re: 各値の10進数、16進数、2進数を表示するプログラム
私がインデントしていないだけです。すいません。
この課題月曜に提出しなくてはいけなくて今日も一日本などを読みながらやっていましたが、一向にうまくいきません。
ホント困っています。どこをどう書き換えたらうまくいくか教えてください。
この課題月曜に提出しなくてはいけなくて今日も一日本などを読みながらやっていましたが、一向にうまくいきません。
ホント困っています。どこをどう書き換えたらうまくいくか教えてください。
Re: 各値の10進数、16進数、2進数を表示するプログラム
プログラムの回答でなくて申し訳ありませんが。興味本位で聞かせていただきます。
また後ほどプログラムの方に回答したいと思います。
takasiさんによる「アルファベット」という質問があり、その中のNo.11でtakasiさんが「sori関数」を持ちだしています。
sori関数って流行っているのですか?どういう意味でしょう。「処理」関数?
また後ほどプログラムの方に回答したいと思います。
takasiさんによる「アルファベット」という質問があり、その中のNo.11でtakasiさんが「sori関数」を持ちだしています。
sori関数って流行っているのですか?どういう意味でしょう。「処理」関数?
Re: 各値の10進数、16進数、2進数を表示するプログラム
多分takasiさんも同じ先生から情報を習いこの課題を出されて、この場でお聞きしているためだと思います。
その先生の教え方がサブ関数やsori関数などということを教えたうえでこの課題を出しています。
その先生の教え方がサブ関数やsori関数などということを教えたうえでこの課題を出しています。
Re: 各値の10進数、16進数、2進数を表示するプログラム
まず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型は32ビット分の長さを持っています。
ですから、iに10を入れた場合、iの中身は
00000000 00000000 00000000 00001010
となっているのです。(2進数を8ビット毎に区切っています)
iに-10を入れた場合、iの中身は
11111111 11111111 11111111 11110110
となります。(2の補数というやつです)
次はビット論理演算です。ソースコードの中で というような処理をしていますね。この >> と & について説明します。
まず >> は「右シフト演算子」と呼びます。参考:http://www.geocities.jp/ky_webid/c/050.html という風に使います。これは、「データ」を「右」に「シフト量」ビットだけずらします。 とやると、10_10 = 1010_2 でしたから、結果は 101_2 となります。
00001010 >> 1 の結果が 00000101 になるのです。(32ビット全部書くのは面倒なので、最下位8ビット分だけ書きます)
同様に の結果は 10_2 となります。
00001010 >> 2 の結果が 00000010 になったわけです。
左側には、iが正の数の場合は0が、負の数の場合は1がコピーされます。
次に & は「ビット積演算子」と呼びます。参考:http://www.geocities.jp/ky_webid/c/049.html という風に使います。これは、「マスク」の中で1になっているビットに対応する「データ」のビットを残し、
「マスク」の中で0になっているビットに対応する「データ」のビットを0にする、といいう演算です。
どういうことかというと、こういうことです。 とやると、10_10 = 1010_2 であり、3_10 = 11_2 ですから、結果は 10_2 です。
00001010 & 00000011 の結果が 00000010 になるのです。
となります。
さて、本題に入ります。ここでの目標は「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 = 000XD000 であり、N = 3 ならば a >> N == 000000XD となり、aのNビット目が0ビット目に来ます。
次に、ずらした数値の0ビット目を取り出します。 マスクは「1」、つまり 00000001 ですから、a = 000XD000, N = 3の場合、
(a >> N) & 1
= (000XD000 >> 3) & 00000001
= 000000XD & 00000001
= 0000000D
となります。ですから、aのNビット目を画面に出力するには とやればいいのです。でもこれはもっと簡単に書けまして、 これでいいのです。
以上で、aのNビット目を画面に表示できるようになりました。
あとは、このNを31から0まで変化させて、上の処理を32回繰り返せばいいわけです。
31ビット目を表示
30ビット目を表示
29ビット目を表示
...
0ビット目を表示
なんで31なのかというと、intが32ビットだからです。(32ビットじゃない場合もあるのですが、
恐らく質問者さんの環境だったらintは32ビットでしょう)
多分繰り返し処理は出来ると思いますが一応書いておきましょう。
「本当に」分からない時だけ開いて読んで下さい。
今まではint型で説明しましたが、char型の場合も格納できるビット数がint型より少ない、という点を除き
int型と同じですから、まったく同様の考え方で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型は32ビット分の長さを持っています。
ですから、iに10を入れた場合、iの中身は
00000000 00000000 00000000 00001010
となっているのです。(2進数を8ビット毎に区切っています)
iに-10を入れた場合、iの中身は
11111111 11111111 11111111 11110110
となります。(2の補数というやつです)
次はビット論理演算です。ソースコードの中で というような処理をしていますね。この >> と & について説明します。
まず >> は「右シフト演算子」と呼びます。参考:http://www.geocities.jp/ky_webid/c/050.html という風に使います。これは、「データ」を「右」に「シフト量」ビットだけずらします。 とやると、10_10 = 1010_2 でしたから、結果は 101_2 となります。
00001010 >> 1 の結果が 00000101 になるのです。(32ビット全部書くのは面倒なので、最下位8ビット分だけ書きます)
同様に の結果は 10_2 となります。
00001010 >> 2 の結果が 00000010 になったわけです。
左側には、iが正の数の場合は0が、負の数の場合は1がコピーされます。
次に & は「ビット積演算子」と呼びます。参考:http://www.geocities.jp/ky_webid/c/049.html という風に使います。これは、「マスク」の中で1になっているビットに対応する「データ」のビットを残し、
「マスク」の中で0になっているビットに対応する「データ」のビットを0にする、といいう演算です。
どういうことかというと、こういうことです。 とやると、10_10 = 1010_2 であり、3_10 = 11_2 ですから、結果は 10_2 です。
00001010 & 00000011 の結果が 00000010 になるのです。
となります。
さて、本題に入ります。ここでの目標は「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 = 000XD000 であり、N = 3 ならば a >> N == 000000XD となり、aのNビット目が0ビット目に来ます。
次に、ずらした数値の0ビット目を取り出します。 マスクは「1」、つまり 00000001 ですから、a = 000XD000, N = 3の場合、
(a >> N) & 1
= (000XD000 >> 3) & 00000001
= 000000XD & 00000001
= 0000000D
となります。ですから、aのNビット目を画面に出力するには とやればいいのです。でもこれはもっと簡単に書けまして、 これでいいのです。
以上で、aのNビット目を画面に表示できるようになりました。
あとは、このNを31から0まで変化させて、上の処理を32回繰り返せばいいわけです。
31ビット目を表示
30ビット目を表示
29ビット目を表示
...
0ビット目を表示
なんで31なのかというと、intが32ビットだからです。(32ビットじゃない場合もあるのですが、
恐らく質問者さんの環境だったらintは32ビットでしょう)
多分繰り返し処理は出来ると思いますが一応書いておきましょう。
「本当に」分からない時だけ開いて読んで下さい。
► スポイラーを表示
int型と同じですから、まったく同様の考え方で2進数に変換して表示ができます。
がんばってください。
最後に編集したユーザー beatle on 2011年11月20日(日) 09:03 [ 編集 1 回目 ]
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 各値の10進数、16進数、2進数を表示するプログラム
横からすいません。
takeruさんとtakasiさんが同じ方の場合はフォーラムルールに違反していることになりますので名前の統一をお願いします。
もし疑問がありましたら、まで連絡を頂ければと思います。
takeruさんとtakasiさんが同じ方の場合はフォーラムルールに違反していることになりますので名前の統一をお願いします。
もし疑問がありましたら、まで連絡を頂ければと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
各値の10進数、16進数、2進数を表示するプログラム
>beatleさん細かくありがとうございます。なんとか今日1日かけて頑張って作ってみたいと思います。ただ、またうまくいかないことがあるかもしれないのでそのときはお願いします。
>softya(ソフト屋) さんすいません。takasiさんは友達で今パソコンが壊れているらしく私のパソコンをかしているためにそのようなことになってしまっているのです。今後は気を付けます。
>softya(ソフト屋) さんすいません。takasiさんは友達で今パソコンが壊れているらしく私のパソコンをかしているためにそのようなことになってしまっているのです。今後は気を付けます。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 各値の10進数、16進数、2進数を表示するプログラム
書かれていることがかなり矛盾していますので統一をなさって下さいとだけ言っておきます。
【補足】私としては無用な混乱を生まないようにして頂きたいだけです。
【補足】私としては無用な混乱を生まないようにして頂きたいだけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 各値の10進数、16進数、2進数を表示するプログラム
とりあえず数値を‐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
といった感じに表示させたいのですがどこをどう直したらいいのか教えてください。
私的には
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);
}
Re: 各値の10進数、16進数、2進数を表示するプログラム
インデントをしっかりしましょう。見難くて答えるのが大変です。
提示されたソースコードに対してコメントしてみました。
まずおかしいところは、shori関数は3つの引数を取るのに、その3つとも値を読み出す前にデータを書き込んでいます。
引数にした意味がまったく有りません。変数を使いたいだけなら、普通に変数定義しましょう。
こんな感じで。
それから、main関数の中でforループを使い、xを-13から13まで変化させているのは正しいと思いますが、
shori関数はforループの外にあり、一度しか呼び出されていません。
xの各値に対して、2進数表示を求めるわけですから、forループの中でshori関数を呼ばねばなりません。
提示されたソースコードに対してコメントしてみました。
#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);
}
引数にした意味がまったく有りません。変数を使いたいだけなら、普通に変数定義しましょう。
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 回目 ]
Re: 各値の10進数、16進数、2進数を表示するプログラム
未初期化の変数N, wc, xを初期化するにはどこに何を入れればいいか教えてください。
あと2進数を表示するには%何とすればいいんでしょうか?本読んでもわからなくて・・・
あと2進数を表示するには%何とすればいいんでしょうか?本読んでもわからなくて・・・
Re: 各値の10進数、16進数、2進数を表示するプログラム
やってみたんですがどこが間違っているのでしょうか?
直していただけないでしょうか?
#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);
}
Re: 各値の10進数、16進数、2進数を表示するプログラム
何度も言っているのですが、インデントをしっかりしましょう。
特にshori関数のインデントは良くありません。
さて、main関数内部でのprintf関数の呼び出しでは、%が2つしかありません。
にも関わらず、x, x, bと3つの数値を渡しています。おかしいですよね?
あなたはご自分で「10進数:-13 16進数:fffffff3 2進数:1111 1111 1111 1111 1111 1111 1111 0011」と表示させたいとおっしゃいました。
にも関わらず、「2進数:」の後で改行してしまっています。おかしいですよね?
僕が全て直しちゃうのは簡単ですが、それではtakeruさんが力を伸ばすチャンスを奪ってしまうかもしれません。
僕は今夜、この掲示板をちょくちょく確認する予定ですから、もう少し頑張ってみませんか?
特にshori関数のインデントは良くありません。
さて、main関数内部でのprintf関数の呼び出しでは、%が2つしかありません。
にも関わらず、x, x, bと3つの数値を渡しています。おかしいですよね?
あなたはご自分で「10進数:-13 16進数:fffffff3 2進数:1111 1111 1111 1111 1111 1111 1111 0011」と表示させたいとおっしゃいました。
にも関わらず、「2進数:」の後で改行してしまっています。おかしいですよね?
僕が全て直しちゃうのは簡単ですが、それではtakeruさんが力を伸ばすチャンスを奪ってしまうかもしれません。
僕は今夜、この掲示板をちょくちょく確認する予定ですから、もう少し頑張ってみませんか?
Re: 各値の10進数、16進数、2進数を表示するプログラム
ちなみにshori関数の実装に関してのヒントです。
shori関数をxを引数として呼び出すと、xの2進数表示を出力するようにしてみましょう。
つまり、shori関数は という形になります。そして と呼び出すと、画面に とだけ表示されるようにします。
まずは以上の動作をするshori関数と、その処理関数を呼び出すだけのシンプルなmain関数だけを作ってみましょう。 これを動作させると正確に以下の出力をするようになるまで頑張りましょう。
shori関数をxを引数として呼び出すと、xの2進数表示を出力するようにしてみましょう。
つまり、shori関数は という形になります。そして と呼び出すと、画面に とだけ表示されるようにします。
まずは以上の動作をするshori関数と、その処理関数を呼び出すだけのシンプルなmain関数だけを作ってみましょう。 これを動作させると正確に以下の出力をするようになるまで頑張りましょう。
Re: 各値の10進数、16進数、2進数を表示するプログラム
作ってみました。ちょっと自分で考えて‐13から13を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>
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
のようにできるのでしょうか?
Re: 各値の10進数、16進数、2進数を表示するプログラム
これのどこにshori(x);を入れたらいいんでしょうか?いろいろやってみたんですがどれも違うみたいで・・・
Re: 各値の10進数、16進数、2進数を表示するプログラム
完成しましたら、完成版のソースコードを投稿してくださいね。
後から見た人の参考になるように。
後から見た人の参考になるように。
Re: 各値の10進数、16進数、2進数を表示するプログラム
完成版ソースコードです。
約4日間ありがとうございました。これで無事課題が提出できそうです。
#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);
}
Re: 各値の10進数、16進数、2進数を表示するプログラム
sori1とsori2の2つあるのがまずい
のではなくて、
2つの中身が同じなのがまずいです。
char型は8ビットしかないのに、
sori2関数の中身は32ビット分表示する ような中身になっております。
インデントがダメな文章は
読みにくい
ですよね。
のではなくて、
2つの中身が同じなのがまずいです。
char型は8ビットしかないのに、
sori2関数の中身は32ビット分表示する ような中身になっております。
インデントがダメな文章は
読みにくい
ですよね。
Re: 各値の10進数、16進数、2進数を表示するプログラム
ほんとインデントについては今後どうやったら正しいのか慣れていきたいと思います。
char型が8ビットなのはしりませんでした。31の部分を変えて直したいと思います。
プログラムは私としては正直納得いっているんですが、やはりレベルの高い方から見るとおかしいんですね、できたら模範解答を示してもらえないでしょうか?興味があります。
char型が8ビットなのはしりませんでした。31の部分を変えて直したいと思います。
プログラムは私としては正直納得いっているんですが、やはりレベルの高い方から見るとおかしいんですね、できたら模範解答を示してもらえないでしょうか?興味があります。
Re: 各値の10進数、16進数、2進数を表示するプログラム
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. 中の文や宣言は一段下げる。
- bitter_fox
- 記事: 607
- 登録日時: 13年前
- 住所: 大阪府
Re: 各値の10進数、16進数、2進数を表示するプログラム
参考までにお聞きしたいのですが、プログラムの作成においてどのようなエディタを使用していますか?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;
}
Re: 各値の10進数、16進数、2進数を表示するプログラム
カタカナだとまずいかも。でも、恐らく今回の課題では許容範囲。bitter_fox さんが書きました:charをintにキャストしてるのが気になるけど、大丈夫かな?
non
Re: 各値の10進数、16進数、2進数を表示するプログラム
自分のプログラムのどこがインデントを間違っているかわかりやすかったです。気を付けます。
ちなみにエディタってプログラムを作るソフトですよね?なんかあんまりよく分からないんですけどbcpad231ってのが学校から渡されてます。
お手本のプログラムを見てさすがだなぁと思いました。自分はまだはじめて1ヶ月くらいなんで全然わかっていないんですが今後はもっと本を読んで勉強していきたいと思います。
ちなみにエディタってプログラムを作るソフトですよね?なんかあんまりよく分からないんですけどbcpad231ってのが学校から渡されてます。
お手本のプログラムを見てさすがだなぁと思いました。自分はまだはじめて1ヶ月くらいなんで全然わかっていないんですが今後はもっと本を読んで勉強していきたいと思います。