PDA

View Full Version : [C] Cicli annidati


sbera
01-10-2009, 20:28
ciao a tutti.
devo fare un programma in C dove, inseriti base e altezza, venga stampato a video un rettangolo di caratteri con base e altezza scelti dall'utente
ora, io mi sono orientato su una strada di cicli while annidati ma non riesco ad arrivare ad una conclusione definitiva
vi posto il codice


#include <stdio.h>

int main()
{
int base=3, altezza=4;

while (altezza>0){
while (base>0){
printf("#") ;
base--;
}
printf("\n");
altezza--;}
getchar();
}


solo che cosi viene stampato a video solo la prima riga di cancelletti e poi va a capo 4 volte (ed ho anche capito il perchè, presumo che prima faccia il ciclo interno con la base e, una volta finito, faccia quello più esterno)

ora però come faccio a fare in modo di ripetere il ciclo interno n volte?

Mesh89
01-10-2009, 20:57
Scusa, ma l'indentazione è qualcosa di veramente osceno :D


#include <stdio.h>

int main() {
int base = 3, altezza = 4;

while (altezza > 0) {
while (base > 0) {
printf("#");
base--;
}
printf("\n");
altezza--;
}
getchar();
}


Così è un attimo più leggibile (IMO).

Allora, il tuo problema è che ottieni il risultato corretto solo per la prima riga, e questo perchè non reimposti il valore di base.
Stampi # fino a che base non raggiunge lo 0, ed è corretto. Ma la seconda volta che arrivi al ciclo, a che valore ti trovi base? E' quello che ti aspetti?

vizzz
01-10-2009, 20:58
uscito dal ciclo della base devi ricaricare la variabile base!

sbera
01-10-2009, 21:05
scusate l'indentazione, sono le prime volte e devo ancora farci la mano :D
cmq si, il problema era proprio quello, alla fine dovevo ricaricare base del suo valore iniziale
grazie a tutti :D

Mesh89
01-10-2009, 21:15
scusate l'indentazione, sono le prime volte e devo ancora farci la mano :D
cmq si, il problema era proprio quello, alla fine dovevo ricaricare base del suo valore iniziale
grazie a tutti :D

Figurati, ci siamo passati tutti ;)

E per l'indentazione, non preoccuparti, lo stile si acquisisce col tempo e con la pratica. Io ne ho cambiati parecchi, e quando vado a rileggere certi miei vecchi codici, inorridisco :D

sbera
01-10-2009, 21:38
ne approfitto per fare un altra domandina veloce
ora che il ciclo funziona lo stavo migliorando con varie printf e scanf però ho un problema. se metto una scanf per leggere il valore di una variabile (base o altezza) e non cambiando altro nella struttura, il programma si esegue troppo velocemente non tenendo conto del getchar :mbe:
praticamente

#include <stdio.h>

int main() {
int base = 3, altezza = 4;

x=base;
while (altezza > 0) {
while (base > 0) {
printf("#");
base--;
}
base=x
printf("\n");
altezza--;
}
getchar();
}
cosi funziona perfettamente
mentre cosi

#include <stdio.h>

int main() {
int base, altezza = 4;

scanf("%d", &base);
x=base;
while (altezza > 0) {
while (base > 0) {
printf("#");
base--;
}
base=x
printf("\n");
altezza--;
system("pause");
}
getchar();
}
il programma non tiene conto del getchar e finisce. ho provato a mettere vari system("pause") per vedere se il programma funziona correttamente e in effetti mettendo il pause dopo altezza-- noto che i cicli li fa correttamente ma quando termina l'ultimo esce direttamente senza tener conto del getchar. come mai?

wingman87
01-10-2009, 23:19
Perché nel buffer di input è rimasto il carattere di ritorno a capo dopo la lettura della base, metti due getchar invece di uno e funzionerà

sbera
02-10-2009, 08:25
risolto mettendo un fflush prima del getchar per pulire il buffer
grazie :D