Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТ...docx
Скачиваний:
12
Добавлен:
21.09.2019
Размер:
695.51 Кб
Скачать

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ "КОВРОВСКАЯ ГОСУДАРСТВЕННАЯ ТЕХНОЛОГИЧЕСКАЯ АКАДЕМИЯ им. В. А. Дегтярева"

Кафедра приборостроения

Отчет по лабораторному практикуму

По дисциплине: «Технология программирования»

Руководитель: Багаев Д.В.

Исполнитель: ст.гр. П-111 Коноплев И.А

Ковров 2012

Содержание отчета

Лабораторная работа №2……………………………………………………………………….3

Лабораторная работа №3……………………………………………………………………...10

Лабораторная работа №4…………..………………………………………………………….21

Лабораторная работа №5……………………………………………………………………...37

Лабораторная работа №6……………………………………………………………………...52

Лабораторная работа №7……………………………………………………………………...62

Лабораторная работа №8……………………………………………………………………...75

Лабораторная работа 2

Ввод/вывод данных

Цель работы: Изучение структуры исполняемого файла, типов данных и

операторов ввода-вывода системы.

Основные теоретические сведения

Важной вехой в развитии программирования явилось создание и широкое

распространение языка Си. Этот язык, сохранив средства ставшего

общепризнанным стандартом для написания системных и прикладных программ

языка С (процедурно-ориентированный язык), ввел в практику программирования

возможности нового технологического подхода к разработке программного

обеспечения, получившего название “объектно-ориентированное

программирование”. Внедрение в практику программирования объектно-

ориентированной парадигмы дает развитие новых областей информатики,

значительное повышение уровня технологичности создаваемых программных

средств, сокращение затрат на разработку и сопровождение программ, их

повторное использование, вовлечение в процесс расширения интеллектуальных

возможностей ЭВМ. Объектный подход информационного моделирования

предметных областей все более успешно применяется в качестве основы для

структуризации их информационных отражений и, в частности, баз знаний.

Си - это язык программирования общего назначения, хорошо известный

своей эффективностью, экономичностью, и переносимостью. Указанные

преимущества Си обеспечивают хорошее качество разработки почти любого вида

программного продукта. Использование Си в качестве инструментального языка

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

программы, написанные на Си, сравнимы по скорости с программами,

написанными на языке ассемблера.

Перечислим некоторые существенные особенности языка Си:

1) Си обеспечивает полный набор операторов структурного

программирования;

2) Си предлагает необычно большой набор операций. Многие операции Си

соответствуют машинным командам и поэтому допускают прямую

трансляцию в машинный код. Разнообразие операций позволяет выбирать

их различные наборы для минимизации результирующего кода;

3)Си поддерживает указатели на переменные и функции. Указатель на

объект программы соответствует машинному адресу этого объекта.

Посредством разумного использования указателей можно создавать

эффективно выполняемые программы, т.к. указатели позволяют ссылаться

на объекты тем же самым путем, как это делает ЭВМ;

4) Си поддерживает арифметику указателей, и тем самым позволяет

осуществлять непосредственный доступ и манипуляции с адресами памяти.

Однако, следует отметить, что преимущества языка Си становятся

очевидными при реализации больших программных проектов. Первые же шаги

при программировании на Си требуют тщательного проектирования программы, а

также определенной дисциплины при программировании.

Основные концепции языка Си:

1)Оператор #include обеспечивает преимущества использования

заголовочных файлов, которые содержат операторы Cи или

программные определения.

2) Основная часть программы на Cи начинается с оператора void

main(void).

3)Программы состоят из одной или нескольких функций, которые, в

свою очередь, состоят из операторов, предназначенных для решения

определенной задачи.

4)При выводе на экран ваши программы будут широко использовать

выходной поток cout.

Создадим первую программу на языке Си.

#include <iostream.h>

void main(void)

{

cout << "Учимся программировать на языке Си!";

}

В данном случае программа содержит три оператора. Фигурные скобки

(называемые группирующими символами) группируют связанные операторы:

#include <iostream.h>

void main (void)

{

cout << "Учимся программировать << "на языке Си!";

}

ПРЕДСТАВЛЕНИЕ ОБ ОПЕРАТОРЕ #include

Каждая программа, начинается со следующего оператора #include:

