Решено: Словарь (чистый Си)

Модератор: Модераторы разделов

GenchiK
Сообщения: 27

Решено: Словарь

Сообщение GenchiK »

Всем привет!

Ребята вот почти закончил работу над словарём, и решил код разместить здесь, чтобы вы помогли мне сделать всё грамотно.Прошу строго не судить, я новичок в программировании.Программа написана на чистом Си.

Приветствую любые пожелания и предложения, и если я что-то не так сделал( что весьма вероятно ), прошу показать, как надо правильно.

Задача ставилась такая: сделать простой словарь, с линейным поиском слов, с базой данных в виде текстового файла и без алфавитной сортировки.

Словарь должен:

1.Находить заданное слово.
2.Показывать весь список слов из базы.
3.Добавлять новые слова.
4.Удалять слова.

Код:

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct newWord {

    char word[15];
    char translate[15];

};

int display() {

    system("color e");
    system("title Slovar");

    printf("+======================================+\n");
    printf("|                                      |\n");
    printf("|     Proshu wybrat punkt:             |\n");
    printf("|                                      |\n");
    printf("|     1.Nayti slowo                    |\n");
    printf("|     2.Pokazat vse slowa              |\n");
    printf("|     3.Dobavic slowo                  |\n");
    printf("|     4.Udalic slowo                   |\n");
    printf("|     5.Wyjti                          |\n");
    printf("|                                      |\n");
    printf("+======================================+\n");

}

int search() {

    FILE *pDb;
    int n = 0;
    char c, word[15], *memArray, *macrostr;

    system("cls");
    display();

    printf("\n+======================================+\n");
    printf("|                                      |\n");
    printf("|              Poisk slowa             |\n");
    printf("|                                      |\n");
    printf("+======================================+\n");

    pDb = fopen( "data/database.txt" , "r" );

    if( pDb ) {

        while( c != EOF ) {
            c = fgetc( pDb );
            n ++;
        }
        fclose( pDb );

    }
    else {
        perror("\nFile error:");
        fclose( pDb );
    }

    printf("\n* Vvedi slowo dla poiska: ");
    fflush(stdin);
    scanf("%s",word);


    pDb = fopen( "data/database.txt" , "r" );

    if( pDb ) {

        memArray = (char*)malloc(n*sizeof(char));

        if( !memArray ) {
            perror("\n* Memory error:");
            fclose( pDb );
            exit;
        }
        else {
            printf("\n+======================================+\n\n");
            while( fgets( memArray, n, pDb ) ) {
                if( macrostr = strstr( memArray, word ) )
                    printf("     > %s", macrostr);
            }
            printf("\n+======================================+\n");

            fclose( pDb );
            free( memArray );

            select();
        }
    }
    else {
        perror("\n* Database error:");
        fclose( pDb );
        exit;
    }

}

int select() {

    int option;

    do {
        printf("\n* Proshu wybrat punkt: ");
        fflush(stdin);
        scanf("%i" , &option );

        system("cls");
        display();
    }
    while(  option<=0 || option>5  );

    switch( option ) {

        case 1: search(); break;
        case 2: list(); break;
        case 3: addWord(); break;
        case 4: deleteWord(); break;
        case 5: exit; break;

        default: printf("\n*** Indefined error! ***"); exit;
    }

}

int list() {

    FILE *pDb;
    int n = 0;
    char c, *memArray;

    system("cls");
    display();

    printf("\n+======================================+\n");
    printf("|                                      |\n");
    printf("|            Spisok vseh slow          |\n");
    printf("|                                      |\n");
    printf("+======================================+\n");

    pDb = fopen( "data/database.txt" , "r" );

    if( pDb ) {
        while( c != EOF ) {
            c = fgetc( pDb );
            n ++;
        }
        fclose( pDb );
    }
    else {
        perror("\nFile error:");
        fclose( pDb );
    }


    pDb = fopen( "data/database.txt" , "r" );

    if( pDb ) {

        memArray = (char*)malloc(n*sizeof(char));

        if( !memArray ) {
            perror("\n* Memory error:");
            fclose( pDb );
            exit;
        }
        else {
            printf("\n+======================================+\n\n");
            while( fgets( memArray, n, pDb ) )
                printf("      > %s", memArray);
            printf("\n+======================================+\n");

            fclose( pDb );
            free( memArray );

            select();
        }
    }
    else {
        perror("\n* Database error:");
        fclose( pDb );
        exit;
    }

}

int addWord() {

    FILE *pDb;
    struct newWord base;

    system("cls");
    display();

    printf("\n+======================================+\n");
    printf("|                                      |\n");
    printf("|            Dobavlenie slowa          |\n");
    printf("|                                      |\n");
    printf("+======================================+\n");

    printf("\n* Vvedite slowo: ");
    fflush(stdin);
    gets( &base.word );

    printf("* Vvedite ego perevod: ");
    fflush(stdin);
    gets( &base.translate );

    pDb = fopen( "data/database.txt" , "a" );

    if( pDb ) {
        if( fprintf( pDb, "%-15s %-15s\n" , base.word, base.translate ) > 0 ) {
            system("cls");
            display();

            printf("\n+======================================+\n");
            printf("|                                      |\n");
            printf("|            Slowo dobavleno           |\n");
            printf("|                                      |\n");
            printf("+======================================+\n");
        }
        else {
            system("cls");
            display();

            printf("\n+======================================+\n");
            printf("|                                      |\n");
            printf("|           Slowo nie dobavleno        |\n");
            printf("|                                      |\n");
            printf("+======================================+\n");

            fclose( pDb );
            exit;
        }
        fclose( pDb );
    }
    else {
        perror("\n* Adding error:");
        fclose( pDb );
    }

    select();

}

int deleteWord() {

    FILE *pDb, *out;
    int n = 0, flag = 0;
    char c, word[15], *memArray, *string;

    system("cls");
    display();

    printf("\n+======================================+\n");
    printf("|                                      |\n");
    printf("|            Udalenie slowa            |\n");
    printf("|                                      |\n");
    printf("+======================================+\n");

    pDb = fopen( "data/database.txt" , "r+" );

    if( pDb ) {

        while( c != EOF ) {
            c = fgetc( pDb );
            n ++;
        }
        fclose( pDb );

    }
    else {
        perror("\n* File error:");
        fclose( pDb );
    }

    fflush(stdin);

    printf("\n* Vvedite slowo dla udalenia: ");
    scanf("%s",word);

    pDb = fopen( "data/database.txt" , "r+" );
    out = fopen( "data/out.txt" , "w" );

    if( !out ) {
        perror("\n* Can't create file:");
        exit;
    }

    if( pDb ) {

        memArray = (char*)malloc(n*sizeof(char));

        if( !memArray ) {
            perror("\n* Memory error:");
            fclose( pDb );
            exit;
        }
        else {
            while( string = fgets( memArray, n, pDb ) ) {
                if( strstr( memArray, word ) == 0 ) {
                    fprintf( out, "%s", string );

                    system("cls");
                    display();

                    printf("\n+======================================+\n");
                    printf("|                                      |\n");
                    printf("|            Slowo niuedaleno          |\n");
                    printf("|                                      |\n");
                    printf("+======================================+\n");

                }
                else {
                    system("cls");
                    display();

                    continue;
                }
            }

            fclose( pDb );
            fclose( out );

            if( remove( "data/database.txt" ) != 0 ) {
                perror( "\n* Error deleting file" );
                exit(1);
            }
            else {
                if ( rename( "data/out.txt", "data/database.txt" ) )
                    exit(1);
                else {
                    free( memArray );
                    list();
                }
            }
        }
    }
    else {
        perror("\n* Database error:");
        fclose( pDb );
        exit;
    }

}

int main()
{
    display();
    select();

    return 0;
}


Для работы нужно создать папочку data а в ней файлик database.txt.Слова можно добавить через программу с помощью 3его пункта, а можно и в ручную загнать в файл в виде: zdes here
ya i'm

P.S У меня стоит windows xp и я не знаю работает ли такая команда как system(); в unix(
Спасибо сказали:
Аватара пользователя
alienrom
Сообщения: 142
ОС: GNU/Linux, BSD

Re: Решено: Словарь

Сообщение alienrom »

GenchiK писал(а):
30.01.2011 16:58
P.S У меня стоит windows xp

А для чего вы постите свои вопросы на форуме, посвященному *nix-системам? Ведь есть же хорошие программерские форумы.

GenchiK писал(а):
30.01.2011 16:58
Приветствую любые пожелания и предложения, и если я что-то не так сделал( что весьма вероятно ), прошу показать, как надо правильно.

Показываю:
1) Прежде всего читайте внимательно Кернигана и Ритчи и других товарищей.
2) Выводите слова читабельно. Если уж латинскими буквами, то по-английски, если по-русски - то кириллицей.
3) Старайтесь называть свои функции отлично от системных или от встроенных.
4) и т.д.
Спасибо сказали:
hippi90
Сообщения: 83
ОС: Debian testing

