Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem programování v C - pomoc s nalezením chyby v programu

Dobrý den,

prosím vás, mohli by jste se mrknout na následující zdrojový kód a pomoci mně tak najít chybu?

Program má za úkol načíst číslo po znacích (počet sekund) a vypsat kolik je to dnů, hodin, minut a sekund.
Překladač (gcc) nehlásí žádnou chybu.

Zajímavé je, že na stolním pc (ubuntu 11.10) program po překladu nepracuje jak má, např při vstupu 654321 mi program napíše, že vstup byl 25606129.
Ale na jiném pc (fedora 15) po přeložení toho samého zdrojáku, pracuje program jak má.

Program jsem psal ve Vimu a překládal pomocí gcc

#include <stdio.h>

int main()
{
  int vstup;
  int pocet_sek;
  int den;
  int hod;
  int pom;
  int min;

    printf("Zadej pocet sekund:\n");

    while ((vstup = getchar()) >= '0' && vstup <= '9'){
      pocet_sek = pocet_sek * 10 + (vstup - '0');
    }
    printf("Zadali jste: %d sekund\n", pocet_sek);

    den = pocet_sek / 86400;
      if (den == 0){
         pom = pocet_sek % 86400;
      }
      else{
         pom = pocet_sek % (den * 86400);
      }

    hod = pom / 3600;
      if (hod == 0){
         pom = pom % 3600;
      }
      else{
         pom = pom % (hod * 3600);
      }
    min = pom / 60;
      if (min ==0){
         pom = pom % 60;
      }
      else{
         pom = pom % (min * 60);
      }

    printf("%d den, %d hodiny, %d minuty, %d sekundy, %d vas vstup \n", den, hod, min, pom, pocet_sek);

return 0;
}

Změna předmětu, původně: programování v C (host) (los)

Předmět Autor Datum
No určitě ti tam na začátku chybí: pocet_sek = 0;
Wikan 19.10.2011 18:26
Wikan
děkuju moc po doplnění pocet_sek = 0; program začal pracovat jak má, ale jak je tedy možné, že na d…
Luk 19.10.2011 18:29
Luk
OMG lebo NAHODOU bolo pred spustenim programu na tom mieste v pamati 0.
MM.. 19.10.2011 18:30
MM..
To nastavení na 0 za tebe udělal překladač. Ale počítat s tím nemůžeš, tohle by sis měl ošetřovat sá…
Wikan 19.10.2011 18:30
Wikan
alebo tak (je to teoreticky mozne, aj ked C prekladace to tusim zvycajne nerobia, ale neviem jaky pr…
MM.. 19.10.2011 18:32
MM..
neinicializujes premennu a pouzivas ju. pocet_sek = pocet_sek * 10 + (vstup - '0'); je najprv pouzit…
MM.. 19.10.2011 18:30
MM..
Pochopil jsem. Po druhé už stejnou chybu neudělám.
Luk 19.10.2011 18:33
Luk
udelas, ptz to je dost bezna chyba :) Ja osobne sa snazim uz ked pisem to pocet_sek = pocet_sek * ta… poslední
MM.. 19.10.2011 18:41
MM..
BTW. pre buducnst - kazde vyvojove prostredie ma debugger.
MM.. 19.10.2011 18:31
MM..

neinicializujes premennu a pouzivas ju. pocet_sek = pocet_sek * 10 + (vstup - '0'); je najprv pouzitie premennej pocet_sek az potom priradenie.
Keby som bol docent a urobil by mi to niekto na skuske tak by letel vmomente von aj keby mu program "nahodou" fungoval. Pretoze kvoli takym veciam (a lebo programuju uz aj cinski kuchari-casnici) je vsetok SW na svete totalna sracka.

udelas, ptz to je dost bezna chyba :) Ja osobne sa snazim uz ked pisem to
pocet_sek = pocet_sek * tak presne v tomto momente sa zastavim a skontrolujem ci ma v kazdom priapde pocet_sek nejaku hodnotu, ak nie tak hend aj pridam inicializaciu a az tak pokracujem dalej s pisanim toho riadku, asi som paranoid :D Ale zato moj SW zvycajne funguje.

Inac tvoj vypocet je nezmyselny a podla mna aj nespravny. Normalne matematicky a logicky je to takto, ak sa nemylim:

den = pocet_sek / 86400;
pom = pocet_sek % 86400;
hod = pom / 3600;
pom %= 3600;
min = pom / 60;
pom %= 60;

to je cele.
A este v tom uvodnom cykle by si mal pred nasobenim 10 urobit test na maximalnu hodnotu unsigned int (porovnat s UINT_MAX/10) pretoze ked ti to pretecie (user zada viac jak 4miliardy) tak tam budes mat tiez nezmysly. A pouzivat unsigned int, nie klasicke int (potom aj v printf pouzit %u)

Zpět do poradny Odpovědět na původní otázku Nahoru