Kezdőoldal » Számítástechnika » Programozás » Ezt hogyan csináljam meg c++ ban?

Ezt hogyan csináljam meg c++ ban?

Figyelt kérdés

Van 8 darab dátum ami string dates[8] ban van tárolva.

Ebben a tömbben szeretném növekvő sorrendbe rakni azt a 8 dátumot.


Láttam egy hasonló nemrég kiírt kérdést itt a gyakorin de ott csak az évek alapján kellett sorrendbe rakni úgy meg is tudtam csinálni.


A pont karakterrel vannak elválasztva a bekért dátumok.

Így néz ki a stringben a dátum:

1991.12.04


Ha az év megegyezik akkor a 12 kellene megvizsgálni ha pedig az is megegyezik akkor pedig a napokat kellene megvizsgálni.


Nem tudom leprogramozni.Nem sikerül leprogramoznom.Az algoritmus az megvan fejben.


Az atoi függvénnyel átkonvertálom a stringet egésszen addig amíg ponthoz nem ér.

Ez könnyű:


if(atoi(dates[i].c_str()) > atoi(dates[j].c_str()))

Ha igen akkor csere.


Ha kisebb akkor continue parancs és jön a következő ellenőrzés.


Ha egyenlő akkor hogyan tovább?

???


Meg kéne szerezni a string első pont utánni értéket.

És összehasonlítani őket.

Ha nagyobb akkor csere


Ha egyenlő akkor a második pont utáni értéket és összehasonlítani.

Ha nagyobb akkor csere.

Ha egyenlő ez is úgy marad.


De oda kell figyelni mert a dátumot ilyen módon kell megadni: 02 hogyha kevesebb mint tízet akarunk beadni mondjuk a hónapnál vagy a napnál.


Nem tudom megcsinálni.Segítsetek.


2012. dec. 19. 22:48
1 2
 1/11 zsomkovacs ***** válasza:
Amennyiben stringben tárolsz yyyy.mm.dd formátumú dátumokat, akkor még atoi sem kell. Ha a rendezésben mindig i<j, akkor cserélsz, ha dates[i].compare(dates[j])>0. Ez azért működik, mert ha ezeket a dátumokat ABC-sorrendbe rakod, akkor növekvő sorrendben is lesznek.
2012. dec. 19. 23:25
Hasznos számodra ez a válasz?
 2/11 A kérdező kommentje:
Nem értem,hogy hogyan akarod megvalósítani.
2012. dec. 20. 00:09
 3/11 anonim ***** válasza:
Azt mondja hogy ha olyan formába vannak a dátumok hogy 4 jegy évszám, pont, 2 jegy hónap, pont, 2 jegy nap akkor nem kell semmit konvertálgatni hanem csak string-ekként sorba rakni, pont jó lesz.
2012. dec. 20. 00:22
Hasznos számodra ez a válasz?
 4/11 A kérdező kommentje:

"Ez azért működik, mert ha ezeket a dátumokat ABC-sorrendbe rakod, akkor növekvő sorrendben is lesznek."


Nem értem hogy mit akarsz mondani nekem ezzel a mondatoddal.

Egyébként sikerült megcsinálnom a feladatot.


-------

#include<iostream>

#include<string>

using namespace std;

typedef unsigned short ushort;


int main(){

const ushort datumokSzama = 4;

string datumok[datumokSzama];


cout << "Adj be 8 datumot:\n";

for(ushort i = 0; i < datumokSzama; ++i){

cout << i+1 << " datum: ";

getline(cin, datumok[i], '\n');

}


for(ushort i = 0; i < datumokSzama; ++i)

for(ushort j = 0; j < datumokSzama; ++j){

if((i == j) || (datumok[i].compare(datumok[j]) == 0))

continue;

else

if(datumok[i].compare(datumok[j]) == 1){

string temp = datumok[i];

datumok[i] = datumok[j];

datumok[j] = temp;

}

}


for(ushort i = 0; i < datumokSzama; ++i)

cout << '\n' << i+1 << " datum: " << datumok[i];


return 0;

}

--------


Amúgy a compare függvény először abc sorrendbe rakja a stringet és utána megállapítja,hogy melyik tartalmaz nagyobb értéket az ABC sorrend szabályai szerint?

2012. dec. 20. 00:37
 5/11 A kérdező kommentje:

De most hogyan is működik ez a függvény?

"01234567"

"01234577"


Ezek közül ha a második stringn keresztül hívom meg a compare metódust akkor erre 1 et fog vissza adni ugye.

Azért mert a másodikban több a nagyobb érték?


Vagy hogy működik?

2012. dec. 20. 01:03
 6/11 zsomkovacs ***** válasza:

Ne azt vizsgáld, hogy a compare 1-et ad-e vissza, hanem hogy nullánál nagyobb értéket ad-e. A függvény specifikációja ugyanis:


s.compare(t), ahol s és t stringek:

0, ha s==t

negatív, ha az első karakter, ami különbözik a két stringben, kisebb kódú s-ben, mint t-ben,

pozitív, ha ennek a karakternek a kódja nagyobb s-ben, mint t-ben.


Tehát

s="0123", t="0123": s.compare(t)==0


s="0143", t="0123":

az első eltérés a harmadik karakternél van és '4'>'2', ezért s.compare(t)>0.


A specifikáció nem garantálja, hogy 1 lesz, bármely pozitív szám lehet (pl. lehetne az első különböző karakter indexe, ami még nem is lenne hülyeség).


Tehát nem a string karaktereit tesz ABC-sorrendbe, hanem két stringet hasonlít össze, hogy melyik lenne előrébb, ha ABC-sorrendben rendeznénk. (egyébként az ABC-sorrend nem teljesen korrekt, igazából az ASCII-kódtábla szerint rendez - ez ékezetes betűknél gondot okoz)


A continue-t felejtsd el, teljesen felesleges. A ciklusmag kb. így kéne, hogy kinézzen:


if (datum[i].compare(datum[j]>0)

{

//csere

}


A ciklusban pedig i 0-tól (n-2)-ig, j pedig (i+1)-től (n-1)-ig menjen. Most mindent kétszer ellenőrzöl. Pl. összehasonlítod a 2. és 4. elemet, majd a 4. és 2. elemet is, ami ugyanaz.

2012. dec. 20. 09:28
Hasznos számodra ez a válasz?
 7/11 zsomkovacs ***** válasza:
A ciklusmagban a datum[j] után lemaradt egy ). Remélem, több hiba nem maradt benne.
2012. dec. 20. 09:33
Hasznos számodra ez a válasz?
 8/11 A kérdező kommentje:

for(ushort i = 0; i < datumokSzama-2; ++i)

for(ushort j = i+1; j < datumokSzama-1; ++j){

if(datumok[i].compare(datumok[j]) > 0){

string temp = datumok[i];

datumok[i] = datumok[j];

datumok[j] = temp;

}

}


Nem működik jól a ciklus.

Nem lehet máshogy megcsinálni.

2012. dec. 20. 13:01
 9/11 zsomkovacs ***** válasza:
A ciklusfeltételbe <=-t írj kisebb helyett mindkét esetben.
2012. dec. 20. 15:15
Hasznos számodra ez a válasz?
 10/11 anonim ***** válasza:

#include <vector>

#include <string>

#include <algorithm>


bool CompareCallback(std::string a, std::string b)

{

return a.compare(b) < 0; //ellenkezo rendezeshez >0

}


typedef std::vector<std::string> StringArray;


int main()

{

StringArray Dates;


// itt feltoltod a dates-s majd:


std::sort(Dates.begin(),Dates.end(),CompareCallback);


// kiiratas

}



Nézd át ezt:

[link]

2012. dec. 20. 18:44
Hasznos számodra ez a válasz?
1 2

Kapcsolódó kérdések:





Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!