SOTTOMATRICI

di il
12 risposte

SOTTOMATRICI

Ragazzi ho un problema nel creare una sottomatrice. Probabilmente ciò che sbaglio è nel fatto che sono una frana ad usare il return. Qualcuno può darmi gentilmente un mano ?

#include <stdio.h>
#define MAX 100


void inputmat (int *row, int *col, int mat[][MAX]);
void output_input_mat (int row, int col, int mat[][MAX]);
int elimina_colonne_righe (int row, int col, int mat[][MAX]);
int crea_sottomatrice ( int ord, int row, int col,int mat[][MAX]);
void output_sottomatrice ( int ord, int row, int col,int mat[][MAX]);


main()
{
int modulo, row, col, ord, mat[MAX][MAX],sottomatr[row-1][col-1], sr=0, sc=0, FLAG;
printf("Inserisci numero di righe:");
scanf("%3d",&row);
printf("Inserisci numero di colonne:");
scanf("%3d",&col);
modulo=(row+col)%2;
printf("La matrice inserita è di tipo:%dx%d, quindi di ordine %d\n",row,col,ord);
inputmat (&row,&col,mat);
output_input_mat ( row,  col, mat);
if(modulo==0)
  {
  elimina_colonne_righe (row, col,mat);
  crea_sottomatrice ( ord, row, col,mat);
  output_sottomatrice ( ord, row, col, mat);
  }
}




void inputmat (int *row, int *col, int mat[][MAX])
{
int i, j;
for(i=0;i<*row;i++)
{
for(j=0;j<*col;j++)
{
printf("a[%d][%d]:",i,j);
scanf("%d",&mat[i][j]);
}
}printf("\n");
}




void output_input_mat (int row, int col, int mat[][MAX])
{
int i,j;
for(i=0;i<row;i++)
   {
       for(j=0;j<col;j++)
       {
           printf("%3d",mat[i][j]);
       }
    printf("\n");
   }
}



int elimina_colonne_righe (int row, int col, int mat[][MAX])
{
  int i,j,r,c;
  do
  {
  printf( "\nquale riga eliminare?( un numero tra 0 e %d )\n", row );
  scanf ( "%d", &r);
  }while(r>0&&i<row);
  do
    {
    printf( "\nquale colonna eliminare?( un numero tra 0 e %d )\n", col );
    scanf ("%d", &c);
    } while(c>0 &&  j<col);
return r,c;
}



int crea_sottomatrice ( int ord, int row, int col,int mat[][MAX])
{
int i,j,r,c,FLAG,sr,sc,sottomatr[row-1][col-1];
for ( i=0; i<row; i++ )
  {
  if ( i==r-1 ) {continue;}
  if ( FLAG=0 ) {FLAG=0; sr++;}
sc=0;
for ( j=0; j<col; j++ )
{
if ( j==c-1 ) {continue;}
sottomatr[sr][sc]=mat[i][j];
FLAG=1;
sc++;
}return sottomatr[sr][sc];
}
}


void output_sottomatrice ( int ord, int row, int col,int mat[][MAX])
{
int i,j,sottomatr[i][j];
for ( i=0; i<row-1; i++ )
{
printf("\n");
for ( j=0; j<col-1; j++ )
  {
printf("%d\t", sottomatr[i][j] );
  }
}
printf("\n\n");

}

