StudyDocs.ru Logo

report.docx


Министерство образования Республики БеларусьУчреждение образования«БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕМЕНТРОНИКИ»








Специальность «Экономика и организация производства»
КОНТРОЛЬНАЯ РАБОТА
По курсу «Основы информатики и программирования»





Студент-заочник 1 курсаГруппы № .............................................................................Адрес: ...........................................Тел.: .............................................







Минск, 2010



Постановка задачиРазработать приложение, выполняющее следующие функции. Ввести с клавиатуры значения элементов целочисленного массива. Отсортировать по возрастанию (методом пузырька) четные элементы массива. Результат вывести на экран и записать в файл.Описание решенияСортировка простыми обменами, сортировка пузырьком (англ. bubble sort) простой алгоритм сортировки. Для понимания и реализации этот алгоритм простейший, но эффективен он лишь для небольших массивов.Алгоритм состоит в повторяющихся проходах по сортируемому массиву. За каждый проход элементы последовательно сравниваются попарно и, если порядок в паре неверный, выполняется обмен элементов. Проходы по массиву повторяются до тех пор, пока на очередном проходе не окажется, что обмены больше не нужны, что означает — массив отсортирован. При проходе алгоритма, элемент, стоящий не на своём месте, «всплывает» до нужной позиции как пузырёк в воде, отсюда и название алгоритма.Для вывода информации на экран используются функции и классы библиотеки iostream.h, а для записи данных в файл функции и классы библиотеки fstream.h. Также добавлена библиотека stdlib.h для вызова системной функции pause.Теоретические вопросыИспользование структур в качестве аргументов функцийПередача членов структур функциямПри передаче функции члена структуры передается его значение, притом не играет роли то, что значение берется из члена структуры. struct fred{ char x; int y; float z; char s[10];} mike;func(mike.x); /* передается символьное значение x */func2(mike.y); /* передается целое значение y */func3(mike.z); /* передается значение с плавающей точкой z */func4(mike.s); /* передается адрес строки s */func(mike.s[2]); /* передается символьное значение s[2] */В каждом из этих случаев функции передается значение определенного элемента, и здесь не имеет значения то, что этот элемент является частью какой-либо большей совокупности.Если же нужно передать адрес отдельного члена структуры, то перед именем структуры должен находиться оператор &. Например, чтобы передать адреса членов структуры mike, можно написать следующее:func(&mike.x); /* передается адрес символа x */func2(&mike.y); /* передается адрес целого y */func3(&mike.z); /* передается адрес члена z с плавающей точкой */func4(mike.s); /* передается адрес строки s */func(&mike.s[2]); /* передается адрес символа в s[2] */Передача целых структур функциямКогда в качестве аргумента функции используется структура, то для передачи целой структуры используется обычный способ вызова по значению. Это, конечно, означает, что любые изменения в содержимом параметра внутри функции не отразятся на той структуре, которая передана в качестве аргумента.При использовании структуры в качестве аргумента надо помнить, что тип аргумента должен соответствовать типу параметра. /* Определение типа структуры. */struct struct_type { int a, b; char ch;} ;void f1(struct struct_type parm){ printf("%d", parm.a);}int main(void){ struct struct_type arg; arg.a = 1000; f1(arg); return 0;}Как видно из этой программы, при объявлении параметров, являющихся структурами, объявление типа структуры должно быть глобальным, чтобы структурный тип можно было использовать во всей программе.Одномерные и многомерные массивы, их инициализацияОдномерные массивыОбъект типа «массив элементов заданного типа» представляет последовательность объектов этого самого типа, объединённых одним общим именем. Количество элементов массива является важной характеристикой самого массива, но не самого типа. Эта характеристика называется размерностью массива.Примеры объявления и определения массивов.extern int intArray_1[];Объявлен массив типа int, имя массива — intArray_1, разделители [] указывают на то, что перед нами объявление массива.int intArray_2[10];Определение массива типа int, имя массива intArray, между разделителями [ и ] находится константное выражение, значение которого определяет размерность массива.int intArray_3[] = {1,2,3}; // Это также определение массива.Количество элементов массива становится известным транслятору при анализе инициализатора. Элементам массива присваиваются соответствующие значения из списка инициализаторов.Ещё одна форма определения массива:int intArray_4[3] = {1,2,3};В этом определении массива важно, чтобы количество элементов в инициализаторе массива не превышало значение константного выражения в описателе массива.В результате выполнения этого оператора в памяти выделяется область, достаточная для размещения трёх объектов-представителей типа int. Участку присваивается имя intArray_4. Элементы инициализируются значениями, входящими в состав инициализатора.Возможна частичная инициализация массива. При этом значения получают первые элементы массива:int intArray_5[3] = {1,2};В этом определении массива означены лишь первые два элемента массива. Значение последнего элемента массива в общем случае не определено.Здесь нужно отметить одну интересную особенность синтаксиса инициализатора массива. Речь идёт о необязательной запятой в конце списка инициализаторов. По-видимому, её назначение заключается в том, чтобы указывать на факт частичной инициализации массива.Действительно, последний вариант (частично) инициализирующего оператора определения массива выглядит нагляднее:int intArray_5[3] = {1,2,};Многомерные массивыМногомерные массивы в C++ рассматриваются как массивы, элементами которых являются массивы. Определение многомерного массива должно содержать информацию о типе, размерности и количестве элементов каждой размерности.int MyArray1[10]; // Одномерный массив размерности 10.
int MyArray2[20][10]; // 20 одномерных массивов размерности 10.
int MyArray3[30][20][10]; // 30 двумерных массивов размерности 20*10.Многомерный массив подобно одномерному массиву может быть проинициализирован с помощью списка инициализаторов. Первыми инициализируются элементы с самыми маленькими индексами:int MyArray[3][3][3] = {0,1,2,3,4,5,6,7,8,9,10,11};Начальные значения получают следующие элементы трёхмерного массива:MyArray[0][0][0] == 0
MyArray[0][0][1] == 1
MyArray[0][0][2] == 2
MyArray[0][1][0] == 3
MyArray[0][1][1] == 4
MyArray[0][1][2] == 5
MyArray[0][2][0] == 6
MyArray[0][2][1] == 7
MyArray[0][2][2] == 8
MyArray[1][0][0] == 9
MyArray[1][0][1] == 10
MyArray[1][0][2] == 11Остальные элементы массива получают начальные значения в соответствии со статусом массива (в глобальном массиве значения остальных элементов равны 0, в локальном массиве элементам присваиваются неопределённые значения).Дополнительные фигурные скобки в инициализаторе позволяют инициализировать отдельные фрагменты многомерного массива. Каждая пара фигурных скобок специфицирует значения, относящиеся к одной определённой размерности. Пустые фигурные скобки не допускаются:int MyArray[3][3][3] = {
{{0,1}},
{{100},{200,210},{300}},
{{1000},{2000,2100},{3000,3100,3200}}
};В результате выполнения этого оператора определения будут означены следующие элементы массива MyArray:MyArray[0][0][0] == 0
MyArray[0][0][1] == 1
MyArray[1][0][0] == 100
MyArray[1][1][0] == 200
MyArray[1][1][1] == 210
MyArray[1][2][0] == 300
MyArray[2][0][0] == 1000
MyArray[2][1][0] == 2000
MyArray[2][1][1] == 2100
MyArray[2][2][0] == 3000
MyArray[2][2][1] == 3100
MyArray[2][2][2] == 3200По аналогии с одномерным массивом, при явной инициализации массива входящего в состав многомерного массива его самая левая размерность может не указываться. Она определяется на основе инициализатора.int MyArray[ ][3][3] = {
{{0,1}},
{{100},{200,210},{300}},
{{1000},{2000,2100}}
};


Схемы алгоритмовСхема алгоритма сортировки четных элементов массива по возрастанию методом пузырька
<Object: word/embeddings/oleObject1.bin>


Описание работы программыТестирование разработанного набора функций проводится в главной функции программы. После запуска программы выводится запрос размера массива (память для массива выделяется динамически). Далее вводятся все элементы массива.Когда все необходимые данные введены, происходит вывод исходного массива, сортировка его четных элементов по возрастанию методом пузырька и вывод отсортированного массива. Далее отсортированный массив сохраняется в файл. Если проблем с сохранением не возникнет, будет выведено сообщение об успешном сохранении массива, иначе — будет выведено сообщение об ошибке.Массив сохраняется в файл array.txt, который помещается в каталог с программой.Тестирование показало корректность разработанных функций. Пример тестирования представлен на рисунке 1, содержимое файла с сохраненным массивом — на рисунке 2.

Рис. 1 Тестирование программы

Рис. 2 Содержимое файла


Исходный код программы/*Разработать приложение, выполняющее следующие функции.Ввести с клавиатуры значения элементов целочисленногомассива. Отсортировать по возрастанию (методом пузырька)четные элементы массива. Результат вывести на экран изаписать в файл.*/
#include "iostream.h" // Для вывода информации на экран#include "fstream.h" // Для записи информации в файл#include "stdlib.h" // Для вызова pause

// Функция сортировки по возрастанию четных элементов массива// методом пузырька.void sort_even_elements(int* array, int size){ bool flag = true; // флаг наличия перестановок while (flag) // пока на предыдущем проходе не пропадут перестановки { flag = false; // сброс флага for (int i = 1; i < size - 2; i+=2) // проход по четным элементам массива { // если текущий элемент больше следующего, // происходит перестановка if (array[i] > array[i+2]) { int tmp = array[i]; array[i] = array[i+2]; array[i+2] = tmp; flag = true; // устанавливается флаг } } }}
// Функция вывода элементов массива на экранvoid print(int* array, int size){ for (int i = 0; i < size; i++) { cout<<array[i]<<" "; } cout<<endl;}
// Функция записи элементов массива в файлbool save(int* array, int size, const char* file_name){ ofstream my_file(file_name); // создание файла для записи if (my_file) // если файл успешно создан { for (int i = 0; i < size; i++) // запись элементов в цикле { my_file<<array[i]<<" "; } my_file<<endl; my_file.close(); // закрытие файла return true; } else { return false; }}
// Главная функция программыvoid main(){ const char* file_name = "array.txt"; // имя файла дял сохранения отсортированного массива int size; cout<<"Input size of the array"<<endl; // запрос размера массива cin>>size; // ввод размера int* array = new int[size]; // выделение памяти для массива cout<<"Input elements of the array"<<endl; // запрос элементов массива for (int i = 0; i < size; i++) // ввод элементов массива в цикле { cin>>array[i]; } cout<<"Source array: "; print(array, size); // вывод исходного массива cout<<"Sorting even elements in ascending order..."<<endl; sort_even_elements(array, size); // сортировка четных элементов cout<<"Sorted array: "; print(array, size); // вывод сортированного массива bool result = save(array, size, file_name); // запись файл и вывод результата записи if (result) { cout<<"Sorted array was saved to \""<<file_name<<"\""<<endl; } else { cout<<"Can not save sorted array to \""<<file_name<<"\""<<endl; } system("pause"); // задержка до нажатия любой клавиши}