PDA

Visualizza la versione completa : [C++] Disegno figure geometriche


mistergks
17-02-2011, 12:49
So che per disegnare figure geometriche vanno fatti cicli for nidificati...
per non ci riesco proprio...dovrei capire bene il meccanismo.
Ad esempio questo programma:
leggere da input la misura dwel lato di un quadrato e visualizzare un quadrato il cui lato formato del numero di asterischi digitato. Gli unici caratteri stampati sono asterischi e spazi. Il programma deve funzionare per qualsiasi numero intero tra 1 e 20. Per esempio se l'utente digita 5 il programma visualizza:
*****
* *
* *
* *
* *
*****

la mia bozza:


#include <iostream>
using namespace std;

int main(){
int x;
cin>>x;
for(int i=1; i<=x; i++){
for(int j=1; j<=x; j++)
cout<<'*';
cout<<endl;
}

system("pause");
return 0;

}




Questo visualizza un quadrato pieno...a me servirebbe un quadrato delimitato e vuoto all'interno..come si fa?!

Laikius91
17-02-2011, 13:49
Devi ragionare sugli indici... tu devi riempire prima riga (i = 1), ultima riga (i = x), prima colonna (j = 1), ultima colonna (j = x), giusto?
Quindi all'interno del ciclo dovrai verificare se sono rispettate queste condizioni:

Pseudocodice:




for (i = 1; i <= x; i++)
{
for (j = 1; j <= x; j++)
{
if (i = 1 || i = x || j = 1 || j = x) stampare '*';
altrimenti stampare ' ';
}
}

mistergks
17-02-2011, 16:20
ah piu' semplice di quel che pensavo! e invece per quanto riguarda un triangolo ad esempio? mi sembra piu difficile:

faccio sempre i due for innestati e gioco con gli indici in un if?

mistergks
17-02-2011, 16:47
ho provato a scrivere in codice c++ lo pseudocodice tuo...e mi da un output sbagliato:
***** ** ** *****

il codice questo:


#include <iostream>
using namespace std;

int main(){
int x;
cin>>x;

for (int i = 1; i <= x; i++){

for (int j = 1; j <= x; j++){
if (i == 1 || i == x || j == 1 || j == x)
cout<<'*';
else
cout<<' ';


}
}
system("pause");
return 0;

}

Laikius91
17-02-2011, 17:48
Ho fatto un paio di prove e in sostanza va bene anche se manca l' "andare a capo" dopo ogni ciclo!
Il ciclo ottimale cos secondo me:



for (i = 1; i <= x; i++)
{
for (j = 1; j <= x; j++)
{
if (i == 1 || j == 1 || i == x || j == x)
cout<<"* ";
else
cout<<" ";
}
cout<<endl;
}


Nota che ho aggiunto uno spazio sia all'asterisco che allo spazio, in modo da fare un'incolonnamento regolare!

Funziona?? :)

mistergks
17-02-2011, 19:27
ok ora perfetto! posto la versione completa compilata e funzionante per i lettori! ;)



#include <iostream>
using namespace std;

int main(){
int x;
cin>>x;

for (int i = 1; i <= x; i++){

for (int j = 1; j <= x; j++){
if (i == 1 || i == x || j == 1 || j == x)
cout<<"* ";
else
cout<<" ";

}
cout<<endl;
}
system("pause");
return 0;

}



Da quel che ho capito...il primo for controlla gli asterischi in colonna, il secondo for controlla le righe?!
Per quanto riguarda i triangoli e le altre figure geometriche il procedimento sempre lo stesso?

Laikius91
17-02-2011, 19:50
Originariamente inviato da mistergks
ok ora perfetto! posto la versione completa compilata e funzionante per i lettori! ;)



#include <iostream>
using namespace std;

int main(){
int x;
cin>>x;

for (int i = 1; i <= x; i++){

for (int j = 1; j <= x; j++){
if (i == 1 || i == x || j == 1 || j == x)
cout<<"* ";
else
cout<<" ";

}
cout<<endl;
}
system("pause");
return 0;

}



Da quel che ho capito...il primo for controlla gli asterischi in colonna, il secondo for controlla le righe?!
Per quanto riguarda i triangoli e le altre figure geometriche il procedimento sempre lo stesso?

B devi pensare che agli indici "i" fai corrispondere le righe e agli indici "j" fai corrispondere le colonne:
in pratica per ognuna delle "i" del primo ciclo, hai un sottociclo che fa variare gli indici "j", ossia per ogni riga variano tutti gli indici di colonna, capito circa?

Una soluzione forse pi efficiente sarebbe quella di usare una matrice di caratteri e di riempirla di spazi o di asterischi a seconda delle esigenze!
In ogni caso, per tutte le figure geometriche devo solo riflettere su quali posizioni della tua tabella bi-dimensionale riempire!
E' chiaro che con figure diverse da un quadrato la faccenda si pu parecchio complicare!

mistergks
17-02-2011, 20:04
sisi ho capito! magari provo a fare un triangolo a qualcos altro e posto la mia soluzione...e ne riparliamo! ;) grazie

mistergks
18-02-2011, 00:49
credevo di aver capito...ma invece mi rendo conto che non ho ancora capito molto....
potreste spiegarmi come ragionare in termini di indice???
Cio per un quadrato ho capito perch ho visto il codice ...
ma un triangolo come lo formo?
dovrei cambiare solo la condizione dell'if vero?
ho provato a fare cosi'. ma nulla:



int x;
cin>>x;
for(int i=1; i<=x; i++){
for(int j=1; j<=x; j++){
if( j==x/2 || i==x/2 )
cout<<'*';
else
cout<<' ';
}
cout<<endl;

Laikius91
18-02-2011, 09:10
Originariamente inviato da mistergks
credevo di aver capito...ma invece mi rendo conto che non ho ancora capito molto....
potreste spiegarmi come ragionare in termini di indice???
Cio per un quadrato ho capito perch ho visto il codice ...
ma un triangolo come lo formo?
dovrei cambiare solo la condizione dell'if vero?
ho provato a fare cosi'. ma nulla:



int x;
cin>>x;
for(int i=1; i<=x; i++){
for(int j=1; j<=x; j++){
if( j==x/2 || i==x/2 )
cout<<'*';
else
cout<<' ';
}
cout<<endl;




Eh per un triangolo la faccenda complessa... Perch ogni riga fa conto per s...
Intanto bisognerebbe capire come si vuole questo triangolo, direi che la cosa pi semplice farlo isoscele..
Prova a immaginarti una matrice ad esempio 5x9 di caratteri, per ora riempita di punti:



. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .


Adesso devi pensare a come riempirla di asterischi, per ottenere una cosa come:



. . . . * . . . .
. . . * . * . . .
. . * . . . * . .
. * . . . . . * .
* * * * * * * * *


La base facile ( la riga i = 5), i lati molto meno, mi sa che devi pensare ad ogni singolo asterisco dove si trova (ad esempio il vertice in alto i = 5 && j = 1)...

Loading