1

10 進数を 2 進数から 16 進数 (2,3,4,....,15,16) に変換するプログラムを書いています。これは私がこれまでに持っているもので、2 から 15 までの任意の数を実行すると無限ループになります。私のプロジェクトの残りについて何かアドバイスがあればと思っていました。実行すると、これは 2 つの整数を要求します。1 つ目は 0 より大きい 10 進数の整数で、2 つ目は変換先の基本型でなければなりません。これを完了するためのあらゆるアドバイスをいただければ幸いです。ありがとうございました。

#include <stdio.h>
#include <stdlib.h>

int main(void){

  int x, y, z, c;

  printf("Please enter two integers: ");
  scanf("%d", &x);
  scanf("%d", &y);

  printf("%d\n", x);
  printf("%d\n", y);
  printf(" \n");

  if(y < 2 | y > 16){
    printf("You have entered incorrect information.\n");
           return 0;
  }
  else if(y > 1 && y < 16){

       while(z != 0){
       z = (x/y);
       c = (x%y);
       printf("%d\n", z);
       }
    printf("%d\n", z);
    printf("%d\n", c);
  }
      else if(y == 16){
        printf("%X\n", x);
      }

}

** * ** * ** * ** * ** * ** * ** * *編集* ** * ** * ** * ** * ** * ** * ** *

#include <stdio.h>
#include <stdlib.h>

