Naučit se SQL Naučit se SQL
Pouze tento týden až 80% sleva na SQL jazyky
Zamiluj si programování! Až 80 % bodů na prémiový obsah zdarma. Více informací

Diskuze: pomoc pri programovaní

C a C++ C a C++ pomoc pri programovaní American English version English version

Aktivity (1)
Avatar
x12544
Člen
Avatar
x12544:24.10.2018 14:01

Dobrý chcel by som sa spýtať, či mi niekto nevie pomôcť.

#include <stdio.h>
#include <math.h>

double tyzdenna_mzda(double h_mzda, double hod)
{

  double y;
if (hod<=40)
        (y = hod*h_mzda);
if (40<hod<60)
        (y = (hod*h_mzda));
if (hod>=60)
        (y = (hod*h_mzda)+(hod*h_mzda));
return y;
}

int main()
{
  double g=0,h_mzda,hod;
int i,n;

        scanf("%d", &n);
        for (i=1;i<=n;i++)
        {
                scanf("%lf %lf", &h_mzda, &hod);
                tyzdenna_mzda(h_mzda, hod);
                printf("Hod. mzda: %.2lf Euro/hod, hodin: %.2lf, spolu: %.2lf Euro\n", h_mzda, hod, tyzdenna_mzda(h_mzda, hod));
                g=g+tyzdenna_mzda(h_mzda, hod);

        }
        printf("Celkova mzda: %.2lf Euro", g);
        return 0;
}

nefunguje mi to lebo mi nechce napísať správne hodnoty v rozmedzí 40-60 a 60>
Ďakujem.

Chci docílit: nefunguje mi to lebo mi nechce napísať správne hodnoty v rozmedzí 40-60 a 60>
Ďakujem.

 
Odpovědět 24.10.2018 14:01
Avatar
Mirek Slouka
Člen
Avatar
Odpovídá na x12544
Mirek Slouka:24.10.2018 14:31

Takže, mám pocit, že tahle konstrukce v žádném C-like jazyce nefunguje:

if (40<hod<60)

Nahradil bych ji tímhle:

if ((40 < hod) && (hod < 60))

Jinak tento kód

#include <stdio.h>
#include <math.h>

double tyzdenna_mzda(double h_mzda, double hod)
{

    double y = 0;
    if (hod<=40)
        y = hod*h_mzda;
    if ((40 < hod) && (hod < 60))
        y = (hod*h_mzda);
    if (hod>=60)
        y = (hod*h_mzda)+(hod*h_mzda);
    return y;
}

int main()
{
    double g=0,h_mzda,hod;
    int i,n;

    scanf("%d", &n);
    for (i=1;i<=n;i++)
    {
        scanf("%lf %lf", &h_mzda, &hod);
        tyzdenna_mzda(h_mzda, hod);
        printf("Hod. mzda: %.2lf Euro/hod, hodin: %.2lf, spolu: %.2lf Euro\n", h_mzda, hod, tyzdenna_mzda(h_mzda, hod));
        g=g+tyzdenna_mzda(h_mzda, hod);

    }
    printf("Celkova mzda: %.2lf Euro", g);
    return 0;
}

Vypisuje to, co by měl, podle toho co jsem zkoušel. Můžeš mi prosím napsat nějaké testovací hodnoty a očekávané výsledky?

Nahoru Odpovědět 24.10.2018 14:31
I can explain it to you, but I can't understand it for you.
Avatar
DarkCoder
Člen
Avatar
Odpovídá na x12544
DarkCoder:24.10.2018 19:05

Pár dodatků ke zlepšení:

  1. Aplikace nevykazuje použítí jakékoli funkce z knihovny math.h. Je tedy zbytečné aby byla tato knihovna do programu vkládána.
  2. Je dobré do programu vkládat prototypy funkcí. Smyslem prototypů je zajištění správného volání funkce. Dále mnohem větší přehled o funkci. Při přechodu k C++ jsou prototypy funkcí vyžadovány.
  3. Pokud funkce nepřebírá argument, používej klíčové slovo void v místě pro seznam parametrů.
  4. Ve funkci tyzdenna_mzda() je alokace lokální proměnné zbytečná, hodnota se dá funkci vracet přímo prostřednictvím výrazu. Dále pro peněžní výpočty používej celá čísla nikoli desetinná. Pokud ve funkci nic nechybí je možno části spojit a výrazy optimalizovat. Namísto několika if používat řídící příkaz if-else.
  5. Pro vyjádření proměnných vhodně volit srozumitelnější jména proměnných (např. celk_vydaje namisto g apod.).
  6. Zajistit uživatelsky přátelské rozhraní. Doplnit výzvy k načítacím funkcím.
  7. Volaná funkce tyzdenna_mzda() ve for cyklu nemá žádný význam, pokud nevrací hodnotu.
  8. Pro výpis hodnot typu double se používá specifikátor formátu %f nikoli %lf. Specifikátor formátu %lf se pro typ double používá pouze u funkce scanf().
  9. Je vysoce neefektivní volat funkci několikrát za sebou pokud se její vstupy nemění. Lepší je si deklarovat pomocnou proměnnou, kterou při výpočtech používat.
  10. Výraz typu g = g + x lze napsat kompaktně jako g+=x;

