Сжать массив а1, …, а10 путем выбрасывания повторяющихся элементов
История языка программирования C++. Типы данных bool и char для хранения результатов логических выражений и представления символов. Использование целочисленных типов данных. Этапы компиляции. Сжатие массива путем выбрасывания повторяющихся элементов.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 08.02.2021 |
Размер файла | 682,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
МИНИСТЕРСТВО ПО РАЗВИТИЮ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ И КОММУНИКАЦИЙРЕСПУБЛИКИ УЗБЕКИСТАН
ФЕРГАНСКИЙ ФИЛИАЛ
ТАШКЕНТСКОГО УНИВЕРСИТЕТА ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ ИМЕНИ МУХАММАДА АЛЬ-ХОРЕЗМИ
ФИНАЛЬНЫЙ ПРОЕКТ
по дисциплине: “Программирование 1”
Тема: Сжать массив а1, …, а10 путем выбрасывания повторяющихся элементов.
Выполнил: студент гр. 654-20 Журахонов Юсуфхон
Фергана - 2020
Введение
Язык программирования является подмножеством естественного языка и предназначен для поддержки процесса общения человека с компьютером. В общем случае язык -- это множество предложений, которые можно записать на нем. Отличие языка программирования от естественного -- в его законченности или замкнутости. Под этим понимается, что теоретически можно перечислить все предложения, которые можно на нем составить. Для естественного языка это невозможно. Язык программирования определяет набор лексических, синтаксических и семантических правил, определяющих внешний вид программы и действия, которые выполнит исполнитель под её управлением. Язык программирования был создан для написания компьютерных программ, которые представляют собой набор правил, позволяющих компьютеру выполнить тот или иной вычислительный процесс, организовать управление различными объектами, и тому подобное.
Язык программирования отличается от естественных языков тем, что предназначен для управления Электронно-Вычислительными Машинами, в то время как естественные языки используются, прежде всего, для общения людей между собой. Большинство языков программирования использует специальные конструкции для определения и манипулирования структурами данных и управления процессом вычислений. Как правило, язык программирования определяется не только через спецификации стандарта языка, формально определяющие его синтаксис и семантику, но и через реализации стандарта -- программные средства, обеспечивающих трансляцию или интерпретацию программ на этом языке; такие программные средства различаются по производителю, марке и версии, времени выпуска, полноте воплощения стандарта, дополнительным возможностям; могут иметь определённые ошибки или особенности воплощения, влияющие на практику использования языка или даже на его стандарт.
1. Теоретическая часть
1.1 История языка программирования C++
C++ компилируемый язык программирования общего назначения, сочетает свойства как высокоуровневых, так и низкоуровневых языков программирования. В сравнении с его предшественником, языком программирования С (Си), наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования. Название «язык программирования C++» происходит от языка программирования C (Си), в котором унарный оператор ++ обозначает инкремент переменной.
Язык программирования C++ широко используется для разработки программного обеспечения. А именно, создание разнообразных прикладных программ, разработка операционных систем, драйверов устройств, а также видео игр и многое другое. Существует несколько реализаций языка программирования C++ -- как бесплатных, так и коммерческих. Их производят проекты: GNU, Microsoft и Embarcadero (Borland). Проект GNU -- проект разработки свободного программного обеспечения (СПО).
Язык программирования С++ был создан в начале 1980-х годов, его создатель сотрудник фирмы Bell Laboratories -- Бьёрн Страуструп. Он придумал ряд усовершенствований к языку программирования C, для собственных нужд. То есть изначально не планировалось создания языка программирования С++. Ранние версии языка С++, известные под именем «Cи с классами», начали появляться с 1980 года. Язык C (Си) , будучи базовым языком системы UNIX, на которой работали компьютеры фирмы Bell, является быстрым, многофункциональным и переносимым. Страуструп добавил к нему возможность работы с классами и объектами, тем самым зародил предпосылки нового, основанного на синтаксисе С (Си), языка программирования. Синтаксис C++ был основан на синтаксисе C (Си), так как Бьёрн Страуструп стремился сохранить совместимость с языком C (Си). В 1983 году произошло переименование языка из «Cи с классами» в «язык программирования C++». В него были добавлены новые возможности: виртуальные функции, перегрузка функций и операторов, ссылки, константы и многое другое. Его первый коммерческий выпуск состоялся в октябре 1985 года. Язык программирования C++ является свободным, то есть никто не обладает на него правами.
В C++ доступны следующие встроенные типы. Типы C++ практически полностью повторяют типы данных в C:
Символьные: char, wchar_t (char16_t и char32_t, в стандарте C++11).
Целочисленные знаковые: signed char, short int, int, long int (и long long, в стандарте C++11).
Целочисленные беззнаковые: unsigned char, unsigned short int, unsigned int, unsigned long int(и unsigned long long, в стандарте C++11).
С плавающей запятой: float, double, long double.
Логический: bool, имеющий значения true или false.
Операции сравнения возвращают тип bool. Выражения в скобках после if, while приводятся к типу bool.
Язык ввёл понятие ссылок, а начиная с одиннадцатой версии стандарта rvalue-ссылки и передаваемые ссылки.
C++ добавляет к C объектно-ориентированные возможности. Он вводит классы, которые обеспечивают три самых важных свойства ООП: инкапсуляцию, наследование и полиморфизм.
В стандарте C++ под классом (class) подразумевается пользовательский тип, объявленный с использованием одного из ключевых слов class, struct или union, под структурой (structure) подразумевается класс, определённый через ключевое слово struct, и под объединением (union) подразумевается класс, определённый через ключевое слово union.
В теле определения класса можно указать как объявления функций, так и их определение. В последнем случае функция является встраиваемой (inline). Нестатические функции-члены могут иметь квалификаторы const и volatile, а также ссылочный квалификатор (& или &&).
Стандартные C++ библиотеки представляют собой наборы функций, констант, классов, объектов и шаблонов, которые расширяют язык С++ предоставляя базовую функциональность для выполнения различных задач, таких как: классы для взаимодействия с операционной системой, контейнеры данных, манипуляторы для работы с этими данными и наиболее используемые алгоритмы.
Все элементы стандартных библиотек С++ распределены по различным заголовочным файлам, которые необходимо подключать к программе. Только так можно использовать элементы этих библиотек. Стандартные библиотеки языка программирования С++: cmath, ctime, cstring, cstdlib, ios0 fstream, iostream и другие.
Стандартные библиотеки С++: заголовочные файлы ввода/вывода
Рис. 1
В С++ программисту предоставляется возможность использовать абстракцию, которая называется потоки ввода/вывода. Данная абстракция специально разработана для выполнения операций ввода/вывода оперируя последовательностью символов, например: файлы или строки. Эта функциональность обеспечивается через несколько связанных классов, как показано на следующей схеме.
На схеме можно увидеть имена файлов, указанные сверху. Каждый класс имеет имя, стрелочками отображены отношения между классами. Черные прямоугольники -- это объекты классов: cout -- объект класса ostream, cin -- объект класса istream и так далее.
Ключевое слово -- это зарезервированные идентификаторы, которые имеют специальное значение для компилятора. Их использование в программе в качестве идентификаторов не допускается. Их можно использовать только в том смысле, в котором они определены.
Ключевые слова делятся на:
· спецификаторы типов: char, double, enum, float, int, long, short struct, signed, union, unsigned, void, typedef
· квалификаторы типов: const, volatile
· квалификаторы классов памяти: auto, extern, register, static
· операторы языка и идентификаторы специального назначения: break, continue, do, for, goto, if, return, switch, while; default, cas else, sizeof
· модификаторы и псевдопеременные: конкретный набор зависит от компилятора
· C++ имеет зарезервированный набор из 84 слов (включая С++14) для собственного использования.
· Эти cлова называются ключевыми словами (keywords), каждое из них имеет свое особое значение.
1.2 Тип данных bool
Первый в таблице -- это тип данных bool -- целочисленный тип данных, так как диапазон допустимых значений -- целые числа от 0 до 255. Но как Вы уже заметили, в круглых скобочках написано -- логический тип данных, и это тоже верно. Так как bool используется исключительно для хранения результатов логических выражений. У логического выражения может быть один из двух результатов true или false. true -- если логическое выражение истинно, false -- если логическое выражение ложно.
Но так как диапазон допустимых значений типа данных bool от 0 до 255, то необходимо было как-то сопоставить данный диапазон с определёнными в языке программирования логическими константами true и false. Таким образом, константе true эквивалентны все числа от 1 до 255 включительно, тогда как константе false эквивалентно только одно целое число -- 0.
1.3 Тип данных char
Тип данных char -- это целочисленный тип данных, который используется для представления символов. То есть, каждому символу соответствует определённое число из диапазона [0;255]. Тип данных char также ещё называют символьным типом данных, так как графическое представление символов в С++ возможно благодаря char. Для представления символов в C++ типу данных char отводится один байт, в одном байте -- 8 бит, тогда возведем двойку в степень 8 и получим значение 256 -- количество символов, которое можно закодировать. Таким образом, используя тип данных char можно отобразить любой из 256 символов. Все закодированные символы представлены в таблице ASCII.
1.4 Целочисленные типы данных
Целочисленные типы данных используются для представления чисел. В таблице 1 их аж шесть штук: short int, unsigned short int, int, unsigned int, long int, unsigned long int. Все они имеют свой собственный размер занимаемой памяти и диапазоном принимаемых значений. В зависимости от компилятора, размер занимаемой памяти и диапазон принимаемых значений могут изменяться. В таблице 1 все диапазоны принимаемых значений и размеры занимаемой памяти взяты для компилятора MVS2010. Причём все типы данных в таблице 1 расположены в порядке возрастания размера занимаемой памяти и диапазона принимаемых значений. Диапазон принимаемых значений, так или иначе, зависит от размера занимаемой памяти. Соответственно, чем больше размер занимаемой памяти, тем больше диапазон принимаемых значений. Также диапазон принимаемых значений меняется в случае, если тип данных объявляется с приставкой unsigned -- без знака. Приставка unsigned говорит о том, что тип данных не может хранить знаковые значения, тогда и диапазон положительных значений увеличивается в два раза, например, типы данных short int и unsigned short int.
Приставки целочисленных типов данных:
short -- приставка укорачивает тип данных, к которому применяется, путём уменьшения размера занимаемой памяти;
long -- приставка удлиняет тип данных, к которому применяется, путём увеличения размера занимаемой памяти;
unsigned (без знака) -- приставка увеличивает диапазон положительных значений в два раза, при этом диапазон отрицательных значений в таком типе данных храниться не может.
Так, что, по сути, мы имеем один целочисленный тип для представления целых чисел -- это тип данных int. Благодаря приставкам short, long, unsigned появляется некоторое разнообразие типов данных int, различающихся размером занимаемой памяти и (или) диапазоном принимаемых значений.
1.5 Типы данных с плавающей точкой
В С++ существуют два типа данных с плавающей точкой: float и double. Типы данных с плавающей точкой предназначены для хранения чисел с плавающей точкой. Типы данных float и double могут хранить как положительные, так и отрицательные числа с плавающей точкой. У типа данных float размер занимаемой памяти в два раза меньше, чем у типа данных double, а значит и диапазон принимаемых значений тоже меньше. Если тип данных float объявить с приставкой long, то диапазон принимаемых значений станет равен диапазону принимаемых значений типа данных double. В основном, типы данных с плавающей точкой нужны для решения задач с высокой точностью вычислений, например, операции с деньгами.
Язык C++ включает в себя те же библиотеки, что и Си, организованы они также, со следующими отличиями: Каждый заголовок файла имеет то же имя, что и версия языка Си, но с префиксом «c» и без расширения. Например, в C++ эквивалент заголовочного файла -- это. Каждый элемент библиотек определён в стандартном пространстве имен. Тем не менее, для совместимости с языком Cи, традиционный формат записи имен заголовочных файлов -- «имя файла.h» (например, stdlib.h) также предоставляется с теми же определениями в рамках глобального пространства имен. В приведенных примерах в этом справочнике, присутствуют примеры полностью совместимы с языком программирования Си, хотя его применение не рекомендуется использовать в C++.
wchar_t является одним из основных типов в C + + и поэтому он не определён в соответствующем заголовочном файле, как это было сделано в Си. Это же относится к некоторым макросам, которые теперь являются зарезервированными ключевыми словами в C++. Следующие функции претерпели некоторые изменения в своих определениях, связанных с параметрами: strchr, strpbrk, strrchr, strstr, memchr. Функции atexit, exit и abort, определенные в также претерпели изменений, коснувшихся их поведения. Перегружены версии некоторых функций, с дополнительными типами данных, параметры и семантика осталась без изменений. Например, появились типы данных float и long double в прототипах функций заголовочного файла cmath.
cassert
Заголовочный файл, содержащий макросы, используемые для диагностики, помогающей при отладке программы.
cctype
Заголовочный файл содержит прототипы функций для обработки символов.
cerrno
Заголовочный файл, в котором объявлены макросы, для идентификации ошибок по их коду.
cfloat
Заголовочный файл, описывающий различные характеристики типов с плавающей точкой.
ciso646
Заголовочный файл, содержащий альтернативные написания некоторых макро-констант (их 12).
climits
Заголовочный файл, содержащий предельные величины для целых чисел для данной системы.
clocale
Заголовочный файл локализации, содержит функции и классы для потоковой обработки данных в форме естественной для разных языков (денежный формат, представление символов, сортировка строк).
cmath
Заголовочный файл, содержащий прототипы математических функций (sin, cos, tg, pow, sqrt и т. д.)
csetjmp
Заголовочный файл, объявляющий макросы для нелокальных переходов.
csignal
Заголовочный файл, выполняющий обработку сигналов.
cstdint
Описывает целочисленные типы данных с установленными диапазонами представления чисел.
cstdio
Заголовочный файл для выполнения операций ввода/вывода.
cstdlib
Стандартный заголовочный файл, содержит функции для преобразования чисел в текст, выделения памяти, генерации случайных чисел и др. функций-утилит
cstring
Заголовочный файл для работы с Си-строками(нуль-терминированными)
ctime
Заголовочный файл для работы с датой и временем
Алгоритм программы находятся в главной функции, причём других функций в программе нет. Для маленьких программ, нет потребности в объявлении своих функций. Для написания больших программ, опыт показывает, что лучше пользоваться функциями.
Программа будет состоять из отдельных фрагментов кода, под отдельным фрагментом кода понимается функция. Отдельным, потому что работа отдельной функции не зависит от работы какой-нибудь другой. То есть алгоритм в каждой функции функционально достаточен и не зависим от других алгоритмов программы.
Однажды написав функцию, её можно будет с лёгкостью переносить в другие программы. Функция (в программировании) -- это фрагмент кода или алгоритм, реализованный на каком-то языке программирования, с целью выполнения определённой последовательности операций.
Итак, функции позволяют сделать программу модульной, то есть разделить программу на несколько маленьких подпрограмм (функций), которые в совокупности выполняют поставленную задачу. Еще один огромнейший плюс функций в том, что их можно многократно использовать. Данная возможность позволяет многократно использовать один раз написанный код, что в свою очередь, намного сокращает объем кода программы!
Кроме того, что в С++ предусмотрено объявление своих функций, также можно воспользоваться функциями, определёнными в стандартных заголовочных файлах языка программирования С++. Чтобы воспользоваться функцией, определённой в заголовочном файле, нужно его подключить. Например, чтобы воспользоваться функцией, которая возводит некоторое число в степень, нужно подключить заголовочный файл <cmath> и в запустить функцию pow() в теле программы.
Массив -- это структура данных, представленная в виде группы ячеек одного типа, объединенных под одним единым именем. Массивы используются для обработки большого количества однотипных данных. Имя массива является указателем. Отдельная ячейка данных массива называется элементом массива. Элементами массива могут быть данные любого типа. Массивы могут иметь как одно, так и более одного измерений. В зависимости от количества измерений массивы делятся на одномерные массивы, двумерные массивы, трёхмерные массивы и так далее до n-мерного массива. Чаще всего в программировании используются одномерные и двумерные массивы.
Одномерный массив -- массив, с одним параметром, характеризующим количество элементов одномерного массива. Фактически одномерный массив -- это массив, у которого может быть только одна строка, и n-е количество столбцов. Столбцы в одномерном массиве -- это элементы массива.
До этого момента мы рассматривали одномерные массивы, которыми не всегда можно ограничиться. Допустим, необходимо обработать некоторые данные из таблицы. В таблице есть две характеристики: количество строк и количество столбцов. Также и в двумерном массиве, кроме количества элементов массива, есть такие характеристики как, количество строк и количество столбцов двумерного массива. То есть, визуально, двумерный массив -- это обычная таблица, со строками и столбцами. Фактически двумерный массив -- это одномерный массив одномерных массивов.
Структура -- это, некое объединение различных переменных (даже с разными типами данных), которому можно присвоить имя. Например, можно объединить данные об объекте Дом: город (в котором дом находится), улица, количество квартир, интернет (проведен или нет) и т.д. в одной структуре. В общем, можно собрать в одну совокупность данные обо всем, что угодно, точнее обо всем, что необходимо конкретному программисту.
Под перегрузкой функции понимается, определение нескольких функций (две или больше) с одинаковым именем, но различными параметрами. Наборы параметров перегруженных функций могут отличаться порядком следования, количеством, типом. Таким образом перегрузка функций нужна для того, чтобы избежать дублирования имён функций, выполняющих сходные действия, но с различной программной логикой.
Инкремент ++ - это увеличение на единицу. Декремент -- - это уменьшение на единицу. Операции декремента и инкремента с лёгкостью заменяются арифметическими операциями или операциями присваивания. Но использовать операции инкремента и декремента намного удобнее.
Синтаксис использования операций инкремента и декремента таков, что перед или после имени переменной ставится операция инкремента или декремента. Когда операция инкремента или декремента ставится перед именем переменной, то такая операция называется префиксным инкрементом (сокращённо -- преинкрементом) или префиксным декрементом (сокращённо -- предекрементом). А если операция инкремента или декремента ставится после имени переменной, то такая операция называется операцией постфиксного инкремента (сокращённо -- постинкремент) или постфиксного декремента (сокращённо -- постдекремент). При использовании операции преинкремента значение переменной, сначала, увеличивается на 1, а затем используется в выражении. При использовании операции постинкремента значение переменной сначала используется в выражении, а потом увеличивается на 1. При использовании операции предекремента, значение переменной, сначала, уменьшается на 1, а затем используется в выражении. При использовании операции постдекремента, значение переменной, сначала, используется в выражении, а потом уменьшается на 1. В таблице 1 показаны примеры выражений с использованием операций инкремента и декремента, а также приведена их краткая характеристика.
Таблица 1
Операция |
Обозначение |
Пример |
Пояснение |
|
Преинкремент |
++C |
cout<<++c; |
Значение в переменной value увеличивается, после чего оператор cout печатает это значение |
|
Предекремент |
--C |
cout<c; |
Значение в переменной value уменьшается, после чего оператор cout печатает это значение |
|
Постинкремент |
C++ |
cout<<c++; |
Оператор cout печатает значение переменной value, затем увеличивает это значение на 1 |
|
Постдекремент |
C-- |
cout<<c--; |
Оператор cout печатает значение переменной value, затем уменьшает это значение на 1 |
Циклы используются для многократного повторения кусков кода. Возможность повторения определенных фрагментов кода -- это одна из основных и в тоже время важных задач, которые приходится решать программисту. Большинство программ или сайтов используют циклы, например -- для вывода новостной информации или объявлений. То есть в таких задачах необходимо выполнять постоянно операции чтения и записи, и для того, чтобы не дублировать один и тот же код на помощь приходят циклы. Циклы достаточно просто объявляются в коде, однако они выполняют сложные задачи, всего лишь простым повторением.
В циклах также, как и в операторах выбора присутствуют условные выражения. В языке Си существует три типа циклов: for, while, do while. Каждый из них имеет свои конкретные применения. Все они описаны ниже.
Самый часто используемый цикл -- это цикл for, его структура показана ниже:
for ( /*инициализация переменной; условие; изменение значения переменной*/ ) { // тело цикла (тут находится код который будет повторяться) }
Цикл while -- очень простой цикл, вот его структура:
while ( /*условие*/ )
{
// тело цикл - тут находится код, который необходимо повторять
}
Есть еще один тип циклов -- do while. Этот цикл полезен, когда необходимо выполнить код по крайней мере -- 1 раз. Рассмотрим его структуру:
do {
// тело цикла
} while ( /*условие*/ );
Операторы break и continue
Эти два ключевых слова очень важны для циклов, они могут управлять повторениями в цикле. Оператор break делает принудительный выход из цикла, даже когда условие цикла -- истинно. Оператор break удобно использовать, когда необходимо выйти из цикла при особых обстоятельствах. Оператор continue нужен если необходимо пропустить какой-то блок кода, но при этом не прекращать работу цикла.
Сортировка пузырьком - простейший алгоритм сортировки, применяемый чисто для учебных целей. Практического применения этому алгоритму нет, так как он не эффективен, особенно если необходимо отсортировать массив большого размера. К плюсам сортировки пузырьком относится простота реализации алгоритма.
Алгоритм сортировки пузырьком сводится к повторению проходов по элементам сортируемого массива. Проход по элементам массива выполняет внутренний цикл. За каждый проход сравниваются два соседних элемента, и, если порядок неверный элементы меняются местами. Внешний цикл будет работать до тех пор, пока массив не будет отсортирован. Таким образом внешний цикл контролирует количество срабатываний внутреннего цикла. Когда при очередном проходе по элементам массива не будет совершено ни одной перестановки, то массив будет считаться отсортированным. Чтобы хорошо понять алгоритм, отсортируем методом пузырька массив, к примеру, из 7 чисел, исходный массив: 3 3 7 1 2 5 0
1.6 Классы в С++
Классы и объекты в С++ являются основными концепциями объектно-ориентированного программирования -- ООП. Объектно-ориентированное программирование -- расширение структурного программирования, в котором основными концепциями являются понятия классов и объектов. Основное отличие языка программирования С++ от С состоит в том, что в С нет классов, а следовательно язык С не поддерживает ООП, в отличие от С++.
Чтобы понять, для чего же в действительности нужны классы, проведём аналогию с каким-нибудь объектом из повседневной жизни, например, с велосипедом. Велосипед -- это объект, который был построен согласно чертежам. Так вот, эти самые чертежи играют роль классов в ООП. Таким образом классы -- это некоторые описания, схемы, чертежи по которым создаются объекты. Теперь ясно, что для создания объекта в ООП необходимо сначала составить чертежи, то есть классы. Классы имеют свои функции, которые называются методами класса. Передвижение велосипеда осуществляется за счёт вращения педалей, если рассматривать велосипед с точки зрения ООП, то механизм вращения педалей -- это метод класса. Каждый велосипед имеет свой цвет, вес, различные составляющие -- всё это свойства. Причём у каждого созданного объекта свойства могут различаться. Имея один класс, можно создать неограниченно количество объектов (велосипедов), каждый из которых будет обладать одинаковым набором методов, при этом можно не задумываться о внутренней реализации механизма вращения педалей, колёс, срабатывания системы торможения, так как всё это уже будет определено в классе. Разобравшись с назначением класса, дадим ему грамотное определение.
Классы в С++ -- это абстракция, описывающая методы, свойства, ещё не существующих объектов. Объекты -- конкретное представление абстракции, имеющее свои свойства и методы. Созданные объекты на основе одного класса называются экземплярами этого класса. Эти объекты могут иметь различное поведение, свойства, но все равно будут являться объектами одного класса. В ООП существует три основных принципа построения классов:
Инкапсуляция -- это свойство, позволяющее объединить в классе и данные, и методы, работающие с ними и скрыть детали реализации от пользователя.
Наследование -- это свойство, позволяющее создать новый класс-потомок на основе уже существующего, при этом все характеристики класса родителя присваиваются классу-потомку.
Полиморфизм -- свойство классов, позволяющее использовать объекты классов с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Каждое свойство построения классов мы рассмотрим подробно по мере необходимости, а пока просто запомните эти три. А теперь вернёмся к классам, для начала рассмотрим структуру объявления классов.
// объявление классов в С++
class /*имя класса*/
{
private:
/* список свойств и методов для использования внутри класса */
public:
/* список методов доступных другим функциям и объектам программы */
protected:
/*список средств, доступных при наследовании*/
};
Объявление класса начинается с зарезервированного ключевого слова class, после которого пишется имя класса. В фигурных скобочках, строки 3 -- 10 объявляется тело класса, причём после закрывающейся скобочки обязательно нужно ставить точку с запятой, строка 10. В теле класса объявляются три метки спецификации доступа, строки 4, 6, 8, после каждой метки нужно обязательно ставить двоеточие. В строке 4 объявлена метка спецификатора доступа private. Все методы и свойства класса, объявленные после, спецификатор доступа private будут доступны только внутри класса. В строке 6 объявлен спецификатор доступа public, все методы и свойства класса, объявленные после спецификатора доступа public будут доступны другим функциям и объектам в программе. Пока на этом остановимся, спецификатор доступа protected разбирать сейчас не будем, просто запомните, что он есть. При объявлении класса, не обязательно объявлять три спецификатора доступа, и не обязательно их объявлять в таком порядке. Но лучше сразу определиться с порядком объявления спецификаторов доступа, и стараться его придерживаться. Разработаем программу, в которой объявим простейший класс, в котором будет объявлена одна функция, печатающая сообщение.
// classes.cpp: определяет точку входа для консольного приложения.
#include "stdafx.h"
#include <iostream>
using namespace std;
// начало объявления класса
class CppStudio // имя класса
{
public: // спецификатор доступа
void message() // функция (метод класса) выводящая сообщение на экран
{
cout << "website: cppstudio.com\ntheme: Classes and Objects in C + +\n";
}
}; // конец объявления класса CppStudio
int main(int argc, char* argv[])
{
CppStudio objMessage; // объявление объекта
objMessage.message(); // вызов функции класса message
system("pause");
return 0;
}
В строках 7 -- 14 мы определили класс с именем CppStudio. Имя класса принято начинать с большой буквы, последующие слова в имени также должны начинаться с большой буквы. Такое сочетание букв называют верблюжьим регистром, так как чередование больших и маленьких букв напоминает силуэт верблюда. В теле класса объявлен спецификатор доступа public, который позволяет вызывать другим функциям методы класса, объявленные после public. Вот именно поэтому в главной функции, в строке 19 мы смогли вызвать функцию message(). В классе CppStudio объявлена всего одна функция, которая не имеет параметров и выводит сообщение на экран, строка 12. Методы класса -- это те же функции, только объявлены они внутри класса, поэтому всё что относится к функциям актуально и для методов классов. Объявление классов выполняется аналогично объявлению функций, то есть класс можно объявлять в отдельном файле или в главном файле, позже посмотрим как это делается. В строке 18 объявлена переменная objMessage типа CppStudio, так вот, переменная objMessage -- это объект класса CppStudio. Таким образом, класс является сложным типом данных. После того как объект класса объявлен, можно воспользоваться его методами. Метод всего один -- функция message(). Для этого обращаемся к методу объекта objMessage через точку, как показано в строке 19, в результате программа выдаст текстовое сообщение
1.7 Этапы компиляции
1) Препроцессинг
Самая первая стадия компиляции программы.
Препроцессор -- это макропроцессор, который преобразовывает вашу программу для дальнейшего компилирования. На данной стадии происходит работа с препроцессорными директивами. Например, препроцессор добавляет хэдеры в код (#include), убирает комментирования, заменяет макросы (#define) их значениями, выбирает нужные куски кода в соответствии с условиями #if, #ifdef и #ifndef.
Хэдеры, включенные в программу с помощью директивы #include, рекурсивно проходят стадию препроцессинга и включаются в выпускаемый файл. Однако, каждый хэдер может быть открыт вовремя препроцессинга несколько раз, поэтому, обычно, используются специальные препроцессорные директивы, предохраняющие от циклической зависимости.
Получим препроцессированный код в выходной файл driver.ii (прошедшие через стадию препроцессинга C++ файлы имеют расширение .ii), используя флаг -E, который сообщает компилятору, что компилировать (об этом далее) файл не нужно, а только провести его препроцессинг: g++ -E driver.cpp -o driver.ii
Взглянув на тело функции main в новом сгенерированном файле, можно заметить, что макрос RETURN был заменен:
int main() {
cout << "Hello, world!" << endl;
return 0;
}
В новом сгенерированном файле также можно увидеть огромное количество новых строк, это различные библиотеки и хэдер iostream.
2) Компиляция
На данном шаге g++ выполняет свою главную задачу -- компилирует, то есть преобразует полученный на прошлом шаге код без директив в ассемблерный код. Это промежуточный шаг между высокоуровневым языком и машинным (бинарным) кодом.
Ассемблерный код -- это доступное для понимания человеком представление машинного кода.
Используя флаг -S, который сообщает компилятору остановиться после стадии компиляции, получим ассемблерный код в выходном файле driver.s: $ g++ -S driver.ii -o driver.s
Мы можем все также посмотреть и прочесть полученный результат. Но для того, чтобы машина поняла наш код, требуется преобразовать его в машинный код, который мы и получим на следующем шаге.
3) Ассемблирование
Так как x86 процессоры исполняют команды на бинарном коде, необходимо перевести ассемблерный код в машинный с помощью ассемблера.
Ассемблер преобразовывает ассемблерный код в машинный код, сохраняя его в объектном файле. Объектный файл -- это созданный ассемблером промежуточный файл, хранящий кусок машинного кода. Этот кусок машинного кода, который еще не был связан вместе с другими кусками машинного кода в конечную выполняемую программу, называется объектным кодом. Далее возможно сохранение данного объектного кода в статические библиотеки для того, чтобы не компилировать данный код снова.
Получим машинный код с помощью ассемблера (as) в выходной объектный файл driver.o: $ as driver.s -o driver.o
Но на данном шаге еще ничего не закончено, ведь объектных файлов может быть много и нужно их всех соединить в единый исполняемый файл с помощью компоновщика (линкера). Поэтому мы переходим к следующей стадии.
4) Компоновка
Компоновщик (линкер) связывает все объектные файлы и статические библиотеки в единый исполняемый файл, который мы и сможем запустить в дальнейшем. Для того, чтобы понять, как происходит связка, следует рассказать о таблице символов. Таблица символов -- это структура данных, создаваемая самим компилятором и хранящаяся в самих объектных файлах. Таблица символов хранит имена переменных, функций, классов, объектов и т.д., где каждому идентификатору (символу) соотносится его тип, область видимости. Также таблица символов хранит адреса ссылок на данные и процедуры в других объектных файлах. Именно с помощью таблицы символов и хранящихся в них ссылок линкер будет способен в дальнейшем построить связи между данными среди множества других объектных файлов и создать единый исполняемый файл из них.
Получим исполняемый файл driver: $ g++ driver.o -o driver // также тут можно добавить и другие объектные файлы и библиотеки
5) Загрузка
Последний этап, который предстоит пройти нашей программе -- вызвать загрузчик для загрузки нашей программы в память. На данной стадии также возможна подгрузка динамических библиотек.
Запустим нашу программу: $ ./driver // Hello, world!
bool char символ компиляция
2. Практическая часть
Задание:
Сжать массив а1, …, а10 путем выбрасывания повторяющихся элементов.
Код программы
#include <iostream>
using namespace std;
bool in_array(int element,int array_[],int array_size);
int main()
{
setlocale(LC_ALL,"Russian");
int arr[100],x,i;
cout<<"Введите количество элементов массива (max 100): ";
cin>>x;
for(i=0; i<x; i++)
{
cout<<"Введите "<<i+1<<" : ";
cin>>arr[i];
cout<<endl;
}
cout<<"Ваш массив: "<<endl;
cout<<'[';
int size=0;
for(i=0; i<x; i++)
{
size++;
cout<<arr[i]<<" ";
}
cout<<']'<<endl;
int array_reduced[size];
int counter = 0;
for(int i=0; i<size; i++)
{
if(!in_array(arr[i],array_reduced,size)) {
array_reduced[counter] = arr[i];
counter++;
}
}
cout<<"Сжатый массив: "<<endl;
cout<<'[';
for(i=0; i<counter;i++)
{
cout<<array_reduced[i]<<" ";
}
cout<<']';
return 0;
}
bool in_array(int element,int array_[],int array_size)
{
for(int i=0; i<array_size; i++)
{
if(element == array_[i]) return true;
}
return false;
}
Рис. 1 Скриншоты программы
Заключение
В течении первого семестра мы познакомились с объектно-ориентированным языком программирования C++ созданный на основе языка C (Си) Бьёрном Страуструпом. Соответственно выучили алфавит языка C++, научились использовать операторы ввода\вывода, оператора выбора варианта, функции, циклы, массивы, инкременты, декременты, классы, структуры, рекурсии, объединения, перегрузку операторов и многое другое. Узнали за что отвечают заголовочные операторы. Узнали, как работает компилятор g++. Познакомились с редакторами кода такие как Code::Blocks, Dev C++, Visual Studio, CLion, и веб редактор
Список использованной литературы
1. Учебник для начинающих, задача которого -- объяснить новичку язык программирования С++.
2. Свободная энциклопедия.
3. Стивен Прата - Язык программирования C++: Лекции и упражнения.
4. Бьёрн Страуструп - Язык программирования C++.
5. Стэнли Липпман, Жозе Лажуа и Барбара Э. - C++ Primer.
6. Брюс Эккель - Мышление на С++.
Размещено на Allbest.ru
...Подобные документы
Иерархия типов данных. Определение понятий "указатель", "массив". Получение количества машинных слов, отведенных под каждый тип данных. Проверка программы на переполнение типа int. Анализ заданных выражений на предмет из синтаксической корректности.
лабораторная работа [176,6 K], добавлен 07.06.2014Названия целых типов, длина их внутреннего представления в байтах и диапазон возможных значений. Кодировка символов в соответствии со стандартом ANSI. Описание типа массива в Object Pascal. Выделение и освобождение динамической памяти, псевдонимы типов.
курсовая работа [184,5 K], добавлен 10.02.2016Сравнение скорости выполнения запросов, построенных на таблицах с использованием типов char и varchar. Настройка окружения, создание баз данных, разработка приложения. Проведение экспериментов по видам запросов: на вставку данных, их обновление и выборку.
курсовая работа [666,8 K], добавлен 12.08.2011Виды информационно-вычислительных сетей: локальные, городские, глобальные; их классификация. Разработка программы на языке программирования С: формирование одномерного массива путем замены нулевых элементов на среднеарифметическое, а пробелов - на слова.
практическая работа [37,5 K], добавлен 20.05.2012Исследование основных отличий ассоциативных массивов от массивов скаляров. Разработка библиотеки классов. Выбор языка программирования. Сравнение языка C++ с Delphi, Java и JavaScript. Изучение методики тестирования и структуры тестового приложения.
практическая работа [390,2 K], добавлен 06.01.2013Особенности создания массивов в AutoCAD 2012, основные команды. Создание прямоугольного массива путем размножения выбранных элементов с заданным количеством рядов и столбцов, образующих прямоугольную матрицу. Этапы проектирования кругового массива.
курсовая работа [1,1 M], добавлен 20.05.2014Структура программного комплекса. Ввод информации из заданного файла. Создание набора данных. Добавление элементов в конец набора данных. Просмотр всех элементов набора данных. Копирование информации из НД в заданный файл. Сортировка массива по номерам.
курсовая работа [630,5 K], добавлен 01.06.2014Изучение элементов языка С++, программирование разветвлений и циклов с использованием операторов условного и перехода. Обработка одномерных массивов. Поиск максимального элемента массива с заданной размерностью. Листинги программы и результатов.
курсовая работа [647,7 K], добавлен 05.02.2013Построение компилятора с языка высокого уровня как одного из элементов системы программирования. Разработка компилятора ассемблера, модификация базы данных исходного макета. Загрузчик, эмулятор, отладчик. Использование Flex и Bison для программирования.
курсовая работа [599,0 K], добавлен 04.11.2014Алгоритмы и алфавит языка Турбо Паскаль. Основные типы данных. Операторы присваивания, перехода и выбора. Понятие массива в Паскале. Особенности работы со строками в программе. Использование линейного поиска и поиска с барьером. Основные виды сортировок.
учебное пособие [53,2 K], добавлен 09.11.2009Понятие двумерного массива целых чисел. Создание динамического массива из элементов, расположенных в четырех столбах данного массива и имеющих нечетное значение. Сохранение результатов в файл и выведение их на экран. Использование ввода с файла.
курсовая работа [44,0 K], добавлен 09.11.2014Разработка приложения для работы с базой данных с использованием объектно-ориентированного и визуального программирования. Обзор языка элементов языка программирования Delphi. Проектирование базы данных автозаправки. Клиентская система приложения.
курсовая работа [2,3 M], добавлен 31.01.2016Понятие и критерии классификации баз данных. Характеристика совокупностей элементов данных: массив, дерево, запись. Компоненты любой модели данных. Способы размещения значений элементов в физической записи. Методы доступа к данным: дерево, хеширование.
реферат [84,7 K], добавлен 22.11.2010Подсчет количества отрицательных элементов массива. Изменение исходного массива перемещением всех его положительных элементов в начало с исходным порядком их следования. Вывод на дисплей количества перемещенных элементов. Алгоритм и код программы.
лабораторная работа [946,5 K], добавлен 23.11.2014Разработка и реализация типовых алгоритмов обработки одномерных массивов на языке Delphi. Максимальный и минимальный элемент массива. Значение и расположение элементов массива. Элементы массива, находящиеся перед максимальным или минимальным элементом.
лабораторная работа [12,8 K], добавлен 02.12.2014Выведение значения элементов массива, которые удовлетворяют неравенству. Подсчет количества отрицательных элементов массива. Изменение исходного массива. Тестирование программы. Проверка её работоспособности. Реакция программы на сообщение об ошибке.
лабораторная работа [1,3 M], добавлен 23.11.2014Разработка простейших линейных алгоритмов (составление логических выражений), программ с ветвлениями, циклических программ и составление их блок-схем. Практическое выполнение обработки массивов на примере вычисления элементов квадратной матрицы.
контрольная работа [173,3 K], добавлен 01.03.2010Сущность и основные свойства алгоритмов, принципы их составления. Скалярные типы данных в языке Pascal. Тождественность и совместимость типов данных. Понятие и основные этапы развития, а также движущие силы эволюции языков программирования, типы.
презентация [85,8 K], добавлен 18.05.2014Характеристика и основные особенности языка Pascal. Создание числового массива с использованием встроенной функции. Использование записей, массивов и файлов. Обработка и графическая визуализация данных средствами табличного процессора и пакета MathCAD.
курсовая работа [1,0 M], добавлен 22.08.2012Ознакомление со структурой, комментариями, переменными и типами данных, константами, перечислениями, преобразованием типов языка программирования высокого уровня С++. Ключевые понятия языка, идентификаторы, ключевые слова, функции, операторы, выражения.
контрольная работа [31,2 K], добавлен 12.12.2009