moririnn

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
MORIRIN
記事: 8
登録日時: 9年前

moririnn

#1

投稿記事 by MORIRIN » 9年前

入力された10個のうち大きい数字3つを出力しろというものですが配列を用いたアルゴリズムが全くわかりません。どのように考えたら良いのでしょうか。またどう勉強すれば良いですか??

コード:

#include<stdio.h>
 
int main(){
  int a[10];
  int i,j,temp;
  for(i=0;i<10;i++)
    scanf("%d",&a[i]);
  for(i=0;i<10;i++){
    for(j=i+1;j<10;j++)
      if(a[j]>a[i]){
    temp = a[i];
    a[i] = a[j];
    a[j] = temp;
      }
  }
  for(i=0;i<3;i++)
    printf("%d\n",a[i]);
 
  return 0;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: moririnn

#2

投稿記事 by みけCAT » 9年前

まずインデントを整えましょう。
これは入力を降順にソートして最初の3個を出力する、というプログラムですね。
ソートは今見ている範囲の先頭とそれ以外の要素を比較して先頭より大きい要素があったらそれと先頭を交換する、という処理を行い、
一回終わったら見る範囲から先頭の要素を外して同様に繰り返す、という方法の、O(N^2)のものですね。
scanfで入力を読み込んだつもりになって、実際に読み込めたかどうかをチェックせずに処理を進めているのはよくないですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: moririnn

#3

投稿記事 by box » 9年前

みけCAT さんが書きました: scanfで入力を読み込んだつもりになって、実際に読み込めたかどうかをチェックせずに処理を進めているのはよくないですね。
まあそれくらいは大目に見てあげましょう。今回の問題の本質的なところではないですから。

コード:

#include <stdio.h>

#define N (10)

int main(void)
{
    int a[N];
    int i, j, temp;

    for (i = 0; i < N; i++) {
        scanf("%d", &a[i]);
    }
    for (i = 0; i < N - 1; i++) {
        for (j = i + 1; j < N; j++) {
            if (a[i] < a[j]) {
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }
    for (i = 0; i < 3; i++) {
        printf("%d\n", a[i]);
    }
    return 0;
}
Nの値をもっと小さく(例えば5とか6とか)にしてみて、自分がコンピュータになったつもりで
1行ずつ実行してみるってのはどうでしょうか。
あと、トランプのカードを数枚程度使ってプログラムのとおりに並べ替えてみるとか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

閉鎖

“C言語何でも質問掲示板” へ戻る