Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Γεια σε ολους ειμαι εντελως καινυργιος στο blog αλλα εχω μαθει οτι βοηθάει αρκετα σε θεματα προγραμματισμού :-D .

 

Φτιάχνω ενα προγραμμα στη C λοιπόν το οποίο ανταποκρινεται σε ενα δοθεν προβλημα.

Αντιμετωπίζω ενα προβλημα ομως κατα την εμφανιση των στοιχείων του μονοδιαστατο μου πινακα.

Εν ολιγης το προβλημα εχει ως εξής : επιθυμω την εμφανιση καποιων στοιχείων αφου τα εχω αντιμεταθέσει και στη συνεχεια να τα ξανα-αντιμεταθετω χωρίς να υπαρχει προβλημα με τον δείκτη προσπελασης του πινακα και χωρις να εμφανιζω το ιδιο στοιχειο παραπανω απο μια φορα...

  • Απαντ. 43
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσιευμένες Εικόνες

Δημοσ.

βεβαιως και θα προσπαθήσω να γινω πιο σαφης ομως θα κανω αλλη μια τελευταία προσπάθεια για το προγραμμα και αν δε μου βγει και αυτη θα σας ενημερώσω σχετικα με το τι εχω γραψει στον κωδικα μου...

Δημοσ.

Μετα απο πολλη δουλεια και πολλη σκεψη αποφασισα να μην αντιμεταθετω το περιεχόμενο τον στοιχειων γιατι ο αρχικος μου πινακας θα πρεπει να παραμενει αμεταβλητος ομως παροτι εκανα το προγραμμα ξανα απο την αρχη προκυπτει το εξης προβλημα δεν τελιώνει η επαναληψη και συνεχιζεται επ' αοριστον ... τι μπορω να κανω γι' αυτο ??? καποιο ενδιαμεσο ισως βημα για να ελεγχω την εκτελεση του προγραμματος αν γινεται σωστα καποιου ειδους εντολη?

Δημοσ.

Αν έχει ατέρμονη επανάληψη, τότε πιθανότατα έχει λάθος τη συνθήκη με την οποία τερματίζει.

Εφ όσον δεν δίνεις κώδικα, κοίταξε εσύ τον κώδικα και σκέψου:

1. Τι τιμές έχουν οι μεταβλητές πριν μπεις στην επανάληψη

2. Πως αλλάζουν μετά από κάθε επανάληψη

Αν είναι πολύ περίπλοκος ο κώδικας (ή τέλος πάντων για να είσαι πιο σίγουρος) βάλε μια printf πριν την επανάληψη και μια στο τέλος της κάθε επανάληψης και τύπωσε όλες της τιμές των μεταβλητών που αλλάζεις. Μετά τρέξε το πρόγραμμα, άστο να κάνει κάποιες επαναλήψεις, πατά ctrl+c για να το σταματήσεις και βρες το λάθος

 

(υπάρχει και η εναλλακτική με τα breakpoints αλλά πάνω κάτω το ίδιο πράγμα είναι)

Δημοσ.

Μετα απο πολλη δουλεια και πολλη σκεψη αποφασισα να μην αντιμεταθετω το περιεχόμενο τον στοιχειων γιατι ο αρχικος μου πινακας θα πρεπει να παραμενει αμεταβλητος ομως παροτι εκανα το προγραμμα ξανα απο την αρχη προκυπτει το εξης προβλημα δεν τελιώνει η επαναληψη και συνεχιζεται επ' αοριστον ... τι μπορω να κανω γι' αυτο ??? καποιο ενδιαμεσο ισως βημα για να ελεγχω την εκτελεση του προγραμματος αν γινεται σωστα καποιου ειδους εντολη?

 

Δεν μας βοηθάς να σε βοηθήσουμε. Αυτά που μας ρωτάς είναι πολύ αόριστα. Όπως και να έχει, αν θες ο αυθεντικός σου πίνακας να μείνει αμετάβλητος, μπορείς να κάνεις τις αντιμεταθέσεις που χρειάζεσαι για να υπολογίσεις ότι είναι να υπολογίσεις σε μια προσωρινή κόπια του.

 

>
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
...

 

Δημοσ.

φιλε 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 ευχαρίστω για τη προτινομενη λυση σου ομως το προβλημα απαιτει την μη χρηση αλλου πινακα εκτος απο αυτου που διδει.

 

Το προβλημα λοιπον παραμενει ... και επειδή προκειται για εργασια δε θα δωσω τον κωδικα μου αλλα μπορω να σας πω οτι κατω μου γραφει ο 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ο σου ποστ είναι τελείως ασαφές.

Δημοσ.

Εμ το δοθέν προβλημα εχει ως εξής : θελεις να φτιαξεις στη 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 αλλα δε βλεπω αλλαγη

Δημοσ.

Αν πως ότι κατάλαβα, ψέμματα θα πω :lol:

 

Νομίζω όμως πως πρέπει να είστε συμφοιτητές με τον 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-!!

Ίσως σου φανεί χρήσιμο, όχι απαραίτητα για αυτό που ρωτάς εδώ (το οποίο δυστυχώς και πάλι δεν έχω καταλάβει) αλλά γενικώς για την εργασία.

Δημοσ.

δεν ξερω ποιος ειναι αυτος ο stealth αλλα φαινεται να μην ξερει ουτε καν καποια βασικα πραματα τα οποια τα χουμε συζητησει σε διαλεξεις στη σχολη οποτε δε με πολυβοηθαει στο δικο μου προβλημα . Εν πασει περιπτωσει ευχαριστω για το χρονο σου θα ρωτησω και τους υπευθυνους μπας και μου πουν τιποτα γιατι μεχρι τωρα τζιφος και θα ενημερωσω αν βρω λυση ....

Δημοσ.

Μιας και βλέπω πως του έδωσαν κώδικα εκεί, εγώ θα το έκανα κάπως έτσι...

 

 

 

>
#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? )

Δημοσ.

φιλε 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; }

 

 

 

 

 

 

 

 

 

 

τωρα αν μπορεις να μου εξηγησεις τι κανω λαθος και ο δεικτης παει οπου να ναι και μπορω να το διορθωσω θα με κομπλε

και παλι ευχαριστω για το ενδιαφερον σου :-D

Δημοσ.

Πριν να σε βοηθήσει, κάνε edit το μήνυμά σου και βάλε τον κώδικα σε code tags δηλαδή

[ code ]

κώδικας

[ /code ]

 

χωρίς κενά ανάμεσα στις αγκύλες. Αν το κάνεις σωστά το τελικό αποτέλεσμα θα είναι έτσι:

>
κώδικας

 

Έτσι ευκολύνεις αυτόν που θέλει να σε βοηθήσει με το να μην του βγαίνουν τα μάτια διαβάζοντας τον κώδικα. Αν μπορείς να φτιάξεις και το identation θα είναι ακόμη καλύτερα για εμάς αλλά να μην ζητάω πολλά :P

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...