Permalänk
Medlem

Busstidtabell C++

Jag håller på med att skriva in en busstidtabell i c++, så man kan skriva in vilken tid det är och se när nästa buss går.
Men efter ett tag förstod jag att det kommer bli väldans mycket if-satser, om jag fortsätter att koda som jag gör nu.

T.ex:
if (tiden<7.23)
cout << "Nästa buss går 7.25"

etc...

Vet någon hur jag skulle kunna göra detta på ett annat sätt, så det inte blir flera tusen rader kod?

Permalänk

Vad sägs om detta?

cout << "Nästa buss går " << tiden;

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Isbjörnen Igor
Vad sägs om detta?

cout << "Nästa buss går " << tiden;

Jag hade tänkt att man skriver in vad klockan är, t.ex. 7.24.
Det sparas till 'tiden' och sedan kollas 'tiden' mot if-satserna för att se när nästa buss går.
Om man skriver som du gör blir det väl "Nästa buss går " och sedan tiden man matat in?

Permalänk
Medlem

Något liknande detta kanske?

#include <iostream> int main(int argc, char *argv[]) { float tider[] = { 7.25, 7.50, 8.10, 8.45, 9.00, 9.15 }; float tid; std::cout << "Vilken tid? "; std::cin >> tid; for(int i = 0; i < 6; i++) { if(tid < tider[i]) { std::cout << "Nästa buss går kl " << tider[i] << std::endl; break; } } return 0; }

En kontroll för att se om sista bussen gått får du göra själv.

Visa signatur

Scud: The other day, in the park, I was wondering why frisbees look bigger and bigger as they get closer to you
Scud: And then it hit me

Permalänk
Medlem

Hm, kör inte alls med std:: men ok, vet flera som använder det ^^
Därimot undrar jag vad argc char *argv[]
står för? Eller vad de har för funktion?

Permalänk

argc talar om hur många argument programmet fick när det startades och argv innehåller argumenten. Kortfattat men nu vet du.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Soviac
Hm, kör inte alls med std:: men ok, vet flera som använder det ^^
Därimot undrar jag vad argc char *argv[]
står för? Eller vad de har för funktion?

I just det här fallet har inte argc och argv någon funktion. Jag råkade bara skriva dit det av ren reflex.

Visa signatur

Scud: The other day, in the park, I was wondering why frisbees look bigger and bigger as they get closer to you
Scud: And then it hit me

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Gannon
Något liknande detta kanske?

#include <iostream> int main(int argc, char *argv[]) { float tider[] = { 7.25, 7.50, 8.10, 8.45, 9.00, 9.15 }; float tid; std::cout << "Vilken tid? "; std::cin >> tid; for(int i = 0; i < 6; i++) { if(tid < tider[i]) { std::cout << "Nästa buss går kl " << tider[i] << std::endl; break; } } return 0; }

En kontroll för att se om sista bussen gått får du göra själv.

Men om jag lägger upp fler tider, t.ex. fram till 12.05, och ändrar så man ser dit fram blir det väldigt många avgångar den visar om man skulle skriva t.ex 7.10.
Hur kan jag göra så att det bara visar t.ex. 5 av de första resultaten som kommer fram?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Gannon
Något liknande detta kanske?

#include <iostream> int main(int argc, char *argv[]) { float tider[] = { 7.25, 7.50, 8.10, 8.45, 9.00, 9.15 }; int tid; std::cin >> tid; for(int i = 0; i < 6; i++) { if(tid < tider[i]) { break; } } return 0; }

Är man tvungen att manuellt "definiera" värdet för hur många vad-de-nu-kallas som tider består av i for-satsen, eller finns det en liknande funktion till PHP's count() i C?
I php hade man kunnat skriva

