Toon posts:

[C] pow() en meer :( [/linux-gcc & cygwin]

Pagina: 1
Acties:

Verwijderd

Topicstarter
hrmkay :)

ik heb voor school een opdracht om een simpel menutje met een aantal wiskundige formules te maken, dat de gebruikers dan waarden kunnen invoeren en het programmatje dan de uitkomst weergeeft...
klinkt heel simpel zou je zeggen, en dat is het vast ook, maar wij hebben geen boek maar slechts een paar stencils waar printf ;) in wordt 'uitgelegd'.

ik heb het voor een groot deel wel af, maar ik heb nog een aantal vragen (duh, anders zou ik deze thread niet posten :))

1. gebruik van pow()
menu.c:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
        if (menukeuze == 1) /* menukeuze 1 */
            {
            float breedte, lengte, hoogte, null; /* floating point getallen omdat dat meer precies is */
            printf("Je hebt gekozen om de effectiviteit van een balk uit te rekenen.\n");
            printf("geef de breedte: ");
            scanf("%f", &breedte);
            printf("geef de lengte: ");
            scanf("%f", &lengte);
            printf("geef de hoogte: ");
            scanf("%f", &hoogte);
            effbalk(breedte, lengte, hoogte); /* levert effectiviteit af(floating point) en print zelf opp+inhoud */
            menukeuze = menu(); /* de integer menukeuze opnieuw vullen voordat we verder gaan in de while */
            }

formules.h:
code:
1
2
3
4
5
6
7
8
9
10
11
12
float effbalk(arg1, arg2, arg3)
 /* arg1 = breedte, arg2 = lengte, arg3 = hoogte */
float arg1, arg2, arg3;
{
    float opp, inh, eff, null, a;

    opp = arg1*arg3*2 + arg1*arg2*2 + arg2*arg3*2;
    inh = arg1*arg2*arg3;
    printf("\n\nde oppervlakte is %4.2f\n", opp);
    printf("de inhoud is %4.2f\n", inh);
    return(opp, inh);
}


oppervlakte en inhoud gaat goed, maar om eff(ectiviteit) uit te rekenen moet ik een variabele waarde ^1.5 doen....en daar zit het probleem
ik heb eerst een tijd gezocht naar een pow() functie maar die bleken allemaal alleen voor c++ te werken, maar uiteindelijk kwam ik er wel achter dat ik met -lm 'm gewoon kon compileren met gcc
maar hier is het probleem met een voorbeeldprogrammatje:
code:
1
2
3
4
5
6
7
8
9
10
compieter@flaptop templates $ cat pow.c
#include <stdio.h>

main()
{
        printf("5^1.5 is %f\n", pow(5, 1.5));
}

compieter@flaptop templates $ ./pow
5^1.5 is 1.500000

ook als ik eerst x = pow(5, 1.5); doe en in de printf x laat afdrukken dan lukt het niet...ik zal vast wel een dom foutje maken maar ik weet het even niet meer :)

2.
zoals je hierboven ziet laat ik de functies ook tekst afdrukken....het zou natuurlijk netter zijn als ik de waarden gewoon kan returnen, maar ik heb geen idee hoe (meerdere waarden, 1 waarde lukt natuurlijk nog wel)

3. ik heb menu.c hier neergezet: http://compieter.nl.eu.org/menu.c
als je dingen ziet waarvan je denkt: dát doet hij raar! laat het me dan alsjeblieft weten :)


bedankt voor het lezen :)

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
een #include <math.h> geeft een iets beter resultaat.

dit zorgt trouwens voor een leeg scherm:
C++:
1
2
3
4
5
void clear(void) {
  printf("\033[2J");
//  CURSOR(1,1);
  printf("\033[1;1H")
}

[ Voor 71% gewijzigd door Shadowman op 04-01-2004 12:29 . Reden: CURSOR had ik zelf ergens gedefinieerd ]


  • TaXaN
  • Registratie: April 2001
  • Laatst online: 08-09-2023
1)
De standaard pow() functie uit math.h neemt twee double's als argument en geeft een double terug. De volgende code werkt dan ook perfect hier (GCC 3.2, MinGW port)):
C:
1
printf("5^1.5 = %f\n",pow(5,1.5));

Trouwens, een double heeft een grotere precisie dan een float. Als je toch per se met floats wilt werken en je compiler is C99 compliant, dan kun je ook powf() gebruiken.

2)
Om meerdere dingen terug te geven uit een functie moet je ze in een struct stoppen.

3)
Gebruik switch-case of een keten van if-else om te bepalen welk menu-item gekozen is; dat is veel efficiënter.
Waarom gebruik je een oneindige while-lus voor je menu in plaats van te testen in de while of de gebruiker 0 heeft ingegeven? Dan kan je programma graceful afsluiten ipv die vieze exit(). Eventueel kan je nog uit de while breaken op de plaats waar je nu die exit() hebt staan.
Wat je eigen clear() betreft: standaard C is zo platformonafhankelijk gedefinieerd als mogelijk. Niet elk device waarvoor C gebruikt wordt, heeft een display en dus zit er geen clear() of clrscr() functie in standaard C. Ergo, je bent aangewezen op een API functie van je OS als je iets dergelijks wilt doen. Onder Windows zit er een clrscr() in conio.h als ik mij niet vergis.

A polar bear is a rectangular bear after a coordinate transformation.


Verwijderd

Topicstarter
heeeel erg bedankt voor jullie hulp :)
Shadowman schreef op 04 januari 2004 @ 12:21:
een #include <math.h> geeft een iets beter resultaat.

dit zorgt trouwens voor een leeg scherm:
C++:
1
2
3
4
5
void clear(void) {
  printf("\033[2J");
//  CURSOR(1,1);
  printf("\033[1;1H")
}
bedankt, maar het moet in 'normale' c :)
TaXaN schreef op 04 januari 2004 @ 12:24:
1)
De standaard pow() functie uit math.h neemt twee double's als argument en geeft een double terug. De volgende code werkt dan ook perfect hier (GCC 3.2, MinGW port)):
C:
1
printf("5^1.5 = %f\n",pow(5,1.5));

Trouwens, een double heeft een grotere precisie dan een float. Als je toch per se met floats wilt werken en je compiler is C99 compliant, dan kun je ook powf() gebruiken.

2)
Om meerdere dingen terug te geven uit een functie moet je ze in een struct stoppen.

3)
Gebruik switch-case of een keten van if-else om te bepalen welk menu-item gekozen is; dat is veel efficiënter.
Waarom gebruik je een oneindige while-lus voor je menu in plaats van te testen in de while of de gebruiker 0 heeft ingegeven? Dan kan je programma graceful afsluiten ipv die vieze exit(). Eventueel kan je nog uit de while breaken op de plaats waar je nu die exit() hebt staan.
Wat je eigen clear() betreft: standaard C is zo platformonafhankelijk gedefinieerd als mogelijk. Niet elk device waarvoor C gebruikt wordt, heeft een display en dus zit er geen clear() of clrscr() functie in standaard C. Ergo, je bent aangewezen op een API functie van je OS als je iets dergelijks wilt doen. Onder Windows zit er een clrscr() in conio.h als ik mij niet vergis.
1. bedankt, dat werkt :)

2. ik zal even kijken hoe ik dat moet gebruiken op google, zal wel lukken denk ik ;)

3. ja ik moet de code nog een 'beetje' ;) opschonen, bedankt voor je commentaar :)

/edit: toch nog even over dat clear....

cygwin-gcc en linux-gcc moeten dat toch wel ongeveer op dezelfde manier afhandelen...is hier niet nog een mooiere methode voor? :)

[ Voor 7% gewijzigd door Verwijderd op 04-01-2004 13:22 ]


Verwijderd

Topicstarter
nog een vraagje:
hoe kun je met c programma's pauzeren? (dat het programma doorgaat op het moment dat de gebruiker op de 'any' key drukt ;))

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Verwijderd schreef op 04 januari 2004 @ 14:54:
nog een vraagje:
hoe kun je met c programma's pauzeren? (dat het programma doorgaat op het moment dat de gebruiker op de 'any' key drukt ;))
getchar();

Verwijderd

Topicstarter
dan moeten ze nog op enter drukken....
maar toch bedankt :)

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

Verwijderd schreef op 04 januari 2004 @ 15:07:
dan moeten ze nog op enter drukken....
maar toch bedankt :)
Consoles werken over het algemeen linebased, wat inhoudt dat ze bij een enter in 1 keer alle character van de hele regel versturen. Dit zorgt ervoor dat de console-manager dingen als pijltjetoetsen (walk through history en editen in het midden etc.), backspaces, tabs etc. kan omzetten voordat jij het uitleest. In short heb je er als consoleprogrammeur veel minder werk voor. Maar je krijgt dus idd pas keypresses bij een enter ja.

[ Voor 5% gewijzigd door curry684 op 04-01-2004 15:41 ]

Professionele website nodig?


  • sphere
  • Registratie: Juli 2003
  • Laatst online: 14:36

sphere

Debian abuser

Voorbeeld om keypresses te vangen zonder enters:

C:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#include <unistd.h>
#include <curses.h>
#include <string.h>

void SetColor(int, unsigned long);

int main() {

        int ch,row,col,irow,icol;
        int bannerx;
        unsigned long bits = 0;
        initscr();
        raw(); /* feed keypresses directly */
        keypad(stdscr, TRUE);
        noecho();
        getmaxyx(stdscr,row,col);
        for (icol=0;icol<col;icol++) {
                mvprintw(0,icol,"*");
                mvprintw(row-3,icol,"*");
                mvprintw(row-1,icol,"*");
        }

        for (irow=1;irow<row;irow++) {
                mvprintw(irow,0,"*");
                mvprintw(irow,col-1,"*");
        }

        refresh();

        mvprintw(2,2,"Press a key...");
        mvprintw(2,col-1,"*");

        bits = 0;
        SetColor(1,COLOR_YELLOW);
        bits |= (COLOR_PAIR(1));
        attron(bits);

        mvprintw(3,2,"F1 to exit: ");

        refresh();

        attroff(bits);
        bits &= ~(COLOR_PAIR(1));

        SetColor(2,COLOR_CYAN);

        bits |= (A_BOLD | A_UNDERLINE | COLOR_PAIR(2));
        attron(bits);

        bannerx = (col-53)/2;
        mvprintw(row-2,bannerx,"Keypresses without enters\r");
        refresh();
        attroff(bits);
        bits &= ~(COLOR_PAIR(2));

        ch = 'x';

        while(!(ch == KEY_F(1))) {

                ch = getch();

                switch (ch) {
                        default:
                                mvprintw(3,20,"Not F1 :(\n");
                                mvprintw(3,col-1,"*");

                                refresh();
                                usleep(100000);

                                mvprintw(3,20,"Try again!\n");
                                mvprintw(3,col-1,"*");
                                break;
                }
        }
        endwin();
}

void SetColor(int cn, unsigned long fg) {

        start_color();
        init_pair(cn, fg, COLOR_BLACK);
}

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454

Pagina: 1