Sviluppa matrice da array

di il
10 risposte

Sviluppa matrice da array

Salve a tutti dovrei eseguire questo programma in C, il problema è che non riesco a sviluppare la funzione che inserisce nella matrice il numero in base alle ripetizioni

Ecco la traccia:

Leggere in input una sequenza di n numeri interi e inserirli in un array.I primi due elementi della sequenza rappresentano il numero di righe e di colonne di una matrice.I restanti numeri rappresentano, in forma sintetica, la matrice e vanno considerati a coppie(x, y):il primo numero rappresenta il numero di volte che il secondo numero deve essere inserito in posizioni adiacenti della matrice (l' inserimento procede dall' alto in basso e da sinistra a destra).Costruire la matrice e stamparla.

Esempio:
ARRAY
3, 3, 2, 7, 7, 9

MATRICE
7 7 9
9 9 9
9 9 9

Grazie per l' attenzione

10 Risposte

  • Re: Sviluppa matrice da array

    Ma cosa hai scritto? Cosa hai provato a fare? Errori?
  • Re: Sviluppa matrice da array

    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 100

    void matrice(int A[MAX], int n, int h);

    main()
    {
    int A[MAX], B[MAX][MAX], n, i, j, h, r, c;
    printf("Digitare numero elementi: ");
    scanf("%d", &n);
    printf("\n\ndigitare elementi: ");
    for(h=0; h<n; h++){
    scanf("%d", &A[h]);
    printf("%d", A[h]);
    }
    printf("\n\n");
    r=A[0];
    c=A[1];
    matrice(A, n, h);
    for(i=0; i<r; i++){
    for(j=0; j<c; j++)
    printf("%4d", B[j]);
    printf("\n");
    }
    system("pause");
    return 0;
    }


    void matrice(int A[MAX], int n, int h)
    {
    int B[MAX][MAX], x, y, i, j, r, c;
    r=A[0];
    c=A[1];
    for(h=2; h<n; h++){
    x=A[h];
    y=A[h+1];
    }
    for(i=0; i<r; i++){
    for(j=0; j<x; j++)
    B[j]=y;
    }
    return;
    }

    Questo è quello che ho provato a fare ma la funzione che dovrebbe riempire la matrice non so proprio come svilupparla...
  • Re: Sviluppa matrice da array

    Questa sera sn a casa e magari posso aiutarti...
    Magari, per capire meglio, commenta il codice

    Se il problema è impostare la matrice, ti può essere utile convertire le coordinate monodimensionali (prese dal vettore) in bidimensionali (quelle della matrice).
    Così memorizzi in due variabili il valore e il numero di ripetizioni, e con un for () riempi parzialmente la matrice, poi leggi un altra coppia e dinuovo ciclo da dove eri arrivato. Alla fine hai la matrice completa.
  • Re: Sviluppa matrice da array

    Se il problema è impostare la matrice, ti può essere utile convertire le coordinate monodimensionali (prese dal vettore) in bidimensionali (quelle della matrice).
    In che modo?

    Poi nella funzione matrice ho memorizzato il numero di ripetizioni in x e il valore in y, poi non so come procedere...
    come utilizzo il for per far ripetere x volte y nella matrice?
  • Re: Sviluppa matrice da array

    +Convertire coordinate

    int v[tot];
    int m[righe][colonne];

    **********
    v = m[i/colonne][i%colonne]

    m[x][y] = v[(x*colonne)+y]

    **********

    +Ciclo
    
    cnt=0;       //elemento a cui sei arrivato
    
    for(i=0;i<n;i+=2){               //A[i] e' uguale a valore(primo num della coppia)
        for(j=0;j<A[i+1];j++){          //ripete A[i+1] volte l'inserimento di A[i]
            B[cnt/c][cnt%c]=A[i];          //inserisice A[i] nell'elemento "selezionato"  c=numero di colonne 
            cnt++;                          //passa al'elemento sucessivo della matrice(come fosse un vettore)
        }
    }
    
  • Re: Sviluppa matrice da array

    Ps: se i primi due numeri del vettore rappresentano le dimensioni, "i" parte da 2
  • Re: Sviluppa matrice da array

    Scusami ma non mi è molto chiaro..
    la funzione che si occupa di creare la matrice dovrebbe essere così?
    void matrice(int A[MAX], int n, int h)
    {
    	int B[MAX][MAX], j, r, c, cnt;
    	r=A[0];								//numero di righe
    	c=A[1];								//numero di colonne
    	cnt=0;
    	for(h=2; h<n; h+=1){		//A[h+1] e' uguale al secondo num della coppia
    		for(j=0; j<A[h]; j++){		//ripete A[h] volte l inserimento di A[h+1]
    			B[cnt/c][cnt%c]=A[h+1];   //inserisce A[h+1] nelle matrice
    			cnt++;
    			}
    		}
    	return;	
    }
    Il primo num della coppia rappresenta le ripetizioni del secondo...
  • Re: Sviluppa matrice da array

    +Non ha senso passare alla funzione "h" se poi la setti prima del ciclo(a cosa ti serve?)
    +"r=A[1];" è giusto, ma "r" non serve nella funzione( variabile in più, C::B dovrebbe dirti qualcosa tipo "var r set but not used")
    +"h" aumenta di 2 nel ciclo, perchè gli elem del vettore vanno usati a coppie

    +IMPORTANTE: Dato che B è dichiarata in una funzione, e la funzione non ritorna al main alcun riferimento/valore inerente a B, B non può essere "vista" dal main. Come se non fosse mai esistita. Inoltre al termine della funzione viene distrutta(inconveniente evitabile allocandola con malloc(),static, ecc...).

    Una possibile soluzione è passare alla funzione una matrice già allocata visibile al main()
    #include <stdio.h>
    #include <stdlib.h>
    
    
    #include <stdio.h>
    #include <stdlib.h>
    #define MAX 100
    
    void matrice(int A[MAX],int B[MAX][MAX], int n);
    
    int main(int args,char **argv)
    {
        int A[MAX], B[MAX][MAX], n, i, j, h, r, c;
    
        printf(" Digitare numero elementi: ");
        scanf("%d", &n);
        printf("\n\n");
    
        printf(" Digitare numero righe: ");
        scanf("%d",&A[0]);
        printf(" Digitare numero colonne: ");
        scanf("%d",&A[1]);
    
        printf("\n\nDigitare elementi ");
        for(h=2; h<n; h+=2)
        {
            printf("\n");
            printf(" Ripetizioni: ");
            scanf("%d", &A[h]);
            printf(" Valore: ");
            scanf("%d", &A[h+1]);
        }
        printf("\n\n");
    
        r=A[0];
        c=A[1];
    
        matrice(A,B, n);
    
        for(i=0; i<r; i++)
        {
            for(j=0; j<c; j++)
                printf("%4d", B[i][j]);
            printf("\n");
        }
    
        system("pause");
        return 0;
    }
    
    void matrice(int A[MAX],int B[MAX][MAX], int n)
    {
        int j, r, c, cnt;
    
        //r=A[0];                        //numero di righe          //non è sbagliato, ma non serve a questa funzione
        c=A[1];                        //numero di colonne
    
        cnt=0;
        int h;
    
        for(h=2; h<n; h+=2)       //A[h+1] e' uguale al secondo num della coppia
        {
            for(j=0; j<A[h]; j++)       //ripete A[h] volte l inserimento di A[h+1]
            {
                B[cnt/c][cnt%c]=A[h+1];   //inserisce A[h+1] nelle matrice
                cnt++;                  //numero elemento della matrice
            }
        }
    
        return;
    }
    
    O potresti anche far ritornare la matrice ( int** matrice(...) )
    O esistono tanti altri metodi... vedi tu.


    PS: Se la conosci, potresti usare l'allocazione dinamica per renderlo moolto + stabile e meno dispendioso.
  • Re: Sviluppa matrice da array

    Ti ringrazio davvero per il tuo aiuto e le tue spiegazioni

    Un ultima cosa ma questo:

    B[cnt/c][cnt%c]=A[h+1] è l unico modo per riempire la matrice con l elemento A[h+1]?
  • Re: Sviluppa matrice da array

    Non ho capito esattamente cosa chiedi...

    Se intendi dire quello a destra dell '=':
    certo che no, puoi salvare A[h+1] in un'altra variabile e poi scrivere "B[cnt/c][cnt%c]=variabile"

    Se intendi dire quello a sinistra dell '=':
    dinuovo, certo che no! Qui entrano in gioco la tua fantasia e le caratteristiche del programma.
    puoi usare cicli,funzioni,puntatori,ecc... sbizzarrisciti!
Devi accedere o registrarti per scrivere nel forum
10 risposte