У вас вопросы?
У нас ответы:) SamZan.net

Структурное программирование Выполнил- студент группы 1291 Кургузов В

Работа добавлена на сайт samzan.net:

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 28.12.2024

Российская Федерация

Тюменская область

ХАНТЫ-МАНСИЙСКИЙ АВТОНОМНЫЙ ОКРУГ – ЮГРА

Департамент образования и науки

Сургутский государственный университет

Ханты-Мансийского автономного округа

             Факультет автоматики и телекоммуникаций

      Кафедра автоматики и компьютерных систем

Отчет

по лабораторным работам №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);//очищаем память

}

Вывод

В ходе работы были закреплены знания и получены практические навыки использования динамической памяти в задачах с заранее неизвестным объемом обрабатываемой информации.

Динамическая память была использована в случаях, когда требуется хранение информации об указанных объектах: массивах структур.

Было снято ограничение на количество записей в справочнике. Динамическая память использовалась экономично.

При завершении программы вся выделенная ей динамическая память была освобождена.




1. І Етимологічно слово ldquo;етикаrdquo; походить від давньогрецького слова ldquo;ethosrdquo; що можна перекласти як
2. Расчетные банковские сделки
3. на тему ldquo;ЖИТТЯ І ТВОРЧІСТЬ Ф
4. проект цивилизации ~ Сионизм Безошибочны ли признанные канонами священные писания 41 СВЯЩЕННЫЙ а
5. Николай Онуфриевич Лосский.html
6. Доходы и расходы бюджетов субъектов РФ
7. Экологическое право Республики Казахстан.html
8. Духовные основы общества
9. Скучно скучно Ямщик удалой Разгони чем нибудь мою скуку Песню что ли приятель запой Про рекрутски
10. ТОВАРНЕ ВИРОБНИЦТВО
11. Экономика отрасли Специальность 190604 Техническое обслуживание и ремонт автомобильного транспорта
12. ПО ТЕМЕ ВОЛНОВАЯ ОПТИКА 3х семестровый курс для дневной и заочной формы обучения ЛЕ
13. Гидра
14. Лекция 1. Определение задачи и история развития нанотрибологии как науки Трибология и краткая история е.
15. . 288 с. Определение и сравнительная характеристика психофизических качеств организма
16. Если несколько лет назад приоритетными направлениями были разведка и разработка новых месторождений нефти
17. по теме Водоотведение нефтеперерабатывающего завода Выполнили- студенты гр
18. своеобразный элемент географического ландшафта в виде большой совокупности деревьев в своем развитии обус
19. практикума Пайнс Э.
20. Экологическая надежность техногенных подземных каверн