# SIDBMS per MMTS
# Esercizio  19/10/20

# PUNTO 1. Scrivere una funzione verificaStringa(str) che
# verifica che una data stringa non inizi per numero e
# non sia vuota.  La funzione restituisce True se la
# stringa passata è valida, altrimenti restituisce False

def verificaStringa(stringaInput):
    # Esempi di input errato: "123Ciao" "" "0prova"
    # dobbiamo controllare la lunghezza della stringa e che
    # il primo carattere non sia un numero.

    # Controlliamo la lunghezza della stringa. Se è zero
    # la funzione restituisce False.
    if len(stringaInput)==0:
        return False
    # Altrimenti verifichiamo il primo carattere.
    # Se è un numero restituisce False
    else:
        primocarattere = stringaInput[0]
        # possiamo creare una lista di caratteri vietati.
        caratteriVietati = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']
        # se il primocarattere è nella lista dei caratteri vietati:
        if primocarattere in caratteriVietati:
            # restituisci False
            return False
        else:
            return True


# Soluzione alternativa che utilizza il metodo isnumeric()
# delle stringhe (non visto a lezione).
# Il metodo isnumeric restituisce True solo se la stringa è
# interamente composta da numeri.

def verificaStringaV2(stringaInput):
    # Se le stringa è "non piena" oppure se il primo carattere è un numero
    if (not stringaInput) or (stringaInput[0].isnumeric()):
        # restituisci False
        return False
    else:
        return True

# Test
# print(verificaStringa("1ciao"))
# print(verificaStringa("ciao"))
# print(verificaStringa(""))


# PUNTO 2. Scrivere una funzione aggiungiPuntoevirgola(str)
# che sostituisce ogni caratteri di spazio della stringa
# passata alla funzione come argomento, con un carattere di punto e
# virgola e restituisce tale stringa.

def aggiungiPuntoevirgola(testo):
    # Possiamo splittare il testo dove trova il carattere di spazio " "
    testoSplittato = testo.split()
    testoComposto = ""
    # e creare la stringa unendo le parole e aggiungendo il ";"
    for parola in testoSplittato:
        testoComposto += (parola+";")
    # dobbiamo restiture la stringa dopo aver rimosso il ";" finale
    return testoComposto[:-1]

# Soluzione alternativa che sostituisce direttamente
# i caratteri di spazio " " con il carattere ";"
def aggiungiPuntoevirgolaV2(testo):
    testoComposto = ""
    for carattere in testo:
        if carattere == " ":
            testoComposto += ";"
        else:
            testoComposto += carattere
    return testoComposto

# Provare ad usare il metodo replace(old,new) delle stringhe
# (non visto a lezione) che implementa la sostituzione della
# stringa "old" con la stringa "new"

def aggiungiPuntoevirgolaV3(testo):
    return testo.replace(" ",";")


# PUNTO 3. Scrivere un programma “main” (da eseguire solo se
# il file python non è importato) che chiede all’utente di
# inserire il suo nome.
# Quindi, usando la funzione verificaStringa, verificare che
# la stringa del nome inserita non inizi per numero e non sia
# una stringa vuota.
# Finché il nome non soddisfa questi requisiti, il programma
# continua a chiedere di inserire il nome.

if __name__ == "__main__":
    check = False
    while not check:
        nome = input("inserisci il tuo nome: ")
        # per effettuare la verifica usiamo la funzione
        # implementata prima
        check = verificaStringa(nome)

# PUNTO 4. Il programma deve poi creare un file con nome
# uguale al testo inserito dall’utente.
# Creare il file con il costrutto with open - as

    with open(nome, "w") as fileAperto:
        pass

# PUNTO 5. Ora il programma chiede all’utente di inserire una
# sequenza di numeri separati da spazio.
# Il programma deve verificare che la stringa contenga
# solo numeri, altrimenti gestire l’errore.
# Se l’inserimento è corretto il programma scrive nel file
# creato prima i numeri inseriti dall’utente in una riga,
# ma separati dal carattere di punto e virgola,
# utilizzando la funzione  aggiungiPuntoevirgola per creare
# la stringa.

    # Creo un ciclo che finchè la stringa inserita non è corretta
    # continua a chiedere all'utente di inserire l'input.
    done = False
    while not done: # corrisponde a: while done == False
        inputUtente = input("digita una sequenza di numeri: ")
        # esempio di input atteso: "3 3.14 100"
        listaInput = inputUtente.split()
        # risulterà: ["3","3.14","100"]

        # per verificare che i singoli elementi sono numerici
        # posso provare la conversione.
        # Se la conversione da errore significa che almeno uno
        # degli elementi non è convertibile.
        try:
            for i in listaInput:
                float(i)
            done = True
        except:
            print("I dati inseriti non sono corretti. Riprova.")

        # In alternativa, provare ad utilizzare il metodo
        # isnumeric() delle stringhe che restituisce True se
        # la stringa da cui è chiamato è composta da numeri.
        # Esempio:
        # >>> miastringa = "32"
        # >>> result = miastringa.isnumeric()
        # result è True.


        # Ora sostituiamo gli spazi con il ";" utilizzando la funzione
        # definita sopra.
        stringaDaScrivere = aggiungiPuntoevirgola(inputUtente)
        # Infine scriviamo la stringa sul file creato prima
        # senza sovrascriverlo.
        with open(nome,"a") as fileAperto:
            fileAperto.write(stringaDaScrivere)
