Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: [Dev-Cpp] Aikaero

Sivun loppuun

JussiR [27.03.2008 11:51:50]

#

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?

teksturi [27.03.2008 12:01:40]

#

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.

JussiR [27.03.2008 15:01:40]

#

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?

TsaTsaTsaa [27.03.2008 16:57:01]

#

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;

Sami [27.03.2008 17:10:20]

#

([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.

JussiR [30.03.2008 18:51:54]

#

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");
}

hunajavohveli [30.03.2008 21:30:32]

#

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.

TsaTsaTsaa [30.03.2008 21:43:57]

#

#include <string>

teksturi [31.03.2008 00:09:36]

#

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.

TsaTsaTsaa [31.03.2008 10:51:41]

#

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.

JussiR [31.03.2008 11:19:44]

#

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ää?

teksturi [31.03.2008 11:38:01]

#

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.

TsaTsaTsaa [31.03.2008 11:44:35]

#

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");
}

hunajavohveli [31.03.2008 11:49:26]

#

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.

JussiR [01.04.2008 09:52:07]

#

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.

TsaTsaTsaa [01.04.2008 10:08:23]

#

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ä.

JussiR [01.04.2008 10:10:45]

#

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");
}

teksturi [01.04.2008 10:11:38]

#

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.

JussiR [01.04.2008 10:20:00]

#

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");
}

teksturi [01.04.2008 10:39:23]

#

Sisennät väärin nuo else if hässäkät kaikki pitäisi olla samassa tasossa tuon cin >> p2 >> k2 >> v2; kanssa

TsaTsaTsaa [01.04.2008 10:55:18]

#

#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/


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta