|
Hinnavaatlus
:: Foorum
:: Uudised
:: Ärifoorumid
:: HV F1 ennustusvõistlus
:: Pangalink
:: Telekavad
:: HV toote otsing
|
|
| autor |
|
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: 30 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: 30 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: 30 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: 30 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: 30 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: 30 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: 30 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 |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
28.01.2012 22:05:39
|
|
|
C's on stringide võrdluseks strncmp funktsioon ning sääraselt staatilisse massiivi scanf'iga lugemine lõppeb heal juhul vajalike andmete üle kirjutamisega, halvemal programmi crashimisega.
Sama asi c++'s oeks oluliselt töökindlam implementeerida. Prindid std::cout'iga, loed std::cin'iga ning ka võrdlusi saad teha otse =='ga eeldusel, et char*'i asemel kasutad std::string'i.
Kinda-OT'ish:
C++ on tegelikult üks pagana võimas asi ning üks töö- ja lollikindlamaid keeli üldse kui kasutada standardteeki + smart pointereid ning exceptioneid. C++11'ga tuleb veel kamaluga ülifancyt nänni juurde ning mul tekib juba vägisi soov ka oma koduleht php/pythoni asemel selles kirjutada
_________________ 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
|
30.01.2012 22:03:09
|
|
|
Suur aitäh teie kõigi abi eest! Te olete kindlasti juba tüdinud minu algaja lihtsatest probleemidest, kuid äkki suudate veel natuke aidata. Kuidas lisada C++'s komakohti? C's ma seda oskasin, C++ kohta ei tea. Näide siis selline:
int main()
{
int P;
std::string Y;
int V;
std::cout << "Sisestage pikkus meetrites: \n";
std::cin >> P;
std::cout << "Sisestage uue ühiku kood (alj, ver, kyn, toll, jalg, jard, lii): \n";
std::cin >> Y;
if (Y == "alj")
{
V = (P * 5572);
std::cout << P << "m = " << V << " alj \n";
}
|
Tahaksin nüüd, et V ilmuks 2 kohta peale koma.
|
|
| Kommentaarid: 30 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
| tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
30.01.2012 22:04:50
|
|
|
http://www.cplusplus.com/reference/iostream/manipulators/setprecision/
Seal lehel on üldse palju head infot.
_________________ 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
|
31.01.2012 01:16:57
|
|
|
Nii, järgmine probleem. Pean arvutama kasutaja isikukoodi põhjal tema soo ja vanuse. Praegult on nii palju tehtud:
#include<iostream>
#include<string>
int main()
{
std::string I;
std::cout << "Sisestage isikukood: \n";
std::cin >> I;
std::cout << "Isikukoodi " << I << " andmed: \n";
std::string str1;
str1 = I.substr (0, 1);
str1.c_str();
int sugu = atoi(str1.c_str());
if(sugu == 1 || sugu == 3 || sugu == 5)
{
std::cout << "*mees \n";
}
else if(sugu == 2 || sugu == 4 || sugu == 6)
{
std::cout << "*naine \n";
}
std::string str2;
str2 = I.substr (1, 7);
str2.c_str();
int p2ev = atoi(str2.c_str());
std::string str3;
str3 = I.substr (1, 5);
str3.c_str();
int kuu = atoi(str3.c_str());
std::string str4;
str4 = I.substr (1, 3);
str4.c_str();
int aasta = atoi(str4.c_str());
if(p2ev == 01 - 31 || kuu == 01 - 12 || aasta == 00 - 99)
{
std::cout << "s[ndis " << p2ev << "." << kuu << "." << aasta << "\n";
}
system("pause");
return 0;
}
|
Saan aru, et selle päeva, kuu ja aasta koha peal on midagi väga valesti. Praegult ütleb mulle ainult, kas on mees või naine.
|
|
| Kommentaarid: 30 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
| tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
31.01.2012 01:38:29
|
|
|
Probleem on, et sa ei saa sedasi vahemikke võrrelda. Näiteks p2ev == 01 - 31 tõlgendub seal kui 1-31 ehk võrreldakse, kas p2ev muutujas on väärtus -30
Pead võrdlema eraldi nii alumist kui ülemist otsa, a'la suurem-võrde 1'st ja väiksem-võrdne 31'st
_________________ 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
|
21.03.2012 22:56:09
|
|
|
Tere! On järjekordne probleem. On selline programm:
#include<iostream>
using namespace std;
int main()
{
int P, N = 2;
cout << "Sisestage arv: \n";
cin >> P;
for (N = 2; N <= P - 1; N++)
{
if (P % N == 0)
{
cout << P << " ei ole algarv. \n";
break;
}
}
if (N == P)
{
cout << P << " on algarv \n";
}
system("pause");
return 0;
}
|
Nüüd oleks vaja see edasi teha selleks, et kui arv ei ole algarv, siis ütleks kõik selle arvu jagajad (peale 1 ja arvu iseenda). Endal kahjuks pole aimugi kuidas seda teha
|
|
| Kommentaarid: 30 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
| tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
21.03.2012 23:31:59
|
|
|
No siis lihtsalt selle asemel, et välja kirjutada et pole algarv kirjutad järjest välja kõik nood arvud millega ta jagub.
Muidu kui natuke viitsid nuputada on võimalik su algarvude otsimise algoritmi röögatult palju kiiremaks teha mõningase lisa mälukulu arvelt. Omal ajal panin Pascalis vana P1@188MHz otsima kõik arvud 2-1000000 mõne sekundiga vs sinu stiilis otsing mis võttis 2-100k puhul juba mitu minutit
_________________ 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
|
07.04.2012 23:22:53
|
|
|
Nüüd siis vaja selline programm teha, mis küsib kasutajalt arvu ning genereerib kõigepealt nii mitu juhuslikku arvu (vahemikus 1 kuni miljon) kui kasutaja sisestas ning seejärel paneb need kasvavasse järjeokrda. For example:
input: 5.
output:
Juhuslik jada:
1276, 305, 7, 28, 2000.
Järjestatud jada:
7, 28, 305, 1276, 2000.
Praegult on nii palju tehtud:
#include <stdlib.h>
#include <iostream>
using namespace std;
int main()
{
const int MAX_SIZE = 100;
int numbers[MAX_SIZE];
int numElements;
cout << "Enter number: \n";
cin >> numElements;
srand(static_cast<unsigned int>(time(0)));
int array[numElements];
cout << "Random numbers: \n";
for(int i = 0; i < numElements; i++){
array[i] = (rand()%1000000) + 1;
cout << array[i] << ",";
if(i == numElements){
cout << "i";
}
}
system("pause");
return 0;
}
|
Nüüd ma ei tea ainult kuidas seda kasvavasse järjekorda panna. Bubble sort oleks vist kõige lihtsam viis, aga ei oska seda kasutada hästi.
|
|
| Kommentaarid: 30 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
| tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
08.04.2012 12:07:18
|
|
|
std::sort
Samuti on sul koodi treppimine kergelt öeldes katki
_________________ 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
|
08.04.2012 16:23:59
|
|
|
| Ho Ho kirjutas: |
std::sort
Samuti on sul koodi treppimine kergelt öeldes katki |
Jah, koodi treppimine on katki, kuid millegipärast soovitati koodi kirjutamisel kasutada Dev-C++ ning see teebki koodi selliseks. Ise avastasin alles hiljuti Microsoft Visual C++, sellega hulga mõnusam kirjutada.
Aga sortimiseks peame kasutama ühte neist: Insertion · Selection · Bubble · Shell · Merge · Heap · Quick · Quick3
Bubble pidi vist kõige lihtsam olema, aga ei oska seda implementida sinna.
|
|
| Kommentaarid: 30 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
| tagasi üles |
|
 |
Fukiku
Kreisi kasutaja

liitunud: 06.11.2003
|
08.04.2012 17:11:55
|
|
|
Mida sa oled teinud selleks, et mullitamist realiseerida? Wikis on pseudokoodis näited olemas - ei ole väga keeruline seda C-sse ju tõlkida. Kui sa kuskilt otsast pihta ei hakka, ega ta siis valmis ka ei saa. Seega näita senitehtu välja ja räägi oma probleemidest.
_________________ 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
|
08.04.2012 18:08:24
|
|
|
Proovisin siis kuidagi mullsorti kasutada.
#include <stdlib.h>
#include <iostream>
using namespace std;
int main()
{
const int MAX_SIZE = 100;
int numbers[MAX_SIZE];
int numElements;
cout << "Enter number: \n";
cin >> numElements;
numElements <= MAX_SIZE;
srand(static_cast<unsigned int>(time(0)));
cout << "Random numbers: \n";
for(int i = 0; i < numElements; i++){
numbers[i] = (rand()%1000000) + 1;
cout << numbers[i] << ",";
if(i == numElements){
cout << "i";
}
}
int exchanges;
int temp;
cout << "\nSorted numbers: \n";
for(int i = 0; i < numElements; i++){
if(numbers[i] > numbers[i + 1]){
temp = numbers[i];
numbers[i] = numbers[i +1];
numbers[i + 1] = temp;
exchanges++;
cout << temp << ",";
}
}
system("pause");
return 0;
}
|
Ei tulnud just väga hästi välja. Kuid ise ei taipa ka päris hästi, mis siin viga on.
|
|
| Kommentaarid: 30 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
| tagasi üles |
|
 |
Fukiku
Kreisi kasutaja

liitunud: 06.11.2003
|
08.04.2012 18:19:51
|
|
|
Põhimõtteliselt teeb su kood praegu mullisordis ühe iteratsiooni. Korrektses mullisordis on kaks tsüklit - sisemine ja välimine. Sul on hetkel olemas ainult sisemine, mis kõnnib mööda massiivi ja vahetab vastavalt vajadusele elemente omavahel - see on täitsa õige, aga ühe korra massiivist üle käies saame halvima stsenaariumi korral täpselt ühe elemendi õigesse kohta paika.
Lisaks peab olema ka välimine tsükkel, mis sisemist tsüklit kordab senikaua, kuni ühtegi kohavahetust enam massiivis ei tehtud (järelikult on siis kõik juba õiges järjekorras). Selle üle arvepidamiseks oled sa juba muutuja exchanges loonud, kuid ei tee sinna kogutud infoga hetkel midagi.
Seega mine loe wikit uuesti, vaata minu kommentaari ja nuputa edasi.
PS. sorteerimise ajal massiivi elementide väljatrükkimine vist suurt tulu ei anna .. mõistlik oleks lõpus massiiv välja sülitada, kui ta juba sorditud on.
PPS. code tag on postituses hea, syntax on parem.
_________________ 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
|
09.04.2012 00:06:18
|
|
|
Suur tänu, sain selle korda Läheksin nüüd korraks tagasi ühe teise programmi juurde.
| c++:
|
#include<iostream> using namespace std; int main() { int P, i = 2; cout << "Sisestage number: \n"; cin >> P; for (i = 2; i <= P; i++) { if(i == P) { goto END; } if (P % i == 0) { goto THEEND; } } THEEND: cout << P << " jagub arvudega: " << P << ","; for (i = 2; i <= P; i++) { if(P % i == 0) { cout << P / i << ","; } } END: if(i == P) { cout << "Algarv\n"; } system("pause"); return 0; }
|
Küsimus oleks, kuidas ma saan teha nii, et pärast viimast numbrit prindib "." mitte ",".
|
|
| Kommentaarid: 30 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
| tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
09.04.2012 01:07:06
|
|
|
Tüüpiliselt sellistel puhkudel olen ma kirjutanud esimese väljnudi tsükli väliselt ning tsükli sees eraldusmärke (sinu puhul komad) väljundist enne (ehk siis sul cout << ", " << p/i; ) ja peale tsükli lõppemist siis lõpumärgi, kui seda vaja on. Standardvahenditega seda koma seal lõpus "üle kirjutada" ei saa.
Muidu noist goto'dest saaks seal vägagi lihtsa vaevaga lahti. Kui veel pisut lisamälu tarbida ning kõik prinditavad väärtused kusagil alles hoida enne väljastust saaks ka koodi hulga vähemalt 2x lühemaks ning lihtsamini jälgitavaks
_________________ 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
|
06.05.2012 23:33:29
|
|
|
Aitäh abi eest Nüüd uus programm juba. Kuidas ma saaksin teha nii, et programmi käivitades näitab viite esimest raamatut, kui kasutaja vajutab "j" tähte, näitab viite järgmist, kui vajutab "e" tähte, näitab viite eelmist ning kui vajutab "v" tähte, siis väljub programmist?
| c++:
|
#include<iostream> #include<string> using namespace std; int main() { struct BOOK { string NAME; int YEAR; int PAGES; string FIRSTNAME; string LASTNAME; string LANGUAGE; bool READ; int SCORE; }; BOOK lotr1, hobbit, EG, LS, HP, Time, GOT, EotW, GH, SR, Dragon, Dune, Game, Eragon, Eldest, Brisingr; lotr1.NAME = "Fellowship of the ring"; lotr1.YEAR = 1954; lotr1.PAGES = 531; lotr1.FIRSTNAME = "John Ronald Reuel"; lotr1.LASTNAME = "Tolkien"; lotr1.LANGUAGE = "eng"; lotr1.READ = true; lotr1.SCORE = 10; hobbit.NAME = "Hobbit"; hobbit.YEAR = 1937; hobbit.PAGES = 310; hobbit.FIRSTNAME = "John Ronald Reuel"; hobbit.LASTNAME = "Tolkien"; hobbit.LANGUAGE = "eng"; hobbit.READ = true; hobbit.SCORE = 10; EG.NAME = "Ender's Game"; EG.YEAR = 1985; EG.PAGES = 357; EG.FIRSTNAME = "Orson Scott"; EG.LASTNAME = "Card"; EG.LANGUAGE = "eng"; EG.READ = true; EG.SCORE = 10; LS.NAME = "Lost Symbol"; LS.YEAR = 2009; LS.PAGES = 639; LS.FIRSTNAME = "Dan"; LS.LASTNAME = "Brown"; LS.LANGUAGE = "eng"; LS.READ = true; LS.SCORE = 8; HP.NAME = "Harry Potter and the Philosopher's Stone"; HP.YEAR = 1997; HP.PAGES = 309; HP.FIRSTNAME = "Joanne"; HP.LASTNAME = "Rowling"; HP.LANGUAGE = "eng"; HP.READ = true; HP.SCORE = 9; Time.NAME = "A brief history of time"; Time.YEAR = 1988; Time.PAGES = 256; Time.FIRSTNAME = "Stephen"; Time.LASTNAME = "Hawking"; Time.LANGUAGE = "eng"; Time.READ = true; Time.SCORE = 10; GOT.NAME = "Game of thrones"; GOT.YEAR = 1996; GOT.PAGES = 672; GOT.FIRSTNAME = "George Raymond Richard"; GOT.LASTNAME = "Martin"; GOT.LANGUAGE = "eng"; GOT.READ = true; GOT.SCORE = 8; EotW.NAME = "Eye of the world"; EotW.YEAR = 1990; EotW.PAGES = 688; EotW.FIRSTNAME = "Robert"; EotW.LASTNAME = "Jordan"; EotW.LANGUAGE = "eng"; EotW.READ = true; EotW.SCORE = 10; GH.NAME = "The Great Hunt"; GH.YEAR = 1990; GH.PAGES = 660; GH.FIRSTNAME = "Robert"; GH.LASTNAME = "Jordan"; GH.LANGUAGE = "eng"; GH.READ = true; GH.SCORE = 8; Dragon.NAME = "The Dragon Reborn"; Dragon.YEAR = 1991; Dragon.PAGES = 628; Dragon.FIRSTNAME = "Robert"; Dragon.LASTNAME = "Jordan"; Dragon.LANGUAGE = "eng"; Dragon.READ = true; Dragon.SCORE = 9; SR.NAME = "The Shadow Rising"; SR.YEAR = 1992; SR.PAGES = 1001; SR.FIRSTNAME = "Robert"; SR.LASTNAME = "Jordan"; SR.LANGUAGE = "eng"; SR.READ = true; SR.SCORE = 10; Dune.NAME = "Dune"; Dune.YEAR = 1965; Dune.PAGES = 412; Dune.FIRSTNAME = "Frank"; Dune.LASTNAME = "Herbert"; Dune.LANGUAGE = "eng"; Dune.READ = true; Dune.SCORE = 9; Game.NAME = "Beginning C++ through game programming, third edition"; Game.YEAR = 2011; Game.PAGES = 410; Game.FIRSTNAME = "Michael"; Game.LASTNAME = "Dawson"; Game.LANGUAGE = "eng"; Game.READ = true; Game.SCORE = 10; Eragon.NAME = "Eragon"; Eragon.YEAR = 2002; Eragon.PAGES = 509; Eragon.FIRSTNAME = "Christopher"; Eragon.LASTNAME = "Paolini"; Eragon.LANGUAGE = "eng"; Eragon.READ = true; Eragon.SCORE = 7; Eldest.NAME = "Eldest"; Eldest.YEAR = 2005; Eldest.PAGES = 668; Eldest.FIRSTNAME = "Christopher"; Eldest.LASTNAME = "Paolini"; Eldest.LANGUAGE = "eng"; Eldest.READ = true; Eldest.SCORE = 6; Brisingr.NAME = "Brisingr"; Brisingr.YEAR = 2008; Brisingr.PAGES = 748; Brisingr.FIRSTNAME = "Christopher"; Brisingr.LASTNAME = "Paolini"; Brisingr.LANGUAGE = "eng"; Brisingr.READ = true; Brisingr.SCORE = 7; FILE *Library; Library = fopen("BOOK", "r"); cin.ignore(); return 0; }
|
Ma arvan, et pean mingit moodi kasutama seda FILE vist, kuid ei tea kuidas.
|
|
| Kommentaarid: 30 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
| tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
07.05.2012 11:29:44
|
|
|
gah. Loodan sügavalt, et mõtlesid sellise raamatuinfo koodis kasutamise välja iseeseisvalt ja ei võtnud mingist õpetusest. Kui võtsid siis viska see kiirelt minema ja otsi midagi normaalset.
Esiteks tee selgeks funktsioonid kuhu näiteks söödad sisse structi reference'i ning parameetrite soovitud väärtused ning too kopeerib sinna reference'i muutujatesse nood parameetrid. Või veel "õigem" oleks seda teha klassidega. Saab ka structile constructorit kirjutada kuid see ei pruugi mõnele väga meeldida stiili poolest.
See tehtud siis võta uuri välja mida kujutavad endast ette konteinerid. Ideaalis lahendaksin säärase ülesande vektoritega kuid saaks ka massiividega hakkama, ehkki tulemus poleks nii "puhas" ning oleks mõnevõrra keerukam.
Neid kaht kombineerides saad selle rakenduse tehtud max ~35 koodireaga ning saadav kood on ka reaalselt kasutatav kuna ei pea manageerima eri nimega muutujaid vaid saad lihtsalt konteineri indeksi järgi hetke asukohta arvestada ning konteineris edasi-tagasi liikuda.
(CSV) failist võid ka muidugi seda infot lugeda kuid iseenesest pole see antud funktsionaalsuse vajaduste juures väga oluline kuidas täpselt teed.
Üks asi mida pead silmas pidama on, et standardvahendeid kasutades pead kasutama sisestamiseks ka enterit, lihtsalt j'i vajutades ei jõua kusagile ning tuleb vajutada j+enter.
_________________ 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
|
21.05.2012 21:14:45
|
|
|
Nii mässasin natuke vektorite ja konteineritega ja sain sellise tulemuse:
| c++:
|
#include <iostream> #include <string> #include <vector> using namespace std; struct BOOK { string NAME; int YEAR; int PAGES; string FIRSTNAME; string LASTNAME; string LANGUAGE; bool READ; int SCORE; // constructor BOOK( const string name, int year, int pages, string firstname, string lastname, string language, bool read, int score ) : NAME(name), YEAR( year ), PAGES( pages ), FIRSTNAME( firstname ), LASTNAME( lastname ), LANGUAGE( language ), READ( read ), SCORE( score ) {} }; int main() { vector <BOOK> container; container.push_back( BOOK( "Eragon", 2002, 509, "Christopher", "Paolini", "eng", true, 7 ) ); container.push_back( BOOK( "Eldest", 2005, 668, "Christopher", "Paolini", "eng", true, 6 ) ); container.push_back( BOOK( "Brisingr", 2008, 748, "Christopher", "Paolini", "eng", true, 7 ) ); container.push_back( BOOK( "Fellowship Of The Ring", 1954, 531, "John Ronald Reuel", "Tolkien", "eng", true, 10 ) ); container.push_back( BOOK( "The Hobbit", 1937, 310, "John Ronald Reuel", "Tolkien", "eng", true, 10 ) ); container.push_back( BOOK( "Ender's Game", 1985, 357, "Orson Scott", "Card", "eng", true, 10 ) ); container.push_back( BOOK( "The Lost Symbol", 2009, 639, "Dan", "Brown", "eng", true, 8 ) ); container.push_back( BOOK( "Harry Potter and the Philosopher's Stone", 1997, 309, "Joanne", "Rowling", "eng", true, 8 ) ); container.push_back( BOOK( "A Brief History of Time", 1988, 256, "Stephen", "Hawking", "eng", true, 10 ) ); container.push_back( BOOK( "Game of Thrones", 1996, 672, "George Raymond Richard", "Martin", "eng", true, 8 ) ); container.push_back( BOOK( "Eye of the World", 1990, 688, "Robert", "Jordan", "eng", true, 10 ) ); container.push_back( BOOK( "The Great Hunt", 1990, 660, "Robert", "Jordan", "eng", true, 8 ) ); container.push_back( BOOK( "The Dragon Reborn", 1991, 628, "Robert", "Jordan", "eng", true, 9 ) ); container.push_back( BOOK( "The Shadow Rising", 1992, 1001, "Robert", "Jordan", "eng", true, 10 ) ); container.push_back( BOOK( "Dune", 1965, 412, "Frank", "Herbert", "eng", true, 9 ) ); container.push_back( BOOK( "Beginning C++ Through Game Programming, 3rd Edition", 2011, 410, "Michael", "Dawson", "eng", true, 10 ) ); for( size_t i = 0; i < container.size(); ++i ) { BOOK &book = container[i]; cout << "Book Name : " << book.NAME<< "\nPublished : " << book.YEAR << "\nPages : " << book.PAGES << "\nAuthor : " << book.FIRSTNAME << " " << book.LASTNAME << "\nLanguage : " << book.LANGUAGE << "\nRank : " << book.SCORE << "/10"; cout << "\nOn Shelf : "; if ( book.READ == true) cout << "Read\n\n"; else cout << "Not read\n\n"; X: if((i+1)%5==0) { cout << "Vajuta "j", et näha viite järgmist raamatut, "e" et näha viite eelmist raamatut ja "v", et väljuda programmist.\n"; string g; cin >> g; if(g == "j") { i++; if(i>5) { goto X; } } else if (g == "e") { i--; if(i>5) { goto X; } } else if (g == "v") { goto Y; } cin.ignore(); } } Y: return 0; }
|
Nüüd probleem selline, et "j", "e" ja "v" vajutamisel ei toimi soovitud tegevused. Aitäh!
|
|
| Kommentaarid: 30 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
| tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
21.05.2012 21:44:53
|
|
|
Never ever ei tohiks tsüklimuutuja väärtust muuta kusagil mujal kui tsükli päises.
Samuti for tsükkel ei kõlba säärase voojuhtimise jaoks. Pigem tee miski lõpmatu tsükkel (while (true)) ning sinna sisse sisendi küsimine ning sellele vastavalt käitumine. Tsüklist saad break'iga välja. Ei mingeid goto'sid pole seal juures samuti tarvis.
_________________ 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 |
|
 |
neros
HV Guru

liitunud: 26.11.2003
|
22.05.2012 07:58:12
|
|
|
Nõustun eelkõneleja seisukohaga. Kuna juba C++'i kasutada, siis miks mitte juba OOP teed minna. Kõigepealt soovitaks tekitada näiteks BookCollection klassi, kus on funktsioon Add, mis võtab parameetriteks samad väärtused mis su structi constructor. Saaks ära jätta inetud container.push_back(BOOK(...)); read ning asendada näiteks Books.Add(...);
Teiseks, while loop. Use it. Love it.
Kolmandaks, funktsioonid. Use them. Love them. Üldiselt on reegel selline, et "funktsioon peaks tegema ühte asja" ilma naeruväärseks mineva abstraheerimiseta. Klassid peaks tegema väga konkreetseid asju. Kusagil oli isegi videoloeng selle kohta, üritan tänase päeva jooksul üles leida... kui õnnestub.
Poolikult pole mõtet programmerimist õppida - hiljem kahetsed. Pigem natuke rohkem vaeva näha alguses ja õppida korralikku koodi kirjutama kui pärast spagetist pannkooke teha.
_________________ GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt. |
|
| Kommentaarid: 48 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
40 |
|
| tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
22.05.2012 09:04:35
|
|
|
| tsitaat: |
| Kõigepealt soovitaks tekitada näiteks BookCollection klassi, kus on funktsioon Add, mis võtab parameetriteks samad väärtused mis su structi constructor. Saaks ära jätta inetud container.push_back(BOOK(...)); read ning asendada näiteks Books.Add(...); |
Antud olukorras ei pea säärast mõttetu lisakihi tegemist eriti mõttekaks. Saaks veel aru, kui tolle konteineri otsas tehtaks miskit keerukamat kui lisamine-väljastus kuid hetkel seda ei ole ning kogu asi taanduks sisuliselt add(...) vs push_back(...) peale kus mõlemal on praktiliselt samad parameetrid. Spetskonteineri puhul saaks veel küll raamatu constructori sinna add'i sisse ära peita kuid isiklikult ei näe sel erilist mõtet.
Eks niisama näpuharjutuse mõttes see halba ei teeks kuid kindlasti tuleb silmas pidada, et liigne abstraktsioon ei ole sugugi mitte hea.
Muus osas nõustun, eriti funktsioonide ning korralikult asjade selgeks tegemise koha pealt. Miski üldise koodi vorminduse standardi võiksid ka omale selgeks teha ning seda kasutada. Säärased allcaps structide-muutujate nimed c++ koodis tahavad silmi peast kratsima panna.
_________________ 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 |
|
 |
neros
HV Guru

liitunud: 26.11.2003
|
22.05.2012 09:22:59
|
|
|
Näpuharjutuse jaoks ma mõtlesingi Kui mul on mingi programm mis üle ühe faili ei nõua et loetav püsida, ei hakka ka abiklasse ehitama, pole lihtsalt mõtet kui kiirelt midagi tarvis meisterdada, vähemalt C++'ga. C#'ga oleks vastasel juhul liiga palju staticuid vaja ja staticute nägemine mujal kui extensionmethodites ajab lihtsalt segadusse (on erandeid muidugi). Ning jällegi abstraheerimise poole pealt - liiga palju head asja on paha küll, aga alustajale on sobilik just seetõttu, et saab vähemalt asja natuke selgemaks.
As for all-caps nimetused... esimest korda koodist üle lastes tekkis koheselt küsimus "oot, mis konstandikasutus see selline on" aga uuesti vaadates tuli välja et hoopis structi construct
_________________ GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt. |
|
| Kommentaarid: 48 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
40 |
|
| tagasi üles |
|
 |
estplayer
HV kasutaja
liitunud: 15.10.2008
|
11.06.2012 23:20:09
|
|
|
Aitäh abi eest! Nüüd tahaksin teha programmi, mis loob 3 4*4 massiivi ja täidab need naturaalarvudega 0 kuni 100. Siis väljastada kõik 3 massiivi ekraanile ning seejärel leida, milline neist on elementide väärtuselt suurim ning siis ka see eraldi väljastada. Omal jõul jõudsin ma kuni 3 massiivi väljastamiseni, elementide summat eriti ei oska arvutada. Samuti sooviks teada, kas seda kõike saab kuidagi lühemalt ka kirja panna? Praegult tundub mul kõik väga laialt välja kirjutatud.
| c++:
|
#include<iostream> #include<ctime> using namespace std; #define maxN 4 #define maxM 4 #define maxX 4 #define maxY 4 #define maksa 4 #define maxB 4 int t[maxM][maxN]; int u[maxX][maxY]; int s[maksa][maxB]; int n, m, x, y, a, b; void input(){ n = 4; m = 4; for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) { t[i][j] = rand() % 100; } } void input2(){ x = 4; y = 4; for ( int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { u[i][j] = rand() % 100; } } } void input3(){ a = 4; b = 4; for (int i = 0; i < a; i++) { for (int j = 0; j < b; j++) { s[i][j] = rand() % 100; } } } void output(){ for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cout << t[i][j] << " "; } cout << endl; } } void output2(){ for (int i = 0; i < x; i++) { for (int j = 0; j < y; j++) { cout << u[i][j] << " "; } cout << endl; } } void output3(){ for (int i = 0; i < a; i++) { for (int j = 0; j < b; j++) { cout << s[i][j] << " "; } cout << endl; } } int main() { srand((unsigned)time(0)); input(); input2(); input3(); cout << "First matrix: \n"; output(); cout << "\n"; cout << "Second matrix: \n"; output2(); cout << "\n"; cout << "Third matrix: \n"; output3(); return 0; }
|
|
|
| Kommentaarid: 30 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
0 :: |
26 |
|
| tagasi üles |
|
 |
Ho Ho
HV Guru

liitunud: 16.02.2002
|
11.06.2012 23:27:21
|
|
|
Tee omale funktsiooniparameetrid selgeks
Käigult kirjuatud kood, ei pruugi kompileerida kuid idee peaks enam-vähem edasi andma.
| c++:
|
typedef int[4][4] matrix; void input(matrix &data) { for ( int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { data[i][j] = rand() % 100; } } } ... matrix d1, d2; input(d1) input(d2)
|
Asja saaks kõvasti ilusamaks, kui kasutada STL'i konteinereid/templatesid ja <algorithm> headerit kuid see on vist hetkel õige pisut kaugema tuleviku teema
Säärane massiivi typedef'imine ning funktsiooni sees otse julmalt nelja kasutamine on tegelikult suht karm häkk ning reaalses koodis sedasi ei tohiks teha.
Kui koodis on miskeid tundmatuid märksõnu siis googelda ja/või küsi. Algatuseks oleks siis märksõnadeks typedef ning reference, rääkimata siis tollest samast funktsioonile input ja output parameetrite andmist.
_________________ 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 |
|
 |
neros
HV Guru

liitunud: 26.11.2003
|
12.06.2012 08:36:54
|
|
|
Tegelikult saaks vähem häkiliselt kui 4 asendada igal pool nt konstandiga MAX.
Lisaks mis masiivi typedefimisel viga? typedefe kasutatakse kõikjal, ei näe põhjust, miks ka siin ei võiks
E: kuigi vectoritega saaks ilmselt funktsionaalsema koodi
_________________ GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
viimati muutis neros 12.06.2012 08:54:59, muudetud 1 kord |
|
| Kommentaarid: 48 loe/lisa |
Kasutajad arvavad: |
   |
:: |
0 :: |
1 :: |
40 |
|
| tagasi üles |
|
 |
|