二進数に変換

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

二進数に変換

#1

投稿記事 by りょうすけ » 18年前

下のソースの二進数に関数を一般的なのもに書き換えたいのですが、書き方が解りません。
9文字以内を無視する仕様になっていますが何桁でも入力できるように直したいです。
0~256の範囲の整数で'0'~'9'以外の文字が入力されたらエラーになる仕様ですが
if(dec >= 0 && dec <=255)と書いたのに255以上も処理されてしまいます。
どなたか分かる方教えていただけると助かります。よろしくお願いします。


#include <stdio.h>

void main(){
    int data[1] = {0};
    int i= 0;
    int ch;
    int cnt;
    unsigned char dec;
    char *print_bin(unsigned int);


        printf("数値入力:");
        
        while( (ch = getchar()) != '\n' ){  // 1件分の入力処理
            if( i < 9 ){                    // 9桁までを有効
                if( ch >= '0' && ch <= '9' ){   // 数字文字
                    data[cnt] = data[cnt] * 10 + ch - '0';
                }
                else{
                    printf("Error!!:数字文字以外の入力\n");
                    return;
                }
                i++;
            }
        }
        if( i == 0 ){   // 改行のみの入力
            printf("Error!!:改行のみの入力\n");
            return;
        }
    
    dec = data[0];
    if(dec >= 0 && dec <=255){ //0-255の文字
        
    printf("dec=%d hex=%x  bin=%s\n", dec,dec,print_bin( dec ));
    
    dec = dec >> 1;
    printf("右に1ビットシフトdec=%d hex=%x bin=%s\n",dec,dec,print_bin( dec ));
    
    dec = dec << 1;
    printf("左に1ビットシフトdec=%d hex=%x bin=%s\n",dec,dec,print_bin( dec ));
        
    dec = ~dec;
    printf("全ビット反転dec=%#d hex=%#x bin=%s\n",dec,dec,print_bin( dec ));
    
    }
    else{
        printf("Error!!:0-255以外の入力\n");
    }
}

char *print_bin( unsigned int x ){
    static char  out[10];
    unsigned int n, i, j; 
    n = 1<<7;
    j = 0;
    for( i=0; i<8; i++ ){
        if( x&(n>>i) )
            out[j]='1';
        else
            out[j]='0';
            j++;
        if( i%4==3 ){
            out[j]=',';
            j++;
        }
    } 
    out[j-1] = '\0';
    return out;
}

keichan

Re:二進数に変換

#2

投稿記事 by keichan » 18年前

unsigned char型は 0~255 までの数値しか扱えません。

変数decの型を int にすれば if(dec >= 0 && dec <=255) の処理は正常に動作するでしょう。

他にやってはいけない箇所が数点見られますが、それはトライ&エラーで考察してみてください。

Blue

Re:二進数に変換

#3

投稿記事 by Blue » 18年前

http://hpcgi3.nifty.com/mmgames/patio/p ... ew&no=1560
はどうなったのでしょうか?
できなくても先に進んでいくのでしょうか?
それとも、回答をもらえればそれでいいってことでしょうか?(自己中杉)

りょうすけ

Re:二進数に変換

#4

投稿記事 by りょうすけ » 18年前

Blue様回答ありがとうございます。

http://hpcgi3.nifty.com/mmgames/patio/p ... ew&no=1560 方もやっています。

両方とも課題として出ているので同時進行でやっています。

大阪慕情

つまらないもんですが・・・・・・・・・

#5

投稿記事 by 大阪慕情 » 18年前

#include <stdio.h>
#include <stdlib.h>
#define NUM 30
#define DC 2
#define ZERO 0
int main(void){
	int ans=ZERO;
         char ap[NUM],bp[DC]="01",*cp;
	memset(ap,Ox00,NUM);
	cp=&ap[NUM-1];
	printf("INPUT=");scanf("%d",ans);
	if(ans<=ZERO) return(ZERO);
	while(ans!=1){
		*cp=bp[ans%DC];
		ans/=DC;
		cp--;
	}
	printf("%s\n",*cp);
	return(ZERO);
}

りょうすけ

Re:二進数に変換

#6

投稿記事 by りょうすけ » 18年前

大阪慕情さま、回答ありがとうございます。
scanfは使ってはいけない使用なので、getcharを使うとどうなるのでしょか。

管理人

Re:二進数に変換

#7

投稿記事 by 管理人 » 18年前

getchar関数を使えばいいとわかっているのならその関数についてまず調べてみてください。
このように調べればたくさん出てきます。

http://www.google.co.jp/search?hl=ja&q=getchar&lr=

while( (ch = getchar() ) != EOF ){

として取り込むのが一般的ですが、
最初はどうなっているのかわかりにくいので1行ずつ書いてみるといいでしょう。

getcharでとってきた1文字をchに代入し、それがエンドオブファイルじゃないかぎりループと言う意味です。

りょうすけ

Re:二進数に変換

#8

投稿記事 by りょうすけ » 18年前

管理人様、返信ありがとうございます。
作り直したのですが、000と入力しても0に認識して表示されてしまいます。
どのように直せば直るでしょうか?
#include <stdio.h>
static char  out[10];
void main(){
	int data=0;
	int i= 0;
	int ch;
	int cnt;
	unsigned short dec;
	void *print_bin(unsigned int);


		printf("数値入力:");
		
		while( (ch = getchar()) != '\n' ){	// 1件分の入力処理
			if( i <=3 ){// 9桁までを有効
				if( ch >= '0' && ch <= '9' ){	// 数字文字
					data = data * 10 + ch - '0';
				}
				else{
					printf("Error!!:数字文字以外の入力\n");
					return;
				}
				i++;
			}
			else{
				printf("Error!!:0-255以外の入力\n");
				return;
			}
		}
		if( i == 0 ){	// 改行のみの入力
			printf("Error!!:改行のみの入力\n");
			return;
		}
	
	dec = data;
	if(dec >= 0 && dec <=255){ //0-255の文字
		print_bin(dec);	
		printf("dec=%d hex=%x  bin=%s\n", dec,dec,out);
		print_bin(dec>>1);
		printf("右に1ビットシフトdec=%d hex=%x bin=%s\n",dec>>1,dec>>1,out);
		print_bin(dec<<1);
		printf("左に1ビットシフトdec=%d hex=%x bin=%s\n",dec<<1,dec<<1,out);	
		print_bin(~dec);
		printf("全ビット反転dec=%#d hex=%#x bin=%s\n",~dec,~dec,out);
	}
	else{
		printf("Error!!:0-255以外の入力\n");
	}
}

void *print_bin( unsigned int x){
	int a[9] = {1,2,4,8,0,16,32,64,128};
	int i;
	out[9] = '\0';
	
	for(i=8;i>=0;i--){
		if(i==4){
			out = ' ';
			continue;
		}
		if((x & a) > 0){
			out = '1';
		}else{
			out = '0';
		}

	}
}

りょうすけ

Re:二進数に変換

#9

投稿記事 by りょうすけ » 18年前

解決しました。皆さんありがとうございました。

プロのSEです。

無題

#10

投稿記事 by プロのSEです。 » 18年前

意見ですが、ポインタや配列について、大阪慕情さんは、精一杯尽くした筈です。
質問者さんは、getchar()で質問するところを見ると、疑問符がついてしまいます。
プログラミングは、データを如何に読み取ってアルゴリズムを組み立てるかでその資質が、問われます。
すぐに書き込みをする前に、ある程度基本を勉強しましょう。
基本が、大切です。

閉鎖

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