Re: Решено: Словарь

Сообщение hippi90 »

Еще добавлю от себя. Привыкайте комментировать код, даже если пишете его для себя.
Спасибо сказали:
GenchiK
Сообщения: 27

Re: Решено: Словарь

Сообщение GenchiK »

alienrom писал(а):
30.01.2011 18:25
GenchiK писал(а):
30.01.2011 16:58
P.S У меня стоит windows xp

А для чего вы постите свои вопросы на форуме, посвященному *nix-системам? Ведь есть же хорошие программерские форумы.

GenchiK писал(а):
30.01.2011 16:58
Приветствую любые пожелания и предложения, и если я что-то не так сделал( что весьма вероятно ), прошу показать, как надо правильно.

Показываю:
1) Прежде всего читайте внимательно Кернигана и Ритчи и других товарищей.
2) Выводите слова читабельно. Если уж латинскими буквами, то по-английски, если по-русски - то кириллицей.
3) Старайтесь называть свои функции отлично от системных или от встроенных.
4) и т.д.


Вы троль?Я просил по делу писать.

1.Прочитал.
2.Программа вообще на польском языке написана, я написал латинкой специально для форума.
3.Это о чём? Сами поняли что написали? Где у меня такие функции у которых название системныйх?
4.Читайте книги, учитесь, и не тролльте, если не знаете.


hippi90 писал(а):
30.01.2011 18:54
Еще добавлю от себя. Привыкайте комментировать код, даже если пишете его для себя.


Если вы не понимаете кода, то так и скажите.
А комментарии будут расставлены когда закончу программу целиком.

Просьба писать исключительно по поводу программы и по делу.Спасибо.

alienrom писал(а):
30.01.2011 18:25
GenchiK писал(а):
30.01.2011 16:58
P.S У меня стоит windows xp

А для чего вы постите свои вопросы на форуме, посвященному *nix-системам? Ведь есть же хорошие программерские форумы.


Сейчас я посталю себе linux, и мне можно будет писать здесь? Вы разрешаете? Ахахах)
Спасибо сказали:
hippi90
Сообщения: 83
ОС: Debian testing

Re: Решено: Словарь

Сообщение hippi90 »

Не грубите, вам это не идет.
Используя обычный текстовый файл в качестве хранилища, вы сами себе усложняете жизнь, для этого уже давно придуманы базы данных. Если не хочется использовать тяжеловесные БД, возьмите хотя бы ту же dbm, и станет намного проще.
Спасибо сказали:
GenchiK
Сообщения: 27

Re: Решено: Словарь

Сообщение GenchiK »

hippi90 писал(а):
30.01.2011 19:16
Не грубите, вам это не идет.
Используя обычный текстовый файл в качестве хранилища, вы сами себе усложняете жизнь, для этого уже давно придуманы базы данных. Если не хочется использовать тяжеловесные БД, возьмите хотя бы ту же dbm, и станет намного проще.


Прочитайте ещё раз, какие я ставил цели.И что мне нужно было.
Спасибо сказали:
hippi90
Сообщения: 83
ОС: Debian testing

Re: Решено: Словарь

Сообщение hippi90 »

GenchiK писал(а):
30.01.2011 16:58
Приветствую любые пожелания и предложения...

Я вам высказал свои пожелания и предложения, не более того. И я всего лишь указал, что ваша изначальная идея использовать текстовый файл в виде хранилища не очень хороша.
Спасибо сказали:
GenchiK
Сообщения: 27

Re: Решено: Словарь

Сообщение GenchiK »

hippi90 писал(а):
30.01.2011 19:23
GenchiK писал(а):
30.01.2011 16:58
Приветствую любые пожелания и предложения...

Я вам высказал свои пожелания и предложения, не более того. И я всего лишь указал, что ваша изначальная идея использовать текстовый файл в виде хранилища не очень хороша.


Хорошо)))Спасибо)))
Спасибо сказали:
Lan4
Сообщения: 339
Статус: hikki
ОС: Arch

Re: Решено: Словарь

Сообщение Lan4 »

GenchiK писал(а):
30.01.2011 19:09
Вы троль?

на троля тут больше всего вы похожи ;)
Спасибо сказали:
GenchiK
Сообщения: 27

Re: Решено: Словарь

Сообщение GenchiK »

В общем ясно.Не стоит тратить здесь время, лучше пойти и читать книги дальше.Тема закрыта.
Спасибо сказали: