Problemi con input/ordinamento

di il
3 risposte

Problemi con input/ordinamento

Salve a tutti, sono nuovo della pagina, mi sono iscritto alla facoltà d'informatica proprio quest anno, e se c'è qualcuno disponibile avrei bisogno di una mano per un programma che sto scrivendo (esercizio). Praticamente mi sono appena addentrato nel Makefile e per esercitarmi volevo scrivere un programma che prendesse in input dalla riga di comanda 3 file: input.txt, Oracle.txt, output.txt. In seguito, leggere un array di interi dal file di input, ordinarlo, e confrontarlo con il file Oracle (dove ho scritto la soluzione e l'output atteso). Mi funziona tutto perfettamente, anche il make, ma nel momento in cui voglio sapere se il file di input (ordinato) e il file Oracle coincidono ed è andato tutto bene, il test case mi ritorna 0 (gli array non sono uguali). Qualcuno ha dei consigli su dove ho sbagliato?
Questo è il main

#include <stdio.h>
#include <stdlib.h>
#include "array.h"
#define N 50

int main(int argc, char* argv[]) {
    FILE *fp_input, *fp_oracle, *fp_output;

    fp_input = fopen(argv[1], "r");
    if (fp_input == NULL) {
       fprintf(stderr, "Errore apertura del file input\n");
       exit(EXIT_FAILURE);
    }

    fp_oracle = fopen(argv[2], "r");
    if (fp_oracle == NULL) {
       fprintf(stderr, "Errore apertura del file oracle\n");
       exit(EXIT_FAILURE);
    }

    fp_output = fopen(argv[3], "w");
    if (fp_output == NULL) {
       fprintf(stderr, "Errore apertura del file output\n");
       exit(EXIT_FAILURE);
    }

    char line[N];
    int arr_input[N];
    int arr_oracle[N];
    int n_input;
    int n_oracolo;
    int test;
    int i;
    int n;
    int m;

    for (i=1; fgets(line, N, fp_input) != NULL; i++) {
        
       n_input = input_array_str (arr_input, line);
        
       fgets(line, N, fp_oracle);
       n_oracolo = input_array_str (arr_oracle, line);
            
       bubble_sort(arr_input, n_input);
        
       test = compare_arrays(arr_input, arr_oracle, n_input, n_oracolo);

       fprintf(fp_output, "Test case %d: %d\n", i, test);
    }

    fclose(fp_input);
    fclose(fp_oracle);
    fclose(fp_output);

    return 0;
}
Questa invece è l'implementazione delle tre funzione che vedere all'interno
 
 void bubble_sort(int a[], int n){
    int i,j;
    for(i=1;i<n;i++)
        for(j=0;j<n-i;j++)
            if(a[j]>a[j+1])
                swap(&a[j],&a[j+1]);
}

int input_array_str(int a[], char b[]) {
    int i;
    for( i = 0; b[i] != '\n'; i++) {
        a[i]=b[i];
    }
    
    return i;
}

int compare_arrays(int a[], int b[], int n, int m) {
    int i;
    if (n == m) {
    for(i = 0; a[i] != '\n' && b[i] != '\n'; i++) {
        if (a[i] != b[i])
            break;
    }
    }
    if (a[i] == b[i])
        return 1;
    else
        return 0;
}
Grazie a chiunque si interesserà e scusate se magari ho sbagliato ad inserire il codice, ma devo ancora prenderci la mano con il forum.

3 Risposte

  • Re: Problemi con input/ordinamento

    Perché hai scritto la funzione compare_arrays in quel modo?

    Prima di tutto, che succede se n non è == m?
    Poi, che c'entra '\n' con degli array di interi?
    E che succede se viene eseguito il break, quindi gli array sono diversi, cosa viene restituito?
    Infine, che senso ha l'ultima if?
  • Re: Problemi con input/ordinamento

    N ed m sono le dimensioni dei due array e se n non è == m, allora a e b non sono uguali e ritorna 0. Il '\n' è per controllare che finiscano allo stesso momento. Ed infine l'ultima if è solo un ulteriore controllo per verificare se a == b una volta finito il ciclo, in quel caso ritorna 1. Scusami se ci sono errori gravi forse, ma sono proprio alle prime lezioni e stavo cercando di fare un po' da solo. Il prof ancora ci deve dare la soluzione, ma volevo proprio capire perchè non andasse, per questo ho scritto. Se hai qualche consiglio per migliorare, sarò lieto di sentirlo. Grazie ancora dell'interessamento e della pazienza.
  • Re: Problemi con input/ordinamento

    Tom1906 ha scritto:


    non sono uguali e ritorna 0.
    Non è vero ... dove ritorni 0 in questo caso? Manca il codice di cui parli ...
    Il '\n' è per controllare che finiscano allo stesso momento.
    Ma '\n' non ha nulla a che fare con un array di int perché è un carattere che fa parte di una stringa ... se hai dei numeri, il valore '\n' non ti indica proprio nulla.
    un ulteriore controllo per verificare se a[ i ] == b[ i ] una volta finito il ciclo
    Non serve e anzi, nel caso in cui termini il ciclo, accedi ad elementi esterni agli array con una potenziale eccezione di accesso in memoria non consentito.
    Scusami se ci sono errori gravi forse
    Quelli elencati sono tutti errori.

    Il consiglio te l'ho dato. Rivedi i punti che ti ho elencato perché sono sbagliati.
Devi accedere o registrarti per scrivere nel forum
3 risposte