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

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

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

Δημοσίευσηαπό Star_Light » 24 Ιούλ 2011, 02:44

Καθως διαβαζα τα τουτοριαλ του migf1 για τα strings μου ηρθε να παιξω λιγο με τους δεικτες.
ΘΥμηθηκα και το κρυφτο που παιζαμε οταν ειμασταν μικροι που μετρουσε καποιος 5 , 10 , 15 , 20 , 25

και μετα ηθελα να το κανω και αντιστροφα!


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

/*==================================================
Aplo paradeigmataki me deiktes
ektupwsi twn stoixeiwn enos pinaka
kanonika kai stin sunexeia me tin antistrofi seira

23/7/11
Star_Light
==================================================== */

#include<stdio.h>
int main()

{
int *ip; /*integer pointer*/
int array[5]={5,10,15,20,25};

for(ip=array; ip<&array[5]; ip++)
{
printf("\n\n");
printf("%d",*ip);
}
while((*ip)!=5)
{
   ip--;
   printf("\n\n");
   printf("%d",*ip);
}

return 0;
}


ΟΠως λεει και o migf1 εδω εκμεταλευομαστε οτι μετα το for η τιμη ειναι 25. Ναι αλλα αυτο που ειναι ομως αποθηκευμενο??? Μεσα στο Memory layout σε ποιο σημειο ειναι το 25??? μιας και δεν εχω τιμη επιστροφης απο καποια συναρτηση ωστε να μπει στο STACK.
Γνώσεις ⇛ 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 » 24 Ιούλ 2011, 19:58

Σωστοοοοοοοοος! :)

Star_Light έγραψε:ΑΧΑ οκ.

Κατι αλλο τωρα... στους οδηγους για τα strings σε καποιο σημειο λες ->

"Επειδή όμως η fgets() διατηρεί και το ENTER μέσα στο s, είναι κι αυτή ολίγον... σπαστική, αφού συχνά χρειάζεται να πάμε μετά το διάβασμα να το σβήσουμε χειροκίνητα, αντικαθιστώντας το με τον μηδενικό χαρακτήρα '\0'."

Δηλαδη τι ακριβως εννοεις ????

EDIT: OK. Καταλαβα ουσιαστικα διατηρει μεσα και τον χαρακτηρα για το enter (που σταματαει) αλλα και τον χαρακτηρα '/0' οποτε κατι τετοιο σε απλη μεταφραση σημαινει πλεονασμος... οποτε παμε να φτιαξουμε μια συναρτηση που ειτε θα σταματαει με το ENTER ειτε με το τελος του string (n-1) απλα μπαινει και το n-1 επειδη εδω υπολογιζεται και ο κενος ετσι??? ΟΠοτε οι ωφελιμοι χαρακτηρες ειναι n-1 αν δηλαδη εχουμε s[10] τοτε το n ειναι 10 ωραια???? ΑΠο 0....9 επομενως οι ωφελιμοι ειναι n-1 δηλαδη απο 0....8 επειδη στο 9 θα μπει το '/0'. Οκ?????

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

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

Δημοσίευσηαπό migf1 » 24 Ιούλ 2011, 20:25

ΟΠως λεει και o migf1 εδω εκμεταλευομαστε οτι μετα το for η τιμη ειναι 25. Ναι αλλα αυτο που ειναι ομως αποθηκευμενο??? Μεσα στο Memory layout σε ποιο σημειο ειναι το 25??? μιας και δεν εχω τιμη επιστροφης απο καποια συναρτηση ωστε να μπει στο STACK.

Το 25 (όπως κι οι υπόλοιπες τιμές του array) στο συγκεκριμένο παράδειγμα είναι αποθηκευμένες στο section που αποθηκεύονται οι αρχικοποιημένες μεταβλητές (δλδ στο data segment) μια και το array μας είναι αρχικοποιημένο.

Star_Light έγραψε:Καθως διαβαζα τα τουτοριαλ του migf1 για τα strings μου ηρθε να παιξω λιγο με τους δεικτες.
ΘΥμηθηκα και το κρυφτο που παιζαμε οταν ειμασταν μικροι που μετρουσε καποιος 5 , 10 , 15 , 20 , 25

και μετα ηθελα να το κανω και αντιστροφα!
Spoiler: show
Κώδικας: Επιλογή όλων

/*==================================================
Aplo paradeigmataki me deiktes
ektupwsi twn stoixeiwn enos pinaka
kanonika kai stin sunexeia me tin antistrofi seira

23/7/11
Star_Light
==================================================== */

#include<stdio.h>
int main()

{
int *ip; /*integer pointer*/
int array[5]={5,10,15,20,25};

for(ip=array; ip<&array[5]; ip++)
{
printf("\n\n");
printf("%d",*ip);
}
while((*ip)!=5)
{
   ip--;
   printf("\n\n");
   printf("%d",*ip);
}

return 0;
}


Αυτό εδώ το κομμάτι δεν είναι οκ...
Κώδικας: Επιλογή όλων
while((*ip)!=5)
{
   ip--;
   printf("\n\n");
   printf("%d",*ip);
}

διότι στη συνθήκη του while-loop εξετάζεις με το *ip το περιεχόμενο της διεύθυνσης μνήμης που ακολουθεί το τελευταίο στοιχείο του array. Στο for-loop είναι οκ επειδή εκεί εξετάζει τη διεύθυνση της μνήμης, μετά το τέλος του for-loop όμως ο ip εξακολουθεί να δείχνει σε εκείνη τη διεύθυνση.

Άρα πρέπει να τον πας μια θέση πίσω πριν αρχίζεις να εξετάζεις το περιεχόμενό του στη συνθήκη του while-loop...

Ένας τρόπος είναι να το κάνεις έτσι..
Κώδικας: Επιλογή όλων
   ip--;
   while( *ip != 5) {
      ip--;
      printf("\n\n");
      printf("%d",*ip);
   }


Άλλος τρόπος είναι να το κάνεις έτσι...
Κώδικας: Επιλογή όλων
   while( *--ip != 5)
      printf("\n%d\n", *ip);
   printf("\n%d\n", *ip);
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 24 Ιούλ 2011, 20:46

migf1 έγραψε:Το 25 (όπως κι οι υπόλοιπες τιμές του array) στο συγκεκριμένο παράδειγμα είναι αποθηκευμένες στο section που αποθηκεύονται οι αρχικοποιημένες μεταβλητές (δλδ στο data segment) μια και το array μας είναι αρχικοποιημένο.

Ώπα, άκυρο... τώρα είδα πως το array μας δεν είναι ορισμένο ως καθολική μεταβλητή, άρα όντως πάει στο STACK!

Πώς κι έχεις τόσο μεγάλο ενδιαφέρον για τις εσωτερικές υλοποιήσεις της γλώσσας; Ίσως θα σου ήταν χρήσιμο να μάθεις κι assembly αν σου αρέσουν αυτά τα πράγματα :)

Δες πάντως ένα σχετικό link: http://www.bravegnu.org/gnu-eprog/c-startup.html
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

migf1 έγραψε:
migf1 έγραψε:Το 25 (όπως κι οι υπόλοιπες τιμές του array) στο συγκεκριμένο παράδειγμα είναι αποθηκευμένες στο section που αποθηκεύονται οι αρχικοποιημένες μεταβλητές (δλδ στο data segment) μια και το array μας είναι αρχικοποιημένο.

Ώπα, άκυρο... τώρα είδα πως το array μας δεν είναι ορισμένο ως καθολική μεταβλητή, άρα όντως πάει στο STACK!

Πώς κι έχεις τόσο μεγάλο ενδιαφέρον για τις εσωτερικές υλοποιήσεις της γλώσσας; Ίσως θα σου ήταν χρήσιμο να μάθεις κι assembly αν σου αρέσουν αυτά τα πράγματα :)

Δες πάντως ένα σχετικό link: http://www.bravegnu.org/gnu-eprog/c-startup.html


ε βάσικα με ενδιαφέρει να μάθω κατι σε βάθος και οχι επιφανειακα. Πιο παλια ασχολιόμουν με την ασφάλεια και το είδος των επιθέσεων μεχρι που έπεσα και στο Buffer Overflow οπου εκει διαβασα ενα αρθρο που είχε ολα αυτα και μου εκτίναξε την περιέργεια. Βεβαια παντοτε ήθελα να είμαι ταυτόχρονα και προγραμματιστής. Αν οχι τοσο καλος οσο εσυ τουλαχιστον αν μου δωσουν ενα module να ξερω να βρισκω μια ακρη!!!!
Γνώσεις ⇛ 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

Δημοσίευσηαπό Star_Light » 24 Ιούλ 2011, 22:42

Να ρωτησω και κατι πιο γενικο..... Οταν λεμε πολυπλοκοτητα εννοουμε τον χρονο που κάνει ένας αλγοριθμος να υλοποιηθεί μέσα απο τις εντολές του προγράμματος. Αυτος ειναι ο χρονος εκτέλεσης ας πουμε. Τωρα αυτος ο χρονος φανταζομαι σχετιζεται και με τις προδιαγραφες του υλικου.... δηλαδη αν ο επεξεργαστης Α ειναι γρηγοροτερος απο τον επεξεργαστη Β ως προς το ρολοι τοτε το προγραμμα θα εκτελεστει γρηγοροτερα στον επεξεργαστη Α απο οτι στον Β ετσι δεν ειναι? Ενω αν έχω 2 ιδιας προδιαγραφης ως προς τις επιδοσεις επεξεργαστες άλλα στον Α έχω πιο γρήγορο λειτουργικο σύστημα (πιο καλή διαχειριση των πορων απο οτι στον Β) δεν θα παλι δεν θα εκτελεστει το πρόγραμμα πιο γρήγορα στον Α απο οτι στον Β? ασχετα με την πολυπλοκοτητα του... πολυπλοκοτητα ειναι ο χρονος εκτελεσης ε?
Γνώσεις ⇛ 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 » 24 Ιούλ 2011, 22:50

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

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

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

migf1 έγραψε:Δεν μετριέται σε μονάδες χρόνου η πολυπλοκότητα. Γκούγκλαρε "big o notation" ;)


Καλα θα το ψαξω. Να ρωτησω κατι αλλο. Η αρχιτεκτονικη ARM παίζει πανω κατω σε ολους τους επεξεργαστες?

και κατι τελευταιο... τι εννοει οταν λεει ας πουμε "Η στοιβα έχει ρυθμιστει σωστα πριν την μεταβιβαση ελεγχου σε κωδικα C" ... ελπιζω να το μεταφραζω σωστα.....

EDIT: Ακυρο API ειναι η ARM.

EDIT2 : σΑν να μπερδευτηκα λιγο λολ αλλου την λενε API στην wiki τωρα την λενε αρχιτεκτονικη κτλπ. Χμμμ θα δω

EDIT 3 : σετ εντολων πρεπει να ναι τελικα για καθε επεξεργαστηα οποτε οκ

EDIT 4: ok το κουρασα παω για διαβασμα!!!!!
Γνώσεις ⇛ 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 » 25 Ιούλ 2011, 15:07

migf1 έγραψε:
migf1 έγραψε:Απλή υλοποίηση Κρεμάλας: viewtopic.php?f=6&t=19504

Παιδιά, θα μπορούσε κάποιος να επιβεβαιώσει ή να διαψεύσει πως τα ελληνικά της κρεμάλας λειτουργούν στο Ubuntu; Το δικό μου λάπτοπ με το Linux πάλι τα έχει φτύσει :(

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

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

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

migf1 έγραψε:
migf1 έγραψε:
migf1 έγραψε:Απλή υλοποίηση Κρεμάλας: viewtopic.php?f=6&t=19504

Παιδιά, θα μπορούσε κάποιος να επιβεβαιώσει ή να διαψεύσει πως τα ελληνικά της κρεμάλας λειτουργούν στο Ubuntu; Το δικό μου λάπτοπ με το Linux πάλι τα έχει φτύσει :(

Κανείς; :(


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

Τα ελληνικά τα εμφανίζει με �.
Linux User: #530165
Γνώσεις ⇛ Linux: Μέτριο ┃ Προγραμματισμός: Ναι ┃ Αγγλικά: Καλά
Λειτουργικό ⇛ Ubuntu 11.04 32bit σε Intel(R) Atom(TM) CPU N270 @ 1.60GHz
(Notebook) Προδιαγραφές ⇛ 2x Intel(R) Atom(TM) CPU N270 @ 1.60GHz │ 1016MB │ HDA-Intel - HDA Intel -- USB-Audio - USB AUDIO│ 1024x600 pixels
Νέος στο Linux?Οδηγοί - How to - Tutorials
Qdata
powerTUX
powerTUX
 
Δημοσιεύσεις: 1875
Εγγραφή: 18 Ιουν 2010, 19:40
Τοποθεσία: Σέρρες
IRC: dimos
Εκτύπωση

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

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

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

cron