udvidet spørgsmål til indlæsning af speciel tekstfil

Tags:    c++

hej

jeg sidder med nøjagtig samme tekst fil som der er vist i spørgsmålet stillet af Christopher von Würden. jeg sidder bare med et andet problem. jeg har fået til opgave at indlæse alle retningsobservationer og udskrive dem til en anden tekstfil. retningsobservationer har id-nummer:

1
1
2

hvis man har læst spørgsmålet vil man også se at der forekommer noget der hedder forkortet retningsobservationer, som har id-nummer:

1
2

forkortet retningsobservationer, må kun forekomme såfremt der har været en retningsobservation før. det vil sige at man må godt have tilfældet:

1 702.00
1 15.00
2 0.000
1 14.00
2 19.480

man må også godt have tilfældet:

1 14.00
2 19.480
1 702.00
1 15.00
2 0.000

min opgave er at scanne hele tekstfilen igennem, finde alle retningsobservationer, og forkortet retningsobservationer og udskrive dem til en anden tekstfil. problemet er bare at der er ikke nogen bestemt rækkefølge observationerne kommer i, og jeg har ikke været i stand til at scanne alle observationerne ind korrekt. hvis der er nogen der har et forslag til en maskine der kan gå ind i tekstfilen, og finde alle retningsobservationer, plus forkortet retningsobservationer, og skrive dem ud til en ny tekstfil, ville det være til stor hjælp.

hvis i ikke kan finde tekstfilen er den på linket

http://peecee.dk/upload/download/112185





Jeg tror godt du vil være i stand til, i det mindste, at komme med et udkast til hvordan du kunne forestille dig at den kom til at se ud.

Hint: Den vil nok ikke være meget forskellig fra seq fra main.


hej bertel. jeg har gjordt som du sagde og prøvet at komme med et udkast til hvordan jeg tror det kommer til at se ud:

Fold kodeboks ind/udKode 


jeg er klar over at dette ikke vil komme til at fungere. når jeg kompiler for jeg fejlmeddelsen at der er "no macthing call for function" ved push_back sekvenserne, og ved "cout" får jeg beskeden "no match for operator" ?



Du skal ikke push_back'e på seq, det er den oprindelige liste af linier, du skal oprette en lokal liste og pushe på den.

Opret listen:
std::list<Data> temp;
Og push_back:
temp.push_back(*it);

En std::list<> har ikke en [] operator så dette går ikke:
std::cout<< temp[0] << std::endl;
Du kan enten lave temp om til en std::vector<Data> eller bruge en iterator til at løbe gennem temp



Du skal ikke push_back'e på seq, det er den oprindelige liste af linier, du skal oprette en lokal liste og pushe på den.

Opret listen:
std::list<Data> temp;
Og push_back:
temp.push_back(*it);

En std::list<> har ikke en [] operator så dette går ikke:
std::cout<< temp[0] << std::endl;
Du kan enten lave temp om til en std::vector<Data> eller bruge en iterator til at løbe gennem temp


hej bertel. jeg har prøvet at oprette en vector som du forslog og er kommet frem til følgende kode:

Fold kodeboks ind/udKode 


når den udskriver på plads nummer 0 får jeg værdien 1. det gør jeg også når jeg udskriver værdien på plads nummer 1, men hvis jeg vil have den til at skrive nr eller val ud, ved at skrive:

std::cout<<lseq[0].val<<std::endl;

eller

std::cout<<lseq[0].nr<<std::endl;

får jeg ikke de rigtige værdier. er det fordi den ikke loader val og nr, eller fordi den ikke laver push_back på dem ?



Problemet er i din main().
Der putter du id, nr og val ind i hver sin Data variabel.
De skal alle puttes ind i den samme, som så skal være den der bliver push_back'et på seq.



Problemet er i din main().
Der putter du id, nr og val ind i hver sin Data variabel.
De skal alle puttes ind i den samme, som så skal være den der bliver push_back'et på seq.


status for programmet er nu følgende:

Fold kodeboks ind/udKode 


jeg har gjordt som du sagde og lagt nr,id og val ind i den samme data variabel. når jeg udskriver til skærm, skriver den det samme som har gjordt til at starte med. nu hvor jeg bruger pushback på de 2 første case, hvordan kan jeg så få dem til at udskrive de 2 første linjer ?



Nu mangler du vist bare at udskrive de to linier fra lseq lige efter:
case 2: // 1-1-2



Nu mangler du vist bare at udskrive de to linier fra lseq lige efter:
case 2: // 1-1-2


hej bertel. jeg har gjordt som du sagde og udskrevet de 2 linjer, og det lykkes :). koden ser således ud:
Fold kodeboks ind/udKode 


mit næste problem er nu hvordan jeg får udskrevet de forkortet retningsobservationer. som du kan se i koden, har jeg forsøgt, men der bliver ikke uskrevet noget til skærmen. er det fordi den ikke kan finde nogen tal med den kombination eller er det fordi den kommer efter true ? :|



Hvis du kun skal lede efter den forkortede sekvens efter du har fundet den lange sekvens kan du sætte et flag når du finder den lange sekvens og derefter holde længden på seq på 2 elementer i stedet for 3.

Og lade ValidSeq checke om flaget er sat eller ikke og checke sekvensen derudfra.

Det burde være trivielt.



Hvis du kun skal lede efter den forkortede sekvens efter du har fundet den lange sekvens kan du sætte et flag når du finder den lange sekvens og derefter holde længden på seq på 2 elementer i stedet for 3.

Og lade ValidSeq checke om flaget er sat eller ikke og checke sekvensen derudfra.

Det burde være trivielt.


det tror jeg ikke jeg helt forstår. skal jeg lave en ny if(seq.size()<2). eller skal jeg gribe det an på en anden måde . hvis du kunne uddybe det en lille smule?



Hvis du starter med at oprette et flag:

bool longSeqFound = false;

og sætter dette flag til true når du finder den lange sekvens
case 2: // 1-1-2
longSeqFound = true;

Så laver du to adskilte dele i ValidSeq:

bool ValidSeq(std::list<Data>& seq)
{
if(longSeqFound == false)
{ // ca den øverste halvdel af kode du har nu
}
else
{ // noget kode der ligner det ovenfor men kun kikker efter korte sekvenser
}
}

Husk at holde styr på længden af seq, hvis ikke flaget er sat skal længden gro til 3 hvis flaget er sat skal længden kun være 2



t