Marius13 Skrevet 26. september 2013 Del Skrevet 26. september 2013 Hei har et problem med min four løkke som inneholder structer og temp. Målet med løkka er at jeg skal kunne skrive inn i temp, hva som tid1 og tid2 skal være. For å slippe en haug med if og else for å skrive dobbelt opp med kode. Jeg kan KUN bruke det som er her, og problemet når jeg kjører denne koden er at jeg får samme tidsspunkt på tid1 og tid2 som dere ser under på bildet. Jeg vil bruke temp til å "overskrive" verdiene som er i tid1 og tid2 ( det er det oppgaven går ut på) #include <cstdlib> #include <iostream> using namespace std; struct tid { int time; int minutt; int sekund; }; char svar; int differanse; int i; int main() { tid tid1 = {20, 30, 45}; tid tid2 = {19, 25, 55}; tid temp; for (i = 1; i<3; i++) { cout << "\nStartverdi pA tid nummer "<<i<<" er: " <<start.time<<":"<<start.minutt<<":"<<start.sekund<< endl; cout << "\nVil du endre pA tiden? (j / n)?\n" << endl; cin >> svar; if (svar == 'j'|| 'J') { cout <<"\nSkriv inn ny tid: \n" << endl; cin >> temp.time >> temp.minutt >> temp.sekund; } if (i==1) { tid1==temp; } cout <<"\n"<<tid1.time<<":"<<tid1.minutt<<":"<<tid1.sekund<<endl; if (i==2) { tid2==temp; } } system("PAUSE"); return 0; } Lenke til kommentar
Jaffe Skrevet 26. september 2013 Del Skrevet 26. september 2013 Du skriver tid1 == temp og tid2 == temp der du antageligvis mener tid1 = temp og tid2 = temp. Lenke til kommentar
Marius13 Skrevet 26. september 2013 Forfatter Del Skrevet 26. september 2013 Du skriver tid1 == temp og tid2 == temp der du antageligvis mener tid1 = temp og tid2 = temp. Fortsatt samme feil får kun kjørt ut den første temp verdien :/ Lenke til kommentar
Lycantrophe Skrevet 26. september 2013 Del Skrevet 26. september 2013 (endret) Ikke rart folk mister sansen for C++ når det er sånt her som læres bort. Also, Windows :/ Ok, vi får ta et lite crash course. Feil #1: Norske identifikatorer. Slutt med det med en gang. Feil #2: svar, differanse og i trenger ikke være globale. De bør heller ikke være det. Vet du hva dette vil si? Man kan argumentere for at for et såpass trivielt program spiller det ingen rolle, men det er svært dårlig stil og før eller senere vil (unødvendige) bugs dukke opp. Det er heller ikke mindre jobb å ha de scopet, så gjør nå engang det. Feil #3: tid tid1 = {...}. Dropp assignment (likhetstegn) og brukt constructoren direkte. time t1 { 10, 20, 30 }; Feil #4: Ikke-nødvendig, ikke-obvious assignment av ikke-lokal i for(). Feil: for( i = 1; i < 3; ++i ) Riktig: for( int i = 1; i < 3; ++i ) Feil #5: Du har plassert dette i en løkke, men du spesial-håndterer alle tilfeller med if-s. Hvorfor har du da løkken? Still gjerne spørsmål om noe er uklart her. --- Til bug-en din: du bruker == der du mener =. == er likhetsoperatoren og returnerer true eller false. Sett tid1 = temp og tid2 = temp så bør det fungere. Du får bare skrevet ut den første temp-verdien fordi du ikke har noen kode til å skrive ut den andre. --- Det jeg gjerne vil vite er hvorfor i all verden de krever at du skal bruke en temp for dette. Det er antagelig den absolutt dårligste måten å løse problemet på. Endret 26. september 2013 av Lycantrophe 1 Lenke til kommentar
Marius13 Skrevet 26. september 2013 Forfatter Del Skrevet 26. september 2013 Ikke rart folk mister sansen for C++ når det er sånt her som læres bort. Also, Windows :/ Ok, vi får ta et lite crash course. Feil #1: Norske identifikatorer. Slutt med det med en gang. Feil #2: svar, differanse og i trenger ikke være globale. De bør heller ikke være det. Vet du hva dette vil si? Man kan argumentere for at for et såpass trivielt program spiller det ingen rolle, men det er svært dårlig stil og før eller senere vil (unødvendige) bugs dukke opp. Det er heller ikke mindre jobb å ha de scopet, så gjør nå engang det. Feil #3: tid tid1 = {...}. Dropp assignment (likhetstegn) og brukt constructoren direkte. time t1 { 10, 20, 30 }; Feil #4: Ikke-nødvendig, ikke-obvious assignment av ikke-lokal i for(). Feil: for( i = 1; i < 3; ++i ) Riktig: for( int i = 1; i < 3; ++i ) Feil #5: Du har plassert dette i en løkke, men du spesial-håndterer alle tilfeller med if-s. Hvorfor har du da løkken? Still gjerne spørsmål om noe er uklart her. --- Til bug-en din: du bruker == der du mener =. == er likhetsoperatoren og returnerer true eller false. Sett tid1 = temp og tid2 = temp så bør det fungere. Du får bare skrevet ut den første temp-verdien fordi du ikke har noen kode til å skrive ut den andre. --- Det jeg gjerne vil vite er hvorfor i all verden de krever at du skal bruke en temp for dette. Det er antagelig den absolutt dårligste måten å løse problemet på. Takk for et godt svar, tiltross for at noe av det bryter med noe av det vi MÅ ha, ellers blir det retur av oblig og ikke godkjent. Jeg vil ha det i en for løkke for å få minst mulig kode ( noe jeg ikke har fått til etter kommentar fra deg:P) men hvis dette skal løses på kortest mulig måte hva ville du gjort? ta til betraktning at det skal være på mitt nivå..Jeg skal bruke temp mest MULIG. her er oppgaven hvis du bryr deg http://www.ansatt.hig.no/frodeh/grprog/obliger/oblig_3.pdf Lenke til kommentar
Lycantrophe Skrevet 26. september 2013 Del Skrevet 26. september 2013 Du hadde fått mindre kode hadde du droppet løkken. "Bruk heller en" betyr ikke at du må en temp, men at det er et bedre alternativ enn å duplisere kode. Oppgaven er dårlig, men temp-løsningen her er enda dårligere. Lenke til kommentar
Marius13 Skrevet 26. september 2013 Forfatter Del Skrevet 26. september 2013 Du hadde fått mindre kode hadde du droppet løkken. "Bruk heller en" betyr ikke at du må en temp, men at det er et bedre alternativ enn å duplisere kode. Oppgaven er dårlig, men temp-løsningen her er enda dårligere. Jaja får bare prøve meg fram... :/ Lenke til kommentar
dbass Skrevet 26. september 2013 Del Skrevet 26. september 2013 Frode lagde akkurat samme oppgave i fjor. Min ble på 103 linjer ferdig kortet ned, så ikke vær redd Tips; Lag en voidfunksjon som kun skriver ut tempverdier. i for-løkken din, dytt tid "i" inn i temp. Tiden "i" er følgende: kall på voidfunksjon Endre? (Y/N) Hvis endre, skriv inn i temp. Hvis ukorrekte verdier, gjør på nytt Kopier tilbake til tid "i" For-løkke slutt regn ut tid, og finn ut hva som kommer først. Bruk her også void for å skrive ut korrekte verdier. Lenke til kommentar
Marius13 Skrevet 26. september 2013 Forfatter Del Skrevet 26. september 2013 Frode lagde akkurat samme oppgave i fjor. Min ble på 103 linjer ferdig kortet ned, så ikke vær redd Tips; Lag en voidfunksjon som kun skriver ut tempverdier. i for-løkken din, dytt tid "i" inn i temp. Tiden "i" er følgende: kall på voidfunksjon Endre? (Y/N) Hvis endre, skriv inn i temp. Hvis ukorrekte verdier, gjør på nytt Kopier tilbake til tid "i" For-løkke slutt regn ut tid, og finn ut hva som kommer først. Bruk her også void for å skrive ut korrekte verdier. Takk for svar hadde brukt void om vi kunne.. vi lærte om void i dag, og dette er oblig som ble levert ut forgje uke.. litt dumt etter min mening ettersom det vi lærte i dag om void er vesentlig lettere.. Lenke til kommentar
dbass Skrevet 26. september 2013 Del Skrevet 26. september 2013 (endret) Jeg fikk også i min oppgave 4 tidstructer med 3 inter hver, 5 konster, 4 globale inter, 1 global char og 1 void-funksjon. Ikke at dette er noe fasit, for jeg ser mange steder jeg kunne kortet ned og skrevet annerledes. Jeg vil anbefale deg å jobbe i gruppe med andre, så kan dere rette på hverandre og gi hverandre idéer og evt. lese hverandres kode for å feilsøke og/eller rette. Ang. void, så lærte vi også det i uka etter hvor obligen ble levert, men jeg ser ingen grunn til å ikke bruke void når dere har lært det før obligen skal inn. Endret 26. september 2013 av dbass Lenke til kommentar
Lycantrophe Skrevet 26. september 2013 Del Skrevet 26. september 2013 (endret) #include <iostream> struct timestamp { int hour, min, sec; }; // overload handles the prepend-0 issue std::ostream& operator<<( std::ostream& stream, const timestamp& ts ) { return stream << (ts.hour < 10 ? "0" : "") << ts.hour << ":" << (ts.min < 10 ? "0" : "") << ts.min << ":" << (ts.sec < 10 ? "0" : "") << ts.sec; } timestamp modify( const timestamp& ts, const std::string& name ) { std::cout << name << "'s starting value is: " << ts << "\nWould you like to modify it? [y/n] "; std::cout.flush(); char response; std::cin >> response; // If no modification; return original if( !( response == 'y' || response == 'Y' ) ) return ts; int hour, min, sec; // Ser du hvorfor jeg gjør dette? // Ser du også hva du kan gjøre her for å redusere mengden kode? hour = min = sec = -1; while( hour < 0 || hour > 23 ) { std::cout << "Please enter hour [0-23]: "; std::cout.flush(); std::cin >> hour; } while( min < 0 || min > 59 ) { std::cout << "Please enter minutes [0-59]: "; std::cout.flush(); std::cin >> min; } while( sec < 0 || sec > 59 ) { std::cout << "Please enter seconds [0-59]: "; std::cout.flush(); std::cin >> sec; } return timestamp { hour, min, sec }; } int main() { timestamp t1 { 20, 30, 45 }; timestamp t2 { 19, 25, 55 }; t1 = modify( t1, "Time1" ); t2 = modify( t2, "Time2" ); std::cout << "Modified:\n" << t1 << "\n" << t2 << std::endl; } Jeg har latt noen ting være igjen (som jeg ellers ikke ville gjort). Som en øvelse kan du jo alltids se på hva det er og hvorfor. :---) --- Noen notes: Denne snutten bruker C++11. Jeg antok det gikk fint siden du allerede brukte {}-syntax for structs. Før C++11 ble det ansett som dårlig skikk å returnere structs eller objekter fra funksjoner. Her vil jeg ikke se på det som noe problem av to grunner: #1: den er nesten triviell i størrelse (3 ints) #2: C++11, så move semantics kicker inn. Endret 26. september 2013 av Lycantrophe Lenke til kommentar
jonny Skrevet 26. september 2013 Del Skrevet 26. september 2013 Det ligger en tråd med en lignende oppgave her på forumet fra i fjor, kanskje den kan være interessant. Lenke til kommentar
Marius13 Skrevet 26. september 2013 Forfatter Del Skrevet 26. september 2013 #include <iostream> struct timestamp { int hour, min, sec; }; // overload handles the prepend-0 issue std::ostream& operator<<( std::ostream& stream, const timestamp& ts ) { return stream << (ts.hour < 10 ? "0" : "") << ts.hour << ":" << (ts.min < 10 ? "0" : "") << ts.min << ":" << (ts.sec < 10 ? "0" : "") << ts.sec; } timestamp modify( const timestamp& ts, const std::string& name ) { std::cout << name << "'s starting value is: " << ts << "\nWould you like to modify it? [y/n] "; std::cout.flush(); char response; std::cin >> response; // If no modification; return original if( !( response == 'y' || response == 'Y' ) ) return ts; int hour, min, sec; // Ser du hvorfor jeg gjør dette? // Ser du også hva du kan gjøre her for å redusere mengden kode? hour = min = sec = -1; while( hour < 0 || hour > 23 ) { std::cout << "Please enter hour [0-23]: "; std::cout.flush(); std::cin >> hour; } while( min < 0 || min > 59 ) { std::cout << "Please enter minutes [0-59]: "; std::cout.flush(); std::cin >> min; } while( sec < 0 || sec > 59 ) { std::cout << "Please enter seconds [0-59]: "; std::cout.flush(); std::cin >> sec; } return timestamp { hour, min, sec }; } int main() { timestamp t1 { 20, 30, 45 }; timestamp t2 { 19, 25, 55 }; t1 = modify( t1, "Time1" ); t2 = modify( t2, "Time2" ); std::cout << "Modified:\n" << t1 << "\n" << t2 << std::endl; } Jeg har latt noen ting være igjen (som jeg ellers ikke ville gjort). Som en øvelse kan du jo alltids se på hva det er og hvorfor. :---) --- Noen notes: Denne snutten bruker C++11. Jeg antok det gikk fint siden du allerede brukte {}-syntax for structs. Før C++11 ble det ansett som dårlig skikk å returnere structs eller objekter fra funksjoner. Her vil jeg ikke se på det som noe problem av to grunner: #1: den er nesten triviell i størrelse (3 ints) #2: C++11, så move semantics kicker inn. Tusen takk, hjelper meg utrolig mye setter pris på at du tok deg tid til å hjelpe en dum faen som meg innen programmering Det ligger en tråd med en lignende oppgave her på forumet fra i fjor, kanskje den kan være interessant. Takk skal du ha Lenke til kommentar
Glutar Skrevet 27. september 2013 Del Skrevet 27. september 2013 (endret) Noen notes: Denne snutten bruker C++11. Jeg antok det gikk fint siden du allerede brukte {}-syntax for structs. Før C++11 ble det ansett som dårlig skikk å returnere structs eller objekter fra funksjoner. Her vil jeg ikke se på det som noe problem av to grunner: #1: den er nesten triviell i størrelse (3 ints) #2: C++11, så move semantics kicker inn. De aller fleste compilere selv lenge før C++11 skal være oppegående nok til å optimalisere bort kopieringen ved retur av lokale objekter. Tviler veldig på at return statementen over vil føre til en kopiering i C++98 Endret 27. september 2013 av Glutar Lenke til kommentar
Lycantrophe Skrevet 28. september 2013 Del Skrevet 28. september 2013 Mulig. For slike trivielle, ikke-allokerende structer er det uansett uvesentlig. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå