Discussione:
Disegnare un diamante con asterischi
(troppo vecchio per rispondere)
Giovanni
2004-12-02 20:56:52 UTC
Permalink
Ciao a tutti,

Devo disegnare un diamante con quello giu' con
2 for loops. Mi son bloccato, e non riesco a pensare
all'algoritmo al momento. Lo disegna come una clessidra.
C'e' qualcuno che mi potrebbe indirizzare sulla
strada giusta.


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

grazie,

Giovanni
Tobler_One
2004-12-03 14:33:01 UTC
Permalink
Ti andrebbe di farci vedere come hai pensato di realizzare
l'algoritmo, anche se funziona male?
Zio
2004-12-03 17:52:39 UTC
Permalink
Post by Giovanni
Devo disegnare un diamante con quello giu' con
2 for loops. Mi son bloccato, e non riesco a pensare
all'algoritmo al momento. Lo disegna come una clessidra.
C'e' qualcuno che mi potrebbe indirizzare sulla
strada giusta.
*
***
*****
*******
*********
*******
*****
***
*
Mah, cosi` su due piedi io direi una cosa del genere, in C:

void PrintClepsydra( unsigned char bMax )
{
int i, j, sp, st;

if( bMax )
bMax = ( bMax / 2 ) * 2 + 1;

for( i = 0; i < bMax; ++i )
{
sp = abs( bMax / 2 - i ) + 1;
printf( "% *c", sp, '*' );
st = ( bMax - abs( i * 2 - bMax + 1 ) - 1 );
for( j = 0; j < st; ++j )
printf( "*" );
printf( "\n" );
}
}

dove abs e` il modulo del argomento...
Ovviamente questa e` un esercizio che si potra` fare in 10000 modi
diversi...
invece di 2 for se ne possono usare 3 op 4... si puo` non usare il modulo e
cosi` via...
Leonardo Serni
2004-12-08 21:04:35 UTC
Permalink
Post by Giovanni
Ciao a tutti,
Devo disegnare un diamante con quello giu' con
2 for loops. Mi son bloccato, e non riesco a pensare
all'algoritmo al momento. Lo disegna come una clessidra.
C'e' qualcuno che mi potrebbe indirizzare sulla
strada giusta.
Ti serve un criterio per decidere quando un punto e' "dentro" al
diamante e quando no. Potresti dividere il quadratone in quattro
quadranti e usare una versione semplificata dell'algoritmo della
retta.

Questo, ti da' sempre i lati a 45 gradi (il rapporto dei due abs
e' 1), per cui vedi sempre una "fetta" di diamante (se W > H hai
una specie di esagono smozzicato):

#include <stdio.h>

#define H 11
#define W 11

int main()
{
int x, y;
for (y = 0; y < H; y++)
{
for (x=0; x < W; x++)
if (abs(W/2-x)+abs(H/2-y) > ((W+H)/4))
putchar(' ');
else
putchar('*');
putchar('\n');
}
}

Leonardo
--
Nach doiligh domhsa mo chailin a mholadh
'S ni he amhain mar bhi si or
Bhi si mar gath greine a dhul in eadan na gloinne
Is bhi sceimh mhna na finne le mo cailin or
Nino Toscano
2004-12-11 21:32:07 UTC
Permalink
Con questo si può segliere anche la dimensione, scritto in C
Ciao a tutti


