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

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

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

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

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

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

от 25%

Подписываем

договор

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

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

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

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

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

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

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

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

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

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

Отчет

по лабораторным работам №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. 1Bryophyt Моховидные или Мхи или Настоящие мхи или Бриофиты лат
3. Система учета товара- преимущества использования
4. ва продукциииспользование рабочего временисырья и материаловоборудования
5. Тема 8. Культура Древней Греции Особенности древнегреческой культуры
6. Проект силового трёхфазного трансформатора мощностью 4300 кВА
7. Психологическое содержание политической власти на примере диктатуры тоталитаризма и особенностях авторитаризма
8. Научнотехнический прогресс его сущность и виды 4 1
9. В связи с четкой ориентацией нашего государства на интеграцию с Европой вопрос Болонского процесса приобре
10. видимому на всех звёздах