Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Реализации различных алгоритмов на Си / Блочный поиск (int) - строка

.doc
Скачиваний:
23
Добавлен:
20.06.2014
Размер:
75.78 Кб
Скачать

5

Задание кафедры

Написать программу, осуществляющую поиск заданного элемента в последовательности из входного файла. Имя входного файла вводятся пользователем. На экране должны отображаться исходная последовательность и найденный элемент с указанием его номера в последовательности. Формат файлов текстовой, кол-во записей в файле неограниченно. Если для алгоритма поиска необходимо отсортировать последовательность, то предварительную сортировку нужно осуществить алгоритмом из лабораторной работы №1. После поиска одного элемента программа должна предлагать осуществить поиск или выход.

Вариант: 2s

блочный поиск

Блок схема алгоритма

indend = (o’-o+1)*(i+1)/k-1

arr[ind]==elem

#include<stdio.h>

#include<conio.h>

#include<string.h>

int read(char*name);

int write(char*name);

int search(char* s);

int search1(int i1, int i2,char* s );

int directsearch(int i1, int i2,char* s);

void sort();

void print();

char **arr,**sortarr;

int *positions;

int n,k=5;

main()

{

char f1[256],f2[256],e[1024];

int res,i, sortedindex,originalindex;

printf("Input source file name:");

scanf("%s",f1);

printf("Input destination file name:");

scanf("%s",f2);

res = read(f1);

if (res)

{

printf("Error reading file.");

getch();

return 0;

}

print();

sort();

print();

for(;;)

{

printf("\n\nInput value (0 for exit)");

scanf("%s",e);

if (strcmp(e,"0") == 0) break;

sortedindex=search(e);

if(sortedindex!=-1)

{

originalindex = positions[sortedindex];

printf("\nvalue #%d,%s",originalindex,arr[sortedindex]);

}

else printf("\nValue not found");

}

res = write(f2);

if (res)

{

printf("Error writing file.");

getch();

return 0;

}

for(i=0;i<n;i++) delete arr[i];

delete arr;

delete positions;

return 0;

}

int read(char*name)

{

FILE*f;

char *tmp=NULL;

int i,len;

tmp = new char [1024];

f = fopen(name,"rt");

if (f == NULL) return 1;

// count

for(i=0; ;i++)

{

if (feof(f)) break;

fscanf(f,"%s",tmp);

}

n=i;

arr = new char* [n];

positions = new int [n];

for(i=0;i<n;i++) arr[i]=NULL;

fclose(f);

//read

f= fopen(name,"rt");

if (f == NULL) return 1;

for(i=0;i<n ;i++)

{

fscanf(f,"%s",tmp);

len=strlen(tmp);

arr[i]= new char [len+1];

strcpy(arr[i],tmp);

}

delete tmp;

fclose(f);

return 0;

}

int write(char*name)

{

int i;

FILE *f;

f=fopen(name,"wt");

if (f == NULL) return 1;

for(i=0;i<n ;i++)

{

fprintf(f,"%s ",arr[i]);

}

fclose(f);

return 0;

}

int search(char* s)

{

int res;

res=search1(0,n-1,s);

return res;

}

int search1(int i1, int i2,char* s )

{

int res,i;

int indbeg;

int indend;

if(i2-i1<k) return directsearch(i1,i2,s);

for(i=0;i<k;i++)

{

indend=(i2-i1+1)*(i+1)/k-1;

indbeg=(i2-i1+1)*(i)/k;

res=strcmp(arr[indend],s);

if(res==0) return indend;

else if (res > 0) return search1(indbeg,indend,s);

}

return -1;

}

int directsearch(int i1, int i2,char* s)

{

int i;

for(i=i1;i<=i2;i++)

{

if(strcmp(s,arr[i])==0) return i;

}

return -1;

}

void sort()

{

int i,j,*B;

sortarr = new char* [n];

B = new int[n];

for(i=0;i<n;i++) B[i]=0;

for(i=0;i<n;i++)

{

for(j=0;j<n;j++)

{

if(strcmp(arr[i],arr[j])>0) B[i]++;

}

}

printf("\n");

for(i=0;i<n;i++)

{

for(j=i+1;j<n;j++)

{

if(arr[i]==arr[j]) B[i]++;

}

}

for(i=0;i<n;i++)

{

sortarr[B[i]]=arr[i];

positions[B[i]] = i;

}

for(i=0;i<n;i++)

{

arr[i]=sortarr[i];

}

delete sortarr,B;

}

void print()

{

int i;

for(i=0;i<n;i++)

{

printf("%s ",arr[i]);

}

}