Forum: Nybörjarfrågor c++

Forum huvudsida -> Programmering -> Nybörjarfrågor c++

Sidor: 1

Till botten

Lullen 01:31 - 11:a November 2009 | Post #1
Medlem
Inlägg: 9


Skicka PM
Hejsan, nu är jag tillbaks igenSmiley

Den här gången är det så att jag håller på och försöker skriva mig ett litet rollspel i c++..
Och nu undrar jag om ni vet något sätt man kan få ett program att skriva ut en text en bokstav i taget med en viss intervall?

Jag gav tråden namnet så att om jag slipper skapa en ny tråd ifall jag skulle komma på fler frågor...

Tack på förhand

/Tim




Vitdom 07:15 - 11:a November 2009 | Post #2
Medlem
Inlägg: 71


Skicka PM
Använder du Windows så fungerar detta program:

  1. #include <iostream>
  2. #include <windows.h>
  3.  
  4. using namespace std;
  5.  
  6. void writeTextDelayed(const char text[], int ms);
  7.  
  8. void writeTextDelayed(const char text[], int ms)
  9. {
  10. for(int i = 0; text[i]; i++)
  11. {
  12. cout.put(text[i]);
  13. Sleep(ms);
  14. }
  15. }
  16. int main()
  17. {
  18. writeTextDelayed("Hello there Lullen! :D How are you today?", 100);
  19. }

I funktionens parameterlista är
const char text[] en vektor till const char. I C++(och C) är en vanlig c-sträng(som kompilatorn skapar åt dig när du skriver "Text här, t.ex. Hello there Lullen!") flera stycken const char (const för att värdena inte ska gå att ändra; lyckas du på något sätt deklarera den utan const och du ändrar något teckenvärde i strängen i ditt program kommer det att crasha för att det försöker att ändra ett KONSTANT VÄRDE(det går ju inteSmiley) (egentligen så försöker programmet att ändra sig självt)).

I slutet av varje c-sträng så läggs det alltid till en 0(NULL-tecken-värdet, inte tecknet '0'), det är för att datorn ska hålla reda på vart strängen slutar så att när du t.ex. skriver ut en text med cout så fortsätter inte den att skriva ut teckenvärden efter din sträng för att den vet att den slutar där ditt NULL-tecken finns.

int ms är tiden i millisekunder som du vill att det ska gå för att skriva ut ett tecken i taget.

Sleep funktionens beskrivning hittar du här: http://msdn.microsoft.com/en-us/library/ms686298%28VS.85%29.aspx . Men det den gör är att ta tiden i millisekunder och sover din process tills att tiden har gått.


Men om du verkligen vill vara konsekvent och hålla dig till standarden så kan du använda biblioteket ctime:

  1. #include <iostream>
  2. #include <ctime>
  3.  
  4. using namespace std;
  5.  
  6. void writeTextDelayed(const char text[], int ms);
  7.  
  8. void writeTextDelayed(const char text[], int ms)
  9. {
  10. for(int i = 0; text[i]; i++)
  11. {
  12. cout.put(text[i]);
  13. clock_t startTime = clock();
  14. while(clock() < startTime + ms);
  15. }
  16. }
  17. int main()
  18. {
  19. writeTextDelayed("Hello there Lullen! :D How are you today?", 100);
  20. }


Detta program använder sig istället utav ctime-biblioteket som innehåller funktioner och datatyper för tid.

I detta program har vi bytt ut Sleep(ms) mot två rader kod. clock_t startTime = clock(); skapar en clock_t( http://www.cplusplus.com/reference/clibrary/ctime/clock_t/ ) variabel och initierar den till värdet som clock() (http://www.cplusplus.com/reference/clibrary/ctime/clock/) returnerar. Clock returnerar antalet clock-ticks(tror att det alltid är millisekunder, men fungerar det annorlunda för dig så skriv det så hjälper jag dig) sedan programmet startades.

I raden while(clock() < startTime + ms); så testas testvillkoret om och om igen tills det blir false, sedan går koden vidare. Den testar om den tiden som förflutit sedan programmet startade är mindre än den förra tiden + väntetiden, isåfall väntar den ännu längre tills det har gått ms millisekunder.
Notera ; efter while( ... );. Det finns där för att när testvillkoret i while loopen blir sant så kommer nästa sats(eller block(inte samma sak)) i koden att köras. ; markerar i C++(och C) en sats om du inte redan visste det.

Men denna konsekventa kod har en liten hake, det är så att den testar clock() < startTime + ms tills tiden ms har gått, hela tiden. Det betyder att processoranvändningen kommer att stå på max för att den körs hela tiden.

Hoppas att du förstod allt!
// Vitdom

-------------------------



Senast redigerad 07:31 - 11:a November 2009


Lullen 16:40 - 11:a November 2009 | Post #3
Medlem
Inlägg: 9


Skicka PM
Jag tror att jag är med på det mesta...

Jag har dock lite svårt att förstå själva for loopen

vad gör: cout.put
?

Sen så har jag lyckats tillämpa koden i mitt program... jag undrar dock om jag kan anropa
writeTextDelayed 2 ggr i samma funktion.

Och om inte, finns det något sätt jag kan komma runt detta då jag vill skriva ut flera texter bokstav för bokstav oberoende av varandra.

Jag prövade att göra en ny likadan funktion då omdöpt till writetextdelayed2 och få den att starta på ett separat ställe, men då ville koden inte kompilera:(..

Sen så vill jag tacka för ett mycket hjälpfullt svar!
Skönt när man kan läsa vad koden gör. (de e ju inge kul om man inte förstår hur ens egna program fungerarSmiley)

/Tim




Senast redigerad 18:33 - 11:a November 2009


Vitdom 19:56 - 11:a November 2009 | Post #4
Medlem
Inlägg: 71


Skicka PM
cout.puts (eller mer korrekt, ostream::put) beskrivning hittar du här: http://www.cplusplus.com/reference/iostream/ostream/put/

Kort så skriver den ut ett tecken av typen char på skärmen.

Sen på din andra fråga så är det bara och anropa funktionen igen. T.ex.:

  1. writeTextDelayed("Hello there Lullen! :D How are you today? ", 100);
  2. writeTextDelayed("I am inside your computer, talking to you!!! >:)", 40);


Klistra in felmeddelandet som du får när du kompilerar din kod.

Ett bra tips är att lägga sidan www.cplusplus.com till favoriter då det är en mycket bra sida och beskriver typ allt i C++.

Ett annat tips, om du vill fortsätta med C++-programmering, är att köpa en bok. Jag har köpt "C++-programmering, Av Stephen Prata, Femte upplagan" och är extremt nöjd. I boken går han igenom allt som är värt att kunna och som man har användning av + lite till för att man ska förstå på ett bra sätt.

-------------------------



Senast redigerad 20:01 - 11:a November 2009


Lullen 01:53 - 12:a November 2009 | Post #5
Medlem
Inlägg: 9


Skicka PM
Såja, nu kompilerar den... jag tror att jag i all hast måste ha glömt att deklarera ms, eller kanske bara glömt ett semikolonSmiley

Ja, jag tror nog jag ska köpa mig en bokSmiley

Tack för hjälpen!Smiley






Sidor: 1

Forum huvudsida -> Programmering -> Nybörjarfrågor c++
Atom feed

Du får inte posta i den här tråden | Till toppen