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

5

  1. Задание

№ п/п

  1. Формат ключа

Вид поиска:

1 - по совпадению

2 – по интервалу

3 – по выражению

Формат неключевых полей записи

Метод поиска

10

  1. int, char, float, char[]

1

char[], float

2.е

Многоаспектный поиск с использованием инверсных массивов (2.е)

Данные хранятся во внешней памяти. Среди записей выделяют поля, по которым может быть осуществлен запрос на многоаспектный поиск. Пусть имеется m таких полей. Создается m копий информационного массива, каждая из которых сортируется по одному из m ключевых полей и называется инверсным массивом. Для осуществления поиска по аргументу, состоящему из m ключей, в каждой из копий информационного массива проводится поиск по соответствующему ключевому полю. Над полученными m множествами записей проводится операция теоретико-множественного пересечения.

  1. Листинг программы

#include <stdio.h>

#include <string.h>

#include <conio.h>

#include <stdlib.h>

#include <locale.h>

#include <string.h>

struct s

{

int k;

char p;

float l;

char n[20];

}*mas, **mas1, m;

struct s* vvod(struct s* mas, int &kolvo_el)

{

printf("Сколько элемнтов будет в информационном массиве?");

scanf("%d", &kolvo_el);

mas=(s*)malloc(kolvo_el*sizeof(s));

printf("Введите данные:\n ");

for(int i=0;i<kolvo_el;i++)

{

printf("Введите mas[%d]: ", i);

scanf("%d", &mas[i].k);

scanf("%s", &mas[i].p);

scanf("%f", &mas[i].l);

scanf("%s", &mas[i].n);

}

return mas;

}

struct s* sortirovka1(struct s*mas, int kolvo_el)

{

int gap, i, j;

gap=(int)(kolvo_el/2);

while(gap>0)

{

for(i=gap;i<kolvo_el;i++)

{

m=mas[i];

for( j=i-gap;(m.k<mas[j].k)&&(j>=0);j=j-gap)

{

mas[j+gap]=mas[j];

}

mas[j+gap]=m;

}

gap=(int)(gap/2);

}

return mas;

}

struct s* sortirovka2(struct s*mas, int kolvo_el)

{

int gap, i, j;

gap=(int)(kolvo_el/2);

while(gap>0)

{

for(i=gap;i<kolvo_el;i++)

{

m=mas[i];

for( j=i-gap;(m.p<mas[j].p)&&(j>=0);j=j-gap)

{

mas[j+gap]=mas[j];

}

mas[j+gap]=m;

}

gap=(int)(gap/2);

}

return mas;

}

struct s* sortirovka3(struct s*mas, int kolvo_el)

{

int gap, i, j;

gap=(int)(kolvo_el/2);

while(gap>0)

{

for(i=gap;i<kolvo_el;i++)

{

m=mas[i];

for( j=i-gap;(m.l<mas[j].l)&&(j>=0);j=j-gap)

{

mas[j+gap]=mas[j];

}

mas[j+gap]=m;

}

gap=(int)(gap/2);

}

return mas;

}

struct s* sortirovka4(struct s*mas, int kolvo_el)

{

int gap, i, j;

gap=(int)(kolvo_el/2);

while(gap>0)

{

for(i=gap;i<kolvo_el;i++)

{

m=mas[i];

for( j=i-gap;(m.n<mas[j].n)&&(j>=0);j=j-gap)

{

mas[j+gap]=mas[j];

}

mas[j+gap]=m;

}

gap=(int)(gap/2);

}

return mas;

}

struct s** poisk(struct s** mas1, int c, int kolvo_el)

{

int t=0, i, j;

int K;

char P, str[20]="",str1[20]="";

float L;

if(c==1)

{

printf("Введите данные для поиска:\t");

scanf("%d", &K);

for(i=c-1;i<c;i++)

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

{

if(mas1[i][j].k==K)

printf("Найденный элемент: %d %c %f %s", mas1[i][j].k, mas1[i][j].p, mas1[i][j].l, mas1[i][j].n);

else

t++;

if(t==kolvo_el)

printf("Данные не найдены");

}

}

if(c==2)

{

printf("Введите данные для поиска:\t");

scanf("%c", &P);

for(i=c-1;i<c;i++)

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

{

if(mas1[i][j].p==P)

printf("Найденный элемент: %d %c %f %s", mas1[i][j].k, mas1[i][j].p, mas1[i][j].l, mas1[i][j].n);

else

t++;

if(t==kolvo_el)

printf("Данные не найдены");

}

}

if(c==3)

{

printf("Введите данные для поиска:\t");

scanf("%f", &L);

for(i=c-1;i<c;i++)

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

{

if(mas1[i][j].l==L)

printf("Найденный элемент: %d %c %f %s", mas1[i][j].k, mas1[i][j].p, mas1[i][j].l, mas1[i][j].n);

else

t++;

if(t==kolvo_el)

printf("Данные не найдены");

}

}

if(c==4)

{

printf("Введите данные для поиска:\t");

scanf("%s", &str);

for(i=c-1;i<c;i++)

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

{

if(strcmp(str,mas1[i][j].n)==0)

printf("Найденный элемент: %d %c %f %s", mas1[i][j].k, mas1[i][j].p, mas1[i][j].l, mas1[i][j].n);

else

t++;

if(t==kolvo_el)

printf("Данные не найдены");

}

}

return 0;

}

void main()

{

setlocale(LC_ALL, "Rus");

int i, j, c, kolvo_el;

mas=vvod(mas, kolvo_el);

re:printf("\n\n\nПо какому информационному полю вы хотите осуществить поиск?\nДля выполнения поиска по полю int нажмите 1\nДля выполнения поиска по полю char нажмите 2\nДля выполнения поиска по полю float нажмите 3\nДля выполнения поиска по полю char[] нажмите 4\n");

scanf("%d", &c);

mas1=(s**)malloc(4*sizeof(s*));

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

mas1[i]=(s*)malloc(kolvo_el*sizeof(s));

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

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

mas1[i][j]=mas[j];

switch(c)

{

case 1:

mas1[0]=sortirovka1(mas, kolvo_el);

poisk(mas1, c, kolvo_el);

break;

case 2:

mas1[1]=sortirovka2(mas, kolvo_el);

poisk(mas1, c, kolvo_el);

break;

case 3:

mas1[2]=sortirovka3(mas, kolvo_el);

poisk(mas1, c, kolvo_el);

break;

case 4:

mas1[3]=sortirovka4(mas, kolvo_el);

poisk(mas1, c, kolvo_el);

break;

default:

exit(1);

}

goto re;

getch();

}