Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
autor |
sõnum |
|
estplayer
HV kasutaja
liitunud: 15.10.2008
|
27.11.2011 20:53:53
Kehamassi indeksi arvutamine |
|
|
Tere!
Pidage meeles, et olen alles algaja ja ei saa paljust veel aru. Pean tegema programmi C++'s, mis arvutaks inimese kehamassi indeksi, kui ta on oma andmed sisestanud. Praegult on mul nii palju tehtud:
#include <stdio.h>
main()
{
char nimi[100];
printf("Sisestage nimi:\n");
scanf("%s", &nimi);
char P;
printf("Sisestage pikkus sentimeetrites:\n");
scanf("%s", &P);
char K;
printf("Sisestage kaal kilogrammides:\n");
scanf("%s", &K);
float I;
I = K/(P/100)^2;
printf("%f", I);
}
Programmi compiledes ühtegi errorit ei tule, kuid programm jookseb kokku, pärast seda kui sisestada oma kaal kilogrammides. Olen üsna kindel, et viga on mul valemiga seotud, ei oska seda õigesti programmi kirjutada.
Äkki keegi suvatseb aidata?
Aitäh
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
|
RaidoR
Kreisi kasutaja
liitunud: 28.05.2006
|
27.11.2011 21:03:12
|
|
|
Ei ole küll c++'ga väga kursis, kuid kas pikkus ja kaal mitte double'id ei peaks olema?
|
|
Kommentaarid: 52 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
50 |
|
tagasi üles |
|
|
Timukas0
HV kasutaja
liitunud: 20.03.2007
|
27.11.2011 21:45:33
|
|
|
Valemis ka viga. ^ on XOR tehe, ruutu tõstmiseks kõige lihtsam lihtsalt arv iseendaga korrutada (või pow funktsiooni kasutada math.h teegist).
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
|
keevitaja
AM 10 aastat
liitunud: 05.11.2001
|
27.11.2011 21:52:27
|
|
|
arvud peaks defineerima int või double?
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
3 :: |
40 |
|
tagasi üles |
|
|
Ho Ho
HV Guru
liitunud: 16.02.2002
|
27.11.2011 21:59:43
|
|
|
int = täisarv = ümardamine. Igasugu matemaatika jaoks üldjuhul ikka mõttekas float või double kasutada
Btw, see programm on sul siiski seal C's, mitte c++'s. C++'s käiks klaverilt asjade lugemine cin'i ja ekraanile kirjutamine cout'iga. Lisaks crashimine on põhjustatud sellest, et sa üritad uneid väärtusi sisse lugeda stringidena (%s) kuid mälu eraldasid üheainsa märgi jagu. Eriti ei imestaks kui programm crashiks ka siis, kui pikkusesse kirjutada vähe rohkem numbreid.
Samuti peaks sa sealt mingit sorti warninguid saama. Näiteks mul ütles GCC kohe ära:
cpptest.cpp: In function 'int main()':
cpptest.cpp:7: warning: format '%s' expects type 'char*', but argument 2 has type 'char (*)[100]' |
Natuke veel karmimaks panin parameetrid siis virises ka selle peale, et main'il pole tagastusväärtuse tüüpi defineeritud.
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
|
Supiplex
HV veteran
liitunud: 11.12.2002
|
27.11.2011 22:06:44
Re: Kehamassi indeksi arvutamine |
|
|
Alustame crashist.
See tekitab ühebaidise muutuja P.
printf("Sisestage pikkus sentimeetrites:\n");
scanf("%s", &P); |
Selle tulemusena kopeeritakse P-sse terve kasutaja poolt sisestatud string, mis tõenäoliselt on veidi pikem kui üks bait.
Pane tähele - scanf funktsioon on loll. Teda ei koti mis pointeri sa talle ette annad ja kas kasutaja jutt sinna ära mahub. Kui ei mahu, siis kirjutab mälus üle mida iganes sinna taha jääb. Loomulikult on tulemuseks crash.
_________________ The young lady had an unusual list,
Linked in part to a structural weakness.
She set no preconditions. |
|
Kommentaarid: 38 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
1 :: |
34 |
|
tagasi üles |
|
|
Ho Ho
HV Guru
liitunud: 16.02.2002
|
27.11.2011 22:13:31
|
|
|
Nagu eespool kirjutasin, kuna eesmärk on kasutada c++'i siis viska printf/scanf minema ja kasuta cout/cin
http://www.cplusplus.com/doc/tutorial/basic_io/
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
|
estplayer
HV kasutaja
liitunud: 15.10.2008
|
27.11.2011 22:22:08
|
|
|
Vabandust, omast lollusest kirjutasin C++, tegelikult võib ka C's kirjutada.
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
|
Ho Ho
HV Guru
liitunud: 16.02.2002
|
27.11.2011 22:25:57
|
|
|
Vahet pole, ise eelistaks säärase asja jaoks siiski c++'i kuna pole mingeid jamasid inputi lugemisega.
Muidugi kui on vaja teatud kindlas formaadis teksti väljastada siis võibolla mõtleks veel ümber kuid seda sul praegu siin pole
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
|
estplayer
HV kasutaja
liitunud: 15.10.2008
|
27.11.2011 22:46:37
|
|
|
Proovin siiski C's teha seda, kuna olen C järgi õppinud siiani (C++ õpetusi ei olegi).
tsitaat: |
Alustame crashist.
char P;
See tekitab ühebaidise muutuja P.
printf("Sisestage pikkus sentimeetrites:\n");
scanf("%s", &P);
Selle tulemusena kopeeritakse P-sse terve kasutaja poolt sisestatud string, mis tõenäoliselt on veidi pikem kui üks bait.
Pane tähele - scanf funktsioon on loll. Teda ei koti mis pointeri sa talle ette annad ja kas kasutaja jutt sinna ära mahub. Kui ei mahu, siis kirjutab mälus üle mida iganes sinna taha jääb. Loomulikult on tulemuseks crash.
|
Kuid kuidas ma peaksin siis seda märkima? Ise ma muud moodi veel ei oska.
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
|
Urmet
HV vaatleja
liitunud: 29.07.2005
|
27.11.2011 23:15:50
|
|
|
Kui eeldada, et kasutaja mingeid komadega asju ei sisesta, siis tee nii
int P;
printf("Sisestage pikkus sentimeetrites:\n");
scanf("%d", &P);
|
Sellel lingil on ilusasti välja kirjutatud, mida erinevad tähed ja asjad scanf funktsioonis protsendimärgi järel tähendavad: http://www.cplusplus.com/reference/clibrary/cstdio/scanf/
c++ lahendus oleks veel lihtsam:
int P;
cout<<"Sisestage pikkus sentimeetrites:"<<endl;
cin>>P;
|
|
|
Kommentaarid: 10 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
10 |
|
tagasi üles |
|
|
estplayer
HV kasutaja
liitunud: 15.10.2008
|
28.11.2011 00:18:41
|
|
|
Veel üks küsimus, kuidas ma saan compiletud programmi pausile panna? St. et pärast viimast andmete sisestamist ma näen, et mingi tekst käib eest läbi, aga seda lugeda ei jõua, kuna programm läheb iseenesest kinni.
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
|
keevitaja
AM 10 aastat
liitunud: 05.11.2001
|
28.11.2011 00:35:16
|
|
|
aga küsi näiteks veel ühte muutujat kasutajalt. ala, kas sulgede programm? (y/n)
_________________ Hinnavaatlus ei ole koht arvamuse avaldamiseks! |
|
Kommentaarid: 51 loe/lisa |
Kasutajad arvavad: |
|
:: |
1 :: |
3 :: |
40 |
|
tagasi üles |
|
|
Fukiku
Kreisi kasutaja
liitunud: 06.11.2003
|
28.11.2011 00:35:42
|
|
|
estplayer kirjutas: |
Veel üks küsimus, kuidas ma saan compiletud programmi pausile panna? St. et pärast viimast andmete sisestamist ma näen, et mingi tekst käib eest läbi, aga seda lugeda ei jõua, kuna programm läheb iseenesest kinni. |
Käivita käsurealt, mitte ära tee klõpa-klõpa .exe failil.
Ehk siis ava Run, kirjuta sinna cmd ja vajuta ok. Tekkinud aknas navigeeri käsuga cd (change directory) õigesse kohta, kus su .exe pesitseb ning siis kirjuta aga käsureale oma .exe nimi, litsu enterit ja naudi tulemust.
_________________ Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist. |
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
|
Timukas0
HV kasutaja
liitunud: 20.03.2007
|
28.11.2011 01:16:46
|
|
|
getchar(); main funktsiooni lõppu on kõige lihtsam lahendus.
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
|
Fukiku
Kreisi kasutaja
liitunud: 06.11.2003
|
28.11.2011 09:45:26
|
|
|
keevitaja ja Timukas0 pakutud lahendused töötavad, aga ei ole tegelikult õiged. Sedalaadi käsurea programmil ei ole mingit põhjust jääda pärast oma töö lõpetamist mokk töllakil vahtima ja veel üht nupuvajutust ootama. Samuti peaks iga vähegi programmeerimisega tegelev inimene (olgu siis oma huvist või sunni korras, vahet pole) siiski viima ennast vähemalt elementaarsel tasemel kurssi oma lemmik operatsioonisüsteemi käsurea keskkonnaga ning jooksutama oma käsurea jaoks mõeldud programmijupikesi nende loomulikus keskkonnas.
_________________ Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist. |
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
|
Timukas0
HV kasutaja
liitunud: 20.03.2007
|
28.11.2011 15:00:19
|
|
|
Käsurea tundmise kohapealt olen nõus, aga näiteks getchar kasutamine ja käsurea tundmine ei välista üksteist. Minu meelest üsna mugav, kui saab programmi igal hetkel topeltklõpsuga käima panna ja kasutada, selleasemel et kogu aeg käsureale ronida.
|
|
Kommentaarid: 3 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
3 |
|
tagasi üles |
|
|
Ho Ho
HV Guru
liitunud: 16.02.2002
|
28.11.2011 15:03:16
|
|
|
Kui juba "häkkida" siis teha korralikult. getch() ei pruugi alati programmi ootama jätta, eriti kui viimane sisestus ei koristanud newline'i ära klaveripuhvrist. Ise kasutan sellistel puhkudel system("pause"). Loomulikult eriti porditav see pole.
_________________ Teach a man to reason and he'll think for a lifetime
Common sense - so rare that it's a damn superpower
Vaadates paljude inimeste sõnavõtte siin ja mujal jääb üle ainult klassikuid tsiteerida - "I weep for humanity" |
|
Kommentaarid: 106 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
1 :: |
86 |
|
tagasi üles |
|
|
Urmet
HV vaatleja
liitunud: 29.07.2005
|
29.11.2011 13:39:20
|
|
|
Ho Ho kirjutas: |
Kui juba "häkkida" siis teha korralikult. getch() ei pruugi alati programmi ootama jätta, eriti kui viimane sisestus ei koristanud newline'i ära klaveripuhvrist. Ise kasutan sellistel puhkudel system("pause"). Loomulikult eriti porditav see pole. |
Ega system("pause") ja getch() porditavuse poolest ei erinegi - mõlemad lõpetavad funtsioneerimise kui windowsist eemale minna.
|
|
Kommentaarid: 10 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
10 |
|
tagasi üles |
|
|
estplayer
HV kasutaja
liitunud: 15.10.2008
|
14.12.2011 23:21:06
|
|
|
Tõesti, suur tänu abi eest, sain hulga targemaks! Kehamassi indeksi arvutamise programmil sain system("pause") ilusti tööle aga järgneval programmil see ei tööta, äkki saate seletada miks.
#include <stdio.h>
#include <math.h>
int main()
{
float S;
float Y;
float P;
float K;
float T;
printf("Sisestage laenusumma eurodes: \n");
scanf("%f", &S);
printf("Sisestage laenuperiood aastates: \n");
scanf("%f", &Y);
printf("Sisestage intressimäär eurodes: \n");
scanf("%f", &P);
K = (S * (P/100/12)) / (1 - pow((1 + (P/100/12)),(-Y*12)) );
T = K * Y * 12;
printf("Laenusummaga %.2f eurot %.2f intressimääraga te peate maksma %.2f eurot kuus %.2f aastat. Ja kokku maksate pangale %.2f eurot.\n", S, P, K, Y, T);
system("pause");
}
Aitäh
E: Leidsin oma vea, salvestasin kogemata .cpp, mitte .c
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
|
Genert
HV kasutaja
liitunud: 14.06.2011
|
01.01.2012 22:59:22
|
|
|
Mis sa muutujaid nii pikalt teed.
Lihtsamini =
float S,Y,P,K,T;
Ning
I = K/(P/100)^2;
Asemel paneks
#define NUMBER 2
I = K/(P/100) << NUMBER;
Aga jah,vale kalkulatsioon
|
|
Kommentaarid: 1 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
1 |
|
tagasi üles |
|
|
estplayer
HV kasutaja
liitunud: 15.10.2008
|
17.01.2012 20:50:07
|
|
|
Nii, oleks veel üks küsimus. Kuidas ma teen nii, et kui kasutaja poolt sisestatud arv jagub 4-ga, siis aktiveerub üks valiklause, kui ei jagu 4-ga siis ei aktiveeru.
näide;
#include<stdio.h>
main()
{
int A;
printf("Sisesta aasta: ");
scanf("%d", &A);
if(vot siia ma ei teagi mida kirjutada, peaks olema et aktiveerub ainult siis kui A jagub 4-ga)
{
printf("Aasta on liigaasta");
}
else
{
printf("Aasta ei ole liigaasta");
}
return 0;
}
Muidugi tulevad siia hiljem veel mõned tegurid mängu aga tahaks selle selgeks saada kõigepealt.
Aitäh!
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
|
Fukiku
Kreisi kasutaja
liitunud: 06.11.2003
|
17.01.2012 21:13:54
|
|
|
Äkki nii? % peaks olema jäägi leidmise operaator, ma eeldan, et see on nii ka C keeles.
Protip - kõik neljaga jaguvad aastad EI ole liigaastad.
_________________ Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist. |
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
|
estplayer
HV kasutaja
liitunud: 15.10.2008
|
28.01.2012 17:40:06
|
|
|
Fukiku kirjutas: |
Äkki nii? % peaks olema jäägi leidmise operaator, ma eeldan, et see on nii ka C keeles.
Protip - kõik neljaga jaguvad aastad EI ole liigaastad. |
Suur tänu, sain korda. Tean jah, et kõik neljaga jaguvad ei ole liigaastad, ükski arv, mis jagub 100-ga ei saa olla liigaasta, välja arvatud need, mis jaguvad 400-ga.
Edit:
Oleks veel abi vaja. Ei oska päris hästi string funktsiooni kasutada. Mis mul siin vale on?
#include<stdio.h>
#include<string.h>
main()
{
char *K[3]={"Jaanuar","Aprill", "August"};
printf("Sisestage kuu: ");
scanf("%s", &K);
if ( K[0] )
{
printf("%s aastaaeg on talv", K);
}
else
if ( K[1] )
{
printf("%s aastaaeg on kevad", K);
}
else
if ( K[2] )
{
printf("%s aastaaeg on suvi", K);
}
system("pause");
return 0;
}
|
|
Kommentaarid: 29 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
26 |
|
tagasi üles |
|
|
Fukiku
Kreisi kasutaja
liitunud: 06.11.2003
|
28.01.2012 21:05:48
|
|
|
estplayer kirjutas: |
Oleks veel abi vaja. Ei oska päris hästi string funktsiooni kasutada. Mis mul siin vale on?
c:
|
#include<stdio.h> #include<string.h> main() { char *K[3]={"Jaanuar","Aprill", "August"}; scanf("%s", &K); if ( K[0] ) { printf("%s aastaaeg on talv", K ); } else if ( K[1] ) { printf("%s aastaaeg on kevad", K ); } else if ( K[2] ) { printf("%s aastaaeg on suvi", K ); } system("pause"); return 0; }
|
|
Pole küll C keeles kõige kõvem käpp maailmas, aga esimese hooga torkab kohe silma, et sa üritad kasutada sama muutujat K kaheks erinevaks otstarbeks. Esmalt defineerid real 7 K kui kolme elemendiga stringide massiivi ja salvestad sinna oma kuude nimed. Seejärel real 9 loed kasutaja sisendit ja salvestad selle samuti muutujasse K, mis tähendab, et sa sisuliselt kirjutad üle selle, mis real 7 defineeritud sai - sama muutuja ei saa korraga kahte erinevat asja sisaldada. Seega peaks sul olema selleks kaks eraldi muutujat - üks massiiv kuunimede jaoks ja teine tavaline string kasutajasisendi salvestamiseks.
Teine asi, mis kohe silma torkab, on sinu if-lausete konstruktsioon. Kui sa soovid stringe võrrelda, siis peaksid sa andma sinna sulgudesse ikkagi kaks muutujat, mida omavahel võrrelda. Sina antud hetkel annad sinna ainult ühe muutuja.. kui ma ei eksi, siis C-keeles sellisel juhul vist vaadatakse ainult seda, kas muutuja on NULL või mitte. Seega peaks seal olema midagi stiilis
Taaskord ei ole ma kindel, kas == operaator on C keeles stringid võrdlemiseks sobilik, aga selle suudad sa ilmselt ka ise leida, mis on õige meetod selleks.
Lisaks võib vist ka tõdeda, et ütlus "C on keel, millega on väga kerge endale jalga tulistada" vastab täiega tõele, sest su kood on paraku üsna vigane, aga C filosoofia järgi kompilaator eeldab, et progeja teab, mida ta teeb ja laseb igasugust pornot kokku kompileerida. Mõnes rangemas keeles poleks sul see kood kompileerunudki.
ja lõpetame taaskord protip'iga - teinekord koodi postitades pane see palun kas syntax või code tagide vahele - siis on oluliselt kergem seda lugeda. Sinu tsitaadis praegu lükkasin su koodinäite syntax sisse - silm kohe puhkab.
_________________ Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist. |
|
Kommentaarid: 2 loe/lisa |
Kasutajad arvavad: |
|
:: |
0 :: |
0 :: |
2 |
|
tagasi üles |
|
|
|