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

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

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

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

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

Σαφώς είναι και θέμα ανθρώπου!

Απλώς εδώ προσπαθώ να εξηγήσω βασικές έννοιες ώστε να γίνουν κατανοητές σε όσο το δυνατόν περισσότερα παιδιά. Π.χ. στον 1ο τρόπο επίλυσης δεν χρησιμοποίησα καθόλου συναρτήσεις γιατί ο σκοπός της λύσης εκείνης δεν ήταν η υλοποίηση δικών μας συναρτήσεων, αλλά η χρήση των έτοιμων atoi, atol και atof για την μετατροπή ενός string σε αριθμό. Όπως επίσης σκοπός ήταν η κατανόηση της βασικής προσέγγισης, κατά την οποία αντί να διαβάζουμε απευθείας τις μεταβλητές, διαβάζουμε πρώτα όλη τη γραμμή εισόδου ως ένα μεγάλο string και κατόπιν το μετατρέπουμε στον τύπο μεταβλητής που χρειαζόμαστε.

Για να καταλάβεις, αν δεν είχες επιλέξει να το υλοποιήσεις απευθείας με συναρτήσεις δεν θα είχες αντιμετωπίσει το πρόβλημα που αντιμετώπισες με το διάβασμα του χαρακτήρα ;)

Στο 2ο τρόπο επίλυσης εισαγάγω και την υλοποίηση δικών μας συναρτήσεων, θεωρώντας δεδομένο πως ο 1ος τρόπος επίλυσης έγινε κατανοητός (αν όχι ΓΡΑΨΤΕ ΤΙΣ ΑΠΟΡΙΕΣ ΣΑΣ) οπότε έχουμε μια βάση να πατήσουμε για να πάμε στη 2η υλοποίηση.

Οι συναρτήσεις μάλιστα που έφτιαξα και χρησιμοποιώ στη 2η υλοποίηση είναι γενικής φύσεως και μπορούν να χρησιμοποιηθούν ατόφιες σε οποιοδήποτε πρόγραμμα από εδώ και πέρα. Αντίθετα, οι δικές σου συναρτήσεις είναι απολύτως εξαρτημένες με το συγκεκριμένο πρόγραμμα ;) Σε τόσο αρχικό στάδιο που είμαστε τώρα, είναι καλό να φτιάχνουμε γενικές συναρτήσεις που θα μπορούμε να τις χρησιμοποιήσουμε ατόφιες και σε επόμενες ασκήσεις (ή σε άλλα δικά μας προγράμματα ανεξαρτήτως ασκήσεων).

ΥΓ. Περιμένω απορίες για τους 2 πρώτους τρόπους επίλυσης της άσκησης, για να πάμε παρακάτω αν είναι, μεθοδικά και στοχευμένα :)
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, 11:37

migf1 έγραψε:Σαφώς είναι και θέμα ανθρώπου!

Απλώς εδώ προσπαθώ να εξηγήσω βασικές έννοιες ώστε να γίνουν κατανοητές σε όσο το δυνατόν περισσότερα παιδιά. Π.χ. στον 1ο τρόπο επίλυσης δεν χρησιμοποίησα καθόλου συναρτήσεις γιατί ο σκοπός της λύσης εκείνης δεν ήταν η υλοποίηση δικών μας συναρτήσεων, αλλά η χρήση των έτοιμων atoi, atol και atof για την μετατροπή ενός string σε αριθμό. Όπως επίσης σκοπός ήταν η κατανόηση της βασικής προσέγγισης, κατά την οποία αντί να διαβάζουμε απευθείας τις μεταβλητές, διαβάζουμε πρώτα όλη τη γραμμή εισόδου ως ένα μεγάλο string και κατόπιν το μετατρέπουμε στον τύπο μεταβλητής που χρειαζόμαστε.

Για να καταλάβεις, αν δεν είχες επιλέξει να το υλοποιήσεις απευθείας με συναρτήσεις δεν θα είχες αντιμετωπίσει το πρόβλημα που αντιμετώπισες με το διάβασμα του χαρακτήρα ;)

Στο 2ο τρόπο επίλυσης εισαγάγω και την υλοποίηση δικών μας συναρτήσεων, θεωρώντας δεδομένο πως ο 1ος τρόπος επίλυσης έγινε κατανοητός (αν όχι ΓΡΑΨΤΕ ΤΙΣ ΑΠΟΡΙΕΣ ΣΑΣ) οπότε έχουμε μια βάση να πατήσουμε για να πάμε στη 2η υλοποίηση.

