migf1 Δημοσ. 11 Δεκεμβρίου 2011 Δημοσ. 11 Δεκεμβρίου 2011 ελα εξηγησε το λιγο εε εεε φανταστικε migf1 Να ήταν και σωστό κιόλας (ούτε ert υπολογίζει, ούτε φπα και την έκπτωση την κάνει επί του συνολικού ποσού και όχι επί της χρέωσης των kwh ... ο τύπος επιστροφής του cost είναι μονάχα η κλιμακωτή χρέωση των kwh). Αυτό πρέπει να είναι πιο σωστό... > #include <stdio.h> #define MAGIC 68.4 /* 43.2 + 25.2 = 800 * .054 + 400 * .63 */ /* ----------------------------------------------------------------- */ float cost( const int kwh, const int m2, float *dsc ) { float ret = .0; int diff = kwh - 1200; /* net cost of kwh */ ret = diff > 0 ? MAGIC + diff * .071 : (diff > -399 ? MAGIC + diff * .063 : (kwh > 0 ? kwh * .054 : 0)); *dsc = *dsc/100.0 * ret; /* dsc over net cost */ ret += m2 * .05; /* net + ert */ return ret += ret * .13; /* net + ert + fpa */ } /* ----------------------------------------------------------------- */ int main( void ) { int kwh = 0, m2 = 0; float before = .0, dsc = .0; printf("Give data in one line (kwh m2 discount): "); scanf("%d %d %f", &kwh, &m2, &dsc); printf("Before discount: %f\n", before = cost( kwh, m2, &dsc ) ); printf("After discount: %f\n", before - dsc ); return 0; } Επειδή στη C δεν μπορείς να υπερφορτώσεις, χρησιμοποιώ την dsc ως by-reference όρισμα στην cost(). Για την εξήγηση, δεν είναι τίποτα φοβερό: το MAGIC είναι η σούμα της κλιμακωτής χρέωσης αν είχαμε ακριβώς 1200 kwh. To diff είναι η διαφορά των inputed kwh από τις 1200 και τα ? : είναι if-else... > /* net cost */ if ( diff > 0 ) net = MAGIC + diff * .071; else if ( diff > -399 ) net = MAGIC + diff * .063; else if (kwh > 0) net = kwh * .054; else net = 0; ΥΓ. @christos: κλιμακωτά σημαίνει αυτονόητα αυτό που είπε ο defacer.
virxen75 Δημοσ. 11 Δεκεμβρίου 2011 Δημοσ. 11 Δεκεμβρίου 2011 (επεξεργασμένο) Ρε παιδιά μισό λεπτό γιατί θα με τρελλάνετε... Εγώ πάω κόντρα στο μονόδρομο ή όλοι οι υπόλοιποι; Εγώ αυτό που καταλαβαίνω από το κλιμακωτά είναι αυτό: >float kwh; // ας υποθέσουμε ότι έχει κάποια τιμή float cost = 0; if (kwh > 1200) { cost += (kwh - 1200) * .071; kwh = 1200; } if (kwh > 800) { cost += (kwh - 800) * .063; kwh = 800; } if (kwh > 0) { cost += kwh * .054; } EDIT τώρα που το είδα καλύτερα έχεις δίκιο για το κλιμακωτα. κλιμακωτά ========== τα πρώτα 800kwh έχουν τιμή 0.054 τα επόμενα 400kwh (801-1200) έχουν τιμή 0.063 και τα υπόλοιπα (1201-....) έχουν τιμή 0.071 Επεξ/σία 11 Δεκεμβρίου 2011 από virxen75
Christos75 Δημοσ. 11 Δεκεμβρίου 2011 Δημοσ. 11 Δεκεμβρίου 2011 Εγώ τελικά δεν έχω καταλάβει τι επικρατεί...
Timonkaipumpa Δημοσ. 11 Δεκεμβρίου 2011 Δημοσ. 11 Δεκεμβρίου 2011 > float cost( const int kwh, const int m2, float *dsc ) Επειδή στη C δεν μπορείς να υπερφορτώσεις, χρησιμοποιώ την dsc ως by-reference όρισμα στην cost(). Και επειδή γράφεις C πιο πολύ, κατά όπως φαίνεται, δεν χρησιμοποιείς σωστά την C++ Θα έπρεπε να γίνει: > float cost( const int kwh, const int m2, float &dsc ); Έτσι ώστε ο "χρήστης" να μην περνάει κάθε φορά δείκτη στην τιμή που θέλει να περάσει στην cost() αλλά να το κάνει η γλώσσα μόνη της. Οι δύο διαφορετικές κλήσεις: > float theDsc = 300; float returnValue = cost(100, 200, &theDsc); και: > float theDsc = 300; float returnValue = cost(100, 200, theDsc); Υ.Γ. Αν και διαφωνώ, εν γένει, με την αλλαγή των τιμών σε στυλ by reference... το θεωρώ αρκετά μη αντικειμενοστρεφή.
migf1 Δημοσ. 11 Δεκεμβρίου 2011 Δημοσ. 11 Δεκεμβρίου 2011 @timon: ως C κώδικα τον παρέθεσα, όχι ως C++ (στη C δεν γίνεται αλλιώς). Να και σε Pascal... > program main( input, output ); const MAGIC = 68.4; // 43.2 + 25.2 = 800 * .054 + 400 * .63 // ------------------------------------------------------------- function cost( kwh, m2: integer; var dsc: real ) : real; var diff: integer; begin diff := kwh - 1200; if diff > 0 then // net cost of kwh cost := MAGIC + diff * 0.071 else if diff > -399 then cost := MAGIC + diff * 0.063 else if kwh > 0 then cost := kwh * 0.054 else cost := 0; dsc := dsc/100.0 * cost; // dsc over net cost cost += m2 * 0.05; // net + ert cost += cost * 0.13; // net + ert + fpa end; // ------------------------------------------------------------- var kwh: integer = 0; m2: integer = 0; before: real = 0.0; dsc: real = 0.0; begin write('Give data in one line (kwh m2 discount): '); readln( kwh, m2, dsc ); before := cost( kwh, m2, dsc ); writeln('Before discount: ', before:1:3 ); writeln('After discount: ', (before - dsc):1:3 ); readln; end. 10 ώρες έκανα να το γράψω, σχεδόν από φοιτητής είχα να πιάσω pascal EDIT: δεν ξέρω καν αν είναι standard-pascal (π.χ. το += δεν θυμάμαι αν είναι στάνταρ ή free-pascal specific).
defacer Δημοσ. 11 Δεκεμβρίου 2011 Δημοσ. 11 Δεκεμβρίου 2011 κλιμακωτά είναι και έτσι και αλλιώς είτε αυξουσα φορά είτε φθίνουσα αλλάζει μόνο ο κώδικας. Φίλε μου διάβασε τον κώδικα πιο προσεκτικά (στη δική μου version μπορεί κάλλιστα και επίτηδες να μπει και στα τρία if -- στη δική σου μόνο σε ένα). Η αν βαριέσαι, τρέξε το δικό μου ή του mig και το δικό σου για kwh = 1500 και δες το αποτέλεσμα.
imitheos Δημοσ. 11 Δεκεμβρίου 2011 Δημοσ. 11 Δεκεμβρίου 2011 > double timologio (float kwh,float tetragonika) { if (kwh<0) return 0; if (kwh<=800 ) return (0.054*kwh+0.05*tetragonika)*1.13; if (kwh<=1200) return (0.063*kwh+0.05*tetragonika)*1.13; return (0.071*kwh+0.05*tetragonika)*1.13; } >float kwh; // ας υποθέσουμε ότι έχει κάποια τιμή float cost = 0; if (kwh > 1200) { cost += (kwh - 1200) * .071; kwh = 1200; } if (kwh > 800) { cost += (kwh - 800) * .063; kwh = 800; } if (kwh > 0) { cost += kwh * .054; } Φίλε μου διάβασε τον κώδικα πιο προσεκτικά (στη δική μου version μπορεί κάλλιστα και επίτηδες να μπει και στα τρία if -- στη δική σου μόνο σε ένα). Η αν βαριέσαι, τρέξε το δικό μου ή του mig και το δικό σου για kwh = 1500 και δες το αποτέλεσμα. Και εγώ το ερμηνεύω με τον ίδιο τρόπο με τον defacer. Η τιμή δεν είναι ενιαία για όλες τις kwh αλλά από ένα σημείο και μετά πληρώνεις παραπάνω. Μάλιστα το θυμάμαι και από λογαριασμό της ΔΕΗ 1-2 φορές να μου έχει συμβεί. Αν πχ έχεις 1500 kwh που ανέφερε ο defacer, θα πληρώσεις 800 με τη χαμηλή τιμή, 400 (1200-800) με την επόμενη τιμή και 300 (15000-1200) με την ακριβότερη τιμή
nrkmaiden Δημοσ. 11 Δεκεμβρίου 2011 Δημοσ. 11 Δεκεμβρίου 2011 ωραιο με το κολπακι με το ματζικ τα αλλα ειναι αυτονοητα και επησις κλιμακωτα δηλ απο 0 μεχρι 800 κοστοσ χ απο 801 μεχρι 1200 κοστος χ+Υ πανω απο 1200 κοστος χ+Υ+ζ που κολατε με το κλιμακωτα??
Christos75 Δημοσ. 11 Δεκεμβρίου 2011 Δημοσ. 11 Δεκεμβρίου 2011 Ok, αφού είναι έτσι ο κώδικάς μου όπως και του Virxen75 δεν είναι σωστός. Παραθέτω και πάλι την δική μου λύση σε C#, συμφωνούμε όλοι;; > using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ask_insomnia { class Program { static void Main(string[] args) { // Η ερώτηση για τις κιλοβατόρες για να γίνει ο υπολογισμός Console.WriteLine("Dwse mou kilowatores (kwh):"); // Ανάγνωση και αποθήκευση της τιμής των κιλοβάτ ανά ώρα από το πληκτρολόγιο double kwh = Convert.ToDouble(Console.ReadLine()); // Η ζητούμενη ερώτηση για το πόσα τετραγωνικά είναι το εν λόγω σπίτι Console.WriteLine("Dwse mou tetragwnika toy spitiou:"); // Ανάγνωση και αποθήκευση της τιμής των τετραγωνικών από το πληκτρολόγιο double tetr_kat = Convert.ToDouble(Console.ReadLine()); Console.WriteLine("Dwse mou thn ekptwsh pou thes na kaneis:"); double ekptwsh = Convert.ToDouble(Console.ReadLine()); Console.WriteLine(); // Κενή γραμμή // Μας δίνει την τιμη για το πρώτο τιμολόγιο με την επιβάρυνση του 13% δίχως την έκπτωση Console.WriteLine(" To toimologio einai: {0} Euros ", timologio(kwh,tetr_kat)); Console.WriteLine(); // Κενή γραμμή //Μας δίνει την τελική τιμή μετά την προσθήκη του 13% και με δοθείσα έκπτωση από το πληκτρολόγιο Console.WriteLine(" To timologio meta thn ekptwsh einai: {0} Euros ", timologio(kwh,tetr_kat,ekptwsh)); Console.ReadKey(); // «Πάγωμα» παραθύρου!!! } // Η ζητούμενη συνάρτηση Τιμολόγιο public static double timologio(double kwh, double tetr_kat) { // Έλεγχος τιμών για τις κιλοβατόρες if (kwh > 0 && kwh <= 800) { kwh = kwh * 0.054; } else if (kwh > 800 && kwh <= 1200) { kwh = 800*0.054 + (kwh-800)*0.063; } else if (kwh > 1200) { kwh = 800*0.054 + 400*0.063 + (kwh -1200) * 0.071; } double ert = tetr_kat * 0.05; // Υπολογισμός της ΕΡΤ // Τελικό ποσό μετά την προσαύξηση του 13% double tel_poso = (kwh + ert) * 113 / 100; return tel_poso; } //Υπερφορτωμένη συνάρτηση timologio!!! public static double timologio(double kwh, double tetr_kat, double ekptwsh) { const double timi1 = 0.054; const double timi2 = 0.063; const double timi3 = 0.071; double timi1f = timi1 * (100 - ekptwsh) / 100; double timi2f = timi2 * (100 - ekptwsh) / 100; double timi3f = timi3 * (100 - ekptwsh) / 100; if (kwh > 0 && kwh <= 800) { kwh = kwh * timi1f; } else if (kwh > 800 && kwh <= 1200) { kwh = 800 * timi1f + (kwh - 800) * timi2f; } else if (kwh > 1200) { kwh = 800 * timi1f + 400 * timi2f + (kwh - 1200) * timi3f; } double ert = tetr_kat * 0.05; // Υπολογισμός της ΕΡΤ // Τελικό ποσό μετά την προσαύξηση του 13% double tel_poso = (kwh + ert) * 113 / 100; return tel_poso; } } } Συγγνώμη για την παρανόηση, ευθύνομαι αποκλειστικά εγώ. Αγαπητέ defacer είχες δίκιο. Δικό μου λοιπόν το λάθος στην κατανόηση της άσκησης, δεν πρόσεξα καθόλου το κλιμακωτά, εφυσηχασμένος από άλλες ασκήσεις που δίνουν παράδειγμα!!! Να ευχαριστήσω και τον συμφορουμίτη Virxen75 για τις πολύ ορθές επισημάνσεις του. Εκτιμώ ότι τώρα είμαστε εντάξει...
migf1 Δημοσ. 11 Δεκεμβρίου 2011 Δημοσ. 11 Δεκεμβρίου 2011 ωραιο με το κολπακι με το ματζικ... Βασικά είναι λίγο διαφορετικός τρόπος προσέγγισης, για αυτό και τον πόσταρα. Σε large-scale χρησιμοποιείται όταν η ταχύτητα είναι σημαντικότερη της μνήμης ή/και της ευελιξίας, οπότε "πινακοποιείς" ας το πούμε τα δεδομένα (ή σταντάρεις ενδιάμεσα αποτελέσματα) ώστε να μειώσεις τους υπολογισμούς. Για παράδειγμα, σε σύγκριση με τον στάνταρ αλγόριθμο του defacer (ο οποίος btw είναι και ο ενδεδειγμένος) με το σταντάρισμα του MAGIC μειώνεις κλιμακωτά την ανάγκη για ελέγχους if καθώς και από μια αφαίρεση + 1 ανάθεση τιμής σε κάθε έξτρα if. Στη συγκεκριμένη άσκηση είναι μικρή η κλιμάκωση, οπότε δεν αξίζει τον κόπο. Αν όμως έχεις πολύ κλιμάκωση και επίσης η ρουτίνα καλείται να τρέξει μέσα σε loop, τότε κερδίζεις ταχύτητα εκτέλεσης.
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα