2016-02-22 9 views
11

Scrivere un programma che richiede all'utente un input n (si assuma che l'utente inserisca un intero positivo) e stampa solo i contorni del triangolo usando gli asterischi '*' di altezza n.Come stampare questo motivo? Non riesco ad ottenere la logica per eliminare la parte centrale

Ad esempio, se l'utente immette 6 quindi l'altezza del triangolo dovrebbe essere 6 come mostrato di seguito e non ci dovrebbero essere spazi fra gli asterischi in alto linea:

****** 
* * 
* * 
* * 
** 
* 

non può capire come stampare la parte tra la cima e la fine del motivo? Questo è il mio codice:

n = int(input("Enter a positive integer value: ")) 
for i in range (n, 0, -1): 
    print ("*" * i) 

Il ciclo for è per la stampa del triangolo asterischi inverso. Ostacolo è quello di stampare la parte centrale.

risposta

15

In ogni iterazione del ciclo for Si stampa una riga del motivo e la sua lunghezza è i. Quindi, nella prima e nell'ultima riga del modello, avrai "*" * i. In ogni altra riga del motivo, è necessario stampare uno * all'inizio della riga, uno * alla fine e gli spazi (i - 2) nel mezzo perché sono già state stampate 2 stelle, il che risulta in "*" + (" " * (i - 2)) + "*". Dopo aver combinato i due casi, otteniamo il seguente codice:

n = int(input("Enter a positive integer value: ")) 
for i in range(n, 0, -1): 
    if i == 1 or i == n: 
     print("*" * i) 
    else: 
     print("*" + (" " * (i - 2)) + "*") 
+1

Non riesco a capire l'ultima parte. Puoi spiegare per favore? –

+0

Bene nel mezzo del pattern, devi stampare uno '*' all'inizio della riga, uno '*' alla fine, e '(i-2)' spazi nel mezzo perché 2 stelle sono già state stampate. Questo è praticamente tutto. –

+0

Ah, capito. Grazie. –

10

provare la seguente, si evita di usare un if dichiarazione all'interno della for ciclo:

n = int(input("Enter a positive integer value: ")) 
print('*' * n) 

for i in range (n-3, -1, -1): 
    print ("*{}*".format(' ' * i)) 

print('*') 

Per 6, si otterrà il seguente output:

****** 
* * 
* * 
* * 
** 
* 

Si potrebbe anche gestire il caso speciale di 1 come segue:

n = int(input("Enter a positive integer value: ")) 

if n == 1: 
    print '*' 
else: 
    print('*' * n) 

    for i in range (n-3, -1, -1): 
     print ("*{}*".format(' ' * i)) 

    print('*') 
5

Inserire condizioni diverse per diversi modi di stampa.

Utilizzando operatore ternario, si può rendere un codice di una riga:

n = int(input("Enter a positive integer value: ")) 
for i in range (n, 0, -1): 
    print ("*" * i if i == n or i == 1 else "*" + " " * (i - 2) + "*") 

noti che si hanno solo due modi di stampa.

Il trucco è quello di:

Si noti che è in realtà di stampare continuamente quando i == n or i == 1:

****** 
* 

Ma per il resto ti danno spazi ben (i - 2)

* * #for 5, 3 spaces 
* * #for 4, 2 spaces 
* * #for 3, 1 space 
** #for 2, 0 space 

(Nota: ** can essere classificato come entrambi i casi, tuttavia)

E così puoi fare una dichiarazione di 1 linea per realizzarla.

Edit:

Oppure, come Bakuriu suggerito nel commento, è possibile sfruttare il booleano risultato di valutazione Python come 1 quando è vero e 0 quando falso stamparlo senza operatore ternario in questo modo:

n = int(input("Enter a positive integer value: ")) 
for i in range (n, 0, -1): 
    print('*' + '*'[i==n]*(i-2) + '*' * (i>1)) 
+1

Anche uno più corto: 'print ('*' + '*' [i == n] * (i-2) + '*' * (i> 1))' – Bakuriu

+0

@Bakuriu Eeeek !!! Non posso credere che puoi * trovare * uno che è * quello * corto. Ma hai ragione ... è ancora più corto! ;) – Ian

+0

@Bakuriu risposta modificata. Ne vale senz'altro la pena. ;) – Ian

3

un ciclo for sarebbe più compatto, ma un ciclo while è forse più semplice se non siete abituati a loop Python

print('*'*n) 
num_spaces = n - 3 # bounded by two stars, and one char shorter 
while num_spaces >= 0: 
    print('*' + ' '*num_spaces + '*') 
    num_spaces = num_spaces - 1 
if n > 1: # Don't need another asterisk for 1 
    print('*') 
2

Questo è simile ad altri ... basta usare rjust() per rendere gli spazi nel mezzo.

def print_a_triangle(n): 
    print("*" * (n+3)) 
    for i in range(n): 
     print("{}{}{}".format("*", str(" ").rjust(n-i), "*")) 

    print("*") 

print_a_triangle(6) 

********* 
*  * 
*  * 
* * 
* * 
* * 
* * 
* 
Problemi correlati