Οι συναρτήσεις μάλιστα που έφτιαξα και χρησιμοποιώ στη 2η υλοποίηση είναι γενικής φύσεως και μπορούν να χρησιμοποιηθούν ατόφιες σε οποιοδήποτε πρόγραμμα από εδώ και πέρα. Αντίθετα, οι δικές σου συναρτήσεις είναι απολύτως εξαρτημένες με το συγκεκριμένο πρόγραμμα ;) Σε τόσο αρχικό στάδιο που είμαστε τώρα, είναι καλό να φτιάχνουμε γενικές συναρτήσεις που θα μπορούμε να τις χρησιμοποιήσουμε ατόφιες και σε επόμενες ασκήσεις (ή σε άλλα δικά μας προγράμματα ανεξαρτήτως ασκήσεων).

ΥΓ. Περιμένω απορίες για τους 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++

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

migf1 έγραψε:Μια χαρά το προσέγγισες αυτή τη φορά! Το πρόβλημα με το warning είναι πως στη c_function το χ το δηλώνεις σαν όρισμα της συνάρτησης αλλά μετά τα ορίζεις και ως τοπική μεταβλητή.

Και μια σημείωση, την table_characters[BUFFER_SIZE] στην main() δεν τη χρησιμοποιείς, οπότε δεν χρειάζεται να την ορίσεις στην main. Επίσης, για να τυπώσουμε long βάζουμε %ld στην printf (το %lu που έχεις το βάζουμε για να τυπώσουμε unsigned long).

ΑΝ είμαστε όλοι οκ με την λύση που έδωσα για την άσκηση αυτή και δεν έχουμε απορίες (αν έχετε απορίες, ΓΡΑΨΤΕ ΤΕΣ να τις λύσουμε) δείτε έναν ακόμα τρόπο επίλυσης της άσκησης και πείτε αν δεν καταλαβαίνετε κάτι και τι, για να το λύσουμε κι αυτό πριν πάμε παρακάτω. Ξεκινήστε να τον διαβάζετε από την main() στο τέλος και όποια συνάρτηση συναντάτε δείτε τον κώδικά της.

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

/* ******************************
* 2ος Τρόπος Επίλυσης
* ******************************/

#include <stdio.h>
#include <stdlib.h>

#define BUFFER_SIZE (255+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;
}

// ------------------------------------------------------------------------------
void get_char(char *c)
{
char buffer[BUFFER_SIZE] = "";

s_get( buffer, BUFFER_SIZE );
*c = buffer[0];

return;
}

// ------------------------------------------------------------------------------
void get_int(int *n)
{
char buffer[BUFFER_SIZE] = "";

s_get( buffer, BUFFER_SIZE );
*n = atoi( buffer );

return;
}

// ------------------------------------------------------------------------------
void get_long(long int *l)
{
char buffer[BUFFER_SIZE] = "";

s_get( buffer, BUFFER_SIZE );
*l = atol( buffer );

return;
}

// ------------------------------------------------------------------------------
void get_float(float *x)
{
char buffer[BUFFER_SIZE] = "";

s_get( buffer, BUFFER_SIZE );
*x = atof( buffer );

return;
}

// ------------------------------------------------------------------------------
int main( void )
{
char c;
int y,z;
long int l1,l2;
float f1, f2;

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

printf("Dwste enan akeraio: ");
get_int( &y );
printf("Dwste enan akeraio: ");
get_int( &z );
printf("%d * %d = %d\n", y, z, y * z);

printf("Dwste enan megalo akeraio: ");
get_long( &l1 );
printf("Dwste enan megalo akeraio: ");
get_long( &l2 );
printf("%ld + %ld = %ld\n", l1, l2, l1 + l2);

printf("Dwste enan pragmatiko arithmo: ");
get_float( &f1 );
printf("Dwste enan pragmatiko arithmo: ");
get_float( &f2 );
printf("%f1 / %f2 = %f\n", f1, f2, f1 / f2);

return 0;
}


ΥΓ. Για να καταλαβαίνετε καλύτερα τους κώδικες, μην τους κοιτάτε μόνο από εδώ, κάντε τους αντιγραφή μέσα στον editor που χρησιμοποιείτε που σας είναι οικείο σαν περιβάλλον και να τους τρέχετε κιόλας για να καταλαβαίνετε ακριβώς πως δουλεύουν. Και για ότι απορίες προκύψουν, εδώ είμαστε :)


Το χρησιμοποιω μεσα στην s_get σαν ορισμα και στο x=*table_characters; αν το βγαλω δεν μου τρεχει το προγραμμα με τιποτα......
Γνώσεις ⇛ 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, 11:49

