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

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

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

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

Δημοσίευσηαπό Star_Light » 28 Μαρ 2012, 21:08

Βασικα ειπα να κανω και την 4 σελ. 123 μιας και σημερα εχω αρκετο ελευθερο χρονο και δεν παλευω με πτυχιακες , φίλους ή γκομενες.
Τεσπα την ασκηση την έβγαλα ετσι

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

#include <stdio.h>

int main(void)
{
float commission , value;


for(;;)
{

printf("Enter value of trade: ");
scanf("%f" , &value);

if( value == 0 )
break;

if(value<2500.00f)
commission=30.00f + .017f * value;
else if( value < 6250.00f)
commission=56.00f + .0066f * value;
else if( value < 20000.00f)
commission=76.00f + .0034f * value;
else if( value < 50000.00f)
commission=100.00f + .0022f * value;
else if( value < 500000.00f)
commission=155.00f + .0011f * value;

else
commission= 255.00f + .0009f * value;

if(commission < 39.00f)
commission= 39.00f;

printf(" Commission: $ %.2f\n", commission);
}

printf(" The end of the program\n");


return 0;
}


Αμα τη λυσω με την while οπως την λυνει ο King γλιτωνω την μια if μεσα στην δικη μου for(;;) και την break μετα.
Εχει μεγαλη διαφορα για το συγκεκριμενο ?

Tην πηρα οπως ειναι στην σελιδα 81. Εχει ηδη αρκετες else if :P
Γνώσεις ⇛ 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

Δημοσίευσηαπό Star_Light » 28 Μαρ 2012, 21:14

Κεφάλαιοοοοο 7 σου ρχομαιιιιιιιιιι :D
Γνώσεις ⇛ 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

Δημοσίευσηαπό migf1 » 29 Μαρ 2012, 11:31

Ilias95 έγραψε:
migf1 έγραψε:
Για αυτό σου έγραψα το μεσημέρι πως δεν είναι τόσο απλό να την κάνεις γενικής χρήσης. Διότι πέρα από τον κώδικα, πρέπει να βρεις/διαλέξεις/αποφασίσεις τι και ποια ορίσματα θα της περνάς, πως θα τα διαχειρίζεσαι, πως θα αντινετωπίζεις ενδεχόμενα σφάλματα και τι θα επιστρέφεις από την συνάρτηση ;)

Πρόσθεσα και έλεγχο για το αν τα string είναι κενά:
Spoiler: show
Μορφοποιημένος Κώδικας: Επιλογή όλων
#include <stdio.h>
#include <string.h>

#define MAXTOKENS 20

int s_tokenize(char *s, char *tokens[], const int ntoks, const char *delims)
{
int i;

if (! s[0] || ! delims[0])
return 0;

tokens[0] = strtok(s, delims);
for (i = 1; i < ntoks; i++) {
tokens[i] = strtok(NULL, delims);
if (! tokens[i])
break;
}
return i;
}

int main( void )
{
char s[] = "lots of character to play with";
char *tokens[MAXTOKENS] = {NULL};
int ntokens = 0;

ntokens = s_tokenize(s, tokens, MAXTOKENS, "abcd");

if (ntokens > 0)
for (int i=0; i < ntokens; i++)
puts(tokens[i]);

return 0;
}

Από εκεί και πέρα δεν ξέρω τι άλλο να ελέγξω, αλλά δεν ξέρω αν είναι και τόσο ουσιώδες να το κάνω για τώρα.
Α, πριν που έβγαζε περίεργα αποτελέσματα ήταν επειδή είχα αφήσει κατά λάθος μέσα στο loop το παρακάτω "tokens[i] = strtok(NULL, " ,.-");" το οποίο το διόρθωσα.

Καλημέρα, τώρα φαίνεται πολύ καλύτερη η συνάρτηση.

Συγκριτικά με την υλοποίηση της LIBS, λείπει έλεγχος για την περίπτωση που είτε το *s είτε το *delims περαστούν ως NULL (seg-faut) καθώς και έλεγχος για το αν το ntoks περαστεί με αντικανονική τιμή (π.χ. αρνητική).

Όταν είπα πως είναι καλή άσκηση, δεν εννοούσα τόσο τον κώδικα όσο την σκέψη που έπρεπε να προηγηθεί για τον σχεδιασμό της συνάρτησης ώστε να είναι αφενός γενικής χρήσης (reusable) και αφετέρου ασφαλής (bullet-proof). Ήθελα δηλαδή να σε βάλω λίγο στο γενικότερο πνεύμα για συγγραφή ασφαλούς & reusable κώδικα. Το reusable είναι σημαντικό στη C, επειδή σου εξοικονομεί πολύ χρόνο σε μελλοντικά πρότζεκτ, για να μην γράφεις ξανά και ξανά τον ίδιο κώδικα.

