Avatar billede xtr0 Nybegynder
17. oktober 2005 - 17:23 Der er 11 kommentarer og
1 løsning

Ved tryk på knap fortsæt ekservering

Hej.
Jeg er begyndt på at skrive et lille fitness program der skal bruges i et projekt i skolen under navnet "Sport og energi".

Jeg vil lave en lille reaktionstest. Og jeg har tænkt mig at det skal fungere på følgende måde:
- Programmet finder en tilfældig værdi mellem 1-10 og ganger det med 1000 (For at få det i milisekunder).
- Programmet skal sleepe i de antal milisekunder som den tilfældige funktion lavede.
- Når det så er lavet skal den skrive - TRYK - og når man så trykker op enter eller en anden knap skal den tage tidspunktet og fortsætte.

Det eneste jeg har haft svært ved her er det at lave noget som gør at programmet stall'er indtil man trykker på enter. Jeg har lavet noget lignende i qbasic (som er det primære vi bruger på vores skole, men her fik jeg lov til selv at bestemme).
Er der nogen der har en ide?
Avatar billede xtr0 Nybegynder
17. oktober 2005 - 17:23 #1
Og det var i C++ ikke i C :)
Avatar billede arne_v Ekspert
17. oktober 2005 - 17:27 #2
GUI eller console app ?

Og normalt plejer problemet at være at køre videre efter at første tast er
trykket - fordi at vente på retur er normalt default.

Så forklar evt. lidt mere om bruger interfacet.
Avatar billede xtr0 Nybegynder
17. oktober 2005 - 17:34 #3
Det er i console.
Har noget kode her:

#include <iostream>
#include <time.h>
#include <math.h>
#include <cstdlib> //For RAND_MAX

void sleep(unsigned int mseconds)
// Sleep funktion, faar vores program til at vente, den ligger et par sekunder til den nuvaerende tid og venter til den tid blider
// Advarsel: Vil ikke kompilere på et linux system da vi goer brug af en windows kommando
// TODO: Finde noget der virker på alle platforme (Ihvertfald Linux og Mac), og finde noget mere smart da dette kun virker effektivt på programmer med kun en thread kørende
{
    clock_t goal = mseconds + clock();
    while (goal > clock());
}
int random_number()
// En funktion der returnerer en int datatype med et relativt tilfældigt nummer mellem 1-10 til brug i reaktionstesten
{
    srand((unsigned)time(0));
    int random_integer;
    random_integer = (rand()%10)+1;
   
    return random_integer;
}

using namespace std;

int main()
{

...

// Hastighedsmaaler, her bliver vi noed til at lave et grumt hack
    else
    if(menuitem == 'c') {
                int tilfaeldigt_nummer;
               
                cout << "Intro til hurtighedstest test: ";
                tilfaeldigt_nummer = random_number()*1000; // Tilfaeldigt nummer gange med 1000 så du faar det i milisekunder
                sleep(tilfaeldigt_nummer);
    }
Avatar billede xtr0 Nybegynder
17. oktober 2005 - 17:35 #4
hov.. ved "..." er der noget kode undladt og nogle af kommentarene er også fjernet. Men håber du får en ide om interfacet nu.
Avatar billede arne_v Ekspert
17. oktober 2005 - 17:43 #5
jeg kan ikke lide den sleep

der er en standard POSIX (stort set alt andet end Windows) sleep (lille s) funktion
som venter et antal sekunder

der er en Win32 API Sleep (stort s) funktion som venter et antal millisekunder

der er usleep funktion som venter et antal mikrosekunder i de fleste
Unix og Linux (alle som er SUSv2 kompatible)
Avatar billede arne_v Ekspert
17. oktober 2005 - 17:44 #6
men ellers hvis du laver en

cin >> variabel;

så venter den vel på retur ?
Avatar billede xtr0 Nybegynder
17. oktober 2005 - 17:48 #7
Ja, den venter på retur, det er det som er problemet. Jeg skal skrive noget i den cin før den vil afsluttes af et tryk på enter.

Ideen er at det er en reaktionstest så man kun skal trykke en gang på en knap og ikke en hurtighedstest med et random bogstav også enter :).

Vil tage det med sleep til efterretning.
Avatar billede arne_v Ekspert
17. oktober 2005 - 17:55 #8
de fleste DOS/Windows compilere har en conio.h med en getch funktion som netop
læser et taste tryk uden at vente på retur

på Linux kan du bruge curses eller ændre terminal settings som beskrevet i:

http://www.ale.org/archive/ale/ale-2000-07/msg00442.html
http://www.cppfrance.com/code.aspx?ID=10611
http://forums.devarticles.com/archive/t-7921/getch-and-kbhit-C-problem
Avatar billede xtr0 Nybegynder
17. oktober 2005 - 18:02 #9
getch() må så blive løsningen, bryder mig ikke om kun at lave det til windows men hvis det skal kunne afleveres til tiden er det vel bedst at det kan compilere på min lærers pc og at han kan se det.
Avatar billede xtr0 Nybegynder
17. oktober 2005 - 18:03 #10
Har et andet spørgsmål, er der en nem måde hvorpå jeg kan lave æøå i mine programmer?

Ps.: Mange tak for hjælpen, opret gerne svar.
Avatar billede arne_v Ekspert
17. oktober 2005 - 18:06 #11
du skriver bare ÆØÅ

men hvis du kører et console program på Windows så skal du huske at console
vinduet kører code page 850 (formentligt) og at du derfor skal bruge code page 850
ÆØÅ og ikke ANSI ÆØÅ

og svar
Avatar billede bertelbrander Novice
17. oktober 2005 - 19:46 #12
Nu har du vel sørget for at brugeren ikke har trykket på tasten INDEN du viser beskeden?

Du kan evt. bruge CharToOem til at "oversætte" æøå:
#include <windows.h>
#include <iostream>
int main()
{
  char S[] = "Rød grød med fløde";
  CharToOem(S, S);
  std::cout << S << std::endl;
}
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