Problema array

di il
1 risposte

Problema array

Ragazzi mi sto scervellando su questo esercizio trovato sul deitel (devo andare fondamenti di informatica) che riguardo il cosiddetto grafico tartaruga, posto il codice!
/* 
 * File:   main.c
 * Author: giovanni
 *
 /* 
 * File:   main.c
 * Author: giovanni
 *
 * Created on 20 novembre 2015, 9.51
 */

#include <stdio.h>
#include <stdlib.h>

/*
 * 
 */
enum verso {DESTRA, SINISTRA, SOTTO, SOPRA};

int main(int argc, char** argv)
{
    int i,j; //Indici matrice
    static int x,y; //Indici matrici statiche
    int X,Y; //Utili per i movimenti
    int n; //scelta
    enum verso v; //verso
    int penna=0; //penna
    int floor [60][60];
    v = DESTRA;
  
    for (i=0;i<60;i++) //Azzeramento riga
    {
        for (j=0;j<60;j++) //Azzeramento colonna
        {
            floor[i][j] = 0;
        }
    }
    
    ///////////////////////////////////////
    
    printf("Tabella 50 x 50\n"
            "7.Alza la penna.-9.Abbassa la penna.-6.Gira a destra.-4.Gira a sinistra.-"
            "8.Spostati di 10 posizioni.-5.Stampa -99.Fine\n");
    scanf("%d",&n);
    
    while (n!=99)
    {
        
    switch(n)
    {
        case 7:
            penna = 0; 
            printf("Penna alzata.\n");// alza la penna
        break;
        case 9:
            penna = 1; puts("Penna abbassata.");// abbasse la penna
        break;
        case 6: 
            if (v == DESTRA) {v = SOTTO;  puts("Ora guardo in basso.");}
            else if (v == SOTTO) {v = SINISTRA; puts("Ora guardo a sinistra.");}  //Gira la faccia verso destra
            else if (v == SINISTRA) {v= SOPRA; puts("Ora guardo in alto.");}
            else if (v == SOPRA) {v = DESTRA; puts("Ora guardo a destra.");}
            break;
        case 4: 
            if (v == DESTRA) {v = SOPRA;  puts("Ora guardo in alto.");}
            else if (v == SOTTO) {v = DESTRA;  puts("Ora guardo a destra.");}  //Gira la faccia verso destra
            else if (v == SINISTRA) {v = SOTTO; puts("Ora guardo in basso.");}
            else if (v == SOPRA) {v = SINISTRA; puts("Ora guardo a sinitra.");}
            break;
        case 8: 
            if (v == DESTRA)
            {
                Y = y;
                for (;y<Y+10;y++)
                {
                    floor[x][y] = penna;
                }
                puts("Ho camminato a destra per 10 caselle!");
            }
            
             else if (v==SOTTO)
            {
                  X = x;
                 for (;x<X+10;x++)
                 {
                    floor[x][y] = penna;
                 }
                 puts("Sono sceso di 10 caselle!");
            }
            
            else  if(v== SINISTRA)
            {
                 Y = y;
                 for (;y>Y-10;y--)
                 {
                    floor [x][y] = penna;
                 }
                 puts("Ho camminato a sinistra per 10 caselle!");
            }

            else if (v == SOPRA)
            {
                 X = x;
                 for (;x>X-10;x--)
                {
                    floor[x][y] = penna;
                }
                puts("Sono salito di 10 caselle!");
            }
            break;
        case 5: 
            for (i=0;i<55;i++)
            {
                for (j=0;j<55;j++)
                {
                    if(floor[i][j]==0) printf(" ");
                    else if(floor[i][j]==1) printf("*");
                } 
                puts("");
            } 
            puts("");
            break;
         default: 
            printf("Inserisci un'opzione.\n");
    }
   printf("7.Alza la penna.-9.Abbassa la penna.-6.Gira a destra.-4.Gira a sinistra.-"
            "8.Spostati di 10 posizioni.-5.Stampa -99.Fine\n");
    scanf("%d",&n);
    
    }
    
    puts("Arrivederci!\n");
    return (EXIT_SUCCESS);
}

Sia chiaro questa è una bozza, proprio ieri abbiamo spiegato gli array quindi mi sto impegnando per capirli bene e ho fatto tutto nel main, ma appena risolverò i miei problemi renderò tutto più chiaro con funzioni e commenti adatti! Passando al mio problema:
Il programma funziona perfettamente, ero molto felice quando ho visto che mi creava le forme che io indicavo di fare. Il problema è che però io dico a chi disegna che la tabella è 50 X 50, ma in realtà uso un array di 60 (anche nella stampa metto gli indici minori di 55 ovvero un numero più alto di 50), perchè? perchè pur lavorando con 50 elementi, se metto come lunghezza e larghezza 50, il programma funziona perfettamente fin quando non lavoro con i confini!! Non so se mi spiego, se tipo indicavo di fare il quadrato 50x50 mi faceva cose strane, e non solo! ma non capisco dove sbaglio, in quanto se poi con lo stesso codice faccio il quadrato di 40x40 esce perfettamente. Non capisco! Ho risolto così,indicando l'array di 60 elementi ma lavorando su 50, ma la cosa mi infastidisce perchè so che faccio qualcosa di sbagliato e spreco memoria! se qualcuno copia il mio codice se ne rende conto..! Mi piacerebbe avere anche comunque altri consigli costruttivi, è una settimana che conosco array e funzioni e quindi non è facile per me anche se faccio di tutto per migliorare!

1 Risposte

  • Re: Problema array

    Nel tuo codice i valori di x e y possono variare incontrollate, superando i limiti della matrice.

    E questo determina comportamenti imprevedibili del programma.
Devi accedere o registrarti per scrivere nel forum
1 risposte