Будь умным!


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

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

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


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

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

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

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

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

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

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

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

Отчет

по лабораторным работам №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. Определение момента инерции дискастержня по его крутильным колебаниям Целью данной работы является опр.
2. на тему- Проект производства работ на строительство земляного полотна автомобильной дороги
3. Экономическая мысль древнего мира
4. Ирвинг Фишер
5. Основы психологии детского спорта предлагается вам в 11 семестре
6. Информационно-аналитическая система Зарплата
7. На тему- ldquo;Бизнес и предпринимательствоrdquo; Выполнил- Лукаш В
8. Кадуйский молокоперерабатывающий завод.html
9. Ваш собственный сервер установка Windows Server 2003
10. И А Одругой автор но большинство- обе Г
11. При помощи кисти человек выполняет трудовые процессы и все действия которые связаны с обслуживанием в быту
12. Щёчки предназначены для захватывания коронок или корней зубов повторяющие их анатомическую форму; 2
13.  Найти точки разрыва функции и ее односторонние пределы
14.  Мы принимаем клиентов в меховой студии по предварительной договоренности
15. это основные направления его деятельности выражающие сущность и социальное назначение цели и задачи госуд
16. Лабораторный КРС-спектрометр
17. Контрольная работа по геометрии за 3 четверть.html
18. Ревизия и аудит малоценных и быстроизнашивающихся предметов (МБП)
19. Расследование преступлений эксперимент
20.  Первая нормальная форма 1NF