• 締切済み

0と1の足し算について

0と1の2進数の値を、足し算するプログラムを作成したいのですが、どのよに、桁を上げれば良いか解らないので教えてください。宜しくお願いします。 内容は次の通りです。 1.キーボードから入力されるものとし、入力される値は2進数と符号プラス(+)のみとします。加算する桁数は4桁とします。 2.2進数の値を加算させ、加算方法を記述したコードを用いる。 3.printf以外の関数は使用しない。 4.出力する際は、int型、char型でも構わない。 5.コマンドプロンプトを用いて、入力し出力する際は、以下の通りに出力する。 (入力例) 1111 + 1111 [Enter] (加算する値と値の間にプラスの符号(+)を入力させ[Enter]キーを入力。 (出力例) 1111 + 1111 = 11110 ([Enter]キーを押されたら式と、その合計を出力させる。

みんなの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

環境不明なので、C99の範囲で書いていました。 #include <stdio.h> #include <stdlib.h> #define bin2i(str, result) \  do { \    for (int i = 0; i < 4; i++) \    { \     (result) <<= 1; \     char c = (str)[i]; \     if (c != '0' && c != '1') return EXIT_FAILURE; \     (result) += c - '0'; \    } \    if ((str)[4] != '\0') return EXIT_FAILURE; \  } while (0) #define printbin(x) \  do { \    for (int i = 4; i >= 0; i--) \    { \     printf("%d", ((x) >> i) & 1); \    } \    printf("\n"); \  } while (0) int main(int argc, char *argv[]) {  if (argc != 4) return EXIT_FAILURE;  unsigned int lhs = 0;  unsigned int rhs = 0;  bin2i(argv[1], lhs);  if (argv[2][0] != '+' || argv[2][1] != '\0') return EXIT_FAILURE;  bin2i(argv[3], rhs);  unsigned int result = lhs + rhs;  printbin(result);  return EXIT_SUCCESS; }

すると、全ての回答が全文表示されます。
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.5

>入力される値は2進数と符号プラス(+)のみとします。 >加算する桁数は4桁とします。 >コマンドライン引数で入力された値を受け取ります。 ★コマンドラインから与える引数はひとつで、先頭を 1 とし、中央を + 、中央の次を 1、残りを 0 または 1 とした長さ9の文字列ですね。  (スペースで区切られない=ひとつの引数)  >Hoge.exe xabc+ydef[enter] x,y には 1 が入る。a,b,c,d,e,f には、それぞれ 0 または 1 が入る。 ★との前提で暇な年寄りが・・・  (加算方法として) ・入力された '0'(0x30) または '1'(0x31) は文字ですので、0x01 でマスクし、数にして加算。 ・下位桁の繰り上げ加算。 ・結果を文字にして格納。 なお、プログラムでは、2つの2進数の4桁目( x,y )が 0 の場合(2進数3桁)にも対応します。 #include <stdio.h> #include <stdlib.h> void ErrorStop( int iCode, char cCmd[] ) {  printf( "Err %d %s\n", iCode, cCmd );  exit( 0 ); } void main( int iArgc, char *cArgv[] ) {  int i, iOk, iKetaAge = 0, iSum;  char cKekka[8] = { 0x00 };  if( 2 != iArgc ) ErrorStop( 0, ">Hoge.exe 1010+1010" );  for( i = 3; i >= 0; i-- ){ // c+f,b+e,a+d,x+y   iOk = 0; // 2進数チェック   if( '0' == cArgv[1][i] ) iOk++;   if( '1' == cArgv[1][i] ) iOk++;   if( '0' == cArgv[1][i+5] ) iOk++;   if( '1' == cArgv[1][i+5] ) iOk++;   if( 2 != iOk ) ErrorStop( 1, cArgv[1] );   iSum = iKetaAge;   iSum += 0x01 & cArgv[1][i]; // 文字→数(c,b,a,x)   iSum += 0x01 & cArgv[1][i+5]; // 文字→数(f,e,d,y)   iKetaAge = iSum / 2;   cKekka[i+1] = (char)( 0x30 + ( iSum % 2 ) ); // 数→文字  }  cKekka[0] = ( iKetaAge ) ? '1' : ' '; // 2進数5桁?  printf( "%s %s\n", cArgv[1], cKekka ); } 注:インデントに全角空白を用いています。

すると、全ての回答が全文表示されます。
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

main関数は定義するだけで使用するわけではないとしても... > キーボードから入力されるものとし printf以外の関数を使わずにキーボードの入力を読み取るには、ハードウェアの仕様が分からなければどうすることもできません。仕様を補足してください。

masako-fk6
質問者

補足

記述ミスがありましたので補足させていただきます。 コマンドライン引数で入力された値を受け取ります。そのため、printfk関数以外に、main関数が使用できます。 また、2進数の加算は1桁ずつ加算した方法でコードを記述する。

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.3

No.1の者です。 > 3.printf以外の関数は使用しない。 この条件があるのでしたね。ということは、この問題は絶対に解けません。 なぜなら、main関数を使えないからです。 というわけで、No.1のサンプルは無視してください。

すると、全ての回答が全文表示されます。
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★アドバイス ・まず最初に今回の質問は作成が不可能(困難)です。  理由はキーボードから文字列を入力する際に scanf() なんかを利用しますが >3.printf以外の関数は使用しない。  という条件があるのですよね。  これだと無理です。  入力する方法がありません。  それともプログラムに引数を与えて argc、argv を処理するのでしょうか?  もう一度だけ宿題の条件を確認して下さい。  仮に入力だけは scanf() を使うとすると下のようになります。 >1.キーボードから入力されるものとし、入力される値は2進数と符号プラス(+)のみとします。加算する桁数は4桁とします。  scanf() で文字列を入力します。  文字列から『+』と2進数の文字列を分離します。 >2.2進数の値を加算させ、加算方法を記述したコードを用いる。  これも2進数を整数に変換してから加算するのか、  文字列の状態(配列を使って)の加算を行うのか不明です。 >3.printf以外の関数は使用しない。  これは出力の条件ですよね。  入力に scanf()、getchar() などが利用できないと作成が困難になります。  問題の意味を再確認して下さい。 >4.出力する際は、int型、char型でも構わない。  これって『2』の加算を整数値(int)や文字列(char)で計算しても構わないという事でしょうか?  最初は char 型の配列で2進数を表現して加算すれば良いでしょう。 >5.コマンドプロンプトを用いて、入力し出力する際は、以下の通りに出力する。  やっぱり scanf() のような関数で入力する必要がありますね。  char buff[ 256 ];    scanf( "%s", buff );  で文字列の入力は出来ます。  あとは入力文字列『1111 + 1111』を『1111』『+』『1111』に分離してから  加算の計算を行います。ここがポイントでしょう。  いろいろと方法はあると思いますが、『数1』『演算子』『数2』の3つに分離しましょう。  例えば  char num1[ 100 ];  char num2[ 100 ];  char enzan;  を宣言して入力文字列の buff[] 配列を解読します。  buff[] 配列が必ずスペース文字で区切られるのならば 0x20(SPC)をみて  num1、num2 に文字列をコピーします。その後に加算を計算します。 ・それでは宿題を頑張って下さい。

すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2127/6290)
回答No.1

ほんのちょっとしたサンプルです。 エラーチェックをもっと厳しくするなど、自由に改変してください。 #include <stdio.h> #include <stdlib.h> #include <string.h> int binToDec(char *s) {   int n;      for (n = 0; *s; s++)     n = 2 * n + *s - '0';   return n; } void decToBin(int n) {   if (n > 1)     decToBin(n / 2);   printf("%d", n % 2); } void usage(void) {   fprintf(stderr, "入力形式: 4桁の二進数 + 4桁の二進数 <Enter>\n");   exit(1); } int main(void) {   char str[13], s[5], c[2], t[5];      fgets(str, sizeof(str), stdin);   if (sscanf(str, "%s%s%s", s, c, t) != 3)     usage();   if (strlen(s) != 4 || strlen(t) != 4 || strcmp(c, "+") != 0)     usage();      printf("%s %s %s = ", s, c, t);   decToBin(binToDec(s) + binToDec(t));   return 0; } (注)インデントのため、全角空白を使っています。

すると、全ての回答が全文表示されます。

関連するQ&A