Diskuze: pomoc pri programovaní
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 11 zpráv z 11.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
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?
Pár dodatků ke zlepšení:
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);
}
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.
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
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.
Napíš k tým vstupom a výstupom aj vzorec akým si to dostal
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(double 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
Keby si to napísal hneď, už dávno si tu mohol mať riešenie . Skús toto (názvy tých
konštánt sa mi veľmi nechceli vymýšľať
)
#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;
}
Zobrazeno 11 zpráv z 11.