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

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

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

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

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

παντως πρωτη φορα το ακουω αυτο με την getchar καλα θα μου πεις παλια ημουν ασχετος(τωρα δεν ειμαι χαχαχαχα και καλα) αλλα ουτε ενας καθηγητης στην σχολη να μην το πει??? ή ενα βιβλιο??? τσκ τσκ τσκ οποία λύπις χαχαχαα
Γνώσεις ⇛ 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 » 28 Ιούλ 2011, 17:24

Star_Light έγραψε:παντως πρωτη φορα το ακουω αυτο με την getchar καλα θα μου πεις παλια ημουν ασχετος αλλα ουτε ενας καθηγητης στην σχολη να μην το πει??? ή ενα βιβλιο??? τσκ τσκ τσκ οποία λύπις χαχαχαα

Είναι πολλά πράγματα που μαθαίνονται στην πράξη, γιατί η κάθε πλατφόρμα υλοποιεί εσωτερικά με διαφορετικό τρόπο τα standards που περιγράφει η κάθε γλώσσα. Π.χ. αυτό που λέμε με την fflush(stdin) δεν είναι μόνο θέμα του compiler αλλά και του shell της κάθε πλατφόρμας και του τερματικού. Μπορείς να απενεργοποιήσεις πλήρως αν θες το line-buffering στο tty τερματικό σου, οπότε δεν θα περιμένει να πατήσεις ENTER στο command-line πριν αρχίσει να διαβάζει την κύρια είσοδο... θα διαβάζει απευθείας τον κάθε χαρακτήρα με το που τον πληκτρολογείς (αυτό έχει βέβαια άλλα προβλήματα, π.χ. κάνει πολύ πιο δύσκολο το να διορθώσεις τυπογραφικά λάθη στην είσοδο, πριν πατήσεις το ENTER).

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

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

Δημοσίευσηαπό Star_Light » 28 Ιούλ 2011, 17:37

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

Είναι πολλά πράγματα που μαθαίνονται στην πράξη, γιατί η κάθε πλατφόρμα υλοποιεί εσωτερικά με διαφορετικό τρόπο τα standards που περιγράφει η κάθε γλώσσα. Π.χ. αυτό που λέμε με την fflush(stdin) δεν είναι μόνο θέμα του compiler αλλά και του shell της κάθε πλατφόρμας και του τερματικού. Μπορείς να απενεργοποιήσεις πλήρως αν θες το line-buffering στο tty τερματικό σου, οπότε δεν θα περιμένει να πατήσεις ENTER στο command-line πριν αρχίσει να διαβάζει την κύρια είσοδο... θα διαβάζει απευθείας τον κάθε χαρακτήρα με το που τον πληκτρολογείς (αυτό έχει βέβαια άλλα προβλήματα, π.χ. κάνει πολύ πιο δύσκολο το να διορθώσεις τυπογραφικά λάθη στην είσοδο, πριν πατήσεις το ENTER).

Σε γενικές γραμμές, όπως σε όλα τα πράγματα έτσι και στον προγραμματισμό ισχύει πως η θεωρία απέχει από την πράξη. Για αυτό είναι κρίσιμης σημασίας να μη μένει κανείς μονάχα στη θεωρία αλλά να δοκιμάζει πράματα και στην πράξη. Ή να έχει καθοδηγητές που έχουν εμπειρία και στην πράξη ;)


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

ΔΗλαδη εσυ τωρα ειναι σαν να λες πως το προβλημα της getchar() ειναι προβλημα που οφειλεται σε πλατφορμα ???? Δηλαδη οφειλεται στο shell του POSSIX?
Γνώσεις ⇛ 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 » 28 Ιούλ 2011, 17:46

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

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

Δημοσίευσηαπό Star_Light » 28 Ιούλ 2011, 17:50

migf1 έγραψε:Όχι, οφείλεται στο line-buffering που χρησιμοποιούν όλες οι στάνταρ συναρτήσεις εισόδου της C. Σου έχω δώσει όμως ήδη 2 τρόπους να διαβάζεις ότι θες από την κύρια είσοδο χωρίς να χρησιμοποιείς την getchar, γιατί έχεις κολλήσει σε αυτήν; Ξεκόλλα από την getchar (και από την scanf ;)


δεν ειμαι κολλημενος με αυτες τις 2... απλα θελω να καταλαβω τι ειναι το line buffering και πως σχετιζεται με τις πλατφορμες.....
Γνώσεις ⇛ 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++

Δημοσίευσηαπό stamatiou » 28 Ιούλ 2011, 17:55

Η τροποποίηση για τις 2 ασκήσεις :
Spoiler: show
Για το 2ο:
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>

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 i3,inbuf[255+1];
int p,i1,i2;
do {
printf("Insert the 2 numbers seperated by spaces and then insert the operator: ");
s_get(inbuf,256);
p = sscanf(inbuf,"%d %d %c",&i1,&i2,&i3);
} while (p < 2);

switch (i3) {
case '*':
printf("%d * %d = %d\n",i1,i2,i1*i2);
break;
case '-':
printf("%d - %d = %d\n",i1,i2,i1-i2);
break;
case '+':
printf("%d + %d = %d\n",i1,i2,i1+i2);
break;
case '/':
printf("%d / %d = %d\n",i1,i2,i1/i2);
break;
}
return 0;
}

Και για 1ο:
Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <stdlib.h>

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 i3,inbuf[255+1];
int p,i1,i2;
do {
printf("Insert the 2 numbers seperated by spaces and then insert the operator: ");
s_get(inbuf,256);
p = sscanf(inbuf,"%d %d %c",&i1,&i2,&i3);
} while (p < 3);

switch (i3) {
case '*':
printf("%d * %d = %d\n",i1,i2,i1*i2);
break;
case '-':
printf("%d - %d = %d\n",i1,i2,i1-i2);
break;
case '+':
printf("%d + %d = %d\n",i1,i2,i1+i2);
break;
case '/':
printf("%d / %d = %d\n",i1,i2,i1/i2);
break;
default:
break;
}
return 0;
}

Edit: Οκ, Διόρθωσα τον κώδικα στην πρώτη!
Τελευταία επεξεργασία από stamatiou και 28 Ιούλ 2011, 18:18, έχει επεξεργασθεί 1 φορά/ες συνολικά
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 28 Ιούλ 2011, 17:58

A!

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

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

Δημοσίευσηαπό migf1 » 28 Ιούλ 2011, 18:08

stamatiou έγραψε:Η τροποποίηση για τις 2 ασκήσεις :
[snip]

:bow: :bow: :bow:

Πήρες φόρα φίλε Σταματίου!

:bow: :bow: :bow:

ΥΓ. Δυο μικρές απροσεξίες, στον 1ο κώδικα το p έλεγχέ το να είναι μικρότερο του 3 (και όχι του 2 που το έχεις τώρα) γιατί 3 μεταβλητές θες να διαβάσεις: τα 2 νούμερα και την πράξη. Και ξέχασες πάλι να βάλεις το default στην switch :)
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

Δημοσίευσηαπό migf1 » 28 Ιούλ 2011, 18:38

Σας έχω κι ένα καλό νέο τώρα που μάθαμε και την sscanf, αν θέλετε να την υιοθετήσετε ως τον τρόπο που θα διαβάζετε την κύρια είσοδο, τότε μπορείτε να καταργήσετε και την s_get (που ψυλλιάζομαι πως σας την... δίνει στον εγκέφαλο :lol:) και στη θέση της να χρησιμοποιείτε την στάνταρ: fgets(inbuf, MAXINBUF, stdin).

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

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

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

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

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

Δημοσίευσηαπό Star_Light » 28 Ιούλ 2011, 23:17

διαβάζοντας το manual της sscanf() έκανα μονο μια μικρη τροποποίηση ως προς την πρωτη συνάρτηση που απλα διαβάζει εναν χαρακτήρα και τον εμφανιζει μετα ....

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

int main( void )
{
char c;
int y,z;
long int l1,l2;
float f1, f2;
-> char buffer[BUFFER_SIZE] = "";

printf("Dwste enan xarakthra: ");
-> sscanf(buffer,"%c",&c);
-> get_char( &c );
printf("dwsate ton xarakthra: %c\n", c);


Και τα αλλα ομοιως πηγαινουν νομιζω ε????
Γνώσεις ⇛ 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
Εκτύπωση

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

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