Zde pak jsou výše uvedené dodatky začleněny do programu:

#include <stdio.h>

int vypocet_mzdy(int h_mzda, int hod);

int main(void){
        int i, hod_mzda, zam_mzda, odprac_hod, pocet_zam;
        int celkove_vydaje = 0;

        printf("Zadej pocet zamestnancu: ");
        scanf("%d", &pocet_zam);
        for (i = 1; i <= pocet_zam; i++){
                printf("\nZadej hodinovou mzdu a pocet odpracovanych hodin %d. zamestnance: ", i);
                scanf("%d %d", &hod_mzda, &odprac_hod);
                zam_mzda = vypocet_mzdy(hod_mzda, odprac_hod);
                printf("Hod. mzda: %d Euro/hod, hodin: %d, Mzda: %d Euro\n", hod_mzda, odprac_hod, zam_mzda);
                celkove_vydaje += zam_mzda;
        }
        printf("\nCelkove vydaje na platy: %d Euro", celkove_vydaje);

        return 0;
}

int vypocet_mzdy(int h_mzda, int hod) {
        if (hod < 60) return (hod * h_mzda);
        else return (2 * hod * h_mzda);
}
Nahoru Odpovědět  +1 24.10.2018 19:05
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
patrik.valkovic
Šéfredaktor
Avatar
Odpovídá na DarkCoder
patrik.valkovic:24.10.2018 19:26

Uvedené body jsou sice hezké, ale k ničemu nepomůžou když má program elementární chyby jako že neověřuje, že byly hodnoty skutečně přečteny.

Nahoru Odpovědět 24.10.2018 19:26
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
x12544
Člen
Avatar
Odpovídá na Mirek Slouka
x12544:24.10.2018 19:56

3
20 38
22 48
24 68

tuto sú vstupy a vystúp má vyzerať takto.

Hod. mzda: 20.00 Euro/hod, hodin: 38.00, spolu: 760.00 Euro
Hod. mzda: 22.00 Euro/hod, hodin: 48.00, spolu: 1144.00 Euro
Hod. mzda: 24.00 Euro/hod, hodin: 68.00, spolu: 2064.00 Euro
Celkova mzda: 3968.00 Euro

 
Nahoru Odpovědět 24.10.2018 19:56
Avatar
Mirek Slouka
Člen
Avatar
Odpovídá na x12544
Mirek Slouka:24.10.2018 20:09

Když se budeme zabývat jen funkčností toho programu, tak ty hodnoty co program vypisuje jsou správné vzhledem k tomu, jakým způsobem to počítáš ve funkci tyzdenna_mzda. Vzorec pro výpočet mzdy pod 40 hodin je stejný jako pro výpočet mzdy mezi 40 a 59 hodinami, mezitím nad 60 v podstatě děláš to, že je to (mzda + hodiny) * 2. Nevím jakým stylem jsi se dobral k tvým očekávaným výsledkům, takže ti s tím nemůžu poradit.

Taky je dobré psát kód smysluplně a znovupoužitelně, tak jak napsal pár komentářů nahoru DarkCoder.

Editováno 24.10.2018 20:10
Nahoru Odpovědět 24.10.2018 20:09
I can explain it to you, but I can't understand it for you.
Avatar
x12544
Člen
Avatar
Odpovídá na Mirek Slouka
x12544:24.10.2018 20:36

ďakujem všetkým za pomoc. Cením si to .

 
Nahoru Odpovědět 24.10.2018 20:36
Avatar
Odpovídá na x12544
Matúš Olejník:24.10.2018 20:47

Napíš k tým vstupom a výstupom aj vzorec akým si to dostal :)

