Algoritme voor tekst-scrolling (links naar rechts)

Status
Niet open voor verdere reacties.

Brenov

Gebruiker
Lid geworden
23 aug 2008
Berichten
34
Het idee is dus om iets uit te vinden om tekst van links naar rechts te scrollen per regel als in sommige computerspellen. Nou zat ik net te pingelen met papier en potlood en heb dus het volgende:

Code:
1.     Neem string (char-array)
2.     Neem de chars één voor één
3.     Gebruik tijd-delay tussen chars
4.     Beeld chars af
Toen kwam de ruwe pseudo-code:
Code:
DEF FUNCTIE char[ ] scrollString( char[ ] s)
   itereer over s
      toon chars met tijd-delay

Iets vergeten?

Verder moet ik nog kijken hoe ik dit in C++ of D zou implementeren. Als ik het me goed herinner is er ctime of zo in C/C++. Voor D heb ik geen idee tot nu toe.
 
Okee, het is dus gelukt met een beetje hulp. Fout die ik maakte was om fflush niet toe te passen.

D op Linux:
Code:
void scrollTekst( char[ ] s ) {      // returnt niks, neemt een string s
    foreach( c; s ) {                    // voor elke char c, string s
        writef( c );                        // schrijf char c
        fflush( stdout );                 // ontlaadt de buffer
        system( "sleep 0.1" );       // pauzeer 0,1 seconde
    }
}

Zou iemand een C++-versie kunnen maken daarvan (voor Linux of Windows)? Het zou misschien voor anderen van pas komen of niet. M'n C++, voor hoever ik het had, is nogal achteruit gegaan omdat ik nou veel meer D gebruik :) Waar ikzelf aan zit te denken is:

Voor C++ op Linux:
Code:
void scrollTekst( vector<char> s ) {          // returnt niks, neemt vector van chars
    for ( int i = 0; i < s.length( ); i++ ) {      // voor elke i van s
        cout << s[i];                                  // schrijf char s[i]
        fflush( cout );                                 // ??? ontlaadt buffer ???
        system( "sleep 0.1" );                    // pauzeer 0,1 seconde (...voor Windows, gebruik "pause" ?)
    }
}

Natuurlijk voor beide de benodigde headers of modules laden.
 
Voor de C++-versie het argument gewoon op string houden.
Een object van de string-klasse aanvaardt de arraynotatie als characcess.
En een flush van cout is niet nodig.

Code:
void scrollTekst(const string s) {    //of const char* voor de puristen
    int l = s.length();    /* aangezien de string niet wijzigt in de loop, is het performanter de lengte vooraf op te vragen
                                            anders wordt elke lus een functie-aanroep naar s.length() gemaakt */
    for (int i = 0; i < l; i++) {
        cout << s[i];
        system("sleep 0.1");    //windowsmensen gebruiken hier Sleep() uit windows.h
    }
}
 
Laatst bewerkt:
Ik heb je stukje code zoëven gecheckt en uitgeprobeerd, en het werkt niet. Weet je zeker dat een flush niet nodig is? Ik krijg nou bijna hetzelfde effect dat ik kreeg met mijn D-code toen ik de flush niet gebruikte: een leeg scherm.
 
Mijn excuses, flush is idd noodzakelijk. Maar ik had het nog niet door aangezien endl een automatische flush doorvoert :) (macht der gewoonte gok ik).
In elk geval levert het verwijderen van flush geen leeg scherm op, maar de volledige output in één keer, nadat eerst alle sleeps zijn uitgevoerd en het programma automatisch flushed bij beëindiging.

Correcte code voor win32:
Code:
#include <iostream>
#include <windows.h>
using namespace std;

void scrollTekst(const string s);

int main() {
	cout << "!!!Hello World!!!" << endl;
	scrollTekst("meer Hello World");
	return 0;
}

void scrollTekst(const string s) {    //of const char* voor de puristen
    int l = s.length();    /* aangezien de string niet wijzigt in de loop, is het performanter de lengte vooraf op te vragen
                                            anders wordt elke lus een functie-aanroep naar s.length() gemaakt */
    for (int i = 0; i < l; i++) {
        cout << s[i] << flush;
        Sleep(100);	//system("sleep 0.1");
    }
}
 
Hmmmm, interessant, hoe je `const` gebruikt en vantevoren `l = s.length( );` doet en bij de vergelijking `l` gebruikt. Ik zou daar nooit op gekomen zijn. Ik heb wel een keer gelezen dat het beter is om `const` te gebruiken wanneer het kan. Ik neem aan omdat dan niet per ongeluk de waarde ongewild kan veranderen?
 
In dit geval verhinderd de const inderdaad het wijzigen van de waarde van s (via s) binnen de functie scrollTekst.

Over const correctness in C++ kan ik je deze link aanbevelen (vooral 18.5 is interessant)
 
Uh oh: pointers, hehehe. Ik heb ze tot nu toe nauwelijks nodig gehad, en ik ben van plan om ze zo lang mogelijk niet te gebruiken.
 
pointers zijn onontbeerlijk in elk C++ programma van zodra het iets van omvang heeft (al was het maar om je geheugen beter te kunnen beheren).

En ze zijn wel handig om x-dimensionale arrays aan te maken ook (alhoewel ik nooit boven 4dimensies ben hoeven gaan)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan