ΚΕΦΑΛΑΙΟ 4 - ΕΝΤΟΛΕΣ ΣΥΝΘΗΚΗΣ & ΕΠΑΝΑΛΗΨΗΣ

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

Re: ΚΕΦΑΛΑΙΟ 4 - ΕΝΤΟΛΕΣ ΣΥΝΘΗΚΗΣ & ΕΠΑΝΑΛΗΨΗΣ

Δημοσίευσηαπό maenolis » 10 Ιουν 2011, 16:22

Η scanf είναι μια συνάρτηση.Για να περάσει τα δεδομένα σε μια μεταβλητή δεν πρέπει να της δώσουμε την ίδια την μεταβλητή αλλά την διεύθυνση της, δηλαδή &number.
Τελευταία επεξεργασία από maenolis και 10 Ιουν 2011, 16:26, έχει επεξεργασθεί 1 φορά/ες συνολικά
1 Γνώσεις → Linux: Αρχάριος ┃ Προγραμματισμός: c,c++,sql,html,css ┃ Αγγλικά: Μέτριος
2 Λειτουργικό →Dual boot Ubuntu 12.04 64-bit (en_US.UTF-8) & Windows 7 Professional 64-bit
3 Προδιαγραφές → Intel® Core™ i3-2330M CPU @ 2.20GHz × 4 ‖ RAM 7.7 Gb
4 Κάρτες γραφικών: Intel® HD3000
5 Σκληρός Δίσκος: → OCZ Vertex4 Sata III 128Gb
Άβαταρ μέλους
maenolis
punkTUX
punkTUX
 
Δημοσιεύσεις: 261
Εγγραφή: 12 Μάιος 2011, 09:56
Τοποθεσία: Ν.Κόσμος
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 4 - ΕΝΤΟΛΕΣ ΣΥΝΘΗΚΗΣ & ΕΠΑΝΑΛΗΨΗΣ

Δημοσίευσηαπό clepto » 10 Ιουν 2011, 16:25

εντάξει ευχαριστώ!!
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 4 - ΕΝΤΟΛΕΣ ΣΥΝΘΗΚΗΣ & ΕΠΑΝΑΛΗΨΗΣ

Δημοσίευσηαπό Qdata » 10 Ιουν 2011, 16:27

clepto έγραψε:&number μπορείς να μου εξηγήσεις κιόλας;


Είναι στη σύνταξη της C.H scanf() δέχεται στην αρχή αλφαριθμητικό ελέγχου στη συνέχεια "," και μετά την λίστα μεταβλητών.Η απλούστερη μορφή του αλφαριθμητικού ελέγχου σχηματίζετε με το χαρακτήρα "%" και ένα γράμμα της αγγλικής αλφαβήτου ανάλογα με τον τύπο της μεταβλητής που θέλουμε να διαβάσουμε ή να τυπώσουμε.Τα γράμματα που μπορούν να χρησιμοποιηθούν είναι:

Κώδικας: Επιλογή όλων
Χαρακτήρας => c
Ακέραιος => d, o, x, X
Αλφαριθμητικό => s
Πραγματικός αριθμός => f, e, g


Τα ονόματα των μεταβλητών που περιέχονται στη λίστα μεταβλητών της συνάρτησης snacf() πρέπει πάντα να συνοδεύονται με από το "&".Ο χαρακτήρας αυτός όταν τοποθετείτε στην αρχή του ονόματος μιας μεταβλητής εκφράζει τη διεύθυνση μνήμης στην οποία βρίσκετε αποθηκευμένη η συγκεκριμένη μεταβλητή.Η ουσία είναι πως στην scanf() γράφουμε με αυτή την μορφή:
Κώδικας: Επιλογή όλων
scanf(αλφαριθμητικό_ελέγχου,λίστα μεταβλητών);

π.χ.

scanf("%d", &number);


ενώ στην printf() με αυτή τη μορφή:
Κώδικας: Επιλογή όλων
printf(αλφαριθμητικό_ελέγχου,λίστα μεταβλητών);

π.χ.

printf("%d %d", var_1, var_2);


Για την printf()-scanf()=> Έχοντας ως δεδομένο πως ξέρεις Python φαντάσου το σαν τη λειτουργία της format().Πχ:
Κώδικας: Επιλογή όλων
#!/usr/bin/python3

name = "Dimos"
print("Hello!My name is {0} !".format(name))


Off topic:
Το μόνο φόρουμ που δεν προλαβαίνεις σε απαντήσεις!Πάλι με πρόλαβαν! :mrgreen:
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
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 4 - ΕΝΤΟΛΕΣ ΣΥΝΘΗΚΗΣ & ΕΠΑΝΑΛΗΨΗΣ

Δημοσίευσηαπό clepto » 10 Ιουν 2011, 16:30

τώρα το κατάλαβα καλύτερα...ευχαριστώ!
1 Γνώσεις Linux: Ικανοποιητικό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Ubuntu 13.04 raring 3.8.0-30-generic 64bit (en_US.UTF-8, Unity ubuntu), Ubuntu 3.8.0-19-generic, Windows 7
3 Intel Core i7-3537U CPU @ 2.00GHz ‖ RAM 3840 MiB ‖ ASUS K56CB
4 Intel 3rd Gen Core processor Graphics Controller [8086:0166] {i915}
5 wlan0: Atheros Inc. AR9485 Wireless Network Adapter [168c:0032] (rev 01) ⋮ eth0: Realtek RTL8111/8168 PCI Express Gigabit Ethernet controller [10ec:8168] (rev 0a)
clepto
antiwinTUX
antiwinTUX
 
Δημοσιεύσεις: 4102
Εγγραφή: 07 Ιαν 2010, 16:27
Τοποθεσία: Πάτρα
Launchpad: christriant
IRC: Clepto
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 4 - ΕΝΤΟΛΕΣ ΣΥΝΘΗΚΗΣ & ΕΠΑΝΑΛΗΨΗΣ

Δημοσίευσηαπό migf1 » 11 Ιουν 2011, 01:45

Να συμπληρώσω πως αν η μεταβλητή που θες να διαβάσεις με scanf() είναι τύπου string (δηλαδή πίνακας χαρακτήρων) τότε δεν βάζεις το & μπροστά από το όνομά της στην scanf().

Για παράδειγμα...

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

char answer[10];

scanf("%s", answer); // και όχι: scanf("%s", &answer);


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

Στη C λοιπόν, όταν περνάς μια μεταβλητή ως παράμετρο σε μια συνάρτηση (η scanf() είναι μια στάνταρ συνάρτηση) και θέλεις η συνάρτηση αυτή να αλλάζει την τιμή της μεταβλητής, και η αλλαγή να διατηρηθεί και μετά το τέλος της συνάρτησης, τότε περνάς την μεταβλητή στη συνάρτηση με το σύμβολο & μπροστά (σημαίνει "διεύθυνση").

Αντί να περνάς δηλαδή στη συνάρτηση απλώς τη μεταβλητή, της περνάς έναν δείκτη στη μεταβλητή (βασικά το & δεν είναι ακριβώς δείκτης, αλλά μη σε μπερδεύω τώρα κι άλλο).

Το θέμα είναι πως στη C για τις μεταβλητές που έχουν οριστεί ως πίνακες (όπως η answer[10] στο παραπάνω παράδειγμα, που είναι πίνακας 10 χαρακτήρων) μπορούμε να θεωρήσουμε το όνομά τους ως δείκτες στην 1η θέση του πίνακα. Άρα το answer είναι ήδη δείκτης, οπότε όταν το περνάς σαν όρισμα στην scanf() δεν του βάζεις το & μπροστά (αν το βάλεις, θα το θεωρήσει δείκτη σε δείκτη).

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

Re: ΚΕΦΑΛΑΙΟ 4 - ΕΝΤΟΛΕΣ ΣΥΝΘΗΚΗΣ & ΕΠΑΝΑΛΗΨΗΣ

Δημοσίευσηαπό Star_Light » 13 Ιουν 2011, 06:33

Nα συμπληρωσω και εγω πως συμφωνα με τα πολυ κατατοπιστικα γραφομενα του migf1
και μια συμβολοσειρα απλη χωρις να έχει εκχωρηθει σε έναν πίνακα... παρουσια δηλαδη η μή ενος πίνακα
αποτελεί έναν δείκτη. Πχ

Κώδικας: Επιλογή όλων
#include<stdio.h>
int main()
{
printf("Hello");
}


το Hello αποτελει συμβολοσειρά (επειδή μπαίνει σε διπλα εισαγωγικα αλλιως σε μονά θα ήταν ξεχωριστες σταθερές χαρακτήρων ο καθενας) ειναι πίνακας που απο μονος του ειναι ενα είδος δείκτη στο 1ο στοιχειο
και αυτο ειναι αρκετό . Ο δείκτης στην ουσια εκφράζει την τοποθεσία στην μνήμη
που είναι αποθηκευμένη μια μεταβλητη. Μια μεταβλητη στην ουσια ειναι ενα κομματι μνήμης
οπου έχει δεσμευτεί απο την χρήστη για αυτο και λεμε πως οι δείκτες δείχνουν σε μεταβλητές.
Δειχνουν δηλαδη σε θέσεις μνημης (οι οποιες έχουν καταληφθει απο αυτες τις μεταβλητες)
Γνώσεις ⇛ 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: ΚΕΦΑΛΑΙΟ 4 - ΕΝΤΟΛΕΣ ΣΥΝΘΗΚΗΣ & ΕΠΑΝΑΛΗΨΗΣ

Δημοσίευσηαπό maenolis » 13 Ιουν 2011, 14:58

Ο πίνακας κατ ουσίαν δεσμεύει συνεχόμενες θέσεις μνήμης τις οποίες μπορούμε να προσπελάσουμε απλά και μόνο μεταβάλοντας τον δείκτη πχ
Κώδικας: Επιλογή όλων

while ...
table[i]=i*i;
i++;...

Επίσης για τα strings υπάρχει και η παρακάτω δήλωση:
Κώδικας: Επιλογή όλων
stringtable="ubuntuforum";

Η οποία φτιάχνει τον πίνακα stringtable[12] δλδ [ubuntuforum\0]
1 Γνώσεις → Linux: Αρχάριος ┃ Προγραμματισμός: c,c++,sql,html,css ┃ Αγγλικά: Μέτριος
2 Λειτουργικό →Dual boot Ubuntu 12.04 64-bit (en_US.UTF-8) & Windows 7 Professional 64-bit
3 Προδιαγραφές → Intel® Core™ i3-2330M CPU @ 2.20GHz × 4 ‖ RAM 7.7 Gb
4 Κάρτες γραφικών: Intel® HD3000
5 Σκληρός Δίσκος: → OCZ Vertex4 Sata III 128Gb
Άβαταρ μέλους
maenolis
punkTUX
punkTUX
 
Δημοσιεύσεις: 261
Εγγραφή: 12 Μάιος 2011, 09:56
Τοποθεσία: Ν.Κόσμος
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 4 - ΕΝΤΟΛΕΣ ΣΥΝΘΗΚΗΣ & ΕΠΑΝΑΛΗΨΗΣ

Δημοσίευσηαπό migf1 » 13 Ιουν 2011, 15:20

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

Για κάθε string literal ο compiler φτιάχνει μια κρυφή μεταβλητή με όνομα τα γράμματα που περιέχει το string literal για δική του εσωτερική χρήση, π.χ....
Κώδικας: Επιλογή όλων

char *Hello="Hello"; // ισοδυναμεί με: char Hello[6] = { 'H', 'e', 'l', 'l', 'o', '\0' };
στην οποία εμείς δεν έχουμε πρόσβαση.

ΥΓ. Το έχω ποστάρει κι αλλού θυμάμαι, αλλά όποιος θέλει μπορεί να διαβάσει αυτές εδώ τις δημοσιεύσεις μου περί strings στο φόρουμ της GVRteam.


Star_Light έγραψε:Nα συμπληρωσω και εγω πως συμφωνα με τα πολυ κατατοπιστικα γραφομενα του migf1
και μια συμβολοσειρα απλη χωρις να έχει εκχωρηθει σε έναν πίνακα... παρουσια δηλαδη η μή ενος πίνακα
αποτελεί έναν δείκτη. Πχ

Κώδικας: Επιλογή όλων
#include<stdio.h>
int main()
{
printf("Hello");
}


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

Re: ΚΕΦΑΛΑΙΟ 4 - ΕΝΤΟΛΕΣ ΣΥΝΘΗΚΗΣ & ΕΠΑΝΑΛΗΨΗΣ

Δημοσίευσηαπό migf1 » 13 Ιουν 2011, 15:27

Ο σωστός ορισμός είναι:
Κώδικας: Επιλογή όλων

char *stringtable="ubuntuforum";

και για να είμαστε απολύτως συνεπείς με τις έννοιες και τις ονομασίες καλό θα είναι να αλλάζαμε το όνομα από stringtable είτε σε σκέτο string είτε σε chartable...
Κώδικας: Επιλογή όλων

char *string="ubuntuforum"; // ή char *chartable="ubuntuforum";

... γιατί η ονομασία stringtable νοηματικά παραπέμπει σε πίνακα από strings, δλδ κάτι σαν το παρακάτω:
Κώδικας: Επιλογή όλων

char *stringtable[] = { "sun", "mon", "tue", "wed", "thu", "fri", "sat" };


maenolis έγραψε:
[snip]
Επίσης για τα strings υπάρχει και η παρακάτω δήλωση:
Κώδικας: Επιλογή όλων
stringtable="ubuntuforum";

Η οποία φτιάχνει τον πίνακα stringtable[12] δλδ [ubuntuforum\0]
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

Re: ΚΕΦΑΛΑΙΟ 4 - ΕΝΤΟΛΕΣ ΣΥΝΘΗΚΗΣ & ΕΠΑΝΑΛΗΨΗΣ

Δημοσίευσηαπό maenolis » 13 Ιουν 2011, 15:33

migf1 έγραψε:
Κώδικας: Επιλογή όλων
char *stringtable[] = { "sun", "mon", "tue", "wed", "thu", "fri", "sat" };



Μόνο που εδώ πας σε έναν τύπου "δυσδιάστατο" και είναι τύπου string σωστά; Δεν το εννούσα έτσι το stringtable έχεις δίκιο όμως λάθος ονομασία έδωσα. Ξέχασα και το *!
1 Γνώσεις → Linux: Αρχάριος ┃ Προγραμματισμός: c,c++,sql,html,css ┃ Αγγλικά: Μέτριος
2 Λειτουργικό →Dual boot Ubuntu 12.04 64-bit (en_US.UTF-8) & Windows 7 Professional 64-bit
3 Προδιαγραφές → Intel® Core™ i3-2330M CPU @ 2.20GHz × 4 ‖ RAM 7.7 Gb
4 Κάρτες γραφικών: Intel® HD3000
5 Σκληρός Δίσκος: → OCZ Vertex4 Sata III 128Gb
Άβαταρ μέλους
maenolis
punkTUX
punkTUX
 
Δημοσιεύσεις: 261
Εγγραφή: 12 Μάιος 2011, 09:56
Τοποθεσία: Ν.Κόσμος
Εκτύπωση

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

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

cron