Программа сортировки файла с данными

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Федеральное агентство по образованию

Государственное общеобразовательное учреждение высшего

профессионального образования

Омский Государственный Технический университет

Кафедра: Радиотехнические устройства и системы диагностики

Специальность: Радиотехника

Курсовая работа

На тему: Программа сортировки файла с данными

По дисциплине: Информатика

Студент

Савченко Андрей Анатольевич

Группа: РИБ-110

Омск-2011г.

Содержание

1. Описание используемых в программе операторов, процедур и функций

1.1 Директивы. Директива #include

1.2 Операторы

1.3 Цикл с параметром (For)

1.4 Условный оператор (If)

1.5 Заголовочные файлы

1.6 Функции. Объявление и определение

1.7 Функция main ()

1.8 Функции ввода-вывода

1.9 Функции чтения-записи

2. Блок-схема алгоритма программы

2.1 main ()

2.2 ReadFileParse ()

2.3 psort ()

2.4 WriteFile ()

3. Исходный текст программы с комментариями

4. Список использованных литературных источников

1. Описание используемых в программе операторов, процедур и функций

1.1 Директивы. Директива #include

В программировании термин «директива» (указание) по использованию похож на термин «команда», так как также используется для описания некоторых конструкций языка программирования (то есть указаний компилятору или ассемблеру особенностей обработки при компиляции). В языки программирования Си и C++ встроена поддержка препроцессора. Строки в исходном коде, которые должны быть обработаны препроцессором в виде #define и #include называются препроцессорными директивами.

Директива #include полностью копирует содержимое указанного файла в файл, в котором указана эта директива, в месте вызова директивы. Эти файлы обычно (хотя скорее, всегда) содержат определение интерфейса для различных функций библиотек и типов данных, которые должны быть подключены перед их использованием; таким образом, директива #include обычно указывается в начале (заголовке) файла. По этой причине подключаемые файлы и называются заголовочными. Некоторые содержат примеры из стандартной библиотеки Си (< math. h> и < stdio. h>), обеспечивая математические функции и функции ввода-вывода соответственно.

1.2 Операторы

Инструкция или оператор (англ. statement) -- наименьшая автономная часть языка программирования; команда. Программа обычно представляет собой последовательность инструкций. Многие языки (например, Си) различают инструкцию и определение. Различие в том, что инструкция исполняет код, а определение создаёт идентификатор (то есть можно рассматривать определение как инструкцию присваивания).

1.3 Цикл с параметром (for)

Циклы предназначены для многократного выполнения какого-либо блока кода. При обнаружении в программе цикла for первым выполняется инициализирующее выражение, в котором обычно устанавливается счетчик цикла. Это происходит только один раз перед запуском цикла. Затем анализируется условное выражение, которое также называется условием прекращения цикла. Пока оно истинно, цикл не прекращается.

Каждый раз после всех строк тела цикла выполняется модифицирующее выражение, в котором происходит изменение счетчика цикла. Как только проверка условного выражения даст результат false, все строки тела цикла и модифицирующее выражение будут пропущены и управление будет передано первому выражению, следующему за телом цикла. Если тело цикла содержит более одной команды, следует использовать фигурные скобки и руководствоваться определенными правилами оформления, чтобы сделать текст программы более понятным:

for (инициализирующее выражение; условное выражение; модифицирукщее_выражение)

{выражение1; выражение2; выражениеЗ; выражение-n; }

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

for (i=0; i< 50; i++) //Инициализируем цикл

{

infile > > mas[i]; //Считываем числа из файла в массив

}

Из приведённого фрагмента видно что, как и в предыдущем случае, цикл выполняется пока i< 50. При этом, каждый раз как выполняется цикл, из файла считывается значение и записывается в массив (infile > > mas[i];). Аналогично и с подпрограммой записи в файл и сортировки массива (Только при сортировке массива запись будет вестись во временный массив, а не в файл).

1.4 Условный оператор if

Условный оператор позволяет проверить некоторое условие и в зависимости от результатов проверки выполнить то или иное действие. Таким образом, условный оператор — это средство ветвления вычислительного процесса. Структура условного оператора имеет следующий вид:

if < условие> then < оператор1> else < оператор2>;

где if/ then/ else — зарезервированные слова (если, то, иначе);

< условие> - произвольное выражение логического типа;

< оператор1>, < оператор2> - любые операторы языка С++

Условный оператор работает по следующему алгоритму: Вначале вычисляется условное выражение < условие>. Если результат есть True (истина), то выполняется < оператор1>, а < оператор2> пропускается; если результат есть False (ложь), наоборот, < оператор1> пропускается, а выполняется < оператор2>. Else и следующие за ним операторы могут быть опущены. Вот фрагмент подпрограммы сортировки массива демонстрирующий работу данного оператора:

if ((k==mas[j]) or ((mas[j]> (10*k-1)) and (mas[j]< (10*k+10))))

{

mas1[i]=mas[j];

}

Как мы видим из приведённого примера, у нас проверяется условие ((k==mas[j]) or ((mas[j]> (10*k-1)) and (mas[j]< (10*k+10)))). Если условие верно, то во временный массив записывается текущее значение, а если ложно то ничего не выполняется, программа переходит к выполнению следующего за if оператора.

1.5 Заголовочные файлы

Заголовочный файл (иногда головной файл, англ. header file), или подключаемый файл -- в языках программирования Си и C++ файл содержащий определения типов данных, структуры, прототипы функций, перечисления, макросы препроцессора. Имеет по умолчанию расширение. h; иногда для заголовочных файлов языка C++ используют расширение. hpp. Заголовочный файл используется путём включения его текста в данный файл директивой препроцессора #include. Чтобы избежать повторного включения одного и того же кода, используются директивы #ifndef, #define, #endif

Заголовочный файл в общем случае может содержать любые конструкции языка программирования, но на практике исполняемый код (за исключением inline-функций в C++) в заголовочные файлы не помещают. Например, идентификаторы, которые должны быть объявлены более чем в одном файле, удобно описать в заголовочном файле, а затем его подключать по мере надобности.

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

stdlib -- заголовок (заголовочный файл) стандартной библиотеки общего назначения языка Си, который содержит в себе функции, занимающиеся выделением памяти, контроль процесса выполнения программы, преобразования типов и другие. Заголовок вполне совместим с C++ и в C++ известен как cstdlib. Название «stdlib» расшифровывается как «standard library» (стандартная библиотека). В разработанной программе данная библиотека используется только для проверки правильности завершения работы программы.

return EXIT_SUCCESS;

iostream -- заголовочный файл с классами, функциями и переменными для организации ввода-вывода в языке программирования C++. Он включён в стандартную библиотеку C++. Название образовано от Input/Output Stream («поток ввода-вывода»). В языке C++ и его предшественнике, языке программирования Си, нет встроенной поддержки ввода-вывода, вместо этого используется библиотека функций. iostream управляет вводом-выводом, как и stdio. h в Cи. iostream использует объекты cin, cout, cerr и clog для передачи информации в и из стандартных потоков ввода, вывода, ошибок (без буферизации) и ошибок (с буферизацией) соответственно. Являясь частью стандартной библиотеки C++, эти объекты также являются частью стандартного пространства имён -- std. В разработанной программе данная библиотека используется для работы с потоками данных.

Cout < < - вывод данных в консоль

Cin > > - ввод данных с консоли

fstream — Данный заголовочный файл предназначен для работы с файлами. В данной программе он используется для осуществления чтении из файла и записи в него. А именно: подключает нужный файл, открывает файл для записи, устанавливает тип чтения записи, закрывает файл после работы, считывает данные из файла и записывает в файл.

ifstream infile («first1. txt»); - Подключаем файл для чтения

infile > > mas[i]; - Считываем данные из файла

ofstream outfile («sort. txt»); - Подключаем файл для записи

outfile < <mas[i]; - Записываем данные в файл

windows — Windows файл заголовков для языка программирования C++, который содержит заявления для всех функций в Windows API, все общие макросы, которые используются программистами окон, и все типы данных, используемых различными функциями и подсистем. Он определяет большое количество окон конкретные функции, которые могут быть использованы в С++. Win32 API могут быть добавлены в проект программирования C++, включив < windows. h> заголовка файла и ссылки на соответствующие библиотеки. В данной программе используется только для осуществления плавного вывода данных в консоль, путём приостановки работы программы на заданный интервал времени.

Sleep (30); - Приостанавливаем выполнение на 30 миллисекунд

math.h -- заголовочный файл стандартной библиотеки языка программирования С, разработанный для выполнения простых математических операций. Большинство функций привлекают использование чисел с плавающей точкой. C++ также реализует данные функции для обеспечения совместимости, все они содержатся в заголовочном файле cmath.

Все эти функции принимают double, если не определено иначе. Для работы с типами float и long double используются функции с постфиксами f и l соответственно. Все функции, принимающие или возвращающие угол, работают с радианами. Вообще разработанной программе не используются математические функции, но без данного модуля не работают простейшие логические операции or и and. Поэтому пришлось включить.

1.6 Функции. Объявление и определение функций

Процесс разработки программного обеспечения предполагает разделение сложной задачи на набор более простых задач и заданий. В Си++ поддерживаются функции как логические единицы (блоки текста программы), служащие для выполнения конкретного задания.

Функции имеют нуль или более формальных параметров и возвращают значение скалярного типа, типа void (пусто) или указатель. При вызове функции значения, задаваемые на входе, должны соответствовать числу и типу формальных параметров в описании функции. Если функция не возвращает значения (т.е. возвращает void), то она служит для того, чтобы изменять свои параметры или глобальные для функции переменные.

Но для использования функции в программе её нужно объявить и определить. Объявление функции называется прототипом, содержит имя функции, тип возвращаемого функцией значения и количество, и тип её параметров. Указание имён параметров не является обязательным. За списком параметров, после закрывающейся скобки, должна следовать; а не операторный блок. С++ требует, чтобы функция была объявлена, до того как она будет полностью определена, если вызов её предшествует её определению. Правила объявления и определения функций в СИ++:

1) При объявлении функции перед её именем всегда указывается тип возвращаемого ею значения

2) Если список параметров пуст, круглые скобки после имени функции должны быть указаны. СИ++ позволяет вам использовать ключевое слово void для явного указания того, что список параметров пуст, хотя это будет возвратом к стандартному языку СИ.

3) Список параметров с указанием типов должен иметь следующий вид:

[const ] < тип1> < параметр1>, [const ] < тип2> < параметр2>,…

Параметры задаются подобно тому, как определяются переменные: сначала задается тип параметра, а потом идентификатор параметра. В С++ параметры в списке разделяются запятыми. Для каждого параметра необходимо указать его тип. Ключевое слово const объявляет компилятору, что значение параметра не должно изменяться функцией.

4) Тело функции C++ заключается в фигурные скобки. За закрывающейся скобкой не должно быть точки с запятой.

5) C++ поддерживает передачу параметров, как по ссылке, так и по значению. По умолчанию параметры передаются по значению. В этом случае функция работает с копией передаваемых данных, оставляя оригинал данных неизменным. Для определения параметра передающегося по ссылке, необходимо после указания типа ввести символ &. Имя ссылочного параметра является псевдонимом фактического параметра. Любое изменение ссылочного параметра влечет за собой изменение переменной переданной в качестве фактического параметра.

Общая форма задания ссылочных параметров:

[const]< тип1&><параметр1>,[const]<тип2&><параметр2>…

Ключевое слово const объявляет компилятору, что значение параметра не должно быть изменено функцией.

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

7) Ключевое слово return передает в вызывающую функцию возвращаемое значение, если оно существует.

8) Если тип возвращаемого функцией значения — void, вы не обязаны использовать оператор return, кроме того случая, когда нужно произвести выход из функции прежде, чем она выполнится целиком. В этом случае оператор return не имеет параметра, — ничего возвращать не нужно.

9) С++ требует, чтобы либо объявление, либо определение функции предшествовали её вызову.

Рассмотрим структуру функции на примере функции чтения из файла:

void WriteFile ()

{

int i;

ofstream outfile («sort. txt»);

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

{

outfile < <mas[i];

outfile< <"n";

}

}

Итак, в самой первой строке мы записываем тип нашей функции. В данном случае — это Void. Сразу за типом функции следует её имя. Я назвал её WriteFile (Чтение файла; соответствует её назначению и исключает путаницу в больших программах) для удобства. После имени функции в круглых скобках указываются параметры функции. В нашем случае они не нужны т.к. передавать в функцию мы ничего не будем. Начиная со второй строки и до конца идёт тело функции. Оно состоит из последовательности операторов, выполняющих те или иные операции. Тело функции заключается в фигурные скобки. Операции, входящие в тело функции рассматривать не будем.

1.7 Функция main ()

Функция main, с которой начинается выполнение СИ-программы, может быть определена с параметрами, которые передаются из внешнего окружения, например, из командной строки. Во внешнем окружении действуют свои правила представления данных, а точнее, все данные представляются в виде строк символов. Для передачи этих строк в функцию main используются два параметра, первый параметр служит для передачи числа передаваемых строк, второй для передачи самих строк. Общепринятые (но не обязательные) имена этих параметров argc и argv. Параметр argc имеет тип int, его значение формируется из анализа командной строки и равно количеству слов в командной строке, включая и имя вызываемой программы (под словом понимается любой текст не содержащий символа пробел). Параметр argv это массив указателей на строки, каждая из которых содержит одно слово из командной строки. Если слово должно содержать символ пробел, то при записи его в командную строку оно должно быть заключено в кавычки.

Функция main может иметь и третий параметр, который принято называть argp, и который служит для передачи в функцию main параметров операционной системы (среды) в которой выполняется СИ-программа. Заголовок функции main имеет вид:

int main (int argc, char *argv[], char *argp[])

Но в подавляющем большинстве случаев параметры функции main можно исключить. Так мы и поступим. Тогда заголовок функции примет следующий вид:

int main ()

По назначению функция main является основной функцией любой программы на языке С++. Именно последовательность действии, заложенная в данную функцию, выполняется во время работы программы (Она является как бы инструкцией для остальных операций и функций программы). Рассмотрим данную функцию на примере разработанной программы:

int main ()

{

ReadFileParse ();

psort ();

WriteFile ();

system («PAUSE»);

return EXIT_SUCCESS;

}

Заголовок функции мы рассмотрели ранее, поэтому его опускаем. Следом за заголовком функции следует её тело. Как же будет оно выполняться? Всё очень просто:

Вызываем функцию с именем ReadFileParse ()

Ожидаем выполнение данной функции и передаём управление следующему оператору. Вызываем функцию сортировки psort () и дожидаемся её выполнения. Аналогично происходит и с функцией WriteFile ()

Делаем паузу для просмотра результатов работы программы функцией system («PAUSE»)

Проверяем правильность завершения работы программы функцией EXIT_SUCCESS.

подпрограмма чтение файл запись

1.8 Функции ввода-вывода

Стандартная библиотека C/C++ включает ряд функций для чтения и записи в консоли (клавиатура и монитор). Эти функции читают и пишут данные как простой поток символов.

Понятие потока (stream), использованное в программировании, тесно связано с обычным, бытовым пониманием этого слова. Поток ввода можно сравнить с трубой, по которой вода (информация) поступает в бассейн (память компьютера), поток вывода — с трубой, по которой вода выходит из бассейна. Важной особенностью этой трубы является то, что в каждый момент времени данные могут двигаться только в одном направлении. Даже если одна и та же труба используется для ввода и вывода, это не может происходить одновременно: для переключения направления потока его нужно остановить, выполнить некие действия и лишь затем направить поток в обратном направлении.

Функция «cin» (the standart input stream — стандартный поток ввода) в С++ читается как «си-ин». Обычно она выполняет ввод с клавиатуры. Хотя «cin» может быть связана и с другим устройством.

Функция «cout» (the standart output stream — стандартный поток вывода) в С++ читается как «Си-аут». обычно она выполняет вывод на экран дисплея. Однако, «cout» может быть связана и с другим устройством. Когда говорят, что «программа печатает результат», то обычно подразумевают, что данные отображаются на экране. Вместе с тем результаты могут быть выведены и на другое устройство, например, на диски или на принтер в виде твердой копии на бумаге.

Необходимо помнить, что существует еще стандартный поток ошибок: «the standart error stream», который обозначается как cerr. Этот поток обычно связывается с экраном.

Часто программисты и пользователи направляют поток «cout» на другие устройства, сохраняя экран для потока «cerr» ошибок, чтобы иметь возможность немедленно получать сведения об ошибках в программе в процессе ее работы.

1.9 Функции чтения-записи

Чтобы вывести данные в файл или вывести их из файла программа должна подключить к нему потоковый объект класса ifstream или ofstream соответственно, эти классы определены в библиотеке fstream и отнесены к пространству имен std. Заголовочный файл iostream определяет выходной поток cout. Аналогично, заголовочный файл fstream определяет класс выходного файлового потока с именем ofstream Используя объекты класса ofstream, наши программы могут выполнять вывод в файл. Для начала мы должны объявить объект типа ofstream, указав имя требуемого выходного файла как символьную строку, что показано ниже:

ofstream file_object («FILENAME. TXT»);

Если вы указываете имя файла при объявлении объекта типа ofstream, C++ создаст новый файл на вашем диске, используя указанное имя, или перезапишет файл с таким же именем, если он уже существует на вашем диске. Подобным образом ваши программы могут выполнить операции ввода из файла, используя объекты типа ifstream. Опять же, вы просто создаете объект, передавая ему в качестве параметра требуемое имя файла:

ifstream input_file («filename. TXT»);

2. Блок-схема алгоритма программы

2.1 main ()

2.2 ReadFileParse ()

2.3 psort ()

2.4 WriteFile ()

3. Исходный текст программы с комментариями

#include < cstdlib> // Проверка нормального завершения программы

#include < iostream> // Ввод-вывод (Для работы с потоками)

#include < fstream> // Работа с файлами

#include < Windows. h> // Создания паузы во время работы программы

#include < math. h> //Работа с математическими функциями

using namespace std; //Используем стандартное пространство имён

int mas[50]; //Описываем массив целых чисел

void psort () //Подпрограмма сортировки чисел

{

int i, j, k; //Описываем переменные целого типа

int mas1[50]; //Описываем массив целых чисел, дополнительный

i=0; //Счётчик для временного массива

for (k=0; k< 10;k++) //Инициализируем цикл

{

if (k==0) //Условие для поиска нулей

{

for (j=0; j<50;j++) //Инициализируем вложенный цикл

{

if (k==mas[j]) //Если текущее значение равно 0, то

{

mas1[i]=mas[j]; //Текущее значение сохраняем во временном массиве

i++; //Прибавляем счетчик для временного массива

}

}

}

else //Если к не равно 0

{

for (j=0; j<50;j++) //Инициализируем цикл

{

if ((k==mas[j]) or ((mas[j]> (10*k-1)) and (mas[j]< (10*k+10)))) //Проверяем условие сортировки

{

mas1[i]=mas[j]; //Сохраняем текущее значение во временно массиве

i++; //Прибавляем счетчик для временного массива

}

}

}

}

cout< <"Конечный файл: «; //Выводим сообщение

cout< <"nn"; //Переходим на новую строку и выводим пустую строку

for (j=0; j<50;j++) //Инициализируем цикл

{mas[j]=mas1[j]; //Переносим значения из маs1 в mas

cout < <j<<" - «< <mas[j] < <"n»;} //Выводим результат сортировки

Sleep (30); //Приостанавливаем выполнение программы на заданное время

}

void ReadFileParse (void) //Подпрограмма чтения из файла

{

int i; //Описываем переменные целого типа

ifstream infile («first1. txt»); //Подключаем файл с числами cout< <"Исходный файл: «;

cout< <"nn"; //Переходим на новую строку и выводим пустую строку

for (i=0; i< 50; i++) / /Инициализируем цикл

{

infile > > mas[i]; //Считываем числа из файла в массив

cout < < i < < «- «< < mas[i]< <"n»; //Выводим исходный файл на печать

Sleep (30); //Приостанавливаем выполнение программы на заданное время

}

cout< <"nn"; //Выводим 2 пустые строки

}

void WriteFile () //Подпрограмма записи в файл

{

int i; //Описываем переменные целого типа

ofstream outfile («sort. txt»); //Подключаем файл для записи

for (i=0; i< 50; i++) //Инициализируем цикл

{

outfile < <mas[i]; //Записываем число в выходной файл

outfile< <"n"; //Переводим курсор для записи на новую строку

}

}

int main () //Основная часть программы

{

ReadFileParse (); //Вызов подпрограммы чтения файла

psort (); //Вызов подпрограммы сортировки чисел

WriteFile (); //Вызов подпрограммы записи в файл

system («PAUSE»); //Делаем паузу для просмотра результатов работы

return EXIT_SUCCESS; //Проверяем нормальное завершение программы

}

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

1. СС++. Программирование на языке высокого уровня Т. А. Павловская. — СПб.: Питер, 2003. — 461 с

2. Липпман, Стенли Б., Лажойе, Жози, Му, барбара Э. Язык программирования С++. Вводный курс, 4-е издание.: Пер. с англ. — М.: ООО «И. Д. Вильямс», 2007. — 896 с.

3. ГОСТ 19. 701−90 (ИСО 5807−85). Единая система программной документации. Схемы алгоритмов, программ данных и систем. Условные обозначения и правила выполнения.

ПоказатьСвернуть
Заполнить форму текущей работой