[ Príspevkov: 8 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 22.10.12
Prihlásený: 21.10.15
Príspevky: 18
Témy: 5 | 5
NapísalOffline : 27.10.2012 12:34 | Fonkcia pow

Dobrý deň, mám taký malý problém. Prečo funkcia "pow" pri umocňovaní na párnu
hodnotu odráta automaticky jedničku? Ale robí to až v tom druhom ciže d=d*pow(10,j);
V iných programoch mi to funguje ale zrovna v tomto mi to odráta tú jednotku od toho čísla automaticky. Tu je ten cyklus:
Kód:
#include <stdio.h>
#include <math.h>

int main()
{
    int i=4,d=0,pom=0,hodnota,a,c=0,j=0;
    scanf("%d",&a);
    while (i>0)
    {
   i--;
   d=a/pow(10,i);
   hodnota=d;
   d=d-pom;
   d=d*pow(10,j);
   c=c+d;
   pom=hodnota*10;
   j++;
    }
    return 0;
}

Vopred ďakujem za pomoc


Offline

Skúsený užívateľ
Skúsený užívateľ
Fonkcia pow

Registrovaný: 11.01.09
Prihlásený: 12.12.24
Príspevky: 1395
Témy: 10 | 10
Bydlisko: Hrinova
NapísalOffline : 27.10.2012 13:40 | Fonkcia pow

Daj nam konkretnu hodnotu premennej 'a', u ktorej pozorujes tento problem. Ak vies presne aj v ktorej urovni cyklu ti to robi, tak sprav len jednoduchy program s presne takymi hodnotami a sam uvidis, ci to robi stale ( mozno len nespravne predpokladas hodnoty premennych ).


Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 22.10.12
Prihlásený: 21.10.15
Príspevky: 18
Témy: 5 | 5
Napísal autor témyOffline : 27.10.2012 14:10 | Fonkcia pow

Dam vam sem teda cely program ale roby to vzdy pri kladnom j
Kód:
#include <stdio.h>
#include <math.h>

int main()
{
    int a=0,b=0,i=0,c=0,d=0,j=0,pom=0,hodnota;
    printf("Zadaj cislo:");
    int r= scanf("%d",&a);
    if (r!=1) printf("Zadaj ciselnu hodnotu");
    else
    b=a;
    while (b>0)
    {
        b=b/10;
        i++;
    }
    while (i>0)
    {
        i--;
        d=a/pow(10,i);
        hodnota=d;
        d=d-pom;
        d=d*pow(10,j);
        c=c+d;
        pom=hodnota*10;
        j++;
    }
    if (a==c) printf("cislo %d je Palindrom",a);
    else printf("cislo %d neni Palindrom",a);
    return 0;
}

a hodnota "a" musi byt minimalne stvorciferna


Offline

Užívateľ
Užívateľ
Fonkcia pow

Registrovaný: 24.08.12
Prihlásený: 09.02.19
Príspevky: 59
Témy: 0 | 0
NapísalOffline : 27.10.2012 14:54 | Fonkcia pow

V čem je přesně problém? Mohl bys sem dát konkrétní příklady?

Mě to počítá správně a program funguje také správně:

Kód:
Zadaj cislo:1234321
cislo 1234321 je Palindrom


Akorát bych to teda řešil úplně jiným způsobem, a to int r=... přímo v kódu je šílená prasárna, to si nech do C# :sick:


_________________
"Existuje pouze jeden člověk, který má méně přátel než Bill Gates, a tím je Saddám Husajn." (Paul Grayson)
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 22.10.12
Prihlásený: 21.10.15
Príspevky: 18
Témy: 5 | 5
Napísal autor témyOffline : 27.10.2012 16:36 | Fonkcia pow

ked si spustite tento program cez debuger a bod prerusenia si date na druhy while tak uvidite ze pri kazdom parnom j to neda priamo 10 na 2 ale 10na2 -1 je to vidiet u premennej d a to int r=... je najjednoduchsie ako sa da testovat ci uzivatel zadal cislo :D teda pre mna najzrozumitelnejsie

// pridané po 1 hodine 25 minútach od posledného príspevku

nakoniec som to vyriesil este jednou podmienkou [code] if (j%2==0 && j!=0) d=d+1;
a už to funguje ale aj tak ďakujem


Offline

Užívateľ
Užívateľ
Fonkcia pow

Registrovaný: 24.08.12
Prihlásený: 09.02.19
Príspevky: 59
Témy: 0 | 0
NapísalOffline : 27.10.2012 20:42 | Fonkcia pow

V čem to kompiluješ, není to náhodou nějaký crippleware od Micro$oftu? Protože mě s GCC v Linuxu vychází tohle:

_1_0_1_
_2_1_20_
_3_2_300_
_4_3_4000_
_5_4_50000_
_4_5_400000_
_3_6_3000000_
_2_7_20000000_
_1_8_100000000_


První číslo je d před výpočtem, druhé číslo je j, třetí je d po výpočtu.

S tím int r jsem to myslel tak, že není dobré míchat deklaraci proměnných a samotný kód, ono je to sice od C99 povolené, ale nepatří to k "dobrému programátorskému stylu". Do Céčka to prostě nepatří, je to taková vlezlá plíseň odjinud, správně bys měl mít všechny deklarace pohromadě na začátku bloku. Překladač mi na tom vyhodí výstrahu:
warning: ISO C90 forbids mixed declarations and code

To s tím testem zadání čísla bych řešil trochu jinak:
Kód:
if (scanf("%d",&a))
   {
   tady se provede celý výpočet...
   }
else
   printf("Zadaj ciselnu hodnotu\n");

Ušetříš tím jednu zbytečnou proměnnou a navíc se při chybě nebude nic zbytečně počítat. Ale přiznám se že bych celý ten program řešil jinak :D


_________________
"Existuje pouze jeden člověk, který má méně přátel než Bill Gates, a tím je Saddám Husajn." (Paul Grayson)
Offline

Užívateľ
Užívateľ
Obrázok užívateľa

Registrovaný: 22.10.12
Prihlásený: 21.10.15
Príspevky: 18
Témy: 5 | 5
Napísal autor témyOffline : 27.10.2012 21:22 | Fonkcia pow

Neviem čím to proste je mne to pri každom párnom j hodí o -1 menšiu hodnotu ale aj tak ti ďakujem za dobre rady.


Offline

Užívateľ
Užívateľ
Fonkcia pow

Registrovaný: 24.08.12
Prihlásený: 09.02.19
Príspevky: 59
Témy: 0 | 0
NapísalOffline : 28.10.2012 3:08 | Fonkcia pow

Ještě mě napadlo jestli to náhodou nezpůsobuje nějaká drobná chybička při převodu z reálného čísla na celé, protože pow() pracuje s čísly double, a tak se výsledek při převodu na int musí oříznout. Stačí aby byla chyba na kdovíkolikátém desetinném místě, a při oříznutí všeho za desetinnou čárkou ti zmizí celá jednička! To by mohlo být ono.

Navíc je ta funkce dost pomalá, protože počítá přes logaritmy. Pro tenhle účel by sis mohl klidně napsat svojí: long long mocnina(int x,int y), která by takovou chybu nemohla způsobit a navíc by obsahovala jen jednu jednoduchou smyčku, takže by fungovala stokrát rychleji. Nemusel bys <math.h> vůbec použít.


_________________
"Existuje pouze jeden člověk, který má méně přátel než Bill Gates, a tím je Saddám Husajn." (Paul Grayson)
 [ Príspevkov: 8 ] 


Fonkcia pow




© 2005 - 2024 PCforum, edited by JanoF