Міністерство освіти і науки України
Національний університет "Львівська політехніка"
Лабораторна робота №13
Динамічний розподіл пам’яті
Мета роботи:
освоїти розміщення даних в оперативній пам’яті, динамічне виділення пам‘яті.
Завдання:
Написати програму, яка реалізовує:
1. Ввід даних (згідно варіанту) по кожному елементу списку
2. Обробку даних згідно методу, обраного користувачем
3. Вивід результатів.
При вводі даних необхідно реалізувати зчитування введених даних з клавіатури, виділення необхідної пам‘яті та запит про завершення вводу.
Користувач повинен мати можливість вибору методу обробки даних і вибору завершення роботи
Якщо користувачем обрано завершення роботи, то перед завершенням роботи необхідно звільнити пам’ять, виділену під роботу програми.
Індивідуальне завдання:
Дані елемента списку Дані про студента:
1. Прізвище
2. Ім‘я
3. Група
4. № кімнати в гуртожитку (ціле число; 0-якщо студент не проживає в гуртожитку)
5. Рейтинг(дійсне число 0-100 )
Сортувати за:
1.Прізвищем
2.Ім’ям
3.Номером кімнати гуртожитка
4.Рейтингом
Аналіз завдання:
Для зручності організації даних я використаю структуру, в якій будуть всі дані для певного студента.
Для економії пам’яті я використаю функцію mallock - динамічний розподіл пам’яті.
Перед використанням функції scanf потрібно очистити пам’ять функцією fflush(stdin) для забезпечення правильної роботи програми.
Алгоритм програми:
Текст програми:
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 20
struct Klass {
char surname[20];
char name[10];
char gr[5];
int hurt;
unsigned int rating;
};
void getBoards(struct Klass **);
void printBoards(struct Klass **);
void Sortsurname(struct Klass **,unsigned n);
void Sorthurt(struct Klass **,unsigned n);
void Sortrating(struct Klass **,unsigned n);
int main()
{
char key;
unsigned size;
unsigned i,j=0;
printf("Vvedit’ chuslo ludey:\n=> ");
scanf("%u", &size);
size = ((size <= MAX_SIZE) ? (size): (MAX_SIZE));
struct Klass *ptr[size] ;
struct Klass **pptr[size];
for(i=0;i<size;i++)
{
pptr[i]=&ptr[i];
ptr[i]=malloc(sizeof(struct Klass));
printf("People #%d. It remains to add another %d people\n",i+1,size-i-1) ;
getBoards(pptr[i]);
}
system("cls");
puts("Sortuvatu?(y - yes, n - no)") ;
scanf("%s",&key);
if(key== 'y' )
{
int m;
do
{
puts("Jak sortuvatu?");
puts("_______________________");
puts("1 = sort by surname");
puts("2 = sort by hurtojutuk number");
puts("3 = sort by rating");
puts("4 = quit");
puts("_______________________");
scanf("%d",&m);
switch(m)
{
case 1:
puts("\tSort by surname");
for(j=0;j<size;j++)
{
for(i=0;i<size-1;i++)
{
Sortsurname(pptr[i],size);
}
}
for(i=0;i<size;i++)
{
puts("____________________________");
printBoards(pptr[i]);
puts("____________________________");
}
break;
case 2:
puts("\tSort by hurt");
for(j=0;j<size;j++)
{
for(i=0;i<size-1;i++)
{
Sorthurt(pptr[i],size);
}
}
for(i=0;i<size;i++)
{
puts("____________________________");
printBoards(pptr[i]);
puts("____________________________");
}
break;
case 3:
puts("\tSort by rating");
for(j=0;j<size;j++)
{
for(i=0;i<size-1;i++)
{
Sortrating(pptr[i],size);
}
}
for(i=0;i<size;i++)
{
puts("____________________________");
printBoards(pptr[i]);
puts("____________________________");
}
break;
case 4:
puts("Enjoy!!! :-)");
for(i=0;i<size;i++)
{
free (ptr[i]);
}
break;
}
puts("");
}while(m!=4) ;
}
system("PAUSE");
return 0;
}
void Sortsurname(struct Klass **pptr,unsigned n ){
int i=0;
struct Klass temp;
for(i=0;i<n-1;i++)
{
if(strcmp ((*pptr)->surname, ( *(pptr+1))->surname ) >0 )
{
temp=**(pptr);
**(pptr)=**(pptr+1);
**(pptr+1)=temp;
}
}
}
void Sorthurt(struct Klass **pptr,unsigned n ){
int i=0;
struct Klass temp;
for(i=0;i<n-1;i++)
{
if((*pptr)->hurt<(*(pptr+1))->hurt)
{
temp=**(pptr);
**(pptr)=**(pptr+1);
**(pptr+1)=temp;
}
}
}
void Sortrating(struct Klass **pptr,unsigned n ){
int i=0;
struct Klass temp;
for(i=0;i<n-1;i++)
{
if((*pptr)->rating<(*(pptr+1))->rating)
{
temp=**(pptr);
**(pptr)=**(pptr+1);
**(pptr+1)=temp;
}
}
}
void getBoards(struct Klass **ptr)
{
puts("Input surname");
scanf("%s",(*ptr)->surname);
puts("Input name");
scanf("%s",&(*ptr)->name);
puts("Input group");
scanf("%s",&(*ptr)->gr);
puts("Input hurtojutok nomer");
scanf("%d",&(*ptr)->hurt);
puts("Input rating");
scanf("%u",&(*ptr)->rating);
puts("");
if((*ptr)->rating > 100)
{
puts( "The rating should be from ");
puts( "0 to 100. Input again");
scanf("%u",&(*ptr)->rating);
puts("");
}
}
void printBoards(struct Klass **pptr)
{
printf("Person's surname: %s\n",(*pptr)->surname);
printf("Person's name : %s\n",(*pptr)->name);
printf("Person's group : %s\n",(*pptr)->gr);
printf("Person's hurtojutok: %d\n",(*pptr)->hurt);
printf("Person's rating: %u\n",(*pptr)->rating);
}
Результати:
Висновок:
на цій лабораторній роботі я навчився працювати з динамічним розподілом пам’яті, засвоїв функції для очищення і виділення пам’яті.
Я написав програму, яка записує дані про студентів у структуру, виводить їхні дані та сортує їх за рейтингом, прізвищем та може показати тих студентів, які не проживають у гуртожитку. Користувач може вибрати вводити чи не вводити дані наступного студента та вибір типу сортування за даними студента.