質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.34%

  • C

    4007questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

関数がうまく動いてくれません

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 182

Teemro_431265

score 20

voidの関数を使って10進数を2進数にするプログラムを作りたいのですが関数に入った後の計算結果が表示がされず、そのまま次のコマンドが入力できるようになってしまいます。
自分としては関数の中で無限ループを回して2で割ったあまりを出力すればいいと考えました。また負の値が入力されたら抜けるようにしました。

./a.out
10進数から2進数にした数値を入力してください
66

みたいな感じになってしまいます。

#include<stdio.h>
#include<stdlib.h>
void d2btrans(int);
int main(){
    int n,f;
    printf("10進数から2進数にした数値を入力してください\n");
    scanf("%d",&n);

printf("\n");

return 0;
}

void d2btrans(int i){

if(i<0){
    exit(2);
}
    while(i>0){
        i%=2;
        printf("%d",i);
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

出力が無いのはd2btransを呼び出してないからですね。
d2btrans自体ぼろぼろなので、呼び出しても期待通りに動作はしませんが。

void d2btrans(int i){
    if(i<0){
        exit(2);
    }
    while(i>0){
        printf("%d",i%2);
        i/=2;
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/28 13:31

    関数の中で出力ができると思ったのですができませか?
    あと「ぼろぼろ」とはどういうことですか?

    キャンセル

  • 2018/07/28 14:04

    修正後のコードでも、d2btrans 関数は呼び出されてませんし、
    d2btrans 関数自体も、まともには動作しなさそうです

    キャンセル

  • 2018/07/28 16:22

    @otnさんへ
    提示されたコードだと2進数の表示が逆になってしまいます。
    例えば, 8を入力したときに1000になるはずですが0001になってしまいます。

    キャンセル

  • 2018/07/28 19:15

    > 関数の中で出力ができると思ったのですができませか?
    出来ますよ。

    > あと「ぼろぼろ」とはどういうことですか?
    私のコードと見比べてください。

    > 提示されたコードだと2進数の表示が逆になってしまいます。
    元の関数の仕様?に合わせています。

    キャンセル

+1

.do~while文を使って負の数値が入力されたときの対処をしました。

また、「ある程度大きな値でも対応できること」とそのままだと「表示が逆になること」を考慮して、
配列にデータを格納して表示しました。

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

#define BUFSIZE 256

void d2btrans(int);

int main(void){

  char buf[BUFSIZE];
  int n;

  printf("10進数から2進数にした数値を入力してください\n");
  do{
      fgets(buf,sizeof(buf),stdin);
      n = strtol(buf,NULL,10);
      if(n < 0){
          printf("再入力してください。");
      }
  }while(n < 0);

  d2btrans(n);
  return 0;

}

void d2btrans(int n)
{
  int binary[32];
  int i = 0;

  while(n > 0){
    binary[i] = n % 2;
    n /= 2;
    i++;
  }

  while(i > 0){
      printf("%d",binary[--i]);
  }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/29 17:15

    ありがとうございます。参考にさせていただきます。

    キャンセル

0

とりあえず気が付いたことです。

  • "10進数から2進数にした数値を入力してください\n"ってユーザーが10進数から2進数に変換した数値を入力するってことですか?
  • f=void d2btrans(int n);は構文エラーになります。
  • 結果が格納されているであろうfを表示していません。
  • d2btrans関数のwhileループの中でiに0を代入しちゃってます。

あと10進数を2進数に変換するのにループのなかで2の余剰を表示するというのは
一見よさそうですが、そのままだと下の桁から表示していきますので問題があります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/28 13:49

    一つ目の質問は「したい」にしたつもりでただの脱字です。
    二つ目はvoidが不要ということですよね?
    三つ目は最初fはmainの中で出力しようと思ったのですが関数の中で出力できると思いやめたので表示されないようにしています。
    四つ目は代入する値を初期化していないと思いそうしただけですが投稿した後に直しました。
    最後のご指摘は2進数の表示が逆さまになってしまうという解釈でいいですか?

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.34%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C

    4007questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。