トップページ⇒tech
80コメント26KB

きれいなコードを書きませう

■ このスレッドは過去ログ倉庫に格納されています
0001お題1NGNG
入力された値を2進数で表示しなさい。
0002これでイッパイイッパイ…NGNG
#include<stdio.h>

#define BITS 32

int main(void)
{
int x;
int i;
char str[BITS+1];

scanf("%d",&x);

for(i=0;i<BITS;i++)
str[BITS-1-i] = x&(1<<i)?'1':'0';
str[BITS] = 0;

printf("%s\n", str);

return 0;
}
0003デフォルトの名無しさんNGNG
>>1
'b'(=binary)を解釈するprintf作れ
myprintf("%b\n",100);
->1100100
0004デフォルトの名無しさんNGNG
bitdump(void *ptr,int bits)
{
int i;
for(i=bits;i>0;i--)
putch('0'+(ptr[i>>3]&(1<<(i&7))));
}
0005デフォルトの名無しさんNGNG
>>4
ちゃんとコンパイルしたのか?
void*型の配列参照なんてできないはずだが。意味も違ってるし
0006デフォルトの名無しさんNGNG
とりあえずベタでやってみました。

main(int argc,char* argv[]){
int value,i,flag = 0;
char str[33]; str[32] = 0;
if(argc!=2)return;
value =atoi(argv[1]);
if(value < 0 ){value= 0 - value ;flag = 1;}
for(i = 31 ;value!= 0;value =(value >> 1), i-- )
{str[i] = '0' + value%2 ;}
if( flag ){str[i]='-';printf(&str[i]);}
else printf(&str[i+1]);
}
0007not 4NGNG
>>5
確かにコンパイル通らなかったよ…
bitdump(int *ptr,int bits)
...
int x = 30;
bitdump(x, 32);
にしてコンパイル通したけどちゃんと動かなかった…
つかさっぱり理解できない…
俺が馬鹿だからなのか?
00081(初心者)NGNG
>>3
可変引数から勉強しなきゃ(汗

鬱だ私脳
0009デフォルトの名無しさんNGNG
1のお題は標準入出力に限定してないだろ?

int value = InputIntValue();
ShowString(IntToStrAsBinary(value));

関数の中身は後で考えよっと
0010デフォルトの名無しさんNGNG
なんだ。
きれいなコードを書く規約について話し合うスレかと思ったら
学校の宿題をやってもらうスレか。
00111(ツマルじゃないよ)NGNG
>>10
学校の宿題じゃないよう。
http://piza.2ch.net/test/read.cgi?bbs=tech&key=987485622&ls=50
を見てきれいに書いてみようと思ったのだよう。
でもあんまりきれいに書けなかったからスレ立ててみたのだ。

つか学校の宿題でこんなことわからない奴は「可変引数」って言葉自体知らないだろうよう。
0012デフォルトの名無しさんNGNG
>>6
あんまりきれいじゃないような。
それとprintf(&str[i]);って
printf(str+i)じゃだめなの?
0013デフォルトの名無しさんNGNG
>>2 みたいな入力、出力とメインの処理を同じ関数のなかに
書く programmingってのはだれが普及させたんだ?
たまに見るけど、BASICの頃を思い出させて鬱。

void printbin(unsigned int n, FILE *out) {
if (n) printbin(n>>1, out);
putc((n&1)? '1' : '0', out);
}
ネタいぜ

00142NGNG
>>13
スマンね。
短いから別にいいかなと。
0015デフォルトの名無しさんNGNG
>>12
同じ事だろ
0016デフォルトの名無しさんNGNG
>>13
すっげーきれい
0017ツマルNGNG
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *bin8(int bin);

int main(int argc, char *argv[])
{
int bin;

if(argc != 2){
printf("コマンドの入力形式が間違っています.\n");
return(1);
}
bin = atoi(argv[1]);
printf(">>>%s\n", bin8(bin & 0xFF));
printf(">>>%s\n", bin8((bin >> 8) & 0xFF));
printf(">>>%s\n", bin8((bin >> 16) & 0xFF));
printf(">>>%s\n", bin8((bin >> 24) & 0xFF));

return(0);
}

char *bin8(int bin)
{
static char
result[10];
int i1;

result[8] = '\0';
for(i1 = 0; i1 < 8; i1++){
if(bin % 2 == 0)
result[(8-1)-i1] = '0';
else
result[(8-1)-i1] = '1';
bin = bin / 2;
}
return(result);
}
0018よっぱらいなてんさいぷろぐらむぁ(偽)NGNG

void OutBit(unsigned int uDec, FILE *Out)
{
  unsigned int uBit;
  uBit = 1U << (sizeof(uBit;) * 8);
  while(uBit >> 1){
    fputc((uBit & uDec) ? '1' : '0', Out);
  }
}

/*
つーかよっぱらいだから頭まわらないにょ
おおまちがいや無駄が多いかもでにょ
もうねるにょ〜
*/

/*
>>13
つーか1ビットごとに再起は速度がきになるにょ
再起の悪い例のような・・・
*/
0019デフォルトの名無しさんNGNG
>>18
おお、エレガントやぁ
0020よっぱらいなてんさいぷろぐらむぁ(偽)NGNG
void OutBit(unsigned int uDec, FILE *Out)
{
  unsigned int uBit;
  uBit = 1U << (sizeof(uBit) * 8);
  while((uBit >> 1)){
    fputc((uBit & uDec) ? '1' : '0', Out);
  }
}
/*
あるこーるがぷっぷくぷ〜♪
*/
0021よっぱらいなてんさいぷろぐらむぁ(偽)NGNG
全然関係ないけどあるこーるってこわいっす。
さっきフロッピーのけーすふんずけた足が痛いなぁと思ってたら
ざっくり切れてて床が血の海になってたよーん
がむてーぷはってから寝よう・・・
0022デフォルトの名無しさんNGNG
>>20
uBit = 1U << (sizeof(uBit) * 8);って0になるよ。
0023デフォルトの名無しさんNGNG
ところで、上にあげたソース、ちょっと書き換えただけで
他のN進数に対応できますか?
例えば4進数、8進数、16進数とかに。
16進数の場合は、数字以外に文字が関係してきますから、
その対処をしなきゃならいと思いますが。
0024デフォルトの名無しさんNGNG
char *itobin(int n, char *buf, int sizeofbuf)
{
 char *ret = buf + sizeofbuf;
 *--ret = '\0';
 do{
  *--ret = (n & 1)?'1':'0';
  n /= 2;
 }while(n>0);
 return ret;
}

int main(int argc, char* argv[])
{
 char buf[256];
 printf("%s", itobin(5, buf, sizeof(buf)));
 return 0;
}

>23それはほんとの厨房レベル。綺麗も糞もない。
0025デフォルトの名無しさんNGNG
>>23
簡単なのは"0123456789abcdef"
で2-16まで対処するとか。
002624NGNG
  *--ret = (n & 1)?'1':'0';
は
  *--ret = '0' + n & 1;
のがクレバーで良いかも(藁
0027よっぱらいなてんさいぷろぐらむぁ(偽)NGNG
>>22
布団に入ってから気が付いて見てみたら・・・
ナイス突っ込み!!
引数はunsigned charとかより低いビット数ぢゃなきゃだめだねぇ
読みだし用の変数がでかくないと超えちゃいますわな
スマソ
0028デフォルトの名無しさんNGNG
dispbin(int n)
{
 char buffer[32];
 _itoa(n, buffer, 2);
 printf("%s", buffer);
}
002928NGNG
これが一番マトモだろ。
>入力された値を2進数で表示しなさい。
なんだから 藁
0030よっぱらいなてんさいぷろぐらむぁ(偽)NGNG
/*
ああ変なことかいてるなー
一応修正(よっぱらいだからまだ間違えてるかも)
つーか本当に寝る
*/
void OutBit(unsigned int uDec, FILE *Out)
{
  unsigned int uBit;
  uBit = 1U << ((sizeof(uBit) * 8) - 1);
  do{
    fputc((uBit & uDec) ? '1' : '0', Out);
  }while((uBit >> 1))
}
0031デフォルトの名無しさんNGNG
N進数に対応版
ただし、正の整数のみ対応。
マイナスは・・・気にするな(笑)

#include <stdio.h>
#include <string.h>
#define N 2 // N (<10) 進数を決める

int main(void)
{
char n[20];
int x, i=0;

printf("Input x > ");
scanf("%d",&x);
if(x < 0)
return(1); // マイナスは無視

while(x != 0) {
n[i] = (x%N)+48; // ASCII コードに対応させる
x /= N;
i++;
}

for(i--; i >= 0; i--)
printf("%c",n[i]);

printf("\n");
return(0);
}
0032デフォルトの名無しさんNGNG
>>24
同じ事だけど
n /= 2よりも
n >>= 1のほうが意味も分かりやすいし
きれいなコードって意味ではいいんじゃないかな。

重箱の隅をつっつくようなレスでスマソ。
0033デフォルトの名無しさんNGNG
>>28,29
おお、スゲ。
っていうか、このお題でこれ以外の回答してる奴は逝ってよしだな。
現場でこれ以外のコード書いたら保守大変なだけだぞ
0034よっぱらいなてんさいぷろぐらむぁ(偽)NGNG
本当に寝る前の最後の書き込み
>>32
みて気が付いたけど
>>30は
((uBit >> 1)) -> ((uBit >>= 1)) だね欝だ・・・

>>33
つーかこれって宿題お勉強スレでしょ?
0035よっぱらいなてんさいぷろぐらむぁ(偽)NGNG
読み出しビットはループで初期化で
0036デフォルトの名無しさんNGNG
これでジ・エンド?
0037デフォルトの名無しさんNGNG
>>34

>入力された値を2進数で表示しなさい。
条件はコレだけじゃん。
これ以上の要求は皆無
0038デフォルトの名無しさんNGNG
みんなボクの宿題手伝ってくれてありがとう
0039デフォルトの名無しさんNGNG
>>28-29=>>33=>>37
寒い。
0040みさきちNGNG
なぁ、1進数ってどんなん?
0041知ったか君NGNG
>>40
多分0の個数で表すんだよ(ワラ
1->0
6->000000
0042知ったか君NGNG
いや、0を使わなくてもいいんだろうけど
10進数->10増えるごとに桁が増える
2進数->2増えるごとに...
1進数->1増えるごとに...
だよ。
0043みさきちNGNG
あっ、やっぱり・・・。それじゃ何が何だか分かりませんね(笑)
0044デフォルトの名無しさんNGNG
>>42
ですから、1増えるごとに桁が増えていくんですけど、
それをどうやって表すんですか?
2進数の時点で1と0しか使われていないんですから、
1進数になったら・・・。
0045知ったか君NGNG
>>44
>>41で書いたみたいに...(ワラ
0046デフォルトの名無しさんNGNG
いーみなーいじゃーん(笑)
0047デフォルトの名無しさんNGNG
だっ、誰か!
0の発見に続く大発見!
1進数を発見してくれ!
0048デフォルトの名無しさんNGNG
0でない値を表記しようしたら「無限回」繰り上がっちまうぞ。
発見したはよいが、つかいもんにならん。
0と0以外しか区別できん。
#ん?Boolean?
0049デフォルトの名無しさんNGNG
ん?ブーリン?飛んでブーリン?
なんてボケは置いておいて。
ブール型変数だって結局のところ0と1、
もしくは true false なんでしょ?
だったら2進数みたいなもんじゃん。
0050デフォルトの名無しさんNGNG
2進数「の1つのケタ」がBooleanなのでわ?
1進数だと、全ケタを使ってソレだけしか表現できない
んでわないかなと…というのが前述の主旨。
0051デフォルトの名無しさんNGNG
>>48
無限回繰り上がる?
>>41-42みたいになるんじゃないのか?
0052デフォルトの名無しさんNGNG
>2進数「の1つのケタ
それが0と1で構成されているわけでしょ?
んで、1進数いうたら1増えたら桁があがるわけじゃん。
やっぱりずっと0じゃん。
0053デフォルトの名無しさんNGNG
n進数m桁で表現できる数はn^m(nのm乗)。
だから、1進数だと1^m=1で、1種類の数しか表現できない。
0054デフォルトの名無しさんNGNG
1進数は無いということで。
0055デフォルトの名無しさんNGNG
>>53
まあ、それはそうなんだけど…。

>>41
は惜しいなあ。その表記法で0と1さえ区別できれば。
005613NGNG
>>13 誰も突っ込まないけど、あれ、bugがあるぞ。
0を表示できない(w
0057デフォルトの名無しさんNGNG
>>56
表示できるぞ?
0058知ったか君NGNG
>>53-54
そういうものか…

>>41の訂正(?)なんだけど
1->0
6->000000
じゃなくって
0->0
1->00
6->0000000
の間違いですね。多分。
いや、どっちにせよ間違ってる(ないのなら)んだろうけど。
0059デフォルトの名無しさんNGNG
>>58

> 0->0
> 1->00
> 6->0000000

むしろ、0のとき何も書かないって方が徹底している。

0 -> ''
1 -> '0'
2 -> '00'
 :

これで小数とか考えなければ表現法としてはありうるけど、
結局は'0'の個数で自然数を表しているに過ぎないわけ。
0060デフォルトの名無しさんNGNG
つまり指折り数えてるわけね(w
0061知ったか君NGNG
>>59
> むしろ、0のとき何も書かないって方が徹底している。
> で小数とか考えなければ表現法としてはありうるけど、
> は'0'の個数で自然数を表しているに過ぎないわけ。

二進数や十進数とか他のn進数の法則を自然に一進数に適用すれば
あなたの言うようにはならないと思うよ。
0062132人目の素数さんNGNG
http://cheese.2ch.net/test/read.cgi?bbs=math&key=987540711
0063デフォルトの名無しさんNGNG
数学板は電波の巣窟ってことですか?
0064デフォルトの名無しさんNGNG
m進数、という言葉の通常の定義から、n桁のm進数では
m^n 通りの数が表現できるので、1進数だと何桁使っても
1 つの数(0ね)しか表現できない。

一進数には、0 という一つの数字しか存在し得ないってこと。
あまり実用的ではないと思う。

数字を表す記号の数=基数じゃなくても良いなら、ローマ数字
みたいな位取りの概念の無い記数法として存在するけど。
0065知ったか君NGNG
>>64
まあ確かに
00も000も00000000000000も
1でなく2でもなく13でもなく0だよな(ワラ
0066デフォルトの名無しさんNGNG
>>51
ならん。

>>52
>んで、1進数いうたら1増えたら桁があがるわけじゃん。
>やっぱりずっと0じゃん。

そう。「ずっと」0なの。0の数は無限個。
1増えて桁が繰り上がると、その次の桁が1(2以上進数)になるけど、
するとその桁がまた繰り上がりしないとならん。
以下、無限繰り返し。だべ?
0067デフォルトの名無しさんNGNG
ツマルタン、ハァハァ・・・
0068デフォルトの名無しさんNGNG
>>61
> 二進数や十進数とか他のn進数の法則を自然に一進数に適用すれば
> あなたの言うようにはならないと思うよ。
自然な拡張では一進法は0以外表せないのだから、人工的に回避するしかないということ。
人工的ならば利便性から何種類も考えられるわけだ。
たとえば0で表すのをやめて1を用いるとか…。そうすると>>59と似たり寄ったりだが、
 0 -> ''
 1 -> '1'
 2 -> '11'
  :
ってな具合だ。とにかく一般のm進法にさらに新しい約束事を取り入れなければ
うまくいかないだろう。

0069デフォルトの名無しさんNGNG
0ってもともと無いものを表記するためにあるもんじゃないの?
つまり、0が続く数値というのは、無いということで、
1進数は無い!んじゃないの?
0070デフォルトの名無しさんNGNG
>>69
とっくにそのような結論に至ってると思われ。
0071知ったか君NGNG
>>68
うん。そうだね。まあ無いってことだね。
0072デフォルトの名無しさんNGNG
0 -> '0'
1 -> '1'
2 -> '11'
ではDaMe?
0073知ったか君NGNG
>>72
やっぱそうなるのかねぇ?
でも0に1足して桁(位)あがらないってのはなんかねぇ。
0074デフォルトの名無しさんNGNG
>>72
m進法ならばm種類の記号しか用いないのでわ?
0075デフォルトの名無しさんNGNG
0進数とか-1進数とかi進数は、どうなるの?
0076デフォルトの名無しさんNGNG
>>75
あのぉ、0進数って矛盾してません?
だって、進数という部分集合に入りませんよ?
0077デフォルトの名無しさんNGNG
>>74
一般論で言えばそうだけど、
理論的には「記号の数 ≧ 位取りの基数」なら良いの。
たとえば、ソロバンは10進数だけど記号は11種類ある。
で、こういう、>>68みたいな「記号の多い1進数」の
例がローマ数字だってことも激しく既出。

>>75
-1 進数は (0,1) の二個の記号を 0 と 1 の意味で用いれば、
任意の整数を表現でき、i進数では真意の整複素数を表現できる。
0078デフォルトの名無しさんNGNG
>>77
古いソロバンね。
0079デフォルトの名無しさんNGNG
> -1 進数は (0,1) の二個の記号を 0 と 1 の意味で用いれば、
> 任意の整数を表現でき

意味不明
0080デフォルトの名無しさんNGNG
-1 進数 -> 10進数
0 -> 0
1 -> 1
10 -> -1
11 -> 0
100 -> 1
101 -> 2
110 -> 0
111 -> 1
1000 -> -1
1001 -> 0
1010 -> -2
..
てな感じで、位取りが -1の場合、
0 に相当する数字と、1 に相当する数字があれば、
整数全てが表現できる、ってことだよ。

表現力が無くて悪かったよ。
■ このスレッドは過去ログ倉庫に格納されています