Παραδείγματα & Ασκήσεις στην C

...ασύγχρονα μαθήματα γλώσσας C

Re: Παραδείγματα & Ασκήσεις στην C

Δημοσίευσηαπό Star_Light » 11 Ιούλ 2011, 20:12

migf1 έγραψε:
Star_Light έγραψε:
[snip]
Ο compiler το κανει αυτο?? ή ο προεπεξεργαστης? :S Παλι λαθος θα το εγραψαν εκει που το διαβαζα... ε ρε με αυτες τις πηγες τους!!!!!!
Λιγο δυσκολο να το χεις εσυ migf1 λαθος :P

Βασικά ο compiler καλεί τον preproccessor, αλλά η κάθε εταιρεία κάνει τα... δικά της!

Ο compiler κάνει πολλές δουλειές. Αυτό με τα κενά συνήθως το κάνει ο parser (που επίσης είναι μέρος του compiler).


AHA! Ναι εχω διαβασει για τον Parser που κανει συντακτικη αναλυση!!! Εχεις δει δηλαδη τον yacc????
Απλα σε ενα βιβλιο του ΓΚιουρδα εγραφε πως θα πρεπει να μην ξεχναμε πως ο προεπεξεργαστης της C δεν ειναι μερος του C μεταγλωτιστη :/
συγκεκριμενα στο βιβλιο μαθετε την C σε 24 ωρες σελ.392
Γνώσεις ⇛ 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 » 11 Ιούλ 2011, 20:19

Είναι implementation dependent. Συνήθως ο preprocessor είναι αυτόνομο πρόγραμμα και ο compiler απλώς το καλεί. Π.χ. στον gcc άμα δώσεις το -E flag στο command line του, θα τρέξει μόνο τον preproccessor.
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Παραδείγματα & Ασκήσεις στην C

Δημοσίευσηαπό migf1 » 11 Ιούλ 2011, 22:13

Αν κι εκκρεμεί ακόμα η άσκηση με την αντιστροφή των λέξεων σε μια οποιαδήποτε πρόταση, να δώσω ένα ακόμα... δυσκολάκι :geek:

Γράψτε μια συνάρτηση: int myatoi( char *str ) η οποία θα μιμείται τη στάνταρ συνάρτηση: atoi().

Η συνάρτηση δέχεται ως όρισμα ένα string και επιστρέφει τον ακέραιο αριθμό στον οποίον αντιστοιχεί σε αυτό το string. Θα πρέπει να λαμβάνει υπόψη της τα εξής:
  • αρχικά κενά διαστήματα αγνοούνται
  • τα πρόσημα + και - υπολογίζονται κανονικά (αν δεν υπάρχει πρόσημο, ο ακέραιος θεωρείται θετικός)
  • αν ο πρώτος μη κενός χαρακτήρας δεν είναι ούτε πρόσημο ούτε ψηφίο, η συνάρτηση επιστρέφει 0
  • χαρακτήρες που δεν είναι ψηφία και ακολουθούν κανονικό αριθμό (με ή χωρίς πρόσημο) αγνοούνται
  • αν ο υπολογισμένος αριθμός είναι μεγαλύτερος του INT_MAX, η συνάρτηση επιστρέφει INT_MAX
  • αν ο υπολογισμένος αριθμός είναι μικρότερος του -INT_MAX, η συνάρτηση επιστρέφει -INT_MAX *
* η κανονική atoi() ως αρνητικό όριο επιστρέφει το INT_MIN (και όχι το -INT_MAX) αλλά δεν χρειάζεται να το κάνετε έτσι

Μπορείτε να δοκιμάσετε τη συνάρτηση με τα ακόλουθα strings στην είσοδο:
Κώδικας: Επιλογή όλων

123 (επιστρέφει 123)
-123 (επιστρέφει -123)
+123 (επιστρέφει 123)
123 (επιστρέφει 123)
-123 (επιστρέφει -123)
+123 (επιστρέφει 123)
+abc (επιστρέφει 0)
-abc123 (επιστρέφει 0)
123abc (επιστρέφει 123)
-123abc (επιστρέφει -123)
2147483649 (επιστρέφει 2147483647)
-2147483649 (επιστρέφει -2147483647)
0.123 (επιστρέφει 0)
.123 (επιστρέφει 0)
2.123 (επιστρέφει 2)

Μπορείτε τα παραπάνω strings να τα δοκιμάσετε με την κανονική atoi() ώστε να αντιπαραβάλλετε τα αποτελέσματα της με τα αποτελέσματα της δική σας myatoi()

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

Re: Παραδείγματα & Ασκήσεις στην C

Δημοσίευσηαπό migf1 » 11 Ιούλ 2011, 22:50

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

Όταν καταφέρετε να τον μετατρέψετε σωστά, προχωρήστε προσθέτοντας πρόβλεψη και για πρόσημο. Και μετά να προσθέσετε και πρόβλεψη για overflow (αποτέλεσμα μεγαλύτερο του INT_MAX ή μικρότερο του -INT_MAX). Αυτό είναι ο πυρήνας της άσκησης!

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

Re: Παραδείγματα & Ασκήσεις στην C

Δημοσίευσηαπό Star_Light » 12 Ιούλ 2011, 00:34

μια πολυ βασικη εισαγωγή στις κλήσεις συστήματος μεσω της execv() στον παρακατω κωδικα...
πολυ παλιο προγραμμα προ λιγου το ξεθαψα :D

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


#include <stdio.h>
#include <unistd.h>
int main()
{

char *argv[4]={ "echo" , "hello" , "hello" , NULL };
{

execv("/bin/echo",argv);
printf("Well im ok \n");
}


return 0;


}


Την printf() την εβαλα επειδη θυμαμαι ειχα βαλει και την sleep() μεσα να δω πως δουλευει απλα μετα την εβγαλα.
Γνώσεις ⇛ 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 » 12 Ιούλ 2011, 00:55

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

Re: Παραδείγματα & Ασκήσεις στην C

Δημοσίευσηαπό Star_Light » 12 Ιούλ 2011, 03:11

migf1 έγραψε:Δεν είναι όμως στάνταρ C, είναι μόνο γι Posix περιβάλλοντα.


POSIX δεν ειναι μια σειρα προτυπων που ακολουθουν τα καθαρα συστηματα Unix??? Αφου "επαιζε" και σε Ubuntu αυτο το προγραμματακι τοτε πως???? Τα μπερδεψα λιγο ε???? Με την glibc εχεις ασχοληθει καθολου????
Γνώσεις ⇛ 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 » 12 Ιούλ 2011, 10:22

Unix είναι αλλά στην πράξη είναι σχεδόν ταυτόσημο και με Linuχ. glibc είναι η υλοποίηση της GNU για τις στάνταρ συναρτήσεις της C, οπότε με αυτήν όλοι έχουμε ασχοληθεί :lol: Περιέχει και κάποια extensions, μερικά από τα οποία έχουν υιοθετηθεί κατά καιρούς σε αναθεωρήσεις τις γλώσσας.

ΥΓ. Πάντως δεν είναι κακή ιδέα να μπει και "Posix Specific" κατηγορία στο 1ο πόστ ;)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: Παραδείγματα & Ασκήσεις στην C

Δημοσίευσηαπό migf1 » 12 Ιούλ 2011, 14:47

migf1 έγραψε:
linuxs έγραψε:Θα δώ τον δικό σου αλλα μπορώ να το επεκτείνω και αν θέλω και άλλο χωρο να παω με realloc()...είναι το πως ακριβώς θέλεις να το κάνεις! ;) Εγώ το αφήνω έτσι γιατί κάνω μια ιστοσελίδα αυτή τη στιγμή και βλέπουμε. Θα το βάλω στο πρώτο post μην ανησυχείς!

Ας περιμένουμε και τον φίλο maenolis.

Έχω την εντύπωση πως ο φίλος maneolis δεν βρήκε χρόνο να ασχοληθεί, οπότε παραθέτω την δική μου υλοποίηση. Βασικά έχω κάνει 2 υλοποιήσεις, μια στην οποία η αντιστροφή γίνεται απευθείας στην main() και οι λέξεις τυπώνονται απευθείας στην οθόνη, και μια όπου η αντιστροφή γίνεται μέσα σε συνάρτηση που δέχεται ως όρισμα την αρχική πρόταση και την επιστρέφει με αντεστραμμένες τις λέξεις της.

Παραθέτω (σε spoiler) την πρώτη υλοποίηση που είναι πιο εύκολη κι όταν μου δώσετε το οκ θα παραθέσω και την υλοποίηση με τη συνάρτηση.

Και οι 2 υλοποιήσεις είναι ανεξάρτητες από το πλήθος των λέξεων στην αρχική πρόταση και χρησιμοποιούν τον ίδιον αλγόριθμο για την αντιστροφή.

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

/* ------------------------------------------------------------
* Από: migf1 Έκδοση ΧΩΡΙΣ Συνάρτηση
*
* Αντιστροφή λέξεων μιας πρότασης. Π.χ. το "γειά σου κόσμε"
* γίνεται "κόσμε σου γεια"
*
* Αλγόριθμος:
* πρώτα αντιστρέφεται η αρχική πρόταση και κατόπιν διασπάται
* στις λέξεις της, οι οποίες αντιστρέφονται εκ νέου πριν
* τυπωθούν μια προς μια στην οθόνη.
* ------------------------------------------------------------
*/

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

// ------------------------------------------------------------------------------------
// Αντιστρέφει το string s. Βάζει από έναν δείκτην στην αρχή και το τέλος του s, κι
// εναλλάσει τους χαρακτήρες τους μέχρι να συναντηθούν οι δυο δείκτες στη μέση του s
// ΣΗΜΑΝΤΙΚΟ: το s πρέπει να είναι ήδη δημιουργημένο.
//
char *s_reverse(char *s)
{
if ( !s ) // early exit
return NULL;

char *cp1, *cp2, dummy;

cp2 = s + strlen(s) - 1; // set cp2 at end of s
for (cp1=s; cp1 < cp2; cp1++, cp2--) {
dummy = *cp1;
*cp1 = *cp2;
*cp2 = dummy;
}

return s;
}

// ------------------------------------------------------------------------------------
int main( void )
{
char s[255+1]="", *delims=" \t\n", *cp;

printf("Enter a sentence: ");
fgets(s, 256, stdin);

s_reverse(s);
cp = strtok(s, delims);
while (cp != NULL) {
printf("%s ", s_reverse(cp) );
cp = strtok(NULL, delims);
}
putchar('\n');

fflush(stdin); getchar();
exit( EXIT_SUCCESS );
}

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

Re: Παραδείγματα & Ασκήσεις στην C

Δημοσίευσηαπό migf1 » 12 Ιούλ 2011, 15:15

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

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

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

  • ΣΧΕΤΙΚΑ ΘΕΜΑΤΑ
    ΑΠΑΝΤΗΣΕΙΣ
    ΠΡΟΒΟΛΕΣ
    ΣΥΓΓΡΑΦΕΑΣ

Επιστροφή στο Μαθήματα C