Алгоритм Боуера-Мура (смертельно срочно!)
Мне очень срочно нужен алгоритм Боуера-Мура. Я уже нашел вроде бы подходящую ссылку на эту тему, но не смог до конца с ней разобраться.
Ссылка такова: http://algolist.manual.ru/search/esearch/bm.php
Помогите мне, пожалуйста, составить полноценную, работающую программу, опираясь на эти материалы или на ваш собственный опыт.
Я очень нуждаюсь в вашей помощи. Пожалуйста, не покидайте меня в столь трудную минуту... :(
Код-то, конечно, прописан, да не все так просто. В этом коде, если внимательно в него вглядеться, отсутствует функция void main(), которую нужно написать самому. Мне скажут: "А в чем же проблема? Сядь и напиши!"
Я поначалу тоже так думал и в приблизительно понимаю, как все это сделать. Но все мои попытки ни к чему не приводят, точнее сказать, не приводят к окончательному результату. Ведь в программировании нет понятия "почти правильно". Здесь есть только: сделал или не сделал, да или нет, 1 или 0.
И как я ни бился, мне не удалось сделать из этого кода нормально работающую программу, которая выполняла бы требумые команды.
Помогите мне, пожалуйста. Жизнь моя висит на волоске, и только благодаря помощи великодушного человека она может быть сохранена. :(
Поэтому приведи хотя бы то что ты уже сделал(правильно не правильно, не имеет значения), а опытные люди помогут чем смогут.
Я поначалу тоже так думал и в приблизительно понимаю, как все это сделать. Но все мои попытки ни к чему не приводят, точнее сказать, не приводят к окончательному результату. Ведь в программировании нет понятия "почти правильно". Здесь есть только: сделал или не сделал, да или нет, 1 или 0.
И как я ни бился, мне не удалось сделать из этого кода нормально работающую программу, которая выполняла бы требумые команды.
Помогите мне, пожалуйста. Жизнь моя висит на волоске, и только благодаря помощи великодушного человека она может быть сохранена. :([/QUOTE]
так вы все поняли, только вам нужна функция main?
а что в ней должно быть? (ну например должны вводиться какие-то данные и с ними выполняться этот алгоритм?)
Поэтому приведи хотя бы то что ты уже сделал(правильно не правильно, не имеет значения), а опытные люди помогут чем смогут.
А разве я прошу делать с нуля? На том сайте, который я указал, программа выполнена уже на 95%. Остается только правильно оформить главную функцию - void main(). Это должно составить всего лишь 3-5 строк, и тому, кто занет, что такое алгоритм поиска Боуера-Мура, придется затратить на весь процесс не более 5 минут.
Будет затрачено всего лишь 5 минут, а польза от этого будет огромна.
По-прежнему жду поддержки добрых людей. Каждая секунда приближает меня к гибели, но я надеюсь, что мне все-таки протянут руку помощи... :(
Мне нужно считывать текстовый файл и находить в нем слово, введенное с клавиатуры.
Способ оформления - произвольный. Слово "поиск" - понятие расплывчатое, и можно выбрать любой вариант: выделение слова в тексте, указание номеров символов, которые входят в это слово, печать слов, в которые входит заданная символьная последовательность и т.д.
Способ не важен. Главное - рабочая программа. :(
#include <string.h>
#define ASIZE 1024
#define XSIZE 1024
#define MAX_FILE_SIZE 65000
#define MAX_WORD_LENGTH 1024
#define MAX(A, B) (((A) > (B))? (A): (B))
/* Preprocessing of the Bad Character function shift */
void PRE_BC( char *x, int m, int bm_bc[] ) {
int a, j;
for ( a=0; a < ASIZE; a++ ) bm_bc[ a ] = m;
for ( j=0; j < m-1; j++ ) bm_bc[ (unsigned char)x[ j ] ] = m - j - 1;
}
/* Preprocessing of the Good Suffix function shift */
void PRE_GS( char *x, int m, int bm_gs[] ) {
int i, j, p, f[XSIZE];
memset( bm_gs, 0, ( m + 1 ) * sizeof( int ) );
f[ m ] = j = m + 1;
for (i=m; i > 0; i-- ) {
while ( j <= m && x[ i - 1 ] != x[ j - 1 ] ) {
if ( bm_gs[ j ] == 0 ) bm_gs[ j ] = j - i;
j = f[ j ];
}
f[ i - 1 ] = --j;
}
p=f[ 0 ];
for ( j=0; j <= m; ++j ) {
if ( bm_gs[ j ] == 0 ) bm_gs[ j ] = p;
if ( j == p ) p = f[ p ];
}
}
/* Boyer-Moore string matching algorithm */
void BM( char *x, char *y, int n, int m ) {
int i, j, bm_gs[XSIZE], bm_bc[ASIZE];
/* Preprocessing */
PRE_GS( x, m, bm_gs );
PRE_BC( x, m, bm_bc );
i=0;
while ( i <= n-m ) {
for ( j=m-1; j >= 0 && x[j] == y[ i+j ]; --j );
if ( j < 0 ) {
printf("%d ", i);
i += bm_gs[ j+1 ];
}
else i += MAX(( bm_gs[ j+1 ]), ( bm_bc[ (unsigned char)y[ i+j ] ] - m + j + 1 ) );
}
printf("\n");
}
int main(int argc, char **argv) {
if(argc < 2) {
printf("error: no input file specified\n"
"usage: %s filename\n", argv[0]);
goto done;
}
FILE *fi;
if(!(fi = fopen(argv[1], "r"))) {
printf("error: can't open file %s\n", argv[1]);
goto done;
}
// loading file into buffer
char buf[MAX_FILE_SIZE];
int file_size; // actual number of characters read
if((file_size = fread(buf, 1, MAX_FILE_SIZE, fi)) < 1) {
printf("error: input file is empty\n");
goto close;
}
// printf("contents of file:\n%s\n", buf);
printf("enter search word: ");
char word[MAX_WORD_LENGTH];
int word_length = scanf("%s", word); // actual size of word entered
printf("looking for word '%s'...\n", word);
BM(word, buf, file_size, word_length);
close:
fclose(fi);
done:
return 0;
}
Но мне хотелось бы спросить, почему при запуске программы выдаюстя ошибки. Эти ошибки можно увидеть во вложенном файле.
Посмотрите, пожалуйста. :confused:
Но мне хотелось бы спросить, почему при запуске программы выдаюстя ошибки. Эти ошибки можно увидеть во вложенном файле.
Посмотрите, пожалуйста. :confused:[/QUOTE]
Если компилятор не находит stdio.h значит что-то не так в настройках компилятора. Что за компилятор?
Если справишься, попробуй это:
FILE *fi;
char buf[MAX_FILE_SIZE];
int file_size; // actual number of characters read
char word[MAX_WORD_LENGTH];
if(argc < 2) {
printf("error: no input file specified\n"
"usage: %s filename\n", argv[0]);
goto done;
}
if(!(fi = fopen(argv[1], "r"))) {
printf("error: can't open file %s\n", argv[1]);
goto done;
}
// loading file into buffer
if((file_size = fread(buf, 1, MAX_FILE_SIZE, fi)) < 1) {
printf("error: input file is empty\n");
goto close;
}
// printf("contents of file:\n%s\n", buf);
printf("enter search word: ");
int word_length = scanf("%s", word); // actual size of word entered
printf("looking for word '%s'...\n", word);
BM(word, buf, file_size, word_length);
close:
fclose(fi);
done:
return 0;
}