Основы системного программирования 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Основы системного программирования



Практика

Учебное пособие для студентов дневной формы обучения

по направлению подготовки 09.03.01

"Информатика и вычислительная техника"

 

 

Профиль подготовки

“Вычислительные машины, комплексы, системы и сети”

 

 

Квалификация (степень) - бакалавр

 

Нижний Новгород

2019 год

Составитель Мартынов Д.С.

УДК 004.432.2

Рецензент – доцент, кандидат технических наук Д.В. Жевнерчук

Программирование на С++: Практика. учеб.пособие / Д.С. Мартынов; Нижегородский государственный технический университет им. Р.Е. Алексеева, 2019. – 00 с.

 

Данное пособие содержит учебный материал по основам алгоритмизации и программирования, задания для лабораторных работ, контрольные вопросы по дисциплине "Программирование" в соответствии с учебным планом для направления подготовки 09.03.01 "Информатика и вычислительная техника" во втором учебном семестре. В качестве языка программирования выбран язык С ++ в его спецификации C ++ 11.

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

 

 

Редактор _______________

Подп. к печ. __________Формат 60х84 1/16. Бумага офсетная. Печать офсетная. Печ. л. _ 6 __. Уч.-изд. л. ____. Тираж ____ экз. Заказ ____.

_____________________________________________________________________

Нижегородский государственный технический университет

имени Р.Е. Алексеева.

Типография НГТУ.

Адрес университета и полиграфического предприятия:

603950, г. Н.Новгород, ул. К.Минина, 24.

  © Нижегородский государственный технический университет, 2018
  © Д.С. Мартынов, 2019

 

ОГЛАВЛЕНИЕ

 

Введение …………………………………………………………………….. Раздел 1. Основы системного программирования Лабораторная работа №1. Обработка аргументов командной строки …... Раздел 2. Лабораторная работа №2. Использование структур ……………………... Раздел 3. Лабораторная работа №3. Проектирование и использование классов …. Раздел 4. Лабораторная работа №4. Наследование, перегрузка операций ………... Раздел 5. Лабораторная работа №5. Виртуальные функции, полиморфизм ………. Список литературы и источников в сети Интернет ………………………. Приложение ………………………………………………………………….  

 

ВВЕДЕНИЕ

 

Настоящее учебное пособие содержит учебно-методический материал, предназначенный для изучения курса "Программирование" студентами дневного отделения по направлению подготовки 09.03.01 "Информатика и вычислительная техника". Пособие включает в себя несколько тематических блоков, затрагивающих разделы объектно-ориентированного программирования на языке С++ и использования средств его стандартной библиотеки. Приведены задания для лабораторных работ.

По каждой лабораторной работе оформляется отчет в установленной форме и производится защита теоретических знаний по изучаемому разделу курса.

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

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

 

Внедрение пароля в исходный код программы

 

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

 

Алгоритм «Проверка пароля» (Аргументы: char* S1, Результат: bool Res)

Дано Строка S2 # Исходная запись пароля, сохраняемая в исходном тексте программы

Начало Целое i:=0, int Res:= 1

| Если argc > 1: # Программа запущена с аргументами

| | То Res:= strcmp(S1, S2)

| | | Если Res == 0 # Строки введенного и внедренного

| | | |        # паролей совпали

| | | | То <Пароль введен успешно> {...}

| | | | Иначе # <завершение работы программы>

| | | Все_Если

| Все_Если

Конец

Напишите программу, реализующую представленный алгоритм.

 

ЛАБОРАТОРНАЯ РАБОТА №1

Задания для самостоятельной работы

  1. Запустите терминал. Определите название используемого командного интерпретатора.
  2. Ознакомьтесь с встроенной справочной системой (man). Изучите способы получения контекстной справочной информации.
  3. Изучите базовые команды для навигации по файловой системе и манипуляции с файлами: ls, pwd, cd, cp, rm, mv, mkdir.
  4. Изучите базовые команды для управления вывода на экран: cat, more, less, pg.
  5. Изучите справку по команде more. Опишите алгоритм ее работы и используемые механизмы. Создайте функционально близкий функции more аналог средствами языка С ++. Сравните работу базовой и созданной функции. Сделать выводы.
  6. Изучите справку по команде cat. Описать алгоритм ее работы и используемые механизмы. Создать функционально близкий функции more аналог средствами языка С++. Сравнить работу базовой и созданной функции. Сделать выводы.

 

Задания к лабораторной работе

Согласно заданию составить алгоритм и написать программу на языке С ++. Программа компилируется и запускается под управлением ОС Linux. Разработанная программа должна содержать встроенную справочную информации, описывающую правила использования, цель назначения и информацию о разработчике. Аргументы запуска программа должна обрабатывать согласно рекомендациям POSIX.

 

Варианты заданий

1. Написать программу, работающую в текстовом режиме, которая должна выводить на экран содержимое текстового файла, имя которого передается в программу с помощью аргументов командной.

Все строки в файле длиннее 80 символов обрезать до 80 символов. Цвет символов - белый. Вверху экрана выводить имя файла. Цвет фона - черный. При нажатии клавиш Up & Down прокручивать экран по вертикали. При нажатии клавиш Left & Right прокручивать экран по горизонтали, т.е. выводить ранее обрезанные строки.

 

2. Написать программу, работающую в текстовом режиме (ширина экрана равна 80 столбцов), которая должна выводить на экран содержимое бинарного файла, имя которого передается в программу с помощью аргументов командной строки.

Содержимое бинарного файла выводить в шестнадцатеричном виде по 16 байт в строке, между каждыми четырьмя байтами вставляя пробел. Вверху экрана выводить имя файла. В левой части экрана выводить смещение (в шестнадцатеричной форме) 16-байтной строки относительно начала файла. Цвет символов - белый. Цвет фона - черный. При нажатии клавиш Up & Down прокручивать экран по вертикали.

Пример выполнения:

test

00000000 455D103D 56431DFC 66CA41AA 123309BB

00000010 D54D1000 06434D8C 66CA41AA 123309BB

...

 

3. Написать программу, работающую в текстовом режиме (ширина экрана равна 80 столбцов), которая должна выводить на экран содержимое текстового файла, имя которого передается в программу с помощью аргументов командной.

Все строки в файле длиннее 80 символов необходимо переносить по словам на следующую строку экрана. Вверху экрана выводить имя файла. Цвет символов - белый. Цвет фона - черный. При нажатии клавиш Up & Down прокручивать экран по вертикали.

 

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

 

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

 

6. Написать программу, принимающую в качестве аргументов командной строки два имени текстового файла и параметр, определяющий режим записи. Программа считывает содержимое первого файла и записывает его во второй файл. Режим записи определяет, будет ли второй файл перезаписан или данные первого файла будут добавляться в конец второго файла.

 

7. Написать программу, читающую информацию со стандартного потока ввода и записывающую ее в файл. Имя файла программа принимает в качестве аргумента командной строки. Чтение со стандартного потока продолжается до тех пор, пока пользователь не нажмет ' Ctrl + Z ' (EOF).

 

8. Написать программу, работающую в текстовом режиме (ширина экрана равна 80 столбцов), которая должна выводить на экран текстовый файл (имя передается через аргументы командной строки). Строки длиннее 80 символов обрезаются. Цвет символов - серый. Цвет фона - черный. Слова, список который определен в массиве:

char *keyWords[] = {

"int",

"float",

...

};

должны выводиться белым цветом. При нажатии клавиш Up, Down прокручивать экран.

 

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

 

10. Написать программу, принимающую в качестве аргумента командной строки имя текстового файла и выводящую содержимое файла в стандартный поток ошибок (STDERR) в обратном порядке.

 

11. Написать программу, принимающую в качестве аргумента командной строки имя текстового файла и выводящую содержимое файла построчно в стандартный поток вывода: сначала первая строка, потом вторая и так далее. Каждая последующая строка выводится на экран после нажатия пользователем клавиши Enter.

 

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

 

13. Написать программу, принимающую в качестве аргумента командной строки имя файла. Если этот файл имеет расширение. txt, программа должна вывести его содержимое в стандартный поток вывода. Если это исполняемый файл, программа должна запустить его на выполнение (Необходимо подготовить исполнимый файл, выводящих на экран какое-нибудь сообщение). Если этот файл имеет какое-то другое расширение, программа должна вывести соответствующее сообщение и завершиться.

 

14. Написать программу, работающую в текстовом режиме (ширина экрана равна 80 столбцов), которая должна выводить на экран содержимое двух бинарных файлов, имена которых передаются в программу с помощью аргументов командной строки.

Содержимое бинарных файлов выводить в шестнадцатеричном виде по 16 байт в строке, между каждыми четырьмя байтами вставляя пробел. В левой части экрана выводить смещение (в шестнадцатеричной форме) 16-байтной строки относительно начала файла. Файлы отделять вертикальной чертой. Вверху экрана выводить имена файлов. Различающиеся байты файлов отображать красным цветом. Цвет остальных символов - белый. Цвет фона - черный. При нажатии клавиш Up & Down прокручивать экран по вертикали.

Пример выполнения:

test.exe bc.exe

00000000 455D103D 56431DFC 66CA41AA 123309BB | 4D000000 00101000 60CA1111 1131111B

00000010 D54D1000 06434D8C 66CA41AA 123309BB | D54D1000 06434D8C 66CA41AA 123309BB

...

 

15. Написать программу, работающую в текстовом режиме (ширина экрана равна 80 столбцов), которая должна выводить на экран список файлов и каталогов в текущей директории (в которой запущена программа). Если весь список не умещается на одном экране, то при нажатии клавиш Up, Down прокручивать список.

 

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

 

17. Написать программу, принимающую в качестве аргумента командной строки имя текстового файла. Программа считывает содержимое переменных окружения системы и записывает их в файл, имя которого принимает в качестве параметра.

 

18. Написать программу, выполняющую перемещение файла, начальное и конечное имена файлов передаются в программу через аргументы командной строки.

 

19. Написать программу, принимающую в качестве аргументов командной строки два имени текстовых файлов. Программа считывает содержимое первого файла, преобразует символы латиницы нижнего регистра в символы латиницы верхнего регистра, а символы латиницы верхнего регистра в символы латиницы нижнего регистра, и записывает его во второй файл.

 

20 Для текстового файла, имя которого передается через командную строку, подсчитать количество: 1) символов; 2) символов без пробелов; 3) букв; 4) слов; 5) предложений, и вывести сформированную статистику на экран.

 

21 Считать текстовый файл, имя которого передано через командную строку, произвести преобразование текста, написанного латиницей, к верхнему регистру. Результат работы сохраняется в обрабатываемом файле. Например: begin -> BEGIN.

 

22 Подготовить исполнимый файл (1), принимающий из командной строки один параметр (имя файла) и выводящий содержимое файла на экран. Подготовить исполнимый файл (2), принимающий из командной строки два параметра: имя исполнимого файла, который он запускает, и строковый параметр, который он передает запускаемому файлу через командную строку. Осуществить запуск исполнимого файла (2) в связке с исполнимым файлом (1).

 

23 Программа принимает через командную строку: 1) имя текстового файла; 2) произвольную строку символов (ключ). Программа должна вывести на экран только те строки файла, в которых содержится строка символов (ключ), переданная через командную строку вторым аргументом. При выводе на экран строки файла, выделять вхождение ключа другим цветом.

 

