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

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

ただいまの
回答率

90.12%

条件を満たす数値の個数を表示するプログラムがわからない

解決済

回答 4

投稿

  • 評価
  • クリップ 1
  • VIEW 4,012

poniponiponiki

score 96

 前提・実現したいこと

初めまして、閲覧ありがとうございます。
早速ですが、私は現在、「一週間で身につくC言語」というサイトの発展問題を解いています。

その中で、「長さ5の整数型の配列変数aに、すべての成分に0から100の乱数の値を代入して表示し、以下の条件を満たす数値の個数を表示するプログラムを作りなさい。」という発展問題で躓いてしまいました。
条件は、以下の3つです。
(1) 20以上50以下の数
(2) 80より大きい数
(3) 0以上10未満の数

実行結果の例では、以下のようになると表記されていました。
実行結果の例
a[0]=9  a[1]=7  a[2]=35  a[3]=91  a[4]=58
20以上50以下の数:1個
80より大きい数:1個
0以上10未満の数:2個

乱数を発生させ、配列に代入、表示はできました。
しかし、条件を満たす数値の個数を表示するプログラムがどうしてもわかりません。
ご助言いただけると助かります。
また、コードの書き方についてもご教示いただければと思います。

 該当のソースコード

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    int a[5];
    int i;

    srand((unsigned)time(NULL)); //乱数の初期化

    for (i = 0; i < 5; i++)
    {
        a[i] = rand() % 100 + 1; //1から100までの乱数を得る
        printf("a[%d] = %d\n", i, a[i]); //選択された5個の乱数を表示    
    }

    if ((a[i] >= 20) || (a[i] <= 50))
    {
        printf("20以上50以下の数%d個\n");
    }
    else
    {
        printf("20以上50以下の数0個\n");
    }

    if (a[i] > 80)
    {
        printf("80より大きい数%d個\n");
    }
    else
    {
        printf("80より大きい数0個\n");
    }

    if ((i >= 0) && (i < 10))
    {
        printf("0以上10未満の数%d個\n");
    }
    else
    {
        printf("0以上10未満の数0個\n");
    }

    return 0;
}

 試したこと

このあとの条件を満たす数値の個数を表示するプログラムがまったく思いつかず、参考書やサイトを巡ってみても該当するものが見つけられませんでした。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

こういう質問に答えるのは難しいですね。
全部書いてしまうと 質問者さんのためにはならないと思いますので
(1) 20以上50以下の数 だけ
できるだけ質問者さんのプログラムに沿った形にするならば、下記のようになります。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    int a[5];
    int i;
    int i20_50 = 0;

    srand((unsigned)time(NULL));             //    乱数の初期化

    for (i = 0; i < 5; i++)
    {
        a[i] = rand() % 100 + 1;             //    1から100までの乱数を得る
        printf("a[%d] = %d\n", i, a[i]);     //    選択された5個の乱数を表示

        if ((a[i] >= 20) && (a[i] <= 50))
        {
            i20_50 += 1;
        }
    }

    printf("20以上50以下の数%d個\n", i20_50);

    return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/28 13:44

    回答ありがとうございます。私に沿った書き方にまでしていただけるとは思わず、驚きました。
    このプログラムに沿って動かしたところ、全ての条件の数値を表示することができました。
    回答を真っ先に書かず、こちらの為を思っての記述、とても参考になりました。
    本当にありがとうございます、勉強頑張っていきます。

    キャンセル

+1

if ~ else 文の各箇所にカウンタ(i++)を挿入し、最後に各変数をプリントすればどうですか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/28 13:47

    回答ありがとうございます。
    そういうやり方もあるのだと、凝り固まった頭が解れるアンサーでした。

    キャンセル

0

変数countなどを用意してfor文でループしながら条件に合うときだけ1増やすようにすればいいです。

また、配列の長さの5などは定数なので記号定数にしましょう。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define NUMBER 5
#define ITEM 3

int main(void)
{
  int a[NUMBER];
  int i;
  int count[ITEM] = {0,0,0};
  char text[ITEM][30] = {"20以上50以下の数","80より大きい数","0以上10未満の数"};

  srand((unsigned)time(NULL)); //乱数の初期化

  for(i = 0; i < NUMBER; i++){
      a[i] = rand() % 100 + 1; //1から100までの乱数を得る
    printf("a[%d] = %d\n", i, a[i]); //選択された5個の乱数を表示    
  }

  for(i = 0; i < NUMBER; i++){
      if(20 <= a[i] && a[i] <= 50){
          count[0]++;
      }
      else if(a[i] >= 80){
          count[1]++;
      }
      else if(a[i] < 10){
          count[2]++;
      }
  }
  for(i = 0; i < ITEM; i++){
      printf("%s : %d個\n",text[i],count[i]);
  }
  return 0;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/28 13:50

    回答ありがとうございます。
    記号定数にする、という点はまったく思いつかず勉強不足だと身に染みます。
    私の書き方では、冗長に思えたコードもスッキリして見えるので、その部分も気にしながら勉強指定校と思います、ありがとうございました。

    キャンセル

-1

個数を数えるなら、配列の最初から最後までループして、値をチェックして数えるコードを書きましょう

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/08/28 13:40

    回答ありがとうございます。考えすぎて頭が凝り固まってきているみたいなので、小休憩をとってから改めて挑戦してみます。

    キャンセル

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

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る