Τα πάντα για την C

...του ubuntu και έργων ΕΛ/ΛΑΚ (Έργα-Οδηγοί-Προτάσεις)

Συντονιστής: konnn

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 04 Μαρ 2012, 04:15

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

Θα την κάνω με 1Δ πίνακα εγώ (τον οποίον θα τον διαχειρίζομαι ως 2Δ... τσέκαρα πως το έχει καλύψει στο βιβλίο).
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 04 Μαρ 2012, 04:19

Τελικά στην δικιά μου λύση πρέπει να υπάρχει πρόβλημα εδώ:
Κώδικας: Επιλογή όλων
if (table[row+1][col] && table[row-1][col] && table[row][col+1] && table[row][col-1])
break;

Γιατί υπάρχει πιθανότητα τα row ή col να είναι εκτός των ορίων του πίνακα.

Θα το δω με την ησυχία μου το πρωί.
Καληνύχτες. :)
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 04 Μαρ 2012, 04:20

migf1 έγραψε:Θα την κάνω με 1Δ πίνακα εγώ (τον οποίον θα τον διαχειρίζομαι ως 2Δ... τσέκαρα πως το έχει καλύψει στο βιβλίο).

Τι ακριβώς εννοείς; Που αναφέρεται στο βιβλίο;
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 04 Μαρ 2012, 04:22

Εκεί που μιλαέι για πίνακες, και λέει πως ακόμα και όταν τους δηλώνεις πολυδιάστατους (multidimensional) εσωτερικά αποθηκεύονται ως μονοδιάστατοι. Κι εξηγεί πως τους κάνει indexing ;)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 04 Μαρ 2012, 04:24

Κατάλαβα. Θα το δω στην πράξη όμως σε τι μπορεί να υπερτερήσει μια τέτοια υλοποίηση.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 04 Μαρ 2012, 04:29

Έγινε :)

Πάω κι εγώ να κάνω λίγο HexView τώρα και θα την κάνω αύριο την άσκηση.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Star_Light » 04 Μαρ 2012, 04:53

οπα 2 λεπτα... migf1 οταν λες οτι η αρχικοποιηση γινεται μονάχα την 1η φορα εννοεις και αυτό ->

Κώδικας: Επιλογή όλων
int x;


οτι δηλαδη μπορει να του δώσει μια τιμή και το σύστημα εσωτερικά ? Οχι μονο ο χρηστης δηλαδη μεσω της εκχώρησης...

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

edit: Οχι οκ... το δοκιμασα στον compiler ειναι μη αρχικοποιημένο το x για αυτο και βγάζει ενα τελειως ζαβό νουμερο!
Γνώσεις ⇛ Linux: Βασικές ┃ Προγραμματισμός: Δέν θέλω μεροκάματο , θέλω C και κακο θάνατο! ┃ Αγγλικά: Lower
Λειτουργικό ⇛ Ubuntu 10.10 σε Dual Boot με Windows 7
Προδιαγραφές ⇛ Επεξεργαστής : Intel(R) Core(TM) i3 CPU 540 @3.07Ghz (64bit)
RAM : Kingston 2GB
HDD : Coreshare 500GB
Κάρτα Γραφικών : Intel Corporation Core Processor Integrated Graphics Controller(rev 18) (prog-if 00 [VGA controller]) [8086:0042]
Star_Light
superbTUX
superbTUX
 
Δημοσιεύσεις: 2787
Εγγραφή: 01 Μάιος 2010, 21:07
Τοποθεσία: Αθήνα
IRC: Star_Light
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό migf1 » 04 Μαρ 2012, 14:45

Ποστάρω τη λύση μου στα βιαστικά γιατί πρέπει να φύγω (ίσως να έχεi κάνα bug). Δείτε την και την συζητάμε σε κάνα 5ωρο που θα επσιτρέψω (π.χ. η συνάρτηση: pos_isblocked() μπορεί να βελτιστοποιηθεί ώστε να μη τσεκάρει και στις 4 κατευθύνσεις, αλλά να επσιτρέφει μόλις βρει την 1η κατεύθυνση που ΔΕΝ είναι μπλοκαρισμένη).

Επίσης, την έχω βάλει να τυπώνει τις μπλοκαρισμένες κατευθύνσεις της κάθε κίνησης...
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#define NROWS 10
#define NCOLS 10

#define ROW(n) ( (n) / NCOLS )
#define COL(n) ( (n) % NCOLS )

