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

2

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ

Лабораторная работа №2

по дисциплине

«Технология программирования»

на тему:

«Поиск»

Студент

подпись, дата

фамилия, инициалы

Группа

Принял

Домашнев П.А.

ученая степень, звание

подпись, дата

фамилия, инициалы

Липецк 2011

  1. Задание

Написать программу, реализующую один из алгоритмов программного поиска данных в информационном массиве, расположенном в оперативной памяти (по желанию, можно считывать данные из файла), используя выбранные в соответствии с вариантом из табл. 2 формат ключа, формат других полей записи, вид и метод поиска.

№ п/п

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

Вид поиска:

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

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

Метод поиска

7

  1. char[]

2

float

2.г

  1. Краткие теоретические сведения

Поиск по интервалу

Аргумент содержит имена одного или нескольких признаков и пределы изменения значений этих признаков. В процессе поиска из информационного массива выделяется подмножество записей, значения полей из аргумента поиска которых попадают в интервал элемента поиска.

Поиск по двоичному дереву (2.г)

Осуществляется в соответствии с принципами, по которым построено дерево поиска (см. п. 1.1.1). Первое обращение производится в корень. Если текущий элемент (из узла дерева, в начале – из корня) меньше аргумента, следующим будет рассматриваться правое поддерево; если текущий элемент больше аргумента, следующим будет рассматриваться левое поддерево; если при попытке осуществить переход по левой или правой обнаруживается, что ссылка отсутствует, результат поиска является отрицательным. Наименьшее число сравнений, требующееся при поиске в двоичном сбалансированном дереве, log2N.

  1. Блок-схема программы

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

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <locale.h>

#include <string.h>

int compareStrings(char* string1, char* string2) // Функция для сравнения двух строк, 1 если 1 строка > 2, 0 если равны, -1 в обратном случае

{

int minLength;

if (strlen(string1) >= strlen(string2)) minLength = strlen(string2);

else minLength = strlen(string1);

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

{

if (string1[i] > string2[i]) return 1;

if (string1[i] < string2[i]) return -1;

}

if (strlen(string1) == strlen(string2)) return 0;

if (strlen(string1) > strlen(string2)) return 1;

return -1;

}

typedef struct tree // обьявление типа "Элемент дерева"

{

char key[256];

float data;

struct tree *left;

struct tree *right;

} Tree;

Tree *add(Tree *root, char newKey[256], float newData) // добавление в дерево

{

if (root==NULL)

{

root = (Tree*)malloc(sizeof(Tree));

strcpy(root->key, newKey);

root->data = newData;

root->left = root->right = 0;

return root;

}

if (compareStrings(root->key, newKey) == 1)

root->left = add(root->left, newKey, newData);

else

root->right = add(root->right, newKey, newData);

return root;

}

void search(Tree *root, char stringStart[256], char stringEnd[256]) // поиск

{

if(root->left)

if (compareStrings(root->key, stringStart) == 1)

search(root->left, stringStart, stringEnd);

if (compareStrings(root->key, stringStart) >=0 && compareStrings(root->key, stringEnd) <= 0)

{

printf("%s %f\n\r",root->key, root->data);

}

if(root->right)

if (compareStrings(root->key, stringEnd) == -1)

search(root->right, stringStart, stringEnd);

}

void main()

{

setlocale(LC_ALL,"Russian");

int n;

char key[256], keyStart[256], keyEnd[256];

float data;

printf("Введите количество ключей: ");

scanf("%d",&n);

Tree *root = NULL;

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

{

printf("Введите ключ %i элемента: ",i+1);

scanf("%s", key);

printf("Введите данные %i элемента: ",i+1);

scanf("%f", &data);

root = add(root, key, data);

}

printf("Введите начальный ключ поиска: ");

scanf("%s", keyStart);

printf("Введите конечный ключ поиска: ");

scanf("%s", keyEnd);

if (compareStrings(keyStart, keyEnd) == 1)

{

printf("Ошибка в интервале");

return;

}

printf("Ключ Данные\n\r");

search(root, keyStart, keyEnd);

getch();

}

  1. Контрольный пример

  1. Выводы о проделанной работе

Приобрел навыки реализации программ поиска данных.

  1. Список использованной литературы

        1. Кнут, Д. Э. Искусство программирования, том 3. Сортировка и поиск / Д. Э. Кнут. – М.: "Вильямс", 2000. – 832 с.

        2. Ахо, А. В. Структуры данных и алгоритмы / А. В. Ахо, Дж. Хопкрофт, Дж. Д. Ульман. – М.: "Вильямс", 2000. – 384 с.

        3. Кондратьева, С. Д. Введение в структуры данных / С. Д. Кондратьева. – М.: Изд-во МГТУ им. Н.Э. Баумана, 2000. – 376 с.

        4. Макконнелл, Дж. Основы современных алгоритмов / Дж. Макконнелл. – М.: Техносфера, 2004. – 368 с.

Соседние файлы в папке Лабораторная работа №2 Вариант 17