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

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

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

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

Q&A

解決済

2回答

1041閲覧

C言語、配列に関して

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2018/04/14 15:05

C言語についての質問です。
当方初心者で、ここに質問するのも初めてなので
コード

以下コード&問題↓ /* 実行結果例に習い、以下のプログラムを作りなさい。 (1)長さ5のint型の配列を作成する。 (2)(1)の各要素に、1から10までの数をキーボードから入力する。 (3)配列の内容をすべて表示する。 (4)配列の値の合計値と、平均値を表示する。 (5)平均値よりも大きい数を表示する。 (6)平均値よりも小さい数を表示する。 */ #include<stdio.h> int main() { int i, j, a[5], b[5], c[5], big = 0, small = 0, sum = 0; double ave; printf("5つの数を入力してください。\n"); //数値入力 for(i=0; i<5; i++){ scanf("%d", &a[i]); } //配列表示 for(i=0; i<5; i++){ printf("%d ", a[i]); } printf("\n"); //合計値 for(i=0; i<5; i++){ sum = sum + a[i]; } printf("合計値=%d\n", sum); //平均値 ave = sum / 5; printf("平均値=%.f\n", ave); //平均値と比較(大) for(i=0; i<5; i++){ if(a[i]>ave){ b[i] = a[i]; big = big + 1; } } //平均値と比較(小) for(j=0; j<5; j++){ if(a[j]<ave){ c[j] = a[j]; small = small + 1; } } //結果表示 printf("平均値より大きい数="); for(i=0; i<big; i++){ printf("%d ", a[i]); } printf("\n"); printf("平均値より小さい数="); for(j=0; j<small; j++){ printf("%d ", c[j]); } printf("\n"); return 0; } ここまで これで配列の数字を1,2,3,4,5にして実行してみると次のようになります。 >mondai1 5つの数を入力してください。 1 2 3 4 5 1 2 3 4 5 合計値=15 平均値=3 平均値より大きい数=1 2 平均値より小さい数=1 2 平均値より小さい数は、ちゃんと「1と2」になるんですが、 平均値より大きい数も「1と2」になってしまいます。 どうしたらいいのでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

平均より大きい数が格納されているのはbなのに、aの中身を出力しているからかと。
また、代入部分は次のように書き換えた方が良いでしょうね。

C

1//平均値と比較(大) 2for(i=0; i<5; i++){ 3 if(a[i]>ave){ 4 b[big] = a[i]; 5 big = big + 1; 6 } 7}

小さいほうに関しても同様です。

コードの書き方について

teratailには、上記のようにコードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
C

投稿2018/04/14 15:09

編集2018/04/14 15:26
LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2018/04/14 15:17 編集

本当ですね... 確認不足でした、回答ありがとうございました! アドバイスまでありがとうございます! 無事に動きました。
guest

0

こんにちは、きちんと思った通りの動きができたらならそれでいいのですが、
気になった点があるのでそれを述べたいと思います。

1.5という配列の要素数は記号定数にすべきです。

c

1#define MAX_NUMBER 5

2.入力はscanfよりfgetsをおすすめめします...

3.平均を求めるとき 合計値を5で割っています。小数点以下切り捨てならかまいませんが、
小数点以下も表示したいなら(おそらく変数aveがdoubleなので)

C

1ave = sum / 5.0;

という形で書きましょう。(今回私は記号定数にしたMAX_NUMBERをdoubleにキャストしています。)

最後に、

(5)平均値よりも大きい数を表示する。

(6)平均値よりも小さい数を表示する。

とありますが,表示だけなら新たな配列に格納する必要がありません.
(あくまでも、表示だけならの話です。そのあとに他の処理が必要なら別の話となります。)

以下、私が書いたソースコードです。

C

1#include <stdio.h> 2#include <stdlib.h> 3 4#define BUFSIZE 256 5#define MAX_NUMBER 5 6 7int main(void){ 8 9 char buf[BUFSIZE]; 10 int num[MAX_NUMBER]; 11 int sum = 0; 12 double average; 13 int i; 14 printf("5つの数を入力してください。\n"); 15 16 for(i = 0; i < MAX_NUMBER; i++){ 17 fgets(buf,sizeof(buf),stdin); 18 num[i] = atoi(buf); 19 } 20 21 for(i = 0; i < MAX_NUMBER; i++){ 22 sum += num[i]; 23 } 24 printf("合計値 = %d\n", sum); 25 26 average = sum / (double)MAX_NUMBER; 27 printf("平均値 = %.1f\n",average); 28 29 printf("平均値より大きい数 = "); 30 for(i = 0; i < MAX_NUMBER; i++){ 31 if(num[i] > average){ 32 printf("%d ",num[i]); 33 } 34 } 35 printf("平均値より小さい数 = "); 36 for(i = 0; i < MAX_NUMBER; i++){ 37 if(num[i] < average){ 38 printf("%d ",num[i]); 39 } 40 } 41 42 return 0; 43}

投稿2018/04/14 23:36

編集2018/04/14 23:37
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問