2013-12-19, 21:26
  #1
Medlem
Hej, jag har en uppgift där jag ska räkna ut ett pris på ett samtal.
Samtalet kan inte gå över dygnstider. Samtalet kostar 3kr per min, om samtalet är över 30min långt läggs det på en rabatt på 15% av det totala priset och om en del eller hela samtalet ligger före 08:00 eller efter 18:30 ges 65% rabatt på min i det intervallet (alltså inte rabatt på hela samtalet).

Jag har då en funktion som räknar ut allt detta problemet är att efter jag la till 65% rabatten har jag fått helt fel samtalspris, skulle vara väldigt tacksam om någon läste igenom min kod och skriver vad som är fel. Skickar med både den felaktiga koden med 65% rabatten och den funktionella utan.


variabler: i ett samtal från 13:20 - 14:15 är h=13, h2=14, m=20 och m2=15


Kod:
Kod:
double kostnad(int min//defination
{

    
double i;
    
double const rabbK1 0.85;
    
int const prisK 3;
    
double const rabbK2 0.45;
    
double a,b,c;
    

        if (
min>30)
        {
    
            if (
h<8)
            {

                
= (8-h)*60;

                
m;
                
min - (a+b);

                if (
c>0)
                {
                    
prisK rabbK1;
                    
= (a+b) * prisK rabbK1 rabbK2;
                    
c;
                }
            
                else
                {
                    
imin prisK rabbK1 rabbK2;
                }

            }

            if  (
h2>18 || (h2=18 && 30<m2 && m2<60))
            {

            
                
= (h2-18)*60 30;
                
m2;
                
min - (a+b);



                if (
c>0)
                {

                    
prisK rabbK1;
                    
= (a+b) * prisK rabbK1 rabbK2;
                    
c;
                }
            
                else
                {
                    
min prisK rabbK1 rabbK2;
                }

    
            }


            else 
            {
            
                
min prisK rabbK1;
            }

        }
//----------------------------------------------- 
        
else
        {
            if (
h<8)
            {

                
= (8-h)*60;

                
m;
                
min - (a+b);

                if (
c>0)
                {
                    
prisK;
                    
= (a+b) * prisK rabbK2;
                    
c;
                }
            
                else
                {
                    
min prisK rabbK2;
                }

            }

            if  (
h2>18 || (h2=18 && 30<m2 && m2<60))
            {

            
                
= (h2-18)*60 30;

                
m2;
                
min - (a+b);



                if (
c>0)
                {

                    
prisK;
                    
= (a+b) * prisK rabbK2;
                    
c;
                }

                else
                {
                    
min prisK rabbK2;
                }

    
            }
            else 
            {
            
                
min prisK;
            }


    }

return 
i;


Kod utan 65% rabatt:

Kod:
double kostnad(int min//defination
{
    
double i;
    
double const rabbK1 0.85;
    
int const prisK 3;
    

        if (
min>30)
    {
    
        
min prisK rabbK1;

    }
    else
    {

        
min prisK;

    }

return 
i;

__________________
Senast redigerad av IsobelRoss 2013-12-19 kl. 21:29.
Citera
2013-12-19, 22:14
  #2
Medlem
Mitt bästa råd är att räkna om alla klockslag till minut på dagen (ex. 18:30 -> 18*60+30=1110). Ge två parametrar till din funktion; startminut och stoppminut, eller om du så vill startminut och samtalslängd. Alla jämförelser blir mycket enklare. Du kan loopa minut för minut över samtalstiden och addera alla minuters respektive kostnad innan du kollar den slutliga rabatten.
__________________
Senast redigerad av Katalysator 2013-12-19 kl. 22:18.
Citera
2013-12-19, 22:25
  #3
Medlem
Tror jag gjort en liknande uppgift för länge sen, detta var delar jag skrev då (kan såklart göras bättre, men det här är gammalt )

Kod:
start_full_min = (start_hour * 60) + start_min; //konverterar till minuter
end_full_min = (end_hour * 60) + end_min;


for (int i = start_full_min; i < end_full_min; i++) // iteration som går från startminutens position till slutminuten. 
{
	rabatt15_ticker++; // denna variabel kommer kollas upp om samtalet pågått i över 30 min (iterationen är över 30 steg)

	if (0 <= i && i < 480 || 1110 <= i && i < 1440) // räknar upp  om "i" passerar minutvärderna för 65% rabatt
	{
		rabatt65_ticker++;
	}
	else
	{
		fullprice_ticker++;
	} // räknar upp om "i" passerar minutvärderna för fulltaxa	}
}


Kod:
//----------------------------------------------------------------------------------------------------  ------------------
	// räknar ut kostnaden vid eventuellt fullpris, 65% rabatt eller båda kombinerat
	cost = (fullprice_ticker*fullpris_taxa) + ( ( rabatt65_ticker - ( rabatt65_ticker*rabatt65 ) ) * fullpris_taxa );
	//----------------------------------------------------------------------------------------------------  ------------------

	if ( rabatt15_ticker > 30 ) // kollar om det ska dras av 15 % innan momsen läggs på
	{
		cost = cost - ( cost * rabatt15 );
		cost = cost + ( cost * moms );
	}
	else
	{
		cost = cost + ( cost * moms ); // här dras ingen 15% rabatt utan endast moms läggs på
	}
__________________
Senast redigerad av PG-k 2013-12-19 kl. 22:28.
Citera
2013-12-19, 22:58
  #4
Medlem
Citat:
Ursprungligen postat av PG-k
Tror jag gjort en liknande uppgift för länge sen, detta var delar jag skrev då (kan såklart göras bättre, men det här är gammalt )

Detta hjälpte verkligen jättemycket! men jag förstår inte riktigt vad vissa funktioner i koden gör, skulle du kunna skicka resten också?
Citera
2013-12-20, 05:06
  #5
Medlem
Citat:
Ursprungligen postat av IsobelRoss
Kod:
double const rabbK2 0.45

100% - 65% = 0.35.

Ta max() av starttiden och 08:00. Ta min() av sluttiden och 18:30. Ta differensen av de två resultaten. Om den är < 0, sätt den till 0. Sen har du antalet billiga minuter. Subtrahera dem från totaltiden.

Kod:
const int cheapStart = 480; // 08:00
const int cheapStop = 1110; // 18:30

double cost(int start, int stop) {
    int nCheapMins = max(min(cheapStop, stop) - max(cheapStart, start), 0);
    ...
}
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in