int main(void){

  int x, y, z, c, i;

  printf("Please enter two integers: ");
  scanf("%d", &x);
  scanf("%d", &y);

  printf("%d\n", x);
  printf("%d\n", y);
  printf(" \n");

  if(y < 2 || y > 16){
    printf("You have entered incorrect information.\n");
           return 0;
  }
  else if(y > 1 && y < 17){

    while(x != 0){
       c = (x%y);
       x = (x/y);

       if( c > 1 && c < 10){
       printf("%d", c);

    }else if( c == 10){
        c = printf("A");
    }else if( c == 11){
        c = printf("B");
    }else if( c == 12){
        c = printf("C");
    }else if( c == 13){
        c = printf("D");
    }else if( c == 14){
        c = printf("E");
    }else if( c == 15){
        c = printf("F");
   }
  }
    printf("\n");
}

これが私がこれまでに達成した進歩です。私の問題は次のとおりです。数値 10 ~ 15 を表すために AF が正しく出力する値を取得できません。また、整数を正しい方法で表示することもできません。これは簡単に修正できると思いますが、まだ慣れていないコマンドです。ご協力いただきありがとうございます。非常に有益でした。

** * ** * ** *編集 2** * ** * ** * ***

#include <stdio.h>
#include <stdlib.h>

int main(void){

  int x, y, z, c; //Sets up variables to be used in program

  printf("Please enter two integers: "); //Asks for user input
  scanf("%d", &x);
  scanf("%d", &y); //stores input

  printf("%d\n", x);
  printf("%d\n", y);
  printf(" \n");

  if(y < 2 || y > 16){
    printf("You have entered incorrect information.\n");
           return 0;
  } //bug checks

  else if(y > 1 && y < 17){

    while(x != 0){
       c = (x%y);
       x = (x/y); // Loops numbers until a 0 value is reached, can be used with
                  // any Base

     if( c == 10){
        c = printf("A");
    }else if( c == 11){
        c = printf("B");
    }else if( c == 12){
        c = printf("C");
    }else if( c == 13){
        c = printf("D");
    }else if( c == 14){
        c = printf("E");
    }else if( c == 15){
        c = printf("F");
    }else{
        printf("%d", c);
    }
     // Returns for each remainer option
    }
    printf("\n");
  }
}

OK三回目は魅力です。私のコードで現在抱えている唯一の問題は、逆順、つまり適切な順序で出力する方法がわからないことです。2 回目の編集は無視して、自分で解決しました。どんな入力でも素晴らしいでしょう。どうすれば逆に出てくるのかよくわかりません。みんな、ありがとう!

4

6 に答える 6

3

これは楽しいです。いくつかの提案:

  • 説明的な変数名 (基数、剰余、数字、数値など) を使用する
  • %X を使用するのは間違っています。
  • duodedecimal (sp?)、base 36 のサポートはどうですか?
  • 9 より大きい数字記号の便利な記号 (文字?) を出力します
  • 終了条件を考慮してください。z(剰余)を変更していないため、ループ
  • 左から右ではなく、右から左の逆順で番号を印刷していました

このバージョンは、基数 36 まで、数字記号 > 9 の文字を出力し、逆順と期待される順序の両方を出力します...

#include <stdio.h>
#include <stdlib.h>

char BASIFICATION[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
int MAXBASE=36;
int main(void)
{
  int done=0;
  long num, base, remainder, digit;

  printf("Number Base Convertificator\n");
  printf("(enter 0 0 when done)\n");
  while( !done)
  {
    printf("Please enter two integers: ");
    scanf("%d", &num);
    scanf("%d", &base);
    if( (base<2) || (base>MAXBASE) ) //avoid precedence until you are comfortable/confident with it
    {
      printf("Please enter base between 2 and %d.\n",MAXBASE);
      if(base<=0) done=1;
      continue;
    }
    printf("%d\n", num);
    printf("%d\n", base);
    printf("\n");
    if(base == MAXBASE) //cheaters never win!
    {
      printf("%XX\n", num);
      continue;
    }
    //if(base > 1 && base < MAXBASE)
    {
      char reversed[99], ndx=0;
      //this prints your digits in reverse order
      remainder = num;
      while(remainder > 0) //numerical methods, avoid skipping below zero (irrelevant here, but good habit)
      {
         digit = (remainder%base);
         remainder = (remainder/base);
         printf("%c ", BASIFICATION[digit]);
         //printf("%c %d (%d)\n", BASIFICATION[digit], digit, remainder);
         reversed[ndx++] = BASIFICATION[digit];
      }
      printf("\n");
      //reverse digits to print in expected order
      for( ; ndx>0; ) { printf("%c ",reversed[--ndx]); }
      printf("\n");
    }
  }
}

そして実行すると、

Number Base Convertificator
(enter 0 0 when done)
Please enter two integers: 1020 2
1020
2

0 0 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 0 0 
Please enter two integers: 252 16
252
16

C F 
F C 
Please enter two integers: 99 
8
99
8

3 4 1 
1 4 3 

では、これをどのように変更して、入力文字列を指定された基数に変換しますか?

于 2013-10-03T04:55:33.293 に答える
1

xはこのループで変更されないため、z常に同じ値が計算され、ループが終了することはありません。

   while(z != 0){
   z = (x/y);
   c = (x%y);
   printf("%d\n", z);
   }

数値を基数の差に変換するには、通常、数値を基数で繰り返し割り、剰余から数字を求めます。これにより、数字が最後から最初に出力されます。

   while(x != 0){
      c = (x%y); /* remainder of x when divided by y */
      x = (x/y); /* x divided by y */
      printf("%d\n", c);
   }
于 2013-10-02T22:52:14.607 に答える
1

ドライランと呼ばれる古いスタイルのデバッグ プロセスの紹介

x  y  z c (z != 0) 
16 2  8 0  true
      8 0  true DOH!
于 2013-10-02T22:55:27.327 に答える
0
#include <stdio.h>
void main(void) {
    char base_digits[16] =
        {'0', '1', '2', '3', '4', '5', '6', '7',
         '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

    char converted_number[32];
    long int number_to_convert;
    int base, index=0;

    printf("Enter number and desired base: ");
    scanf("%ld %i", &number_to_convert, &base);

    while (number_to_convert != 0)
    {
        converted_number[index] = base_digits[number_to_convert % base];
        number_to_convert = number_to_convert / base;
        ++index;
    }
    --index;
    printf("\n\nConverted Number = ");
    for(  ; index>=0; index--)
    {
        printf("%c", converted_number[index]);
    }
    printf("\n");
}
于 2016-04-22T13:11:57.887 に答える
0

このプログラムの目的は、数値を他の基数に変換する方法を学習することであり、簡単な方法を試すだけではありませんprintf。試してみませんか:

if (y > 1 && y <= 16) {
     parsedNumber = convert(x, y);
} else {
     reportIllegalBase(y);
}

適切な方法で?

また、変数名にxandを使用しないでください。yコードゴルフをプレイするためではなく、理解のためにこれを書いています。

また、これをより汎用的なプログラムにするようにしてください。計算時にすべてを出力する代わりに、文字列 (a char[]) を作成して出力します。したがって、convert私が提案した関数は次のように宣言する必要があります。

char[] convert(const int number, const int base) {...}

また

void convert(int * const buffer, const int number, const int base) {...}

ところで、xが負の場合はどうなるでしょうか。あなたが正しいことをしているかどうかはわかりません。x最初にユーザーから取得し、次にユーザーから取得することがyできます。そうすれば、ユーザーが次の1代わりに入力した場合に、ユーザーに 2 回目のチャンスを与えることができ16ます。

int getBase() {
    int base;
    while(true) {
        printf("Please type in the base: ");
        scanf("%d", &base);
        if (base > 1 && base <= 16) {
            return base;
        } else {
            printf("\nThe base must be between 2 and 16 inclusively.  You typed %d.\n",
                base);
        }
     }
}

ちなみに、標準ではありませんが、より高い塩基を使用するのには理由があります. 私がNathaniel S. Borenstein著「 Programming as if People Mattered 」 (ISBN 0691037639) というタイトルの本では、大学がランダムに生成された ID を宛名ラベルに印刷した状況について説明しています。残念ながら、ID が2378gw48fUCk837he294ShiT4823のように見える場合があり、受信者は学校が彼らをののしっていると思っていました。

それらの ID に表示されるべきではない単語を提案する委員会が招集されました。学生インターンは、委員会を不要にするためにこのアイデアを思いつきました:基数 31 を使用し、母音を省略します。 つまり、ベース 31 の数字として0123456789bcdfghjklmnpqrstvwxyzを使用します。これにより作業が削減され、多くのプログラミングが不要になり、人々は職を失いました。

于 2013-10-02T23:05:37.853 に答える