Προς το περιεχόμενο

C++ Ας να με βοηθήσει κάποιος


giorgos paok

Προτεινόμενες αναρτήσεις

ελα εξηγησε το λιγο εε εεε φανταστικε migf1 :-D B)

Να ήταν και σωστό κιόλας :lol: (ούτε 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.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • Απαντ. 69
  • Δημ.
  • Τελ. απάντηση

Συχνή συμμετοχή στο θέμα

Συχνή συμμετοχή στο θέμα

Δημοσ. (επεξεργασμένο)

Ρε παιδιά μισό λεπτό γιατί θα με τρελλάνετε... Εγώ πάω κόντρα στο μονόδρομο ή όλοι οι υπόλοιποι;

 

Εγώ αυτό που καταλαβαίνω από το κλιμακωτά είναι αυτό:

 

>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

Επεξ/σία από virxen75
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

>
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... το θεωρώ αρκετά μη αντικειμενοστρεφή.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@timon: ως C κώδικα τον παρέθεσα, όχι ως C++ (στη C δεν γίνεται αλλιώς).

 

Να και σε Pascal... :lol:

 

>
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 :P

 

EDIT: δεν ξέρω καν αν είναι standard-pascal (π.χ. το += δεν θυμάμαι αν είναι στάνταρ ή free-pascal specific).

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

κλιμακωτά είναι και έτσι και αλλιώς

είτε αυξουσα φορά είτε φθίνουσα αλλάζει μόνο ο κώδικας.

 

Φίλε μου διάβασε τον κώδικα πιο προσεκτικά (στη δική μου version μπορεί κάλλιστα και επίτηδες να μπει και στα τρία if -- στη δική σου μόνο σε ένα). Η αν βαριέσαι, τρέξε το δικό μου ή του mig και το δικό σου για kwh = 1500 και δες το αποτέλεσμα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

>
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) με την ακριβότερη τιμή

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ωραιο με το κολπακι με το ματζικ τα αλλα ειναι αυτονοητα και επησις κλιμακωτα δηλ

 

απο 0 μεχρι 800

κοστοσ χ

απο 801 μεχρι 1200

κοστος χ+Υ

πανω απο 1200

κοστος χ+Υ+ζ

 

που κολατε με το κλιμακωτα??

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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 για τις πολύ ορθές επισημάνσεις του. Εκτιμώ ότι τώρα είμαστε εντάξει...

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ωραιο με το κολπακι με το ματζικ...

Βασικά είναι λίγο διαφορετικός τρόπος προσέγγισης, για αυτό και τον πόσταρα. Σε large-scale χρησιμοποιείται όταν η ταχύτητα είναι σημαντικότερη της μνήμης ή/και της ευελιξίας, οπότε "πινακοποιείς" ας το πούμε τα δεδομένα (ή σταντάρεις ενδιάμεσα αποτελέσματα) ώστε να μειώσεις τους υπολογισμούς.

 

Για παράδειγμα, σε σύγκριση με τον στάνταρ αλγόριθμο του defacer (ο οποίος btw είναι και ο ενδεδειγμένος) με το σταντάρισμα του MAGIC μειώνεις κλιμακωτά την ανάγκη για ελέγχους if καθώς και από μια αφαίρεση + 1 ανάθεση τιμής σε κάθε έξτρα if. Στη συγκεκριμένη άσκηση είναι μικρή η κλιμάκωση, οπότε δεν αξίζει τον κόπο. Αν όμως έχεις πολύ κλιμάκωση και επίσης η ρουτίνα καλείται να τρέξει μέσα σε loop, τότε κερδίζεις ταχύτητα εκτέλεσης.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα

  • Δημιουργία νέου...