#include <iostream.h>

При создании программ на Cи вы получаете преимущества от

использования операторов и определений, которые обеспечивает вам

компилятор. При компиляции программы оператор #include заставляет

компилятор включить содержимое заданного файла в начало вашей программы. В

данном случае компилятор включит содержимое файла iostream.h.

Файлы с расширением h, которые вы включаете в начало (или заголовок)

вашей программы, называются заголовочными файлами. Если вы посмотрите на

каталог, содержащий файлы вашего компилятора, то найдете подкаталог с

именем INCLUDE, в котором находятся разные заголовочные файлы. Каждый

заголовочный файл содержит определения, предоставляемые компилятором для

различных операций. Например, существует заголовочный файл, который

содержит определения для математических операций, другой заголовочный файл

описывает файловые операции и т. д.

Заголовочные файлы представляют собой файлы в формате ASCII,

следовательно, вы можете вывести их содержимое на экран или принтер. В

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

поймите, что оператор #include позволяет вам использовать эти файлы. Все

программы на C++, созданные вами в процессе изучения этой книги, содержат

операторы #include, которые вы должны применять в ваших программах.

ЗАГОЛОВОЧНЫЕ ФАЙЛЫ

Каждая создаваемая вами программа на C++ начинается с одного или

нескольких операторов #include. Эти операторы указывают компилятору включить

содержимое заданного файла (заголовочного файла) в вашу программу, как если

бы программа содержала операторы, которые находятся во включаемом файле.

Заголовочные файлы содержат определения, используемые компилятором для

операций различных типов. Существуют заголовочные файлы, которые

определяют операции ввода/вывода Cи, системные функции (например, функции,

возвращающие текущие дату и время) и многое другое.

Заголовочные файлы, подобно программам на Cи, представляют собой

файлы в формате ASCII, содержимое которых вы можете просмотреть или

напечатать.

ФУНКЦИЯ void main(void)

При создании программы на Cи ваш исходный файл будет содержать

множество операторов. Как вы поймете в процессе изучения, порядок, в котором

операторы появляются в программе, не обязательно должен совпадать с

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

Каждая программа на Cи имеет один вход, с которого начинается выполнение

программы, – главную программу. В программах на Cи оператор void main(void)

указывает стартовую точку вашей программы.

Исходные файлы Cи могут содержать очень много операторов. При запуске

программы оператор void main(void) определяет главную программу, содержащую

первый выполняемый оператор. Ваши программы на Cи должны всегда включать

один и только один оператор с именем main.

При рассмотрении больших программ на Cи ищите main, чтобы определить

операторы, с которых начинается выполнение программы.

Если ваша программа использует функцию, функция выполняет свою

задачу и затем возвращает свой результат программе.

Каждая функция в вашей программе имеет уникальное имя. А каждая

программа имеет по крайней мере одну функцию.

Код - задающий тело функции main, заключается в фигурные скобки {и}.

Общая структура функции main такова:

void main (void)

{

/* Код, реализующий main */

}

Комментарии

Текст на Си, заключенный в скобки /* и */, компилятором игнорируется.

Комментарии служат двум целям: документировать код и облегчить отладку. Если

программа работает не так, как надо, то иногда оказывается полезным

закомментировать часть кода (т.е. вынести ее в комментарий), заново

скомпилировать программу и выполнить её. Если после этого программа начнет

работать правильно, то значит, закомментированный код содержит ошибку и

должен быть исправлен .

Директивы Include

Во многие программы на Си подставляются один или несколько файлов,

часто в самое начало кода главной функции main.

Появление директив

#include <файл_1>

#include "файл_2"

...

#include <файл_n>

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

файлов файл_1, файл_2 , ... , файл_n соответственно.

Если имя файла заключено в угловые скобки <...> , то поиск файла

производится в специальном разделе подстановочных файлов. В отличие от

многих других операторов Си директива Include не должна оканчиваться точкой с

запятой.

Макро

С помощью директивы #define, вслед за которой пишутся имя макро и

значение макро, оказывается возможным указать препроцессору, чтобы он при

любом появлении в исходном файле на Си данного имени макро заменял это имя

на соответствующие значения макро .

Например, директива

#define pi 3.1415926

связывает идентификатор pi со значением 3.1415926. После значения

макро (;) не ставится.

Типы данных

В Си переменные должны быть описаны, а их тип специфирован до того,

как эти переменные будут использованы.

При описании переменных применяется префиксная запись, при которой

вначале указывается тип, а затем - имя переменной.

Например:

float weight;

int exam_score;

char ch;

С типом данных связываются и набор предопределенных значений, и набор

операций, которые можно выполнять над переменной данного типа.

Переменные можно инициализировать в месте их описаний.

Пример:

int height = 71 ;

float income =26034.12 ;

Простейшими скалярными типами, предопределёнными в Си, являются:

Char Представляется как однобайтовое целое число

Int Двубайтовое целое

Long Четырёхбайтовое целое

float Четырёхбайтовое вещественное

double Восьмибайтовое вещественное

Оператор printf: вывод на терминал

Функцию printf можно использовать для вывода любой комбинации

символов, целых и вещественных чисел, строк, беззнаковых целых, длинных

целых и беззнаковых длинных целых.

Пример:

printf("\n Возраст - %d. Его доход $%.2f",age, income);

Предполагается, что целой переменной age (возраст) и вещественной

переменной income (доход) присвоены какие-то значения.

Последовательность символов "\n" переводит курсор на новую строку.

Последовательность символов "Возраст" будет выведена с начала новой

строки. Символы %d - это спецификация для целой переменной age. Следующая

литерная строка " Его доход $ ". %2f - это спецификация (символ преобразования

формата) для вещественного значения, а также указание формата для вывода

только двух цифр после десятичной точки. Так выводится значение переменной

income

Символ формата Тип выводимого объекта

%с char

%s строка

%d int

%o int (в восьмеричном виде)

%u unsigned int

%x int (в шестнадцатеричном виде)

%ld long (в десятичном виде)

%lo long (в восьмеричном виде)

%lu unsigned long

%lx long (в шестнадцатеричном виде)

%f float/double (c фиксированной точкой)

%e float/double (в экспоненциальной форме)

%g float/double (в виде f или е в зависимости от значения)

%lf long float (c фиксированной точкой)

%le long float (в экспоненциальной форме)

%lg long float (в виде f или е в зависимости от значения)

Оператор scanf: ввод с клавиатуры

Оператор scanf является одной из многих функций ввода, имеющихся во

внешних библиотеках.

Каждой вводимой переменной в строке функции scanf должна

соответствовать спецификация. Перед именами переменных необходимо

оставить символ &. Этот символ означает "взять адрес".

Пример:

#include<stdio.h>

main()

{

6

int weight, /*вес*/

height; /*рост*/

printf(" Введите ваш вес: ");

scanf("%d", &weight);

printf(" Введите ваш pocт: ");

scanf("%d", &height);

printf("\n\nВес = %d, рост = %d\n",

weight,height);

}

Задание:

Составить и распечатать программу вывода на экран своих анкетных

данных различного типа:

- вводимых с клавиатуры,

- с помощью директивы define,

- инициализированных при описании.

Выполнение работы:

  1. Программа содержащая анкетные данные, вводимые с клавиатуры:

#include <locale.h>

#include<stdio.h>

int main()

{

setlocale(LC_CTYPE,"Russian");

int weight, /*вес*/

height; /*рост*/

printf(" Введите ваш вес: ");

scanf("%d", &weight);

printf(" Введите ваш pocт: ");

scanf("%d", &height);

printf("\n\nВес = %d, рост = %d\n",

weight,height);

}

Программа покажет следующее:

2)Программа, содержащая анкетные данные с помощью директивы #define:

#include <iostream>

#define weight 54

#define height 178

using namespace std;

int main()

{

cout<<weight<<endl<<height;

}

3)Программа, содержащая анкетные данные, инициализированные при описании:

#include <iostream>

using namespace std;

int main()

{

int weight=53,height=178;

cout<<weight<<endl<<height;

}

Вывод

В результате работы выяснили, как можно задавать переменные:

  1. С помощью ввода с клавиатуры

  2. С помощью директивы #define

  3. С помощью инициализации при описании.

Лабораторная работа №3

Создание проекта в среде CodeBlocks

Основные теоретические сведения

Чтобы создать новые проект в CodeBlocks надо выполнить следующие действия:

F ile New Project…

В появившимся окне мастера необходимо выбрать тип проекта, к примеру Console Application и нажать Go. Затем выбрать язык программирования, расположение и имя проекта, компилятор, и нажать кнопку Finish.

Пример программы на Си++

//Программа 1

// В языке Си++ с двойной косой черты начинаются комментарии

// (например, как эта строка). Компилятор игнорирует комментарии,

// начиная от первой черты и до конца строки.

/* Второй способ записи комментариев – после косой черты со звездочкой.

После текста комментария надо поставить звездочку, а затем – косую

черту. Комментарии, записанные подобным образом, могут занимать

больше одной строки. */

/* В программе ОБЯЗАТЕЛЬНО должно быть достаточное количество

комментариев! */

/* Эта программа запрашивает у пользователя текущий год, возраст

пользователя и еще один год. Затем программа вычисляет возраст

пользователя, который будет у него во втором введенном году.*/

#include <iostream.h>

void main()

{

int year_now, age_now, another_year, another_age;

cout << "Введите текущий год и нажмите ENTER.\n";

cin >> year_now;

cout << "Введите свой возраст (в годах).\n";

cin >> age_now;

cout << "Введите год, для которого вы хотите узнать свой возраст.\n";

cin >> another_year;

another_age = another_year - (year_now - age_now);

if (another_age >= 0)

{

cout << "В " << another_year << " году вам будет ";

cout << another_age << "\n";

}

else

{

cout << "В " << another_year << " вы еще не родились!\n";

}

}

Некоторые свойства программы 1 являются обычными для большинства

программ на Си++. Программа начинается (после комментариев) с оператора

#include <iostream.h>

Этот оператор называется "директивой include". До компилятора исходный

текст обрабатывается препроцессором – специальной программой, которая

модифицирует текст программы по специальным командам – директивам.

Директивы препроцессора начинаются с символа "#". Директива include

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

Например, в программу 1 включается файл iostream.h, содержащий описания

функций стандартной библиотеки ввода/вывода для работы с клавиатурой и

экраном. (Стандартные библиотеки языка Си++ будут рассматриваться позже).

Алгоритм, записанный в программе 1, очень простой. Поэтому структуру

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

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

#include, можно представить в виде:

void main()

{

Первый оператор;

...

...

Последний оператор;

}

Подобная структура является общей для всех программ на Си++. Каждый

оператор в теле программы завершается точкой с запятой. В хорошо

разработанной большой программе большинство операторов являются

обращениями (вызовами) к подпрограммам, которые записываются после

функции main() или в отдельных файлах. Каждая подпрограмма (функция) имеет

структуру, подобную функции main(). Но функция main() в каждой программе

только одна. Именно с нее начинается выполнение программы. (Подробнее

функции будут рассматриваться далее.)

В программе-примере используются четыре переменные:

year_now, age_now, another_year и another_age.

Переменные в программировании отличаются от математических переменных.

Они используются как символические имена "фрагментов оперативной памяти

компьютера". При выполнении программы в различные моменты времени

переменные могут хранить различные значения. В программе 1 первое

упоминание четырех переменных содержится в строке с оператором описания

переменных:

int year_now, age_now, another_year, another_age;

Этот оператор уведомляет компилятор, что для хранения четырех переменных

типа "целое число" (integer – int) требуется выделить необходимое количество

памяти. Эта область памяти будет зарезервирована в течение выполнения

оставшейся части программы. Переменные всегда должны быть описаны до

первого использования. В программировании хорошим стилем считается

описание всех переменных, используемых в подпрограмме, в начале этой

подпрограммы. В Си++ есть несколько различных типов переменных, и они будут

обсуждаться немного позже.

Выполнение ввода/вывода данных и присваивание значений

После компиляции программы ее можно запустить на выполнение. Результат

выполнения на экране будет выглядеть примерно так:

Введите текущий год и нажмите ENTER.

2000

Введите свой возраст (в годах).

21

Введите год, для которого вы хотите узнать свой возраст.

2017

В 2017 году вам будет 38

Первая, третья, пятая и седьмая строки выдаются на экран программой с

помощью следующего оператора:

cout << Выражение1 << Выражение2 << ... << ВыражениеN;

Этот оператор выводит на экран сообщение:

Выражение1 Выражение2 ... ВыражениеN

Последовательность операторов

