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

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

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

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

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Q&A

解決済

4回答

5266閲覧

人口密度を計算するプログラムを作成したいのですが、どう書けばいいか分かりません。。

bjbjeknr

総合スコア26

C

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

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

0グッド

0クリップ

投稿2016/11/21 11:23

面積 [km2] と人口 [人] の2つの値を標準入力して人口密度を計算し、結果を標準出力し、値の入力と表示は main 関数内で行い、人口密度の計算はユーザー関数内で行うようなプログラムを書きたいのですが、ここで求める**人口密度の値は実数で、小数以下第1位まで標準出力するようにしたいのです。
**
実行例

% a.out

人口密度の計算をします。
人口は?[人]:
8840086
面積は?[km^2]:
1905
人口は8840086[人]
面積は1905[km^2]
人口密度は4640.5[人/km^2]です。

しかし、私のプログラム(↓)

C

1#include <stdio.h> 2 3int population_density(int h,int a) 4{ 5 double jm; 6 printf("人口は%d[人]\n",h); 7 printf("面積は%d[km^2]\n",a); 8 jm=h/a; 9 10 return jm; 11} 12 13 14int main(void) 15{ 16 int human_value,area_value; 17 double j_density; 18 printf("人口密度の計算をします。\n"); 19 20 printf("人口は?[人]:\n"); 21 scanf("%d",&human_value); 22 23 printf("面積は?[km^2]:\n"); 24 scanf("%d",&area_value); 25 26 j_density=population_density(human_value,area_value); 27 28 printf("人口密度は%lf[人/km^2]です。\n",j_density); 29 30 return 0; 31} 32 33

これで実行すると、

$ ./a.out

人口密度の計算をします。
人口は?[人]:
8840086
面積は?[km^2]:
1905
人口は8840086[人]
面積は1905[km^2]
人口密度は4640.000000[人/km^2]です。

となり、
・計算結果(人口密度)が合わない。
・小数以下第1位まで標準出力できていない。
この2点の問題が発生します。。

どこがおかしいのか、どう書けばよいのか。。
教えてください、よろしくお願いします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2016/11/21 11:25

ヒント int/int=int
guest

回答4

0

ベストアンサー

動作確認までしました

#include <stdio.h>

double population_density(int h,int a)
{
double jm;
printf("人口は%d[人]\n",h);
printf("面積は%d[km^2]\n",a);
jm=(double)h/a;

return jm;
}

int main(void)
{
int human_value,area_value;
double j_density;
printf("人口密度の計算をします。\n");

printf("人口は?[人]:\n");
scanf("%d",&human_value);

printf("面積は?[km^2]:\n");
scanf("%d",&area_value);

j_density=population_density(human_value,area_value);

printf("人口密度は%.1lf[人/km^2]です。\n",j_density);

return 0;
}

・変更内容
関数の返り値をint からdoubleに設定
double population_density(int h,int a)

型変換
jm=(double)h/a;

printfのフォーマット指定子を下一桁までに変更
printf("人口密度は%.1lf[人/km^2]です。\n",j_density)

殆どのことはすでに書いてありましたが関数の戻り値について足りなかったので補足しました。

投稿2016/11/21 12:23

sakakendo0321

総合スコア45

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

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

bjbjeknr

2016/11/21 12:26

分かりやすいアドバイス、ありがとうございました。助かりました。
guest

0

まず、1点目です。
xa051 さんが書かれていますが、演算するサイズについてです。

演算する時に、その式の中で出現する最も大きいサイズで計算するという
仕様があります。

つまり、 h/a という演算は int 型で行われますので、この式の実行時点で、
小数点以下が切り捨てられます。

小数点以下を切り捨てた後の結果を、double 型の 変数 jm に代入しても、
切り捨てられた結果は失われたままです。

一つの解決方法としては、
jm = (double)h/a;
と演算の変数をキャストして演算するサイズを決めてしまうという方法です。

2点目ですが、population_density() という関数の戻り値が int 型です。
これでは例え、変数 jm に小数以下のデータが入っていても、切り捨てられます。
関数を、
double population_density()
の様にして戻り値が double 型であるとして下さい。

3点目ですが、 printf の書式に %lf と指定しているので、小数点以下の桁数の
指定がありません。
書式に、%.1lf を指定してみて下さい。

投稿2016/11/21 11:53

編集2016/11/21 11:54
ShinyaAnan

総合スコア241

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

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

bjbjeknr

2016/11/21 12:26

分かりやすいアドバイス、ありがとうございました。助かりました。
guest

0

ソース見て?と思ったところ
・population_densityの関数内ではdoubleをreturnしているが、宣言がint型
printf("人口密度は%lf[人/km^2]です。\n",j_density);に小数以下第1位の指定(.1)をしていない

投稿2016/11/21 11:51

hiim

総合スコア1689

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

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

bjbjeknr

2016/11/21 12:26

分かりやすいアドバイス、ありがとうございました。助かりました。
guest

0

フォーマット指定子が%lfじゃ足りない

投稿2016/11/21 11:46

iwanote

総合スコア295

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

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

bjbjeknr

2016/11/21 12:26

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問