BTSGeo Δημοσ. 18 Νοεμβρίου 2012 Δημοσ. 18 Νοεμβρίου 2012 Γεια σε ολους ειμαι εντελως καινυργιος στο blog αλλα εχω μαθει οτι βοηθάει αρκετα σε θεματα προγραμματισμού . Φτιάχνω ενα προγραμμα στη C λοιπόν το οποίο ανταποκρινεται σε ενα δοθεν προβλημα. Αντιμετωπίζω ενα προβλημα ομως κατα την εμφανιση των στοιχείων του μονοδιαστατο μου πινακα. Εν ολιγης το προβλημα εχει ως εξής : επιθυμω την εμφανιση καποιων στοιχείων αφου τα εχω αντιμεταθέσει και στη συνεχεια να τα ξανα-αντιμεταθετω χωρίς να υπαρχει προβλημα με τον δείκτη προσπελασης του πινακα και χωρις να εμφανιζω το ιδιο στοιχειο παραπανω απο μια φορα...
nilosgr Δημοσ. 18 Νοεμβρίου 2012 Δημοσ. 18 Νοεμβρίου 2012 forum, οχι blog. Αν μπορουσες να δωσεις κωδικα. θα βοηθουσε αρκετα...
migf1 Δημοσ. 18 Νοεμβρίου 2012 Δημοσ. 18 Νοεμβρίου 2012 Καλωσόρισες! Όπως λέει και ο nilos.gr η περιγραφή που μας δίνεις είναι πολύ ασαφής.
BTSGeo Δημοσ. 19 Νοεμβρίου 2012 Μέλος Δημοσ. 19 Νοεμβρίου 2012 βεβαιως και θα προσπαθήσω να γινω πιο σαφης ομως θα κανω αλλη μια τελευταία προσπάθεια για το προγραμμα και αν δε μου βγει και αυτη θα σας ενημερώσω σχετικα με το τι εχω γραψει στον κωδικα μου...
BTSGeo Δημοσ. 20 Νοεμβρίου 2012 Μέλος Δημοσ. 20 Νοεμβρίου 2012 Μετα απο πολλη δουλεια και πολλη σκεψη αποφασισα να μην αντιμεταθετω το περιεχόμενο τον στοιχειων γιατι ο αρχικος μου πινακας θα πρεπει να παραμενει αμεταβλητος ομως παροτι εκανα το προγραμμα ξανα απο την αρχη προκυπτει το εξης προβλημα δεν τελιώνει η επαναληψη και συνεχιζεται επ' αοριστον ... τι μπορω να κανω γι' αυτο ??? καποιο ενδιαμεσο ισως βημα για να ελεγχω την εκτελεση του προγραμματος αν γινεται σωστα καποιου ειδους εντολη?
nilosgr Δημοσ. 20 Νοεμβρίου 2012 Δημοσ. 20 Νοεμβρίου 2012 Αν έχει ατέρμονη επανάληψη, τότε πιθανότατα έχει λάθος τη συνθήκη με την οποία τερματίζει. Εφ όσον δεν δίνεις κώδικα, κοίταξε εσύ τον κώδικα και σκέψου: 1. Τι τιμές έχουν οι μεταβλητές πριν μπεις στην επανάληψη 2. Πως αλλάζουν μετά από κάθε επανάληψη Αν είναι πολύ περίπλοκος ο κώδικας (ή τέλος πάντων για να είσαι πιο σίγουρος) βάλε μια printf πριν την επανάληψη και μια στο τέλος της κάθε επανάληψης και τύπωσε όλες της τιμές των μεταβλητών που αλλάζεις. Μετά τρέξε το πρόγραμμα, άστο να κάνει κάποιες επαναλήψεις, πατά ctrl+c για να το σταματήσεις και βρες το λάθος (υπάρχει και η εναλλακτική με τα breakpoints αλλά πάνω κάτω το ίδιο πράγμα είναι)
migf1 Δημοσ. 20 Νοεμβρίου 2012 Δημοσ. 20 Νοεμβρίου 2012 Μετα απο πολλη δουλεια και πολλη σκεψη αποφασισα να μην αντιμεταθετω το περιεχόμενο τον στοιχειων γιατι ο αρχικος μου πινακας θα πρεπει να παραμενει αμεταβλητος ομως παροτι εκανα το προγραμμα ξανα απο την αρχη προκυπτει το εξης προβλημα δεν τελιώνει η επαναληψη και συνεχιζεται επ' αοριστον ... τι μπορω να κανω γι' αυτο ??? καποιο ενδιαμεσο ισως βημα για να ελεγχω την εκτελεση του προγραμματος αν γινεται σωστα καποιου ειδους εντολη? Δεν μας βοηθάς να σε βοηθήσουμε. Αυτά που μας ρωτάς είναι πολύ αόριστα. Όπως και να έχει, αν θες ο αυθεντικός σου πίνακας να μείνει αμετάβλητος, μπορείς να κάνεις τις αντιμεταθέσεις που χρειάζεσαι για να υπολογίσεις ότι είναι να υπολογίσεις σε μια προσωρινή κόπια του. > int arr[5] = { 1, 2, 3, 4, 5 }; int arrTemp[5]; ... // copy arr to arrTemp memcpy( arrTemp, arr, 5 * sizeof(int) ); // do whatever you need to do with arrTemp ...
BTSGeo Δημοσ. 21 Νοεμβρίου 2012 Μέλος Δημοσ. 21 Νοεμβρίου 2012 φιλε migf1 ευχαρίστω για τη προτινομενη λυση σου ομως το προβλημα απαιτει την μη χρηση αλλου πινακα εκτος απο αυτου που διδει. Το προβλημα λοιπον παραμενει ... και επειδή προκειται για εργασια δε θα δωσω τον κωδικα μου αλλα μπορω να σας πω οτι κατω μου γραφει ο compiler τα εξής: 1 [Warning] multi-character character constant 2 In function 'main': 3 [Warning] comparison is always false due to limited range of data type
migf1 Δημοσ. 21 Νοεμβρίου 2012 Δημοσ. 21 Νοεμβρίου 2012 φιλε migf1 ευχαρίστω για τη προτινομενη λυση σου ομως το προβλημα απαιτει την μη χρηση αλλου πινακα εκτος απο αυτου που διδει. Το προβλημα λοιπον παραμενει ... και επειδή προκειται για εργασια δε θα δωσω τον κωδικα μου αλλα μπορω να σας πω οτι κατω μου γραφει ο compiler τα εξής: 1 [Warning] multi-character character constant 2 In function 'main': 3 [Warning] comparison is always false due to limited range of data type Για το 1. το πιθανότερο είναι να αναθέτεις κάπου σε έναν χαρακτήρα τιμή που περικλείεται σε διπλά εισαγωγικά αντί για μονά, π.χ... > char ch = " "; // αντί για το σωστό: char ch = ' '; ή να έχεις μέσα στα μονά εισαγωγικά περισσότερους από 1 χαρακτήρες, π.χ... > char ch = ' '; // 2 κενά αντί για 1 */ char *s = '123'; // ομοίως Για το 3. κάπου συγκρίνεις 2 "πράγματα" με τρόπο τέτοιο που είναι πάντα ψευδής, π.χ. ... > int main( void ) { unsigned char uc; if ( uc < 0 ) puts( "impossible" ); return 0; } Εφόσον το uc είναι ορισμένο ως unsigned αποκλείεται να είναι μικρότερο του 0 Για το γενικότερο πρόβλημα, δεν χρειάζεται να μας δώσεις κώδικα. Περιέγραψέ μας με σαφή λόγια τι προσπαθείς να κάνεις και δεν σου βγαίνει, γιατί αυτό που περιγράφεις στο 1ο σου ποστ είναι τελείως ασαφές.
BTSGeo Δημοσ. 21 Νοεμβρίου 2012 Μέλος Δημοσ. 21 Νοεμβρίου 2012 Εμ το δοθέν προβλημα εχει ως εξής : θελεις να φτιαξεις στη C το γνωστο σε ολους μας φιδακι (το επιτραπεζιο) διδεται λοιπον ενας πινακας ο οποιος εχει s (μικρο φιδι) S (μεγαλο φιδι) και l και L για μικρη και μεγαλη σκαλα αντιστοιχα . Το θεμα ειναι πιο ομως ο πινακας που σου διδεται ειναι μονοδιαστατος και οταν του κανεις προσπελαση με το πιόνι θελεις να εμφανιζεις τις κινησεις ακριβως ετσι οπως γινεται και στο παιχνιδι. Δηλαδη για να γινω πιο σαφης πηγαινει το πιονι ξερω γω απο το 1 στο 6 και υστερα στο 9 ομως μετα το 10 σαν θεση προσπελασης ειναι στη θεση 19. Ακομα πιο αναλυτικα σχηματικα παει καπως ετσι : στο παιχνιδι 0 1 2 3 4 5 6 7 8 9 ο Η/Υ το διαβαζει ομως ως 0 1 2 3 4 5 6 7 8 9 9 18 17 16 15 14 13 12 11 10 10 11 12 13 14 15 16 17 18 19 και παει λεγοντας.... βεβαια ο δοθεν πινακας δεν ειναι σε τετοια μορφη αλλα απο το 1-100 αλλα δεν υπαρχει προβλημα με αυτο.Εγώ λοιπον παιρνω τις διαφορες περιπτωσεις αν το πιονι βρισκεται σε περιττη ή αρτια γραμμη ή ακομα και αν η ζαρια οδηγησει στην παραβιαση του πινακα και αναλογα πειραζω τον δείκτη ωστε να τα εμφανιζει με την επιθυμητη σειρα.Βεβαια παιρνω πολλες περιπτωσεις και ισως ειναι αυτο το αιτιο του προβληματος αλλα δεν μπορω να εξετασω το προγραμμα αν εχει λαθη αφου ενω εχω βαλει εντολες του ειδους system("pause"); και sleep©; οπου c ενας αριθμος . οι εντολες πανε καπως ετσι : // i ο δεικτης της θεσης του πιονιου if (i>9 && i<20) { j=i-10; c=19-j; if (board[c]=='s') { board[c-10]='*'; flag=3; } else if (board[c]=='l') { board[c+10]='*'; flag=1; } else if (board[c]!='s' && board[c]!='l') board[c]='*'; } else if (i>29 && i<40) { j=i-30; c=39-j; if (board[c]=='s') { board[c-10]='*'; flag=3; } else if (board[c]=='L') { board[c+20]='*'; flag=2; } else if (board[c]!='s' && board[c]!='L') board[c]='*'; } else if (i>49 && i<60) { j=i-50; c=59-j; board[c]='*'; } else if (i>69 && i<80) { j=i-70; c=79-j; if (board[c]=='S') { board[c-20]='*'; flag=4; } else if (board[c]=='L') { board[c+20]='*'; flag=2; } else if (board[c]!='S' && board[c]!='L') board[c]='*'; } else if (i>89 && i<100) { j=i-90; c=99-j; if (board[c]=='S') { board[c-20]='*'; flag=4; } else if (board[c]!='S') board[c]='*'; } else if ((i>0 && i<10) || (i>=20 && i<30) || (i>=40 && i<50) || (i>=60 && i<70) || (i>=80 && i<90)) { if (board=='l') { i=i+10; flag=1; } else if (board=='L') { i=i+20; flag=2; } else if (board=='s') { i=i-10; flag=3; } else if (board=='S') { i=i-20; flag=4; } board='*'; } Αν παθατε κανα εγκεφαλικο πειτε μου πως μπορω να το κανω πιο συντετμημενο.... Παρολο λοιπον που κανω ολα αυτα το προγραμμα κανει του κεφαλιού του και συνεχιζει ακαθεκτο να τυπωνει * συνεχεια οπου * ειναι η θεση του πιονιου η οποια σε καθε επαναληψη δινω εντολη να σβηνεται και δεν βλεπω να εκτελειται... Υ.Γ. εκανα και καποιες διορθωσεις και δε μου βγαζει τα warning αλλα δε βλεπω αλλαγη
migf1 Δημοσ. 22 Νοεμβρίου 2012 Δημοσ. 22 Νοεμβρίου 2012 Αν πως ότι κατάλαβα, ψέμματα θα πω Νομίζω όμως πως πρέπει να είστε συμφοιτητές με τον Stealth. Ρίξε μια ματιά τι του λέμε σε εκείνο το νήμα, όπως και σε αυτό εδώ: http://www.adslgr.com/forum/threads/678744-%CE%91%CE%BB%CE%BB%CE%B1%CE%B3%CE%B7-%CE%B1%CF%81%CE%B9%CE%B8%CE%BC%CF%89%CE%BD-%CF%83%CE%B5-%CE%BC%CE%B9%CE%B1-%CE%B3%CF%81%CE%B1%CE%BC%CE%BC%CE%B7-%CE%B5%CE%BD%CE%BF%CF%82-%CF%80%CE%B9%CE%BD%CE%B1%CE%BA%CE%B1-!! Ίσως σου φανεί χρήσιμο, όχι απαραίτητα για αυτό που ρωτάς εδώ (το οποίο δυστυχώς και πάλι δεν έχω καταλάβει) αλλά γενικώς για την εργασία.
BTSGeo Δημοσ. 22 Νοεμβρίου 2012 Μέλος Δημοσ. 22 Νοεμβρίου 2012 δεν ξερω ποιος ειναι αυτος ο stealth αλλα φαινεται να μην ξερει ουτε καν καποια βασικα πραματα τα οποια τα χουμε συζητησει σε διαλεξεις στη σχολη οποτε δε με πολυβοηθαει στο δικο μου προβλημα . Εν πασει περιπτωσει ευχαριστω για το χρονο σου θα ρωτησω και τους υπευθυνους μπας και μου πουν τιποτα γιατι μεχρι τωρα τζιφος και θα ενημερωσω αν βρω λυση ....
migf1 Δημοσ. 22 Νοεμβρίου 2012 Δημοσ. 22 Νοεμβρίου 2012 Μιας και βλέπω πως του έδωσαν κώδικα εκεί, εγώ θα το έκανα κάπως έτσι... > #include <stdio.h> #include <stdlib.h> #define NROWS 4 #define NCOLS 5 #define NELEMS NROWS * NCOLS #define N2ROW(n) ( (n) / NCOLS ) #define N2COL(n) ( (n) % NCOLS ) /* ------------------------------------------------------- * * ------------------------------------------------------- */ int main( void ) { int arr[NELEMS] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 12, 14, 15, 16, 17, 18, 19 }; for (int i=0; i < NELEMS; i++) { int iPrint; if ( i % NCOLS == 0 ) putchar( '\n' ); iPrint = 0 == (i / NCOLS) % 2 ? i : N2ROW(i) * NCOLS + ( NCOLS - N2COL(i) ) - 1; printf( "%2d ", arr[iPrint] ); } putchar( '\n' ); exit( EXIT_SUCCESS ); } Έξοδος: > 0 1 2 3 4 9 8 7 6 5 10 11 12 12 14 19 18 17 16 15 EDIT: δεν ξερω ποιος ειναι αυτος ο stealth αλλα φαινεται να μην ξερει ουτε καν καποια βασικα πραματα τα οποια τα χουμε συζητησει σε διαλεξεις στη σχολη οποτε δε με πολυβοηθαει στο δικο μου προβλημα . Εν πασει περιπτωσει ευχαριστω για το χρονο σου θα ρωτησω και τους υπευθυνους μπας και μου πουν τιποτα γιατι μεχρι τωρα τζιφος και θα ενημερωσω αν βρω λυση .... Όντως φαίνεται να μην ξέρει βασικά πράγματα. Πάντως είμαι πρόθυμος να βοηθήσω αν μου δώσεις να καταλάβω ακριβώς ποιο είναι το πρόβλημα. Σημείωσε πως ο κώδικας που έχεις παραθέσει με όλα εκείνα τα if δεν αποτελεί σε καμία περίπτωση ενδεδειγμένη πρακτική (π.χ. τι θα κάνεις αν σου αλλάξει τον πίνακα ας πούμε σε 80x80? )
BTSGeo Δημοσ. 22 Νοεμβρίου 2012 Μέλος Δημοσ. 22 Νοεμβρίου 2012 φιλε migf1 επειδή όντως εχεις δίκιο πως το προγραμμα μου ηταν τραγικο τοσο ποργραμματιστικα οσο και οπτικα καθησα και το ξαναεφτιαξα εξ ολοκληρου απο την αρχη δυστυχως ομως παλι κανω λαθος ..... i=0; while (board!=90) { int zaria; zaria=1+rand()%6; printf("\n i zaria einai: %d",zaria); dice_counter++; printf("\n Ari8mos ripsis No: %d",dice_counter); board='_'; int n; n=artios(i); /*artia grammi*/ if (n==1) { /* kai o deikths den exei alla3ei seira me thn zaria */ if ((artios(i+zaria))== (artios(i))) { i+=zaria; } else { /* kai o deikths exei alla3ei seira me thn zaria */ i+=zaria; i=replace(i); } } /* periti grammi*/ else { /* kai o deikths den exei alla3ei seira me thn zaria */ if ((artios(i+zaria))== (artios(i))) { i-=zaria;} /* kai o deikths exei alla3ei seira me thn zaria */ else { i-=zaria; if (i>99) i=99-(i-99); else {i+=20;} replace(i); } } int flag=0; if (board=='l') { i=i+10; flag=1; } else if (board=='L') { i=i+20; flag=2; } else if (board=='s') { i=i-10; flag=3; } else if (board=='S') { i=i-20; flag=4; } board='*'; int a; printf("\n"); for (a=0;a<100;a++) { printf(" %c",board[a]); if (a%10==9) printf("\n"); } system("pause"); if (flag==1) printf("type of action: ascend because of l\n"); else if (flag==2) printf("type of action: ascend because of L\n"); else if (flag==3) printf("type of action: descend because of s\n"); else if (flag==4) printf("type of action: descend because of S\n"); } printf("\n YOU WIN!!!!!!"); system("pause"); } int artios (int i) { if ((i/10)%2==0) return 1; else { return 0;} } int replace(int i) { return (i/10)*10+9-i%10; } τωρα αν μπορεις να μου εξηγησεις τι κανω λαθος και ο δεικτης παει οπου να ναι και μπορω να το διορθωσω θα με κομπλε και παλι ευχαριστω για το ενδιαφερον σου
imitheos Δημοσ. 22 Νοεμβρίου 2012 Δημοσ. 22 Νοεμβρίου 2012 Πριν να σε βοηθήσει, κάνε edit το μήνυμά σου και βάλε τον κώδικα σε code tags δηλαδή [ code ] κώδικας [ /code ] χωρίς κενά ανάμεσα στις αγκύλες. Αν το κάνεις σωστά το τελικό αποτέλεσμα θα είναι έτσι: > κώδικας Έτσι ευκολύνεις αυτόν που θέλει να σε βοηθήσει με το να μην του βγαίνουν τα μάτια διαβάζοντας τον κώδικα. Αν μπορείς να φτιάξεις και το identation θα είναι ακόμη καλύτερα για εμάς αλλά να μην ζητάω πολλά
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα