Es. 21. 08/05

Da aptiva.

E' ottima l'idea di tenere il dato come stringa (in questo caso non dobbiamo usare il valore numerico).

C'e' un piccolo errore (banale) frutto penso del copia/incolla. Nella riga 55:

 stringaA+='  '*nrSpazi+ matrice[riga][colonna]+' '

gli spazi moltiplicati per nrSpazi sono due e non uno, e questo sfasa il risultato.

Tolto questo problemino il codice funziona benissimo ed e' una bella soluzione.

Ecco la mia soluzione (in python3):

def LeggiMatrice():
  righe=[]
  while True:
    riga=input('')
    if riga:
      righe.append(riga.split())
    else:
      break;
  return righe

def LunRighe(righe):
  ncampi=0
  for r in righe:
    ncampi=max(ncampi,len(r))
  lun=[0]*ncampi
  for riga in righe:
    for i in range(len(riga)):
      lun[i]=max(lun[i],len(riga[i]))
  return lun

def Stampa1(righe,lun):
  for riga in righe:
    outriga=''
    for i in range(len(riga)):
      outriga+=' '*(lun[i]-len(riga[i]))+riga[i]+' '
    print(outriga)

def Stampa2(righe,lun):
  for riga in righe:
    for i in range(len(riga)):
      print(' '*(lun[i]-len(riga[i])),riga[i],' ',sep='',end='')
    print()

def Stampa3(righe,lun):
  for riga in righe:
    for i in range(len(riga)):
      print("{:>{}s} ".format(riga[i],lun[i]),end='')
    print()

righe=LeggiMatrice()
lun=LunRighe(righe)
Stampa1(righe,lun)
Stampa2(righe,lun)
Stampa3(righe,lun)

Assomiglia molto a quella di Ruta. Alcune note (didattiche):

  • si puo' fare lo split gia' durante la lettura
  • ho messo un esempio di break nella lettura
  • non e' necessario uniformare il numero degli elementi per riga, basta dimensionare la lista delle lunghezze al massimo numero di elementi
  • ho proposto tre funzioni di stampa: fanno la stessa cosa in tre modi leggermente diversi.

stampa1, usa il modo che abbiamo visto: usa una stringa e accumula in essa i campi da stampare; stampa2, usa una print per campo (con l'accortezza di non aggiungere spazi fra i campi, sep=, e di non andare a capo a fine stampa, end=) stampa3, usa il metodo format, in particolare usa la sintassi di format per specificare specificare l'ampiezza del campo con un parametro. "{:>{}s}" indica: '>' giustificato a destra, {} la lunghezza e' un parametro, "s" e' una stringa (questo se non e' chiaro non fa nulla! e' un uso un po' sofisticato della format).

Strumenti personali
Namespace

Varianti
Azioni
Navigazione
Strumenti