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

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

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

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

Q&A

解決済

4回答

6379閲覧

3番目に大きい数を表示するプログラム

hromj

総合スコア9

C

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

0グッド

0クリップ

投稿2016/10/18 06:38

プログラミング超初心者です。
3番目に大きい数を10個まで入力した数値から読み取り表示するプログラムを書きたいのですが、全くできません。
ご教授お願いします。

#include<stdio.h>
#define N 10
int a[N];
int main(void){
int i,max,second,max_i,second_i,third;

printf("入力\n");

for(i=0; i<N; i++)
scanf("%d",&a[i]);

max = a[0];
for(i=0; i<N; i++){
if(a[i]>=max){
max = a[i];
max_i = i;
}
}
Second = a[0];
for(i=max_i+1; i<N; i++)
if(a[i] > max)
second = a[i];
second_i = i;

for(i=second_i+1; i<N; i++)
if(a[i] = second)
second = a[i];

third = a[0];

for(i=second_i+1; i<N; i++)
if(a[i] > second)
third = a[i];

printf("入力に対応する出力\n");
printf("%d\n",third);
return 0;
}

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

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

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

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

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

moonphase

2016/10/18 07:11

コードの上下は ``` で囲うと見やすくなります。
guest

回答4

0

ベストアンサー

問題を挙げます

①読みにくい
入力欄の上にコードボタンがあるのでコードを出すときはそれを使ってください。
"</>"こんな感じのやつ

②定義していない変数を使用している
以下の行でSecondを使っていますが、定義しているのは小文字のsecondなのでコンパイルエラーです。

Second = a[0];

最低限、コンパイルは通しておきましょう。

③if文の括弧{}省略
下記の行はおそらくif文の条件がtrueの場合に実行することを想定していると思いますが、
その書き方ではif文に関係なく実行されます。

second_i = i

for文も含め、プログラミングに慣れるまでは必ず書いてください。

④命名規則が雑
これは慣れてきたらでもいいですが、
一番大きいのがmax,2番がsecondでは統一性がないです。
同じように使う変数には同じ命名規則を適用しましょう。
(この場合はmaxをfirstにするのがいいと思います)

⑤forの初期値がおかしい
下記のようにmax or secondが見つかった要素番号の次からはじめていますが、
maxの数値が要素番号9で見つかった場合、何も処理できません。

max_i+1

iは0からはじめるべきです。

⑥不要な処理
4つめのfor文は不要なはずです。

投稿2016/10/18 07:37

moredeep

総合スコア1507

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

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

hromj

2016/10/18 15:32

丁寧なご回答ありがとうございます。 勉強させていただきます。
guest

0

自分なら次のように降順にソートして3番目を取り出します。

c

1#include<stdio.h> 2 3#define N 10 4 5int a[N]; 6int main(void){ 7 int i,j,temp; 8 9 printf("入力\n"); 10 11 for(i=0; i<N; i++){ 12 scanf("%d",&a[i]); 13 } 14 15 for(i = 0; i < N - 1; i++){ 16 for(j = i + 1; j < N; j++){ 17 if(a[i] < a[j]){ 18 temp = a[j]; 19 a[j] = a[i]; 20 a[i] = temp; 21 } 22 } 23 } 24 25 printf("入力に対応する出力\n"); 26 printf("%d\n",a[2]); 27 return 0; 28} 29

質問のコードを修正するならこうでしょうか。
forが1回多い気がします。
あとsecondのところで括弧がついていないので、second_iの処理位置がおかしいです。
など諸々を直したのがこれです。かなり適当ですが…。

c

1#include<stdio.h> 2 3#define N 10 4 5int a[N]; 6int main(void){ 7 int i,max,second,max_i,second_i,third; 8 9 printf("入力\n"); 10 11 for(i=0; i<N; i++){ 12 scanf("%d",&a[i]); 13 } 14 15 max = a[0]; 16 for(i=0; i<N; i++){ 17 if(a[i] > max){ 18 max = a[i]; 19 max_i = i; 20 } 21 } 22 second = a[0]; 23 for(i=0; i<N; i++){ 24 if(a[i] > second && i != max_i){ 25 second = a[i]; 26 second_i = i; 27 } 28 } 29 30 third = a[0]; 31 for(i=0; i<N; i++){ 32 if(a[i] > third && i != max_i && i != second_i){ 33 third = a[i]; 34 } 35 } 36 37 printf("入力に対応する出力\n"); 38 printf("%d\n",third); 39 return 0; 40}

投稿2016/10/18 07:22

ttyp03

総合スコア16998

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

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

0

以下の処理が必要となります。

1.数値を10個入力
2.数値を降順でソート
3.ソートした数値の3番目を表示

c

1#include <stdio.h> 2 3#define N 10 4 5int a[N]; 6 7int main(void){ 8 int i,j,tmp; 9 10 /* 数値を10個入力 */ 11 printf("入力\n"); 12 for(i=0; i<N; i++) { 13 scanf("%d",&a[i]); 14 } 15 16 /* 数値を降順でソート */ 17 for(i = 0; i < N; i++) { 18 for(j = i+1; j < N; j++) { 19 if (a[i] < a[j]) { 20 tmp = a[i]; 21 a[i] = a[j]; 22 a[j] = tmp; 23 } 24 } 25 } 26 27 /* ソートした数値の3番目を表示 */ 28 printf("入力に対応する出力\n"); 29 printf("%d\n",a[2]); 30 return 0; 31}

以下追記

qsort()を使う場合

#include <stdio.h> #include <stdlib.h> #define N 10 int a[N]; int f_cmp(const void* a, const void* b) { if (*(int*)a < *(int*)b) { return -1; } else if ( *(int*)a == *(int*)b ) { return 0; } else { return 1; } } int main(void){ int i,j,tmp,max; printf("入力\n"); for(i=0; i<N; i++) { scanf("%d",&a[i]); } qsort((void*)a, N, sizeof(a[0]), f_cmp); printf("入力に対応する出力\n"); printf("%d\n",a[7]); return 0; }

投稿2016/10/18 07:22

編集2016/10/18 07:46
moonphase

総合スコア6621

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

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

0

配列aをqsort(比較関数の記号は">"で)した後の、a[2]を取り出すのは?
ソートのアルゴリズムの練習だったらごめんなさい。。。

投稿2016/10/18 07:12

fromageblanc

総合スコア2724

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問