2017-09-21 7 views
-2

EDIT: Ce n'est en aucun cas un doublon de ma question précédente. Mon code a été modifié en conséquence à la réponse que j'ai reçue de mon fil précédent et je reçois toujours ces erreurs, qui ne sont pas les mêmes que je demandais la dernière fois. J'écris le code pour trier les intervalles entrés par un utilisateur en utilisant le tri de fusion. Il prend l'entrée d'un utilisateur qu'il stocke dans une structure interval qu'il utilise pour trier dans l'ordre croissant. Il utilise des valeurs positives et négatives pour vérifier si le côté intervalle est ouvert ou fermé, mais cela n'est pas pertinent pour le code en cours d'exécution. Voici mon code et un échantillon du type de sortie que je reçois. Merci à tous pour votre aide.Quelle est l'erreur logique dans mon tri Merge C

#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

sortie sous forme de texte:

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

conditionnelle après ce qui est montré dans l'image que vous avez donné en tant que texte à côté du question. –

+0

Je reçois deux avertissements lorsque je compile ceci - ignorez-vous les avertissements ou les avez-vous désactivés pour une raison quelconque? Quoi qu'il en soit, le second avertissement semble intéressant: '83:10: avertissement: résultat de l'expression non utilisé [-Wunused-value] temp.left_state;' - cette ligne est-elle destinée à faire quelque chose d'utile? –

+0

@PaulR Il vérifie si l'intervalle est ouvert ou fermé sur le côté gauche, mais il n'est pas utilisé dans mon algorithme de tri, je vérifie juste une fraction par rapport à une autre. –

Répondre

0

était juste manque une itération de K après une