Nahoru Odpovědět 24.10.2018 20:47
/* I am not sure why this works but it fixes the problem */
Avatar
x12544
Člen
Avatar
Odpovídá na Matúš Olejník
x12544:24.10.2018 21:10

To sme mali ako zadanie na cvikách

Napíšte program, ktorý v prvom riadku načíta celé číslo n predstavujúce počet vstupov. Potom zo vstupu prečíta n riadkov, každý obsahujúci dvojicu reálnych čísel: hodinovú mzdu a počet odpracovaných hodín za týždeň. Dvojica reálnych čísel je na vstupe oddelená vždy jednou medzerou a ukončená znakom konca riadku. Pre každú dvojicu čísel program zavolá funkciu double tyzdenna_mzda(dou­ble h_mzda, double hod), ktorá vráti mzdu za týždeň. Pre každú z n dvojíc vypíše program jeden riadok ukončený znakom konca riadku a obsahujúci správu Hod. mzda: m Euro/hod, hodin: h, spolu: s Euro, kde m je hodinová mzda, h je počet odpracovaných hodín a s je celková mzda za týždeň.

Výpočet mzdy za týždeň sa vykoná takto: do 40 odpracovaných hodín sa vyplatí základná hodinová mzda, za hodiny medzi 40 a 60 sa vyplatí jedenapolnásobok hodinovej mzdy a za hodiny nad 60 sa vyplatí dvojnásobok hodinovej mzdy. Na konci program vypíše správu Celkova mzda: c Euro, kde c je celková suma, ktorá sa má vyplatiť pre všetkých n dvojíc. Správa je ukončená znakom konca riadku. Všetky čísla na výstupe sú vypísané na 2 desatinné miesta. Použite konštanty, čím sa vyhnete používaniu "magických" čísel.

Ukážka vstupu:
3
20 38
22 48
24 68
Výstup pre ukážkový vstup:
Hod. mzda: 20.00 Euro/hod, hodin: 38.00, spolu: 760.00 Euro
Hod. mzda: 22.00 Euro/hod, hodin: 48.00, spolu: 1144.00 Euro
Hod. mzda: 24.00 Euro/hod, hodin: 68.00, spolu: 2064.00 Euro
Celkova mzda: 3968.00 Euro

 
Nahoru Odpovědět 24.10.2018 21:10
Avatar
Odpovídá na x12544
Matúš Olejník:24.10.2018 22:28

Keby si to napísal hneď, už dávno si tu mohol mať riešenie :D . Skús toto (názvy tých konštánt sa mi veľmi nechceli vymýšľať :D)

#include <stdio.h>
#include <stdlib.h>

//TODO - lepsie nazvy
#define MAX_HOURS_1 40
#define MAX_HOURS_2 60

#define BONUS_1 1
#define BONUS_2 1.5
#define BONUS_3 2

double tyzdenna_mzda(double h_mzda, double hod) {
    double result = 0;

    if (hod > MAX_HOURS_2) {
        result += (hod - MAX_HOURS_2) * h_mzda * BONUS_3;
        hod -= (hod - MAX_HOURS_2);
    }

    if (hod > MAX_HOURS_1) {
        result += (hod - MAX_HOURS_1) * h_mzda * BONUS_2;
        hod -= (hod - MAX_HOURS_1);
    }

    result += hod * h_mzda * BONUS_1;

    return result;
}

int main() {
    double h_mzda, hod;
    double totalSalary = 0, tmp = 0;
    int i, n;

    scanf("%d", &n);
    for (i = 0; i < n; i++)     {
        scanf("%lf %lf", &h_mzda, &hod);
        tmp = tyzdenna_mzda(h_mzda, hod);
        printf("Hod. mzda: %.2f Euro/hod, hodin: %.2f, spolu: %.2f Euro\n", h_mzda, hod, tmp);
        totalSalary += tmp;
    }

    printf("Celkova mzda: %.2f Euro", totalSalary);

    //TODO remove
    getchar();
    getchar();

    return 0;
}
Nahoru Odpovědět  +1 24.10.2018 22:28
/* I am not sure why this works but it fixes the problem */
Avatar
x12544
Člen
Avatar
x12544:25.10.2018 10:31

ĎAKUJEM 8-) toto je super :D síce nerozumiem niektorým veciam ale pokúsim sa to dáko pochopiť.

 
Nahoru Odpovědět 25.10.2018 10:31
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.