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

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

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

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

Δημοσίευσηαπό stamatiou » 11 Αύγ 2011, 14:38

Έκανα τη μισή άσκηση, αυτή που έκανα υλοποίηση (είναι η δεύτερη) με pointer κάτι πάει στραβά αλλά δεν ξέρω τι :crazy:

Spoiler: show
Κώδικας: Επιλογή όλων
#include <stdlib.h>
#include <stdio.h>

size_t strlen(const char *s) {
size_t size = 0;
int *pointer = &s[0];
while(*pointer != '\0' && *pointer != '\n') {
size++;
pointer++;
}
return size;
}

size_t strlen2(const char s[]) {
size_t size = 0;
int counter = 0;

while(s[counter] != '\0' && s[counter] != '\n') {
size++;
counter++;
}
return size;
}

int main(void) {
char inbuf[256];
int size = 0;
printf("Enter the string: ");
fgets(inbuf,256,stdin);
size = strlen2(inbuf);
printf("The length of the string is %d\n",size);
return 0;
}

και έχω ένα error:
Κώδικας: Επιλογή όλων
strlen.c: In function ‘strlen’:
strlen.c:6:17: warning: initialization from incompatible pointer type
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 11 Αύγ 2011, 15:41

Το error στο βγάζει γιατί τον *pointer τον ορίζεις δείκτη σε int αλλά του εκχωρείς διεύθυνση char (το s[0] είναι char, άρα το &s[0] είναι διεύθυνση από char).

Σε ότι αφορά το κώδικα, το 'χεις πιάσει το γενικό νόημα αλλά με κάποιες ελλείψεις. Π.χ. δεν χρειάζεται να ελέγχεις για '\n' στη συνθήκη του while. Ο χαρακτήρας που σηματοδοτεί το τέλος ενός string είναι ο '\0'. Άρα είναι απόλυτα θεμιτό να υπάρχουν '\n' χαρακτήρες μέσα σε ένα string (π.χ. μπορεί να περιέχει τα περιεχόμενα ενός text editor, άρα θα υπάρχουν πολλοί '\n' μέσα στο string, για τις αλλαγές των γραμμών).

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

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

Spoiler: show
Κώδικας: Επιλογή όλων

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

// ----------------------------------------------------------------------------------
size_t mystrlen( const char *s )
{
size_t size = 0;
const char *pointer = s;
while ( *pointer != '\0' ) {
size++;
pointer++;
}
return size;
}
// ----------------------------------------------------------------------------------
size_t mystrlen2( const char s[] )
{
size_t size = 0;
int counter = 0;

while( s[counter] != '\0') {
size++;
counter++;
}
return size;
}
// ----------------------------------------------------------------------------------
int main( void )
{
char inbuf[256];
int size = 0;

printf("Enter the string: ");
fgets(inbuf, 256, stdin);

size = mystrlen(inbuf);
printf("The length of the string is %d\n", size);

return 0;
}

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

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

Δημοσίευσηαπό stamatiou » 11 Αύγ 2011, 18:55

migf1 έγραψε:Το error στο βγάζει γιατί τον *pointer τον ορίζεις δείκτη σε int αλλά του εκχωρείς διεύθυνση char (το s[0] είναι char, άρα το &s[0] είναι διεύθυνση από char).

Σε ότι αφορά το κώδικα, το 'χεις πιάσει το γενικό νόημα αλλά με κάποιες ελλείψεις. Π.χ. δεν χρειάζεται να ελέγχεις για '\n' στη συνθήκη του while. Ο χαρακτήρας που σηματοδοτεί το τέλος ενός string είναι ο '\0'. Άρα είναι απόλυτα θεμιτό να υπάρχουν '\n' χαρακτήρες μέσα σε ένα string (π.χ. μπορεί να περιέχει τα περιεχόμενα ενός text editor, άρα θα υπάρχουν πολλοί '\n' μέσα στο string, για τις αλλαγές των γραμμών).

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

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

Spoiler: show
Κώδικας: Επιλογή όλων

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

// ----------------------------------------------------------------------------------
size_t mystrlen( const char *s )
{
size_t size = 0;
const char *pointer = s;
while ( *pointer != '\0' ) {
size++;
pointer++;
}
return size;
}
// ----------------------------------------------------------------------------------
size_t mystrlen2( const char s[] )
{
size_t size = 0;
int counter = 0;

while( s[counter] != '\0') {
size++;
counter++;
}
return size;
}
// ----------------------------------------------------------------------------------
int main( void )
{
char inbuf[256];
int size = 0;

printf("Enter the string: ");
fgets(inbuf, 256, stdin);

size = mystrlen(inbuf);
printf("The length of the string is %d\n", size);

return 0;
}

Αν δεν ασχοληθεί άλλος να δώσω κι εγώ τις λύσεις, γιατί διαφέρουν από τις λύσεις του φίλου Σταματίου.

Ναι αλλά κανονικά δεν θα μπορούσα να το κάνω και int αφού ουσιαστικά τα chars είναι ints με βάση το ASCI table;
Επίσης έκανα τις συναρτήσεις να μην μετρούν το \n επειδή πχ έγραφα abc και έβγαζε 4 γι' αυτό είπα να το αφήσω να μετρά μικρά κομμάτια κειμένου :angel:
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 11 Αύγ 2011, 19:19

stamatiou έγραψε:Ναι αλλά κανονικά δεν θα μπορούσα να το κάνω και int αφού ουσιαστικά τα chars είναι ints με βάση το ASCI table;

Τα chars είναι υποσύνολα των ints (τα char είναι εγγυημένα 1 byte, ενώ τα int είναι εγγυημένα τουλάχιστον 2 bytes). Για να κάνεις αυτό που λες παραπάνω, θα μπορούσες να χρησιμοποιήσεις cast:
Κώδικας: Επιλογή όλων

size_t mystrlen( const char *s)
{
const int *pointer = (int *) &s[0];
...
}
αλλά δεν υπάρχει λόγος, δηλώνεις απευθείας τον *pointer const char και ξεμπερδεύεις

έγραψε:Επίσης έκανα τις συναρτήσεις να μην μετρούν το \n επειδή πχ έγραφα abc και έβγαζε 4 γι' αυτό είπα να το αφήσω να μετρά μικρά κομμάτια κειμένου :angel:

Αυτό συμβαίνει γιατί το string το διαβάζεις με την fgets() η οποία διατηρεί και το '\n' μέσα στο string. Αν το διάβαζες με την s_get() ή την s_getflushed() δεν θα είχε '\n' στο τέλος του το string.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 11 Αύγ 2011, 22:32

Δίνω και τη δική μου λύση:

Spoiler: show
Κώδικας: Επιλογή όλων

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

// ---------------------------------------------------------------------------------
// διαχείριση αποκλειστικά με δείκτες
//
size_t mystrlen1( const char *s )
{
if ( !s )
return -1;

const char *cp = s;
while ( *cp++ )
;
return --cp-s;
}
// ---------------------------------------------------------------------------------
// διαχείριση με μετρητή
//
size_t mystrlen2( const char s[] )
{
if ( !s )
return -1;

size_t i=0;
while ( s[i++] )
;
return --i;
}
// ---------------------------------------------------------------------------------
int main ( void )
{
char s[] = "123";

printf("mystrlen1(\"%s\") = %d\n", s, mystrlen1( s ) );
printf("mystrlen2(\"%s\") = %d\n", s, mystrlen2( s ) );

exit( EXIT_SUCCESS );
}

Συγκριτικά με την στάνταρ strlen() αυτές είναι βελτιωμένες ως προς το ότι ελέγχουν και την περίπτωση κατά την οποία τους περαστεί NULL ως όρισμα, οπότε κι επιστρέφουν -1 σαν αποτέλεσμα. Στην στάνταρ strlen() αν της περάσουμε NULL ως όρισμα, κράσαρει.

Αν δεν καταλαβαίνετε κάτι στον κώδικα, πείτε να το διευκρινίσουμε περαιτέρω.

EDIT: Διορθώθηκε bug στον κώδικα!
Τελευταία επεξεργασία από migf1 και 12 Αύγ 2011, 14:11, έχει επεξεργασθεί 1 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 12 Αύγ 2011, 13:31

