質問です

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ミヒト
記事: 4
登録日時: 4年前

質問です

#1

投稿記事 by ミヒト » 4年前

下記のプログラムについて、例えば、上辺=5、下辺=4、高さ=3と入力したとき、答えが「13.500000」と表示されるはずが、「13.000000」と表示されてしまいます。
一番下のprintfに「(a+b)*c/2.0」を直接入力すると正解が表示されます。xに代入するとダメな理由を教えてください。

コード:


#include<stdio.h>

int main(void)
{
  int a,b,c,x;
  
  printf("台形の面積を求めます: ");
  printf("上辺 = ");
  scanf("%d",&a);
  printf("下辺 = ");
  scanf("%d",&b);
  printf("高さ = ");
  scanf("%d",&c);
  
  x = (a+b)*c/2.0;
  
  printf("面積は%fです。\n",(double)x);
  
  return 0;
}



アバター
usao
記事: 1887
登録日時: 11年前

Re: 質問です

#2

投稿記事 by usao » 4年前

xがintだから

ミヒト
記事: 4
登録日時: 4年前

Re: 質問です

#3

投稿記事 by ミヒト » 4年前

質問に答えていただきありがとうございます。
最後に編集したユーザー ミヒト on 2019年5月04日(土) 14:06 [ 編集 1 回目 ]

ミヒト
記事: 4
登録日時: 4年前

Re: 質問です

#4

投稿記事 by ミヒト » 4年前

usao さんが書きました:
4年前
xがintだから
キャスト演算子を用いているのですが、使い方を間違えているのでしょうか?
どういったふうに使ったらよいか教えていただけないでしょうか?

Math

Re: 質問です

#5

投稿記事 by Math » 4年前

整数型変数 x に 13.500000 という実数は 入りっこなく 13 がはいりますよ。
それを double にキャストしても 、「13.000000」ですよね!
実数型変数 を使わないといけません。

printf に直接書いたときは 実数にキャストされた状態(2.0があるから)問題ないですよ。

コード:

#include <stdio.h>

int main(void)
{
  int a,b,c,x;  // 整数型
  float dx;     // 実数型


  printf("台形の面積を求めます: ");
  printf("上辺 = ");
  scanf("%d",&a);
  printf("下辺 = ");
  scanf("%d",&b);
  printf("高さ = ");
  scanf("%d",&c);

  dx=( (a + b) * c )/2.0;  // 左辺が実数型でないといけない!

  printf("面積は%fです。\n",(double)dx);
  
  return 0;
}
実行してみました。
エンバカデロC 使用

コード:


C:\19\19c\bcc32>"C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\bcc32" main.cpp
Embarcadero C++ 7.40 for Win32 Copyright (c) 1993-2017 Embarcadero Technologies, Inc.
main.cpp:
Turbo Incremental Link 6.90 Copyright (c) 1997-2017 Embarcadero Technologies, Inc.

C:\19\19c\bcc32>dir main.exe
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 7813-6100 です

 C:\19\19c\bcc32 のディレクトリ

2019/05/04  14:34            77,312 main.exe
               1 個のファイル              77,312 バイト
               0 個のディレクトリ  118,872,485,888 バイトの空き領域

C:\19\19c\bcc32>main.exe
台形の面積を求めます: 上辺 = 5
下辺 = 4
高さ = 3
面積は13.500000です。

C:\19\19c\bcc32>pause
続行するには何かキーを押してください . . .

ミヒト
記事: 4
登録日時: 4年前

Re: 質問です

#6

投稿記事 by ミヒト » 4年前

Math さんが書きました:
4年前
整数型変数 x に 13.500000 という実数は 入りっこなく 13 がはいりますよ。
それを double にキャストしても 、「13.000000」ですよね!
実数型変数 を使わないといけません。

printf に直接書いたときは 実数にキャストされた状態(2.0があるから)問題ないですよ。

コード:

#include <stdio.h>

int main(void)
{
  int a,b,c,x;  // 整数型
  float dx;     // 実数型


  printf("台形の面積を求めます: ");
  printf("上辺 = ");
  scanf("%d",&a);
  printf("下辺 = ");
  scanf("%d",&b);
  printf("高さ = ");
  scanf("%d",&c);

  dx=( (a + b) * c )/2.0;  // 左辺が実数型でないといけない!

  printf("面積は%fです。\n",(double)dx);
  
  return 0;
}
実行してみました。
エンバカデロC 使用

コード:


C:\19\19c\bcc32>"C:\Program Files (x86)\Embarcadero\Studio\20.0\bin\bcc32" main.cpp
Embarcadero C++ 7.40 for Win32 Copyright (c) 1993-2017 Embarcadero Technologies, Inc.
main.cpp:
Turbo Incremental Link 6.90 Copyright (c) 1997-2017 Embarcadero Technologies, Inc.

C:\19\19c\bcc32>dir main.exe
 ドライブ C のボリューム ラベルがありません。
 ボリューム シリアル番号は 7813-6100 です

 C:\19\19c\bcc32 のディレクトリ

2019/05/04  14:34            77,312 main.exe
               1 個のファイル              77,312 バイト
               0 個のディレクトリ  118,872,485,888 バイトの空き領域

C:\19\19c\bcc32>main.exe
台形の面積を求めます: 上辺 = 5
下辺 = 4
高さ = 3
面積は13.500000です。

C:\19\19c\bcc32>pause
続行するには何かキーを押してください . . .
なるほど!
そうでしたか!
わかりやすい説明をしてくださってありがとうございます。

Math

Re: 質問です

#7

投稿記事 by Math » 4年前

float、 double は精度のちがいですが どちらも荒いので 精度が必要な時は 電卓で用いられる
”2進化十進数” などを使用しますね。

返信

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