Сделай Сам Свою Работу на 5

Пример обработки двумерного динамического массива





Составить программу, создающую динамическую матрицу размером n*n, заполнить матрицу случайными числами. Вычислить сумму каждой строки и поместить суммы строк в одномерный динамический массив.

 

//lab11_2

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <alloc.h>

void main()

{ int n,j,i;

float ** matr; float * mass; // Объявляем matr - указатель на массив указателей //mass – указатель на одномерный массив

clrscr();

printf("Введите размер квадратной матрицы n: "); scanf("%d",&n);

mass=(float *)malloc(n*sizeof(float )); // Выделяем память под массив mass

if (mass==NULL)

{ puts("не создан динамический массив!");

return;}

matr=(float **)malloc(sizeof(float *)*n); // Выделяем память под массив указателей

if (matr==NULL)

{ puts("не создан динамический массив!");

return;}

randomize();

for (i=0;i<n;i++)

{ matr[i]=(float *)malloc(sizeof(float)*n); // Выделяем память под i-ю строку

if (matr[i]==NULL)

{ puts("не создан динамический массив!");

return;}

for (j=0;j<n;j++) matr[i][j]=random(100);

}

for (i=0;i<n;i++)

{ mass[i]=0;

for (j=0;j<n;j++)

mass[i]+=matr[i][j];

}

for (i=0;i<n;i++)

{ for (j=0;j<n;j++)

printf("\t%6.2f",matr[i][j]);

printf("\n");

}

for (i=0;i<n;i++)

printf("\n сумма %d строки %8.2f",i,mass[i]);

for (i=0;i<n;i++)

free(matr[i]); //Освобождаем память i – й строки



free(matr); // Освобождаем память массива указателей

free(mass); // Освобождаем память массива сумм

getch();

}

ВЫПОЛНЕНИЕ РАБОТЫ

3.1. Проанализировать приведенные программы.

3.2. Создать двумерный динамический массив и выполнить задание по своему варианту.

 

Варианты заданий

1. Даны матрица A размером m*n и вектор В размером m. Записать на главную диагональ элементы вектора, а в вектор - элементы главной диагонали.

2. Выбрать максимальный элемент матрицы С (размер m*n), элементы четных строк разделить на максимальный элемент, а к элементам нечетных прибавить максимальный элемент.

3. Найти минимальный элемент матрицы С (размер m*n), и поменять его местами с первым элементом.

4. Дана матрица Е размером m*n. Вычислить суммы элементов каждого столбца. Определить наибольшее значение этих сумм и номер соответствующего столбца.

5. В матрице К размером m*n найти в каждом столбце произведение отрицательных элементов и количество нулевых элементов в матрице .

6. Даны две матрицы А и В одинаковой размерности m*n. Получить матрицу



C = max (a i j, b i j ), и матрицу D = min (a i j, b i j).

7. Дана матрица Р размером m*n . Найти сумму минимальных элементов каждого столбца матрицы.

8. Даны матрицы: А размером m*k и В размером k*n.Получить матрицуС=A*В.

9. Дана матрица К размером m*n. Вычислить сумму минимальных элементов каждого столбца.

10. Дана матрица С размером m*n. Упорядочить эту матрицу по возрастанию элементов в каждом столбце.

11. Дан одномерный массив A из m элементов. Вводится число k (k<m). Получить из А матрицу, по k элементов в строке. Недостающие элементы заменить 0.

12. В матрице Т размером m*k переставить элементы в строках так, чтобы по диагонали они были упорядочены по возрастанию.

 

КОНТРОЛЬНЫЕ ВОПРОСЫ

4.1. Отличия динамического массива от статического.

4.2. Как создать одномерный динамический массив?

4.3. Как создать динамическую матрицу?

4.4. Как освобождается память, занятая под динамические структуры?

 

 

Лабораторная работа № 12

Динамические структуры данных

1. ЦЕЛЬ РАБОТЫ:изучение ссылочных типов данных, работа со связными списками.

 

ОДНОСВЯЗНЫЕ СПИСКИ

Список – это последовательность структур, каждая из которых содержит ссылку, связывающую её с другой структурой. Для организации списков используются структуры, состоящие из двух смысловых частей – информационной и дополнительной. Информационная часть содержит подлежащую обработке информацию, в дополнительной находятся указатели на последующую или предыдущую структуру списка:

Struct spis { char data[20];

struct spis *next; }; // Указатель на структуру

Здесь при описании указателя используем ещё не описанный объект struct spis *next , который будет служить ссылкой на последующий элемент списка. Самая последняя структура в списке никуда не указывает, т.е. поле next должно иметь значение NULL. Адрес начала (головы) списка хранится в переменной типа указатель *head. На текущую структуру будет указывать *p.



 

Пример создания и просмотра односвязного списка.

//lab12_1

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

struct spis

{ char data[20];

struct spis *next;};

struct spis * create(void); //функция создания списка (возвращает адрес его головы)

void list(spis *head); // функция просмотра списка

struct spis *head; // глобальная переменная, адрес головы списка

main()

{ clrscr();

head= create();

list(head);

free(head);

}

struct spis * create(void)

{ spis *p, *pred; char c;

// pred – указатель на предыдущую структуру

head=pred=p=(spis *)malloc(sizeof(spis)); //выделяем память для первой записи

printf(" fam: "); scanf("%s", p->data);

do { p=(spis *)malloc(sizeof(spis));

printf("\n fam: "); scanf("%s", p->data);

pred->next=p; //ссылка из предыдущей записи на текущую

pred=p; // сохранение адреса текущей записи

printf(" Закончить? y/n ");

c=getch();

} while (c!='y');

p->next=NULL;

return head;

}

void list(spis *head)

{ spis *p;

p=head;

while (p!=NULL) // пока не конец списка

{ printf("\n fio: %s",p->data);

p=p->next; // продвижение по списку

}

getch();

}

 

ДВУХСВЯЗНЫЕ СПИСКИ

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

 

Пример создания и работы с двухсвязным списком.

//lab12_2

#include <stdio.h>

#include <conio.h>

#include <alloc.h>

#include <string.h>

struct spis

{ char data[20];

struct spis *v1; // v1 – указатель на предыдущую структуру

struct spis *v2; // v2 – указатель на последующую структуру

};

void create(void); // создание

void list(spis *); // просмотр

void del(void); // удаление

struct spis *head,*tail; // указатели на начало и конец списка

main()

{

clrscr();

create();

list(head); // просмотр с начала списка

list(tail); // просмотр с конца списка

del();

list(head);

free(head);

}

void create(void)

{ spis *p,*pred;

pred=NULL;

do { p=(spis *)malloc(sizeof(spis));

printf("Фамилия: "); gets(p->data);

p->v1=pred;

if (pred != NULL)

pred->v2=p;

else

head=p;

pred=p;

puts(" Закончить - <esc>");

}

while (getch()!=27);

tail=p;

tail->v2=NULL;

}

void list(spis *p)

{ if (p==head)

while (p != NULL)

{ puts(p->data);

p=p->v2;

}

else if (p==tail)

while ( p!= NULL)

{ puts(p->data);

p=p->v1;

}

else

puts("Неверный адрес ");

getch();

}

void del(void)

{ spis *p,*temp;char f[20]; // f[20] – Строка для удаляемой фамилии

clrscr();

printf("Фамилия: ");gets(f);

p=head;

while (p!=NULL)

{ if (strcmp((p->data),f)==0) // если найдена заданная фамилия

{ if (p==head) // если найденная запись - первая

{ head=p->v2;

head->v1=NULL;

free(p);

p=head;

}

else if (p==tail) // если найденная запись - последняя

{ tail=p->v1;

tail->v2=NULL;

free(p);

p=tail;

}

else // удаление из средины списка

{ p->v2->v1=p->v1;

p->v1->v2=p->v2;

temp=p;

p=p->v2;

free(temp);

}

}

else // если заданная фамилия не найдена – продвигаемся по списку

p=p->v2;

}

}

 

Чтобы вставить новую структуру в двухсвязный список, также необходимо изменить только значения указателей. Пусть требуется вставить структуру перед найденной по заданному условию ; p – указатель на найденную структуру:

 

pn=(spis *)malloc(sizeof(spis)); // pn – указатель на новую структуру

gets(pn->data);

// если структура вставляется в средину списка

pn->v1=p->v1;

pn->v2=p;

p->v1->v2=pn;

p->v1=pn;

// если структура вставляется в начало списка

pn->v1=NULL;

pn->v2=p;

p->v1=pn;

head=pn;

// если структура вставляется в конец списка

pn->v1=tail;

pn->v2=NULL;

p->v2=pn;

tail=pn;

 

ВЫПОЛНЕНИЕ РАБОТЫ

4.1. Проанализировать приведенные программы.

4.2. Сформировать двухсвязный список и выполнить задание по своему варианту.

 

Варианты заданий

1. Структура содержит фамилию и 4 оценки. Удалить из списка неуспевающих.

2. Структура содержит фамилию и 4 оценки. Удалить из списка имеющих 2, 3.

3. Структура содержит название книги, автора, год издания. Удалить издания с годом меньше заданного.

4. Структура содержит название книги, автора, год издания. Удалить книги заданного автора.

5. Структура содержит название, цену, количество товара. Удалить из списка заданный товар.

6. Структура содержит название, цену, количество товара. Удалить из списка партии товара, превышающие заданную стоимость.

7. Структура содержит фамилию, год рождения. Добавлять новые записи так, чтобы список был упорядочен по алфавиту.

8. Структура содержит фамилию, год рождения. Добавлять новые записи так, чтобы список был упорядочен по возрасту.

9. Структура содержит название издания, газета или журнал, цена экземпляра. Добавлять новые записи так, чтобы сначала располагались журналы, затем газеты.

10. Структура содержит название издания, газета или журнал, цена экземпляра. Добавлять новые издания так, чтобы названия были упорядочены по алфавиту.

11. Структура содержит фамилию спортсмена, вид спорта, количество очков. Добавлять новые записи так, чтобы информация по каждому виду спорта располагалась последовательно.

12. Структура содержит фамилию спортсмена, вид спорта, количество очков. Добавлять новые записи так, чтобы они были упорядочены по убыванию очков.

 

КОНТРОЛЬНЫЕ ВОПРОСЫ

5.1. Понятие статической и динамической памяти.

5.2. Как создаётся и просматривается односвязный список?

5.3. Как создаётся и просматривается двухсязный список?

5.4. Как удалить структуру из списка?

5.5. Как добавить структуру в список?

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.