24 Написать программу, которая разбивает большой файл на ряд файлов меньшего размера и собирает ряд файлов в один. При разбивке имя разбиваемого файла и размер конечного файла передавать через командную строку. При сборке имя первого собираемого файла передавать через командную строку, остальные файлы искать в текущей директории, увеличивая номер в расширении файла.

У разбиваемого файла менять имя и расширение:

filename. ext -> filename _ ext. pXX, где XX - это номер части (от 00 до 99). При сборке производить обратную операцию.

Пример:

файл a. out размер 5 456 223 байт

конечные файлы:

a _ out. p 01 размер 2 000 000 байт

a _ out. p 0 2 размер 2 000 000 байт

a _ out. p 03 размер 1 456 223 байт

 

Пример работы программы:

разбиение:

c:\>file_sc -s BigFile 2000000

 

сборка:

c:\>file_sc -с BigFile.p01

 

25 Написать программу, которая составляет список файлов в текущей директории, сортирует файлы в списке по расширению (в алфавитном порядке) и записывает этот отсортированный список в текстовый файл.

 

26 Написать программу, принимающую в качестве аргументов командной строки два имени текстовых файлов. Программа считывает содержимое первого файла, подсчитывает число вхождений каждой буквы, и записывает результат во второй файл.

 

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

 

28. Написать программу, принимающую в качестве аргументов командной строки имя текстового файла и параметр, определяющий режим вывода содержимого файла на экран. Программа выводит содержимое файла на экран в зависимости от режима вывода либо в обычном символьном виде, либо в шестнадцатеричном формате (по два знакоместа на символ под старшие и младшие 4 бита). При выводе в шестнадцатеричном формате коды соседних символов разделять пробелами.

 

Рекомендаци и по организации кода программы

 

1. Старайтесь осмысленно использовать директиву using, определяя при помощи неё использование нужных средств стандартной библиотеки. Например, целесообразно использовать

 

using std::cout;

using std::cin;

using std::endl;

using std::string;

 

вместо использования всего пространства имен стандартной библиотеки:

 

using namespace std;

 

Целесообразно использовать пространство имен для разделения области различных частей проекта, содержащего объявления нескольких классов. Пространство имен позволяет исключить конфликт имен для классов и методов с одинаковыми именами, определенными в различных частях проекта.

 

2. Каждый блок кода программы должен быть сопровожден соответствующими комментариями. Комментарии к программе должны быть составлены на русском языке. Старайтесь делать код программы читаемым, давать переменным и методам осмысленные имена.

 

3. При использовании объектно-ориентированного подхода к проектированию программ целесообразна многофайловая организация проекта. При этом в состав проекта будут входить главный модуль main.cpp и файлы статических библиотек, включающие в себя заголовочные файлы библиотек и соответствующе им файлы реализации.

4. Имена создаваемых программных модулей, равно как и имена программных переменных, должны нести смысловую нагрузку об их назначении. Можно использовать стандартные сокращения, абревиатуры и их комбинации. Например, имя программной утилиты su, входящей в состав командной оболочки bash, является сокращением от английского «substitute user» - «замена пользователя», что отражает факт создания локализованной сессии выполнения команд от имени другого пользователя.

 

Файловый ввод-вывод в Linux

Низкоуровневый файловый ввод-вывод является артефактом операционной системы. Именно он обеспечивает наибольшее быстродействие и используется службами ядра.

 

Низкоуровневый файловый ввод-вывод не является средством стандартной библиотеки языка С. Это платформо зависимая система ввода-вывода. На UNIX/Linux и Windows системах она имеет различную внутреннюю реализацию, хотя и имеет общий функциональный механизм.

Низкоуровневый файловый ввод-вывод основан на использовании дескрипторов файлов. Файловые дескрипторы относятся к одному из важных ресурсов процесса – программы в контексте исполнения. При клонировании процесса дочерний процесс наследует, в том числе, и таблицу открытых файловых дескрипторов.

 

Агрегативный тип данных

Структура является одним из базовых типов (базовые, встроенные типы данных) для языков С и С ++, она относится к категории агрегативных типов данных и используется для создания типов данных, определяемых пользователем. С точки зрения теории информации, структурой называют некоторый набор данных и связи, наложенные на эти данные. Благодаря имеющимся связям между данными они выделяются из внешней информационной среды. Можно сказать, что структура – это способ организации информации. Структуры позволяют описывать категории физического мира терминами языка программирования и являются базой для создания абстрактных типов данных (ADT – Abstract Data Type)

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

Структуры, содержащие указатели на структуры того же типа, называются самоссылочными структурами.

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

Общий вид объявления структур в С / С ++.

 

struct <Имя_составного_типа> {

<тип_1> <Имя_атрибута_1>;

<тип_2> <Имя_атрибута_2>;

* * * *

<тип_N> <Имя_атрибута_N>;

};

typedef struct <Имя_составного_типа> {

<тип_1> <Имя_атрибута_1>;

<тип_2> <Имя_атрибута_2>;

* * * *

<тип_N> <Имя_атрибута_N>;

 

} <Псевдоним_для_составного_типа>;

 

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

Объявление структуры для представления точек на плоскости в Декартовой системе координат.

 

struct TPoint2D { /* объявляется структурный тип TPoint2D, */

float x; /* содержащий два поля типа float   */

float y; 

};  /*объявление структуры заканчивается пустым оператором */

 

Объявление структуры, совмещенное с объявлением двух структурных переменных.

 

struct TPoint2D { /* объявляется структурный тип TPoint2D, */

float x; /* содержащий два поля типа float   */

float y; 

} A, B; // Идентификаторы создаваемых структурных переменных

 

Следует обратить внимание на тот факт, что при объявлении структурных переменных в языке С необходимо использовать ключевое слово struct, являющееся частью имени структурного типа, а в С ++ его можно опускать:

 

struct A { int val; }; /* Объявление структурного типа   */

struct A a1; /* Объявление переменной структурного типа

          по правилам ANSI С                   */

struct A a2 = {1}; /* Объявление стректурной переменной,

                  совмещенное с инициализацией */

 

Поэтому в ANSI C целесообразно использовать форму объявления структурного типа, совмещенную с определением псевдонима для типа (typedef).

 

typedef struct TA { int val; } A; /*Объявление псевдонима для пользовательского структурного типа*/

A a; /* Объявление переменной структурного типа */

 

В языке программирования С ++ такая конструкция является избыточной, так как компилятор ведет собственный «реестр» («реестр» - система учета, специальным образом организованная внутренняя БД) пользовательских типов данных, объявленных в проекте, и добавляет необходимую информацию в объявления переменных. Приведем вариант объявления типа А для языка С ++.

 

struct A { int val; }; // Объявление структурного типа*/

A a;              // Объявление переменной структурного типа

 

Для доступа к полям структур используются две операции: доступ по имени (.) и доступ через указатель (->). Рассмотрим следующий пример.

 

typedef struct Point2D { float x; float y;} TPoint2D;

TPoint2D A, B={0F, 0.5F};

TPoint2D* ptr=&A; /* объявление указателя на структуру     */

A.x=1.15F;   /* обращение к полю структуры по имени   */

ptr->y=2.34F; /* обращение к полю структуры через указатель */

 

Механизмы выделения памяти для экземпляров структур в куче такие же, как и для скалярных типов данных.

 

// ANSI C

typedef struct Point3D {float x; float y; float z;} TPoint3D;

TPoint3D* arrayPoint=(TPoint3D*)malloc(sizeof(TPoint3D)*10);

if(arrayPoin==NULL) {

/* обработка ошибок выделения памяти */

}

arrayPoint[0]->x=0F;

arrayPoint[0]->y=0F;

arrayPoint[0]->z=0F;

/*  Какой-то код...         */

free(arrayPoint); /* освобождение памяти в куче */

 

// С++

struct TPoint2D { // объявляется структурный тип TPoint2D,

float x; // содержащий два поля типа float       

float y; 

};  // объявление структуры заканчивается пустым оператором

Tpoint2D *Polygon = new Tpoint2D[20];

// Цикл инициализации элементов массива структур

// Обработка элементов массива структур.

show(Polygon);    // функция для отрисовки полигона на экране

delete[] Polygon; // Освобождение памяти

 

При определении полигона (множества точек) в программе можно использовать и механизм ангрегирования, когда одниструктурные переменные объявляются в качестве полей дгругих. Например:

 

struct TPolygon2D {

TPoint2D* arr; // указатель на массив точек

size_t numb; // количество точек в полигоне

};

 

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

 

: Студент
ID: Беззнаковое Длинное Целое Фамилия: Строка Имя: Строка Отчество: Строка Дата_рождения: Дата_Тип Институт: Строка Специальность: Строка Группа: Строка Дата_поступления: Дата_Тип Статус: Беззнаковое Байт Оценки: Беззнаковое Байт Таблица

 

Сообветсвующая предложенной схеме структура на языке С ++ может быть представлена следующим образом:

 

struct Student {

uint64_t id;

std::string surName;   // Фамилия

std::string firstName;   // Имя

std::string patronymic;   // Отчество

std::string institute;   // институт/факультет

std::string specialty;   // специальность

std::time_t birthday;   // Дата рождения

std::time_t enrollment;   // Дата зачисления

uint8_t status;      // Статус: академ.отпуск|отчислен и др.

uint8_t *academicPerformance; // указатель на массив оценок

};

 

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

 

struct TAcademicPperformance {

std::string article; // название учебного курса

unsigned char assessment; // полученная оценка

};

 

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

 

 

struct Student {

uint64_t id;

std::string surName;     // Фамилия

std::string firstName;     // Имя

std::string patronymic;     // Отчество

std::string institute;     // институт/факультет

std::string specialty;     // специальность

char birthday[3];      // Дата рождения в формате ГГ:ММ:ДД

char enrollment[3];    // Дата зачисления в формате ГГ:ММ:ДД

uint8_t status;        // Статус: академ.отпуск|отчислен и др.

TAcademicPerformance* perf; // указатель на массив оценок

};

 

Подобный подход к организации информации лишь на первый взгляд может показаться слишком сложным, на практике же такой подход применяется достаточно широко. В качестве примера рассмотрим стандатный тип, спользуемый для представления даты и времени – std::tm.

 

struct tm {

int tm_sec; // секунды после минут [0,59]

int tm_min; // минуты после часов [0,59]

int tm_hour; // часы после полуночи [0,23]

int tm_mday; // день месяца [1,31]

int tm_mon; // месяц года (январь = 0) [0,11]

int tm_year; // год (1900 год = 0)

int tm_wday; // день недели (вс = 0) [0,6]

int tm_yday; // день года (1 января = 0) [0,365]

int tm_isdst;  

};

 

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

Следующий пример демонтсирует базовый способ получения информации о величине системных даты и времени.

 

#include <iostream>

#include <iomanip>

#include <ctime>

int main() {

  std::time_t t = std::time(NULL);

  std::tm tm = *std::localtime(&t);

  std::cout << "Time right now is " << std::put_time(&tm, "%c %Z")

       << '\n';

return 0;

}

Как видите, структурный подход к программированию, явивишися предшественником объектно-ориентированного подхода, определяет следующую требования к разработке ПО:

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

2. поиск и разработка алгоритмов для работы с выбранными структурами;

3. разработка функций, реализующих выбранные методы и алгоритмы.

 

Изучение утилиты who

 

 

ЛАБОРАТОРНАЯ РАБОТА №2

Цель работы

1. Изучить правила организации пользовательских (агрегативных) типов данных.

