Prezentowane materiały są przeznaczone dla uczniów szkół ponadgimnazjalnych. Autor artykułu: mgr Jerzy Wałaszek, wersja1.0 |
©2013 mgr
Jerzy Wałaszek
|
Został dodatkowo przekonwertowany na duże litery w systemie Latin II, który używa konsola Windows do wyświetlania polskich znaków. Fragment tego pliku wygląda następująco:
PRZYMIOTNIK
AARON
ABADDON
ABAŻUREK
ABAŻUR
LICZYDŁO
ABAKUS
ABAK
ABAKUS
BIOT
ABANDON
PORZUCENIE
OPUSZCZENIE
OPACTWO
OPACTWO
Napiszemy teraz program, który odczyta zawartość pliku data.txt i umieści ją w dynamicznej tablicy łańcuchów znakowych. Musimy tutaj rozwiązać kilka problemów:
Nie znamy liczby wyrazów w pliku. Lepiej nie zakładać jakiejś określonej wartości, ponieważ dane mają to do siebie, że lubią się zmieniać. A nóż będziemy chcieli coś dodać lub usunąć. Zatem program powinien podjąć taką strategię
Utwórz nowy projekt konsoli i skopiuj do niego pliki:
newconio.cpp | - | plik źródłowy biblioteki |
newconio.h | - | plik nagłówkowy dla biblioteki |
Dodaj te pliki do projektu (Project → Add files...).
// Odczyt pliku tekstowego do tablicy dynamicznej //----------------------------------------------- #include <iostream> #include <fstream> #include <cstring> #include "newconio.h" using namespace std; // Klasa łańcuchów tekstowych //----------------------------- class Tstring { private: char **c; // wskaźnik do tablicy wskaźników int n; // rozmiar tablicy int last; // numer ostatniego wpisu public: Tstring(); // konstruktor ~Tstring(); // destruktor void print(); // wyświetla zawartość tablicy }; // Konstruktor //------------ Tstring::Tstring() { char buf[1000]; int i; ifstream infile("data.txt"); last = n = 0; c = NULL; for(i = 0; infile.good(); i++) { infile >> buf; if(buf[0]) { if(last == n) { char ** t = new char * [n + 100]; for(int j = 0; j < n; j++) t[j] = c[j]; delete [] c; c = t; n += 100; } c[last] = new char [strlen(buf) + 1]; strcpy(c[last++],buf); } buf[0] = 0; } infile.close(); } // Wyświetla testowo zawartość tablicy //------------------------------------ void Tstring::print() { int i; for(i = 0; i < last; i++) cout << c[i] << endl; } // Destruktor //----------- Tstring::~Tstring() { int i; for(i = 0; i < last; i++) delete [] c[i]; delete [] c; } int main() { _cinit(); textcolor(LIGHTGREEN); clrscr(); Tstring V; // Słownik V.print(); // Test zawartości textcolor(WHITE); cout << endl << "Koniec danych..." << endl; textcolor(7); return 0; } |
W dalszej części zajęć napiszemy prostą grę logiczną w odgadywanie wyrazów. Gra będzie przebiegała wg następujących reguł:
TELEFON
ŻYLETKA
*ELE***
Program pierwszy odpowiednio rozbudowujemy, dodając do obiektu Tstring nowe funkcje składowe, które obsługują przebieg gry.
// Zgadywanka //----------- #include <iostream> #include <fstream> #include <cstring> #include <cstdlib> #include <ctime> #include "newconio.h" using namespace std; // Klasa łańcuchów tekstowych //----------------------------- class Tstring { private: char **c; // wskaźnik do tablicy wskaźników int n; // rozmiar tablicy int last; // numer ostatniego wpisu public: Tstring(); // konstruktor ~Tstring(); // destruktor void print(); // wyświetla zawartość tablicy void play(); // rozgrywka }; // Konstruktor //------------ Tstring::Tstring() { char buf[1000]; int i; ifstream infile("data.txt"); last = n = 0; c = NULL; for(i = 0; infile.good(); i++) { infile >> buf; if(buf[0]) { if(last == n) { char ** t = new char * [n + 100]; for(int j = 0; j < n; j++) t[j] = c[j]; delete [] c; c = t; n += 100; } c[last] = new char [strlen(buf) + 1]; strcpy(c[last++],buf); } buf[0] = 0; } infile.close(); } // Wyświetla testowo zawartość tablicy //------------------------------------ void Tstring::print() { int i; for(i = 0; i < last; i++) cout << c[i] << endl; } // Rozgrywka //---------- void Tstring::play() { char hword[100], uword[100], sword[100]; int i,j,k,hlen,ulen; srand(time(NULL)); // Inicjujemy generator pseudolosowy memset(hword,0,100); // Zerujemy bufor strcpy(hword,c[(rand() + (rand() << 15)) % last]); // Losujemy słowo hlen = strlen(hword); // Obliczamy długość słowa clrscr(); ulen = uword[0] = 0; for(i = 1; i <= 7; i++) { textcolor(LIGHTGREEN); cout << "RUNDA NR "; textcolor(YELLOW); cout << i << endl; for(j = 0; j < hlen; j++) sword[j] = '*'; sword[j] = 0; for(j = 0; j < ulen; j++) if(uword[j] == hword[j]) for(k = 0; k < hlen; k++) if(hword[k] == uword[j]) sword[k] = uword[j]; textcolor(WHITE); cout << sword << endl; cin >> uword; cout << endl; ulen = strlen(uword); if(!strcmp(hword,uword)) { textcolor(CYAN); cout << "*** GRATULACJE ***" << endl; break; } if(i == 7) { textcolor(LIGHTRED); cout << _pl("*** Przegrałeś - nie odgadłeś hasła ***") << endl << endl; textcolor(YELLOW); cout << hword << endl << endl; } } textcolor(7); } // Destruktor //----------- Tstring::~Tstring() { int i; for(i = 0; i < last; i++) delete [] c[i]; delete [] c; } int main() { _cinit(); Tstring V; // Słownik V.play(); // Gra return 0; } |
I Liceum Ogólnokształcące |
Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl
W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe