
Лабораторная работа №2 Вариант 17 / лаб №2
.doc
ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ
Лабораторная работа №2
по дисциплине
«Технология программирования»
на тему:
«Поиск»
|
Студент |
|
|
|
|
|
||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
||||||||
|
Группа |
|
|
|
|
|
|
|||||||
|
|
|
|
|
|
|
||||||||
|
Принял |
|
|
|
Домашнев П.А. |
|
||||||||
|
|
|
|
|
|
|
||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2011
-
Задание
Написать программу, реализующую один из алгоритмов программного поиска данных в информационном массиве, расположенном в оперативной памяти (по желанию, можно считывать данные из файла), используя выбранные в соответствии с вариантом из табл. 2 формат ключа, формат других полей записи, вид и метод поиска.
-
№ п/п
-
Формат ключа
Вид поиска:
2 - по интервалу
Формат неключевых полей записи
Метод поиска
7
-
char[]
2
float
2.г
-
-
Краткие теоретические сведения
Поиск по интервалу
Аргумент содержит имена одного или нескольких признаков и пределы изменения значений этих признаков. В процессе поиска из информационного массива выделяется подмножество записей, значения полей из аргумента поиска которых попадают в интервал элемента поиска.
Поиск по двоичному дереву (2.г)
Осуществляется в соответствии с принципами, по которым построено дерево поиска (см. п. 1.1.1). Первое обращение производится в корень. Если текущий элемент (из узла дерева, в начале – из корня) меньше аргумента, следующим будет рассматриваться правое поддерево; если текущий элемент больше аргумента, следующим будет рассматриваться левое поддерево; если при попытке осуществить переход по левой или правой обнаруживается, что ссылка отсутствует, результат поиска является отрицательным. Наименьшее число сравнений, требующееся при поиске в двоичном сбалансированном дереве, log2N.
-
Блок-схема программы
-
Листинг программы
#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();
}
-
Контрольный пример
-
Выводы о проделанной работе
Приобрел навыки реализации программ поиска данных.
-
Список использованной литературы
-
Кнут, Д. Э. Искусство программирования, том 3. Сортировка и поиск / Д. Э. Кнут. – М.: "Вильямс", 2000. – 832 с.
-
Ахо, А. В. Структуры данных и алгоритмы / А. В. Ахо, Дж. Хопкрофт, Дж. Д. Ульман. – М.: "Вильямс", 2000. – 384 с.
-
Кондратьева, С. Д. Введение в структуры данных / С. Д. Кондратьева. – М.: Изд-во МГТУ им. Н.Э. Баумана, 2000. – 376 с.
-
Макконнелл, Дж. Основы современных алгоритмов / Дж. Макконнелл. – М.: Техносфера, 2004. – 368 с.