cout << Выражение1;

cout << Выражение2;

...

...

cout << ВыражениеN;

приводит к аналогичному результату. Если между выражениями требуется

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

символов " " и "\n" соответственно.

Числа, показанные выше в примере выдачи на экран полужирным шрифтом,

были напечатаны пользователем. В показанном примере оператор

cin >> year_now;

приводит к тому, что переменной year_now присваивается значение 2000. Это

происходит после того, как пользователь напечатает "2000" и нажмет клавишу

Enter. В программе есть еще места, где переменным присваиваются значения, в

том числе оператор присваивания:

another_age = another_year - (year_now - age_now);

Операция "=" означает "присвоить переменной, стоящей слева от знака

равенства, значение, указанное справа". Проверка на равенство в Си++

обозначается двойным символом: "==".

Управление порядком выполнения команд с помощью оператора if

В нескольких последних строках программы записано:

if (another_age >= 0)

{

cout << "В " << another_year << " году вам будет ";

cout << another_age << "\n";

}

else

{

cout << "В " << another_year << " вы еще не родились!\n";

}

Оператор ветвления (условный оператор) "if...else..." выглядит примерно

одинаково во всех процедурных языках программирования. В Си++ он называется

просто оператором if, и его общая структура такова:

if ( условие )

{

Оператор1;

...

...

ОператорN;

}

else

{

ОператорN+1;

...

...

ОператорN+M;

}

Часть "else (иначе)" в операторе if необязательна. Более того, если после

"if ( условие )" стоит только один оператор, то можно опустить фигурные скобки и

записать оператор так:

if ( условие )

Оператор1;

В программах условные операторы часто встречаются группами, например:

...

...

if (total_test_score < 50)

cout << "Вы не прошли тест. Выучите материал как следует.\n";

else if (total_test_score < 65)

cout << "Вы прошли тест со средним результатом.\n";

else if (total_test_score < 80)

cout << "Вы хорошо выполнили тест.\n";

else if (total_test_score < 95)

cout << "Вы показали отличный результат.\n";

else

{

cout << "Вы сдали тест нечестно!\n";

total_test_score = 0;

}

...

...

Приведенный фрагмент программы может показаться довольно сложным. Тем

не менее, он соответствует правилам Си++. Это легко понять, если обратиться к

синтаксической диаграмме оператора if

При обработке приведенного фрагмента программы компилятор Си++ трактует

весь текст, выделенный ниже полужирным шрифтом, как один оператор после

первого слова else.

...

...

if (total_test_score < 50)

cout << "Вы не прошли тест. Выучите материал как следует.\n";

else if (total_test_score < 65)

cout << "Вы прошли тест со средним результатом.\n";

else if (total_test_score < 80)

cout << "Вы хорошо выполнили тест.\n";

else if (total_test_score < 95)

cout << "Вы показали отличный результат.\n";

else

{

cout << "Вы сдали тест нечестно!\n";

total_test_score = 0;

}

...

Оформление исходного текста

Между текстом программы, приведенным в п.2 и текстом, который показан

ниже, для компилятора Си++ нет никаких различий.

#include <iostream.h> void main() { int year_now, age_now, another_year,

another_age; cout << "Введите текущий год и нажмите ENTER.\n"; cin >> year_now;

cout << "Введите свой возраст (в годах).\n"; cin >> age_now; cout << "Введите год,

для которого вы хотите узнать свой возраст.\n"; cin >> another_year; another_age =

another_year - (year_now - age_now); if (another_age >= 0) { cout << "В " <<

another_year << " году вам будет "; cout << another_age << "\n"; } else { cout << "В "

<< another_year << " вы еще не родились!\n"; } }

Отсутствие комментариев, пробелов, пустых строк и отступов делают эту

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

хорошего стиля программирования, конечно, требуется знать не только правила

оформления текста программы, но их следует соблюдать с самого начала. При

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

чтобы отступы и пробелы отражали логическую структуру ваших программ.

Для переменных следует выбирать осмысленные имена: имена "year_now",

"age_now", "another_year" и "another__age" лучше, чем "y_n", "a_n", "a_y" и "a_a" и

намного лучше, чем "w", "x", "y" и "z". Это особенно важно, если в будущем ваши

программы могут потребовать изменения с помощью других программистов.