Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Российская Федерация
Тюменская область
ХАНТЫ-МАНСИЙСКИЙ АВТОНОМНЫЙ ОКРУГ ЮГРА
Департамент образования и науки
Сургутский государственный университет
Ханты-Мансийского автономного округа
Факультет автоматики и телекоммуникаций
Кафедра автоматики и компьютерных систем
Отчет
по лабораторным работам №10
по дисциплине «Структурное программирование»
Выполнил: студент группы 12-91,
Кургузов В.В.
Проверил: ассистент,
Полунина Е.В.
Сургут
2011
Динамическое распределение памяти
Цель работы: закрепление знаний и получение практических навыков использования динамической памяти в задачах с заранее неизвестным объемом обрабатываемой информации.
Задание:
Требуется модифицировать программу, созданную в результате выполнения предыдущей работы, таким образом, чтобы для хранения данных использовалась динамическая память.
Формальное описание хода решения задачи
В данной работе необходимо создавать массив структур динамически, через указатель.
Размер массива вводится с клавиатуры, а затем с помощью функции malloc выделяется необходимая память для его хранения. По завершению программы необходимо очистить память выделенную под массив.
Функции, реализованные в программе
Переменная указатель на массив структур:
struct gibdd *array;
Отрывок программы, в котором происходит динамическое выделение памяти:
printf(" Enter number of records: ");
scanf("%d",&n);
while (n<1)
{
printf(" Invalid input. Repeat, please : ");
scanf("%d",&n);
}
array=malloc(n*sizeof(Gibdd));
Из приведенного листинга видно, что сначала вводится размер массива. Затем производится проверка на отрицательное значение размер массива не может быть отрицательным.
С помощью заранее созданной структуры Gibdd:
typedef struct gibdd//структура гибдд
{
char model[10];
char number[8];
char surname[10];
int year;
int month;
int day;
int c;
double sum;
} Gibdd;
С помощью функции malloc производится выделение памяти под одну структуру типа struct gibdd, а затем это значение умножается на n количество элементов:
array=malloc(n*sizeof(Gibdd));
В конце программы происходит очистка памяти, выделенной для хранения массива структур:
free(array);
Формальными параметрами используемых функций являются также и указатели на массив структур:
void INPUT(struct gibdd *e,int size)
void OUTPUT(struct gibdd *e,int size)
void SUMMING(struct gibdd *e,int size)
void SORT(struct gibdd *e, int size)
void SEARCH(struct gibdd *e,int size)
Переменная файлового типа также передается через указатель:
void WRITE(struct gibdd *e,int size,FILE *fstream,int id)
int READ(struct gibdd *e,int size,FILE *fstream)
Обоснование выбора типов данных и операций
Данные, используемые в программе:
int n,choice,identifier,yn;
struct gibdd *array;
FILE* file;
Переменная n имеет тип int, поскольку обозначает количество записей в справочнике;
Переменная choice имеет тип int по задумке программиста для создания меню программы;
struct gibdd *array указатель на массив структур.
Переменные identifier, yn имеют тип int. Вспомогательные переменные.
FILE* file указатель на переменную файлового типа.
Программный код
#include <conio.h>
#include <stdio.h>
#include <string.h>
typedef struct gibdd//структура гибдд
{
char model[10];
char number[8];
char surname[10];
int year;
int month;
int day;
int c;
double sum;
} Gibdd;
void INPUT(struct gibdd *e,int size)//функция ввода полей структур
{
int i;
for(i=0; i<size; i++)
{
printf(" %d record: \n",i+1);
printf(" Enter model of car: ");
scanf("%s",&e[i].model);
printf(" Enter the number of car: ");
scanf("%s",&e[i].number);
printf(" Enter the surname: ");
scanf("%s",&e[i].surname);
printf(" Enter the YEAR of the last technical inspection (1980,2011): ");
scanf("%d",&e[i].year);
while(e[i].year<1980||e[i].year>2011)
{
printf(" Invalid input. Repeat, please: ");
scanf("%d",&e[i].year);
}
printf(" Enter the MONTH of the last technical inspection: ");
scanf("%d",&e[i].month);
while(e[i].month<1||e[i].month>12)
{
printf(" Invalid input. Repeat, please: ");
scanf("%d",&e[i].month);
}
printf(" Enter the DAY of the last technical inspection: ");
scanf("%d",&e[i].day);
while(e[i].day<1||e[i].day>31)
{
printf(" Invalid input. Repeat, please: ");
scanf("%d",&e[i].day);
}
printf(" Does the car in the hijacking? 1 - <yes> or 2 - <no> ");
scanf("%d",&e[i].c);
while(e[i].c<1||e[i].c>2)
{
printf(" Repeat. 1 - <yes> or 2 - <no>? :");
scanf("%d",&e[i].c);
}
printf("\n");
}
}
void OUTPUT(struct gibdd *e,int size)//функция вывода структур на экран
{
int i;
printf("\n Handbook Traffic Police: \n\n");
printf(" model | number | surname | date | steal \n");
printf(" ---------------------------------------------------------- \n");
for (i=0; i<size; i++)
printf("%10s %8s %10s %2d.%2d.%4d %d\n",e[i].model,e[i].number,e[i].surname,e[i].day,e[i].month,e[i].year,e[i].c);
}
void SUMMING(struct gibdd *e,int size)//функция суммирования - создает ключевое поле для сортировки по дате
{
int i;
for (i=0; i<size; i++)
e[i].sum=(double)(e[i].year*31536000.0+e[i].month*2635200.0+e[i].day*86400.0);
}
void SORT(struct gibdd *e, int size)//функция сортировки массива структур по дате
{
struct gibdd temp;
int i,j;
for(i=0; i<size-1; i++)
for(j=size-2; j>=i; j--)
if (e[j+1].sum<e[j].sum)
{
temp=e[j];
e[j]=e[j+1];
e[j+1]=temp;
}
}
void SEARCH(struct gibdd *e,int size)//поиск по заданному критерию - номер автомобиля и наличие в угоне
{
int i;
char num[8];
int s;
printf(" Enter your search criteria: \n");
printf(" Number of car: ");
scanf("%s",&num);
printf(" Is in stealing? 1 - <yes> or 2 - <no> : ");
scanf("%d",&s);
while(s<1||s>2)
{
printf(" Repeat. 1 - <yes> or 2 - <no> :");
scanf("%d",&s);
}
printf("\n\n Search rezults: \n\n");
printf(" model | number | surname | date | steal \n");
printf(" ---------------------------------------------------------- \n");
for (i=0; i<size; i++)
{
if (strcmp(e[i].number,num)==0&&e[i].c==s)
printf("%10s %8s %10s %2d.%2d.%4d %d\n",e[i].model,e[i].number,e[i].surname,e[i].day,e[i].month,e[i].year,e[i].c);
}
}
void WRITE(struct gibdd *e,int size,FILE *fstream,int id)//функция записи структуры в текстовый файл
{
int i;
char name[15];
if (id!=1)
{
printf("\n\n !THERE IS NO DATA FOR WRITE!\a\n");
printf(" Please first enter the data - Key '1'. Or read data from file - Key '6' \n\n");
}
else
{
printf("\n Enter the name of the text file (*.txt) : ");
scanf("%s",&name);
fstream=fopen(name,"wt+");
for(i=0; i<size; i++)
fprintf(fstream,"%s %s %s %d %d %d %d\n",e[i].model,e[i].number,e[i].surname,e[i].day,e[i].month,e[i].year,e[i].c);
fclose(fstream);
printf("\n\n Write data to the file was successful! \1 \1 \1 \a\n");
}
}
int READ(struct gibdd *e,int size,FILE *fstream)//функция чтения структуры из текстового файла
{
int i;
char name[15];
printf("\n Enter the name of the text file (*.txt) : ");
scanf("%s",&name);
fstream=fopen(name,"rt+");
if (fstream==NULL)
{
printf(" Error in open. Incorrect name of file! \n");
}
else
{
size=0;
while(fscanf(fstream,"%s %s %s %d %d %d %d",&e[size].model,&e[size].number,&e[size].surname,&e[size].day,&e[size].month,&e[size].year,&e[size].c)==7)
size++;
printf(" Total Items read: %d :",size);
fclose(fstream);
fstream=fopen(name,"rt+");
printf("\n\n The following information has been received from a file : \n\n");
printf(" model | number | surname | date | steal \n");
printf(" ---------------------------------------------------------- \n");
for(i=0;i<size;i++)
{
fscanf(fstream,"%s %s %s %d %d %d %d",&e[i].model,&e[i].number,&e[i].surname,&e[i].day,&e[i].month,&e[i].year,&e[i].c);
printf("%10s %8s %10s %d.%2d.%4d %d\n",e[i].model,e[i].number,e[i].surname,e[i].day,e[i].month,e[i].year,e[i].c);
}
fclose(fstream);
printf("\n Reading to a file was successful! \1 \1 \1 \a\n");
}
return size;
}
main()
{
int n,choice,identifier,yn;
FILE *file;
struct gibdd *array;
do//основной цикл программы
{
system ("cls");
printf("\n Select the action:\n\n");
printf(" Enter data ---- '1' \n");
printf(" Output data ---- '2' \n");
printf(" Sorting data ---- '3' \n");
printf(" Searching data ---- '4' \n");
printf(" Write data to TXT file ---- '5' \n");
printf(" Read data from TXT file ---- '6' \n");
printf(" Delete all data ---- '7' \n");
printf(" Exit ---- '8' \n");
printf("\n");
printf(" Your choice : ");
scanf("%d",&choice);
if (choice==1)
{
system("cls");
printf("\n");
printf(" Enter number of records: ");
scanf("%d",&n);
while (n<1)
{
printf(" Invalid input. Repeat, please : ");
scanf("%d",&n);
}
array=malloc(n*sizeof(Gibdd));//выделяем место в памяти под массив структур
printf("\n");
INPUT(array,n);
getch();
identifier=1;
}
if (choice==2)
{
system("cls");
if (identifier!=1)
{
printf("\n\n !DATA NOT AVIABLE!\a\n");
printf(" Please first enter the data - Key '1'. Or read data from file - Key '6'\n\n");
}
else
OUTPUT(array,n);
getch();
}
if (choice==3)
{
system("cls");
if (identifier!=1)
{
printf("\n\n !DATA NOT AVIABLE!\a\n");
printf(" Please first enter the data - Key '1'. Or read data from file - Key '6'\n\n");
}
else
{
SUMMING(array,n);
SORT(array,n);
printf("\n\n Sort succeed! \1 \1 \1 \a\n");
}
getch();
}
if (choice==4)
{
system("cls");
if (identifier!=1)
{
printf("\n\n !DATA NOT AVIABLE!\a\n");
printf(" Please first enter the data - Key '1'. Or read data from file - Key '6' \n\n");
}
else
SEARCH(array,n);
getch();
}
if (choice==5)
{
system("cls");
WRITE(array,n,file,identifier);
getch();
}
if (choice==6)
{
system("cls");
n=READ(array,n,file);
if (n>0)
identifier=1;
getch();
}
if (choice==7)
{
system("cls");
printf("\n\n Deleting all data. \n\n");
printf(" Are you sure? Press '1' - yes, '2' - no -> ");
scanf("%d",&yn);
while(yn<1||yn>2)
{
printf(" Invalid input. Repeat, please: ");
scanf("%d",&yn);
}
if(yn==1)
{
printf(" Deleting all data was successful! \1 \n");
identifier=0;
}
else
{
printf(" Data was not delete! ");
identifier=1;
}
getch();
}
}
while(choice!=8);
free(array);//очищаем память
}
Вывод
В ходе работы были закреплены знания и получены практические навыки использования динамической памяти в задачах с заранее неизвестным объемом обрабатываемой информации.
Динамическая память была использована в случаях, когда требуется хранение информации об указанных объектах: массивах структур.
Было снято ограничение на количество записей в справочнике. Динамическая память использовалась экономично.
При завершении программы вся выделенная ей динамическая память была освобождена.