Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 10. 11. 2013 23:34

vasek.t
Zelenáč
Příspěvky: 12
Reputace:   
 

špatné výstupy

zdravím Vás, prosím o radu s chybou v programu, mám daňovou kalkulačku, všechny části mi vychází dobře až na výsledek Souhrna vypoctena dan za uplynuly rok a Prumerny cisty mesicni prijem za uplynuly rok u části kdy je příjem za rok větší než 12*40000(ve zdrojáku ta poslední) . U těchto výstupů jsou jiné výsledky než by měly být. Prosím o radu. díky

Code:

  double prijemZaRok = 12*prijem;
        double danZaklad = 12*prijem-krev*4000;
        double danZaklad1 = 12*20000-krev*4000;
        double danZakladNad20 = (prijemZaRok-12*20000)-krev*4000;
        double danZakladNad40 = (prijemZaRok-12*40000)-krev*4000;
        if (danZaklad < 0) danZaklad = 0;
       
        double mzda ;
        double mzdaDo20;
        double mzdaNad20;
        double mzda2040;
        double mzdaNad40;
        double mzdaCelkNad40;
        double  mzdaNad20000;
        double mzdaDo20000;
        if (prijemZaRok <= 12*20000)
        { mzda =  prijem-(((danZaklad/100)*15)/12);
        double vypoctenaDan = (danZaklad/100)*15;
        System.out.println("---Vysledky---");
            System.out.println("Celkovy zaklad dane za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad);
            System.out.println("Souhrna vypoctena dan za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDan );
           System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) mzda );
                
        
        }
        else if (prijemZaRok>12*20000 || prijemZaRok<=40000){
            mzdaDo20 = 20000 -(((danZaklad1/100)*15)/12);
            mzdaNad20 = (prijem-20000)-(((danZakladNad20/100)*25)/12);
            mzda2040 = mzdaDo20+mzdaNad20;
            double danZaklad2040 = danZaklad1+danZakladNad20;
            double vypoctenaDan2040 = ((danZaklad1/100)*15)+((danZakladNad20/100)*25);         
            System.out.println("---Vysledky---");
            System.out.println("Celkovy zaklad dane za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad2040 );
            System.out.println("Souhrna vypoctena dan za uplynuly rok:");
           System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDan2040 );
            System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) mzda2040 );
            
        } 
        else if (prijemZaRok>12*40000){
        mzdaDo20000 = 20000 -(((danZaklad1/100)*15)/12);
            mzdaNad20000 = (prijem-20000)-(((danZakladNad20/100)*25)/12);
            mzdaNad40 = (prijem-40000)-(((danZakladNad40/100)*35)/12);
            mzdaCelkNad40 = mzdaDo20000+mzdaNad20000+mzdaNad40;
            double danZaklad40 = danZaklad1+danZakladNad20+danZakladNad40;
            double vypoctenaDanNad40 = ((danZaklad1/100)*15)+((danZakladNad20/100)*25)+((danZakladNad40/100)*35);
            System.out.println("---Vysledky---");
            System.out.println("Celkovy zaklad dane za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad40);
            System.out.println("Souhrna vypoctena dan za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDanNad40);
            System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) mzdaCelkNad40 );
        
    }
            
        
        
        
        // TODO code application logic here
    }
    
}

Offline

 

#2 11. 11. 2013 07:23

Honzc
Příspěvky: 4647
Reputace:   248 
 

Re: špatné výstupy

