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
Stránky: 1
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
Ahoj,
koukám, že v tom programu máš sice struktury, ale používáš jenom prvky a , 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)
#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");}
Offline
↑ 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
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 :)
Offline
↑ 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
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?)
Offline
↑ 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
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ě)
Offline
↑ 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
#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 :)
Offline
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
Offline
↑ 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
Stránky: 1