Star_Light έγραψε: Κατα την γνωμη σου ποσες ωρες την ημερα πρεπει να αφιερωσει καποιος ειδικα σε αυτο ωστε σε ενα 6μηνο να εχει φτασει σε ενα καλο επιπεδο ? αυριο θα δοκιμασω να ξαναγραφτιαξω τον κωδικα χωρις να κοιταω απο την λυση.

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

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

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

Star_Light έγραψε:Το χρησιμοποιω μεσα στην s_get σαν ορισμα και στο x=*table_characters; αν το βγαλω δεν μου τρεχει το προγραμμα με τιποτα......

Σε τι αναφέρεσαι, δεν κατάλαβα τι ρωτάς.
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, 11:52

migf1 έγραψε:
Star_Light έγραψε: Κατα την γνωμη σου ποσες ωρες την ημερα πρεπει να αφιερωσει καποιος ειδικα σε αυτο ωστε σε ενα 6μηνο να εχει φτασει σε ενα καλο επιπεδο ? αυριο θα δοκιμασω να ξαναγραφτιαξω τον κωδικα χωρις να κοιταω απο την λυση.

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


την καταλαβαινουμε :P

migf1 έγραψε:
Σε τι αναφέρεσαι, δεν κατάλαβα τι ρωτάς.


οπα ακυρο.... δικο μου λαθος.

Οσο για την 2η υλοποιηση της ασκησης που εδωσες σημερα... ουσιαστικα δουλευεις με κλησεις by reference για να δουλευεις απευθειας πανω στο αυθεντικο αντιγραφο της μεταβλητης(στην μνημη) που θα δινει καθε φορα ο χρηστης
Γνώσεις ⇛ 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, 12:28

Εγώ τις κατάλαβα και τις 2, μόνο αυτό από την s_get αλλά όπως είπες migf1 θα την καταλάβω αργότερα.. :D
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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

Πολύ σωστά, χαίρομαι παίδες!

Πιστεύετε πως μπορείτε να κωδικοποιήσετε από το μηδέν (με εξαίρεση την s_get, κάντε την αντιγραφή) ένα πρόγραμμα που θα ζητάει από τον χρήστη 2 αριθμούς κι ένα σύμβολο πράξης και θα τυπώνει το αποτέλεσμα; Εννοώ χωρίς χρήση έτοιμων συναρτήσεων ανάγνωσης (όπως τις scanf(), getchar(), κλπ) αλλά χρησιμοποιώντας την s_get για να διαβάζετε την κύρια είσοδο και μετατρέποντάς την κατόπιν στη μεταβλητή που θέλετε. Κάντε το με ή χωρίς συναρτήσεις get_, όπως σας βολεύει καλύτερα. Αυτή η άσκηση είναι σαν παρένθεση, πριν πάμε στον 3ο τρόπο επίλυσης της προηγούμενης. Σε αυτήν εδώ θα χρειαστεί να χρησιμοποιήσετε και switch ή if για να "καταλαβαίνει" το πρόγραμμα ποια πράξη θα εφαρμόσει στους αριθμούς, ανάλογα το σύμβολο που θα διαβάσει.
Τελευταία επεξεργασία από migf1 και 28 Ιούλ 2011, 14:21, έχει επεξεργασθεί 3 φορά/ες συνολικά
Go under the hood with C: Pointers, Strings, Linked Lists
Άβαταρ μέλους
migf1
powerTUX
powerTUX
 
Δημοσιεύσεις: 2082
Εγγραφή: 03 Ιουν 2011, 16:32
Εκτύπωση

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

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

clepto έγραψε:παιδιά θα έχετε παρατηρήσει ότι δε συμμετέχω και πολύ τώρα τελευταία...το θέμα είναι ότι καλοκαιριάτικα βαριέμαι να κάτσω να διαβάσω C...
επίσης από φέτος αρχίζει το διάβασμα και προετοιμασία για τις πανελλήνιες οπότε δεν θα βλέπετε και πολύ συμμετοχή από μένα...
κάποια στιγμή θα ξανασχοληθώ σίγουρα και τότε θα κάτσω και τις αλλάξω τα φώτα.. :P
απλά ίσως να αργήσει αυτή η στιγμή ;)

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

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

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

Τέλειωσα την άσκηση
Spoiler: show
Κώδικας: Επιλογή όλων
#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 i1,i2;
printf("Insert the first number: ");
s_get(inbuf,256);
i1 = atoi(inbuf);
printf("Insert the second number: ");
s_get(inbuf,256);
i2 = atoi(inbuf);
printf("Insert the operator (+ - * /): ");
s_get(inbuf,256);
i3 = *inbuf;
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;
}
stamatiou
daemonTUX
daemonTUX
 
Δημοσιεύσεις: 947
Εγγραφή: 25 Ιουν 2010, 20:23
Εκτύπωση

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

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