Gå til innhold

To ting,- prototyp og en "bool"-funksjon ..?


Anbefalte innlegg

Driver og jobber med en innleveringsoppgave i C++, og trenger hjelp (nok en gang... :blush: ).

 

Har to ting jeg lurer på.

 

1.

Det første jeg lurer på er et rent teori spørsmål som lyder:

 

Vi har følgende prototyp:

 

void test(int &x, int &y);

Hvorfor får vi kompileringsfeil hvis vi skriver

 

test(5, 8);

test(x*y, x);

 

 

2.

Spørsmål to er knyttet til en større programmeringsoppgave.

 

Programmet jeg har skrevet er ganske stort, men det fungerer stort sett som det skal. Problemet er at det er en funksjon jeg ikke får til å fungere.

Funksjonen er:

bool lovligTid(int timer, int minutter, int @minuttFraMidnatt) {

if(timer >= 0 && timer <= 23 && minutter >= 0 && minutter <= 59) {
 minuttFraMidnatt = (timer * 60) + minutter;
 return true;
}
else return false;
}

 

Feilmeldingen jeg får er:

error C2018: unknown character '0x40'

error C2018: unknown character '0x40'

 

Denne erroren viser til

 

-funksjonsdeklarasjonen (prototypen) øverst i programmet:

bool lovligTid(int timer, int minutter, int @minuttFraMidnatt);

 

samt

 

-funksjonshodet

bool lovligTid(int timer, int minutter, int @minuttFraMidnatt) {

 

 

Noen som kan se hva som er feil? :cry:

 

 

Hele programmet ser slik ut:

#include <string>
#include <iostream>
using namespace std;

const int prisRedusertTakst = 14;
const int prisOrdinerTakst  = 21;
const int startPris         = 59;


void delOpp(string tidspunkt, int &time, int &minutt);                              //OPPGAVE A
bool lovligTid(int timer, int minutter, int @minuttFraMidnatt);                            //OPPGAVE B
void finnTakst(int antMinutterFraMidnatt, int &ordiner, int &redusert);              //OPPGAVE C
void finnTakstGittStartOgSlutt(int start, int slutt, int &ordiner, int &redusert);     //OPPGAVE D
void finnSamtalePris(string startTidspunkt, string sluttTidspunkt, int &kroner, int &ore); //OPPGAVE E


int main() {
char svar;
int kroner = 0;
int ore    = 0;

do {

 cout << "Skriv inn start-tidspunkt (tt:mm): " << endl;
 string startTidspunkt;
 cin >> startTidspunkt;

 cout << "Skriv inn slutt-tidspunkt (tt:mm): " << endl;
 string sluttTidspunkt;
 cin >> sluttTidspunkt;

 finnSamtalePris(startTidspunkt, sluttTidspunkt, kroner, ore);

 cout << "Samtaleprisen blir: " << kroner << " kroner, og " << ore << " ore." << endl;

 cout << endl << "Flere beregninger? (j/n): " << endl;
 cin >> svar;
} while (svar == 'j' || svar == 'J');
return 0;
}//MAIN



//OPPGAVE A - Funksjon som leser inn et tidspunkt på formen tt:mm (f.eks. 19:30)
//Dele opp tekststrengen slik at timene blir en variabel og minuttene en annen. 
//Disse variablene er ut-argumenter fra funksjonen
void delOpp(string tidspunkt, int &time, int &minutt) { 
while(tidspunkt[2] != ':' || tidspunkt.length() != 5) {//Sjekker at tidspunktet er skrevet riktig
 cout << "Du har skrevet inn feil. Skriv inn paa formen tt:mm !!" << endl;
 cin >> tidspunkt;
}

string stime(2, 'X');
string sminutt(2, 'X');

stime[0] = tidspunkt[0];
stime[1] = tidspunkt[1];

sminutt[0] = tidspunkt[3];
sminutt[1] = tidspunkt[4];

//omformer fra string til int
time   = atoi(stime.c_str());
minutt = atoi(sminutt.c_str());

}


//OPPGAVE B - Funksjon som finner ut om et tidspunkt gitt som timer og minutter er lovlig eller ikke 
//(dvs. funksjonen skal ha returtype bool). 
//Det er lovlig hvis timen er mellom 0 og 23 og minuttet mellom 0 og 59. 
//Hvis det er lovlig, skal et ut-argument fortelle hvor mange minutter fra midnatt det representerer.
bool lovligTid(int timer, int minutter, int @minuttFraMidnatt) {

if(timer >= 0 && timer <= 23 && minutter >= 0 && minutter <= 59) {
 minuttFraMidnatt = (timer * 60) + minutter;
 return true;
}
else return false;
}


//OPPGAVE C
//Funksjonen forutsetter at samtalen ikke varer mer enn ett døgn.
void finnTakst(int antMinutterFraMidnatt, int &ordiner, int &redusert) {

//avsluttes før kloken 08:00
if(antMinutterFraMidnatt > 0 && antMinutterFraMidnatt <= 480) {
 redusert = antMinutterFraMidnatt; 
 ordiner  = 0;
}

//avsluttes mellom 08:00 og 17:00
else if(antMinutterFraMidnatt > 480 && antMinutterFraMidnatt <= 1020) {
 redusert = 480;
 ordiner  = antMinutterFraMidnatt - 480;
}
//avsluttes mellom 17:00 og 24:00
else if(antMinutterFraMidnatt > 1020 && antMinutterFraMidnatt <= 1440) {
 ordiner  = 1020 - 480;
 redusert = antMinutterFraMidnatt - ordiner;
}
else { // Samtalen varer mer enn 24 timer! 
 redusert = -1;
 ordiner  = -1;
}
}



//OPPGAVE D
//Benytter funksjon void finnTakst() to ganger
//Forutsetter at start og slutt er gitt som minutter fra midnatt
void finnTakstGittStartOgSlutt(int start, int slutt, int &ordiner, int &redusert) {
int ordiner1   = 0;
int redusert1  = 0;
int ordiner2   = 0;
int redusert2  = 0;

finnTakst(start, ordiner1, redusert1);
finnTakst(slutt, ordiner2, redusert2);

ordiner  = ordiner2 - ordiner1;
redusert = redusert2 - redusert1;
}

//OPPGAVE E --> Funksjon som beregner kostnaden ved en samtale
//Ordninær takst = 21 øre per minutt
//Redusert takst = 14 øre per minutt
//Startpris      = 59 øre per samtale
//benytter start/slutt tt:mm
void finnSamtalePris(string startTidspunkt, string sluttTidspunkt, int &kroner, int &ore) {
int startTime   = 0;
int startMinutt = 0;
int sluttTime   = 0;
int sluttMinutt = 0;

int ordinerTakst  = 0;
int redusertTakst = 0;




//Omformer start/slutt-tidspunkt fra tt:mm ---> int time, int minutt
delOpp(startTidspunkt, startTime, startMinutt);
delOpp(sluttTidspunkt, sluttTime, sluttMinutt);

//Må gjøre om tidspunktene til minutter fra midnatt (For bruk i funksjonen finnTakstGittStartOgSlutt())
int startMinFraMidnatt = (startTime * 60) + startMinutt;
int sluttMinFraMidnatt = (sluttTime * 60) + sluttMinutt;

//Benytter så finnTakstGittStartOgSlutt() for å finne antall minutter med ordiner- og redusert-takst.
finnTakstGittStartOgSlutt(startMinFraMidnatt, sluttMinFraMidnatt, ordinerTakst, redusertTakst);

//Kan nå regne ut total kostnad
int totaltAntOre = (ordinerTakst * prisOrdinerTakst) + (redusertTakst * prisRedusertTakst) + startPris;

kroner = totaltAntOre / 100;
ore    = totaltAntOre % 100;
}

Lenke til kommentar
Videoannonse
Annonse

meldingene fra kompileren taler ikke for seg selv?

 

lars@blackbox:~/programming/c++$ g++ -g -Wall a.cpp -o a

a.cpp: In function ‘int main()’:

a.cpp:12: error: invalid initialization of non-const reference of type ‘int&’ from a temporary of type ‘int’

a.cpp:5: error: in passing argument 1 of ‘void test(int&, int&)’

a.cpp:13: error: invalid initialization of non-const reference of type ‘int&’ from a temporary of type ‘int’

a.cpp:5: error: in passing argument 1 of ‘void test(int&, int&)’

Lenke til kommentar

Det dayslepr sier er at du ikke kan gi en temp-variabel som argument til et referanse-argument. Når du leser litt mer om hvordan objekter blir konstruert, destruert, osv. vil du skjønne mer av det der.

 

Foreløpig er det nok å vite at argumentet ikke kan være et svar av en regneopperasjon og funksjonskall som ikke returnerer referanser, siden det er et referanse argument.

 

Edit: Skrev litt utydlig

Endret av zirener
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...