Реферат по предмету "Программирование и компьютеры"


Сведения о расходе горючего на автобазах города

Содержание Задание на курсовой проект Содержание Введение 1. Система программирования и прикладные системы
1.1. Объявление и определение функций 2. Решение экономической задачи «Сведения о расходе горючего на автобазах города» 2.1. Постановка задачи 2.2. Разработка алгоритма решения задачи 2.3. Разработка программы решения задачи 2.3.1.Описание работы программы (краткое руководство пользователя) Заключение Список использованной литературы Приложение 1 Текст программы Введение Автором языка С++ является Бьярн Страуструп. Изначально язык С++ был разработан, для того чтобы не приходилось программировать на Ассемблере, С или других современных языках высокого уровня. «С++ - это универсальный язык общего назначения, область применения которого - программирование систем в самом широком смысле» - так писал его автор. До 1983 года язык был известен лишь автору и его группе поддержки. Практическое использование языка началось летом 1983 г. Тогда же появилось и название - С++; его придумал Рик Масситти (++ - операция приращения). Данный язык программирования базируется на языке, С, который был разработан для системных программистов с тем, чтобы избавить их от работы на Ассемблере. С этой целью в С были включены многие операции низкого уровня, позволяющие работать с машинными представлениями данных (числами, символами и адресами). С другой стороны, С является языком высокого уровня (Бьярн Страуструп называет его языком относительно низкого уровня). Таковым является и С++. Основное его отличие от предшественника состоит в том, что в С++ добавлено все необходимое для поддержки объектно-ориентированного стиля программирования. На протяжении своей сравнительно недолгой истории язык С++ постоянно совершенствовался. В структуру языка вводились новые понятия, расширялась его библиотека стандартных функций и классов, создавались все новые и новые системы программирования. Это привело к тому, что литература по С++ очень быстро устаревала. В подтверждение сказанного достаточно сравнить три издания книги Б. Страуструпа “Язык программирования С++” . В августе 1998 г. был, наконец, принят стандарт языка (ISO/IES 14882 “Standard for the C++ Programming Language”). Однако до сих пор в нашем распоряжении нет среды программирования, которая бы полностью поддерживала стандарт. Конкретно мы будем вести разработку в среде программирования Borland C++ версии 5.2. Ключевым понятием С++ является понятие класса. Бьярн Страуструп определяет класс следующим образом: «Класс - это тип, определенный пользователем; это значит, что он задает поведение объектов из этого класса: как они создаются, как может осуществляться работа с ними, и как они уничтожаются». В Турбо Паскале (до 7-ой версии включительно) понятию класс соответствовало понятие объектный тип. В языке Object Pascal объектные типы стали называть классами. Изучение языка Си++ позволит освоить базовые методы разработки и эксплуатации программного обеспечения ПЭВМ, а также более эффективно использовать вычислительную технику в практической деятельности будущего специалиста. Так как язык Си++ является важным и перспективным языком структурно-модульного программирования, мы будем изучать данный язык на примере решения экономической задачи «Сведения о производительности труда». В задаче даются исходные данные такие как: наименование автобазы, объем израсходованного топлива и количество машин. Нам требуется вычислить производительность труда на автобазе. Решение данной задачи программным методом позволит ускорить, упорядочить и упростить расчет и вывод анализируемой информации. 1. Система программирования и прикладные системы 1.1 Объявление и определение функций В языке С++, как и в его предшественнике С, в отличие от языка Паскаль и др. в которых различаются программы, подпрограммы, процедуры и функции, используются только функции. При программировании на языке С++ функция – это основное понятие, без которого невозможно обойтись. Во-первых, каждая программа обязательно должна включать единственную функцию с названием main (главная функция). Именно функция main обеспечивает создание точки входа в откомпилированную программу. Кроме главной функции, в программу может входить произвольное количество функций, выполнение которых инициируется прямо или опосредованно вызовами из функции main. Всем именам функций программы по умолчанию присваивается класс памяти extern, т.е. каждая функция имеет внешний тип компоновки и статическую продолжительность существования. Как объект с классом памяти extern, каждая функция глобальна, т.е. при определенных условиях доступна в модуле и даже во всех модулях программы. Для доступности в модуле функция должна быть в нем определена или описана до первого вызова. Следует различать объявление функции и ее описание (определение). В определении функции указываются последовательность действий, выполняемых при ее вызове, имя функции, тип функции (тип возвращаемого ею значения, т.е. тип результата) и совокупность формальных параметров (аргументов). Определение функции, в котором выделяются две части – заголовок и тело, имеет следующий формат: тип_функции имя_функции (спецификация_формальных_па­ра­метров) тело_функции Здесь тип_функции – тип возвращаемого функцией значения, в том числе void, если функция никакого значения не возвращает. Имя_функции – идентификатор. Имена функций как имена внешние (тип extern) должны быть уникальными среди других имен из модулей, в которых используются функции. Спецификация формальных параметров - это либо пусто, либо void, либо список спецификаций отдельных параметров, в конце которого может быть поставлено многоточие. Неиспользуемые параметры имеют смысл в двух случаях: когда предусмат­ривается расширение программы в будущем или, наоборот, когда программа упрощается и за счет этого появляется " лишний " параметр. В обоих случаях гарантируется, что не нужно будет изменять саму программу. Например: void search ( table *t, const char *key, const char* ) { . } Тело функции – это всегда блок или составной оператор, т.е. последовательность описаний и операторов, заключенная в фигурные скобки. Очень важным оператором тела функции является оператор возврата в точку вызова: return выражение; или return; Пример: 1) int Anyfunc ( void ) {If (условие) return 0; Else {оператор; return 1; } } 2) int factorial ( int n ) { if (n>1) return n*factorial(n-1); else return 1; } Выражение в операторе return определяет возвращаемое функцией значение. Именно это значение будет результатом обращения к функции. Тип возвращаемого значения определяется типом функции. Если функция не возвращает никакого значения, т.е. имеет тип void, то выражение в операторе return опускается. В этом случае необязателен и сам оператор return в теле функции. В теле функции может быть и несколько операторов return.
В том случае если функция не должна выполнять никаких действий и не должна возвращать никаких значений, тело функции буде состоять из фигурных скобок {}. При обращении к функции, формальные параметры заменяются фактическими, причем соблюдается строгое соответствие параметров по типам. В отличие от своего предшественника – языка С, язык С++ не предусматривает автоматического преобразования в тех случаях, когда фактические параметры не совпадают по типам с соответствующими им формальными параметрами. Говорят, что язык С++ обеспечивает «строгий контроль типов». В связи с этой особенностью языка С++ проверка соответствия типов формальных и фактических параметров выполняется на этапе компиляции.
Формальные параметры функции – это обобщенное представление данных, которые нужны функции для ее работы. Их еще называют аргументами. Фактические параметры – это те конкретные данные, которые передаются функции при каждом ее вызове. Переменные, объявленные внутри функции, называются локальными. Под эти переменные (если только они не имеют описателя static – см. далее) память выделяется при каждом вызове функции и освобождается при ее завершении. Формальные параметры по определению являются локальными. Формальные параметры в С++ могут иметь любой встроенный или производный тип. Строгое согласование по типам между формальными и фактическими параметрами требует, чтобы в модуле до первого обращения к функции было помещено ее объявление (прототип), содержащее сведения о ее типе (о типе результата, т.е. возвращаемого значения) и о типах всех параметров. Именно наличие такого прототипа позволяет компилятору выполнять контроль соответствия типов параметров. Прототип функции может внешне почти полностью совпадать с заголовком ее определения: тип_функции имя_функции (спецификация_формальных_па­ра­метров); Основное различие – точка с запятой в конце объявления (прототипа). Второе отличие - необязательность имен формальных параметров в прототипе даже тогда, когда они есть в заголовке определения функции. Примеры: void f( ); // функция не имеет параметров и не возвращает значение extern double sqrt( double ); // внешняя функция с параметром и возвращаемым значением типа double char* strcpy( char *to, const char *from); // функция имеет два параметра и возвращает указатель на char.
2. Решение экономической задачи
«Сведения о расходе горючего на автобазах города» 2.1 Постановка задачи Цель курсового проекта – разработка программы на языке Си++ для решения экономической задачи «Сведения о производительности труда». Реализована эта задача должна быть двумя путями: с использованием файлов, и на базе динамических структур (односвязного списка). Программа должна обеспечивать: 1. Ввод с клавиатуры исходных данных, требуемых для решения данной задачи. 2. Длительное хранение и корректировку этих данных (нужно создать файл для хранения исходных данных и предусмотреть возможность дополнения, изменения, удаления записей и их вывода на экран монитора или принтер). 3. Создание динамической структуры заданного типа (односвязный список), при этом данные должны вводиться в процессе диалога с клавиатуры. 4. Добавление новых элементов в созданную динамическую структуру или исключение существующих; корректировку элементов списка; вывод элементов динамической структуры на экран монитора или принтер в заданном порядке; сохранение структуры в файле и ее воссоздание. Формула расчета и вид выходного документа указаны в таблице 2.1 Таблица 2.1 № п/п Автобаза Израсходовано топлива, тонн Количество автомашин, штук Средний расход, кг 1 2 . A T K С=Т/K Итого S1 S2 S3 При разработке программы необходимо в максимальной степени использовать механизм функций языка С++ (действия над данными, как ввод, вывод, корректировка и другие, должны быть оформлены в виде отдельных функций). Кроме того, при разработке программы необходимо задействовать возможности модульного программирования. 2.2 Разработка алгоритма решения задачи Разрабатывать программу мы будем в среде программирования Borland C++ версии 5.2. Так как программа у нас будет объемная, и в наши задачи входит обучение модульному программированию мы разобьем программу на модули. Обязательно должен быть головной модуль и заголовочный. В головном модуле будет выводится шапка программы и основное меню. Заголовочный модуль будет содержать работу с файлами и односвязными списками. Но так как это тоже будет большой объем, мы разобьем заголовочный модуль на два модуля: один - работа с файлами, другой - работа со списком. Итак, наша программа будет состоять из головного модуля: - cursovoi.cpp, и двух заголовочных: - f1.h, - s1.h. Теперь определимся с данными: Исходными данными у нас являются: -наименование Автобазы (строковый тип), -объем израсходованного топлива (вещественный тип), -количество автомашин (целый тип), и расчетные данные: -производительность автобазы (вещественный тип). Автобаз будет неопределенное количество. Для хранения данной информации можно воспользоваться как массивами, так и структурами (типами, определяемыми пользователями). Проанализировав вышеуказанную информацию (информация по автобазам разных типов, количество автобаз не известно) мы остановимся на структурах. Мы создадим структуру predpr, содержащую информацию о автобазах, и будем обращаться к ней при помощи переменной типа predpr. Структура predpr и переменная ved типа predpr будут объявлены как глобальные переменные. Для структуризации программы, ее удобочитаемости и наглядности построение программы будет основываться на функциях. Так как информация о автобазах однотипная, и нам придется передавать ее в функции и обратно, практически все остальные переменные будут локальными, для избежания путаницы и зацикливания. В С++ используются два типа файлов: текстовые и двоичные (бинарные). По умолчанию файлы открываются в текстовом режиме. Это означает, что при вводе из текстового файла последовательность символов "возврат каретки / перевод строки " преобразуется в символ '\n' ; при выводе - наоборот. В процессе ввода - вывода производятся, как и в Паскале, преобразования данных из внутреннего (машинного) представления в символьное и наоборот.
В данном случае мы выбрали работу с двоичными файлами, так как информация у нас в основном не текстовая, и за счет этого мы можем увеличить быстродействие, избежанием преобразований файлов текстовые двоичные и обратно. Головной модуль будет состоять из функций:
- работа с файлом (функция fail( )); - работа с односвязным списком (spisok( )); Также в головном модуле будут подключаются заголовочные модули при помощи директивы #include, с указанием пути к этим файлам. В файле f1.h будет реализовано решение задачи путем работы с файлами, т.е. функция fail( ). Так как нам предстоит работа с файловым вводом выводом мы будем использовать понятие потока, глобальной переменной мы укажем переменную потока nab типа fstream. Класс fstream мы выбрали так при работе с этим классом возможны как чтение, так и запись с диска. При вызове каждой функции работу с файлом мы будем организовывать следующим образом: инициировать поток, открыть файл и связать его с потоком. То есть файл полностью в буфер мы не будем загружать, а будем читать в поток из файла по одной записи, производить над ней определенные действия, и при выходе из функции закрывать поток и файл. Модуль состоит следующих функций, которые вызываются из функции fail( ): 1. Создание файла и ввод информации по автобазам с клавиатуры (функция sozd()) -функция типа void передает указатель на поток (fstream *q); 2. Дополнение записей в уже созданный файл (функция dopolnen()) - функция типа void передает указатель на поток (fstream *q); 3. Корректировка уже созданных записей (функция korr()) - функция типа void передает указатель на поток (fstream *q); 4. Удаление записей из файла (функция iskl()); - функция типа void передает указатель на поток (fstream *q); 5. Ввывод информации о автобазах из файла на экран в форме таблицы (функция pech()) - функция типа void передает указатель на поток (fstream *q); Также отдельной функцией оформлено: 6. Ввод данных по автобазам и расчет производительности по введенным данным (функция vvod()). -функция типа void передает указатель на переменную (predpr *p). Эта функция вызывается в таких функциях как : -создание файла; -дополнение записей в файл; -корректировка записей. В функции записывается переменная типа predpr, в которой содержится информация по одной автобазе. Далее она анализируется, и с ней производятся действия указанные в конкретной функции. В файле s1.h будет реализовано решение задачи путем работы с односвязным списком т.е. функция spisok ( ). Однонаправленным (односвязным) списком называется структура данных, в которой каждый элемент содержит ссылку лишь на одного "соседа". Поэтому в структуру predpr, которую мы описали ранее нам надо добавить еще одно поле, которое будет содержать указатель на соседнюю запись. Получим новую структуру predpry. Модуль состоит следующих функций, которые вызываются из функции spisok ( ): 1. Создание списка и ввод информации по автобазам с клавиатуры (функция sozd()) - функция типа void передает указатель на переменную (predpry *p); 2. Дополнение записей в уже созданный список (функция vstavka( ()) - функция типа void передает указатель на переменную (predpry *p); 3. Корректировка уже созданных записей (функция korekt()) - функция типа void передает указатель на переменную (predpry *p); 4. Удаление записей из списка (функция udalen ()) - функция типа void передает указатель на переменную (predpry *p); 5. Вывод информации по автобазам из списка на экран в форме таблицы (функция prints ()) - функция типа void передает указатель на переменную (predpry *p); 6. Сохранение созданного списка в файле на диске (функция soxran()) - функция типа void передает указатель на переменную (predpry *p); 7. Очистка списка (функция ochistka()) - функция типа void передает указатель на переменную (predpry *p); 8. Восстановление списка из ранее сохраненного файла на диске (функция vossosdanie()) - функция типа void передает указатель на переменную (predpry *p); В головном модуле нам потребуется подключить такие стандартные библиотеки: -fstream.h В этой библиотеке находятся описания потоковых классов. Ее подключение необходимо для использованияя в программе тех или иных средств ввода – вывода при работе с файлами. -stdlib.h Стандартная библиотека -ctype.h В данной библиотеке описан ряд функций, которые удобно использовать при организации ввода - вывода с целью контроля вводимых значений; -conio.h -stdio.h -new.h В данной библиотеке описаны функции для работы с динамической памятью и динамическими переменными, для выделения и освобождения памяти; -string.h В данной библиотеке находятся cтандартные функции работы со строками; -iomanip.h В данной библиотеке находятся описания манипуляторов, которые используются для форматирования ввода-вывода. 2.3 Разработка программы решения задачи Итак наша программа состоит из 3-х модулей: - cursovoi.cpp, - f1.h, - s1.h. Главная функция main(), находится в модуле cursovoi.cpp. В главной функции, выводится сначала шапка курсового проекта. Затем в конструкции do{}while() выводится основное меню в котором предлагаются следующие возможности: 1. Работа с файлами 2. Работа со списками 3. Выход из программы Первые два пункта реализуются в конструкции switch()case: если выбран пункт 1, то вызывается функция fail(); если выбран пункт 2 , то вызывается функция spisok(). При выборе пункта 3 происходит выход из конструкции do{}while(), и завершается работа программы. Переменные в функции main() не объявляются: все глобальные переменные объявлены в функциях fail() и spisok(). Опишем глобальные переменные, используемые в программе в таблице 2.3.1. Таблица 2.3.1 Принятое имя Наименование ved Переменная типа predpr (структура определен­ная пользователем), используется для проме­жу­точного хранения информации по одной автобазе при работе с файлами. otv Переменная тип char, используется для считывания запрашиваемых ответов в функциях fail() и spisok(). vibor Переменная тип char, используется для выбора пунктов меню, как главного, так и меню в функциях fail() и spisok(). nab Переменная типа fsrteam, используется в качестве параметра для передачи ссылки на поток в функциях работы с файлами. buf Переменная типа predpry (структура определен­ная пользователем), используется для проме­жу­точного хранения информации по одной автобазе при сохранении списка в файл, и считывания списка из файла. nach Переменная содержащая указатель на начало списка tek Переменная содержащая указатель на текущую позицию списка Функция fail() – выводится меню работы с файлами, реализована также в конструкции switch()case: -выбор 1 – функция sozd(); -выбор 2 – функция dopolnen(); -выбор 3 – функция korr(); -выбор 4 – функция iskl();
-выбор 5 – функция pech(); При выборе пункта 6 происходит выход из конструкции do{}while(), и выход в головную функцию. Локальных переменных не объявляется, используются глобальные. В отдельную небольшую функцию выделена функция задержки экрана – функция pause(). Она будет использоваться практически во всех ниже описанных функциях. Функция sozd() – создание нового файла. С клавиатуры вводится название файла, проверяется есть ли уже такой файл. Если файла с таким именем нет, то файл создается, и открывается в двоичном режиме на запись. Информация по автобазам заносится с клавиатуры в функции vvod(), и хранится во временной переменной. Затем проверяется существует ли автобаза с именем, указанным во временной переменной. Если уже есть, то запись не сохраняется, если нет, то сохраняется. После этого запрашивается продолжать ли ввод по автобазам. Если нет, то происходит выход из функции, если да, то возвращаемся на функцию ввод. Переменные, используемые в функции, опишем в таблице 2.3.2. Таблица 2.3.2 Принятое имя Наименование vedread Переменная типа predpr (структура определен­ная пользователем), используется для проме­жу­точного хранения информации по одной автобазе при работе с файлами. fname Переменная тип char, используется для считывания и хранения имени файла. *name Указатель на тип char, используется при проверке названия автобазы. kol Переменная типа int, в которой записывается кол-во записей в файле k Переменная типа int, счетчик. Используется при проверке названия павтобазы. Функция dopolnen() – дополнение записей в уже созданный файл. С клавиатуры вводится название файла, проверяется есть ли файл с таким названием. Если файл есть, то открывается в двоичном режиме на дополнение. Информация по автобазе заносится с клавиатуры в функции vvod(), и хранится во временной переменной. Затем проверяется существует ли автобаза с именем, указанным во временной переменной. Если уже есть, то запись не сохраняется, если нет, то сохраняется. После этого запрашивается продолжать ли ввод по автобазам. Если нет, то происходит выход из функции, если да, то возвращаемся на функцию ввод. Переменные, используемые в функции, опишем в таблице 2.3.3. Таблица 2.3.3 Принятое имя Наименование vedread Переменная типа predpr (структура определен­ная пользователем), используется для проме­жу­точного хранения информации по одной автобазе при работе с файлами. fname Переменная тип char, используется для считывания и хранения имени файла. *name Указатель на тип char, используется при проверке названия автобазы. kol Переменная типа int, в которой записывается кол-во записей в файле k Переменная типа int, счетчик. Используется при проверке названия автобазы. Функция korr () – корректировка записей в уже созданном файле. С клавиатуры вводится название файла, проверяется есть ли файл с таким названием. Если файл есть, то открывается в двоичном режиме на чтение. Затем вводится название корректируемой автобазы. Поочередно просматриваются записи в файле, и сравниваются текущее название автобазы с введенным с клавиатуры. Если наименования совпадают, то запоминается номер позиции записи в файле. Новая информация по корректируемой автобазе заносится с клавиатуры в функции vvod(), записывается во временной переменной, и записывается на место корректируемой записи с После этого запрашивается продолжать ли корректировку по автобазе. Если нет, то происходит выход из функции, если да, то возвращаемся на ввод названия корректируемого пр-ия . Переменные, используемые в функции, опишем в таблице 2.3.4. Таблица 2.3.4 Принятое имя Наименование n Переменная тип char, используется для считывания и хранения имени корректируемой автобазы. fname Переменная тип char, используется для считывания и хранения имени файла. Функция iskl () – удаление записей из уже созданного файла. С клавиатуры вводится название файла, проверяется есть ли файл с таким названием. Если файл есть, то открывается в двоичном режиме на чтение. Также организовывается вспомогательный поток данных на запись. Затем вводится название корректируемой автобазы. Поочередно просматриваются записи в файле, и сравниваются текущее название автобазы с введенным с клавиатуры. Если наименования не совпадают, тогда текущая запись записывается во вспомогательный файл, если совпадают то данная запись пропускается. Когда просмотренны все записи, и если запись с исходным наименованием существовала, то исходный файл удаляется, а вспомогательному файлу, присваивается имя исходного. Если записи с исходным наименованием не существовало, тогда удаляется вспомогательный файл. После этого запрашивается продолжать ли удаление автобаз. Если нет, то происходит выход из функции, если да, то возвращаемся на ввод названия корректируемой автобазы. Переменные, используемые в функции, опишем в таблице 2.3.5. Таблица 2.3.5 Принятое имя Наименование vspom Потоковая переменная тип ofstream, используется для хранения вспомогательного файла. isk Переменная тип char, используется для считывания и хранения имени удаляемой автобазы. fname Переменная тип char, используется для считывания и хранения имени файла. col Переменная типа int, флажок. Используется при проверке названия автобазы. Функция pech() – вывод на экран содержимое файла. С клавиатуры вводится название файла и открывается в двоичном режиме на чтение. Последовательно во временную переменную считывается информация по автобазам, выводится построчно на экран, и пересчитываются накопительные суммы по израсходованному топливу , количеству автомашин, и производительности автобазы, которые выводятся в конце таблицы строкой ИТОГО.
Переменные, используемые в функции, опишем в таблице 2.3.6. Таблица 2.3.6 Принятое имя Наименование kol Переменная типа int, в которой записывается кол-во записей в файле svalprod Переменная типа float, для накопительной суммы по израсходованному топливу skolrab Переменная типа int, для накопительной суммы по количеству автомашин sproizv Переменная типа float, для накопительной суммы по производительности труда. Функция spisok() – выводится меню работы с односвязным списком, реализована также в конструкции switch()case: -выбор 1 – функция sozd(); -выбор 2 – функция vstavka (); -выбор 3 – функция korekt (); -выбор 4 – функция udalen (); -выбор 5 – функция prints (); -выбор 6 – функция soxran (); -выбор 7 – функция ochistka (); -выбор 8 – функция vossosdanie (); При выборе пункта 9 происходит выход из конструкции do{}while(), и выход в головную функцию. В начале функции, перед циклом, мы создаем нулевой фиктивный элемент списка. Локальных переменных не объявляется, используются глобальные. Функция sozd() – создание односвязного списка. Параметром в функцию передается указатель на начало списка. В данной функции в цикле вызывается функция vstavka (), пока запрашиваемый ответ не будет 'N', и заполняется список. Функция vstavka () – добавление записей в односвязный список. Параметром в функцию передается указатель на начало списка. Cоздается новая запись. С клавиатуры вводится название новой автобазы, затем проверяется существует ли запись с таким наименованием автобазы. Если такая запись уже существует, то выводится соответствующее сообщение и запись не сохраняется. Если записи с таким именем автобазы нет то, заполняются все поля структуры, и новая запись сохраняется как последний элемент структуры. Переменные, используемые в функции, опишем в таблице 2.3.7. Таблица 2.3.7 Принятое имя Наименование nov Указатель на переменную типа predpry (структура определен­ная пользователем), используется для хранения информации по новой автобазе. tek1 Указатель на переменную типа predpry (структура определен­ная пользователем), используется для хранения информации по текущей автобазе. b Переменная типа int, флажок. Используется при проверке названия автобазі. Функция korekt () – корректировка записей в односвязном списке. Параметром в функцию передается указатель на начало списка. С клавиатуры вводится название корректируемой автобазы. Затем поочередно просматриваются записи в списке: если наименования совпадают то предлагается на выбор изменять или не изменять отдельные поля в записи. Если запись с исходным именем не найдена, то происходит выход из функкции. Переменные, используемые в функции, опишем в таблице 2.3.8. Таблица 2.3.8 Принятое имя Наименование k Переменная тип char, используется для считывания и хранения имени файла. b Переменная типа int, флажок. Используется при проверке названия автобазы. Функция udalen () – удаление записей из односвязного списка Параметром в функцию передается указатель на начало списка. Проверяется не пустой ли список. Если да, то выводится соответствующее сообщение, и происходит выход из функции. С клавиатуры вводится название удаляемой автобазы, затем проверяется существует ли запись с таким наименованием автобазы. Если такая запись существует, то указателю текущей записи переприсваивается указатель следующей записи. Если записи с таким именем автобазы нет то, заполняются все поля структуры, и последней записью становится новая запись. Переменные, используемые в функции, опишем в таблице 2.3.9. Таблица 2.3.9 Принятое имя Наименование nov Указатель на переменную типа predpry (структура определен­ная пользователем), используется для хранения информации по новой автобазе. tek1 Указатель на переменную типа predpry (структура определен­ная пользователем), используется для хранения информации по текущей автобазе. b Переменная типа int, флажок. Используется при проверке названия автобазы. Функция prints () – вывод на экран односвязного списка Параметром в функцию передается указатель на начало списка. Проверяется не пустой ли список. Если да, то выводится соответствующее сообщение, и происходит выход из функции. Выводится шапка таблицы. Затем производится проход по списку, и построчно выводится информация о автобазах. Параллельно производится расчет накопительных сумм по израсходованному топливу, количеству автомашин и производительности автобаз. Действия выполняются пока не достигнут конец списка. Переменные, используемые в функции, опишем в таблице 2.3.10. Таблица 2.3.10 Принятое имя Наименование svalprod Переменная типа float используется для хранения накопительной суммы по израсходованному топливу по автобазам. skolrab Переменная типа int используется для хранения накопительной суммы по количеству автомашин по автобазам. sproizv Переменная типа float используется для хранения накопительной суммы по производительности труда по автобазе. i Переменная типа int, счетчик. Используется для подсчета количества автобаз. Функция soxran () – сохранение односвязного списка в файле на жестком диске Параметром в функцию передается указатель на начало списка. С клавиатуры вводится название файла в котором будет сохранен список. Затем открывается файл с указанным именем в двоичном режиме на запись. Затем поочередно записи из списка копируются в буферную переменную, и в файл. после этого файл закрывается.
Переменные, используемые в функции, опишем в таблице 2.3.11. Таблица 2.3.11 Принятое имя Наименование fname Переменная тип char, используется для считывания и хранения имени файла. k Переменная типа int, счетчик. Используется для подсчете количества записей. Функция ochistka () – очистка односвязного списка Параметром в функцию передается указатель на начало списка. Проверяется не пустой ли список. Если список пуст, то выводится соответствующее сообщение и происходит выход из функции. Если список не пустой, то производится проход по списку, и удаление текущего элемента, пока не будет достигнут последний элемент списка. Переменные, используемые в функции, опишем в таблице 2.3.12. Таблица 2.3.12 Принятое имя Наименование k Переменная типа int, счетчик. Используется для подсчете количества записей. Функция vossosdanie () – воссоздание односвязного списка из раннее сохраненного файла. Параметром в функцию передается указатель на начало списка. С клавиатуры вводится название файла в котором был сохранен список. Затем открывается файл с указанным именем в двоичном режиме на чтение. Файл откроется только если он был ранее создан. Затем в цикле записи из файла копируются в буферную переменную. Каждый проход цикла создается новый элемент списка, в поля которого копируются соответствующие поля буферной переменной, и формируется поле адреса. Когда просмотрены все записи в файле, файл закрывается. Переменные, используемые в функции, опишем в таблице 2.3.13. Таблица 2.3.13 Принятое имя Наименование nov Указатель на переменную типа predpry (структура определен­ная пользователем), используется для копирования информации по автобазам из файла в список. tek1 Указатель на переменную типа predpry (структура определен­ная пользователем), используется для копирования информации по автобазе из файла в список. Вспомогательная переменная fname Переменная тип char, используется для считывания и хранения имени файла. kol Переменная типа int, в которой записывается кол-во записей в файле k Переменная типа int, счетчик. Используется для подсчете количества записей. Ниже приведены блок схемы следующих функций: - рисунок 1 – главная функция main(); - рисунок 2 – функция создания файла sozd(); - рисунок 3 – функция воссоздания списка vossosdanie(). Рис.1. Блок схема главной функции main() Рис. 2. Блок схема функции создания файла sozd() Рис. 3. Блок схема функции воссоздания списка vossosdanie ()
potok.close
Нет
Да

Закрываем поток

Закрываем поток
q->close
for (int i=0; i
k++

tek1->next=nov
Устанавливаем новое начало списка

nov->next= tek1->next
Переходим на следую­щий элемент списка

nov->nazva nov->valprod nov->kolrab nov->proizv
nov=new predpry


Заполняем поля нового элемента данными из вспом. переменной
Создаем новый элемент списка

tek=nach->next tek1=nach

Запоминаем адрес текущего эл-та списка

potok.read ((char*)&buf, sizeof(buf))

Считываем i-ю запись из фай­­ла во вспомо­гатель­ную переменную 2.3.1.Описание работы программы (краткое руководство пользователя) Примечание: Так как программа была разработана в среде Borland C++ версии 5.2. американская версия, которая не русифицированна и не принимает кодов ASCII, все руководства будут выводится на экран русскими словами, но латинскими буквами. Просим извинения за неудобства чтения. Для запуска программы надо найти и запустить файл с именем cursovoi.cpp. После запуска файла в окне MS DOS выведется сначала шапка курсового проекта: "KURSOVOI PROEKT" "PO KURSU "OP I AY" "NA TEMU: RESHENIE ZADACHI " "SWEDENYA O PROIZVODITELNOSTI TRUDA" "VIPOLNILA STUDENTKA 1 KURSA GR. 401-2" "PRASOL KRISTINA ALEKSANDROVNA" После этого для продолжения работы надо нажать Enter. Далее появится главное меню: "PROGRAMMA RESHAET TAKIE ZADACHI:" "1)RABOTA S FAILOM" "2)RABOTA S ODNOSWAZNIM SPISKOM" "3)EXIT" "VACH VIBOR: " Для работы с файлом надо набрать цифру 1, для работы с односвязным списком – цифру 2, для выхода из программы – цифру 3. После этого надо нажать Enter. При выборе работы с файлом появится подменю: "VIDY RABOTI S FAILOM: " "1)SOZDANIE FAILA" "2)DOPOLNENIE ZAPISEI V FAIL" "3)KORREKTIROVKA ZAPISEI" "4)UDALENIE ZAPISEI IZ FAILA" "5)PECHAT FAILA" "6)VOZVRAT V OSNOVNOE MENU" "VASH VIBOR: " Для создания файла надо набрать цифру 1, для дополнения записей в файл – цифру 2, для корректировки записей – цифру 3, для удаления записей из файла – цифру 4, для вывода записей из файла не экран – цифру 5, для возврата в основное меню – цифру 6. После этого надо нажать Enter. При выборе работы с односвязным списком появится подменю: "VID RABOT S ODNOSV'AZNIM SPISKOM:" "1) SOZDANIE SPISKA" "2) DOPOLNENIE SPISKA" "3) KORREKTIROVKA ZAPISEY" "4) UDALENIE ZAPISEY" "5) PECHAT' SPISKA" "6) SOHRANENIE SPISKA" "7) OCHISTKA SPISKA" "8) VOSSOZDANIE SPISKA" "9) VOZVRAT V OSNOVNOE MENU" "VASH VIBOR: " Для создания списка надо набрать цифру 1, для дополнения записей в список – цифру 2, для корректировки записей – цифру 3, для удаления записей из списка – цифру 4, для вывода записей из списка на экран – цифру 5, для сохранения записей из списка в файле – цифру 6, для очистки списка – цифру 7, для воссоздания списка из ранее сохраненного файла – цифру 8, для возврата в основное меню – цифру 9. После этого надо нажать Enter.
Заключение В процессе выполнения данной курсовой работы была разработана программа для решения экономической задачи «Сведения о производительности труда» на алгоритмическом языке программирования Си ++. Был разработан алгоритм решения задачи, составлены блок-схемы для отдельных функций.
В ходе самостоятельной работы был изучен язык Си++, его три основные составляющие: - алфавит – конечное множество различимых между собой символов; - синтаксис – совокупность правил, определяющих допустимые конструкции данного языка; - семантика – совокупность правил определяющих смысловое содержание отдельных конструкций. Также изучили работу с динамическими структурами данных (односвязные, двухсвязные списки, стеки очереди) на примере работы с односвязным списком. Получили навыки по работе с файлами. Освоили методы структурно-модульного программирования, разбивая программу на модули. В процессе работы над курсовым проектом была достигнута основная цель курсового проектирования – закрепление и улучшение фундаментальных теоретических знаний в области структурно-модульного программирования и получение навыков разработки и отладки программ решения экономических задач. Список использованной литературы 1. Харви Дейтел, Пол Дейтел. Как программировать на С++; Третье издание. Пер. с англ. – М.:ЗАО «Издательсиво БИНОМ»,2001 г. – 1153 с. 2. Методические рекомендации к лабораторным работам по курсу «Основы программирования и алгоритмические языки» для студентов специальности 7.050401 дневной формы обучения. Часть 1. / Составители: Ю.В.Перколаб, В.В.Браткевич, Л.И.Лукашева. Изд.ГГЭУ,2001 г. 3. Браткевич В.В., Лукашева Л.И.,Перколаб Ю.В., Основы программирования и алгоритмические языки (язык программирования С++). Часть 1. Конспект лекций. Харьков: Изд.ГГЭУ,2001 г. 4. Методические рекомендации к лабораторным работам по курсу «Основы программирования и алгоритмические языки» для студентов специальности 7.080401 всех форм обучения. Часть 2. / Составители: Ю.В.Перколаб, В.В.Браткевич, Л.И.Лукашева. Изд.ГГЭУ,2002. г 5. Б.Страуструп. Язык программирования С++, 3-е изд.\Пер. с англ. – СПб.; М.: «Невский диалект» – Издательство БИНОМ», 1999 г 6. Подбельский В.В. Язык С++: Учебн.пособие. – 4-е изд. – М.: Финансы и статистика, 1999, -- 560 с. 7. Фридман А.Л. Основы объектно – ориентированного программирования на языке С++.—М.: Горячая линия – Телеком, Радио и связь, 1999 г Приложение 1 Текст программы - головной модуль cursovoi.cpp : #include #include #include #include #include #include #include #include #include "a:\\f1.h" #include "a:\\s1.h" main ( ) { cout cout pause(); do { clrscr(); cout cout cout cout cout cout cin >> vibor; clrscr(); switch (vibor) { case '1': clrscr(); fail( ); break; case '2': clrscr(); spisok( ); break; } } while (vibor!='3'); /*ochistka(nach); delete nach; */ cout return 0; } - заголовочный модуль f1.h : // f1.h struct predpr { char nazva[15]; float valprod; int kolrab; float proizv; }; predpr ved; char otv; char vibor; fstream nab; void vvod(predpr *p); void sozd(fstream *q); void pech(fstream *q); void dopolnen(fstream *q); void korr(fstream *q); void iskl(fstream *q); void pause(); ///////////////////////////////////////////////////////////////////////// void fail() { do { clrscr(); cout cout cout cout cout cout cout cout cin >> vibor; clrscr(); switch (vibor) { case '1': clrscr(); sozd(&nab); pause(); break; case '2': clrscr(); dopolnen(&nab); pause(); break; case '3': clrscr(); korr(&nab); pause(); break; case '4': clrscr(); iskl(&nab); pause(); break; case '5': clrscr(); pech(&nab); pause(); break; } } while (vibor!='6'); } //////////////////////////////////////////////////////////////////////////// void sozd(fstream *q) { predpr vedread; int kol,k=1; char fname[8],*name; clrscr(); cout cin >> fname; q->open(fname, ios::out|ios::binary|ios::noreplace); if (!*q) { cout cout return; } do { clrscr(); vvod(&ved); k=1; name=ved.nazva; q->seekp(0, ios::end); kol=q->tellp()/sizeof(predpr); if (*q) { if (kol==0) q->write( (char*)&ved, sizeof(ved) ); else {q->close(); q->open(fname, ios::in|ios::binary); for (int i=0; i { q->read( (char*)&vedread, sizeof(vedread) ); if (strcmp(vedread.nazva,name)) k++; } if (k!=kol) { q->close(); q->open(fname, ios::app|ios::binary); q->write( (char*)&ved, sizeof(ved) ); } else { cout cout } } } cout cin >> otv; } while ((otv!='N')&&(otv!='n')); q->close(); } //////////////////////////////////////////////////////////////////////////// void vvod(predpr *p) { char name[15] ; cout cout
cin >> p->nazva; cout cin >> p->valprod; cout cin >> p->kolrab;
p->proizv=p->valprod/p->kolrab; cout cout proizv } //////////////////////////////////////////////////////////////////////////// void pech(fstream *q) { int kol; float svalprod=0; int skolrab=0; float sproizv=0; clrscr(); cout char fname[8]; cin >> fname; q->open(fname, ios::app|ios::binary|ios::nocreate); if (!*q) { cout return; } q->seekp(0, ios::end); kol=q->tellp()/sizeof(predpr); q->close(); q->open(fname, ios::in|ios::binary); if (*q) { clrscr(); cout cout cout cout for (int i=0; i { q->read( (char*)&ved, sizeof(ved) ); cout cout cout.setf(ios::left); cout cout.setf(ios::fixed); cout.setf(ios::right); cout cout svalprod+=ved.valprod; cout skolrab+=ved.kolrab; cout sproizv+=ved.proizv; } cout cout cout cout cout cout } q->close(); // cout.unsetf(); } /////////////////////////////////////////////////////////////////////////// void pause() { cout while ( getch() != 13) ; } //////////////////////////////////////////////////////////////////////////// void dopolnen(fstream *q) { char otv; predpr vedread; int kol,k=1; clrscr(); cout char fname[8],*name; cin>>fname; q->open(fname, ios::app|ios::binary|ios::nocreate); if (!*q) { cout return; } do { vvod(&ved); k=1; name=ved.nazva; q->seekp(0, ios::end); kol=q->tellp()/sizeof(predpr); if (*q) { q->close(); q->open(fname, ios::in|ios::binary); for (int i=0; i { q->read( (char*)&vedread, sizeof(vedread) ); if (strcmp(vedread.nazva,name)) k++; } if (k!=kol) { q->close(); q->open(fname, ios::app|ios::binary); q->write( (char*)&ved, sizeof(ved) ); } else { cout cout } } cout cin >> otv; } while ((otv!='N')&&(otv!='n')); q->close(); } //////////////////////////////////////////////////////////////////////////// void korr(fstream *q) { char n[15]; clrscr(); cout char fname[8]; cin >> fname; q->open(fname, ios::in|ios::out|ios::binary|ios::nocreate); if (!*q) { cout return; } do {clrscr(); cout cin>>n; do { q->read( (char*)&ved, sizeof(ved) ); } while (*q && strcmp(ved.nazva,n) ); if (!strcmp(ved.nazva,n)) { vvod(&ved); q->seekp(-streamoff(sizeof(predpr)),ios::cur); q->write( (char*)&ved, sizeof(ved) ); } else cout q->seekp(0); cout cin >> otv; } while ((otv!='N')&&(otv!='n')); q->close(); } //////////////////////////////////////////////////////////////////////////// void iskl(fstream *q) { ofstream vspom; char isk[15]; int col=0; char fname[8]; cout cin >> fname; clrscr(); do { q->open(fname, ios::in|ios::binary); vspom.open("vsp",ios::out|ios::binary); if ( *q && vspom ) { cout cin >> isk; do { q->read( (char*)&ved, sizeof(ved) ); if (q->eof()) break; if (!strcmp(ved.nazva,isk)) col=1; else vspom.write( (char*)&ved, sizeof(ved) ); } while ( *q ); q->close(); vspom.close(); if (col) { remove(fname); rename("vsp", fname); cout } else { cout remove("vsp"); } } else { cout break; } cout cin >> otv; } while ((otv!='N')&&(otv!='n')); } /////////////////////////////////////////////////////////////////////////// ` - заголовочный модуль s1.h : // s1.h struct predpry { char nazva[15]; float valprod; int kolrab; float proizv; predpry* next; }; predpry buf; predpry* nach; predpry* tek; void sozd(predpry* ); void prints(predpry* ); void vstavka(predpry* ); void udalen(predpry*); void korekt(predpry*); void soxran (predpry*); void ochistka(predpry*); void vossosdanie(predpry* ); void pause(); ///////////////////////////////////////////////////////////////////////////////
void spisok() { nach=new predpry; nach->next=0; strcpy(nach->nazva,"fik");
nach->valprod =0; nach->kolrab =0; do { clrscr(); cout cout cout cout cout cout cout cout cout cout cout cin >> vibor; clrscr(); switch (vibor) { case '1': clrscr(); sozd(nach); pause(); break; case '2': clrscr(); vstavka(nach); pause(); break; case '3': clrscr(); korekt(nach); pause(); break; case '4': clrscr(); udalen(nach); pause(); break; case '5': clrscr(); prints(nach); pause(); break; case '6': clrscr(); soxran(nach); pause(); break; case '7': clrscr(); ochistka(nach); pause(); break; case '8': clrscr(); vossosdanie(nach); pause(); break; } } while (vibor!='9'); } //////////////////////////////////////////////////////////////////// void sozd(predpry* nach) { clrscr(); do { //clrscr(); vstavka(nach); cout cin>>otv; } while ((otv!='N')&&(otv!='n')); } ////////////////////////////////////////////////////////////////////////////// void vstavka(predpry* nach) { predpry* nov; predpry* tek1; int b; tek=nach->next; tek1=nach; b=1; nov=new predpry; cout cout cin >> nov->nazva; while ((tek!=0) && b) { if ( !strcmp(tek->nazva,nov->nazva)) { cout b=0; return; } else { tek1=tek; tek=tek->next; } } cout cin >> nov->valprod; cout cin >> nov->kolrab; nov->proizv=nov->valprod/nov->kolrab; cout cout proizv; nov->next=tek1->next; tek1->next=nov; } //////////////////////////////////////////////////////////////////////////// void korekt(predpry* nach) { clrscr(); char k[15]; int b=1; cout cin>>k; tek=nach->next; while ((tek!=0) && b ) { if(!strcmp(tek->nazva,k)) b=0; else tek=tek->next; } if (b==0) { if (!strcmp(tek->nazva,k) ) { cout cout cin >> tek->nazva; cout cout valprod; cout cin >> otv; if ((otv!='N')&&(otv!='n')) { cout cin >> tek->valprod; } cout cout kolrab; cout cin >> otv; if ((otv!='N')&&(otv!='n')) { cout cin >> tek->kolrab; } tek->proizv=tek->valprod/tek->kolrab; cout cout proizv; cout } } else { cout return; } } ////////////////////////////////////////////////////////////////////////////////// void udalen(predpry* nach) { predpry* tek1; clrscr(); int b=1; char isk[15]; cout cin>>isk; tek=nach->next; tek1=nach; if(tek==0) { cout return; } while ((tek!=0) && b ) { if(!strcmp(tek->nazva,isk)) { tek1=tek; b=0; } else tek=tek->next; } if (b==0) {if (!strcmp(tek->nazva,isk) ) { tek1->next=tek->next; delete tek; } } else cout return; } /////////////////////////////////////////////////////////////////////////////////// void prints(predpry* nach) { float svalprod=0; int skolrab=0; float sproizv=0; int i=1; tek=nach->next; if (tek==0) { cout return; } cout cout cout cout while (tek!=0) { cout cout cout.setf(ios::left); coutnazva cout.setf(ios::fixed); cout.setf(ios::right); cout coutvalprod svalprod+=tek->valprod; coutkolrab skolrab+=tek->kolrab; coutproizv sproizv+=tek->proizv; tek=tek->next; } cout cout cout cout cout cout
} ///////////////////////////////////////////////////////////////////// void soxran(predpry* nach) { tek=nach->next;
if (tek==0) { cout return; } int k=0; char fname[8]; cout cin >> fname; ofstream potok; potok.open(fname,ios::out|ios::binary); if(!potok) { cout return; } while (tek!=0) { strcpy(buf.nazva,tek->nazva); buf.valprod = tek->valprod; buf.kolrab = tek->kolrab; buf.proizv = tek->proizv; potok.write((char*)&buf, sizeof(buf)); tek=tek->next; k++; } cout potok.close(); } ////////////////////////////////////////////////////////////////////////////////// void vossosdanie(predpry* nach) { long kol; int k=0; char fname[8]; cout cin >> fname; fstream potok; potok.open(fname,ios::app|ios::binary|ios::nocreate); if(!potok) { cout return; } potok.seekp(0,ios::end); kol = potok.tellp( ) / sizeof(predpry); potok.close(); cout potok.open(fname,ios::in|ios::binary); nach->next = 0; predpry* nov; predpry* tek1; for(int i=0; i { potok.read((char*)&buf, sizeof(buf)); tek=nach->next; tek1=nach; nov=new predpry; strcpy(nov->nazva,buf.nazva); nov->valprod = buf.valprod; nov->kolrab = buf.kolrab; nov->proizv = buf.proizv; nov->next=tek1->next; tek1->next=nov; k++; } cout potok.close(); } //////////////////////////////////////////////////////////////////////////// void ochistka(predpry *nach) { int k=0; tek=nach->next; if (tek==0) { cout return ; } while (tek!=0) { delete tek; tek=tek->next; k++; } nach->next=0; cout }


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.

Сейчас смотрят :