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

Лабораторная работа №2 (Вариант 12)

.docx
Скачиваний:
15
Добавлен:
20.06.2014
Размер:
48.71 Кб
Скачать

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ

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

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

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

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

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

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

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

на тему:

«Программирование алгоритмов ускоренного поиска информации»

Студент

Ключанских А.С

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

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

Группа

АС-10

Принял

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

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

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

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

Липецк 2011

  1. Задание кафедры

Цель работы

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

Задание кафедры

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

№ п/п

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

Вид поиска:

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

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

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

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

Метод поиска

12

  1. char[]

3

int

2.г

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

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

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

#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;

}

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

Содержимое входного файла:

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 сравнений, оно намного лучше, чем связанный список, в котором возможен лишь последовательный поиск.

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

  1. Шилдт, Г. C++ Шаг за шагом [Текст]: учеб.пособие/ Г. Шилдт.— М.: «ЭКОМ», 2007. — 640 с.

  2. Шилдт Г. Полный справочник по С [Текст]: учеб.пособие/ Г. Шилдт. — М.: «Вильямс», 2009. — 704 с.