#define POSUP(n) ( (n) - NCOLS )
#define POSDN(n) ( (n) + NCOLS )
#define POSLF(n) ( (n) - 1 )
#define POSRT(n) ( (n) + 1 )

#define MARKS "BCDEFGHIJKLMNOPQRSTUVWXYZ"

enum Dir { UP=0, DN, LF, RT };


/*********************************************************//**
*
************************************************************/
void tab_print( char tab[] )
{
for (int n=0; n < NROWS * NCOLS; n++)
{
if ( n != 0 && n % NCOLS == 0 )
putchar('\n');
putchar( tab[n] );
}

putchar('\n');
}

/*********************************************************//**
*
************************************************************/
int next_pos( const int pos, const enum Dir dir)
{
int ret = -1;

switch (dir)
{
case UP:
ret = ROW(pos) > 0 ? POSUP(pos) : -1;
break;
case DN:
ret = ROW(pos) < NROWS-1 ? POSDN(pos) : -1;
break;
case LF:
ret = COL(pos) > 0 ? POSLF(pos) : -1;
break;
case RT:
ret = COL(pos) < NCOLS-1 ? POSRT(pos) : -1;
break;
default:
break;
}

return ret;
}

/*********************************************************//**
*
************************************************************/
_Bool pos_isblocked( const int pos, const char tab[] )
{
int nblocked = 0;

if ( ROW(pos) == 0 || '.' != tab[ POSUP(pos) ] )
nblocked++;
if ( ROW(pos) == NROWS-1 || '.' != tab[ POSDN(pos) ] )
nblocked++;
if ( COL(pos) == 0 || '.' != tab[ POSLF(pos) ] )
nblocked++;
if ( COL(pos) == NCOLS-1 || '.' != tab[ POSRT(pos) ] )
nblocked++;

printf("%c: nblocked = %d\n", tab[pos], nblocked );
return 4 == nblocked;
}

/*********************************************************//**
*
************************************************************/
int main( void )
{
int movesleft, mvcount=0, pos=0;
char tab[ NROWS * NCOLS ];

srand( (unsigned)time(NULL) ); /* init pseudo-random seed */
memset( tab, '.', sizeof(tab) ); /* init table with dots */

tab[0] = 'A';
movesleft = strlen(MARKS);
while ( movesleft )
{
int try = 0;

if ( pos_isblocked(pos, tab) )
break;
do {
try = next_pos( pos, rand() % 4 );
} while ( -1 == try || '.' != tab[try] );

pos = try;
tab[ pos ] = MARKS[ mvcount++ ];
movesleft--;
}
tab_print( tab );

exit( EXIT_SUCCESS );
}

ΥΓ. Άλλα αντί άλλων ο syntax-highlighter :lol:
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 04 Μαρ 2012, 19:50

migf1 έγραψε:π.χ. η συνάρτηση: pos_isblocked() μπορεί να βελτιστοποιηθεί ώστε να μη τσεκάρει και στις 4 κατευθύνσεις, αλλά να επσιτρέφει μόλις βρει την 1η κατεύθυνση που ΔΕΝ είναι μπλοκαρισμένη

Θα μπορούσε να γίνει one-liner:
Μορφοποιημένος Κώδικας: Επιλογή όλων
_Bool pos_isblocked( const int pos, const char tab[] )
{
return (ROW(pos) == 0 || '.' != tab[POSUP(pos)]) && (ROW(pos) == NROWS-1 || '.' != tab[POSDN(pos)]) && (COL(pos) == 0 || '.' != tab[POSLF(pos)]) && (COL(pos) == NCOLS-1 || '.' != tab[POSRT(pos)]);
}

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

Τελικά το λάθος στην λογική του δικού μου κώδικα είναι αυτό ακριβώς που έγραψα: viewtopic.php?p=233546#p233546
Θα το διορθώσω και θα ποστάρω την δική μου λύση ξανά σε two dimensional array.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

Re: Τα πάντα για την C

Δημοσίευσηαπό Ilias95 » 04 Μαρ 2012, 19:53

Και μια ερώτηση.
Ποιο είναι το πλεονέκτημα του να δηλώνουμε μεταβλητές σαν const;

Γιατί:
Κώδικας: Επιλογή όλων
const char alphabeta[] = {'A', 'B', 'C', 'D', 'E'};

και όχι:
Κώδικας: Επιλογή όλων
char alphabeta[5] = {'A', 'B', 'C', 'D', 'E'};
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

ΠροηγούμενηΕπόμενο

Επιστροφή στο Ανάπτυξη Λογισμικού / Αλγόριθμοι