for (int $i = 0; $i < count($tider); $i++) {

Men vad jag har sett finns det ingen motsvarighet för detta i C. Om det inte finns något bibliotek som har denna funktionen?

Visa signatur

WS/Server: GA-P55A-UD3 - Intel Core i5-750 - 24 GB DDR3 - Samsung 850 PRO 256 GB - 35 TB SAS HDD - ATi 3D-Rage II+ - ESI Juli@ - Fractal Design Define R2
Laptop: MacBook Pro 13" late 2011, 2.4 GHz, 8 GB, 256 GB SSD

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Pinkevin
Är man tvungen att manuellt "definiera" värdet för hur många vad-de-nu-kallas som tider består av i for-satsen, eller finns det en liknande funktion till PHP's count() i C?
I php hade man kunnat skriva

for (int $i = 0; $i < count($tider); $i++) {

Men vad jag har sett finns det ingen motsvarighet för detta i C. Om det inte finns något bibliotek som har denna funktionen?

int a[] = {2, 4, 7, 8, 9, 11, 13}; //Skriver ut 7 std::cout << sizeof(a) / sizeof(int) << std::endl;

Jag vet dock inte om det här fungerar om man allokerar minnet dynamiskt.

Visa signatur

Vill du ha svar? Citera mig gärna.

Permalänk
Medlem

std::vector<float> vec; std::ifstream file("fil_med_tider.txt); float tmp; while(file.good()){ file >> tmp; vec.push_back(tmp); }

Då har du tiderna i en vektor och kan roa dig med att ta ut antalet, och sortera dem och ha dig
Sedan accessar du dem med vec[i].

Det går att göra snyggare med en istream iteratorn men då blir det kanske lite mer avancerat.

Visa signatur

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.

Permalänk
Medlem

vet inte om detta funkar.. men

#include <iostream> using namespace std; int main() { // Definiera tider som bussen går float tider[] = { 7.25, 8.00, 8.25, 9.00, 9.25, 10.00, 10.25, 11.00 }; float tid; int iStart; // Skriv in tiden cin >> tid; // Undersök vart i tidtabellen vi ska börja. for(int a = 0; a < sizeof(tider); a++) { if(tider[a] >= tid) { iStart = a; break; // Hoppa ur for-loopen så vi inte får nästa tid som starttid } } // skriv ut dom 5 kommande bussarna. for(int i = iStart; i < (iStart + 5); i++) { cout << tider[i] << endl; } return 0; }

har inte provat det själv än...

Visa signatur

C#/MonoGame Fanatiker.
Pixel Artist & Game Developer

Permalänk
Hedersmedlem

AJL: Hmm, du har glömt {} på if-satsen, det är ju två rader i det blocket, inte en.

EDIT: Fel användare.

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem

mOREc: tror du menar min if-sats?

*ändrat nu iaf*

Visa signatur

C#/MonoGame Fanatiker.
Pixel Artist & Game Developer

Permalänk
Hedersmedlem

Öm, ja, det gör jag.
Vart fick jag att det skulle vara totoo's inlägg?

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av m0REc
Öm, ja, det gör jag.
Vart fick jag att det skulle vara totoo's inlägg?

OT: Dom har liknande signaturer.

AJL:

C++
VisualBasic
zScript

totoo:

. C++
. Pocket PC
. Hemelektronik

Har själv blivit förvirrad nån gång.

Visa signatur

Scud: The other day, in the park, I was wondering why frisbees look bigger and bigger as they get closer to you
Scud: And then it hit me

Permalänk

Kanske nåt sånt här?

from datetime import time buslist = [ time(7,25), time(8,00), time(8,25), time(9,00), time(9,25), time(10,00), time(10,25), time(11,00) ] print 'Skriv in en tidpunkt med : som separator' usertime = raw_input() (hours, minutes) = usertime.split(':') usertime = time(int(hours), int(minutes)) avaible = [t for t in buslist if t > usertime] avaible.sort() print u'N\\xe4rmsta l\\xe4mpliga busstider:' for t in avaible[:5]: print t

Visa signatur

Python-IRC på svenska: #python.se

Permalänk
Hedersmedlem

Sebastianj: Sedan är det ju bra om bustime-klassen existerar också. 8]

Visa signatur

Vim
Kinesis Classic Contoured (svart), Svorak (A5)
Medlem i signaturgruppen Vimzealoter.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av lajnold

int a[] = {2, 4, 7, 8, 9, 11, 13}; //Skriver ut 7 std::cout << sizeof(a) / sizeof(int) << std::endl;

Jag vet dock inte om det här fungerar om man allokerar minnet dynamiskt.

Tack. Det var antagligen det jag ville ha!
Två frågor bara.
När kan det hända att man allokerar minnet dynamiskt?
Och, hur kommer det sig att man behöver ta sizeof(x)/sizeof(int), istället för enbart sizeof(x)?

Visa signatur

WS/Server: GA-P55A-UD3 - Intel Core i5-750 - 24 GB DDR3 - Samsung 850 PRO 256 GB - 35 TB SAS HDD - ATi 3D-Rage II+ - ESI Juli@ - Fractal Design Define R2
Laptop: MacBook Pro 13" late 2011, 2.4 GHz, 8 GB, 256 GB SSD

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Pinkevin

Tack. Det var antagligen det jag ville ha!
Två frågor bara.
När kan det hända att man allokerar minnet dynamiskt?
Och, hur kommer det sig att man behöver ta sizeof(x)/sizeof(int), istället för enbart sizeof(x)?

Därför att sizeof(a) ger antal bytes i arrayen a. För att få reda på hur många element den består av behöver du således dela med storleken på en int (vilket oftast är 4 byte).

Visa signatur

5D MkII

Permalänk
Citat:

Ursprungligen inskrivet av m0REc
Sebastianj: Sedan är det ju bra om bustime-klassen existerar också. 8]

Lämnade den som en övning för läsaren.
Orkade inte leta reda på någon time-klass.

Ah, nu fixade jag så det går att köra koden, jag använder datetime.time istället för bus.bustime nu.

Visa signatur

Python-IRC på svenska: #python.se