ページ 1 / 1
各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月17日(木) 17:48
by takeru
数値を-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」を使用し、サブ関数もそれに合わせたサブ関数を作る。
という問題なんですがなにぶんビギナーなためまったくわかりません。簡単なプログラムを教えていただけると幸いです。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月17日(木) 18:24
by non
まず、最低限でも、-13から13まで10進数で出力するプログラムを作って添付してくださいよ。
ビギナーだから勉強するのでしょうから。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月17日(木) 18:45
by takeru
#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);
}
これであってますか?
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月17日(木) 19:17
by beatle
コードを貼り付ける場合は codeタグ で囲って下さい。
takeru さんが書きました:これであってますか?
出力は合ってますか?それくらいは自分で確かめられるはずです。
さて、なかなかいい線行ってます。あとは2進数の表示だけですね。
sori関数はint型の数値を一つ引数にとりますから、試しに何か渡し、sori関数を実行してみればどんなものか分かると思います。
それが分かれば、sori関数を文字用に改造するにはどうすればいいか、分かるかもしれません。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月17日(木) 20:30
by non
soriの関数ですが
for (i=31;i>=0,i--) {
の部分、間違ってますから、よく見てください。
あとは、呼び出すだけですね。
最初の-13から13までは、2つ刻みですからどうしましょう。
文字を'0'~'9'までは、A~Zまでとやり方は同じです。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月17日(木) 21:12
by beatle
non さんが書きました:soriの関数ですが
for (i=31;i>=0,i--) {
の部分、間違ってますから、よく見てください。
よく見たら、sori関数の他の部分にもミスがありました。括弧が足りないとか。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月19日(土) 00:16
by takeru
すいませんよく分かんないんですけどまず文字'0’から'9’ってどういうことですか?
普通の0から9とは違うんですか?
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月19日(土) 08:10
by non
takeru さんが書きました:すいませんよく分かんないんですけどまず文字'0’から'9’ってどういうことですか?
普通の0から9とは違うんですか?
文字の'0'はJISコードなら0x30です。
文字の'A'なら0x41。
文字と数値は違います。
やり方は、for (y='A'; y<='Z'; y=y+1) と同じようにすればOKです。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月19日(土) 12:41
by takeru
ちょっと色々自分でやってみたのですが全然うまくいきません。
コード:
#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進数を表示するプログラム
Posted: 2011年11月19日(土) 12:47
by beatle
まず、その非常に見にくいインデント(字下げ)をどうにかしないと、取れるバグも取れないと思いますよ。
もしかして、自分でソースコードを書いているときはちゃんとインデントされているけれど、掲示板に貼り付けるときにダメになってしまうのでしょうか?
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 01:40
by takeru
私がインデントしていないだけです。すいません。
この課題月曜に提出しなくてはいけなくて今日も一日本などを読みながらやっていましたが、一向にうまくいきません。
ホント困っています。どこをどう書き換えたらうまくいくか教えてください。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 07:51
by beatle
プログラムの回答でなくて申し訳ありませんが。興味本位で聞かせていただきます。
また後ほどプログラムの方に回答したいと思います。
takasiさんによる「アルファベット」という質問があり、その中のNo.11でtakasiさんが「sori関数」を持ちだしています。
sori関数って流行っているのですか?どういう意味でしょう。「処理」関数?
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 08:13
by takeru
多分takasiさんも同じ先生から情報を習いこの課題を出されて、この場でお聞きしているためだと思います。
その先生の教え方がサブ関数やsori関数などということを教えたうえでこの課題を出しています。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 08:54
by beatle
まず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 になるのです。
コード:
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 = 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ビット目を画面に出力するには
コード:
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ビットでしょう)
多分繰り返し処理は出来ると思いますが一応書いておきましょう。
「本当に」分からない時だけ開いて読んで下さい。
► スポイラーを表示
まずは愚直に32回繰り返してみます。
コード:
int N, int wc;
for (N = 31; N >= 0; N--)
{
wc = (a >> N) & 1;
printf("%1d", wc);
}
でもこれだと、32ビット分が一気に表示されます。例えばa = 10なら
00000000000000000000000000001010
という風に。これだと見にくいので、4ビット毎にスペースを入れてみましょう。
コード:
int N, int wc;
for (N = 31; N >= 0; N--)
{
wc = (a >> N) & 1;
if ((N % 4) == 3)
{
printf(" ");
}
printf("%1d", wc);
}
これは実はsori関数の中身と同じですね。
今まではint型で説明しましたが、char型の場合も格納できるビット数がint型より少ない、という点を除き
int型と同じですから、まったく同様の考え方で2進数に変換して表示ができます。
がんばってください。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 09:01
by softya(ソフト屋)
横からすいません。
takeruさんとtakasiさんが同じ方の場合はフォーラムルールに違反していることになりますので名前の統一をお願いします。
もし疑問がありましたら、

まで連絡を頂ければと思います。
各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 09:17
by takeru
>beatleさん細かくありがとうございます。なんとか今日1日かけて頑張って作ってみたいと思います。ただ、またうまくいかないことがあるかもしれないのでそのときはお願いします。
>softya(ソフト屋) さんすいません。takasiさんは友達で今パソコンが壊れているらしく私のパソコンをかしているためにそのようなことになってしまっているのです。今後は気を付けます。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 10:17
by softya(ソフト屋)
書かれていることがかなり矛盾していますので統一をなさって下さいとだけ言っておきます。
【補足】私としては無用な混乱を生まないようにして頂きたいだけです。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 17:51
by takeru
とりあえず数値を‐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);
}
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 18:13
by beatle
インデントをしっかりしましょう。見難くて答えるのが大変です。
提示されたソースコードに対してコメントしてみました。
コード:
#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関数を呼ばねばなりません。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 19:05
by takeru
未初期化の変数N, wc, xを初期化するにはどこに何を入れればいいか教えてください。
あと2進数を表示するには%何とすればいいんでしょうか?本読んでもわからなくて・・・
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 19:16
by beatle
変数の初期化は
のようにします。
printfでは2進数を直接表示する%指定はありません。
存在しないので、わざわざshori関数を作って1ビットずつ表示させているのです。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 20:10
by takeru
やってみたんですがどこが間違っているのでしょうか?
コード:
#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進数を表示するプログラム
Posted: 2011年11月20日(日) 20:17
by beatle
何度も言っているのですが、インデントをしっかりしましょう。
特に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進数を表示するプログラム
Posted: 2011年11月20日(日) 20:22
by beatle
ちなみにshori関数の実装に関してのヒントです。
shori関数をxを引数として呼び出すと、xの2進数表示を出力するようにしてみましょう。
つまり、shori関数は
コード:
void shori(int x)
{
...
}
という形になります。そして
と呼び出すと、画面に
コード:
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
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 21:00
by takeru
作ってみました。ちょっと自分で考えて‐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
のようにできるのでしょうか?
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 21:05
by beatle
なかなかいいですね!。進化してますよ。
さあ、あとは少しです。
ヒントを差し上げます。
hello, worldと画面に表示するには2通りのやり方があります。
まずはごく普通のやり方。
コード:
printf("hello, world\n");
今度は2回に分けるやり方。
コード:
printf("hello, "); // ここでは改行しない
printf("world\n");
どちらのやり方でも
と表示されます。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 21:15
by takeru
これのどこに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);
}
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 21:23
by beatle
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」と表示
とできる、ということが分かるかと思います。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 21:33
by takeru
ありがとうございます。これを応用して残りの文字を表示するプログラムを書き足して完成させたいと思います。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 21:34
by beatle
完成しましたら、完成版のソースコードを投稿してくださいね。
後から見た人の参考になるように。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 22:24
by takeru
完成版ソースコードです。
コード:
#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日間ありがとうございました。これで無事課題が提出できそうです。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 22:29
by non
sori1とsori2の2つあることが、大減点。
インデントができていないのが小減点。
私が、先生なら突き返す。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月20日(日) 22:47
by beatle
sori1とsori2の2つあるのがまずい
のではなくて、
2つの中身が同じなのがまずいです。
char型は8ビットしかないのに、
sori2関数の中身は32ビット分表示する ような中身になっております。
インデントがダメな文章は
読みにくい
ですよね。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月21日(月) 00:19
by takeru
ほんとインデントについては今後どうやったら正しいのか慣れていきたいと思います。
char型が8ビットなのはしりませんでした。31の部分を変えて直したいと思います。
プログラムは私としては正直納得いっているんですが、やはりレベルの高い方から見るとおかしいんですね、できたら模範解答を示してもらえないでしょうか?興味があります。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月21日(月) 01:41
by かずま
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文の終わり
} // 関数定義の終わり
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月21日(月) 02:12
by bitter_fox
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にキャストしてるのが気になるけど、大丈夫かな?
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月21日(月) 08:55
by non
bitter_fox さんが書きました:charをintにキャストしてるのが気になるけど、大丈夫かな?
カタカナだとまずいかも。でも、恐らく今回の課題では許容範囲。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月21日(月) 12:10
by takeru
自分のプログラムのどこがインデントを間違っているかわかりやすかったです。気を付けます。
ちなみにエディタってプログラムを作るソフトですよね?なんかあんまりよく分からないんですけどbcpad231ってのが学校から渡されてます。
お手本のプログラムを見てさすがだなぁと思いました。自分はまだはじめて1ヶ月くらいなんで全然わかっていないんですが今後はもっと本を読んで勉強していきたいと思います。
Re: 各値の10進数、16進数、2進数を表示するプログラム
Posted: 2011年11月22日(火) 18:07
by takeru
ありがとうございました。