Курсовая работа: Сжать массив а1, …, а10 путем выбрасывания повторяющихся элементов

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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. Брюс Эккель - Мышление на С++.

Источник: https://otherreferats.allbest.ru/download/1260441/