Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
47
Добавлен:
22.03.2016
Размер:
456.07 Кб
Скачать

Лабораторная работа №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();

}

Тестирование:

  1. При отсутствии столбцов с одинаковым набором элементов:

  1. При наличии одинаковых столбцов:

  1. При наличии столбцов с одинаковым набором элементов:

Задание Б

Выбрать алгоритм, составить его блок-схему и программу для решения своего варианта задания. Во всех вариантах предполагается для размещения в памяти содержимого файлов использовать односвязные линейные списки.

Постановка задачи

Дан текстовый файл. Группы символов, разделенные пробелами, будем называть словами. Удалить из файла все однобуквенные слова и лишние пробелы.

ХОД РАБОТЫ

Блок-схема:

Текст программы:

#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);

}

Тестирование:

  1. Исходный файл: « abc def g hi j kl ».

Результат: «abc def hi kl».

  1. Исходный файл: «a b c d e f g».

Результат: <пустой файл>.

Вывод: благодаря динамической памяти в C++ появляется возможность писать программы, которые эффективно используют оперативную память компьютера, без ущерба функциональности.

10

Соседние файлы в папке л.р по информатике