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

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

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

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

Δημοσίευσηαπό migf1 » 23 Ιουν 2011, 00:41

clepto έγραψε:αυτό για τα δίσεκτα έτη δεν ξέρω να το κάνω...
θα προσθέσω κάποια πράγματα για τις άκυρες ημερομηνίες...


Στο δείχνω εδώ με κώδικα, στην συνάρτηση: validdate(), δεν σε βοηθάει;

έγραψε:κάποιο άλλο project να ξεκινήσω έχεις να μου προτείνεις;

Αυτό εδώ είναι η βίβλος της C, γραμμένο από τον εφευρέτη της γλώσσας και εκ των δημιουργών του Unix.

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

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

Δημοσίευσηαπό clepto » 23 Ιουν 2011, 00:52

θα το τσεκάρω...
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: Τα πάντα για την C/C++

Δημοσίευσηαπό stamatiou » 23 Ιουν 2011, 11:29

Παιδιά, μπορεί κάποιος να μου πει πότε κάνουμε μία συνάρτηση pointer;
Δλδ:
Κώδικας: Επιλογή όλων
main() {
int *function(int a, int b) {

}
}
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

Δεν υπάρχει κάποιο στάνταρ ή κάποιος κανόνας. Συνήθως δεν χρειάζεται καν!

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

Π.χ. αν γράψεις μια συνάρτηση που παίρνει σαν όρισμα ένα string και μετατρέπει τους χαρακτήρες του σε κεφαλαία...
Κώδικας: Επιλογή όλων

void s_toupper( char *s );

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

char s[255+1] = "";

fgets(s, 255+1, stdin); // read s from user
s_toupper(s); // convert s to uppercase
puts( s ); // print s on the screen


Αν όμως θέλεις την s_toupper() να την περνάς ως όρισμα σε άλλες συναρτήσεις, τότε μπορείς να την κάνεις να επιστρέφει string ( char *s ):
Κώδικας: Επιλογή όλων

char *s_toupper(char *s);

Οπότε ο κώδικας δουλεύει και όπως είναι γραμμένος παραπάνω, αλλά τώρα δουλεύει και αν τον γράψεις ως εξής:
Κώδικας: Επιλογή όλων

char s[255+1] = "";

fgets(s, 255+1, stdin); // read s from user
puts( s_toupper(s) ); // convert s to uppercase and print it on the screen

Και δουλεύει διότι η puts() παίρνει ως όρισμά της char *, τον τύπο δλδ που βάλαμε να επιστρέφει η s_toupper() (με τιμή προφανώς το αλλαγμένο σε κεφαλαία s)
stamatiou έγραψε:Παιδιά, μπορεί κάποιος να μου πει πότε κάνουμε μία συνάρτηση pointer;
Δλδ:
Κώδικας: Επιλογή όλων
main() {
int *function(int a, int b) {

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

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

Δημοσίευσηαπό migf1 » 23 Ιουν 2011, 14:10

Ήθελα από καιρό να ποστάρω αυτό το link, αλλά δεν το έβρισκα στα bookmarks μου ούτε στο Google. Σήμερα, δεν ξέρω πως, ξανά 'βαλα στο Google και το βρήκα με τη μια :?:

http://www.jetcafe.org/jim/c-style.html

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

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

Δημοσίευσηαπό stamatiou » 23 Ιουν 2011, 15:37

@migf1:

Στο tutorial σου είχες γράψει μια συνάρτηση η οποία επιστρέφει το μήκος μιας string, και εγώ για να πειραματιστώ προσπάθησα να γάψω μια πιο απλά έκδοση:
Κώδικας: Επιλογή όλων
main() {

int i;
int *p;
p = &i;
*p = 0;
char c;
int b;
c = getchar();
char mhkosgram(c) {
while(c != "\n" && c != "\0") {
i++;
if(c == " ") {
b++;
}
}
int mhkos = i - b;
printf("The lenght of the line you typed is %d charachters(Spaces and Blank Lines are not count!", mhkos);
}
}

Αλλά ο compiler μου χτυπά:
Κώδικας: Επιλογή όλων
main.c:11:11: warning: comparison between pointer and integer
main.c:11:24: warning: comparison between pointer and integer
main.c:13:9: warning: comparison between pointer and integer
main.c:18:2: warning: incompatible implicit declaration of built-in function ‘printf’
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 23 Ιουν 2011, 16:17

Έχει διάφορα θέματα ο κώδικας αυτός, με σημαντικότερα τα παρακάτω....

1. θέλει #include <stdio.h> στην αρχή για να μπορείς να χρησιμοποιήσεις συναρτήσεις όπως η printf() και η getchar()
2. αυξάνεις τα i και b μέσα στο while-loop, χωρίς όμως να τους έχεις δώσει αρχική τιμή έξω από το loop
3. διαβάζεις μονάχα ένα c μέσω του getchar() έξω από το while-loop, αλλά μέσα στο loop δεν ξαναδιαβάζεις άλλο c, οπότε η συνθήκη του while-loop εξετάζει μονάχα τον 1ο χαρακτήρα από όσους πληκτρολογεί ο χρήστης (κι αν δεν είναι '\n' η συνθήκη είναι συνέχεια FALSE και άρα το loop εκτελείται επ' άπειρον
4. εφόσον διαβάζεις χαρακτήρες από το πληκτρολόγιο έναν-έναν με την getchar() δεν υπάρχει περίπτωση ο χρήστης να σου πληκτρολογήσει τον μηδενικό χαρακτήρα '\0' (δεν υπάρχει τέτοιο πλήκτρο στο keyboard). Άρα συμβάλει κι αυτό στο η συνθήκη του while-loop σου να είναι ΠΑΝΤΑ FALSE
5. όταν συγκρίνεις (διαχειρίζεσαι) χαρακτήρες πρέπει να χρησιμοποιείς μονά εισαγωγικά και όχι διπλά που έχει βάλει στα "\n", "\0" και " " (πρέπει: '\n' και ' '... το '\0' πρέπει να φύγει τελείως)
6. είχες κάτι... ξεκάρφωτα { } (τα σβησα :lol:)
7. η main() πρέπει να ορίζεται ως int και να επιστρέφει στο τέλος της 0 είτε με return 0; είτε με exit(0);

Υποθέτω ο κώδικας που ήθελες να γράψεις είναι κάτι σαν τον παρακάτω...
Κώδικας: Επιλογή όλων

#include <stdio.h>

int main( void )
{
/*** UNUSED
int *p;
p = &i;
*p = 0;
*/
int b = 0;
int i = 0;

int c = getchar();
while (c != '\n') {
i++;
if (c == ' ')
b++;
c = getchar();
}

int mhkos = i-b;
printf("You typed %d non-space charachters\n", mhkos);

printf("\npress ENTER to exit..."); fflush(stdin); getchar();
return 0;
}

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

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

Δημοσίευσηαπό stamatiou » 23 Ιουν 2011, 16:49

migf1 έγραψε: fflush(stdin);

Ευχαριστώ πολύ, αλλά στο τέλος αυτό το fflush(stdin) γιατί το έβαλες;ώς μπορώ αυτό να το βάλω σε ένα function;
Επίσης, π
Τελευταία επεξεργασία από stamatiou και 23 Ιουν 2011, 16:54, έχει επεξεργασθεί 1 φορά/ες συνολικά
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 23 Ιουν 2011, 16:51

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

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

Δημοσίευσηαπό stamatiou » 23 Ιουν 2011, 17:05

migf1 έγραψε:Αυτό το βάζω γιατί είμαι σε Windows εδώ πέρα, και χωρίς αυτό μου κλείνει το παράθυρο της κονσόλας μόλις τερματίσει το πρόγραμμα

Και πώς μπαίνει σε function όλο αυτό;
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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