[C] Programma matrice quadrata

Messaggioda Nicole29 » 30/04/2018, 17:27

Ciao a tutti.
Sto cercando di creare un programma che chieda all'utente di inserire una matrice quadrata e infine che la visualizzi ma il programma mi segnala questi warning e non parte
- warning: 'j' is used uninitialized in this function [-Wuninitialized]
- warning: 'i' is used uninitialized in this function [-Wuninitialized]

il programma è questo

#include <stdio.h>
int main () {

int i, j, rig, col;
int matrix[i][j];

printf ("Inserisci il numero di righe e di colonne di una matrice quadeata\n");
scanf ("%d%d", &rig, &col);

if ( rig != col) {
printf ("Non e' una matrice quadrata\n");
}

else {
printf ("Inserisci gli elementi della matrice\n");
for (i = 0; i < rig; i++)
for (j = 0; j < col; j++)
scanf ("d", &matrix[i][j]);
}

printf ("La matrice e': \n");
for (i = 0; i < rig; i++){
printf ("\n");
for (j = 0; j < col; j++) {
printf ("%d ", matrix[i][j]);
}}

return 0;
}
Nicole29
Junior Member
Junior Member
 
Messaggio: 36 di 126
Iscritto il: 15/12/2017, 16:54

Re: [C] Programma matrice quadrata

Messaggioda claudio86 » 30/04/2018, 19:02

Codice:
int i, j, rig, col;
int matrix[i][j];

Quanto valgono i e j nella seconda linea?
"This theorem, as many others, is proven by writing zero in a creative way…"
claudio86
Senior Member
Senior Member
 
Messaggio: 485 di 1130
Iscritto il: 09/01/2011, 15:12

Re: [C] Programma matrice quadrata

Messaggioda Nicole29 » 30/04/2018, 19:48

In che senso?
Nicole29
Junior Member
Junior Member
 
Messaggio: 37 di 126
Iscritto il: 15/12/2017, 16:54

Re: [C] Programma matrice quadrata

Messaggioda Nicole29 » 30/04/2018, 20:15

Ho risolto grazie
Nicole29
Junior Member
Junior Member
 
Messaggio: 38 di 126
Iscritto il: 15/12/2017, 16:54

Re: [C] Programma matrice quadrata

Messaggioda claudio86 » 30/04/2018, 21:06

Nel senso che stai creando una matrice i x j, ma i e j non sono definiti (che poi è il warning che da il compilatore).
Sarebbe meglio scrivere come hai risolto. Primo, perché qualcuno con lo stesso problema potrebbe trovare questa discussione e risolvere anche lui. Secondo, perché questo particolare problema ha una soluzione semplice che sembra giusta ma in realtà non lo è (o almeno non sempre).
"This theorem, as many others, is proven by writing zero in a creative way…"
claudio86
Senior Member
Senior Member
 
Messaggio: 486 di 1130
Iscritto il: 09/01/2011, 15:12

Re: [C] Programma matrice quadrata

Messaggioda Nicole29 » 30/04/2018, 21:23

Ho dichiarato i e j inizializzandole a 0 così:

int i=O;
int j=0;
Nicole29
Junior Member
Junior Member
 
Messaggio: 39 di 126
Iscritto il: 15/12/2017, 16:54

Re: [C] Programma matrice quadrata

Messaggioda Nicole29 » 30/04/2018, 22:07

L'outputdel programma però non è corretto
Nicole29
Junior Member
Junior Member
 
Messaggio: 40 di 126
Iscritto il: 15/12/2017, 16:54

Re: [C] Programma matrice quadrata

Messaggioda apatriarca » 30/04/2018, 22:51

Secondo, perché questo particolare problema ha una soluzione semplice che sembra giusta ma in realtà non lo è (o almeno non sempre).

Ed in effetti è stato proprio questo il caso..

Prima di tutto non tutti i compilatori C permettono la dichiarazione di un array a partire da valori variabili. Si tratta di una funzionalità introdotta nel C99, ma che ha ricevuto molte critiche ed è stata quindi resa opzionale nel C11 (il nome dopo la C indica la data dello standard corrispondente). La funzionalità è poi presente (con alcune differenze) in alcuni compilatori. Nel C++ non è mai stata introdotta. In generale è meglio evitarla. Inoltre, anche decidendo di farne uso, è necessario che il valore delle dimensioni dell'array nel punto in cui l'array viene dichiarato abbiano un valore sensato. Zero non è certamente la dimensione che vuoi dare al tuo array. Devi invece leggere il valore della dimensione della tua matrice e solo successivamente dichiarare il tuo array (non è necessario dichiarare le variabili all'inizio della funzione o del blocco come sembra esserti stato insegnato). Se non fai uso di questa funzionalità devi invece ricorrere ad una delle seguenti alternative:
1. Dichiarare l'array con una dimensione costante massima per il tuo problema. Puoi per esempio decidere che il tuo programma non funziona per array più grandi di 100x100 e allocare un array di questa dimensione. Quando userai l'array accederai ovviamente solo alla parte che ti interessa.
2. Dichiarare l'array in modo dinamico usando malloc o calloc.

Un'altra cosa che correggerei nel codice è la richiesta di inserire il numero di righe e colonne. Se la matrice deve essere quadrata allora non ha senso chiedere all'utente due valori, è sufficiente chiedergliene uno..
apatriarca
Moderatore
Moderatore
 
Messaggio: 5041 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [C] Programma matrice quadrata

Messaggioda Nicole29 » 01/05/2018, 00:25

Se faccio partire il programma e inserisco come elementi della matrice 1,2,3,4 la matrice che mi da in output ha come prima riga 3,4 e come secondo riga ancora 3,4.. dipende sempre da quel problema?
Nicole29
Junior Member
Junior Member
 
Messaggio: 41 di 126
Iscritto il: 15/12/2017, 16:54

Re: [C] Programma matrice quadrata

Messaggioda Obidream » 01/05/2018, 04:03

Come detto da apatriarca per questo tipo di esercizi conviene usare creare una matrice con dei valori ragionevolmente grandi (MAX_ROWS e MAX_COLUMNS, una matrice 100x100 è più che sufficiente in questo caso) e chiedere in seguito all'utente di inserire i numeri che effettivamente verranno utilizzati come righe e colonne.
Ovviamente bisogna adattare il codice postato qui sotto affinché i numeri inseriti non superino i valori fissati con i 2 define.

Codice:
#include <stdio.h>
#include <stdlib.h>
#define MAX_ROWS 100
#define MAX_COLUMNS 100


int main (void)
{
    int i, j, rig, col;
    int matrix[MAX_ROWS][MAX_COLUMNS];

    printf ("Inserisci il numero di righe e di colonne di una matrice quadeata\n");
    scanf ("%d %d", &rig, &col);
    if ( rig != col)
    {
        printf ("Non e' una matrice quadrata\n");
    }

    else
    {
        printf ("Inserisci gli elementi della matrice\n");
        for (i = 0; i < rig; i++)
        {
            for (j = 0; j < col; j++)
            {
                scanf ("%d", &matrix[i][j]);
            }
        }
    }

    printf ("La matrice e': \n");
    for (i = 0; i < rig; i++)
    {
        for (j = 0; j < col; j++)
        {
            printf ("%2d ", matrix[i][j]);
        }
        printf ("\n");
    }

    return EXIT_SUCCESS;
}
((v & 0xff) && (v & 0xff00) && (v & 0xff0000) && (v & 0xff000000))
Avatar utente
Obidream
Advanced Member
Advanced Member
 
Messaggio: 902 di 2195
Iscritto il: 07/02/2012, 20:57

Prossimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite