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

Лабораторная работа №2 Вариант №16 (только листинг)

.cpp
Скачиваний:
5
Добавлен:
20.06.2014
Размер:
3.04 Кб
Скачать
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <locale.h>
# include <math.h>
struct s
{
	int ind;
	char p[20];
	char n[20];
}*mas, **mas1;

void vvod(int kolvo_el)
	{
	mas=(s*)malloc(kolvo_el*sizeof(s));
	printf("Введите данные:\n ");
	for(int i=0;i<kolvo_el;i++)
			{
			mas[i].ind=i;
			printf("Введите mas[%d]:\n", i+1);
			scanf("%s", mas[i].p);//1
			scanf("%s", mas[i].n);//2
			}
	}

void sortirovka(int kolvo_el)
	{
		int p,i,j,k;
	s vrem;
	for(i=0;i<2;i++)
	for(k=0,p=1;k<kolvo_el-1;k++,p++)
	for(j=0;j<kolvo_el-p;j++)
		{
		if(i==0)
		if(strcmp(mas1[i][j].p,mas1[i][j+1].p)==1)
				{
				vrem=mas1[i][j+1];
				mas1[i][j+1]=mas1[i][j];
				mas1[i][j]=vrem;
				}
		if(i==1)
		if(strcmp(mas1[i][j].n,mas1[i][j+1].n)==1)
				{
				vrem=mas1[i][j+1];
				mas1[i][j+1]=mas1[i][j];
				mas1[i][j]=vrem;
				}
		}

	}

	int *poisk(int kolvo_el,int *itog)
{
	int t=0, i, j, k, p, h, *u1, *u2;
	s *bloki;
	char str1[20], str2[20];
	printf("Введите данные для поиска (1 ключ): ");
    scanf("%s", str1);
    printf("Введите данные для поиска (2 ключ): ");
    scanf("%s", str2);
	p=(int)sqrt((double)kolvo_el);
	u1=(int*)malloc(kolvo_el*sizeof(int));
	u2=(int*)calloc(kolvo_el,sizeof(int));
	for(i=0;i<kolvo_el;i++)
		u1[i]=u2[i]=-1;
	bloki=(s*)malloc(p*sizeof(s));
	for(j=kolvo_el-1,k=p-1;j>0;j-=p,k--)
		bloki[k]=mas1[0][j];
	for(j=p-1,k=0;k<p;j+=p,k++)
		if(strcmp(bloki[k].p,str1)==1)
		{
			for(i=j,h=0;i>-1;i--)
			{
				if(strcmp(mas1[0][i].p,str1)==0)
				{
					u1[h]=mas1[0][i].ind;
					h++;
				}
				if(strcmp(mas1[0][i].p,str1)==-1)
					break;
			}
			break;
		}
		for(j=kolvo_el-1,k=p-1;j>0;j-=p,k--)
			bloki[k]=mas1[1][j];
		for(j=p-1,k=0;k<p;j+=p,k++)
			if(strcmp(bloki[k].n,str2)==1)
			{
				for(i=j,h=0;i>-1;i--)
				{
					if(strcmp(mas1[1][i].n,str2)==0)
					{
						u2[h]=mas1[1][i].ind;
						h++;
					}
					if(strcmp(mas1[1][i].n,str2)==-1)
						break;
				}
				break;
			}
			for(i=0;i<kolvo_el;i++)
			{
				if(u1[i]==-1)
					break;
				for(j=0;j<kolvo_el;j++)
					if(u1[i]==u2[j])
					{
						itog[t]=u1[i];
						t++;
						break;
					}
			}
			free(u1);
			free(u2);
			free(bloki);
			return itog;
	}
	
void main()
	{
	setlocale(LC_ALL, "Rus");
	int i, j, kolvo_el,*itog;
	printf("Сколько элемнтов будет в информационном массиве? ");
	scanf("%d", &kolvo_el);
	vvod(kolvo_el);
	mas1=(s**)malloc(2*sizeof(s*));
	for(i=0;i<2;i++)
	mas1[i]=(s*)malloc(kolvo_el*sizeof(s));
	for(i=0;i<2;i++)
	for(j=0;j<kolvo_el;j++)
	mas1[i][j]=mas[j];
	sortirovka(kolvo_el);
	itog=(int*)calloc(kolvo_el,sizeof(int));
	for(i=0;i<kolvo_el;i++)
	itog[i]=-1;
	itog=poisk(kolvo_el,itog);
	printf("Результаты поиска:\n");
	for(i=0;i<kolvo_el;i++)
		{
		if(itog[i]==-1)
		break;
		printf("%s %s\n",mas[itog[i]].p,mas[itog[i]].n);
		}
	if(i==0)
	printf("Поиск не дал результатов.");
	free(mas);
	free(mas1);
	free(itog);
	getch();
	}