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

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

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

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

Q&A

解決済

5回答

1325閲覧

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

miso_soup

総合スコア19

C

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

0グッド

0クリップ

投稿2019/04/13 21:08

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

c

1 #include <stdio.h> 2 int main(void) { 3 int a,b,c; 4 5 printf("aを入力しください: "); 6 scanf("%d", &a); 7 printf("bを入力しください: "); 8 scanf("%d", &b); 9 printf("cを入力しください: "); 10 scanf("%d", &c); 11 12 if ( (b < a && a < c) || (c < a && a < b) ) { 13 printf("2番目の値は%dです\n" , a); 14 } 15 else if ( (c < b && b < a) || (a < b && b < c) ) { 16 printf("2番目の値は%dです\n" , b); 17 } 18 else if ( (a < c && c < b) || (b < c && c < a) ) { 19 printf("2番目の値は%dです\n" , c); 20 } 21 else if ( a == b && a < c) { 22 printf("2番目の値は%dです\n" , a); 23 } 24 else if ( a == b && c < a) { 25 printf("2番目の値は%dです\n" , c); 26 } 27 else if ( a == c && a < b) { 28 printf("2番目の値は%dです\n" , a); 29 } 30 else if ( a == c && b < a) { 31 printf("2番目の値は%dです\n" , b); 32 } 33 else if ( b == c && a < b) { 34 printf("2番目の値は%dです\n" , a); 35 } 36 else if ( b == c && b < a) { 37 printf("2番目の値は%dです\n" , b); 38 } 39 else { 40 printf("すべて等しい値です。\n"); 41 } 42 } 43

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

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

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

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

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

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

guest

回答5

0

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

C

1#include <stdio.h> 2 3// バブルソート 4void bubbleSort(int numbers[], int array_size) 5{ 6 // 略 7} 8 9int main(void) { 10 int a,b,c; 11 12 printf("aを入力しください: "); 13 scanf("%d", &a); 14 printf("bを入力しください: "); 15 scanf("%d", &b); 16 printf("cを入力しください: "); 17 scanf("%d", &c); 18 19 if( (a == b) && (b == c)){ 20 printf("すべて等しい値です。\n"); 21 } 22 else{ 23 int numbers[3] = {a,b,c}; 24 bubbleSort(numbers,3); // ソートする 25 printf("2番目の値は%dです\n" , numbers[1]); 26 } 27 return 0; 28}

投稿2019/04/13 21:30

can110

総合スコア38262

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

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

miso_soup

2019/04/13 21:50

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

2019/04/13 21:53

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

2019/04/13 21:58

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

2019/04/13 22:11

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

2019/04/13 22:20

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

2019/04/13 22:29

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

2019/04/13 22:33

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

2019/04/13 22:40

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

2019/04/13 23:11 編集

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

2019/04/14 04:12

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

2019/04/14 04:35

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

2019/04/14 05:01

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

2019/04/14 05:09

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

2019/04/14 09:15

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

0

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

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

C

1#include <stdio.h> 2 3void descending_sort(int *array, int size) { 4 for(int i=0, t; i<size-1; i++) { 5 for(int j=size-1; j>i; j--) { 6 if(array[j-1] < array[j]) { 7 t = array[j-1]; array[j-1] = array[j]; array[j] = t; 8 } 9 } 10 } 11} 12 13int main(void) { 14 int a[3]; 15 16 printf("aを入力しください: "); 17 scanf("%d", &a[0]); 18 printf("bを入力しください: "); 19 scanf("%d", &a[1]); 20 printf("cを入力しください: "); 21 scanf("%d", &a[2]); 22 23 descending_sort(a, 3); 24 25 if(a[0] == a[3-1]) { 26 printf("すべて等しい値です。\n"); 27 } else { 28 for(int i=1; i<3; i++) { 29 if(a[i] != a[0]) { 30 printf("2番目の値は%dです\n" , a[i]); 31 break; 32 } 33 } 34 } 35 36 return 0; 37}

投稿2019/04/14 05:21

jimbe

総合スコア12634

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

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

miso_soup

2019/04/14 09:20

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

0

ベストアンサー

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

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

s.c

c

1#include <stdio.h> 2 3int main(void) { 4 int a, b, c; 5 6 printf("aを入力しください: "); 7 scanf("%d", &a); 8 printf("bを入力しください: "); 9 scanf("%d", &b); 10 printf("cを入力しください: "); 11 scanf("%d", &c); 12 13 int n[] = {a, b, c}; 14 15 // 1番大きい数と一番小さい数を見つける 16 int n_max = a; 17 int n_min = a; 18 for(int i = 0; i < 3; i++) { 19 if (n[i] > n_max) { 20 n_max = n[i]; 21 } 22 if (n[i] < n_min) { 23 n_min = n[i]; 24 } 25 } 26 27 // 1番目の数を除外して, 1番大きい数を見つける 28 int n2 = n_min; 29 if (n_max != n_min) { 30 for(int i = 0; i < 3; i++) { 31 if (n[i] == n_max) { 32 continue; 33 } 34 if (n[i] > n2) { 35 n2 = n[i]; 36 } 37 } 38 } 39 40 // printf("max:%d, min:%d, n2:%d\n", n_max, n_min, n2); 41 if (n_max == n_min) { 42 printf("すべて等しい値です。\n"); 43 } else { 44 printf("2番目の値は%dです\n" , n2); 45 } 46}

投稿2019/04/13 23:30

katoy

総合スコア22324

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

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

miso_soup

2019/04/14 00: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]; } } } ここの部分がどういうことかあまり理解できておらず 説明していただけたら嬉しいです。
katoy

2019/04/14 00:36

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

2019/04/14 01:17

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

2019/04/14 09:19

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

2019/04/14 16:08

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

0

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

  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を比較し大きい方を出力する

投稿2019/04/13 21:43

asm

総合スコア15147

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

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

0

C

1 2int max(int a, int b) { return a > b ? a : b; } 3int min(int a, int b) { return a < b ? a : b; } 4 5int main(void){ 6 int nMax = max(a, max(b, c)); 7 int nMin = min(a, min(b, c)); 8 if(nMax == nMin) // 全部同じ 9 else // a + b + c - nMax - nMin 10}

こんな感じでしょうか。

投稿2019/04/13 21:35

編集2019/04/13 21:41
_Victorique__

総合スコア1392

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問