Gå til innhold

Struct med temp


Anbefalte innlegg

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;

}

ndtr1s.png

Lenke til kommentar
Videoannonse
Annonse

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 av Lycantrophe
  • Liker 1
Lenke til kommentar

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 :p

 

http://www.ansatt.hig.no/frodeh/grprog/obliger/oblig_3.pdf

Lenke til kommentar

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

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

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 av dbass
Lenke til kommentar

#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 av Lycantrophe
Lenke til kommentar
#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

 

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 :p

Endret av Glutar
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...