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

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

ただいまの
回答率

90.53%

  • C

    4386questions

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

c言語の問題です。どのようにプログラムをすれば良いか教えていただきたいです。

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 320

kiyomasa

score 4

問題
3つの整数をA,B,Cを入力すると、2番目の値を出力するプログラムを作りなさい。
という問題なんですけど、自分でも書いて見て2番目の値は出力するのですが、
とてもプログラミングとは言えないような記述でどのようにすれば良いか教えていただきたいです。

  #include <stdio.h>
  int main(void) {
    int a,b,c;

    printf("aを入力しください: ");
    scanf("%d", &a);
    printf("bを入力しください: ");
    scanf("%d", &b);
    printf("cを入力しください: ");
    scanf("%d", &c);

    if ( (b < a && a < c) || (c < a && a < b) ) {
      printf("2番目の値は%dです\n" , a);
    }
    else if ( (c < b && b < a) || (a < b && b < c) ) {
      printf("2番目の値は%dです\n" , b);
    }
    else if ( (a < c && c < b) || (b < c && c < a) ) {
      printf("2番目の値は%dです\n" , c);
    }
    else if ( a == b && a < c) {
      printf("2番目の値は%dです\n" , a);
    }
    else if ( a == b && c < a) {
      printf("2番目の値は%dです\n" , c);
    }
    else if ( a == c && a < b) {
      printf("2番目の値は%dです\n" , a);
    }
    else if ( a == c && b < a) {
      printf("2番目の値は%dです\n" , b);
    }
    else if ( b == c && a < b) {
      printf("2番目の値は%dです\n" , a);
    }
    else if ( b == c && b < a) {
      printf("2番目の値は%dです\n" , b);
    }
    else {
      printf("すべて等しい値です。\n");
    }
  }


配列などを使えばすっきりとしたプログラムが書けるのでしょうか?
よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 5

+3

a,b,cの値をソートしてあげると以下のように簡潔に記述できます。
コード中のバブルソートについてはバブルソートなどを参考に実装ください。

#include <stdio.h>

// バブルソート
void bubbleSort(int numbers[], int array_size)
{
    // 略
}

int main(void) {
    int a,b,c;

    printf("aを入力しください: ");
    scanf("%d", &a);
    printf("bを入力しください: ");
    scanf("%d", &b);
    printf("cを入力しください: ");
    scanf("%d", &c);

    if( (a == b) && (b == c)){
        printf("すべて等しい値です。\n");
    }
    else{
        int numbers[3] = {a,b,c};
        bubbleSort(numbers,3); // ソートする
        printf("2番目の値は%dです\n" , numbers[1]);
    }
    return 0;
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/14 06:50

    ソースコードの回答ありがとうございます。参考になりました。
    aを入力しください: 3
    bを入力しください: 3
    cを入力しください: 2
    2番目の値は3です
    このような場合ですとどのようにすればよろしいのでしょうか?

    キャンセル

  • 2019/04/14 06:53

    すみません、質問の意味が分かりません。
    「このような場合」とはどんな場合でしょうか?

    キャンセル

  • 2019/04/14 06:58

    すみません勘違いしておりました。
    バブルソートの部分を記述したらできるようになるのですね、
    頑張ってやって見ます。
    ありがとうございました。

    キャンセル

  • 2019/04/14 07:11

    aを入力しください: 77
    bを入力しください: 77
    cを入力しください: 6
    2番目の値は77です
    すみません、aとbの入力した数字が同じでcがその数より小さい場合
    2番目の値は6ですと出力されるにはどのようにすればよろしのでしょうか?

    キャンセル

  • 2019/04/14 07:20

    それを2番目と言うのはさすがにちょっと...

    キャンセル

  • 2019/04/14 07:29

    この場合の2番目の値って6じゃなくて77でいいんですかね?

    キャンセル

  • 2019/04/14 07:33

    問題の要件がよく分かりません。
    昇順に(小さいものから順に)並べて2番目なら77でよいと思いますが?
    降順に(大きいものから順に)並べて2番目ということであれば
    バブルソートで降順に並べてください。

    キャンセル

  • 2019/04/14 07:40

    わかりました。
    ありがとうございます。

    キャンセル

  • 2019/04/14 08:08 編集

    「2 番目」がどういうものかまず出題者にはっきり聞いてくるのが先じゃないですか?
    「2 番目に入力した値」かもしれないし、「2 番目に小さい値」かもしれないし。
    「2 番目に大きな値」だと確かに 6 になります。77 は一番大きな値ですから。
    だけど初歩的と思える出題でそこまで複雑な答えを期待しているとは思えません。

    キャンセル

  • 2019/04/14 13:12

    kiyomasa さんの提示されたコードと同じ動きになればよいのではないでしょうか.

    キャンセル

  • 2019/04/14 13:35

    模範解答じゃないので合ってるとは限らないという問題があります。

    キャンセル

  • 2019/04/14 14:01

    > 自分でも書いて見て2番目の値は出力する
    とおっしゃっていますので, その辺りは一応クリアしている前提でよろしいのはないかと思いました.

    キャンセル

  • 2019/04/14 14:09

    それが本当に求められる値なのかどうかを出題者に確認するのが先、という話です。

    キャンセル

  • 2019/04/14 18:15

    わかりました。
    色々と教えていただきありがとうございました。

    キャンセル

+2

"2番目に大きな値" を表示するという解釈を受け継いで, 配列で書いてみました.

can110 さんの回答へのコメントで Zuishin さんがご指摘の通り, "並び替えて2番目の値" を表示するのと, "2番目に大きな値" を表示するのとでは, katoy さんの回答からもお分かりかと思いますが, 初心者向けとしてはコード量や難易度に若干差が感じられます.
確認は必要かと思います.

#include <stdio.h>

void descending_sort(int *array, int size) {
  for(int i=0, t; i<size-1; i++) {
    for(int j=size-1; j>i; j--) {
      if(array[j-1] < array[j]) {
        t = array[j-1]; array[j-1] = array[j]; array[j] = t;
      }
    }
  }
}

int main(void) {
  int a[3];

  printf("aを入力しください: ");
  scanf("%d", &a[0]);
  printf("bを入力しください: ");
  scanf("%d", &a[1]);
  printf("cを入力しください: ");
  scanf("%d", &a[2]);

  descending_sort(a, 3);

  if(a[0] == a[3-1]) {
    printf("すべて等しい値です。\n");
  } else {
    for(int i=1; i<3; i++) {
      if(a[i] != a[0]) {
        printf("2番目の値は%dです\n" , a[i]);
        break;
      }
    }
  }

  return 0;
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/14 18:20

    問題の意図まで汲んでいただきありがとうございました。

    キャンセル

checkベストアンサー

+1

全体をソートして、2番目を表示するのが一般的な方法です。

でも ここでは あえて全体のソートをせず、2番目の値を得ることに特化した方法で書いてみました。
要素数が 3 でなくもっと大きい個数になった場合には、全体ソートよりも処理時間はみじかくなるはずです。
(全体ソートでは 3番め以降の全要素のソート処理が走りますが、それは2番目を求めるには無駄な処理なので)

s.c

#include <stdio.h>

int main(void) {
    int a, b, c;

    printf("aを入力しください: ");
    scanf("%d", &a);
    printf("bを入力しください: ");
    scanf("%d", &b);
    printf("cを入力しください: ");
    scanf("%d", &c);

    int n[] = {a, b, c};

    // 1番大きい数と一番小さい数を見つける
    int n_max = a;
    int n_min = a;
    for(int i = 0; i < 3; i++) {
      if (n[i] > n_max) {
    n_max = n[i];
      }
      if (n[i] < n_min) {
    n_min = n[i];
      }
    }

    // 1番目の数を除外して, 1番大きい数を見つける
    int n2 = n_min;
    if (n_max != n_min) {
      for(int i = 0; i < 3; i++) {
    if (n[i] == n_max) {
      continue;
    }
    if (n[i] > n2) {
      n2 = n[i];
    }
      }
    }

    // printf("max:%d, min:%d, n2:%d\n", n_max, n_min, n2);
    if (n_max == n_min) {
      printf("すべて等しい値です。\n");
    } else {
      printf("2番目の値は%dです\n" , n2);
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/04/14 09:04

    回答ありがとうございました。
    非常にわかりやすかったです。
    ありがとうございます。
    int n2 = n_min;
    if (n_max != n_min) {
    for(int i = 0; i < 3; i++) {
    if (n[i] == n_max) {
    continue;
    }
    if (n[i] > n2) {
    n2 = n[i];
    }
    }
    }
    ここの部分がどういうことかあまり理解できておらず
    説明していただけたら嬉しいです。

    キャンセル

  • 2019/04/14 09:36

    n_min を求めているのは、 n2 の初期値を設定するためです。
    最大値と最小値が同じなら、他の要素もすべて同じ値なので、2番目の値を探す処理は不要になります。
    最大値を求める処理に n[i] が n_max だったときの判定を加えることで、 2番目に大きい数を求めることができます。

    キャンセル

  • 2019/04/14 10:17

    低評価の理由をコメントに記載していただければ幸いです。

    キャンセル

  • 2019/04/14 18:19

    わかりました。
    色々と教えていただきありがとうございました。
    すみません、最近始めたもので低評価の理由をコメントに記載するとはどういうことでしょうか?
    前回質問した際に低評価がついてしまったのはやってほしいことだけを質問した丸投げの質問
    だったり質問ポリシーに乗っとて質問しようとのことでした。

    キャンセル

  • 2019/04/15 01:08

    この回答に 低評価 をつけた方への依頼です。

    キャンセル

+1

int max(int a, int b) { return a > b ? a : b; }
int min(int a, int b) { return a < b ? a : b; }

int main(void){
    int nMax = max(a, max(b, c));
    int nMin = min(a, min(b, c));
    if(nMax == nMin) // 全部同じ
    else // a + b + c - nMax - nMin
}


こんな感じでしょうか。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

この問題ですと、バブルソートするのが楽っぽいですね。

  1. abを比較し大きい方をb,小さい方をaに交換する
  2. bcも同様に比較し大きい方をc、小さい方をbに交換する
  3. 再度、abを比較し大きい方をb、小さい方をaに交換する

これによりaが一番最小、cが最大 そしてbが中間になる。


ここから、問題に合わせて最適化する事が可能です。

  1. 全ての値が等しい場合、"すべて等しい値です。"と出力する
  2. abを比較し大きい方をb,小さい方をaに交換する
  3. bcも同様に比較し大きい方をc、小さい方をbに交換する
  4. 2で交換が発生した場合abを比較し大きい方を出力する

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • C

    4386questions

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

  • トップ
  • Cに関する質問
  • c言語の問題です。どのようにプログラムをすれば良いか教えていただきたいです。