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

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

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

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

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

Έριξα μια ματιά στο βιβλίο, αυτό που σου λέω παραπάνω για τη διαφορά σε bytes, είναι αυτό που εξηγεί στη σελίδα 301 (btw, έκλεψα υπέρ μου παραπάνω, γιατί ξέχασα να μετρήσω τα μηδενικά bytes στα τέλη των strings, οπότε εγώ δεσμεύω 728 + 7 bytes = 735 :) )
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

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

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

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

Υλοποίησα και το 12ο project (σελ. 313).
Μου πήρε κάποια ώρα, αλλά συνειδητοποίησα μερικά σημαντικά πράγματα:

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <ctype.h> // isspace()

#define MAXINPUT 255+1
#define MAXWORDS 30+1
#define LENWORD 20+1

int main( void )
{
char input[MAXINPUT] = {'\0'}, words[MAXWORDS][LENWORD] = {{'\0'}};
fgets(input, MAXINPUT, stdin);
char *ch = input, *w, *c;
// w points to current string of the word array, ch to current input character
// and c to the current character of the current string of the word array

for (w = words[0]; w <= words[MAXWORDS-1]; w += LENWORD) {
for (; isspace(*ch); ch++); // skip any blanks
if (! *ch) break;

for (c = w; *ch && ! isspace(*ch); c++, ch++)
*c = *ch;
}

// print reversal
for (int i = MAXWORDS-1; i >= 0; i--)
if (words[i][0])
printf("%s ", words[i]);
putchar('\n');

return 0;
}

Δεν ακολούθησα πιστά την εκφώνηση.
Το loop δεν σταματάει σε χαρακτήρες όπως ". , ? ," αλλά τους θεωρεί και αυτούς μέρος των λέξεων.

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

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

Δημοσίευσηαπό migf1 » 24 Μαρ 2012, 03:01

Ηλία είσαι ωραίος :) :clap: :clap: :clap:

Δίνω και εγώ έναν τρόπο, που αγνοεί και τα σημεία στίξης μαζί με τα κενά...

Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define MAXINPUT (255+1)
#define MAXWORDS 30
#define WLEN (20+1)

#define CHR_ACCEPTABLE(ch) ( !isspace( (int)(ch) ) && !ispunct( (int)(ch) ) )

/* ------------------------------------------------------- */
void print_words( char words[][WLEN] )
{
if ( !words || !*words )
return;

for (int i=0; i < MAXWORDS && *(words[i]) != '\0'; i++ )
puts( words[i] );

return;
}
/* ------------------------------------------------------- */
char *s_cpTrim( const char *s )
{
char *cp = (char *)s;

if ( !s )
return NULL;

while ( !CHR_ACCEPTABLE(*cp) )
cp++;

return cp;

}
/* ------------------------------------------------------- */
int main( void )
{
char input[ MAXINPUT ] = {'\0'};
char words[ MAXWORDS ][ WLEN ] = { {'\0'} };
char *cp = NULL, *ws = NULL; /* ws: char-ptr to start of next word */
int iword = 0;

printf("Type your sentence: ");
fgets( input, MAXINPUT, stdin);

/* trim leading non-word chars */
ws = s_cpTrim( input );

iword = 0;
for (cp=ws; *cp && iword < MAXWORDS; cp++)
{
if ( !CHR_ACCEPTABLE(*cp) ) {
*cp++ = '\0';
strncpy( words[iword++], ws, WLEN-1 );
ws = cp = s_cpTrim( cp );
}
}

print_words( words );

system("pause"); /* windows only */
exit( EXIT_SUCCESS );
}
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό giannosfor » 24 Μαρ 2012, 14:16

Να ρωτήσω κάτι ,από ποιο βιβλίο κάνετε ασκήσεις ;
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

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

giannosfor έγραψε:Να ρωτήσω κάτι ,από ποιο βιβλίο κάνετε ασκήσεις ;

http://knking.com/books/c2/index.html
Με λίγο ψάξιμο μπορείς να το βρεις εύκολα.
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

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

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

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

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

Ηλία μια πολύ ενδιαφέρουσα άσκηση είναι να φτιάξεις έναν γενικό string-tokenizer.

Δηλαδή μια γενική συνάρτηση η οποία θα δέχεται ένα string (οποιουδήποτε μήκους) και θα το σπάει σε τμήματα (tokens), χρησιμοποιώντας ως διαχωριστικούς χαρακτήρες για τα tokens ότι της περνάμε στα ορίσματα (ενδεχομένως ένα 2ο string αποτελούμενο μόνο από τους διαχωριστικούς χαρακτήρες).

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

Έτοιμες συναρτήσεις που μπορείς να χρησιμοποιήσεις είναι η: strtok() ενώ αν θελήσεις να το κάνεις πιο χειροκίνητα (not recommended) μπορεί να σου φανεί χρήσιμη και η strchr() (ή/και η strrchr() ).

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

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

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

Χμμ, on a 2nd thought, το άφησα πολύ γενικό... οπότε δες την περιγραφή του λιγότερου safe string-tokenizer της LIBS εδώ: http://x-karagiannis.gr/prog/libs/conte ... s_tokenize, για να "ακουμπήσεις" κάπου για ξεκίνημα. Προφανώς δεν είσαι υποχρεωμένος τη δική σου να την υλοποιήσεις με το συγκεκριμένο πρότυπο.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

Δηλαδή αν κατάλαβα καλά θα την καλούμε κάπως έτσι:
Κώδικας: Επιλογή όλων
func("th!is is a long stri!ng", " !")

και το string που περάσαμε θα διασπαστεί στα παρακάτω tokens;
Κώδικας: Επιλογή όλων
"th", "is", "is", "a", "long", "stri", "ng"


Μια άλλη άσκηση που έχω στο μυαλό μου να υλοποιήσω για να δω καλύτερα πως μπορώ να διαχειριστώ arrays με strings είναι η εξής:
Ένα πρόγραμμα στο οποίο θα μπορείς να προσθέσεις/αφαιρέσεις/εμφανίσεις ταξινομημένα τα ζώα ενός ζωολογικού κήπου (λέμε τώρα).
Ilias95
saintTUX
saintTUX
 
Δημοσιεύσεις: 1548
Εγγραφή: 29 Απρ 2011, 23:26
Εκτύπωση

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

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