1

ユーザーが自分の数字を書き、昇順または降順でソートするかどうかを決定し、バブルソートで並べ替えるコードを作成しようとしています。これは私がこれまでに書くことができたものです(別名、明らかな入り口)。

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

int main()
{
  int n, a, number;
  printf("Enter your numbers. Write -1 to stop. \n");
  do {
    scanf("%d", &a);
  } while(a != -1);
  printf("Enter 1 if you want them to be in ascending order. Enter 2 if you want  descending order\n");
  scanf("%d", &a);
  if(a = 1)
    do {
      system("PAUSE");
      return 0;
    }

私の問題は、バブルソートをそれにマージする方法が本当にわからないことです。すべての例で、事前に設定された配列を見つけることができました。for 構造から始めるべきだと思っていますが、わかりません。

編集:

ヘルプのおかげでここまで来ました.1または2を書くまで「動作」し、その後クラッシュします。助言がありますか?

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

int main()
{
int myarray[100],index,a,b,swap,turn;
index=0;
printf("Enter your numbers. Write -1 to stop. \n");
do{
            scanf("%d", &myarray[index]);
            index++;
            }while(myarray[index-1] != -1);
printf("Enter 1 if you want them to be in ascending order. Enter 2 if you want   descending order\n");
scanf("%d",&b);
if(b == 1) {
   for(turn=1; turn <= myarray[100] -1; turn++)

   for(index = 0; index <=  myarray[100]; index++)
   {
   if (myarray[index] > myarray[index+1]){ 
    swap  = myarray[index];
    myarray[index]   = myarray[index+1];
    myarray[index+1] = swap; }
    }
}
else {
   for(turn=1; turn <= myarray[100] -1; turn++)

   for(index = 0; index <=  myarray[100]; index++)
   {
   if (myarray[index] < myarray[index+1]){ 
    swap  = myarray[index];
    myarray[index]   = myarray[index+1];
    myarray[index+1] = swap; }
    }
}   
system("PAUSE");
return 0;
} 
4

4 に答える 4

2

入力を単一の変数に保存していますa。これは、さらに入力を読み取るたびに上書きされます。最後に提供された入力だけでなく、提供されたすべての入力をプログラムが認識できるように、各入力を保存する必要があります。

配列は、連続して配置された同じ型の変数の集まりであり、単一の名前とインデックスでアクセスされます。

int arr[10];

この例arrでは、 は 10 個の連続した を構成しintます。で配列の最初にアクセスし、 で最後intの配列にアクセスします。入力を配列に取得するには、 の適切なインデックスに格納できます。ユーザーがこれまでに入力した数字の数をカウントすることで、適切なインデックスを維持できます。カウントは、入力配列へのインデックスとして使用されます。ユーザーが宣言で定義された配列境界を超えないようにしてください。そうしないと、配列に関連付けられた最後の位置を超えてデータを格納しようとすると、未定義の動作が発生します (これが発生すると、バッファー オーバーランと呼ばれます)。arr[0]arr[9]aarr

入力を配列に読み取った後、配列をバブル ソート関数に渡すことができます。

次のような入力ルーチンがあるとします。

#define MAX_ARR 10
int a;
int entered = 0;
int arr[MAX_ARR];
while (entered < MAX_ARR) {
    if (scanf("%d", &a) != 1) break;
    if (a == -1) break;
    arr[entered] = a;
    ++entered;
}
if (entered == MAX_ARR) {
    printf("No more room in the array (max is %d)\n", MAX_ARR);
}

scanfが期待される戻り値を返すことを確認しました。ストップ値に対して入力をチェックし、配列が保持できる以上のデータをユーザーが入力できないようにしました。

配列に入力された要素の数は ですentered。したがって、配列を反復処理するには、ループは次のようになります。

int i;
for (i = 0; i < entered; ++i) {
    printf("arr[%d] = %d\n", i, arr[i]);
}

バブル ソートの非常に単純なバージョンは、スワップを行う必要がなくなるまで配列をループし続けることです。2 つの連続する要素が目的の順序になっていない場合はいつでも入れ替えます。昇順の場合:

int j, swaps, unsorted = entered;
do {
    swaps = 0;
    for (j = 1; j < unsorted; ++j) {
        /* ... if arr[j-1] and arr[j] need to swap then:
                   swap them, and
                   increment swaps ... */
    }
} while (swaps > 0);

配列の最後の位置にある要素は、バブリング ループの 1 つの完全なパスの最後に並べ替えられた位置にあることがわかっているため、unsorted完全なパスごとに の数を減らすことができます。

于 2012-07-21T16:40:58.333 に答える
2

これらの数値を配列やベクトルなどのある種のデータ構造に格納する必要があるという点で、あなたは正しいです。ユーザーが入力する数字の数がわからないため、ベクトルは適切な選択です。コードに適用できるスケッチを次に示します。

#include <vector>

int main()
{
  // ...
  std::vector<int> userInts;
  // ... get input 
  userInts.push_back(a); // add int to the end of the list

  bubbleSort(userInts);
  // ...
}

編集:これが C++ ではなく C としてタグ付けされていることに気付きませんでした。std::vectorC (または独自のベクトル実装) で配列を動的に割り当てるコードで呼び出しを交換するだけです。または、 N 個の整数のみが入力されることがわかっている場合は、 を宣言int userInts[N]し、入力をループして、配列に挿入し、並べ替えます。

EDITx2:上記の固定長配列でこれを行うには、以下の @ user315052 の回答を参照してください。

于 2012-07-21T16:41:36.080 に答える
1

最初のバージョンでは、固定サイズの配列があると言います

int myarray[100];
//Accept the integers 

index=0;
do {
    scanf("%d", &myarray[index]);
    index++;
}    while(myarray[index-1]!= -1);

これで、配列と要素の総数のカウントが得られました - (index-1)

並べ替えアルゴリズムを配列に適用できます。

于 2012-07-21T16:45:43.283 に答える
0
#include <stdio.h>
#include <stdlib.h>

typedef enum _order {
    Ascending=1, Descending
} order;

void swap(int *x, int *y){
    int wk;
    wk=*x;*x=*y;*y=wk;
}

int needSwap(int x, int y, order dir){
    if(dir == Ascending)
        return x > y;
    if(dir == Descending)
        return x < y;
    return 0;
}

void bubbleSort(int *array, int top, int end, order dir){
    int i, j, swaped;
    for(i = top; i < end; ++i){
        swaped = 0;
        for(j = top + 1; j <= end - i; ++j)
            if(needSwap(array[j-1], array[j], dir)){
                swap(&array[j-1], &array[j]);
                swaped = 1;
            }
        if(swaped == 0)break;
    }
}

int main(){
    int myarray[100], index, order;
    index=0;
    printf("Enter your numbers. Write -1 to stop. \n");
    do{
        scanf("%d", &myarray[index++]);
    }while(myarray[index-1] != -1 && index < 100);
    --index;//Correction to point to the final value
    printf("Enter 1 if you want them to be in ascending order.\n"
           "Enter 2 if you want descending order\n");
    scanf("%d",&order);
    bubbleSort(myarray, 0, index-1, order);
    {//result print
        int i;
        for(i=0;i<index;++i)
            printf("%d ", myarray[i]);
        printf("\n");
    }
    system("PAUSE");
    return 0;
}
于 2012-07-22T02:02:30.530 に答える