12 Risposte

  • Re: SOTTOMATRICI

    Io personalmente non conosco il codice con cui hai scritto il programma, che e' piutosto incasinato, e presumo che sia in C, e vorrei chiederti un paio di chiarimenti, anche perche non conoscendo il linguaggio alcune teorie potrebbero essere sbagliate.

    Come mai ha definito MAX, ti serve come dimensione massima per le righe e colonne? lo hai usato per inizializzare la matrice e da quello che riesco a seguirti rimane sempre a 100.
    a cosa serve la variabile intera ord, dall'output nons ono riuscito a capirlo dal momento che non mi dice molto anche perche non e' nemmenos tato inizializzato in qualche modo.
    la variabile modulo posso intuirne l'uso, quando il valore di row e col sono etrambe o pari o dispari esegui la if, anche se non ne capisco la motivazione.
    come mai hai pasato in 2 medo differenti i parametri dei metodi in input e output, alla fine eseguono lo stesso tipo di lavoro dentro la funzione chiamata.
    incoerenza del metodo elimina, al suo interno hai scritto semplicemente il codice per l'aquisizione ma non quello della modifica della matrice.
    hai richiesto la restituzione da 3 metodi ma non ha salvato in nessuno dei casi i valori da loro restituiti, quindi ne capisco il senso.
    I nomi in inglese possono confondere prova a cambiarli tutti in italiano, ti ritroveresti meglio.
    Poi per la stampa della matrice iniziale e finale puo essere tranquillamente lo stesso metodo, basta semplicemente passargli i parametri adeguati. e per mantenere la correttezza delgi indicatori di riga e colonna, passi i il puntamento ai valori che nel caso di elimina riga, colonna( che ti converrebbe scrivere in 2 metodi separati uno per riga e uno per colonna ) vengono adeguatamente decrementati, nel caso della sottomatrice fai un calcolo adeguato per ottenere le nuove dimensioni.
    ti consigliere di aprire un nuovo file vuoto e iniziare da capo procedendo un pezzo per volta e ricompilando ogni volta con prova.
    Una cosa importante che dovresti capire e' che la macchina non fa nulla che non gli viene oradinato quindi qualunque cosa hai in mete e che vuoi sia eseguito devi scrivere ilc odice appropriato per il tuo codice.
    Io ti ho fatto un'analisi iniziale ora qualcuno che conosce questo codice potrebbe aggiungere.
  • Re: SOTTOMATRICI

    Allora il linguaggio è il C .Quando tu mi dici che ho richiesto la restituzione da 3 metodi ( che poi sarebbero funzioni in C) m a non ho salvato in nessuno dei casi i valori restituiti, sta nel fatto che faccio un uso sbagliato del return. Potresti darmi una mano a capire bene questa cosa ? Poi per quanto riguarda la variabile ord... Per ord io volevo intendere l' ordine della matrice.
  • Re: SOTTOMATRICI

    Grazie in anticipo e correggimi se dico delle fesserie
  • Re: SOTTOMATRICI

    luka_00@hotmail.it ha scritto:


    Allora il linguaggio è il C .Quando tu mi dici che ho richiesto la restituzione da 3 metodi ( che poi sarebbero funzioni in C) m a non ho salvato in nessuno dei casi i valori restituiti, sta nel fatto che faccio un uso sbagliato del return. Potresti darmi una mano a capire bene questa cosa ? Poi per quanto riguarda la variabile ord... Per ord io volevo intendere l' ordine della matrice.
    avevo intuito che significasse ordine, ma quale sarebbe il senso??
    Per spiegarti cosa si intede per return con variabile, ti posso fare l'esempio della matematica, e l'informatica ha moltissime similitudini, e' come quando scrivi sen(x), sen() e' la tua funzione, e la x la variabile, quando asegni il valore 90(gradi) a sen() lui procede con il calcolo e ti restituisce il risultato 1. e facendo finta che tu non sappia cosa sia e cosa faccia il sen() e che non hai memoria al di fuori di un foglio, tu hai bisogno di scriverlo sul foglio, altrimenti dopo non sapresti piu' che valore ha. Quindi quando richiedi una restituzione da una funzione in genere quel valore deve essere memorizzato da qualche parte( in una variabile per esempio ) per poter essere utilizzato anche in futuro.
  • Re: SOTTOMATRICI

    Comunque sia il valore MAX dovresti usarlo per un controllo se l'utente inserisce un valore troppo grande e non come valori per inizializzare la dimensione della matrice.
    Tempo fa ho fatto un po di C, e di assembler quindi un po di puntatori ci capisco.
    Intanto come ti dicevo dovresti correggere le parte inutili del codice, e sono i valori sr, e sc che presumo debbano essere gli indicatori delle colonne da eliminare a dover essere passati per indirizzo alla funzione elina riga e colonna insieme a row, col anche senza la matrice visto che non la usi nemmeno.
    dopo dovrai ripassare nuovamente questi parametri alla funzione che ti crea la sottomatrice, anche per valore, e dovrai ricreare la sottomatrice come hai fatto e copiarci dentro i valori della originale, solo che nel ciclo quando incontri l'indice della colonna e della riga dovrai saltare la copia e passare avanti. Dopo questo non dovrai fare altro che fare matrice uguale sottomatrice, senza aver bisogno di nessuna.
    Ora non mi ricordo se anche in C una matrice e' organizzata come array di array, se e' cosi potresti fare la trasposta, copiaglie gli array attraverso i puntatori escludendo quella che nn vuoi, poi fai nuovamente la trasposta e e rifai la copia escludendo l'altra che devi eliminare. in Java sono organizzati in forma righe di array, se tieni le [righe][colonne].
    Prima di fare questo esercizio ti conviene fare piu pratica a livello basilare.
  • Re: SOTTOMATRICI

    Secondo te cosa c'è di errato quì
    
    int row, col,sottomatr[row-1][col-1];
    
  • Re: SOTTOMATRICI

    skynet ha scritto:


    secondo te cosa c'è di errato quì
    
    int row, col,sottomatr[row-1][col-1];
    
    Questo non l'avevo visto, anche questo e gravissimo. Volevo scrivere l'errore ma è meglio che ci arrivi da solo.
  • Re: SOTTOMATRICI

    Qui non comprendo perche passa i puntatori di riga e colonna se poi non li modifica
    
    void inputmat (int *row, int *col, int mat[][MAX]);
    
  • Re: SOTTOMATRICI

    Quindi semplicemente :
    int row, col,sottomatr[row-1][col-1];
    
  • Re: SOTTOMATRICI

    ??
  • Re: SOTTOMATRICI

    Che valori hanno riga e colonna nel momento in cui crei la matrice?
  • Re: SOTTOMATRICI

    @luka, come ti ho consigliato devi riscrivere il codice da capo, tentare di correggere questo diventa molto piu' lungo.
Devi accedere o registrarti per scrivere nel forum
12 risposte