2. Исследовать механизмы организации полей данных в структурах и способы обращения к ним.

3. Научится использовать структуры для разработки проблемно ориентированных типов данных (абстрактных типов данных, АТД).

4. Научиться разрабатывать и использовать хранилища данных, организованные по принципу электронных таблиц.

Задания к лабораторной работе

Согласно заданию составить алгоритм и написать программу на языке С++. Программа компилируется и запускается под управлением ОС Linux. Разработанная программа должна содержать встроенную справочную информации, описывающую правила использования, цель назначения и информацию о разработчике. Аргументы запуска программа должна обрабатывать согласно рекомендациям POSIX.

Разрабатываемая программа предназначена для хранения массива структур (записей), она должна поддерживать управление на уровне аргументов командной строки (аргументов запуска).

Поддерживаемые опции запуска:

-- help либо - h - запуск программы в режиме получения справки. После вывода справочной информации программа завершает работу.

[ N ] [ file _ name ] - запуск программы в режиме создания электронной таблицы записей, N – количество записей, file _ name – имя текстового файла, в котором будет сохранен массив (таблица) записей.

- r [ N ] [ file _ name ] - запуск программы в режиме чтения содержимого текстового файла file _ name, на экран должны быть выведены не более N записей. Следует учесть, что реальное количество записей в файле может не совпадать с заданным значением N. Если заданный файл окажется пуст, либо по какой-либо причине программа не сможет его открыть, должно быть выдано соответствующее сообщение.

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

 

Варианты заданий

Варианты заданий работы

1. Самолеты

Наименование типа Фамилия конструктора Год выпуска Количество кресел Грузоподъемность, т

2. Расчет движения

Наименование воздушной линии Тип самолета Количество рейсов Налет, тыс. км Пассажиро-оборот, человеко-км

3. Перевозки

Тип самолета Номер борта Количество рейсов Налет в часах Налет, тыс. км

4. Расписание

Номер рейса Наименование рейса Тип самолета Стоимость билета Протяженность линии, км

5. Аэропорт

Наименование Площадь здания Этажность здания Год сооружения Оценочная стоимость, млн.руб

6. Ремонт аэродромных сооружений

Наименование Шифр Вид ремонта Сметная стоимость ремонта Наименование подрядчика

7. Кассы авиабилетов

Номер кассы Ф.И.О. кассира Количество проданных билетов Суммарная выручка Дата продаж

8. Технические характеристики парка используемых ПК

Тип процессора Тактовая частота Емкость ОП, МБ Емкость ЖМН, ГБ Тип монитора

9. Города

Наименование Количество жителей Площадь, кв.км Год основания Количество школ

10. Московские мосты

Наименование Высота Ширина Количество опор Протяженность

11. Линии московского метро

Наименование Район линии Год пуска Протяженность, км Количество поездов на линии

12. Легковые автомобили

Марка Год выпуска Пробег Изготовитель Цена

13. Учет продажи программных продуктов

Наименование Фирма изготовитель Стоимость Вид лицензии Имеющееся количество экземпляров

14.Учет абонентов городской телефонной станции

Ф.И.О. абонента Номер телефона Год подключения Вид тарифа Плата за месяц

15. Детские сады

Наименование детского сада Номер сада Количество детей Район города Сумма платежа за месяц

16. Учет сотрудников (для отдела кадров)

Ф.И.О. Табельный номер Дата рождения Оклад, тыс.руб. Стаж работы

17. Ведомость зарплаты за текущий месяц

Ф.И.О. Номер отдела Табельный номер Количество рабочих дней Размер зарплаты

18. Музеи

Наименование Назначение Адрес Часы работы Стоимость билета

19. Экскурсии

Наименование Страна Стоимость Продолжительность Вид транспорта

20. Киноафиша



Поделиться:


Последнее изменение этой страницы: 2021-06-14; просмотров: 149; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.16.66.206 (0.305 с.)