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

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

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

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

Q&A

解決済

3回答

876閲覧

if文の中身が実行されない。(平均値の近似値)

langhtorn

総合スコア105

C

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

0グッド

0クリップ

投稿2020/09/25 05:21

###実現したいこと
平均値に最も近い数を出したい。
###問題点

平均値との差の最小値を求める部分のifが実行されていない。 printfをifの中に入れて確認してみたがそのprintfが出力されなかった。 ちなみに、平均値との差まではあってました。

###実行結果

n=5 10 2 6 23 4 avg=9.000000 i=0 fabs(sa[i])=1.000000 i=1 fabs(sa[i])=7.000000 i=2 fabs(sa[i])=3.000000 i=3 fabs(sa[i])=14.000000 i=4 fabs(sa[i])=5.000000 最小値に一番近い数は0.000000です.

###コード

C

1//n個の実数値の平均値に最も近い数を出力する 2 3#include<stdio.h> 4#include<math.h> 5 6int main(void) 7{ 8 int n,i,mini; 9 double avg,sa[100],min,a[100],sum; 10 sum=0; 11 avg=0; 12 13 printf("n="); 14 scanf("%d",&n); 15 for(i=0;i<n;i++){ 16 scanf("%lf",&a[i]); 17 sum+=a[i]; 18 //printf("sum=%f\n",sum); 19 } 20 //printf("sum=%f\n",sum); 21 avg=sum/n; 22 printf("avg=%f\n",avg); 23 24 //平均値との差を求める 25 for(i=0;i<n;i++){ 26 sa[i]=avg-a[i]; 27 //printf("sa[%d]=%f\n",i,fabs(sa[i])); 28 } 29 30 //平均値との差の最小値を求める 31 min=fabs(sa[0]); 32 //printf("min=%f\n",min); 33 for(i=0;i<n;i++){ 34 printf("i=%d\n",i); 35 printf("fabs(sa[i])=%f\n",fabs(sa[i])); 36 if(min>fabs(sa[i])){ 37 min=fabs(sa[i]); 38 mini=i; //この時のiを記憶 39 printf("mini=%d",mini); 40 } 41 } 42 //printf("mini=%d",mini); 43 printf("最小値に一番近い数は%fです.\n",a[mini]); 44 45 return 0; 46 47}

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

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

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

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

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

guest

回答3

0

minの初期値がfabs(sa[0])ですが、この値が既に最小値であるためif文の条件に合致していないようです。
minの初期値としてはdouble型の最大値を与えるのがよいでしょう。

c

1#include <float.h> 23min = DBL_MAX;

もしくはfabs(sa[0])を初期値とするのなら、miniも0で初期化しておく必要があります。

c

1min = fabs(sa[0]); 2mini = 0;

投稿2020/09/25 05:41

ttyp03

総合スコア17000

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

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

langhtorn

2020/09/26 03:55

ありがとうございます。考え直してみます!
guest

0

sa[0]が0だと、if文は実行されることはなくなります。
実際のsa[0]の値はいくつなんでしょう


sa[0]が最小の値になってるので、if文は実行されませんね
min=fabs(sa[0])+1;
とでもしておけばいいかと。

投稿2020/09/25 05:31

編集2020/09/25 05:35
y_waiwai

総合スコア88042

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

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

langhtorn

2020/09/26 03:54

例のときifがちゃんと働かないというのが欠陥でした。ご指摘ありがとうございます。
guest

0

ベストアンサー

例の通りにやると、sa[0]が一番小さいので、
min=fabs(sa[0]);なので
if(min>fabs(sa[i])) は常にfalseです。

if(min>=fabs(sa[i])) にすると正しく動きます
あるいはよく使われる方法として、
minに絶対入らないであろう大きい数字を入れる方法も有ります
min=1.797693e+308;

投稿2020/09/25 05:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

langhtorn

2020/09/26 03:54

例のときでもifが働くようなプログラムをありがとうございます。参考にしてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問