Цепи Маркова на с++

Статус
В этой теме нельзя размещать новые ответы.

google_master

Создатель
Регистрация
26 Янв 2007
Сообщения
49
Реакции
14
Нужны исходники цепей Маркова на с++ для генерации текста. Может есть у кого варианты какие-то? :)
 
неуж-то сишник не разберет php код
PHP:
//Файл, в котором лежит исходный текст 
$source_text = 'text.txt'; 
//Наш словарь соответствия слова и идущих за ним слов 
$dictionary = array(); 

function load() 
{ 
   global $dictionary,$source_text; 
   //Читаем исходный файл 
   $str = file_get_contents($source_text); 
   //Превращаем текст в одну строку 
   $str = preg_replace("#[\r\n]#","",$str); 
   //Выделяем все слова из строки (выражение в кавычках или в скобках считается одним словом) 
   preg_match_all("#((\"[^\"]+\")|(\([^\)]+\))|([^\(\)\"'\s]+))(\s+|\z)#",$str,$parts); 
   $words = $parts[1]; 
   $count = count($words); 

   //Заполняем словарь 
   for( $i = 0; $i < $count; $i++ ) 
   { 
      if( $i > 0 ) 
      { 
         if( !in_array($words[$i],$dictionary[$prev_word]) ) 
            $dictionary[$prev_word][] = $words[$i]; 
      } 
      $prev_word = $words[$i]; 
      if( empty($dictionary[$prev_word]) ) 
         $dictionary[$prev_word] = array(); 
   } 
} 

//Функция генерации текста. $count - количество генерируемых слов 
function genText($count) 
{ 
   global $dictionary; 
   $words = array_keys($dictionary); 
   $word = $words[0]; 
    
   $text =''; 
   for( $i = 0; $i < $count; $i++ ) 
   { 
      $text .= ' '.$word; 
      //Следующее слово - случайное слово из тех, что идут в исходном тексте за текущим словом 
      $word = $dictionary[$word][rand(0,count($dictionary[$word])-1)]; 
   } 
   return $text; 
} 

load(); 
echo genText(100);


Добавлено через 6 минут
Для просмотра ссылки Войди или Зарегистрируйся

15.3. Порождение текста
 
Нужны исходники цепей Маркова на с++ для генерации текста. Может есть у кого варианты какие-то? :)
а зачем цепи маркова, они уже выходят из моды, уже люди начали ориентироватся на другие алгоритмы генерации.
 
А какие алгоритмы сейчас в моде?
 
неуж-то сишник не разберет php код
PHP:
//Файл, в котором лежит исходный текст 
$source_text = 'text.txt'; 
//Наш словарь соответствия слова и идущих за ним слов 
$dictionary = array(); 

function load() 
{ 
   global $dictionary,$source_text; 
   //Читаем исходный файл 
   $str = file_get_contents($source_text); 
   //Превращаем текст в одну строку 
   $str = preg_replace("#[\r\n]#","",$str); 
   //Выделяем все слова из строки (выражение в кавычках или в скобках считается одним словом) 
   preg_match_all("#((\"[^\"]+\")|(\([^\)]+\))|([^\(\)\"'\s]+))(\s+|\z)#",$str,$parts); 
   $words = $parts[1]; 
   $count = count($words); 

   //Заполняем словарь 
   for( $i = 0; $i < $count; $i++ ) 
   { 
      if( $i > 0 ) 
      { 
         if( !in_array($words[$i],$dictionary[$prev_word]) ) 
            $dictionary[$prev_word][] = $words[$i]; 
      } 
      $prev_word = $words[$i]; 
      if( empty($dictionary[$prev_word]) ) 
         $dictionary[$prev_word] = array(); 
   } 
} 

//Функция генерации текста. $count - количество генерируемых слов 
function genText($count) 
{ 
   global $dictionary; 
   $words = array_keys($dictionary); 
   $word = $words[0]; 
    
   $text =''; 
   for( $i = 0; $i < $count; $i++ ) 
   { 
      $text .= ' '.$word; 
      //Следующее слово - случайное слово из тех, что идут в исходном тексте за текущим словом 
      $word = $dictionary[$word][rand(0,count($dictionary[$word])-1)]; 
   } 
   return $text; 
} 

