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

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

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

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

Δημοσίευσηαπό Qdata » 27 Ιούλ 2011, 13:39

migf1 έγραψε:Θα μπορούσε κάποιος συντονιστής να συγκεντρώσει κάπου όλα μαζί τα links αυτά;


Στο πρώτο post(αρχικό) είναι καλά;
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: Τα πάντα για την C/C++

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

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

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

Δημοσίευσηαπό Qdata » 27 Ιούλ 2011, 13:53

migf1 έγραψε:Ναι, μια χαρά νομίζω. Λες να το έκανες ξεχωριστό νήμα όπου θα ποστάρουμε μονάχα παρόμοια links;


Ναι!Να κάνουμε ένα θέμα με "Ιστότοποι και σελίδες σχετικά με C." ;Το δημιουργώ τώρα και βάζω τα links;
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: Τα πάντα για την C/C++

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

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

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

Δημοσίευσηαπό Qdata » 27 Ιούλ 2011, 14:19

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: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 27 Ιούλ 2011, 15:16

Να ρίξω μια ιδέα; Εγώ λέω λόγω της παθήσεώς μας(να καταπιανόμαστε με προχωρημένα και μετά να γυρίζουμε πίσω :lol:) να το χωρίσουμε σε περιόδους, πχ να έχουμε για μια περίοδο ασκήσεις μόνο με strings και μετά από λίγο καιρό μόνο με poiners κλπ.
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

stamatiou έγραψε:Να ρίξω μια ιδέα; Εγώ λέω λόγω της παθήσεώς μας(να καταπιανόμαστε με προχωρημένα και μετά να γυρίζουμε πίσω :lol:) να το χωρίσουμε σε περιόδους, πχ να έχουμε για μια περίοδο ασκήσεις μόνο με strings και μετά από λίγο καιρό μόνο με poiners κλπ.

Μου αρέσει πολύ σαν ιδέα αυτό!

θέλετε να ξεκινήσουμε με πίνακες; (με βρόγχους, struct, if-else, switch, κλπ είμαστε οκ ή να ξεκινήσουμε από εκεί; )

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

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

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

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

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

Δημοσίευσηαπό Star_Light » 27 Ιούλ 2011, 15:47

BΑΣΙΚΑ εγω εχω ξεκινησει και λυνω τις ασκησεις του βιβλιου του Γκιουρδα μαθετε την C σε 24 ωρες... το ειχα βγαλει σαν θεωρια (και λιγο απο ασκησεις φετος το χειμωνα) και τωρα πιανω οσες δεν ειχα κανει... εχει 24 ενοτητες... συνολικα χθες το επιασα... και εχω φτασει στην 8 :D

εχω μια απορια ομως...

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

printf("To programma tha sunexizei tin ektelesi tou mexri na dwsete ton xaraktira K \n\n");



while(x!='K')
{
printf("Dwste enan xaraktira H TO K GIA termatismo: ");
x=getchar();
putchar(x);
}

return 0;
}



ξερω πως αν βγαλω την printf εξω απο την while θα δουλευει καλα... αλλα τωρα δεν μπορω να καταλαβω γιατι ενω την εχω μεσα την βγαζει διπλη... πχ αντι να σου ζηταει μια φορα να εισαγεις εναν χαρακτηρα εμφανιζει το μηνυμα "Dwste enan xaraktira H TO K GIA termatismo: "

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/C++

Δημοσίευσηαπό migf1 » 27 Ιούλ 2011, 16:29

Star_Light έγραψε:BΑΣΙΚΑ εγω εχω ξεκινησει και λυνω τις ασκησεις του βιβλιου του Γκιουρδα μαθετε την C σε 24 ωρες... το ειχα βγαλει σαν θεωρια (και λιγο απο ασκησεις φετος το χειμωνα) και τωρα πιανω οσες δεν ειχα κανει... εχει 24 ενοτητες... συνολικα χθες το επιασα... και εχω φτασει στην 8 :D

εχω μια απορια ομως...

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

printf("To programma tha sunexizei tin ektelesi tou mexri na dwsete ton xaraktira K \n\n");



while(x!='K')
{
printf("Dwste enan xaraktira H TO K GIA termatismo: ");
x=getchar();
putchar(x);
}

return 0;
}



ξερω πως αν βγαλω την printf εξω απο την while θα δουλευει καλα... αλλα τωρα δεν μπορω να καταλαβω γιατι ενω την εχω μεσα την βγαζει διπλη... πχ αντι να σου ζηταει μια φορα να εισαγεις εναν χαρακτηρα εμφανιζει το μηνυμα "Dwste enan xaraktira H TO K GIA termatismo: "

2 φορες :/

Υποφέρει από το πρόβλημα με τα απομεινάρια στο input buffer της κύριας εισόδου. Δυστυχώς από τη στιγμή που σε περιβάλλον Posix η fflush(stdin) δεν λειτουργεί, ή θα πρέπει να δοκιμάζετε τις ασκήσεις σε Windows προσθέτοντας ένας fflush(stdin) πριν από κάθε getchar() (ή πριν από κάθε scanf() ή οποιαδήποτε στάνταρ συνάρτηση διαβάσματος) ή θα πρέπει να απενεργοποιήσετε το line-buffering της κύριας εισόδου στο τερματικό σας (αυτό όμως δεν θα δουλεύει σε Windows).

Ένας τρόπος για να δουλεύει παντού είναι να διαβάζουμε την κάθε γραμμή της κύριας εισόδου μονοκόματα σε ένα δικό μας string (είτε με fgets() είτε καλύτερα με την s_get() που έχω δώσει κώδικα πολλές φορές) και κατόπιν να διαχειριζόμαστε μόνοι μας τις όποιες μεταβλητές θέλουμε να ξεχωρίσουμε από τη γραμμή που διαβάσαμε.

Για διάβασμα απλών χαρακτήρων από την κύρια είσοδο, όπως είναι το παράδειγμα που δίνεις, ευτυχώς αυτό δεν είναι και τόσο δύσκολο να το κάνουμε. Αντί να διαβάζουμε το x με getchar() ως char θα τον διαβάζουμε ως μεγάλο string μεγάλου (255 ωφέλιμων χαρακτήρων) και απλά μετά θα χρησιμοποιούμε τον 1ο του χαρακτήρα για τη σύγκριση στο while-loop.

Δηλαδή (άσχετο: έβαλα κι ένα \n μπροστά, στο printf() μέσα στο while, για να αφήνει γραμμή πριν τυπώσει):
Κώδικας: Επιλογή όλων

#include<stdio.h>
int main( void )
{
char x[255+1] = "";

printf("To programma tha sunexizei tin ektelesi tou mexri na dwsete ton xaraktira K \n\n");

while( x[0] != 'K')
{
printf("\nDwste enan xaraktira H TO K GIA termatismo: ");
fgets(x, 256, stdin);
putchar( x[0] );
}

return 0;
}


Ή επειδή σε ένα οποιοδήποτε string αν βάλουμε ένα αστέρι μπροστά από το όνομά του αναφερόμαστε ουσιαστικά στον 1ο του χαρακτήρα, το παραπάνω μπορούμε να το γράψουμε και ως εξής:
Κώδικας: Επιλογή όλων

#include<stdio.h>
int main( void )
{
char x[255+1] = "";

printf("To programma tha sunexizei tin ektelesi tou mexri na dwsete ton xaraktira K \n\n");

while( *x != 'K')
{
printf("\nDwste enan xaraktira H TO K GIA termatismo: ");
fgets(x, 256, stdin);
putchar( *x );
}

return 0;
}


Χρησιμοποιήστε όποιο από τα 2 καταλαβαίνετε καλύτερα!

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

1. τον ορισμό μια σταθεράς για το μέγιστο μήκος της γραμμής εισόδου, συμπεριλαμβανομένου του '\0' στο τέλος (πάντα μεγάλο μήκος, π.χ. 255+1)
2. τη συνάρτηση s_get() (χρησιμοποιήστε την έτοιμη όπως σας την δίνω, απλά την κάνετε copy & paste σε όλα σας τα προγράμματα)
3. χρήση ενός string για το διάβασμα κάθε εισόδου από το χρήστη.
4. γέμισμα των μεταβλητών σας από τα κομμάτια της γραμμής εισόδου που διαβάσετε από τον χρήστη

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

#include<stdio.h>

#define MAXINBUF (255+1) // μέγιστο μήκος γραμμής εισόδου

// -----------------------------------------------------------------------------
// Διάβασμα της γραμμής εισόδου στο string s (μέχρι len-1 χαρακτήρες)
//
char *s_get(char *s, size_t len)
{
char *cp;
for (cp=s; (*cp=getc(stdin)) != '\n' && (cp-s) < len-1; cp++ )
; // for-loop with empty body
*cp = '\0'; // null-terminate last character

return s;
}

// -----------------------------------------------------------------------------
int main( void )
{
char inbuf[ MAXINBUF ] = ""; // string για μονοκόμματο διάβασμα γραμμής εισόδου
char x = ' ';

printf("To programma tha sunexizei tin ektelesi tou mexri na dwsete ton xaraktira K \n\n");

while( x != 'K')
{
printf("\nDwste enan xaraktira H TO K GIA termatismo: ");
s_get(inbuf, MAXINBUF); // διάβασμα γραμμής εισόδου στο inbuf
x = *inbuf; // κρατάμε στη μεταβλητή μας μόνο ότι χρειαζόμαστε
putchar( x );
}

return 0;
}


Για να μετατρέπετε το string της γραμμή εισόδου σε int χρησιμοποιήστε την: atoi(), για float/double την atof(), για long την atol().
Τελευταία επεξεργασία από migf1 και 27 Ιούλ 2011, 16:55, έχει επεξεργασθεί 2 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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