#include <stdio.h>
int main()
{
int a, b, e;
int c;
int s;
ciclo:
printf("Immetti un numero dispari compreso tra 1 e 33: ");
scanf("%d", &e);
if ((e%2)==0) {printf("hai immesso un numero pari\n");
goto ciclo; }
else {
if (e>33) {printf("il numero è troppo grande\n");
goto ciclo;}
else {
e=e/2;
b=e;
for ( c=e; c>=0 ; c--) {
printf("\n");

for ( s=c ; s>0 ; s--){
printf(" ");}
for ( a=c-1 ; a<b ; a++) {
printf("*");
}
b=b+1;
}
c=e;
b=e*2;
for ( c=e ; c>0 ; c--) {
printf("\n");
for ( s=c ; s<(e+1) ; s++){
printf(" "); }
for (a=1; a<b; a++) {
printf("*");}

b=b-2; }}}

printf("\n");
return 0;
}
Post by Leonardo Serni
Post by Giovanni
Ciao a tutti,
Devo disegnare un diamante con quello giu' con
2 for loops. Mi son bloccato, e non riesco a pensare
all'algoritmo al momento. Lo disegna come una clessidra.
C'e' qualcuno che mi potrebbe indirizzare sulla
strada giusta.
Ti serve un criterio per decidere quando un punto e' "dentro" al
diamante e quando no. Potresti dividere il quadratone in quattro
quadranti e usare una versione semplificata dell'algoritmo della
retta.
Questo, ti da' sempre i lati a 45 gradi (il rapporto dei due abs
e' 1), per cui vedi sempre una "fetta" di diamante (se W > H hai
#include <stdio.h>
#define H 11
#define W 11
int main()
{
int x, y;
for (y = 0; y < H; y++)
{
for (x=0; x < W; x++)
if (abs(W/2-x)+abs(H/2-y) > ((W+H)/4))
putchar(' ');
else
putchar('*');
putchar('\n');
}
}
Leonardo
--
Nach doiligh domhsa mo chailin a mholadh
'S ni he amhain mar bhi si or
Bhi si mar gath greine a dhul in eadan na gloinne
Is bhi sceimh mhna na finne le mo cailin or
Nino Toscano
2004-12-11 22:30:40 UTC
Permalink
ops mi sono sbagliato questo disegna un rombo scusate!
Post by Nino Toscano
Con questo si può segliere anche la dimensione, scritto in C
Ciao a tutti
#include <stdio.h>
int main()
{
int a, b, e;
int c;
int s;
printf("Immetti un numero dispari compreso tra 1 e 33: ");
scanf("%d", &e);
if ((e%2)==0) {printf("hai immesso un numero pari\n");
goto ciclo; }
else {
if (e>33) {printf("il numero è troppo grande\n");
goto ciclo;}
else {
e=e/2;
b=e;
for ( c=e; c>=0 ; c--) {
printf("\n");
for ( s=c ; s>0 ; s--){
printf(" ");}
for ( a=c-1 ; a<b ; a++) {
printf("*");
}
b=b+1;
}
c=e;
b=e*2;
for ( c=e ; c>0 ; c--) {
printf("\n");
for ( s=c ; s<(e+1) ; s++){
printf(" "); }
for (a=1; a<b; a++) {
printf("*");}
b=b-2; }}}
printf("\n");
return 0;
}
Post by Leonardo Serni
Post by Giovanni
Ciao a tutti,
Devo disegnare un diamante con quello giu' con
2 for loops. Mi son bloccato, e non riesco a pensare
all'algoritmo al momento. Lo disegna come una clessidra.
C'e' qualcuno che mi potrebbe indirizzare sulla
strada giusta.
Ti serve un criterio per decidere quando un punto e' "dentro" al
diamante e quando no. Potresti dividere il quadratone in quattro
quadranti e usare una versione semplificata dell'algoritmo della
retta.
Questo, ti da' sempre i lati a 45 gradi (il rapporto dei due abs
e' 1), per cui vedi sempre una "fetta" di diamante (se W > H hai
#include <stdio.h>
#define H 11
#define W 11
int main()
{
int x, y;
for (y = 0; y < H; y++)
{
for (x=0; x < W; x++)
if (abs(W/2-x)+abs(H/2-y) > ((W+H)/4))
putchar(' ');
else
putchar('*');
putchar('\n');
}
}
Leonardo
--
Nach doiligh domhsa mo chailin a mholadh
'S ni he amhain mar bhi si or
Bhi si mar gath greine a dhul in eadan na gloinne
Is bhi sceimh mhna na finne le mo cailin or
Zio
2004-12-13 08:42:23 UTC
Permalink
Sarebbe meglio che quotassi correttamente e togliessi le parti inutili...
Post by Nino Toscano
Post by Nino Toscano
Con questo si può segliere anche la dimensione, scritto in C
Ma lo facevano anche gli altri programmi!?!
Post by Nino Toscano
Post by Nino Toscano
#include <stdio.h>
int main()
{
int a, b, e;
int c;
[cut...]

Mmmm, senza che ti offendi,
ma forse era meglio evitare questo post, perche` a parte che il thread non
e` stato piu` cagato da chi l'ha iniziato, poi hai risposto in ritardo con
del codice che non e` migliore di quello gia` spedito 10 e 5 gg fa...
e poi, se proprio volevi postare anche il tuo, dovevi farlo in risposta alla
richiesta iniziale... (per i motivi di cui prima...)
Post by Nino Toscano
ops mi sono sbagliato questo disegna un rombo scusate!
?!?
Non ho capito era una battuta? Nel caso conviene mettere uno smile...


P.S.
Comunque, visto che ce ne` l'occasione, voglio ripostare la mia un po'
perfezionata e piu` leggibile di prima ;-)


void PrintClepsydra( unsigned char bMax )
{
int i, j, sp, st;

bMax = ( bMax & 0xFE ) | 0x01;

for( i = 0; i < bMax; ++i )
{
sp = abs( bMax / 2 - i ) /*+ ( 80 - bMax ) / 2*/;
for( j = 0; j < sp; ++j )
putchar( ' ' );

st = bMax - abs( i * 2 - bMax + 1 );
for( j = 0; j < st; ++j )
putchar( '*' );

putchar( '\n' );
}
}
Nino Toscano
2004-12-13 13:49:24 UTC
Permalink
Non mi offendo, anzi visto che ne sai più di me ti chiedo di spiegarmi il
tuo, io ho cominciato a studiare il C solo da un mese, anzi ieri sera ho
cercato di studiare il primo che hai postato, ma non mi è molto chiaro.
Saluti ciao.(non è una presa in giro).
Post by Zio
Sarebbe meglio che quotassi correttamente e togliessi le parti inutili...
Post by Nino Toscano
Post by Nino Toscano
Con questo si può segliere anche la dimensione, scritto in C
Ma lo facevano anche gli altri programmi!?!
Post by Nino Toscano
Post by Nino Toscano
#include <stdio.h>
int main()
{
int a, b, e;
int c;
[cut...]
Mmmm, senza che ti offendi,
ma forse era meglio evitare questo post, perche` a parte che il thread non
e` stato piu` cagato da chi l'ha iniziato, poi hai risposto in ritardo con
del codice che non e` migliore di quello gia` spedito 10 e 5 gg fa...
e poi, se proprio volevi postare anche il tuo, dovevi farlo in risposta alla
richiesta iniziale... (per i motivi di cui prima...)
Post by Nino Toscano
ops mi sono sbagliato questo disegna un rombo scusate!
?!?
Non ho capito era una battuta? Nel caso conviene mettere uno smile...
P.S.
Comunque, visto che ce ne` l'occasione, voglio ripostare la mia un po'
perfezionata e piu` leggibile di prima ;-)
void PrintClepsydra( unsigned char bMax )
{
int i, j, sp, st;
bMax = ( bMax & 0xFE ) | 0x01;
for( i = 0; i < bMax; ++i )
{
sp = abs( bMax / 2 - i ) /*+ ( 80 - bMax ) / 2*/;
for( j = 0; j < sp; ++j )
putchar( ' ' );
st = bMax - abs( i * 2 - bMax + 1 );
for( j = 0; j < st; ++j )
putchar( '*' );
putchar( '\n' );
}
}
Zio
2004-12-13 14:30:34 UTC
Permalink
[Premessa]
Per quanto riguarda il comportamento nei news group leggi sempre il
MANIFESTO del news in questione (che e` un messaggio spedito molto
frequentemente), in particolare news:***@id.news.nic.it
Dico questo riferendomi ad es. alla quotatura: cioe` per un migliore
leggibilita` del messaggio, dovresti scrivere l'eventuale domanda o frase da
replicare...
Post by Nino Toscano
Non mi offendo, anzi visto che ne sai più di me
No, qui non e` questione E ci tengo a *dirlo*!!!
La questione e` che hai risposto un bel po' dopo ad una risposta gia` data
(quella di Leonardo Ser) senza darne valore aggiunto, ANZI!!!
Post by Nino Toscano
ti chiedo di spiegarmi il tuo,
Poi dopo dico due parole...
Post by Nino Toscano
io ho cominciato a studiare il C solo da un mese,
bene :-)
Post by Nino Toscano
anzi ieri sera ho
cercato di studiare il primo che hai postato, ma non mi è molto chiaro.
Lascia stare il primo, che se pur giusto, sfrutta alcune potenzialita` che
complicano solo la leggibilita` del codice...
guarda il secondo, anche se a dire il vero, forse e` piu` interessante
quello di Leonardo Serni che per altro permette anche altre forme come
esagoni....
Allora metto un po' di commenti


// Funzione che stampa a video un rombo pieno
// bMax: dimensione massima (numero di asterischi del lato maggiore)
void PrintClepsydra( unsigned char bMax )
{
int i, j, sp, st;

// rendo dispari il numero (operando con i bit)
bMax = ( bMax & 0xFE ) | 0x01;

for( i = 0; i < bMax; ++i )
{
// sp che sta per "space-spazi" indica quanti spazi devo essere
messi
// in funzione di i (in pratica e` la formula del modulo della retta
// con gli assi spostati: Y = | X | dove Y = y e X = max/2 - x
sp = abs( bMax / 2 - i ) /*+ ( 80 - bMax ) / 2*/;

// ciclo che stampa gli spazi stabiliti
for( j = 0; j < sp; ++j )
putchar( ' ' );

// st che sta per "star-asterisco" indica quanti asterischi
// devo essere messi, e` in funzione di i
// (in pratica e` la formula ribaltata del modulo della retta)
st = bMax - abs( i * 2 - bMax + 1 );

// ciclo che stampa gli asterischi stabiliti
for( j = 0; j < st; ++j )
putchar( '*' );

// inseriche un a capo, per poter stampare al ciclo sucessivo
// nella nuova riga
putchar( '\n' );
}
}
Post by Nino Toscano
Saluti ciao.(non è una presa in giro).
Mi domandavo se lo era, perche` tu hai detto:
< ops mi sono sbagliato questo disegna un rombo scusate! >
e la cosa sa di battuta infelice!?!

Ciao
Zio
2004-12-13 14:33:12 UTC
Permalink
Post by Zio
void PrintClepsydra( unsigned char bMax )
OPS, dovrebbe essere:

void PrintDiamond( unsigned char bMax )
j***@hotmail.com
2005-01-04 14:36:33 UTC
Permalink
Grazie a tutti per aver risposto.
Post by Giovanni
Ciao a tutti,
Loading...