Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Słownik elektroniczny

Ostatnio zmodyfikowano 2010-06-19 13:35
Autor Wiadomość
pilpol
Temat założony przez niniejszego użytkownika
[C++] Słownik elektroniczny
» 2010-06-13 09:48:44
Szukam pomocy przy pisaniu programu który by umożliwiał gromadzenie definicji pojęć a następnie przeglądanie i wyświetlanie tych definicji cechą dodatkową będzie zapis do formatu XML, HTMLi DOC lub RTF. Dodatkowo program ma wyszukiwać dane definicji wg. nazwy definicji i słów kluczowych.
Bardzo proszę o jakiejś pomysły. Głównie chodzi o zapis.
P-17980
malan
» 2010-06-13 10:39:36
P-17981
filipesq
» 2010-06-13 11:41:07
@malan: W kursie WinApi na ddt.pl prawie nic nie ma. Polecam darkcult.org
P-17982
pilpol
Temat założony przez niniejszego użytkownika
dalsze problemy
» 2010-06-19 13:24:12
C/C++
#include <fstream>
#include <iostream>
#include <conio.h>
#include "console.ddt"
#define MAX_HASEL 50
#define WYSWIETL_HASLO 20
using namespace ddt::console;
using namespace std;
struct hasloST
{
    string slowo;
    string definicja;
   
};
hasloST Wczytajhaslo( void );
void WyswietlDanehasla( hasloST );
void WyswietlListehasel( hasloST tablica[], int iloscElelemtow, int zaznaczElement, int wyswietlOdElementu );
void Kasujhaslo( hasloST tablica[], int & iloscElementow, int indeksDoSkasowania );
void Dodajhaslo( hasloST tablica[], int & aktualnaIloscElementow );
void Wyszukajhaslo( hasloST );
void Zapiszhalo( hasloST );
void WyswietlKomunikaty( int iloscElementow )

{
    textbackground( 0 );
    textcolor( 7 );
    gotoxy( 1, 1 );
    cout << "Ilosc hasel: " << iloscElementow << "/" << MAX_HASEL << "    ";
    gotoxy( 1, 24 );
    cout << "[ESC] Wyjscie     ";
    cout << "[INSERT] Dodaj wpis     ";
    cout << "[GORA/DOL] Poruszanie sie po liscie   ";
    gotoxy( 1, 25 );
    cout << "[DELETE] Kasuj haslo   ";
    cout << "[ENTER] Pokaz haslo   ";
    cout << "[CTRL+ENTER] Edytuj haslo   ";
    cout << "       [F3] Wyszukaj haslo   ";
    cout << "[F6] Zapisz haslo    ";
    return;
}
void EdytujTekst( string & fTekst );
void EdytujDanehasla( hasloST & );
bool WczytajTekstZpliku( fstream & plik, string & napis );
void WczytajDaneZPliku( const char * nazwaPliku, hasloST tablica[], int & iloscElementow );
void ZapiszTekstDoPliku( fstream & plik, string & napis );
void ZapiszDaneDoPliku( const char * nazwaPliku, hasloST tablica[], int & iloscElementow );
int main()
{
    hasloST haslo[ MAX_HASEL ];
    int iloschasel = 0;
    WczytajDaneZPliku( "baza.dat", haslo, iloschasel );
    bool koniec = false;
    int pozycja = 0;
    int pozycjaListy = 0;
    while( koniec != true )
    {
        textcolor( 7 );
        textbackground( 0 );
        clrscr();
        if( pozycja >= iloschasel ) pozycja = iloschasel - 1;
       
        if( pozycja < 0 ) pozycja = 0;
       
        if( pozycja > pozycjaListy +( WYSWIETL_HASLO - 1 ) ) pozycjaListy = pozycja -( WYSWIETL_HASLO - 1 );
       
        if( pozycja < pozycjaListy ) pozycjaListy = pozycja;
       
        WyswietlListehasel( haslo, iloschasel, pozycja, pozycjaListy );
        WyswietlKomunikaty( iloschasel );
        unsigned char znak = getch();
        switch( znak )
        {
        case 224: //klawisze specjalne
            znak = getch();
            switch( znak )
            {
            case 72: //strzałka w górę
                pozycja -= 1;
                break;
            case 80: //strzałka w dół
                pozycja += 1;
                break;
            case 82: //klawisz insert
                Dodajhaslo( haslo, iloschasel );
                break;
            case 83: //klawisz delete
                Kasujhaslo( haslo, iloschasel, pozycja );
                break;
            case 114: //klawisz F3
                Wyszukajhaslo;
                break;
            case 117: //klawisz F6
                Zapiszhalo;
                break;
            }
            znak = 0;
            break;
        case 10: //CTRL+ENTER
            if( iloschasel > 0 ) EdytujDanehasla( haslo[ pozycja ] );
           
            break;
        case 13: //ENTER
            if( iloschasel > 0 ) WyswietlDanehasla( haslo[ pozycja ] );
           
            break;
        case 27: //ESC
            koniec = true;
            break;
        }
    }
    ZapiszDaneDoPliku( "baza.dat", haslo, iloschasel );
    return( 0 );
}
void Dodajhaslo( hasloST tablica[], int & aktualnaIloscElementow )
{
    if( aktualnaIloscElementow < MAX_HASEL )
    {
        tablica[ aktualnaIloscElementow ] = Wczytajhaslo();
        aktualnaIloscElementow += 1;
    }
    return;
}
hasloST Wczytajhaslo( void )
{
    hasloST thaslo;
    clrscr();
    cout << "Podaj slowo kluczowe: ";
    getline( cin, thaslo.slowo );
    cout << "Podaj definicje hasla: ";
    getline( cin, thaslo.definicja );
   
    return( thaslo );
}
void WyswietlListehasel( hasloST tablica[], int iloscElementow, int zaznaczElement, int wyswietlOdElementu )
{
    int max = wyswietlOdElementu + WYSWIETL_HASLO;
    if( max > iloscElementow ) max = iloscElementow;
   
    for( int i = wyswietlOdElementu; i < max; i++ )
    {
        if( i == zaznaczElement )
        {
            textbackground( 12 );
            textcolor( 14 );
        } else
        {
            textbackground( 0 );
            textcolor( 7 );
        }
        gotoxy( 1, 3 + i - wyswietlOdElementu );
        for( int j = 0; j < 60; j++ ) cout << " ";
       
        gotoxy( 1, wherey() );
        cout <<( i + 1 );
        gotoxy( 10, wherey() );
        cout << tablica[ i ].slowo;
       
    }
    return;
}
void WyswietlDanehasla( hasloST haslo )
{
    clrscr();
    cout << "Slowo kluczowe to: " << haslo.slowo << endl;
    cout << "Definicja hasla to: " << haslo.definicja << endl;
    cout << "Nacisnij dowolny klawisz aby powrocic do slow kluczowych." << endl;
    getch();
    return;
}
void Kasujhaslo( hasloST tablica[], int & iloscElementow, int indeksDoSkasowania )
{
    if( iloscElementow > 0 )
    {
        int minx = 20;
        int miny = 11;
        int maxx = 80 -( minx - 1 );
        int maxy = 25 -( miny - 1 );
        textcolor( 15 );
        textbackground( 1 );
        for( int y = miny; y <= maxy; y++ )
        {
            gotoxy( minx, y );
            for( int x = minx; x <= maxx; x++ ) cout << " ";
           
        }
        gotoxy( minx + 1, miny );
        textcolor( 15 );
        cout << "Slowo kluczowe: ";
        textcolor( 14 );
        cout << tablica[ indeksDoSkasowania ].slowo;
       
        gotoxy( minx + 1, miny + 1 );
        textcolor( 15 );
        cout << "Definicja: ";
        textcolor( 14 );
        cout << tablica[ indeksDoSkasowania ].definicja;
       
        gotoxy( minx + 1, maxy );
        textcolor( 15 );
        cout << "Czy chcesz usunac ten wpis? (T/N)";
       
        unsigned char tOdpowiedz = 0;
        do
        {
            tOdpowiedz = getch();
            if( tOdpowiedz == 224 ) //znak specjalny
            {
                getch();
                tOdpowiedz = 0;
            }
        } while(( tOdpowiedz != 't' ) &&( tOdpowiedz != 'T' ) &&( tOdpowiedz != 'N' ) &&( tOdpowiedz != 'n' ) );
        //kasowanie:
        if(( tOdpowiedz == 't' ) ||( tOdpowiedz == 'T' ) )
        {
            for( int i = indeksDoSkasowania + 1; i < iloscElementow; i++ ) tablica[ i - 1 ] = tablica[ i ];
           
            iloscElementow -= 1;
        }
    }
    return;
}
void EdytujTekst( string & fTekst )
{
    string tNowy;
    getline( cin, tNowy );
    if( tNowy.length() == 0 )
    {
        cout << "Nie wprowadzono zmian!" << endl;
    } else
    {
        fTekst = tNowy;
        cout << "Wprowadzono zmiany!" << endl;
    }
}
void EdytujDanehasla( hasloST & fhaslo )
{
    clrscr();
    cout << "Pole, ktore zostawisz puste nie zostanie zmienione." << endl;
    cout << "Podaj nowe slowo kluczowe (stare: \"" << fhaslo.slowo << "\"): ";
    EdytujTekst( fhaslo.slowo );
    cout << "Podaj nowa definicje (stare: \"" << fhaslo.definicja << "\"): ";
    EdytujTekst( fhaslo.definicja );
   
    return;
}
bool WczytajTekstZpliku( fstream & plik, string & napis )
{
    short tDlugosc = 0;
    plik.read( reinterpret_cast < char *>( & tDlugosc ), sizeof( tDlugosc ) );
    if(( plik.gcount() == sizeof( tDlugosc ) ) ) //jeśli udało się pobrać długość tekstu
    {
        napis.resize( tDlugosc );
        plik.read( const_cast < char *>( napis.c_str() ), tDlugosc );
        if(( plik.gcount() != tDlugosc ) ) return( false ); //nie udało się wczytać kompletnych danych
       
    } else return( false ); //nie udało się wczytać kompletnych danych
   
    return( true );
}
void WczytajDaneZPliku( const char * nazwaPliku, hasloST tablica[], int & iloscElementow )
{
    fstream plik;
    plik.open( nazwaPliku, ios::in | ios::binary );
    if( plik.good() )
    {
        iloscElementow = 0;
        while( !plik.eof() )
        {
            hasloST tTymczasowehaslo;
            short tDlugosc;
           
            if(
            ( WczytajTekstZpliku( plik, tTymczasowehaslo.slowo ) == true ) &&
            ( WczytajTekstZpliku( plik, tTymczasowehaslo.definicja ) == true )
            )
            { //jeśli uda się wczytać 2 napisy dodajmy rekord do bazy
                tablica[ iloscElementow ] = tTymczasowehaslo;
                iloscElementow++;
            } else break; //jeśli nie udało się wczytać napisów, przerwij dalsze wczytywanie napisów
           
        }
        plik.close();
    } else
    { //plik nie istnieje, utwórz plik
        plik.clear(); //wyczyszczenie flag - wymagane jeśli chcemy ponownie otwierać plik wykorzystując tą samą zmienną
        plik.open( nazwaPliku, ios::out | ios::binary );
        if( plik.good() ) plik.close(); //jeśli udało się utworzyć plik, zamknij go
       
    }
}
void ZapiszTekstDoPliku( fstream & plik, string & napis )
{
    short tDlugosc = napis.length();
    plik.write( reinterpret_cast < char *>( & tDlugosc ), sizeof( tDlugosc ) );
    plik.write( napis.c_str(), tDlugosc );
}
void ZapiszDaneDoPliku( const char * nazwaPliku, hasloST tablica[], int & iloscElementow )
{
    fstream plik;
    plik.open( nazwaPliku, ios::out | ios::binary );
    if( plik.good() )
    {
        for( int i = 0; i < iloscElementow; i++ )
        {
            ZapiszTekstDoPliku( plik, tablica[ i ].slowo );
            ZapiszTekstDoPliku( plik, tablica[ i ].definicja );
        }
        plik.close();
    }
}
Jak na razie wypociłem tyle mam nas tepujące problemy:
W jakim formacie najlepiej zapisać bazę slow tak aby można było ja wy edytować poza programem, jak zrobić moduł wyszukiwania bo taki prosty jak jest w kursie to nie zadowlic mojego wykładowce potrzebuje zrobić taki żeby można było zastąpić jakaś literkę znakiem ? lub wpisać tylko cześć danego kluczowego słowa, oraz co najważniejsze mam dalej problem z zapisem bardzo proszę o pomoc ja się dopiero co uczę programowania :)
P-18119
DejaVu
» 2010-06-19 13:35:51
Użyj bazy danych SQLite jeżeli chcesz mieć jakiś sensowny projekt. W przeciwnym wypadku będziesz męczył się z wieloma aspektami, które są czasochłonne do wykonania, a w bazie są dostarczone gotowe mechanizmy np. do wyszukiwania dancyh, wstawiania rekordów, usuwania i aktualizacji.

/edit:
Jeżeli się uczysz dopiero programowania to w moim przekonaniu ten projekt Ciebie może przerosnąć. Wyszukiwanie z użyciem znaku ? tak czy inaczej wymaga użycia jakiejś biblioteki bądź napisania prostego algorytmu (funkcji) do przesukiwania tekstu.
C/C++
bool czyPasuje( const char * sTekst, const char * sWzorzec )
{
    //TODO: tu implementacja do wyszukiwania tekstu
    return false;
}
//...
if( czyPasuje( "To jest jakis tekst", "a?i" ) )
{
    cout << "Dopasowano!";
}

W przypadku gdybyś nie miał tych znaków zapytania rozwiązanie byłoby proste, ale tak to musisz napisać sobie mechanizm obsługujący znaki zapytania (nie jest trudne, ale i tak zabierze Ci trochę czasu).
P-18121
« 1 »
  Strona 1 z 1