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

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

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

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

Q&A

解決済

3回答

3374閲覧

C言語の平均値を求める問題

prof

総合スコア179

C

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

0グッド

0クリップ

投稿2020/08/02 10:32

4つの整数型の引数a, b, c, dを入力とした際、1以上の数を持つのみ引数を選び、その平均をdouble型で計算して戻り値とする関数を定義したい。
C言語プログラムのソースコードを完成させよ。ただし、すべての引数が
0以下の場合は「0」を返すこととする。   

これでコンパイルして実行しても、0が出力されてしまいます。
原因を教えていただきたいです。

C

1#include<stdio.h> 2int avr(int a,int b,int c,int d){ 3 scanf("%d %d %d %d",&a,&b,&c,&d); 4 int sum=0,count=0,row[4] = {a,b,c,d}; 5 double mean; 6 for(int i=0;i<4;i++){ 7 if(row[i] >= 1){ 8 sum+=row[i]; 9 count++; 10 } 11 if(count == 0){ 12 return count; 13 }else{ 14 mean = (double)(sum / count); 15 return mean; 16 } 17 } 18} 19 20int main(void){ 21 int x,y,z,w; 22 printf("%.3f",avr(x,y,z,w)); 23 return 0; 24}

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

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

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

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

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

episteme

2020/08/02 10:56 編集

0より大きく1未満の引数に対してどう扱うか明記されていません。
cateye

2020/08/02 12:08 編集

「double型で計算して戻り値とする」のに、intが戻り値なのは何故でしょう? (double)(sum / count);は、(double)sum / count;なのでは? ・・・先の例では“整数除算の結果”をdoubleにしているだけ。 int avr(int a,int b,int c,int d)←引数は何処で設定? scanf("%d %d %d %d",&a,&b,&c,&d);・・・は、題意とちがう・・・引数a, b, c, dを入力・・・main()でするべき。 if(row[i] >= 1){の終端は?
cateye

2020/08/02 11:41 編集

epistemeさん<“4つの整数型の引数”とあるので「0より大きく1未満の引数」はないかと・・・
pepperleaf

2020/08/02 11:41 編集

> 「0より大きく1未満の引数」 scanf()で、%d で読んでるので 1未満はないかと。... いや、そもそも整数なので、0より大きく、1未満はありません。main()で、x, y, z, w と引数を与えているにも関わらず、関数内で、scanf()してのはなぜ? と色々と疑問は付きませんが。
episteme

2020/08/02 12:21

あー、そかそか
guest

回答3

0

printf("%.3f",avr(x,y,z,w));

avr関数の戻り値はintです。
ところが、ここではfloat変数の出力指定、となってます。
これではまともな数字が出力されません

整数を出力するように、フォーマット文字列を設定しましょう

投稿2020/08/02 12:22

y_waiwai

総合スコア87800

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

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

cateye

2020/08/02 12:29

「double型で計算して戻り値とする」とあるので、avr() の方をdoubleにするのでは?
guest

0

for(int i=0;i<4;i++){

このループは終わりはどこでしょうか?
if(count == 0){ まで含んでます。その結果、 i=0 しか、実行されてません。
そして、 avr()の戻り値は、intですが、 printf()での出力指定は、%.3fなので、floatして出力しようとしています。 その結果(多分)、0なのでしょう。

投稿2020/08/02 11:34

pepperleaf

総合スコア6383

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

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

0

自己解決

皆様ありがとうございました。
解答を拝見し、5分ほど格闘した結果できました。

関数avrがint型になっていたことと、meanのdouble型への変換がおかしかったのだと思います。

C

1#include<stdio.h> 2double avr(int a,int b,int c,int d){ 3 int sum=0,count=0,row[4] = {a,b,c,d}; 4 double mean; 5 for(int i=0;i<4;i++){ 6 if(row[i] >= 1){ 7 sum+=row[i]; 8 count++; 9 } 10 } 11 if(count == 0){ 12 return count; 13 }else{ 14 mean = (double)(sum) / count; 15 return mean; 16 } 17} 18 19int main(void){ 20 int a,b,c,d; 21 scanf("%d %d %d %d",&a,&b,&c,&d); 22 printf("%.3f",avr(a,b,c,d)); 23 return 0; 24}

投稿2020/08/02 13:25

prof

総合スコア179

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問