Piramide in una matrice C

di il
5 risposte

Piramide in una matrice C

Ciao ho una matrice 80x80 che ho dichiarato come char
inizialmente è composta da caratteri spazio ma devo sostituire una X in modo che mi venga disegnata una piramide.
così:

x
xxx
xxxxxx


Come posso fare? di sicuro c'è un FOR e poi?
Grazie

5 Risposte

  • Re: Piramide in una matrice C

    Bhe,guardardo mi viene in mente:
    1) la prima X parte dal centro
    2) la successiva parte da una posizione in meno e finisce una posizione in piu'
    3) le X incrementano di 2

    per cui, supponendo di avere un buffer, dove size è uguale a 80, sarebbe:
    
    void fill (char *buf,int size)
    {
      int i,j,len;
      
      for (len=1,i=size/2;len<=size;i+=(size-1),len+=2)
      {
          for (j=0;j<len;j++)
            buf[i+j]='X';
      }
    }
    
    Rimane da considerare un fatto... mezza altezza della piramide inferiore è sprecata.
    Per esempio una matrice da 5x5 visualizzerebbe qualcosa di simile (+==space) ma le due righe inferiori
    rimarrebbero vuote
    
    ++X++
    +XXX+
    XXXXX
    +++++
    +++++
    
    Saluti,
    Max
  • Re: Piramide in una matrice C

    Grazie!! fantastico funziona!
    si ho notato anche io la storia che metà matrice è sprecata....ma credo che possa andare.

    Questo è il codice completo di come ho implementato la tua funzione.
    Però mi potresti dire il principio base che hai usato? please
    #include <stdio.h>
    void fill (char *buf,int size);
    int main()
    {
        char cellula[80][80]={' '};
        int i,j;
        
            for (j=0;j<40;j++)
            {
                fill(cellula,80);
            }
    
        for (i=0;i<80;i++){
            for (j=0;j<80;j++){ 
                printf("%c",cellula[i][j]);
            }
        }
    getch();
    }
    void fill (char *buf,int size)
    {
        int i,j,len;
        
        for (len=1,i=size/2;len<=size;i+=(size-1),len+=2)
        {
            for (j=0;j<len;j++)
                buf[i+j]='X';
        }
    }
    
  • Re: Piramide in una matrice C

    Prego.

    Ci sono delle imperfezioni nel codice che hai scritto:
    1) Inizializzazione array cellula - Non è sufficiente definire <spazio> il primo carattere dell'array -
    gli altri elementi possono essere sporchi. Le soluzioni:
    
    ...
       for (i=0;i<80;i++)
          for (j=0;j<80;j++)
             cellula[i][j]=' ';
    ...
    // oppure
    ...
       memset (&cellula[0][0],' ', 80*80);
    ..
    
    2) Non devi ciclare 40 volte su fill(cellula,80) - devi chiamarla solo una volta
    3) E' incorretto il passaggio del primo argomento alla funzione fill - Alcuni compilatori lo segnalano:
    >warning: passing argument 1 of ‘fill’ from incompatible pointer type
    >note: expected ‘char *’ but argument is of type ‘char (*)[80]’
    bisona passare l'indirizzo del primo elemento cioè:
    &cellula[0][0]
    4) La visualizzazione che usi dovrebbe aggiungere un '\n' all'uscita del secondo ciclo

    Chiarimento:
    Quando si definisce un array multidimensionale, si alloca della memoria contigua nell' heap.
    Per cui se definisco cellula[80][80] possono tranquillamente affermare che l'indirizzo:
    &cellula[1][0]  == (&cellula[0][0])+80.
    Soluzione:
    Conoscendo questo, rilevando dei valori di incremento costante, vado direttamente a puntare sull'elemento da modificare che nel tuo caso si trova sempre ad 80-1 dal precendente. La lunghezza di riempimento aumenta sempre di 2.
    Avrei potuto scrivere fill usando un solo ciclo for. Per esempio:
    
    void fill (char *buf,int size)
    {
      int i,len;
      
      for (len=1,i=size/2;len<=size;i+=(size-1),len+=2)
            memset (buf+i,'X',len);
    }
    
    Saluti,
    Max
  • Re: Piramide in una matrice C

    Ok grazie mille!
    adesso ho eliminato anche i warning
  • Re: Piramide in una matrice C

    Di niente fabio. Spero ti sia tutto chiaro -questo è importante-

    ~Max~
Devi accedere o registrarti per scrivere nel forum
5 risposte