load(); 
echo genText(100);


Добавлено через 6 минут
Для просмотра ссылки Войди или Зарегистрируйся

15.3. Порождение текста

Не могу переписать это на с++ :(
 
Я выкладывал на форуме программу Delirium. Там открытые исходники. Юзай поиск.
 
Не могу понять, как пользоваться source, помогите пожалуйста. см. аттач

 
и в чем проблема?

файл chains.h - объявление функций для работы с цепями
PHP:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>

#include "windows.h"
#include "commctrl.h"

#include "resource.h"

#define DEF_IGNORE "@#^_;:\\|/<>~"

int mainproc(HWND hWnd, char **innames, int intotal, char *outname);
void SetPercentage(HWND hWnd, int total);
int wordcount(FILE *in, const char *clear);
void insert(const char *KeyAndWord, struct KeyEntry **StoreStruct);
//вставка ключа и слова в базу
char *randword(const char *Key, struct KeyEntry **StoreStruct);
//случайное слово из базы
void processfile(HWND hWnd, FILE *in, struct KeyEntry **WordStruct, struct KeyEntry **BonusWordStruct, const char *clear);
//создание базы на основе файла, clear - ненужные символы
void createdelirium(HWND hWnd, FILE *out, struct KeyEntry **WordStruct, struct KeyEntry **BonusWordStruct, const char *start, const int length);
//создание бреда из не более length слов
unsigned int strhash(const char *s);
//хеш строки, не более max_hash - лучше заменить на что-то более продвинутое или хватит и такого

struct StringListItem{
	char *String;
	struct StringListItem *Next;
};

struct KeyEntry{
	char *Key;
	struct KeyEntry *Another;

	struct StringListItem *Word;
	unsigned int NumberOfFollowers;

};
и файл chains.cpp реализация этих функций
PHP:
/*
Нам говорят "безумец" и "фантаст",
Но, выйдя из зависимости грустной,
C годами мозг мыслителя искусный
Мыслителя искусственно создаст.
                       Гете
*/

#include "chains.h"


const char blanks[] = "\n\r\t";
char punctuation[] = DEF_IGNORE;//все знаки препинания;
char keybonused[1024];
int max_hash = 32;//максимальное значение хеша
int hash_exp = 15;//показатель степени
int totalwords = 0;
int keywords = 2;
int max_length = 1000;
int key_bonus = 4;
int ranseed = 0;
bool tech = true;

unsigned int strhash(const char *s){
    // (c) K&R
	unsigned int hashval;

	for (hashval = 0; *s != '\0'; s++)
		hashval = *s + 31 * hashval;
	return hashval % max_hash;
}

inline void SetPercentage(HWND hWnd, int current, int total){
	static int prev = 0, prevtotal = 0;

	const int smooth = 10; //В процентах, насколько гладко идет прогрессбар

	if(total != prevtotal){
		prev = 0;
		prevtotal = total;
	}

	if ((current - prev) >= smooth * (total / 100))
		SendMessage(hWnd, PBM_SETPOS, ((prev = current) * 100) / total, 0);
	
}

char *randword(const char *Key, struct KeyEntry **StoreStruct){
	struct KeyEntry *KeyIns;
	struct StringListItem *WordIns;
	int randnum = 0;

	if(StoreStruct[ strhash(Key)]){
		for(KeyIns = StoreStruct[ strhash(Key)]; KeyIns && strcmp(KeyIns -> Key, Key); KeyIns = KeyIns -> Another);
		if(!KeyIns || strcmp(KeyIns -> Key, Key)){
			return NULL;
		}

		randnum = (KeyIns -> NumberOfFollowers) - (rand() % KeyIns -> NumberOfFollowers) - 1;


		for(WordIns = KeyIns -> Word; randnum > 0; WordIns = WordIns -> Next) randnum--;
		
		return WordIns -> String;
	}

	return NULL;
}

void insert(const char *KeyAndWord, struct KeyEntry **StoreStruct){
	char Key[1024] = {0}, Word[1024];
	struct KeyEntry *KeyIns;
	bool init = false;
	struct StringListItem *WordIns;

	//разваливаю в ключ и слово
	strncpy(Key, KeyAndWord, strrchr(KeyAndWord, ' ') - KeyAndWord);
	strcpy(Word, strrchr(KeyAndWord, ' ') + 1);

	if(StoreStruct[ strhash(Key)]){
		KeyIns = StoreStruct[ strhash(Key)];
        while(strcmp(KeyIns -> Key, Key)){
			if(KeyIns ->Another) KeyIns = KeyIns ->Another;
			else break;
		}

        if(strcmp(KeyIns -> Key, Key)){
			KeyIns = (KeyIns -> Another = (struct KeyEntry*) malloc(sizeof( struct KeyEntry)));
			init = true;
		}
	} 
	else{
		//инициализируем
		KeyIns = (StoreStruct[ strhash(Key)] = (struct KeyEntry*) malloc(sizeof( struct KeyEntry)));
		init = true;
	}

	if(init){
		strcpy(KeyIns -> Key = (char*) calloc(strlen(Key) + 1, sizeof(char)), Key);
		KeyIns -> Another = NULL;
		KeyIns -> Word = NULL;
		KeyIns -> NumberOfFollowers = 0;
	}
	KeyIns -> NumberOfFollowers++;
	//добавляю слово в KeyIns -> Word
	

	WordIns = (struct StringListItem*) malloc(sizeof( struct StringListItem));
	strcpy(WordIns -> String = (char*) calloc(strlen(Word) + 1, sizeof(char)), Word);
	WordIns -> Next = KeyIns -> Word;
	KeyIns -> Word = WordIns;
	

}

int wordcount(FILE *in, const char *clear){
	char current, last = ' ';
	int spaces = 0;

	while ((current = fgetc(in)) && (!(feof(in)))){
		if(strchr(clear, current)){
			current = ' ';
		}
		if (!((current == ' ') && (last == ' '))){
			if(current == ' ') spaces++;
		}

		last = current;
	}

	rewind(in);
	return spaces;
}

void firstkey(FILE *in, char *Key, const char *clear){
	char current, last = ' ';
	int copied = 0, spaces = 0;

	while ((current = fgetc(in)) && (!(feof(in)))){
		if(strchr(clear, current)){
			current = ' ';
		}
		if (!((current == ' ') && (last == ' '))){
			if(current == ' ') spaces++;

			if (spaces == keywords){
				Key[copied] = '\0';
				return;
			}

			Key[copied++] = current;
			last = current;
		}
	}


}

void processfile(HWND hWnd, FILE *in, struct KeyEntry **WordStruct, struct KeyEntry **BonusWordStruct, const char *clear){
	char NewWords[1024], current, last = ' ';
	char *specialstart, *special;
	int copied = 0, spaces = 0, total = 0, allwords = wordcount(in, clear);

	while ((current = fgetc(in)) && (!(feof(in)))){
		if(strchr(clear, current)){
			current = ' ';
		}
		if (!((current == ' ') && (last == ' '))){
			if(current == ' ') spaces++;

			if (spaces == keywords + 1){
				NewWords[copied] = '\0';
				insert(NewWords, WordStruct);

//если последнее слово в NewWords входит в keybonused, добавить NewWords в BonusWordStruct
				if( ((specialstart = strstr(keybonused, special = strrchr(NewWords, ' ') + 1)) != NULL)){
					if( ((specialstart == keybonused) || (*(specialstart - 1) == ' ')) && ((*(specialstart + strlen(special) ) == ' ') || (*(specialstart + strlen(special) ) == '\0'))){
						insert(NewWords, BonusWordStruct);
					}
				}


				SetPercentage(hWnd, total++, allwords);

				strcpy(NewWords, strchr(NewWords, ' ') + 1);
				spaces = keywords; copied = strlen(NewWords);
			}

			NewWords[copied++] = current;
			last = current;
		}
	}

	rewind(in);
}

void clearstore(struct KeyEntry **StoreStruct){
	struct KeyEntry *KI, *KIP = 0;
	struct StringListItem *WI, *WIP = 0;
	for(int i = 0; i < max_hash; i++){
		for(KI = StoreStruct[ i]; KI; KI = (KIP = KI) -> Another){
			free(KI -> Key);
			free(KIP);
			for(WI = KI -> Word; WI; WI = (WIP = WI) -> Next){
				free(WI -> String);
				free(WIP);
			}
			free(WI);

		}
		free(KI);
	}
	free(StoreStruct);
}

void createdelirium(HWND hWnd, FILE *out, struct KeyEntry **WordStruct, struct KeyEntry **BonusWordStruct, const char *start, const int length){
	int i;
	char Key[1024], *Word;

	strcpy(Key, start);
	fprintf(out, "%s ", Key);
	for(i = 0; i <= length; i++){
		SetPercentage(hWnd, i, length);
		if(((rand() % 10) < key_bonus) && (Word = randword(Key, BonusWordStruct))){}
		else if(!(Word = randword(Key, WordStruct))) return;
		fprintf(out, "%s ", Word);
		strcpy(Key, strchr(Key, ' ') + 1);
		sprintf(Key, "%s %s", Key, Word);
	}
}

int mainproc(HWND hWnd, char **innames, int intotal, char *outname){
	hWnd = GetDlgItem(hWnd, IDC_PROGRESS);
	
	long start = clock();

	FILE *in, *out;
	bool truerandom = false;
	int i;

	if(  !(out = fopen(outname, "w"))){
		return -1;//файлы кривые 
	}

	if( intotal < 0){
		fclose(out);
		return -1;//файлы кривые 
	}

	char FKey[1024] = {0};
	if(truerandom = !ranseed) ranseed = time(NULL) % RAND_MAX;
	srand(ranseed);

	char *clear = (char*) malloc( strlen(blanks) + strlen(punctuation) + 1);
	strcpy(clear, blanks);
	strcat(clear, punctuation);

	if(tech){
		fprintf(out, "---===[Файл создан программой Delirium 1.8]===---\r\n");
		fprintf(out, "Параметры программы:\r\n");
		for(i = 0; i <= intotal; i++)
			fprintf(out, "\tВходной файл %d: %s\r\n", i + 1, innames[i]);
		
		fprintf(out, "\tВыходной файл: %s\r\n", outname);
		fprintf(out, "Настройки эксперта:\r\n");
		fprintf(out, "\tКоличество ключевых слов: %d\r\n", keywords);
		fprintf(out, "\tПоказатель размера хеш-таблицы: %d\r\n", hash_exp);
		fprintf(out, "\tСемя генератора случайных чисел: %d\r\n", ranseed);
		fprintf(out, "\tУвеличить частоту слов: %s\r\n", keybonused);
		fprintf(out, "\tБонус частоты слов: 0.%d\r\n", key_bonus);
		fprintf(out, "\tИгнорируемые символы: %s\r\n", punctuation);
		fprintf(out, "\tГенерировать текст не более %d слов\r\n", max_length);
		fprintf(out, "---===[    Конец технической информации   ]===---\r\n\r\n");
		
	}

	max_hash = int(pow(2, hash_exp));
	struct KeyEntry **StringPairs = (struct KeyEntry**) calloc(max_hash, sizeof(struct KeyEntry**));
	struct KeyEntry **BonusStringPairs = (struct KeyEntry**) calloc(max_hash, sizeof(struct KeyEntry**));


	for(i = 0; i <= intotal; i++){
			if(  !(in = fopen(innames[i], "r"))){
			fclose(out);
			return -1;
		}
		if( i == 0) firstkey(in, FKey, clear);
		rewind(in);
		processfile(hWnd, in, StringPairs, BonusStringPairs, clear);
		fclose(in);
	}

	//PostMessage(hWnd, PBM_SETRANGE, 0, MAKELPARAM(0, max_length - 1));
	//PostMessage(hWnd, PBM_SETPOS, 0, 0);
	createdelirium(hWnd, out, StringPairs, BonusStringPairs, FKey, max_length);
	
	if(tech){
		fprintf(out, "\r\n\r\n---===[Файл создан программой Delirium 1.8]===---\r\n");
		fprintf(out, "\tВремя работы программы: %f секунд\r\n", float(clock() - start)/CLOCKS_PER_SEC);
		fprintf(out, "---===[    Конец технической информации   ]===---\r\n");
	}

	fflush(out);
	fclose(out);
	clearstore(StringPairs);
	clearstore(BonusStringPairs);
	if(truerandom) ranseed = 0;
	return 0;//все тип-топ
}
 
и в чем проблема?

файл chains.h - объявление функций для работы с цепями
PHP:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>

#include "windows.h"
#include "commctrl.h"

#include "resource.h"

#define DEF_IGNORE "@#^_;:\\|/<>~"

int mainproc(HWND hWnd, char **innames, int intotal, char *outname);
void SetPercentage(HWND hWnd, int total);
int wordcount(FILE *in, const char *clear);
void insert(const char *KeyAndWord, struct KeyEntry **StoreStruct);
//вставка ключа и слова в базу
char *randword(const char *Key, struct KeyEntry **StoreStruct);
//случайное слово из базы
void processfile(HWND hWnd, FILE *in, struct KeyEntry **WordStruct, struct KeyEntry **BonusWordStruct, const char *clear);
//создание базы на основе файла, clear - ненужные символы
void createdelirium(HWND hWnd, FILE *out, struct KeyEntry **WordStruct, struct KeyEntry **BonusWordStruct, const char *start, const int length);
//создание бреда из не более length слов
unsigned int strhash(const char *s);
//хеш строки, не более max_hash - лучше заменить на что-то более продвинутое или хватит и такого

struct StringListItem{
	char *String;
	struct StringListItem *Next;
};

struct KeyEntry{
	char *Key;
	struct KeyEntry *Another;

	struct StringListItem *Word;
	unsigned int NumberOfFollowers;

};
и файл chains.cpp реализация этих функций
PHP:
/*
Нам говорят "безумец" и "фантаст",
Но, выйдя из зависимости грустной,
C годами мозг мыслителя искусный
Мыслителя искусственно создаст.
                       Гете
*/

#include "chains.h"


const char blanks[] = "\n\r\t";
char punctuation[] = DEF_IGNORE;//все знаки препинания;
char keybonused[1024];
int max_hash = 32;//максимальное значение хеша
int hash_exp = 15;//показатель степени
int totalwords = 0;
int keywords = 2;
int max_length = 1000;
int key_bonus = 4;
int ranseed = 0;
bool tech = true;

unsigned int strhash(const char *s){
    // (c) K&R
	unsigned int hashval;

	for (hashval = 0; *s != '\0'; s++)
		hashval = *s + 31 * hashval;
	return hashval % max_hash;
}

inline void SetPercentage(HWND hWnd, int current, int total){
	static int prev = 0, prevtotal = 0;

	const int smooth = 10; //В процентах, насколько гладко идет прогрессбар

	if(total != prevtotal){
		prev = 0;
		prevtotal = total;
	}

	if ((current - prev) >= smooth * (total / 100))
		SendMessage(hWnd, PBM_SETPOS, ((prev = current) * 100) / total, 0);
	
}

char *randword(const char *Key, struct KeyEntry **StoreStruct){
	struct KeyEntry *KeyIns;
	struct StringListItem *WordIns;
	int randnum = 0;

	if(StoreStruct[ strhash(Key)]){
		for(KeyIns = StoreStruct[ strhash(Key)]; KeyIns && strcmp(KeyIns -> Key, Key); KeyIns = KeyIns -> Another);
		if(!KeyIns || strcmp(KeyIns -> Key, Key)){
			return NULL;
		}

		randnum = (KeyIns -> NumberOfFollowers) - (rand() % KeyIns -> NumberOfFollowers) - 1;


		for(WordIns = KeyIns -> Word; randnum > 0; WordIns = WordIns -> Next) randnum--;
		
		return WordIns -> String;
	}

	return NULL;
}

void insert(const char *KeyAndWord, struct KeyEntry **StoreStruct){
	char Key[1024] = {0}, Word[1024];
	struct KeyEntry *KeyIns;
	bool init = false;
	struct StringListItem *WordIns;

	//разваливаю в ключ и слово
	strncpy(Key, KeyAndWord, strrchr(KeyAndWord, ' ') - KeyAndWord);
	strcpy(Word, strrchr(KeyAndWord, ' ') + 1);

	if(StoreStruct[ strhash(Key)]){
		KeyIns = StoreStruct[ strhash(Key)];
        while(strcmp(KeyIns -> Key, Key)){
			if(KeyIns ->Another) KeyIns = KeyIns ->Another;
			else break;
		}

        if(strcmp(KeyIns -> Key, Key)){
			KeyIns = (KeyIns -> Another = (struct KeyEntry*) malloc(sizeof( struct KeyEntry)));
			init = true;
		}
	} 
	else{
		//инициализируем
		KeyIns = (StoreStruct[ strhash(Key)] = (struct KeyEntry*) malloc(sizeof( struct KeyEntry)));
		init = true;
	}

	if(init){
		strcpy(KeyIns -> Key = (char*) calloc(strlen(Key) + 1, sizeof(char)), Key);
		KeyIns -> Another = NULL;
		KeyIns -> Word = NULL;
		KeyIns -> NumberOfFollowers = 0;
	}
	KeyIns -> NumberOfFollowers++;
	//добавляю слово в KeyIns -> Word
	

	WordIns = (struct StringListItem*) malloc(sizeof( struct StringListItem));
	strcpy(WordIns -> String = (char*) calloc(strlen(Word) + 1, sizeof(char)), Word);
	WordIns -> Next = KeyIns -> Word;
	KeyIns -> Word = WordIns;
	

}

int wordcount(FILE *in, const char *clear){
	char current, last = ' ';
	int spaces = 0;

	while ((current = fgetc(in)) && (!(feof(in)))){
		if(strchr(clear, current)){
			current = ' ';
		}
		if (!((current == ' ') && (last == ' '))){
			if(current == ' ') spaces++;
		}

		last = current;
	}

	rewind(in);
	return spaces;
}

void firstkey(FILE *in, char *Key, const char *clear){
	char current, last = ' ';
	int copied = 0, spaces = 0;

	while ((current = fgetc(in)) && (!(feof(in)))){
		if(strchr(clear, current)){
			current = ' ';
		}
		if (!((current == ' ') && (last == ' '))){
			if(current == ' ') spaces++;

			if (spaces == keywords){
				Key[copied] = '\0';
				return;
			}

			Key[copied++] = current;
			last = current;
		}
	}


}

void processfile(HWND hWnd, FILE *in, struct KeyEntry **WordStruct, struct KeyEntry **BonusWordStruct, const char *clear){
	char NewWords[1024], current, last = ' ';
	char *specialstart, *special;
	int copied = 0, spaces = 0, total = 0, allwords = wordcount(in, clear);

	while ((current = fgetc(in)) && (!(feof(in)))){
		if(strchr(clear, current)){
			current = ' ';
		}
		if (!((current == ' ') && (last == ' '))){
			if(current == ' ') spaces++;

			if (spaces == keywords + 1){
				NewWords[copied] = '\0';
				insert(NewWords, WordStruct);

//если последнее слово в NewWords входит в keybonused, добавить NewWords в BonusWordStruct
				if( ((specialstart = strstr(keybonused, special = strrchr(NewWords, ' ') + 1)) != NULL)){
					if( ((specialstart == keybonused) || (*(specialstart - 1) == ' ')) && ((*(specialstart + strlen(special) ) == ' ') || (*(specialstart + strlen(special) ) == '\0'))){
						insert(NewWords, BonusWordStruct);
					}
				}


				SetPercentage(hWnd, total++, allwords);

				strcpy(NewWords, strchr(NewWords, ' ') + 1);
				spaces = keywords; copied = strlen(NewWords);
			}

			NewWords[copied++] = current;
			last = current;
		}
	}

	rewind(in);
}

void clearstore(struct KeyEntry **StoreStruct){
	struct KeyEntry *KI, *KIP = 0;
	struct StringListItem *WI, *WIP = 0;
	for(int i = 0; i < max_hash; i++){
		for(KI = StoreStruct[ i]; KI; KI = (KIP = KI) -> Another){
			free(KI -> Key);
			free(KIP);
			for(WI = KI -> Word; WI; WI = (WIP = WI) -> Next){
				free(WI -> String);
				free(WIP);
			}
			free(WI);

		}
		free(KI);
	}
	free(StoreStruct);
}

void createdelirium(HWND hWnd, FILE *out, struct KeyEntry **WordStruct, struct KeyEntry **BonusWordStruct, const char *start, const int length){
	int i;
	char Key[1024], *Word;

	strcpy(Key, start);
	fprintf(out, "%s ", Key);
	for(i = 0; i <= length; i++){
		SetPercentage(hWnd, i, length);
		if(((rand() % 10) < key_bonus) && (Word = randword(Key, BonusWordStruct))){}
		else if(!(Word = randword(Key, WordStruct))) return;
		fprintf(out, "%s ", Word);
		strcpy(Key, strchr(Key, ' ') + 1);
		sprintf(Key, "%s %s", Key, Word);
	}
}

int mainproc(HWND hWnd, char **innames, int intotal, char *outname){
	hWnd = GetDlgItem(hWnd, IDC_PROGRESS);
	
	long start = clock();

	FILE *in, *out;
	bool truerandom = false;
	int i;

	if(  !(out = fopen(outname, "w"))){
		return -1;//файлы кривые 
	}

	if( intotal < 0){
		fclose(out);
		return -1;//файлы кривые 
	}

	char FKey[1024] = {0};
	if(truerandom = !ranseed) ranseed = time(NULL) % RAND_MAX;
	srand(ranseed);

	char *clear = (char*) malloc( strlen(blanks) + strlen(punctuation) + 1);
	strcpy(clear, blanks);
	strcat(clear, punctuation);

	if(tech){
		fprintf(out, "---===[Файл создан программой Delirium 1.8]===---\r\n");
		fprintf(out, "Параметры программы:\r\n");
		for(i = 0; i <= intotal; i++)
			fprintf(out, "\tВходной файл %d: %s\r\n", i + 1, innames[i]);
		
		fprintf(out, "\tВыходной файл: %s\r\n", outname);
		fprintf(out, "Настройки эксперта:\r\n");
		fprintf(out, "\tКоличество ключевых слов: %d\r\n", keywords);
		fprintf(out, "\tПоказатель размера хеш-таблицы: %d\r\n", hash_exp);
		fprintf(out, "\tСемя генератора случайных чисел: %d\r\n", ranseed);
		fprintf(out, "\tУвеличить частоту слов: %s\r\n", keybonused);
		fprintf(out, "\tБонус частоты слов: 0.%d\r\n", key_bonus);
		fprintf(out, "\tИгнорируемые символы: %s\r\n", punctuation);
		fprintf(out, "\tГенерировать текст не более %d слов\r\n", max_length);
		fprintf(out, "---===[    Конец технической информации   ]===---\r\n\r\n");
		
	}

	max_hash = int(pow(2, hash_exp));
	struct KeyEntry **StringPairs = (struct KeyEntry**) calloc(max_hash, sizeof(struct KeyEntry**));
	struct KeyEntry **BonusStringPairs = (struct KeyEntry**) calloc(max_hash, sizeof(struct KeyEntry**));


	for(i = 0; i <= intotal; i++){
			if(  !(in = fopen(innames[i], "r"))){
			fclose(out);
			return -1;
		}
		if( i == 0) firstkey(in, FKey, clear);
		rewind(in);
		processfile(hWnd, in, StringPairs, BonusStringPairs, clear);
		fclose(in);
	}

	//PostMessage(hWnd, PBM_SETRANGE, 0, MAKELPARAM(0, max_length - 1));
	//PostMessage(hWnd, PBM_SETPOS, 0, 0);
	createdelirium(hWnd, out, StringPairs, BonusStringPairs, FKey, max_length);
	
	if(tech){
		fprintf(out, "\r\n\r\n---===[Файл создан программой Delirium 1.8]===---\r\n");
		fprintf(out, "\tВремя работы программы: %f секунд\r\n", float(clock() - start)/CLOCKS_PER_SEC);
		fprintf(out, "---===[    Конец технической информации   ]===---\r\n");
	}

	fflush(out);
	fclose(out);
	clearstore(StringPairs);
	clearstore(BonusStringPairs);
	if(truerandom) ranseed = 0;
	return 0;//все тип-топ
}


А как мне это использовать в c++ builder? Хотел функцию типа: AnsiString markov(AnsiString text;int keys_from;int keys_to)
 
:(
разбирай функцию processfile

готовый код тебе никто давать не будет. Неужеди трудно перенести код с VC++ в борланд ?

PS имхо RTFM и учи матчасть
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху