Ezt hogyan csináljam meg c++ ban?
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.
"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?
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?
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.
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.
#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:
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!