Лабораторна робота 9

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
ІКНІ
Факультет:
Комп’ютерні науки
Кафедра:
Не вказано

Інформація про роботу

Рік:
2024
Тип роботи:
Лабораторна робота
Предмет:
Програмно-орієнтовані мови програмування
Варіант:
5

Частина тексту файла (без зображень, графіків і формул):

1) послідовність слів, впорядкування за довжинами слів (якщо довжини збігаються, то за абетковим порядком); 2) нижній (від листків) зліва направо; 3) 3.1) надрукувати список подій, які відносяться до заданого часового проміжку та вказати їхню кількість; 3.2) вилучити всі вузли, які є листками дерева; 4) симетричний справа наліво; 5) вилучення вузлів з довгими словами.  / /******************************************************************* * Ти мусиш десь на компі зробити файл під назвою vvid в блокноті * * Вона має бути заповнена так: слово ентер слово ентер * * Після останнього слова нічого не ставити! * * * * Наприклад вміст файл * * * * sagrg * dgfd * dhfdg * jhkfgbj * lghlbjl * kjhbf * nbnb * jfkhg * hjxfg * ghfgjf * * dhyjg * fkfjk * kjlagfhg * jkhbf * uilgn * * * *******************************************************************/ //Підключаєм бібліотекі //<stdlib.h> для виділення пам"яті #include<stdio.h> #include<stdlib.h> #include<string.h>//Для пошуку покмбінації //MAX-Довжина слова #define MAX 10 //Структура дерева: слово і вказівники на менший і більший елемент typedef struct DER { char k[MAX]; struct DER *bil,*men; } der; //р-вказівник на корінь дерева der* p; int kil;//Для того щоб знати скільки слів вивели //Функція формування дерева void form(der* pn,der** pz) { int a,b,i; a=b=i=0;//Онулюєм if(*pz==NULL)//Якщо місце пусте вставляєм в нього новий елемент { *pz=pn; return; } while(pn->k[a]!='\0')//Рахуєм довжину нового слова a++; while((*pz)->k[b]!='\0')//Рахуєм довжину поточного слова b++; if(a==b)//Якщо довжина однакова перевіряєм по алфавіту { a=b=0; while(a==b)//Робим цикл доти доки коди символів небудуть різними { if(pn->k[i]=='\0'&&(*pz)->k[i]=='\0')//Якщо в обох словах є нуль символ значить вони одинакові { free(pn);//Видаляєм нове одинакове слово return; } a+=pn->k[i];//Сюда сумуєм коди символів нового речення b+=(*pz)->k[i++];//Сюда сумуєм коди символів поточного речення з дерева } } if(a<b) form(pn,&(*pz)->men);//Якщо нове слово по коду менше за поточне слово то йдем до меншого else form(pn,&(*pz)->bil);//наоборот } //Функція вводу з файла void vvid() { FILE* f; int i; char c; der* pn; f=fopen("C:\\pop\\ vvid.txt","r");//тут запхаєш свій шлях через "\\" і в кінці vvid.txt" while(!feof(f)) { pn=(der*)calloc(1,sizeof(der));//Виділяєм память для нового елемента pn->bil=pn->men=NULL;//Онулюєм pn->k[0]=NULL; // i=0; // while(1) { fscanf(f,"%c",&c);//Зчитуєм з файла посимвольно if(c!='\n'&&!feof(f))//Якщо с є ентор значчить кінець слова, якщо feof(f)-то кінец файла pn->k[i++]=c;//Записуєм посимвольно в наше слово else break; } pn->k[i]='\0';//Присвоюєм в кінці нульсимволь для того щоб знати де кінець слова form(pn,&p);//Добавляєм новий елемент в дерево } fclose(f);//Закриваєм відкритий файл } //Функція виводу дерева (нижній (від листків) зліва направо) void vuvid(der* pn) { if(pn->men!=NULL)//Якщо ще є менший йдем до нього vuvid(pn->men); if(pn->bil!=NULL)//Якщо ще є більший йдем до нього vuvid(pn->bil); puts(pn->k); } //Функція виводу слів по проміжку void promigok(int a,int b,der* pn) { int dov=0;//Змінна для довжини слова while(pn->k[dov]!='\0')//Рахуєм довжину нового слова dov++; if(dov>=a&&dov<=b)//Якщо довжина підходить { puts(pn->k);//виводим слово kil++;//Рахуєм кількість виведених слів } if(pn->men!=NULL)//Якщо є менший елемент йдем до нього promigok(a,b,pn->men); if(pn->bil!=NULL)//Якщо є менший елемент йдем до нього promigok(a,b,pn->bil); } //Функція видалення листків void lustki(der* pn) { if(pn->bil!=NULL)//Якщо є більший елемент { if(pn->bil->bil==NULL&&pn->bil->men==NULL)//Якщо він листок то наступні будуть нулями { free(pn->bil);//Видаляєм листок pn->bil=NULL;//Онулюєм його місце return;//Виходим з функції } else//Якщо не листок lustki(pn->bil);//Йдем до більшого } if(pn->men!=NULL)//Якщо є менший елемент { if(pn->men->bil==NULL&&pn->men->men==NULL)//Якщо він листок то наступні будуть нулями { free(pn->men);//Видаляєм листок pn->men=NULL;//Онулюєм його місце return;//Виходим з функції } else//Якщо не листок lustki(pn->men);//Йдем до меншого } } //Функція видалення дерева і піддерев (симетричний справа наліво) void zvil(der* pn) { der* pz; if(pn->bil!=NULL)//Якщо є більший йдем до нього zvil(pn->bil); if(pn->men!=NULL)//Якщо є менший { pz=pn->men;//Зберігаєм вказівник меншого free(pn);//Звільняєм поточний елемент zvil(pz);//викликаєм функцію зі збереженим елементом } else free(pn);//Якщо він останній то видаляєм } //Функція яка видаляє довгі слова (Будем вважати що довгі то слова які мають більше 6 букв) void dovgislova()//Не рекурсивна { int dov,i;//Змінна для довжини слова der* pn;//Вказівник на дерево для роботи while(1)//Вічний цикл { i=0;//Лічильник для того щоб знати коли вийти з цикла pn=p;//Берем вказівник на корінь while(1)//Вічний цикл { if(pn->bil!=NULL)//Якщо є більший елемент { dov=0;//Довжину онюлюєм while(pn->bil->k[dov]!='\0')//Рахуєм довжину наступного більшого слова dov++; if(dov>=7)//Якщо довжина більше 6 { i++;//Збільшуєм лічильк zvil(pn->bil);//Видаляєм більшу гілку pn->bil=NULL;//Онулюєм її місце break;//Зупиняєм цикл } else//Якщо менше 7 { pn=pn->bil;//Йдем до більшого continue; } } if(pn->men!=NULL)//Якщо є менший елемент { dov=0;//Довжину онюлюєм while(pn->men->k[dov]!='\0')//Рахуєм довжину наступного більшого слова dov++; if(dov>=7)//Якщо довжина більше 6 { i++;//Збільшуєм лічильк zvil(pn->men);//Видаляєм меншу гілку pn->men=NULL;//Онулюєм її місце break;//Зупиняєм цикл } else//Якщо менше 7 { pn=pn->men;//Йдем до меншого continue; } } break;//Зупиняєм цикл } if(i==0)//Якщо дорівнює 0 значіть нічого не видалялось return;//Виходим з функції } } //Головна функція void main() { int a,b;//Зміння для проміжку vvid();//Зчитуєм слова з файлу printf("Pochatkove derevo\n"); vuvid(p);//Виводи початкове дерево printf("Vvedit promigok v kilkosti bykv\n"); scanf("%d%d",&a,&b);//Зчитуєм проміжок promigok(a,b,p);//Виводим всі слова які підхоять під проміжок if(kil!=NULL)//Якщо виводилось значить відмінне від 0 printf("\nKilkist vuvedenuh sliv=%d\n",kil);//Виводи кількість виведених слів else printf("\nTakuh sliv nemaye\n");//Якщо 0 то виводим що таких немає lustki(p);//Видаляєм листкі з дерева printf("\nDerevo pislya vudalennya lustkiv\n"); vuvid(p);//Виводим дерево після видалення листків a=0; while(p->k[a]!='\0')//Рахуєм довжину кореня a++; if(a<7)//Якщо воно не довге { dovgislova();//Шукаєм довгі слова і видаляєм printf("\nDerevo pislya vudalennya dovguh sliv\n"); vuvid(p);//Виводим дерево після видалення довгих слів } zvil(p);//Видаляєм ціле дерево fflush(stdin); getchar();//Затримка }
Антиботан аватар за замовчуванням

24.04.2014 23:04-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!