2017-09-21 10 views
-2

編集:これは決して私の前の質問と重複していません。私のコードは私の以前のスレッドから受け取った答えに応じて変更されていますが、私は前回の質問と同じものではないこれらのエラーをまだ受けています。マージソートCのロジックエラーは何ですか

私は、マージソートを使ってユーザーが入力した間隔をソートするコードを書いています。昇順でソートするために使用する構造体intervalに格納されているユーザからの入力を受け取ります。インタバル側が開いているか閉じているかを確認するのに正と負の値を使用しますが、実行されるコードには関係ありません。以下は私のコードと私が得ている出力のタイプのサンプルです。どのような助けを求めても、あまりにも多くの皆さんに感謝します

#include <stdio.h> 

typedef struct interval{ 
    int num_left, denum_left; 
    int num_right, denum_right; 
    int left_state, right_state; 
}interval; 

interval combine(interval x, interval y); 
int combineCheck(interval x, interval y); 
int valueCheck(interval x, interval y); 
void mergeSort(interval x[], int l, int r); 
void merge(interval x[], int l, int m, int r); 
interval takeInput(); 

int main(){ 
    int response, i; 
    char d; 
    printf("Enter the number of intervals to input: "); 
    scanf("%d", &response); 
    interval data[response]; 

    for(i = 0; i < response; i++){ 
     data[i] = takeInput(); 
    } 

    mergeSort(data, 0, response-1); 
    printf("%d %d %d\n", data[0].num_left, data[1].num_left, data[2].num_left); 
    for(i = 0; i < response; i++){ 
     printf("%d/%d %d/%d\n", data[i].num_left, data[i].denum_left, data[i].num_right, data[i].denum_right); 
    } 

} 

interval takeInput(){ 
    interval temp; 
    printf("Enter left numerator: "); 
    scanf("%d", &temp.num_left); 
    printf("Enter left denominator: "); 
    scanf("%d", &temp.denum_left); 
    printf("Enter right numerator: "); 
    scanf("%d", &temp.num_right); 
    printf("Enter right denominator: "); 
    scanf("%d", &temp.denum_right); 
    printf("\n"); 

    if(temp.num_left < 0){ 
     temp.num_left = temp.num_left*-1; 
     temp.left_state = -1;} 
    else{ 
     temp.left_state = 0;} 

    if(temp.num_right < 0){ 
     temp.num_right = temp.num_right*-1; 
     temp.right_state = -1;} 
    else{ 
     temp.right_state = 0;} 
    return temp; 
} 

int combineCheck(interval x, interval y){ 
    int left, right; 
    left = x.num_right * y.denum_left;   //used to find relationship between 2 fractions 
    right = y.num_left * x.denum_right; 

    if(left == right && (x.right_state + x.left_state) == 0){ 
     return 1; 
    } 
    else if(left > right){ 
     return 1; 
    } 
    return 0; 
} 

interval combine(interval x, interval y){ 
    int left, right;      //used to check if one interval is all encompassing 
    left = x.num_right * y.denum_right; 
    right = x.denum_right * y.num_right; 

    interval temp; 
    temp.num_left = x.num_left; 
    temp.denum_left = x.denum_left; 
    temp.left_state; 
    if(left > right){ 
     temp.num_right = x.num_right; 
     temp.denum_right = x.denum_right; 
     temp.right_state = x.right_state; 
     return temp; 
    } 
    temp.num_right = y.num_right; 
    temp.denum_right = y.denum_right; 
    temp.right_state = y.right_state; 
    return temp; 
} 

int valueCheck(interval x, interval y){ 
    int first, second;     //used to check values 
    first = x.num_left * y.denum_left; 
    second = y.num_left * x.denum_left; 
    if(first > second){ 
     return 1; 
    } 
    return -1; 
} 

void mergeSort(interval x[], int l, int r){ 
    if(l < r){ 
     int m = l + (r-l)/2; 

     mergeSort(x, l, m); 
     mergeSort(x, m+1, r); 
     merge(x, l, m, r); 
    } 
} 

void merge(interval arr[], int l, int m, int r){ 
    int i, j, k; 
    int n1 = m-l +1; 
    int n2 = r-m; 

    interval L[n1], R[n2]; 

    for(i = 0; i < n1; i++) 
     L[i] = arr[l + i]; 
    for(j = 0; j < n2; j++) 
     R[j] = arr[m + 1 + j]; 
    j = 0; 
    i = 0; 
    k = l; 
    while(i < n1 && j < n2){ 
     if(valueCheck(L[i], R[j]) == -1){ 
      arr[k] = L[i]; 
      i++; 
     } 
     else{ 
      arr[k] = R[j]; 
      j++; 
     } 
    } 

    while(i < n1){ 
     arr[k] = L[i]; 
     i++; 
     k++; 
    } 

    while(j < n2){ 
     arr[k] = R[j]; 
     j++; 
     k++; 
    } 
} 

enter image description here

テキストとして出力:

Enter the number of intervals to input: 5 
Enter Left numerator: 1 
Enter left denominator: 1 
Enter right numerator: 1 
Enter right denominator: 1 

Enter Left numerator: 2 
Enter left denominator: 1 
Enter right numerator: 2 
Enter right denominator: 1 

Enter Left numerator: 3 
Enter left denominator: 1 
Enter right numerator: 3 
Enter right denominator: 1 

Enter Left numerator: 4 
Enter left denominator: 1 
Enter right numerator: 4 
Enter right denominator: 1 


Enter Left numerator: 5 
Enter left denominator: 1 
Enter right numerator: 5 
Enter right denominator: 1 

5 5 3 
5/1 5/1 
5/1 5/1 
3/1 3/1 
5/1 5/1 
5/1 5/1 
+0

条件付きポスト後にKの反復がありませんでした質問。 –

+0

これをコンパイルすると2つの警告が表示されます。警告を無視しているのですか、何らかの理由で無効にしていますか?とにかく、2番目の警告は面白そうです: '83:10:警告:未使用の式の結果[-Wunused-value] temp.left_state;' - その行は何か役に立つものですか? –

+0

@PaulR間隔が左側で開いているか閉じているかをチェックしますが、ソートアルゴリズムでは使用されていません。 –

答えて

0

はちょうどあなたが一緒にテキストとして与えた画像に示されているもの

関連する問題