Лабораторная работа №2 (Вариант 12)
.docxМИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ
ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ
ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ
ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ
Лабораторная работа №2
по дисциплине
«Технология программирования»
на тему:
«Программирование алгоритмов ускоренного поиска информации»
|
Студент |
|
|
|
Ключанских А.С |
|
|||||||||
|
|
|
подпись, дата |
|
фамилия, инициалы |
|
|||||||||
|
Группа |
|
АС-10 |
|
|
|
|||||||||
|
|
|
|
|
|
|
|||||||||
|
Принял |
|
|
|
|
|
|||||||||
|
|
|
|
|
Домашнев П.А. |
|
|||||||||
|
ученая степень, звание |
|
подпись, дата |
|
фамилия, инициалы |
|
Липецк 2011
-
Задание кафедры
Цель работы
Приобретение навыков реализации алгоритмов программного поиска в информационных массивах.
Задание кафедры
Написать программу, реализующую один из алгоритмов программного поиска данных в информационном массиве, расположенном в оперативной памяти (по желанию, можно считывать данные из файла), используя выбранные в соответствии с вариантом из табл. 2 формат ключа, формат других полей записи, вид и метод поиска.
№ п/п |
|
Вид поиска: 1 - по совпадению 2 – по интервалу 3 – по выражению |
Формат неключевых полей записи |
Метод поиска |
12 |
|
3 |
int |
2.г |
-
Поиск по двоичному дереву (2.г)
Осуществляется в соответствии с принципами, по которым построено дерево поиска. Первое обращение производится в корень. Если текущий элемент (из узла дерева, в начале – из корня) меньше аргумента, следующим будет рассматриваться правое поддерево; если текущий элемент больше аргумента, следующим будет рассматриваться левое поддерево; если при попытке осуществить переход по левой или правой обнаруживается, что ссылка отсутствует, результат поиска является отрицательным. Наименьшее число сравнений, требующееся при поиске в двоичном сбалансированном дереве, log2N.
-
Листинг программы
#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <locale.h>
struct node {
char *key;
int count;
struct node *left,*right;
}*root;
struct node *add_node(struct node *root,char *str,int x);
struct node *new_node(char *str,int x);
struct node *search(struct node *root);
int main(void){
setlocale(LC_ALL,"Russian");
FILE *fp;
char str[20];
int x;
struct node *result;
root = NULL;
if((fp = fopen("1.txt","r"))!=NULL){
while((fscanf(fp,"%s%d",str,&x))!=EOF)
root=add_node(root,str,x);
}
else return -1;
result=search(root);
if(!result) printf("На кафедре АСУ такого сотрудника нет\n");
else printf("Фамилия преподавателя кафедры АСУ: %s\nКоличество отчисленных им студентов: %d\n",result->key,result->count);
fclose(fp);
getch();
return 0;
}
struct node *add_node(struct node *root,char *str,int x){
struct node **prior;
struct node *ptr;
if(root!=NULL){
ptr=root;
while(ptr!=NULL)
if(strcmp(str,ptr->key)<0){
prior=&ptr->left;
ptr=ptr->left;
}
else{
prior=&ptr->right;
ptr=ptr->right;
}
*prior=new_node(str,x);
return root;
}
return new_node(str,x);
}
struct node *new_node(char *str,int x){
struct node *ptr;
ptr=(struct node *)malloc(sizeof(struct node));
ptr->key=(char *)malloc(strlen(str)+1);
strcpy(ptr->key,str);
ptr->count=x;
ptr->left=ptr->right=NULL;
return ptr;
}
struct node *search(struct node *root)
{
struct node *record;
record=root;
while(!(record->key[0]=='d'&&strlen(record->key)<=9)){ //поиск по выражению
if(record->key[0]>'d')
record=record->left;
else
record=record->right;
if(record==NULL) return NULL;
}
return record;
}
-
Контрольный пример
Содержимое входного файла:
kuznetsov 999999
kachanovsky 500
vedishev 10
korneev 50
gaev 666
nazarkin -1
mahlishev -1
boldirihin 30
ghuravleva -2
alekseev 50
domashnev 666666
ovchinnikov 15
kapnin 40
tishenko -1
farafonov 5
dorin 1
Выражение: 1 символ ключа равен ‘k’, длина ключа не превышает 9 символов.
Выражение: 1 символ ключа равен ‘d’, длина ключа не превышает 5 символов.
Выражение: 1 символ ключа равен ‘u’, длина ключа не превышает 4 символов.
5. Вывод
При выполнении данной лабораторной работы я получил навыки программирования методов ускоренного поиска информации, научился работать с бинарным деревом. Бинарные деревья — исключительно мощное, гибкое и эффективное средство. Поскольку при поиске в сбалансированном дереве выполняется в худшем случае log2n сравнений, оно намного лучше, чем связанный список, в котором возможен лишь последовательный поиск.
-
Список использованной литературы
-
Шилдт, Г. C++ Шаг за шагом [Текст]: учеб.пособие/ Г. Шилдт.— М.: «ЭКОМ», 2007. — 640 с.
-
Шилдт Г. Полный справочник по С [Текст]: учеб.пособие/ Г. Шилдт. — М.: «Вильямс», 2009. — 704 с.