Moi
Mun pitäis tehä sellanen juttu mihin käyttäjä syöttää 2 eri päivämäärää minuutin tarkkuudella ja ohjelma ilmoittais kumpi päivämääristä oli uudempi.
Miten tuo pitäis toteuttaa?
Kun sinulla on luvut saatu käyttäjältä muutat ne minuuteiksi vähennät toisistaan, otat luvusta itseisarvon, muutat tuloksen takaisin haluaamasi muotoon ja tulostat käyttäjälle.
Ystävällisin terveisin
Kari Argillander
EDIT: En tiedä muokkasitko viestiä vai luinko huonosti, mutta voit vain vertailla minuutti määrää ja tulostaa sen kumpi on isompi tai vertailla aluksi vuotta jos samat sitten päivämäärää ja niin edelleen. Tapoja on moneksi.
Mutta miten?
Jos käyttäjä syöttää päivämäärän muodossa 12:00 1.1.2008 niin miten siitä voi erotella vuodet ja muut?
int h, m, p, k , v; string pvm; cout << "Anna päivämäärä: "; getline(cin, pvm); // nyt pvm on (toivottavasti) muotoa "h:m p.k.v" istringstream is(pvm); // #include <sstream> is >> h; is.get(); is >> m; is >> p; is.get(); is >> k; is.get(); is >> v;
([0-9]{1,2}):([0-9]{2}) ([0-9]{1,2})\.([0-9]{1,2})\.([0-9]{4})
Muuttujaan 1 menee tunnit (1-2 numeroa), kakkoseen minuutit (2 numeroa), kolmoseen päivä (1-2 numeroa), neloseen kuukausi (1-2 numeroa) ja viidenteen vuosi (4 numeroa).
Ja sitten tietysti tarkistukset, että eri osat ovat laillisia, esim. 1 <= kuukausi <= 12.
Mitähän mä oon tekemässä...
#include <iostream> #include <sstream> using namespace std; int main(void) { int h, m, p, k , v, h2, m2, p2, k2, v2; string pvm; cout << "Anna päivämäärä: "; getline(cin, pvm); istringstream is(pvm); is >> h; is.get(); is >> m; is >> p; is.get(); is >> k; is.get(); is >> v; string pvm2; cout << "Anna päivämäärä 2: "; getline(cin, pvm2); is >> h2; is.get(); is >> m2; is >> p2; is.get(); is >> k2; is.get(); is >> v2; if(v < v2) { if(m < m2) { if(p < p2) { if(h < h2) { if(m < m2) { printf("Pvm 1 on vanhempi"); } printf("Pvm 2 on vanhempi"); } printf("Pvm 2 on vanhempi"); } printf("Pvm 2 on vanhempi"); } printf("Pvm 2 on vanhempi"); } system("PAUSE"); }
Vertailuhan menee tuolla tyylillä siis niin, että ensin vertaillaan vuosia. Jos ensimmäinen vuosi on toista pienempi, ensimmäinen päivämäärä on vanhempi ja päinvastoin. Kuukausia vertaillaan vain siinä tapauksessa, että vuodet ovat yhtä suuret. Jos kuukaudetkin ovat yhtä suuret, vertaillaan päiviä, sitten tunteja ja lopuksi minuutteja. Jos minuutitkin ovat yhtä suuret, aikoja voidaan tuolla tarkkuudella pitää samoina.
#include <string>
TsaTsaTsaa kirjoitti:
#include <string>
Ei välttämättä tarvi linux ympäristössä tai gcc kanssa en varma ole miten päin nuo menee.
teksturi kirjoitti:
Ei välttämättä tarvi linux ympäristössä tai gcc kanssa en varma ole miten päin nuo menee.
Kappas, eipä tarvinnutkaan. Tokihan se on silti hyvä laittaa.
Mä meinasin vaan että mikä tuossa mun postaamassa koodissa on vikana kun se ei suorita missään vaiheessa noita printf:ejä vaan hyppää suoraan system("pause"):een kun oon pistäny 2 päivämäärää?
hunajavohveli kirjoitti:
Vertailuhan menee tuolla tyylillä siis niin, että ensin vertaillaan vuosia. Jos ensimmäinen vuosi on toista pienempi, ensimmäinen päivämäärä on vanhempi ja päinvastoin. Kuukausia vertaillaan vain siinä tapauksessa, että vuodet ovat yhtä suuret. Jos kuukaudetkin ovat yhtä suuret, vertaillaan päiviä, sitten tunteja ja lopuksi minuutteja. Jos minuutitkin ovat yhtä suuret, aikoja voidaan tuolla tarkkuudella pitää samoina.
Tuolla tavoin se pitää tehdä niinkuin hunajavohveli sanoi. Tällä hetkellä se tulostaa jotain vain tapauksessa, että vuosi 2 on suurempi kuin vuosi 1. Esim jos päivämäärä 1 on 10 min 7 h 12 p 2 kk 4 v ja päivämäärä 2 on 11 min 8 h 16 p 3 kk 4 v niin ohjelmasi hyppää suoraan pauseen, koska ensimmäinen if ei ole tosi johtuen siitä, että vuodet ovat samat.
Jos olet syöttänyt aina semmoiset päivämäärät, että v >= v2. Ja noissa vertailuissa on muutenkin jotain häikkää, kuukautta ei verrata ollenkaan ja minuutteja kaksi kertaa. Pikakorjaus:
if(v < v2 || (v == v2 && k < k2) || (v == v2 && k == k2 && p < p2) || (v == v2 && k == k2 && p == p2 && h < h2) || (v == v2 && k == k2 && p == p2 && h == h2 && m < m2) ) // Toivottavasti meni ehdot oikein... { printf("Pvm 1 on vanhempi"); } else { printf("Pvm 2 on vanhempi"); }
JussiR kirjoitti:
Mä meinasin vaan että mikä tuossa mun postaamassa koodissa on vikana kun se ei suorita missään vaiheessa noita printf:ejä vaan hyppää suoraan system("pause"):een kun oon pistäny 2 päivämäärää?
Tämänhetkisessä koodissasi vertaat ensin vuosia, ja jos ensimmäinen on toista pienempi, siirryt virheellisesti vertaamaan kuukausia, vaikka tässä vaiheessa pitäisi todeta, että ensimmäinen päivämäärä on toista vanhempi. Kuukausia pitää verrata vain, jos vuodet ovat yhtä suuret. Tähän tapaan:
if(v1 < v2) printf("Pvm 1 on vanhempi.\n"); else if(v1 > v2) printf("Pvm 2 on vanhempi.\n"); else { // v1 == v2 // kuukausien vertailu }
Järkevintä olisi varmaan tehdä tuo vertailu funktioksi niin koodista tulisi lyhyempää ja selkeämpää.
int vertaa(int v1, int v2, ...) { if(v1 < v2) return -1; if(v1 > v2) return 1; if(k1 < k2) return -1; if(k1 > k2) return 1; if(p1 < p2) return -1; ... return 0; // yhtä suuret }
Tuossa siis palautetaan arvo -1 tai 1 sen mukaan, kumpi päivämääristä on vanhempi. Jos vuodet ovat yhtä suuret, kumpikaan ensimmäisistä vertailuista ei palauta tulosta, ja koodi etenee kuukausien vertailuun. Jos nekin ovat yhtä suuret, edetään päiviin jne. Lopuksi palautetaan nolla, jos minuuttienkaan vertailu ei palauta mitään.
Edit: Korjasin funktion parametrejä. Tietysti jonkinlaisen tietueenkin voisi välittää niin ei tarvitsisi tuhottomasti eri parametreja.
Mikäs tässä nyt oli vielä vikana
#include <iostream> #include <sstream> using namespace std; int main(void) { int h, m, p, k , v, h2, m2, p2, k2, v2; string pvm; cout << "Anna päivämäärä: "; getline(cin, pvm); istringstream is(pvm); is >> h; is.get(); is >> m; is >> p; is.get(); is >> k; is.get(); is >> v; string pvm2; cout << "Anna päivämäärä 2: "; getline(cin, pvm2); is >> h2; is.get(); is >> m2; is >> p2; is.get(); is >> k2; is.get(); is >> v2; cout << v2; cout << v; system("pause"); } int vertaa(int v1, int v2, int k1, int k2, int p1, int p2, int h1, int h2, int m1, int m2) { if(v1 < v2) return -1; if(v1 > v2) return 1; if(k1 < k2) return -1; if(k1 > k2) return 1; if(p1 < p2) return -1; if(h1 < h2) return -1; if(h1 > h2) return 1; if(m1 < m2) return -1; if(m1 > m2) return 1; return 0; }
Syötin vuosiluvuiksi 1111 ja 2008 mutta coutit tulostivat tekstin "21111". Eli se ottaa vain ensimmäisen numeron toisen päivämäärän vuosiluvusta.
EDIT: Näyttää siltä että kaikki pvm2:en arvot on mitä sattuu.
Siinä on se vika, että luet pvm2:n tiedot merkkijonovirrasta is, jonka olet alustanut pvm1:n tiedoilla ja josta on kaikki jo luettu. Asia korjaantuu kun toisen getlinen jälkeen teet merkkijonovirran, jonka alustat pvm2:lla (istringstream plaa(pvm2);) ja luet siitä.
Mulla on nyt tälleen mutta se valittaa riviä 22 ja 10 jossa on tuo toinen istringstream juttu.
#include <iostream> #include <sstream> using namespace std; int main(void) { int h, m, p, k , v, h2, m2, p2, k2, v2; string pvm; cout << "Anna päivämäärä: "; getline(cin, pvm); istringstream is(pvm); is >> h; is.get(); is >> m; is >> p; is.get(); is >> k; is.get(); is >> v; string pvm2; cout << "Anna päivämäärä 2: "; getline(cin, pvm2); is >> h2; is.get(); is >> m2; is >> p2; is.get(); is >> k2; is.get(); is >> v2; if(v < v2) printf("Pvm 1 on vanhempi \n"); else if(v > v2) printf("Pvm 2 on vanhempi \n"); else if(k < k2) printf("Pvm 1 on vanhempi \n"); else if(k > k2) printf("Pvm 2 on vanhempi \n"); else if(p < p2) printf("Pvm 1 on vanhempi \n"); else if(p > p2) printf("Pvm 2 on vanhempi \n"); else if(h < h2) printf("Pvm 1 on vanhempi \n"); else if(h > h2) printf("Pvm 2 on vanhempi \n"); else if(m < m2) printf("Pvm 1 on vanhempi \n"); else if(m > m2) printf("Pvm 2 on vanhempi \n"); else printf("Päivämäärät ovat samoja \n"); system("pause"); }
tuossahan on myös se vika, että et kutsu koskaan funktiota vertaa(). Pitäisiköhän tuo yksi kohta olla näin
getline(cin, pvm2); istringstream is(pvm2);
EDIT: Oho tähän oli jo vastattu näin.
EDIT: Se pitää olla varmaan pelkästään is(pvm2), koska se on jo määritetty istringstreamiksi tai jotain kokeilemalla tuon saat jossei tuollein toimi.
Ei toimi mikää noista^^
EDIT sain ohjelman toimimaan näin:
#include <iostream> #include <sstream> using namespace std; int main(void) { int h, m, p, k , v, h2, m2, p2, k2, v2; cout << "Anna kellonaika 1 muodossa tunti minuutti" << endl; cin >> h >> m; cout << "Anna päivämäärä 1 muodossa päivä kuukausi vuosi" << endl; cin >> p >> k >> v; cout << endl << "Anna kellonaika 2 muodosssa tunti minuuti" << endl; cin >> h2 >> m2; cout << "Anna päivämäärä 2 muodossa päivä kuukausi vuosi" << endl; cin >> p2 >> k2 >> v2; if(v < v2) printf("Pvm 1 on vanhempi \n"); else if(v > v2) printf("Pvm 2 on vanhempi \n"); else if(k < k2) printf("Pvm 1 on vanhempi \n"); else if(k > k2) printf("Pvm 2 on vanhempi \n"); else if(p < p2) printf("Pvm 1 on vanhempi \n"); else if(p > p2) printf("Pvm 2 on vanhempi \n"); else if(h < h2) printf("Pvm 1 on vanhempi \n"); else if(h > h2) printf("Pvm 2 on vanhempi \n"); else if(m < m2) printf("Pvm 1 on vanhempi \n"); else if(m > m2) printf("Pvm 2 on vanhempi \n"); else printf("Päivämäärät ovat samoja \n"); system("pause"); }
Sisennät väärin nuo else if hässäkät kaikki pitäisi olla samassa tasossa tuon cin >> p2 >> k2 >> v2; kanssa
#include <iostream> #include <sstream> #include <string> using namespace std; struct Pvm { int v, k, p, h, m; }; bool onkoEkaVanhempi(Pvm* eka, Pvm* toka); void luePvm(Pvm* pvm); int main(void) { Pvm eka, toka; luePvm(&eka); luePvm(&toka); if (onkoEkaVanhempi(&eka, &toka)) { cout << "Eka vanhempi!\n"; } else { cout << "Toka vanhempi!\n"; } #ifdef WIN32 system("pause"); #endif return 0; } bool onkoEkaVanhempi(Pvm* eka, Pvm* toka) { return (eka->v < toka->v || (eka->v == toka->v && eka->k < toka->k) || (eka->v == toka->v && eka->k == toka->k && eka->p < toka->p) || (eka->v == toka->v && eka->k == toka->k && eka->p == toka->p && eka->h < toka->h) || (eka->v == toka->v && eka->k == toka->k && eka->p == toka->p && eka->h == toka->h && eka->m < toka->m)); } void luePvm(Pvm* pvm) { string spvm; cout << "Anna päivämäärä (hh:mm p.kk.v): "; getline(cin, spvm); istringstream is(spvm); is >> pvm->h; is.get(); is >> pvm->m; is >> pvm->p; is.get(); is >> pvm->k; is.get(); is >> pvm->v; }
Toimii \o/
Aihe on jo aika vanha, joten et voi enää vastata siihen.