migf1 έγραψε:Δίνω και τη δική μου λύση:

Spoiler: show
Κώδικας: Επιλογή όλων

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

// ---------------------------------------------------------------------------------
// διαχείριση αποκλειστικά με δείκτες
//
size_t mystrlen1( const char *s )
{
if ( !s )
return -1;

const char *cp = s;
while ( *++cp )
;
return cp-s;
}
// ---------------------------------------------------------------------------------
// διαχείριση με μετρητή
//
size_t mystrlen2( const char s[] )
{
if ( !s )
return -1;

size_t i=0;
while ( s[++i] )
;
return i;
}
// ---------------------------------------------------------------------------------
int main ( void )
{
char s[] = "123";

printf("mystrlen1(\"%s\") = %d\n", s, mystrlen1( s ) );
printf("mystrlen2(\"%s\") = %d\n", s, mystrlen2( s ) );

exit( EXIT_SUCCESS );
}

Συγκριτικά με την στάνταρ strlen() αυτές είναι βελτιωμένες ως προς το ότι ελέγχουν και την περίπτωση κατά την οποία τους περαστεί NULL ως όρισμα, οπότε κι επιστρέφουν -1 σαν αποτέλεσμα. Στην στάνταρ strlen() αν της περάσουμε NULL ως όρισμα, κράσαρει.

Αν δεν καταλαβαίνετε κάτι στον κώδικα, πείτε να το διευκρινίσουμε περαιτέρω.
Εκει που γράφει ++i και το ίδιο για τον pointer αφού προσθέτει πριν το ελέγξει το while πώς ελέγχεται το πρώτο char; Επίσης στο πρώτο τι κάνει ακριβώς εκείνο το return;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 12 Αύγ 2011, 14:09

stamatiou έγραψε:Εκει που γράφει ++i και το ίδιο για τον pointer αφού προσθέτει πριν το ελέγξει το while πώς ελέγχεται το πρώτο char;

Αμάν, έχεις απόλυτο δίκιο... λαλακία μου! Εδώ ο σωστός κώδικας...

Spoiler: show
Κώδικας: Επιλογή όλων

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

// ---------------------------------------------------------------------------------
// διαχείριση αποκλειστικά με δείκτες
//
size_t mystrlen1( const char *s )
{
if ( !s )
return -1;

const char *cp = s;
while ( *cp++ )
;
return --cp-s;
}
// ---------------------------------------------------------------------------------
// διαχείριση με μετρητή
//
size_t mystrlen2( const char s[] )
{
if ( !s )
return -1;

size_t i=0;
while ( s[i++] )
;
return --i;
}
// ---------------------------------------------------------------------------------
int main ( void )
{
char s[] = "123";

printf("mystrlen1(\"%s\") = %d\n", s, mystrlen1( s ) );
printf("mystrlen2(\"%s\") = %d\n", s, mystrlen2( s ) );

exit( EXIT_SUCCESS );
}
το διορθώνω και στο προηγούμενο πόστ! Thanks!

έγραψε:Επίσης στο πρώτο τι κάνει ακριβώς εκείνο το return;

Ο *cp είναι ένας δείκτης σε char που τον βάζω αρχικά να δείχνει στην αρχή του s (το: cp = s ισοδυναμεί με: cp = &s[0], απλά ορίζω κι αρχικοποιώ με μια κίνηση: char *cp=s και μετά μέσα στο loop τον προχωράω από χαρακτήρα σε χαρακτήρα μέχρι να βρει τον '\0'.

To '\0' ουσιαστικά είναι μια πιο αναγνώσιμη ονομασία για το 0 και πιο συγκεκριμένα για το: (char)0

Στη C οτιδήποτε ισούται με 0 είναι FALSE κι οτιδήποτε δεν ισούται με 0 είναι TRUE, οπότε αντί να γράφουμε:

Κώδικας: Επιλογή όλων
while ( *cp != '\0')
cp++;

μπορούμε να γράφουμε:

Κώδικας: Επιλογή όλων
while ( *cp )
cp++;

που με λόγια σημαίνει: όσο το περιεχόμενο του cp είναι TRUE (δεν είναι δηλαδή 0, δεν είναι μηδενικός χαρακτήρας) προχώρα τον cp μια θέση προς τα δεξιά.

Και τέλος μπορούμε να βάλουμε και την αύξηση μέσα στη συνθήκη του while και να αφήσουμε κενό το σώμα του:

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

while ( *cp++)
;

Όταν τελειώσει το while ο cp θα δείχνει στη μνήμη του τελευταίου χαρακτήρα του s, που είναι ο μηδενικός χαρακτήρας. Αφαιρώντας αυτή τη μνήμη από τη μνήμη στην οποία ξεκινάει το s παίρνουμε ουσιαστικά το μήκος του string: cp-s. Επειδή όμως δεν θέλουμε να μετρήσουμε τον μηδενικό χαρακτήρα, στον διορθωμένο κώδικα φέρνω πρώτα τον cp μια θέση πίσω: --cp; και μετά κάνω την αφαίρεση, αλλά το κάνω πάλι σε μια κίνηση : --cp-s; και στην ίδια αυτή κίνηση βάζω και την επιστροφή της συνάρτησης:

Κώδικας: Επιλογή όλων
return --cp-s;
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό stamatiou » 12 Αύγ 2011, 18:10

Οκ, τώρα κάτι άσχετο. Αν ήθελα να κάνω το περιεχόμενο ενός pointer ++ πως θα το έκανα αφού εσυ κανείς *cp++ και απευθύνεται στη διεύθυνση;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό giannosfor » 12 Αύγ 2011, 18:34

Qdata έγραψε:Επιτέλους το βρήκα! :mrgreen:
Με πέδεψε πάρα πολύ αλλά με βοήθησε αφού μέχρι να την λύσω χρησιμοποίησα δείκτες,συναρτήσεις κτλ.Τελικά το μόνο που χρειαζόταν ήταν σκέψη στον τρόπο και όχι στον κώδικα!Να και η λύση:
Spoiler: show
Κώδικας: Επιλογή όλων
/* ------------------------------------------------------
* Από: Qdata
*
* Άσκηση: Γράψτε μια συνάρτηση που θα παίρνει ως ορίσματα δυο strings και
* θα ελέγχει για το αν το ένα είναι αναγραμματισμός του άλλου.
* Θα επιστρέφει TRUE αν είναι, FALSE αν δεν είναι (ή 1 και 0, αντίστοιχα).
*
* Παραδείγματα:
*
* "abcd", "dbca" δίνει TRUE
* "helle", "hollo" δίνει FALSE
* "z", "zzz" δίνει FALSE
* "zzz", "z" δίνει FALSE
* "z", "z" δίνει TRUE
* -----------------------------------------------------
*/

#include <stdio.h>
#include <string.h> /* για strlen() */

/*-------------------- Main Fuction --------------------*/

main()
{
int len,result;
char first_word[100],second_word[100];
printf("Δώστε την πρώτη λέξη: ");
gets(first_word);
printf("Δώστε την δεύτερη λέξη: ");
gets(second_word);
len = strlen(first_word);
result = strcheck(len,first_word,second_word);
if(result == 1)
printf("Οι πρώτη λέξη είναι αναγραμματισμός της άλλης.\n");
else
printf("Καμία από τις λέξεις δεν είναι αναγραμματισμός της άλλης.\n");
}

/*-------------------- String Check --------------------*/

int strcheck(int len_from_main,char str_one[100], char str_two[100])
{
int i,j; /*για for loop*/
int len,count;
len = len_from_main;
count = 0;
for(i=0,j=(len-1);i != (len+1), j != 0;++i,j=j-1)
{
if(str_one[i] == str_two[j])
++count;
}
++count;
if(count == len)
return 1;
else
return 0;
}

/*------------------- End of program -------------------*/

(Συγνώμη που δεν χρησιμοποίησα πολλά σχόλια.Θα προσπαθήσω να κάνω πιο ευανάγνωστο τον κώδικα.)
Επίσης ξέρω πως η γραμμή:
Spoiler: show
Κώδικας: Επιλογή όλων

if(str_one[i] == str_two[j])
Δεν είναι ότι το καλύτερο για να συγκρίνω την θέση του πίνακα αλλά όταν χρησιμοποιούσα κάτι άλλο που έβγαζε σφάλματα. :problem:
@migf1 Πολύ ωραία η άσκηση! :thumbup: :)

Προσπάθησα να τρέξω το κώδικα αλλά έβγαζε λάθος για πολλές τιμές.
Απ'ότι είδα αυτό συμβαίνει γιατί δεν ελέγχεις το μήκος των λέξεων να είναι ίδιο,σαν αποτέλεσμα δίνει σωστό αποτέλεσμα ακόμα και όταν οι λέξεις είναι διαφορετικές.Αν δοκιμάσεις aaa και aaasdfgsgfrt θα σου βγάλει ότι είναι σωστό.Ακόμα αν βάλεις ένα γράμμα σαν πρώτη λέξη ότι και να βάλεις στη δεύτερη θα στο πάρει σωστό ακόμα και αν αφήσεις κενή τη λέξη.Αυτό έχει να κάνει μάλλον με τα loops και τις δομές ελέγχου που έχεις βάλει.
Έφτιαξα αυτό φαίνεται να δουλεύει.
Κώδικας: Επιλογή όλων
#define bool int
#define TRUE 1
#define FALSE 0

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

int compare(char *s,char *st,int i)
{
if ( i > -1 )
{
if ( *s != *st)
return FALSE;
return compare(++s,--st,--i);
}
return TRUE;
}

void check_arg(char *arg[] )
{
if (arg[1] == NULL)
{
printf("Δέν έχει δωθεί όρισμα.\n");
exit(EXIT_FAILURE);
}
if (arg[2] == NULL)
{
printf("Δέν έχει δωθεί δεύτερο όρισμα.\n");
exit(EXIT_FAILURE);
}
if ( strlen(arg[1]) != strlen(arg[2]) )
{
printf("Οι λέξεις δέν έχουν το ίδιο μήκος.\n");
exit(EXIT_FAILURE);
}

}

int main(int argc, char *argv[])
{
int len;
bool cmp;

check_arg(argv);
len = strlen(argv[1]) -1;
cmp = compare( argv[1], argv[2] + len, len);
if ( cmp )
printf("Οι λέξεις είναι αντιστραμένες.\n");
else
printf("Δέν είναι αντιστραμένες.\n");

exit(EXIT_SUCCESS);
}


Υ.Γ. Ξέρω οτι δεν ήταν αυτό το ζητούμενο της άσκησης.
Τελευταία επεξεργασία από giannosfor και 12 Αύγ 2011, 20:59, έχει επεξεργασθεί 1 φορά/ες συνολικά
1 Γνώσεις Linux: Καθόλου ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 12.04 precise 3.2.0-58-generic 32bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.2.0-57-generic, Microsoft Windows XP Professional
3 Intel Core2 Duo CPU E4600 2.40GHz ‖ RAM 2012 MiB ‖ ASUS INC. P5Q - � P5Q
4 nVidia G94 [GeForce 9600 GT] [10de:0622] {nvidia}
5 eth0: Qualcomm Atheros AR8121/AR8113/AR8114 Gigabit or Fast Ethernet [1969:1026] (rev b0) ⋮ wlan0: 148f:3070 Ralink Technology, Corp. RT2870/RT3070 Wireless Adapter
Άβαταρ μέλους
giannosfor
punkTUX
punkTUX
 
Δημοσιεύσεις: 297
Εγγραφή: 24 Απρ 2011, 20:24
Τοποθεσία: Ηράκλειο
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 12 Αύγ 2011, 18:49

stamatiou έγραψε:Οκ, τώρα κάτι άσχετο. Αν ήθελα να κάνω το περιεχόμενο ενός pointer ++ πως θα το έκανα αφού εσυ κανείς *cp++ και απευθύνεται στη διεύθυνση;

Θα έπρεπε να το κάνεις έτσι:
Κώδικας: Επιλογή όλων
(*cp)++

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

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

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