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

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

新規登録して質問してみよう
ただいま回答率
85.47%
C

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

Q&A

解決済

3回答

138閲覧

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

Teemro_431265

総合スコア29

C

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

0グッド

0クリップ

投稿2018/07/28 03:56

編集2018/07/28 04:50

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

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

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

c

1#include<stdio.h> 2#include<stdlib.h> 3void d2btrans(int); 4int main(){ 5 int n,f; 6 printf("10進数から2進数にした数値を入力してください\n"); 7 scanf("%d",&n); 8 9printf("\n"); 10 11return 0; 12} 13 14void d2btrans(int i){ 15 16if(i<0){ 17 exit(2); 18} 19 while(i>0){ 20 i%=2; 21 printf("%d",i); 22 } 23}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

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

C

1#include <stdio.h> 2#include <stdlib.h> 3 4#define BUFSIZE 256 5 6void d2btrans(int); 7 8int main(void){ 9 10 char buf[BUFSIZE]; 11 int n; 12 13 printf("10進数から2進数にした数値を入力してください\n"); 14 do{ 15 fgets(buf,sizeof(buf),stdin); 16 n = strtol(buf,NULL,10); 17 if(n < 0){ 18 printf("再入力してください。"); 19 } 20 }while(n < 0); 21 22 d2btrans(n); 23 return 0; 24 25} 26 27void d2btrans(int n) 28{ 29 int binary[32]; 30 int i = 0; 31 32 while(n > 0){ 33 binary[i] = n % 2; 34 n /= 2; 35 i++; 36 } 37 38 while(i > 0){ 39 printf("%d",binary[--i]); 40 } 41} 42

投稿2018/07/28 07:20

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Teemro_431265

2018/07/29 08:15

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

0

ベストアンサー

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

C

1void d2btrans(int i){ 2 if(i<0){ 3 exit(2); 4 } 5 while(i>0){ 6 printf("%d",i%2); 7 i/=2; 8 } 9}

投稿2018/07/28 04:24

otn

総合スコア84712

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Teemro_431265

2018/07/28 04:31

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

2018/07/28 05:04

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

退会済みユーザー

2018/07/28 07:22

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

2018/07/28 10:15

> 関数の中で出力ができると思ったのですができませか? 出来ますよ。 > あと「ぼろぼろ」とはどういうことですか? 私のコードと見比べてください。 > 提示されたコードだと2進数の表示が逆になってしまいます。 元の関数の仕様?に合わせています。
guest

0

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

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

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

投稿2018/07/28 04:34

tatamyiwathy

総合スコア1039

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Teemro_431265

2018/07/28 04:49

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問