
Реализации различных алгоритмов на Си / Блочный поиск (int) - строка
.doc
Задание кафедры
Написать программу, осуществляющую поиск заданного элемента в последовательности из входного файла. Имя входного файла вводятся пользователем. На экране должны отображаться исходная последовательность и найденный элемент с указанием его номера в последовательности. Формат файлов текстовой, кол-во записей в файле неограниченно. Если для алгоритма поиска необходимо отсортировать последовательность, то предварительную сортировку нужно осуществить алгоритмом из лабораторной работы №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]);
}
}