Avatar billede nickwan Nybegynder
27. januar 2010 - 20:55 Der er 19 kommentarer og
1 løsning

afrunding af decimal tal til hele tal ?

Hej der ude:)

jeg er igang med at uddanne mig til teknisk designer (jeg programmere i mit fritid, er dog nybegynder:) og der har vi noget der hedder hulmål og pille mål, hvis jeg skal tjekke om et tal er et hul mål eller pille mål skal jeg gøre sådan her:

Eksempel: (i dette eksempel passer målet ikke men det kan vi også komme ud for)
1334/60=22,23333
hvilket så skal afrundes til 22
og så skal man sige 22*60=1320 hvis det så er pille mål skal der -12 og hvis det er hulmål skal der +12, mit spørgsmål her er så hvordan laver jeg en kode der afrunder alt under xxx,49999 ned af og alt over xxx,50 op af? jeg kan sagtens finde ud af resten af koden det er kun afrunding jeg har problemer med?

som der ses i koden skal der afrundes til hele tal og der må ikke være decimaler.

på forhånd tak :)
Avatar billede arne_v Ekspert
27. januar 2010 - 20:59 #1
To muligheder:

#include <math.h>
...
double x = 22.23333;
int i = round(x);

og:

double x = 22.23333;
int i = (int)(x + 0.5);
Avatar billede arne_v Ekspert
27. januar 2010 - 21:00 #2
Men maaske behoever du det slet ikke.

1334/60 er nemlig 22 men 1334.0/60.0 er 22.23333
Avatar billede arne_v Ekspert
27. januar 2010 - 21:16 #3
Jo - ved afrunding til naermeste behover du det - det er kun nedrunding som er "gratis".
Avatar billede nickwan Nybegynder
27. januar 2010 - 21:16 #4
har lige siddet og prøvet lidt kan du fortælle mig hvad der er galt her?:

#include "stdafx.h"

double omregn (double);

int main()
{

    double maal;
    double resultat;

    std::cout<<"Indtast maal: ";
    std::cin>>maal;
    omregn (maal);
    std::cout<<resultat;

    system("pause");
    return 0;
}

double omregn (double maal)
{
    double resultat;
    resultat = ((maal/60)*60)+12 ;
    return (resultat);
}

og det var vel ikke sådan så du kunne smide en kode der virker det ville bare være perfekt:)
Avatar billede arne_v Ekspert
27. januar 2010 - 21:24 #5
Hvad skal omregn goere?
Avatar billede arne_v Ekspert
27. januar 2010 - 21:24 #6
Uanset hvad skal:

omregn (maal);

nok vaere:

resultat = omregn (maal);
Avatar billede nickwan Nybegynder
27. januar 2010 - 21:31 #7
aaaa det var det eneste jeg havde gjort forkert :) tak

det her ser ud til at virke:)

#include "stdafx.h"

int omregn (int);

int main()
{

    int maal;
    int resultat;

    std::cout<<"Indtast maal: ";
    std::cin>>maal;
    resultat = omregn (maal);
    std::cout<<resultat;

    system("pause");
    return 0;
}

int omregn (int maal)
{
    int resultat;
    resultat = ((maal/60)*60)+12;
    return (resultat);
}

sorry hvis jeg virkede lidt umulig med min kode men det er lige med at huske det hele og er som sagt ny :)

smid et svar så får du point:)
Avatar billede nickwan Nybegynder
27. januar 2010 - 21:34 #8
ups der var lige et problem når tallet bliver over xxx.50 så runder den stadig ned?
Avatar billede arne_v Ekspert
27. januar 2010 - 21:47 #9
Jeg gaetter paa at:

resultat = ((maal/60)*60)+12;

skal vaere:

resultat = (((int)(maal/60.0+0.5))*60)+12;
Avatar billede nickwan Nybegynder
27. januar 2010 - 21:53 #10
cool det virkede 1000 tak :) smid et svar .

er det sådan så du vil være sød at forklare hvad det er der sker for må indrømme at jeg ikke helt forstår hvad det er en gør.

(maal/60.0+0.5))*60)+12; det der forstår jeg godt det er mere den her jeg ikke forstår : (((int)(maal/60.0+0.5)) :)

hvordan ser min kode ellers ud ? er den okay? er jo ny så ville være rat at høre om det er okay eller helt ude i skoven (ved godt den er meget enkel og at der ikke er ret meget i den):)
Avatar billede arne_v Ekspert
27. januar 2010 - 22:10 #11
svar
Avatar billede arne_v Ekspert
27. januar 2010 - 22:11 #12
(int)noget runder ned.

(int)(noget+0.5) runder af til naermeste heltal.
Avatar billede arne_v Ekspert
27. januar 2010 - 22:13 #13
Koden ser rimelig fornuftig ud.

Jeg ville imporete navne fremfor at angive std:: hver gang.

Og jeg ville flytte omregn op over main og droppe forward erklaeringen.

Men det er ikke bedre - det er bare min programmerings stil.
Avatar billede nickwan Nybegynder
27. januar 2010 - 22:19 #14
okay lyder godt:) mange mange tak for hjælpen :)

sådan her kom min kode til at se ud:

#include "stdafx.h"

int omregn (int);

int main()
{

    int maal;
    int resultat;

    std::cout<<"PILLEMAAL! SKAL ende paa 8!\n";
    std::cout<<"Indtast maal: ";
    std::cin>>maal;
    resultat = omregn (maal);
    std::cout<<resultat<<"\n";

    return main();
}

int omregn (int maal)
{
    int resultat;
    resultat = (((int)(maal/60.0+0.5))*60)-12;
    return (resultat);
}
Avatar billede arne_v Ekspert
28. januar 2010 - 01:47 #15
Hvad pokker laver:

return main();

????
Avatar billede nickwan Nybegynder
28. januar 2010 - 09:26 #16
det er fordi jeg skal bruge det i skolen, og jeg gider ikke skulle åbne programmet hver gang jeg skal skrive et tal, for når den har udført handlingen lukker den jo, så jeg søgte lidt på nettet, og fandt et sted hvor der var en der havde skrevet at man kunne skrive:

return main();

ved godt det er en dårlig løsning men det virkede :)
Avatar billede arne_v Ekspert
28. januar 2010 - 15:23 #17
Det ville vaere noget paenere at lave en loekke i main !
Avatar billede nickwan Nybegynder
28. januar 2010 - 17:21 #18
så langt er jeg ikke nået i den bog jeg læser endnu, men hvis det er enkelt kan du så forklare mig hvordan jeg gør?
Avatar billede arne_v Ekspert
29. januar 2010 - 04:29 #19
En maade:

int main()
{

    int maal;
    int resultat;

    std::cout<<"PILLEMAAL! SKAL ende paa 8!\n";
    for(;;)
    {
        std::cout<<"Indtast maal (0=exit): ";
        std::cin>>maal;
        if(maal <= 0) break;
        resultat = omregn (maal);
        std::cout<<resultat<<"\n";
    }

    return 0;
}
Avatar billede nickwan Nybegynder
29. januar 2010 - 08:46 #20
smart, :) prøver det når jeg kommer hjem.

du kommer til at tjene mange point på mig endnu ^^
1000 tak for hjælpen :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester