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 08. 12. 2011 20:34

Shalinka
Příspěvky: 71
Reputace:   
 

Problém s datovými typy

Dobrý večer,
mám menší problém s přetypováním proměnných.
Dejme tomu, že mám program:

#include <stdio.h>
struct a_b { int a,b; };
struct c_d { int c,d; };


struct c_d nasobeni(struct a_b ab)
{
    struct c_d cd;
    cd.c = ab.a*0.261;
    cd.d = ab.b*0.0123;
    return cd;
}

int main(){
struct a_b hodnota_ab;
printf("Zadejte hodnotu:\n");
scanf("%d",&hodnota_ab.a);
struct c_d hodnota_cd = nasobeni(hodnota_ab);
printf("po nasobeni je hodnota %d", hodnota_cd.c);scanf("%d");}




Proměnné v úvodních strukturách musí být typu int(zatím jsem nechala, aby se ve výstupu psalo celé číslo), ale výstup programu musí být desetinné číslo, nevím jak to udělat, když jsem přetypovala na typ float, tak se mi na výstupu stejně nevypsali desetinná čísla, např. když to mělo vyjít 7,324 , tak se misto toho napsalo 7,000000. Možná jsem to udělala špatně, ale jindy mi to nepsalo ani to 7,000000, ale jen 0,000000. Nevím, zda existuje nějaký lepší desetinný typ, nebo něco čím to opravit. Děkuji za každou radu.

Offline

  • (téma jako vyřešené označil(a) Shalinka)

#2 08. 12. 2011 20:53 — Editoval frank_horrigan (08. 12. 2011 21:08)

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Problém s datovými typy

Ahoj,

koukám, že v tom programu máš sice struktury, ale používáš jenom prvky $a$ a $c$, takže, když dovolíš, uděláme prosté proměnné a mrkneme se na to přetypování, souhlas? (s těma strukturama je to stejný, jenom se mi nechce s tím tahat, to už si pak upravíš)

Opravím tvůj starý kód a ukážu ti to přetypování (v tom Tvém ho nikde nevidím)

Code:

#include <stdio.h>
int a,b; // prosté proměnné na globálu
float c;


int nasobeni_int(int A)
{
    ínt b = A*0.261; // TADY je problém, proměnná, ke které přiřazuješ, je typu INT, takže nebude počítat
// správně. Jednoduse ti to prekladac vynasobi, a predtim, nez ulozi vysledek zjisti, ze uklada do spatneho
 //typu, tak desetinnou cast proste zahodi
   
    return b;
}
float nasobeni_float(int A)
{
    float b = A * 0.261; // tohle ti spocita spravne
    return b;
}

int main(){

printf("Zadejte hodnotu (cele cislo):\n"); // chtelo by to osetrit, co kdyz uzivatel zada neco jineho, ale to ted neresme
scanf("%d",&a);
b = nasobeni_int(a); // b globalni, a taky
printf("po celociselnem nasobeni je hodnota %d",b); // puvodni tvuj kod
printf("po celociselnem nasobeni pretypovana float: %f", (float) b); // muj kod s pretypovanim, nefunguje, 
//pretypovani v tomto pripade je k nicemu
c = nasobeni_float(a);
printf("po nasobeni vracejici float: %f", c); // vrati dobry vysledek
printf("po nasobeni vracejici float zobrazujici int: %d", c); // vypise blbost
printf("po nasobeni vracejici float pretypovany na int a zobrazujici int: %d", (int) c); // vrati dobry vysledek s 
//odhozenou desetinnou casti
scanf("%d");}

The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#3 08. 12. 2011 20:59

Shalinka
Příspěvky: 71
Reputace:   
 

Re: Problém s datovými typy

↑ frank_horrigan:
jo není problém, ty struktury by tam být měly, ale nevadí, zkusím to potom doupravit. To přetypování jsem tam nervala, protože mi to stejně nefungovalo a bylo by to zbytečně nepřehledný. Takže určitě souhlasím :)

Offline

 

#4 08. 12. 2011 21:06

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Problém s datovými typy

Jinak, a to schválně zvlášť do příspěvku, chybi ti na konce return 0; (main() deklaruješ jako int, tak dej operačnímu systému návratovku ;) a nebo main nedefinuj jako void :)


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#5 08. 12. 2011 21:19

Shalinka
Příspěvky: 71
Reputace:   
 

Re: Problém s datovými typy

↑ frank_horrigan:
aha, akorát trošku problém, tohle jsem dala jen jako vzorovej příklad, ono je to v podstatě o něco složitější, já potřebuju, aby ta funkce obsahovala tu strukturu a vracela to cd, tak proto :

struct c_d nasobeni(struct a_b ab)
{
    struct c_d cd;
    cd.c = ab.a*0.261;
    cd.d = ab.b*0.0123;
    return cd;
}

kdyby to bylo tak jednoduché, tak bych to taky tak nějak udělala, ale právě mě nenepadá, co s tím, když je to takhle

Offline

 

#6 08. 12. 2011 21:24

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Problém s datovými typy

tu strukturu už si tam dodej ;) nadefinuj, definuj návratový typ (v já ti dal dvě funkce, tak měj dvě struktrury, jedna s inty, a druhá s floaty), a aplikuj :)

nebo to nezvládneš? (a já ti to napíšu?)


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#7 08. 12. 2011 21:31

Shalinka
Příspěvky: 71
Reputace:   
 

Re: Problém s datovými typy

↑ frank_horrigan:
No vlastně jsem myslela, že mi ten zápis pomůže, ale nedozvěděla jsem se nic co nevím, se strukturami teprve začínám, právě je to úkol na jejich použití a nevím, co ta struktura může a ne, jak může taková funkce, která vrací strukturu vypadat a tak.

Offline

 

#8 08. 12. 2011 21:38

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Problém s datovými typy

Aha... no, struktura je vlastně normální proměnná, která má v sobě další proměnné... ten kód na jejich použití jsi měla de facto správně...

Takže si nadefinuj struktury, tak jak jsi to měla (v tom případě se ti omlouvám za svojí lenost a že jsem ti je zahodil), a normálně předáváš celou strukturu jako argument (na to v céčku bacha, předáváš kopii té struktury), a můžeš vrátit celou strukturu zpátky....

Pointery (tedy jak to funguje "doopravdy" ti zatím říkat nebudu, jenom bych ti pletl hlavu (to já sice dívkám rád, ale ne těm, které se chtějí něco systematicky naučit :) )

Ok, svůj kód, jak jsem ho dal, přepíšu tak, aby používaly struktury (celkem tři různé),a z každé z nich použily jeden prvek (tak jak jsi to měla původně)


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#9 08. 12. 2011 21:42

Shalinka
Příspěvky: 71
Reputace:   
 

Re: Problém s datovými typy

↑ frank_horrigan:
Tak to ti předem moc děkuji :) já to zkouším sama, ale stejně mi to pořád hází chyby a nebo nesmysly, na netu jsem zatím nic nenašla a v knížce, co mám je to zmíněno jen okrajově, jakože vůbec nějaké struktury existují.

Offline

 

#10 08. 12. 2011 21:54 — Editoval frank_horrigan (08. 12. 2011 21:55)

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Problém s datovými typy

Code:

#include <stdio.h>
typedef struct nA_nB 
{
   int na, nb;
}
na_nb; // "n" znamena v madarske notaci INT - docela dobra pomucka. A a B jsou zadavaci promenne
typedef struct nC_nD 
{
   int nc, nd;
}
nc_nd; // vysledkova struktura s prvky int
typedef struct dE_dF 
{
   float de, df;
}; // "d" jako double, da se pouzit i pro float ("f" pouzit nejde, na to se vzilo oznaceni pro typ bool (f jako flag, priznak, vlajka, praporek)



nC_nD nasobeni_int(na_nb vstupy) // pojmenoval jsem si strukturu jako novy datovy typ (typedef)
{
     nc_nd.c = vstupy.na*0.261; // nc_nd je datovy typ, jeho clen c. Vstupy (celou strukturu) jsi predala jako argument. Jsou globalni
   
    return nc_nd; // vracime celou zmenenou instanci struktury nC_nd
}
nE_nF nasobeni_float(na_nb vstupy)
{
   ne.nf.c = vstupy.na * 0.261; // tohle ti spocita spravne
    return ne_nf; // vracim vlastne totez jako v predchozi funkci, jenom to jsou floaty
}

int main(){

printf("Zadejte hodnotu (cele cislo):\n"); // chtelo by to osetrit, co kdyz uzivatel zada neco jineho, ale to ted neresme
scanf("%d",&na_nb.na);
nc_nd.c = nasobeni_int(na_nb.a); // b globalni, a taky
printf("po celociselnem nasobeni je hodnota %d",nc_nd.c); // puvodni tvuj kod
printf("po celociselnem nasobeni pretypovana float: %f", (float) nc_nd.c); // muj kod s pretypovanim, nefunguje, 
//pretypovani v tomto pripade je k nicemu
ne_nf.e = nasobeni_float(na_nb.a);
printf("po nasobeni vracejici float: %f", ne_nf.e); // vrati dobry vysledek
printf("po nasobeni vracejici float zobrazujici int: %d", nc_nd.c); // vypise blbost
printf("po nasobeni vracejici float pretypovany na int a zobrazujici int: %d", (int) ne_nf.e); // vrati dobry vysledek s 
//odhozenou desetinnou casti
scanf("%d");}
return 0;

SNAD TAM NENI MOC SYNTAKTICKYCH CHYB (doufam, ty ti moc nepomohou :)


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#11 08. 12. 2011 21:57 — Editoval frank_horrigan (08. 12. 2011 22:13)

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Problém s datovými typy

Jinak, jestli to s programováním a C/C++ myslíš opravdu alespoň trochu vážně, doporučuju Ti si zakoupit publikaci Mistrovství v C++, III. vydání, od Stephena Praty, nakladatel je Computer Press.. Velice kvalitní publikace, která ti dá všechno co do začátku potřebuješ.. (nejsem jejich zaměstnanec, ani s nima nemám nic společného, jen tuto publikaci považuju za velmi kvalitní a doporučuju jí všem, kdo mají o Céčko zájem

EDIT: nemělo by se to, nejsem toho zastánce, ale daná publikace existuje ukradená ve formátu PDF


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#12 08. 12. 2011 22:21

Shalinka
Příspěvky: 71
Reputace:   
 

Re: Problém s datovými typy

↑ frank_horrigan:
Díky, jo, zatím jsem v začátcích a docela mě to baví, taky už jsem o té knížce slyšela nejednu chválu, tak uvidíme, třeba ji Ježíšek přinese :D hlavně děkuju za ten poslední kód, trochu jsem to poupravila a program šlape jak hodinky ;)

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson