stefanos59 Δημοσ. 27 Νοεμβρίου 2010 Δημοσ. 27 Νοεμβρίου 2010 Γεια εχω το παρακατω προγραμμα,δεν μου εμφανιζει λαθοι αλλα παρολο αυτα το προγραμμα δεν μου τρεχει,δεν μου δειχνει τιποτα... Αν μπορειται ριξτε του μια ματια.. ευχαριστω εκ των προτερων.. >/************************************************************ Turtle Graphics: turtle.c Use 50x50 array initialized to zeros to simulate a floor. Turtle starts at 0,0 with pen up. When pen is down, set array elements to 1. Display asterisk wherever there is a 1, when program is complete. Command list: 1 Pen up 2 Pen down 3 Turn right 4 Turn left 5,10 Move forward 10 spaces 6 Print the array 9 End of data (sentinel) ************************************************************/ #include <stdio.h> #include <stdlib.h> #define ARRAYMAX 50 /* grid length and width */ #define COMMANDMAX 20 /* max amount of prog commands */ #define BUFMAX 10 /* max length of a command */ enum Direction {NORTH, EAST, SOUTH, WEST}; enum Position {UP, DOWN}; int readProg(int prog[][2], int max); /* read the program */ void doCommand(int command1, int command2, int floor[][ARRAYMAX]); /* process command to the array */ enum Direction dir = NORTH; /* direction turtle is facing */ enum Position pos = UP; /* position of the pen */ int turtlePos[2] = {0}; /* position of the turtle */ int main(void) { int floor[ARRAYMAX][ARRAYMAX] = {{0}, {0}}; /* grid to print */ int prog[COMMANDMAX][2] = {{0}, {0}}; /* program commands */ int commands = 0; /* number of commands in program */ int i = 0; commands = readProg(prog, COMMANDMAX); while (i <= commands) { /* process program */ doCommand(prog[i][0], prog[i][1], floor); i++; } return 0; system("PAUSE"); } int readProg(int prog[][2], int max) { int getCommand(char buffer[], int lim); /* get one command */ void clearBuf(char buffer[], int lim); /* clear temp buffer */ char buffer[bUFMAX]; int i = 0; while (i < max && getCommand(buffer, BUFMAX)) { /* process until sentinel */ prog[i][0] = buffer[0]; if (buffer[0] == '5') /* if command 5, get the argument also */ prog[i][1] = buffer[2]; i++; clearBuf(buffer, BUFMAX); } return i; /* the number of commands, minus sentinel */ } int getCommand(char buffer[], int lim) { int c, i; for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; i++) buffer[i] = c; if (buffer[0] == '9') return 0; else return 1; } void clearBuf(char buffer[], int lim) { int i; for (i = 0; i < lim; i++) buffer[i] = 0; } void doCommand(int command1, int command2, int floor[][ARRAYMAX]) { void printFloor(int floor[][ARRAYMAX]); /* print the finished grid */ int i; switch(command1) { case 1: /* put pen up */ pos = UP; break; case 2: /* put pen down */ pos = DOWN; floor[turtlePos[0]][turtlePos[1]] = 1; /* activate current position */ break; case 3: /* turn right */ if (dir == WEST) dir = NORTH; else dir = SOUTH; break; case 4: /* turn left */ if (dir == NORTH) dir = WEST; else dir =EAST; break; case 5: /* move forward amount of spaces in command2 */ if (dir == NORTH) for (i = 1; i <= command2; i++) { turtlePos[1]++; /* go up on y-axis */ if (pos == DOWN) /* if pen is down, activate each passing spot */ floor[turtlePos[0]][turtlePos[1]] = 1; } else if (dir == EAST) /* go right on x-axis */ for (i = 1; i <= command2; i++) { turtlePos[0]++; if (pos == DOWN) floor[turtlePos[0]][turtlePos[1]] = 1; } else if (dir == SOUTH) /* go down on y-axis */ for (i = 1; i <= command2; i++) { turtlePos[1]--; if (pos == DOWN) floor[turtlePos[0]][turtlePos[1]] = 1; } else if (dir == WEST) /* go left on x-axis */ for (i = 1; i <= command2; i++) { turtlePos[0]--; if (pos == DOWN) floor[turtlePos[0]][turtlePos[1]] = 1; } break; case 6: printFloor(floor); /* print the grid */ break; default: break; } } void printFloor(int floor[][ARRAYMAX]) { /* position 0,0 will be lower left corner */ int i, j; printf("\n"); for (i = ARRAYMAX - 1; i >= 0; i--) { /* in each row... */ for (j = ARRAYMAX - 1; j >= 0; j--) { /* for each column... */ if (floor[j][i] == 1) /* ...print '*' if activated... */ printf("*"); else /* ...and a blank if not */ printf(" "); } printf("\n"); /* after the last column, print a newline */ } }
pinball_elf Δημοσ. 28 Νοεμβρίου 2010 Δημοσ. 28 Νοεμβρίου 2010 Φταίει το σημείο της συνάρτησης readProg που αναθέτεις τη τιμή στη μεταβλητή prog[0], πρέπει να γίνει > prog[i][0] = atoi(buffer); διότι με τον προηγούμενο κώδικα > prog[i][0] = buffer[0]; αν π.χ. το buffer[0] ήταν ίσο με '1' (char), τότε η prog[0] θα είχε την τιμή 49 (int) για να δουλέψει το παραπάνω πρέπει και η getCommand να αλλαχτεί > int getCommand(char buffer[], int lim) { int c, i; for (i = 0; i < lim -1 && (c = getchar()) != EOF && c != '\n'; i++) { if (c != '\n') buffer[i] = c; else { buffer[i] = '\0'; break; } } if (buffer[0] == '9') return 0; else return 1; } επίσης για να δείς τα οποιαδήποτε αποτελέσματα άλλαξε και το τέλος της main > system("PAUSE"); return 0;
jms Δημοσ. 28 Νοεμβρίου 2010 Δημοσ. 28 Νοεμβρίου 2010 επίσης για να δείς τα οποιαδήποτε αποτελέσματα άλλαξε και το τέλος της main > system("PAUSE"); return 0; μου φαίνεται ότι το system("PAUSE") είναι μόνο για windows oπότε προτιμότερο είναι το getchar();
Directx Δημοσ. 28 Νοεμβρίου 2010 Δημοσ. 28 Νοεμβρίου 2010 Από ότι βλέπω πρόκειται για ένα μεταφραστή LOGO ο οποίος υποστηρίζει 4 κατευθύνσεις (N S / E W). Καταρχήν όπως σου υπέδειξε ο pinball_elf άλλαξε το: >prog[i][0] = buffer[0]; Σε: >prog[i][0] = atoi(buffer); Ύστερα η ανάγνωση της δεύτερης παραμέτρου της εντολής '5' δεν φτάνει να είναι απλά ένα: >prog[i][1] = buffer[2] θα πρέπει να γραφθεί έτσι ώστε να διαβάζει από το ',' και μετά την τιμή που εισάγει ο χρήστης στο πρόγραμμα, εντοπίζοντας συντακτικό λάθος (δηλαδή η εντολή 5 να μην ακολουθείται από ',') ή μη δήλωση τιμής παραμέτρου (πχ. '5,') και θα μπορούσε να γραφθεί έτσι (υπάρχουν και άλλα θεματάκια αλλά-στα-γρήγορα): > if (buffer[0] == '5') /* if command 5, get the argument also */ { char *comma; /* if no ',' after command '5' then syntax error */ if(!(comma = (char*)memchr(buffer, ',', strlen(buffer)))) printf("Syntax error - %s\n", buffer); else { int commapos; /* if no value after command 5 ',' then operand missing */ if((commapos = ((comma - buffer) + 1)) == strlen(buffer)) printf("Operand missing - %s\n", buffer); else prog[i][1] = atoi(&buffer[commapos]); } //prog[i][1] = buffer[2] } Επίσης χρειάζεται προσοχή στην σχεδίαση των αστερίσκων στο floor array σου, για παράδειγμα: >for (i = 1; i <= command2; i++) Αν ζητήσω 5,1 θα σχεδιάσει 5,2 διότι μετράς το i από το 1 οπότε καλύτερα: >for (i = 1; i <= command2 - 1; i++) Στην ίδια ρουτίνα πρέπει να λάβεις υπόψη σου την πιθανότητα πως ο χρήστης μπορεί να μετακινήσει την χελώνα εκτός του floor array (αρνητικός αριθμός) και να διακόψεις την διαδικασία, πχ: > 2 4 5,1 6 9 Εδώ ζητώ από την χελώνα να στραφεί αριστερά (4) και να πάει μπροστά 1 βήμα, δίχως να γνωρίζω που κοιτάζει τώρα η χελώνα ο κώδικας σπάει εδώ: > else if (dir == WEST) /* go left on x-axis */ for (i = 1; i <= command2; i++) { turtlePos[0]--; if (pos == DOWN) floor[turtlePos[0]][turtlePos[1]] = 1; Καθώς το turtlePos[1] είναι πλέον -1 (αρνητική τιμή, λες floor[-1]). Αυτά από εμένα, καλή τύχη!! Υ.Γ. Τα σφάλματα του προγράμματος σου, θέλουν απλά ένα συστηματικό debugging, για λεπτομέρειες του πως μπορεί να γίνει (για να μπεις στο πνεύμα) ρίξε μια ματιά εδώ -ένα πολύ στρωτό tutorial από τον Evgenios1.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.