л.р по информатике / лр5
.docxЛабораторная работа №5
студентки группы ИТ-12
Коршак Кристины Сергеевны
Выполнение:_________ Защита:___________
ОБРАБОТКА ДИНАМИЧЕСКИХ МАССИВОВ И СВЯЗНЫХ СПИСКОВ ДАННЫХ
Цель работы: ознакомиться с организацией многомерных динамических массивов в языке С/С++; приобрести практические навыки в применении односвязных линейных списков при обработке данных из внешних файлов.
СОДЕРЖАНИЕ РАБОТЫ
Задание А
Выбрать алгоритм, составить его блок-схему и программу, выполняющую создание и обработку двумерного динамического массива, в соответствии со своим вариантом задания. Во всех вариантах предполагается, что размерность массива задается на этапе выполнения пользователем. Элементы матрицы вводятся с клавиатуры. На экран выводится исходная матрица и результаты работы программы.
Постановка задачи
Дана матрица А(n×n), состоящая из ненулевых элементов. Упорядочить по возрастанию элементы каждого из столбцов. Если имеются несколько столбцов, содержащих одинаковый набор элементов, то оставить без изменений только столбец с младшим индексом, заполнив остальные нулями.
ХОД РАБОТЫ
Блок-схема:
Текст программы:
#include<stdio.h>
#include<conio.h>
#include<locale.h>
int main()
{
setlocale(LC_CTYPE, "");
printf("n=");
unsigned int i, j, k, n;
scanf("%u", &n);
int **A=new int*[n];
for (i=0; i<n; i++)
A[i]=new int[n];
printf("Введите элементы матрицы %dx%d:\n", n, n);
for (i=0; i<n; i++)
for (j=0; j<n; j++)
scanf("%d", &A[i][j]);
printf("Исходная матрица:\n");
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
printf("%5d", A[i][j]);
printf("\n");
}
int min, tmp;
for (k=0; k<n; k++)
for (i=0; i<n; i++)
{
min=i;
for (j=i+1; j<n; j++)
if (A[j][k]<A[min][k]) min=j;
if (min!=i)
{
tmp=A[i][k];
A[i][k]=A[min][k];
A[min][k]=tmp;
}
}
for (k=0; k<n; k++)
if (A[0][k])
for (i=k+1; i<n; i++)
{
if (A[0][i])
{
for (j=0; (j<n)&&(A[j][k]==A[j][i]); j++);
if (j==n)
for (j=0; j<n; j++)
A[j][i]=0;
}
}
printf("Результат:");
for (i=0; i<n; i++)
{
printf("\n");
for (j=0; j<n; j++)
printf("%5d", A[i][j]);
delete []A[i];
}
delete[] A;
getch();
}
Тестирование:
-
При отсутствии столбцов с одинаковым набором элементов:
-
При наличии одинаковых столбцов:
-
При наличии столбцов с одинаковым набором элементов:
Задание Б
Выбрать алгоритм, составить его блок-схему и программу для решения своего варианта задания. Во всех вариантах предполагается для размещения в памяти содержимого файлов использовать односвязные линейные списки.
Постановка задачи
Дан текстовый файл. Группы символов, разделенные пробелами, будем называть словами. Удалить из файла все однобуквенные слова и лишние пробелы.
ХОД РАБОТЫ
Блок-схема:
Текст программы:
#include<stdio.h>
#include<string.h>
struct LIST {
char *word;
LIST *next;
};
int main()
{
FILE *inp;
LIST *head, *p, *prev;
char word[10000];
inp=fopen("in.txt", "r");
if (inp)
{
if (fscanf(inp, "%s", word)!=EOF)
{
head=new LIST;
p=head;
p->word=new char[strlen(word)+1];
strcpy(p->word, word);
while (fscanf(inp, "%s", word)!=EOF)
{
p->next=new LIST;
p=p->next;
p->word=new char[strlen(word)+1];
strcpy(p->word, word);
}
p->next=NULL;
p=head;
prev=head;
while (p->next)
if (strlen(p->word)==1)
if (p==head)
{
head=p->next;
prev=head;
delete p->word;
delete p;
p=head;
}
else
{
prev->next=p->next;
delete p->word;
delete p;
p=prev->next;
}
else
{
prev=p;
p=p->next;
}
if(strlen(p->word)==1)
{
if (p==head) head=NULL;
else prev->next=NULL;
delete p->word;
delete p;
}
fclose(inp);
inp=fopen("in.txt", "w");
if (head)
{
while(head->next)
{
p=head;
fprintf(inp, "%s ", p->word);
head=p->next;
delete p->word;
delete p;
}
fprintf(inp, "%s", head->word);
delete head->word;
delete head;
head=NULL;
}
}
else
{
fclose(inp);
inp=fopen("in.txt", "w");
}
}
fclose(inp);
}
Тестирование:
-
Исходный файл: « abc def g hi j kl ».
Результат: «abc def hi kl».
-
Исходный файл: «a b c d e f g».
Результат: <пустой файл>.
Вывод: благодаря динамической памяти в C++ появляется возможность писать программы, которые эффективно используют оперативную память компьютера, без ущерба функциональности.