Π.χ. αν θελήσεις να φτιάξεις ένα πρόγραμμα που θα έχει δικιά του εσωτερική γραμμή εντολών, μπορείς π.χ. να την διαβάσεις σε ένα string μονοκόμματα με fgets() kai κατόπιν να την περάσεις μέσα από την s_tokenize() για να στην σπάσει σε όσα tokens της πεις, χωρίς να χρειαστεί να ξαναγράψεις τον κώδικα της s_tokenize().

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

Βέβαια την περισσότερη από τη δουλειά του σχεδιασμού την είδες έτοιμη από το πρότυπο της συνάρτησης, οπότε ίσως να σου φάνηκε εύκολη ως άσκηση ;)

Παραθέτω και την υλοποίηση της s_tokenize() από την LIBS, με όλους του απαραίτητους ελέγχους. Για χρήση θέλει #include <errno.h> διότι χρησιμοποιεί τιμές από αυτή την στάνταρ βιβλιοθήκη της C προκειμένου να επιστέψει στον προγραμματιστή έξτρα πληροφορίες σε περίπτωση αποτυχίας (μέσω της στάνταρ καθολικής μεταβλητής: errno).

Μορφοποιημένος Κώδικας: Επιλογή όλων
int s_tokenize( char *s, char *tokens[], int ntoks, const char *delims )
{
register int i=0;

/* sanity checks */
if ( !s || !tokens || !delims ) {
errno = EFAULT;
return 0;
}
if ( !*s || !*delims || ntoks < 1 ) {
errno = EINVAL;
return 0;
}

tokens[ 0 ] = strtok(s, delims);
if ( NULL == tokens[0] )
return 0;
for (i=1; i < ntoks && (tokens[i]=strtok(NULL, delims)) != NULL; i++)
; /* void */

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

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

Δημοσίευσηαπό migf1 » 29 Μαρ 2012, 11:44

Και μια μικρή άσκηση ανεξάρτητη από strings, πως θα φτιάχνατε έναν μετρητή αριθμών στην κονσόλα χρησιμοποιώντας μόνο στάνταρ C (όχι εξωτερικές βιβλιοθήκες ούτε platform dependent συναρτήσεις/header files).

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

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

Δημοσίευσηαπό Star_Light » 29 Μαρ 2012, 12:28

Παντως μεγαλο ρολο στην αποδοτικοτητα ενος κωδικα παιζει και ο αριθμος των επαναληψεων .

Πχ σε έναν κωδικα της μορφης

Κώδικας: Επιλογή όλων
for (d=2; d<n; d++)
if( n % d )
break;


Σελ . 122 άσκηση 12

αν δωσω σαν εισοδο για το n το 17 θα κανει 15 επαναλήψεις μεχρι να βγει απο το παραπανω loop και να προχωρησει σε ελεγχο μετα
αν το n ειναι ή δεν ειναι πρώτος ενω
με μια αντικατάσταση

Κώδικας: Επιλογή όλων
for(d=2; (sq=d*d)<n; d++)

θελει 3 μονο !!!!!!!
Γνώσεις ⇛ 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

Δημοσίευσηαπό migf1 » 29 Μαρ 2012, 12:36

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

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

Δημοσίευσηαπό Star_Light » 29 Μαρ 2012, 12:37

migf1 έγραψε:for(d=2; (sq=d*d)<n; d++)


Κώδικας: Επιλογή όλων
for(d=2; (sq=d*d)<n; d++)
if(n%d==0)
break;


Αυτο εννοουσα. :D

Το 17 δεν διαιρείται τελεια με κανεναν αριθμο απο το 1.... μεχρι και το 16.
Γνώσεις ⇛ 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

Δημοσίευσηαπό migf1 » 29 Μαρ 2012, 12:54

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

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

Δημοσίευσηαπό Star_Light » 29 Μαρ 2012, 13:16

migf1 έγραψε:Δεν κοίταξα την άσκηση, αλλά αν οι τιμές του d από 1 έως και 16 σου είναι ντε-φάκτο άχρηστες, μπορείς να ξεκινήσεις το loop σου από το 17.


Nαι θα μπορούσα... αλλα μονο αν η εισοδος ηταν το 17 αλλιως δεν θα ειχε νοημα :p
αλλα δεν εχεις κοιταξει την ασκηση οπως μου ειπες οποτε οκ.
Γνώσεις ⇛ 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

Δημοσίευσηαπό Star_Light » 29 Μαρ 2012, 13:32

Τεσπα απλα εμεινα λιγο σε αυτο γιατι ηθελα να διαπιστωσω την αξια του να γραφεις efficient κωδικα(μια βασικη αρχη γιατι φανταζομαι θα εχει και αλλες περισσοτερες που θα δω και παρακατω) ή και εν παση περιπτωση
να μην πλατιάζεις και κουράζεις τσαμπα και το μηχανημα :lol: :lol: θα προχωρησω στο επομενο κεφαλαιο αφου ειδα και τις ασκησεις.
Γνώσεις ⇛ 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
Εκτύπωση

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

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

cron