Spazi vuoti in C
Qualcuno può dirmi come scrivere una serie di numeri usando il ciclo "for" con un numero di spazi vuoti a sinistra variabile in base alla riga?
(Ad esempio nel seguente modo:
1
_1
__1
___1
____...)
(Ad esempio nel seguente modo:
1
_1
__1
___1
____...)
Risposte
Immagino intendessi così:
È abbastanza semplice: il ciclo va da 1 a N, ad ogni iterazione, prima di stampare 1, devi stampare i spazi (dove "i" non è un articolo sbagliato, ma la variabile del ciclo).
1 1 1 1 …
È abbastanza semplice: il ciclo va da 1 a N, ad ogni iterazione, prima di stampare 1, devi stampare i spazi (dove "i" non è un articolo sbagliato, ma la variabile del ciclo).
Ma non so come dare il comando per stampare un numero variabile di spazi...
"Pierlu11":
Ma non so come dare il comando per stampare un numero variabile di spazi...
TI basta usare una funzione che stampa un singolo spazio, e chiamarla "i" volte.
Visto che a lezione ancora non facciamo le funzioni e dovrei fare una cosa del genere in un esercizio, non c'è nessun comando da inserire direttamente in "printf" come per la spaziatura normale?
Esegui "i" volte l'istruzione
printf(" ");
"Pierlu11":
Visto che a lezione ancora non facciamo le funzioni e dovrei fare una cosa del genere in un esercizio, non c'è nessun comando da inserire direttamente in "printf" come per la spaziatura normale?
In teoria sì, ma dubito sia questo l'obiettivo dell'esercizio.
Non devi creare tu una funzione che stampa un singolo spazio, puoi usare printf(" ");.
#include <stdio.h> int main() { const int N = 10; for (int i = 0; i < N; ++i) { // ??? Come fare per chiamare la seguente funzione "i" volte? printf(" "); // ??? printf("1\n"); } return 0; }
L'esercizio è stampare il triangolo di tartaglia fino alla riga n inserita come input... in questo modo penso che mi complicherei eccessivamente...
Ecco una soluzione funzionante: due cicli for annidati e siamo a posto! 

#include <stdio.h> int main() { const int N = 10; int i, j; for (i = 0; i < N; ++i) { for(j=0; j<i; j++) printf(" "); printf("1\n"); } return 0; }
Su quella soluzione nono pienamente d'accordo ma risulterebbe abbastanza pesante e contorta nel programma che sto facendo... cercavo qualcosa di più immediato
La soluzione che il professore ha in mente è senza dubbio quella proposta.. Tuttavia dovrebbe funzionare anche il seguente comando (che non ti spiegherò invitandoti a cercare sul manuale il funzionamento di printf).
EDIT:
In alternatica anche il seguente funziona:
printf("%*s1\n", i, "")
EDIT:
In alternatica anche il seguente funziona:
printf("%*d\n", i+1, 1)
"Pierlu11":
Su quella soluzione nono pienamente d'accordo ma risulterebbe abbastanza pesante e contorta nel programma che sto facendo... cercavo qualcosa di più immediato
Mah… Sono 2 righe (o 3, racchiuderei sempre il corpo di for, if… tra parentesi graffe). Non mi sembra così contorto. Quanto al pesante, stai scrivendo un programma che calcola il triangolo di Tartaglia. L'unica modifica che farei è usare putc(' ') invece di printf(" ").
Nota ovviamente che quelle righe di codice che ho scritto saranno certamente più "pesanti" dei cicli proposti in quando printf deve fare tantissime operazioni in più. L'uso di putchar (o putc) per inserire gli spazi è invece praticamente immediato. Mi sembra stupido preoccuparsi di quanto possa essere computazionalmente oneroso un ciclo senza comprendere che cosa stanno facendo le funzioni che stai usando. Inoltre, se un ciclo di quel tipo "ti spaventa" e non hai già più voglia di scriverlo, dubito imparerai mai a programmare o passerai questo esame.