Gå til innhold

Bone's Offisielle C++ hjelpetråd


Anbefalte innlegg

Videoannonse
Annonse

Akkurat :) Det visste jeg ikke. Så de er der fremdeles på en måte?

 

EDIT1: Det går ikke helt som det skal. Hundredelen blir femsifra hvis totaltiden overskrider ett minutt!

 

EDIT2: Nå har jeg fiksa overnevnte problem.. Nå er det et nytt:

s = (int) loper1.tid_hittil;   //Konverter totaltiden til int
m = s / 60;				  //Skiller ut minuttene
h = (loper1.tid_hittil - s) * 100;  //hunderedelene
s %= 60;					   //og sekundene
cout << "\nLøper nr.1 ble parets vinner med tiden: ";
cout << m << ':' << s << ':' << h << '\n';

Nå blir hundredelene alltid én for lite... Hvorfor i alle dager?!

Endret av _Ferrari_
Lenke til kommentar

float tid_hittil = 61.12;
int s = (int) tid_hittil;   //Konverter totaltiden til int
int m = s / 60;				  //Skiller ut minuttene
int h = int(tid_hittil * 100.0f) % 100;  //hunderedelene
s %= 60;					   //og sekundene
cout << "\nLøper nr.1 ble parets vinner med tiden: ";
cout << m << ':' << s << ':' << h << '\n';
cout << "org: " << tid_hittil << endl;
return 0;

 

Gir:

Løper nr.1 ble parets vinner med tiden: 1:1:12

org: 61.12

 

Grunnen til at dette skjer er float avrundinger. Du bør ikke bruke float om du trenger presise tallgengivninger.

Lenke til kommentar

Løser oblig ja.. :p Hva i all verden skal jeg bruke til desimaltall i stedene for float da?

 

EDIT:Hvorfor datamaskina så inni *elvetes dum?

 

Regnestykket: (244,04 - 244) * 100 = 4. Det tar da 3.klassinger i hodet..

I følge datamaskina så er: (244,04 - 244) * 100 = 3.99933

 

MEN: I regnetykket: (48,68 - 48) * 100 = 68 der klarer den faktisk å spytte ut 68..

WTF?

 

I mitt tilfelle, der jeg skal putte sistnevnte tall inn i en int, så det jo ikke rart at vinnertiden alltid blir en hundredel raskere enn det den skulle ha vært!

Endret av _Ferrari_
Lenke til kommentar

Det er ikke dataen som er dum, men desimaltall som er unøyaktig. Flyttall/desimaltall har bare en viss pressisjon, noe som kan gi resultater som du går med 244.04 - 244.

 

Hvis du vil bruke noe annet enn float kan du jo se på double, som har en bedre pressisjon enn float. Eventuelt kan du bruke to int. En som er desimaltallene, og en som er heltallene.

Lenke til kommentar

Oppgaveteksten hindrer meg foråvidt i å bruke en int for hver, og å bruke double i stedet for float.

 

Structen skal inneholde en float tid_hittil som inneholder totaltid i sekunder, med hundredelene som desimaler.

 

Men nå spurte jeg foreleseren, og han sa at det bare fikk være slik. Og helt riktig som dere sier, det har med nøyaktigheten av flyttall å gjøre. Svært lite å få gjort med det, iht oppgaveteksten. Takk for hjelpen :-)

Lenke til kommentar

jeg vil at en løkke skal kjøre så lenge ikke 500, 1000, 1500, 3000, 5000 eller 10000 tastes inn. har klart det samme med array og en bool, men det har vi jo ikke lov til i denne obligen. burde ikke dette her virke?

 

while(a != 500 || a != 1000 || a != .... osv}

 

hvis jeg har flere betingelser i while-løkka så virker ingenting. hva gjør jeg feil? må jeg ha parenteser?

Lenke til kommentar

Hei, bare et kjapt spørsmål:

Er wmain(int argc, wchar_t** argv) microsoft spesifikk?

 

I mitt program har jeg skrevet følgende:

#ifdef WIN32
// Declare wmain as it is used in the windows entry point
int wmain(int argc, wchar_t** argv);

// Wrapper for WinMain entry-point used by Windows
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
int count = 0;
LPWSTR* cmdline = CommandLineToArgvW(GetCommandLineW(), &count);
wmain(count, cmdline);
LocalFree(cmdline);
}

#endif

For å wrappe WinMain til en vanlig main funksjon, men så plutselig falt det meg inn at wmain kunne være Visual C++ spesifikk, og det finnes ikke noen CommandLineToArgvA funksjon etter det jeg kan se.

 

Noen som vet?

 

Grunnen til at jeg la inn dette forresten var fordi x64 ikke ville kompilere uten (dog 32-bit funket av ukjente grunner) og dette er et SDL program uten noen bruk av console.

Lenke til kommentar

Bare litt mer om floats, og hvorfor de ikke bør brukes i regnestykker der du trenger presise tall (slik som tidtagning)

 

Doubles er hakket bedre, men også der mister man presisjon om tallene blir store nok, eller man får for mange desimaler.

 

#include <iostream>

using namespace std;

int main ()

{

for (int i = 16777217; i < 16777227; i++)

cout << "Real : "<< i << " Float ftw: " << int(float(i)) << endl;

return 0;

}

 

Real : 16777217 Float ftw: 16777216

Real : 16777218 Float ftw: 16777218

Real : 16777219 Float ftw: 16777220

Real : 16777220 Float ftw: 16777220

Real : 16777221 Float ftw: 16777220

Real : 16777222 Float ftw: 16777222

Real : 16777223 Float ftw: 16777224

Real : 16777224 Float ftw: 16777224

Real : 16777225 Float ftw: 16777224

Real : 16777226 Float ftw: 16777226

Lenke til kommentar
  • 1 måned senere...
  • 2 uker senere...

Program: MS Visual Studio 08

Deklarasjon: Når jeg skal debugge programmer omdagen så får jeg meldingen:

Unable to start program C:\Documents and Settings\Administrator\Mine dokumenter\Visual Studio 2008\Projects\Project1\test\debug\test.exe

Systemet finner ikke angitt fil.

Selvfølgelig finner ikke system den filen fordi debug mappa er helt tom. Jeg har ikke peiling om det er egentlig meningen om programmet skal lage en .exe fil eller om hva da det er men det får jeg spørsmål om nå. Senere hvis jeg velger å lage nytt prosjekt så kan jeg brøt ikke lenger add'e et ny item på prosjekt som jeg vanligvis gjorde for å lange en ny .cpp fil.

 

Spørsmål: Er det noen, med forhåpentligvis mer erfaring enn meg med Visual Studio, som kan kan forstå hva problemet/problemene er for no?

 

På forhånd takk

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...