↑ vasek.t:
C nebo v čem to je neznám, ale řekl bych, (jestli jsem dobře pochopil ta pásma,tj. 0<p1<=12*20000, 12*20000<p2<=12*40000, p3>12*40000) že za tím prvním else máš špatně else if (prijemZaRok>12*20000 || prijemZaRok<=40000), mělo by být
else if ( prijemZaRok<=12*40000)
a u druhého else už tu podmínku else if (prijemZaRok>12*40000) nemusíš opakovat, ale stačí
else {
        mzdaDo20000 = 20000 -(((danZaklad1/100)*15)/12);
        .
        .
Tedy

Code:

 double prijemZaRok = 12*prijem;
        double danZaklad = 12*prijem-krev*4000;
        double danZaklad1 = 12*20000-krev*4000;
        double danZakladNad20 = (prijemZaRok-12*20000)-krev*4000;
        double danZakladNad40 = (prijemZaRok-12*40000)-krev*4000;
        if (danZaklad < 0) danZaklad = 0;
       
        double mzda ;
        double mzdaDo20;
        double mzdaNad20;
        double mzda2040;
        double mzdaNad40;
        double mzdaCelkNad40;
        double  mzdaNad20000;
        double mzdaDo20000;
        if (prijemZaRok <= 12*20000)
        { mzda =  prijem-(((danZaklad/100)*15)/12);
        double vypoctenaDan = (danZaklad/100)*15;
        System.out.println("---Vysledky---");
            System.out.println("Celkovy zaklad dane za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad);
            System.out.println("Souhrna vypoctena dan za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDan );
           System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) mzda );
                
        
        }
        else if (prijemZaRok<=12*40000){
            mzdaDo20 = 20000 -(((danZaklad1/100)*15)/12);
            mzdaNad20 = (prijem-20000)-(((danZakladNad20/100)*25)/12);
            mzda2040 = mzdaDo20+mzdaNad20;
            double danZaklad2040 = danZaklad1+danZakladNad20;
            double vypoctenaDan2040 = ((danZaklad1/100)*15)+((danZakladNad20/100)*25);         
            System.out.println("---Vysledky---");
            System.out.println("Celkovy zaklad dane za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad2040 );
            System.out.println("Souhrna vypoctena dan za uplynuly rok:");
           System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDan2040 );
            System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) mzda2040 );
            
        } 
        else {
        mzdaDo20000 = 20000 -(((danZaklad1/100)*15)/12);
            mzdaNad20000 = (prijem-20000)-(((danZakladNad20/100)*25)/12);
            mzdaNad40 = (prijem-40000)-(((danZakladNad40/100)*35)/12);
            mzdaCelkNad40 = mzdaDo20000+mzdaNad20000+mzdaNad40;
            double danZaklad40 = danZaklad1+danZakladNad20+danZakladNad40;
            double vypoctenaDanNad40 = ((danZaklad1/100)*15)+((danZakladNad20/100)*25)+((danZakladNad40/100)*35);
            System.out.println("---Vysledky---");
            System.out.println("Celkovy zaklad dane za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad40);
            System.out.println("Souhrna vypoctena dan za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDanNad40);
            System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) mzdaCelkNad40 );
        
    }
            
        
        
        
        // TODO code application logic here
    }
    
}

Offline

 

#3 11. 11. 2013 09:03

vasek.t
Zelenáč
Příspěvky: 12
Reputace:   
 

Re: špatné výstupy

Ahoj dík za odpověď, bohužel to tim není, když jsem to tak upravil tak to rozhodilo výsledky i u té daně mezi 20-40 tisíci. ↑ Honzc:

Offline

 

#4 11. 11. 2013 11:30 — Editoval Honzc (11. 11. 2013 12:42)

Honzc
Příspěvky: 4647
Reputace:   248 
 

Re: špatné výstupy

↑ vasek.t:
Já jsem nekontroloval to jak to máš vypočítané, ale pouze ty podmínky.
Napiš prosím tě jek se ta daň počítá.
Mně se zdá, že ti v tom dělá zmatek ta krev.
Já osobně bych nejdříve spočítal: danZakl = prijemZaRok-krev*4000;

Tu podmínku if (danZaklad < 0) danZaklad = 0; tam můžeš nechat

Pak bych posuzoval danZaklad

Code:

double prijemZaRok = 12*prijem;
double danZaklad = prijemZaRok-krev*4000;

if (danZaklad < 0)
  danZaklad = 0;
if (danZaklad<=240000)
   {danZaklad1 = danZaklad;
    danZakladNad20 = 0;
    danZakladNad40 = 0;
   }
else 
  if (danZaklad<=480000)
     {danZaklad1 = 240000;
      danZakladNad20 = danZaklad-240000;
      danZakladNad40 = 0;  
     } 
   else
     {danZaklad1 = 240000;
      danZakladNad20 = 240000;
      danZakladNad40 = danZaklad-480000;  
     } 
double vypoctenaDan = (danZaklad1*15+danZakladNad20*25+danZakladNad40*35)/100;
double mzdaCelk = prijem - vypoctenaDan/12;
System.out.println("---Vysledky---");
System.out.println("Celkovy zaklad dane za uplynuly rok:");
System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad);
System.out.println("Souhrna vypoctena dan za uplynuly rok:");
System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDan);
System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
System.out.printf(Locale.US, "%20.2f%n", (double) mzdaCelk );

Offline

 

#5 11. 11. 2013 17:40

vasek.t
Zelenáč
Příspěvky: 12
Reputace:   
 

Re: špatné výstupy

tady je zadání Vytvořte program, který z údajů za uplynulý rok spočte daň. Ve virtualní zemi Bohemland je uzákoněno progresivní danění příjmů. Jedinou odečitatelnou položkou je bezúplatné darování krve nebo krevních derivátů (max. 12 za rok).
o    daň nemůže být záporná
o    výpočet se provádí tak, že se sečtou příjmy za uplynulý rok a od této sumy se odečte daňová úleva (pdk * 4000)
o    tím vznikne daňový základ - ten se pak progresivně daní
o    z částky do (12 * 20 000) je sazba 15 %,
o    z částky do (12 * 40 000) je sazba 25 %,
o    z částky nad (12 * 40 000) je sazba 35 %
o    daň se nemůže měnit skokově, tj. např. u hrubého platu 22 000 bez úlev se 25 % platí jen z částky 12 * 2 000 a ze zbývajících 12 * 20 000 se platí jen 15 %
o    po rozpočítání daně na jednotlivé měsíce a odečtení od průměrné hrubé mzdy obdržíte průměrný čistý příjem
↑ Honzc:

máš pravdu, že tam dělá bordel ta krev tohle teď mám tak zkusím ty tvoje úpravy

Code:

  double prijemZaRok = 12*prijem;
        double danZaklad = 12*prijem-krev*4000;
        double danZaklad1 = 12*20000-krev*4000;
        double danZakladNad40 = (prijemZaRok-12*40000)-krev*4000;
        double danZakladNad20 = (prijemZaRok-12*20000)-danZakladNad40-krev*4000;
       double danZakladNad20000 = (prijemZaRok-12*20000)-krev*4000;
        
        
        if (danZaklad < 0) danZaklad = 0;
       if (danZaklad1 < 0) danZaklad1 = 0;
       if (danZakladNad20 < 0) danZakladNad20 = 0;
               if (danZakladNad40 < 0) danZakladNad40 = 0;
               if (danZakladNad20000 < 0) danZakladNad20000 = 0;
        double mzda ;
        double mzdaDo20;
        double mzdaNad20;
        double mzda2040;
        double mzdaNad40;
        double mzdaCelkNad40;
        double  mzdaNad20000;
        double mzdaDo20000;
        if (prijemZaRok <= 12*20000)
        {System.out.println("pod20");
            mzda =  prijem-(((danZaklad/100)*15)/12);
        double vypoctenaDan = (danZaklad/100)*15;
        System.out.println("---Vysledky---");
            System.out.println("Celkovy zaklad dane za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad);
            System.out.println("Souhrna vypoctena dan za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDan );
           System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) mzda );
                
        
        }
        else{ if (prijemZaRok>12*20000 && prijemZaRok<=12*40000){System.out.println("nad20");
            mzdaDo20 = 20000 -(((danZaklad1/100)*15)/12);
            mzdaNad20 = (prijem-20000)-(((danZakladNad20000/100)*25)/12);
            mzda2040 = mzdaDo20+mzdaNad20;
            double danZaklad2040 = danZaklad1+danZakladNad20000;
            double vypoctenaDan2040 = ((danZaklad1/100)*15)+((danZakladNad20000/100)*25);        
            System.out.println("---Vysledky---");
            System.out.println("Celkovy zaklad dane za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad2040 );
            System.out.println("Souhrna vypoctena dan za uplynuly rok:");
           System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDan2040 );
            System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) mzda2040 );
            
        } 
        else  {System.out.println("nad40");
            mzdaDo20 = 20000 -(((danZaklad1/100)*15)/12);
            mzdaNad20000 = 20000-(((danZakladNad20/100)*25)/12);
            mzdaNad40 = (prijem-40000)-(((danZakladNad40/100)*35)/12);
            mzdaCelkNad40 = mzdaDo20+mzdaNad20000+mzdaNad40;
            double danZaklad40 = danZaklad1+danZakladNad20+danZakladNad40;
            
            double vypoctenaDanNad40 = ((danZakladNad20/100)*25)+((danZaklad1/100)*15)+((danZakladNad40/100)*35);
            System.out.println((danZaklad1/100)*15);
            System.out.println((danZakladNad20/100)*25);
            System.out.println((danZakladNad40/100)*35);
            System.out.println("---Vysledky---");
            System.out.println("Celkovy zaklad dane za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad40);
            System.out.println("Souhrna vypoctena dan za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDanNad40);
            System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
            System.out.printf(Locale.US, "%20.2f%n", (double) mzdaCelkNad40 );
        
    }
            
        
        
        }    
        
    }
    
}

Offline

 

#6 11. 11. 2013 18:02

vasek.t
Zelenáč
Příspěvky: 12
Reputace:   
 

Re: špatné výstupy

když jsem vzal tvůj kód tak to pořád háže špatné výsledky, u všech tří částí to dává dobré výsledky když nezadávím krev, u části do 20000 příjmu to jde i s krví a začne to blbnout když zadám 29000 plat a 5xdarování krve ↑ vasek.t:

Code:

        double prijemZaRok = 12*prijem;
double danZaklad = prijemZaRok-krev*4000;
double danZaklad1;
double danZakladNad20;
double danZakladNad40;
if (danZaklad < 0)
  danZaklad = 0;
if (danZaklad<=240000)
   {danZaklad1 = danZaklad;
    danZakladNad20 = 0;
    danZakladNad40 = 0;
   }
else 
  if (danZaklad<=480000)
     {danZaklad1 = 240000;
      danZakladNad20 = danZaklad-240000;
      danZakladNad40 = 0;  
     } 
   else
     {danZaklad1 = 240000;
      danZakladNad20 = 240000;
      danZakladNad40 = danZaklad-480000;  
     } 
double vypoctenaDan = (danZaklad1*15+danZakladNad20*25+danZakladNad40*35)/100;
double mzdaCelk = prijem - vypoctenaDan/12;
System.out.println("---Vysledky---");
System.out.println("Celkovy zaklad dane za uplynuly rok:");
System.out.printf(Locale.US, "%20.2f%n", (double) danZaklad);
System.out.println("Souhrna vypoctena dan za uplynuly rok:");
System.out.printf(Locale.US, "%20.2f%n", (double) vypoctenaDan);
System.out.println("Prumerny cisty mesicni prijem za uplynuly rok:");
System.out.printf(Locale.US, "%20.2f%n", (double) mzdaCelk );
        // TODO code application logic here
    }
    
}

Offline

 

#7 12. 11. 2013 07:03

Honzc
Příspěvky: 4647
Reputace:   248 
 

Re: špatné výstupy

↑ vasek.t:
Podle čeho usuzuješ, že je nějaký výsledek špatně nebo dobře?
(Máš k tomu nějaké tabulky nebo něco jiného)
Nevím proč by to mělo házet špatné výsledky pro prijem 29000 a 5xkrev.
Projdeme si jak to řeší program, který jsem ti napsal.
Tedy máme: prijem=29000 krev=5

o    výpočet se provádí tak, že se sečtou příjmy za uplynulý rok a od této sumy se odečte daňová úleva (pdk * 4000) 
o    tím vznikne daňový základ - ten se pak progresivně daní
   pro nás danZaklad = 12*29000-5*4000 (=328000)
o    z částky do (12 * 20 000) je sazba 15 %, (12*20000=240000)
o    z částky do (12 * 40 000) je sazba 25 %, (12*40000=480000)
o    z částky nad (12 * 40 000) je sazba 35 % (>480000)
o    daň se nemůže měnit skokově, tj. např. u hrubého platu 22 000 bez úlev se 25 % platí jen z částky 12 * 2 000(=24000) a ze zbývajících 12 * 20 000 (=240000) se platí jen 15 %

Jdeme po rozhodování
danZaklad =328000 ten je větší než než 240000 ale menší než 480000.
jsme tedy v této větvi:
else
  if (danZaklad<=480000)
     {danZaklad1 = 240000;
      danZakladNad20 = danZaklad-240000;
      danZakladNad40 = 0; 
     }
a máme:
danZaklad1 = 240000
danZakladNad20 = 328000-240000 = 88000
danZakladNad40 = 0

vypoctenaDan = (danZaklad1*15+danZakladNad20*25+danZakladNad40*35)/100=
                         (240000*15+88000*25+0*35)/100=58000

o    po rozpočítání daně na jednotlivé měsíce a odečtení od průměrné hrubé mzdy obdržíte průměrný čistý příjem

mzdaCelk = prijem - vypoctenaDan/12=29000-58000/12=24166.67

Jsem přesvědčen, že program počítá přesně tak, jak jsou zadány podmínky výpočtu.

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson