the_c Skrevet 21. november 2005 Del Skrevet 21. november 2005 Driver og jobber med en innleveringsoppgave i C++, og trenger hjelp (nok en gang... ). 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? 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
Peter Skrevet 21. november 2005 Del Skrevet 21. november 2005 Fjern alfakrøllen så skal du se at det går bra 0x40 = @ Lenke til kommentar
the_c Skrevet 21. november 2005 Forfatter Del Skrevet 21. november 2005 Ooops.. Hadde brukt '@' i stedet for '&'. Takker for den Nazgul. Da er det bare teorispørsmålet som gjenstår (Spørsmål 1).. Lenke til kommentar
dayslepr Skrevet 21. november 2005 Del Skrevet 21. november 2005 meldingene fra kompileren taler ikke for seg selv? lars@blackbox:~/programming/c++$ g++ -g -Wall a.cpp -o aa.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
Dead_Rabbit Skrevet 21. november 2005 Del Skrevet 21. november 2005 (endret) 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 21. november 2005 av zirener Lenke til kommentar
the_c Skrevet 21. november 2005 Forfatter Del Skrevet 21. november 2005 Hadde litt problemer med å se svaret ut i fra dayslepr sitt svar , så det var flotters at du utdypet det litt zirener. Tusen takk til dere alle! 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å