Newsgroup: it.comp.lang.c
Titolo: Imperfezione Esercizio :-(

Sono un newbie e sto imparando il C seguendo il Deitel&Deitel. In
particolare cerco di svolgere tutti gli esercizi proposti. E' per questo che
vi chiedo suggerimento, in quanto non riesco a capire l'errore commesso.
Posto prima il testo dell'esercizio e poi il codice. Mi sembra di ricordare
che un aiuto sullo stesso identico esercizio era stato chiesto con un altro
post da un altra persona, ma purtroppo non son riuscito a ritrovare la
discussione, quindi scusatemi :-((
"Scrivere un programma che legga in input il lato di un programma e quindi
lo disegni utilizzando degli asterischi." (il libro dice che la dimensione
dei lati deve esser compresa tra 1 e 20, ma i volevo generalizzare il
problema.)
Per esempio se la dimensione fosse 5, dovrebbe visualizzare:
* * * * *
*          *
*          *
*          *
* * * * *
Ora che vedete il codice non vi mettete a ridere mi raccomando :-))
<CODE>
/*Esercizio 3.34 pag.82.*/
#include <stdio.h>
int main()
{
      int x = 1, y = 1, z = 1,s = 1;
      int lato;
      printf("Immettere il lato del quadrato: ");
      scanf("%d",&lato);
      printf("\n\n");
      while(x <= lato*lato)
      {
        if( x>=0 && x<lato )
             printf("*");
        else if(z == 1 )
          printf("*");
        else
           printf(" ");
        if(z == lato)
           z = 0;
        if(x>lato*lato-lato && x < lato*lato)
           printf("*");
        else if(s == lato)
        {
           printf("*");
           s = 0;
        }else printf(" ");
        if(y == lato)
         {
           printf("\n");
           y = 0;
         }
         x++;
         y++;
         z++;
         s++;
      }
      printf("\n");
      system("PAUSE");
      return 0;
}
<CODE>
In particolare noterete che quando appare a video il quadrato, c'e'
sull'ultima rigra un asterisco di troppo.....
Saluto tutto l' NG!
-Shad-

 
.......
/*Esercizio 3.34 pag.82.*/
#include <stdio.h>
int main()
{
        int x = 1, z = 1;
        int lato;
        printf("Immettere il lato del quadrato: ");
        scanf("%d",&lato);
        printf("\n\n");
        while(x <= lato*lato)
        {
                if(x<=lato || z==1 || z== lato || x>=lato*(lato-1))
                        printf("*");
                else 
                        printf(" ");
                if(z == lato)
                {
                        z = 0;
                        printf("\n");
                }
                x++;
                z++;


Shadow wrote:
Ti allego un idea per risolvere il problema (anche perche' e' complesso e 
lungo e non ho voglia di perdermi li dentro a quelle 4 variabili non 
commentate :P) e una mia soluzione al problema.
La mia soluzione e' diretta: disegni la prima linea (piena), disegni le 
linee da 2 a lato-1 (prima e ultima piene, le altre vuote), disegni 
l'ultima linea (piena). Ah, usa anche delle variabili significative (in un 
problema reale "i" e "j" sono forse piu' intuitivi per chi programma da un 
po', ma visto che sei agli inizi vada per "riga" e "colonna" per i 2 
iteratori).
<code>
    #include <stdio.h>
    int main()
    {
    int lato, colonna, riga;
    printf("Inserisci il lato: ");
    if (scanf("%d", &lato) != 1)
        return 1;
    if (lato > 20 || lato < 0) {
        printf("Il lato dev'essere compreso tra 1 e 20\n");
        return 1;
    }
    /* prima riga */
    for (i_colonna=1; i_colonna<=lato; i_colonna++)
        putchar('*');
    putchar('\n');
    for (riga=2; riga<lato; riga++) /* ovvero da 2 a (lato-1) */
        for (colonna=1; colonna<=lato; colonna++) {
            if (colonna == 1)
                putchar('*');
            else if (colonna == lato)
                puts("*"); /* stampa stringa + newline */
            else
                putchar(' ');
        }
    /* ultima riga */
    for (colonna=1; colonna<=lato; colonna++)
        putchar('*');
    return 0;
    }
</code>
Ecco l'indizio (ho sostituito gli asterischi, con delle lettere, indovina in 
base a che criterio :) ).
    Tua stampa    Mia stampa
    * * * *  *    x x x x  s
    *        *    z        s
    *        *    z        s
    *        *    z        s
    ** * * * *    zx x x x s
Lo spazio in riga 1, tra la 'a' e la 's' viene generato da questo ciclo (che 
scatta quando non deve).
    else if(z == 1 )
        printf("*"); /* asterisco di troppo in ultima riga */
    else
        printf(" "); /* spazio di troppo in prima riga */
Nell'ultima riga un asterisco lo genera la riga di cui sopra, l'altro questa 
(che diventa vera in contemporanea e NON in esclusione):
    if(x>lato*lato-lato && x < lato*lato)
        printf("*");
Il modo piu' semplice di risolverlo e' semplificarlo e prendere esempio da 
quello che ho fatto io, se proprio vuoi correggere quello che hai fatto tu 
(e sarebbe anche un buon esercizio) inizia a controllare le invarianti di 
ciclo: devi evitare che i controlli che ti ho indicato partano assieme
a) puoi mettere degli else if anziche' solo gli else
b) in un ciclo prima di stampare puoi controllare il valore delle altre 
   variabili
Te lo lascio come esercizio.
-- 
Mox
"Trust the programmer."
"Don't prevent the programmer from doing what needs to be done."
"Keep the language small and simple."
"Provide only one way to do an operation."

 ha scritto nel messaggio
news:m_kT9.7166$0v.1...@news1.tin.it...


Grazie tante anche a te Mox!!!!! Con le tue *ottime* spiegazione e
correzioni, e, con le modifiche anche di Alberto ho capito veramente il
problema :-))))
Vi ringrazio tanto... son quasi commosso! :_)     ....non vi preoccupate che
da piangere l'avrete anche voi che chissa' quante altre cose non capirò! :-p
Pero' devo dire che la materia mi sta prendendo molto!
Buon proseguimento a tutti,
-Shad-
P.s. ora lasciatemi andare che son giunto al mio ennesimo esercizio
"tosto".... Devo fare un programmino che prende un numero in BINARIO
dall'utente  e mi stampa a video il corrispondente numero DECIMALE (non e'
lecito usare il for etc... come sempre solo il while,if, if/else :-)
...purtroppo sempre fine capitolo 3 :-))
"Mox" <m...@invalid.mail> ha scritto nel messaggio
news:iqlT9.100049$Ou4.3...@twister2.libero.it...


Fammi indovinare...Politecnico di Torino anche tu :) ?
Ciiips
Aragorn
--
FAQ non ufficiali K7S5A:
http://www.holyword.it/aragorn/ecs_faq.htm

 ha scritto nel messaggio
news:S4JT9.13187$0v.3...@news1.tin.it...
