Re: [C] Programma matrice quadrata

Messaggioda Nicole29 » 01/05/2018, 11:10

Ok grazie ora funziona correttamente
Nicole29
Junior Member
Junior Member
 
Messaggio: 42 di 126
Iscritto il: 15/12/2017, 16:54

Re: [C] Programma matrice quadrata

Messaggioda apatriarca » 01/05/2018, 19:33

Per completezza ti posto il codice delle altre due soluzioni.

La prima fa uso dei VLA (variable length array). Come ti ho detto è importante che la matrice sia a questo punto dichiarata quando il valore della variabile ha senso. Non va assolutamente usata in situazioni in cui la matrice è grande in quanto l'allocazione è completamente nascosta al programmatore e non c'è modo di sapere se ha avuto successo o meno. Non ho le idee chiare su cosa succeda in questo caso, forse lo standard neanche lo chiarisce.
Codice:
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
    int ordine = 0;

    puts("Inserisci l'ordine della matrice quadrata.");
    scanf("%d", &ordine);

    if (ordine <= 0)
    {
        fputs("Ordine non valido..\n", stderr);
        return EXIT_FAILURE;
    }

    /* Dichiara la matrice a questo punto del codice in modo che ordine sia
       valido..
    */
    int matrix[ordine][ordine];

    puts("Inserisci gli elementi della matrice.");
    for (int i = 0; i < ordine; i++)
    {
        for (int j = 0; j < ordine; j++)
        {
            scanf("%d", &matrix[i][j]);
        }
    }

    puts("La matrice e' la seguente.");
    for (int i = 0; i < ordine; i++)
    {
        for (int j = 0; j < ordine; j++)
        {
            printf("%d ", matrix[i][j]);
        }

        puts("");
    }

    return EXIT_SUCCESS;
}


Questo è invece il codice che fa uso dell'allocazione dinamica. Nota che in questo caso non è più possibile (semplice) accedere agli elementi usando la classica notazione degli array bidimensionali. E' inoltre necessario allocare e deallocare esplicitamente la memoria. In applicazioni reali è spesso la soluzione adottata. Esiste un modo spesso insegnato nei corsi di programmazione base alle università per usare la notazione per gli array bidimensionali anche in questo caso, ma complica enormemente la gestione della memoria, rende il codice più lento con gli unici vantaggi di una notazione più comoda per accedere agli elementi e la possibilità di avere ogni riga con un numero di elementi diverso (ha in effetti usi per rappresentare testi).
Codice:
#include <stdio.h>
#include <stdlib.h>


int main (void)
{
    int ordine = 0;

    puts("Inserisci l'ordine della matrice quadrata.");
    scanf("%d", &ordine);

    if (ordine <= 0)
    {
        fputs("Ordine non valido..\n", stderr);
        return EXIT_FAILURE;
    }

    int *matrix = malloc(sizeof(int)*ordine*ordine);

    puts("Inserisci gli elementi della matrice.");
    for (int i = 0; i < ordine; i++)
    {
        for (int j = 0; j < ordine; j++)
        {
            scanf("%d", &matrix[i*ordine + j]);
        }
    }

    puts("La matrice e' la seguente.");
    for (int i = 0; i < ordine; i++)
    {
        for (int j = 0; j < ordine; j++)
        {
            printf("%d ", matrix[i*ordine + j]);
        }

        puts("");
    }

    free(matrix);

    return EXIT_SUCCESS;
}
apatriarca
Moderatore
Moderatore
 
Messaggio: 5042 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Precedente

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite