Файл: Лабораторная работа 1 Изучение среды разработки программ 3 Лабораторная работа 2 Исследование базовых типов данных языка Си 18.doc

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 05.12.2023

Просмотров: 257

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

Лабораторная работа № 1Изучение среды разработки программ

ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

ПРОГРАММА РАБОТЫ

Лабораторная работа № 2Исследование базовых типов данных языка Си

МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ

ЗАДАНИЕ НА ИССЛЕДОВАНИЕ

Лабораторная работа № 3Исследование операций языка Си Цель занятия: Совершенствование навыков объявления, инициализации переменных и ввода и вывода информации Совершенствование навыков разработки программ в среде программирования MS Visual C++ Исследование возможностей языка С++ для реализации арифметических, логических и поразрядных операций над данными Время на выполнение работы: 4 часаПрограмма исследований: Исследование арифметических операций Исследование логических операций Исследование поразрядных операций Подготовка к выполнению работы: Изучить рекомендованную литературу (структура программы на языке высокого уровня, алфавит и элементарные конструкции языка Си, переменные и константы, стандартные типы данных, выражения и операции в языке Си). Изучить материал настоящего руководства. Материалы для подготовки к занятию: Конспект лекций. [1] стр. 31-38. Содержание отчета: Цели исследования. Программа работы. Листинги программ. Результаты исследований. Выводы по каждому пункту и общий вывод. МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ Любое выражение языка состоит из операндов (переменных, констант и др.), соединенных знаками операций. Знак операции - это символ или группа символов, которые сообщают компилятору о необходимости выполнения определенных арифметических, логических или других действий. Операции выполняются в строгой последовательности. Величина, определяющая преимущественное право на выполнение той или иной операции, называется приоритетом. В таблице 3.1 перечислены различные операции языка Си. Их приоритеты для каждой группы одинаковы. Чем большим преимуществом пользуется соответствующая группа операций, тем выше она расположена в таблице. Приоритеты могут регулироваться с помощью круглых скобок. Таблица 3.1 – Операции языка Си Знак операции Назначение операции ( ) Вызов функции [ ] Выделение элемента массива . Выделение элемента записи -> Выделение элемента записи (тождественно(.)) ! Логическое отрицание Поразрядное отрицание - Изменение знака ++ Увеличение на единицу -- Уменьшение на единицу & Взятие адреса * Обращение по адресу (тип) Преобразование типа (т.е. (float) a) sizeof( ) Определение размера в байтах * Умножение / Деление % Определение остатка от деления + Сложение - Вычитание << Сдвиг влево >> Сдвиг вправо < Меньше, чем <= Меньше или равно > Больше, чем >= Больше или равно = = Равно != Не равно & Поразрядное логическое "И" ^ Поразрядное исключающее "ИЛИ" | Поразрядное логическое "ИЛИ" && Логическое "И" || Логическое "ИЛИ" ?: Условная (тернарная) операция = Присваивание +=, - =, *=, /=, %=, <<=,>>=, &=, |=, ^= Бинарные операции (например, а *= b(т.е. a = a * b) и т.д.) , Операция запятая Для исключения путаницы в понятиях "операция" и "оператор", необходимо отметить, что оператор - это наименьшая исполняемая единица программы. Различают операторы выражения, действие которых состоит в вычислении заданных выражений (например: a = sin(b)+c; j++;), операторы объявления, составные операторы, пустые операторы, операторы метки, цикла и т.д. Для обозначения конца оператора в языке С++ используется точка с запятой. Что касается составного оператора (или блока), представляющего собой набор логически связанных операторов, помещенных между открывающей ({) и закрывающей (}) фигурными скобками ("операторными скобками"), то за ним точка с запятой не ставится. Отметим, что блок отличается от составного оператора наличием определений в теле блока. Охарактеризуем основные операции языка С++. Сначала рассмотрим одну из них - операцию присваивания (=). Выражение вида х = у + z;присваивает переменной х значение суммы переменных у и z. Наличие « ; » в конце операции говорит о том, что записан оператор. На первый взгляд все просто. Но очень часто у начинающих программистов возникает путаница в понимании этого оператора. Это связано с тем, что с точки зрения математики следующие два выражения в общем-то эквивалентны:х = у + z;у + z = х;Но программирование – есть процесс записи на формализованном языке последовательности команд, которые необходимо выполнить для достижения конечного результата. Из этого аспекта и вытекает ключевая разница из этих, казалось бы, тождественных выражений.Для любого языка программирования операция присваивания « = » в обязательном порядке подразумевает следующий порядок ее выполнения. Справа от знака « = » задается источник присваивания (то, что присваивается), а слева – приемник (или то, чему присваивается источник): х = у + z; Приемник Источник Первым вычисляется результат источника, который затем присваивается приемнику, НО НЕ НАОБОРОТ! Именно поэтому выражение у + z = х не имеет смысла! Источником может быть любая последовательность операций. Приемником – только переменная.По этой же причине оператор у + z;тоже бессмыслен, так как результат операции никуда не сохранен! (За исключением использования механизма перегрузки операции в классах, который будет рассмотрен во втором семестре). Операцию "=" разрешается использовать многократно в одном выражении, например: x = y = z = 100;Различают унарные, бинарные итернарные операции. У первых из них один операнд, у вторых – два и у третьих - три. В языке Си выделяют три группы операций: арифметические операции; логические операции и операции отношения; операции с битами. 1. Арифметические операции задаются следующими символами (таблица 3.1): +, -, *, /, %, -, !, . Например: a = b + c;a = b - c;a = b * c;a = b / c;a = b % c; a = !b;a = -b;a = b;a = sizeof (b);Операции +, -, * интуитивно понятны и не нуждаются в объяснении.Операции увеличения и уменьшения на 1 (++ и --).Эти операции, называемые также инкрементом и декрементом, имеют две формы записи - префиксную, когда операция записывается перед операндом, и постфиксную. В префиксной форме сначала изменяется операнд, а затем его значение становится результирующим значением выражения, а в постфиксной значением выражения является исходное значение операнда, после чего он изменяется.Операция определения размера sizeof предназначена для вычисления размера объекта или типа в байтах, и имеет две формы:sizeof выражение или sizeof( тип )Операции отрицания (-, ! и ). Арифметическое отрицание (унарный минус-) изменяет знак операнда целого или вещественного типа на противоположный. Логическое отрицание(!) дает в результате значение 0, если операнд есть истина( не нуль), и значение 1, если операнд равен нулю. Операнд должен быть целого или вещественного типа, а может иметь также тип указатель. Поразрядное отрицание(), часто называемое побитовым, инвертирует каждый разряд в двоичном представлении целочисленного операнда.Деление (/) и остаток от деления(%). Операция деления применима к операндам арифметического типа. Если оба операнда целочисленные, результат операции округляется до целого числа, в противном случае тип результата определяется правилами преобразования. Операция остатка от деления применяется только к целочисленным операндам. Знак результата зависит от реализации.Бинарные операции +=, -=, *= и /= эквивалентны следующим: a += 3;a -= 3;a *= 3;a /= 3;  a = a + 3;a = a - 3;a = a * 3;a = a / 3; 2. Поразрядные операции задаются следующими символами (таблица 3.1): <<, >>, &, |, ^. Например:a = b << 3;a = b >> 2;a = b & c;a = b | c;a = b ^ c;Операции сдвига (<< и >>) применяются целочисленным операндам. Они сдвигают двоичное представление первого операнда влево или вправо на количество двоичных разрядов, заданное вторым операндом. При сдвиге влево (<<) освободившиеся разряды обнуляются. При сдвиге вправо (>)освободившиеся биты заполняются нулями, если первый операнд беззнакового типа, и знаковым разрядом в противном случае. Операции сдвига не учитывают переполнение и потерю значимости.Примеры: int i=10, j, k ; /* i = 0000 1010 */k = i<<2 ; /* k = 0010 1000 */j = k<<1 ; /* j = 0101 0000 */i = j>>4 ; /* i = 0000 0101 */Битовые операции (&, |, ^) применяются только к целочисленным операндам и работают с их двоичными представлениями. При выполнении операций операнды сопоставляются побитового (первый бит первого операнда с первым битом второго, второй бит первого операнда со вторым битом второго, и т д.).При поразрядной конъюнкции, или поразрядном И (операция обозначается &) бит результата равен 1 только тогда, когда соответствующие биты обоих операндов равны 1.При поразрядной дизъюнкции, или поразрядном ИЛИ (операция обозначается |) бит результата равен 1 тогда, когда соответствующие биты хотя бы одного из операндов равен 1.При поразрядном исключающем ИЛИ (операция обозначается ^) бит результата равен 1 только тогда, когда соответствующий бит только одного из операндов равен 1.Примеры: int i=6, j=5, k ; /* i = 0110, *//* j = 0101 *//* --------- */k = i&j ; /* k = 0100 */k = i|j ; /* k = 0111 */k = j^j ; /* k = 0011 */3. Логические операции и операции отношения задаются следующими символами (таблица 3.1): <, <=, >, >=, ==, !=, &&, ||.Логические операции (&&и ||). Операнды логических операций И (&&) и ИЛИ (||) могут иметь арифметический тип или быть указателями, при этом операнды в каждой операции могут быть различных типов. Преобразования типов не производятся, каждый операнд оценивается с токи зрения его эквивалентности нулю (операнд, равный нулю, рассматривается как false, не равный нулю - как true).Результатом логической операции является true или false. Результат операции логическое И имеет значение true только если оба операнда имеют значение true. Результат операции логическое ИЛИ имеет значение true, если хотя бы один из операндов имеет значение true. Логические операции выполняются слева направо. Если значение первого операнда достаточно, чтобы определить результат операции, второй операнд не вычисляется. Результаты логических операций могут быть представлены следующим образом:Таблица 3.2 – Логические операции языка Си x y x && y x || y 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 1 Операции отношения (<, <=, >, >=, = =, !=) сравнивают первый операнд со вторым. Операнды могут быть арифметического типа или указателями. Результатом операции является значение true или false (любое значение, не равное нулю, интерпретируется как true). Операции сравнения на равенство и неравенство имеют меньший приоритет, чем остальные операции сравнения. Результаты операций отношения могут быть представлены следующим образом:Таблица 3.3 – Операции отношения языка Си  x y x < y x <= y x > y x >= y x = = y x != y 0 0 false true false true true false 0 1 true true false false false true 1 0 false false true true false true 1 1 false true false true true false 1>2>1   2   3   4   5   6   7   8   9   ...   22

ЗАДАНИЕ НА ИССЛЕДОВАНИЕ Исследование арифметических операций для заданных исходных данных исследовать влияние типа данных на конечный результат для всех арифметических операций. Пример:typedef signed short int INT;int main(int argc, char* argv[]){INT a=12678, b=-19003, c;float x=a,y=b,z;char d=156,e=68,f;cout<<"\n------------------\nInteger: a="<c=a-b; cout<<"\n-: "<c=a*b; cout<<"\n*: "<c=a/b; cout<<"\n/: "<c=a%b; cout<<"\n%: "<c=-a; cout<<"\n-: "<c=!a; cout<<"\n!: "<c=a; cout<<"\n

Лабораторная работа № 4Применение управляющих инструкций языка для организации ветвлений в программе

ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

ПРОГРАММА РАБОТЫ

ЗАДАНИЕ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ

Лабораторная работа № 5Исследование циклов

МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ

ЗАДАНИЕ НА ИССЛЕДОВАНИЕ

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

ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

ПРОГРАММА РАБОТЫ

Лабораторная работа № 7Исследование массивов и указателей

МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ

ЗАДАНИЕ НА ИССЛЕДОВАНИЕ

Лабораторная работа № 8Применение функций работы со строками для решения прикладных задач

ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

ПРОГРАММА РАБОТЫ

МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ

ЗАДАНИЕ НА ИССЛЕДОВАНИЕ

Практическое занятие № 6Использование функций для работы с массивами

ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

ПРОГРАММА РАБОТЫ

Практическое занятие № 7Программирование рекурсивных алгоритмов

ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

ПРОГРАММА РАБОТЫ

Практическое занятие № 8Применение производных типов данных для решения прикладных задач

ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

ПРОГРАММА РАБОТЫ

Лабораторная работа № 5Исследование методов доступа к файлам данных

МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ

ЗАДАНИЕ НА ИССЛЕДОВАНИЕ

Лабораторная работа № 6Исследование связанных списков данных

МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ

ЗАДАНИЕ НА ИССЛЕДОВАНИЕ

ЛИТЕРАТУРА




Ставропольский ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
КАФЕДРА прикладной математики и информатики

УЧЕБНОЕ ПОСОБИЕ

ПО ДИСЦИПЛИНЕ

«Алгоритмизация, структуры данных и языки программирования»

Ставрополь, 2010
Содержание


Лабораторная работа № 1 Изучение среды разработки программ 3

Лабораторная работа № 2 Исследование базовых типов данных языка Си 18

Лабораторная работа № 3 Исследование операций языка Си 30

Лабораторная работа № 4 Применение управляющих инструкций языка для организации ветвлений в программе 38

Лабораторная работа № 5 Исследование циклов 44

Лабораторная работа № 6 Применение массивов и указателей для решения прикладных задач 49

Лабораторная работа № 7 Исследование массивов и указателей 55

Лабораторная работа № 8 Применение функций работы со строками для решения прикладных задач 60

Лабораторная работа № 9 Использование функций для решения прикладных задач 67

Практическое занятие № 6 Использование функций для работы с массивами 78

Практическое занятие № 7 Программирование рекурсивных алгоритмов 84

Практическое занятие № 8 Применение производных типов данных для решения прикладных задач 87

Лабораторная работа № 5 Исследование методов доступа к файлам данных 95

Лабораторная работа № 6 Исследование связанных списков данных 102

ЛИТЕРАТУРА 106



Занятие 1

Лабораторная работа № 1
Изучение среды разработки программ



Цель занятия:

  • Изучить интерфейс среды программирования Microsoft Visual C++

  • Изучить состав проекта и порядок создания приложения

  • Приобрести начальные навыки разработки приложений в среде программирования Microsoft Visual C++


Время на выполнение работы: 2 часа
Учебные вопросы:

  1. Изучение интерфейса среды программирования

  2. Изучение состава и порядка создания проекта

  3. Отладка и исполнение программы


Подготовка к выполнению работы:

  1. Изучить рекомендованную литературу (структура программы на языке высокого уровня, алфавит и элементарные конструкции языка Си).

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


Материалы для подготовки к занятию:


  1. Конспект лекций

  2. [1] стр. 17-31.

ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ





  1. Изучение интерфейса среды программирования


Microsoft Visual Studio представляет собой мощную среду программирования на языках С++, C# и др. для разработки различных типов приложений для MS-DOS и Windows 3x/9x/NT/2000/XP. С точки зрения стратегий разработки программных систем Visual C++ является RAD – системой (системой быстрой разработки приложений – Rapid Application Develop). Microsoft Visual C++ является стандартным многооконным Windows-приложением, которое содержит (рис. 1.1):

  • главное окно, состоящее из:

    • командного меню – 1

    • панели кнопок быстрого доступа – 2

  • окно Solution Explorer (Менеджер проектов) – 3

  • окно редактора кода модуля – 4

  • окно результатов компиляции – 5



Рисунок 1.1 - Фрагмент интерфейса Microsoft Visual C++

Рассмотрим каждое из окон подробнее.

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

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

Окно Solution Explorer (Менеджер проектов)отображает состав приложения.

Окно редактора кода модуля - это обычный текстовый редактор, который предназначен для набора текста модулей проекта. Особенностью этого редактора является цветовое выделение различных фрагментов кода. Например, комментарии автоматически выделяются зеленым цветом, ключевые слова – синим, строковые выражения – красным, остальные лексемы и выражения – обычным черным. Этот механизм очень удобен, так как позволяет выявлять некоторые ошибки визуально по цвету текста кода. Для окна редактора кода, как и для обычного Windows-окна доступно меню свойств, вызываемое правой кнопкой мыши, которое выполняет понятные из названий самих пунктов действия. Более подробно рассматриваемый материал представлен в литературе [2] .

  1. Изучение состава и порядка создания проекта

Создание нового приложения в Visual С++ требует выполнения определенной последовательности действий, так как каждое новое приложение в Visual С++ – это, прежде всего, новый проект, который состоит из ряда взаимосвязанных файлов, каждый из которых в отдельности, зачастую, бесполезен. Это связано с тем, что, с точки зрения модульного подхода к программированию, исходный код приложения может быть разбит на несколько файлов. Более того, некоторые исходные данные могут храниться в виде подключаемых отдельных файлов ресурсов. Понятие проекта связано с неким администрированием взаимосвязанных различных файлов-модулей одного приложения на этапе его разработки.



С другой стороны, Visual С++ позволяет создавать различные типы приложений, в том числе и консольные DOS-приложения. Поэтому начинать создавать новый проект необходимо с определения типа будущего приложения. Правильное создание заготовки нового проекта – залог успеха!

Рассмотрим подробно процесс создания консольного приложения. Создание любого нового приложения начинается с вызова менеджера новых проектов: File->New командного меню (рисунок 1.2). Менеджер новых проектов (рисунок 1.3) содержит упорядоченную совокупность вариантов типов новых приложений. Для создания консольного приложения необходимо выбрать вид будущего приложения: Win32 -> Win32 Console Application. В поле Location необходимо задать путь к будущему проекту, а в поле Project Name – имя проекта (обратите внимание, что в поле Solution автоматически появится имя папки, соответствующее имени проекта). В результате выполнения этого пункта на экране появится окно мастера консольных приложений (рисунок 1.4). Данный мастер позволяет создать будущее консольное приложение определенного вида. Остановимся на приложении вида Console Application(консольное приложение, см. рис. 1.5).



Рисунок 1.2 - Создание нового приложения

Р исунок 1.3 - Окно менеджера новых проектов

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



Рисунок 1.4 - Мастер консольных приложений – шаг 1

Затем, после нажатия кнопки Finish заканчивается работа мастера и появляется окно соответствующего консольного приложения (информация о создаваемом проекте – рисунок 1.5).



Рисунок 1.5 – Окно информации о создаваемом проекте – шаг 2

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


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

Во-вторых, не следует забывать, что объектно-ориентированное программирование развивалось в те времена, когда IBM PC имела объем памяти 64 Кб, внешним запоминающим устройством для нее служил кассетный магнито­фон и никому, даже в страшном сне, не могло привидеться, что кому-то может не хватить 640 Кб оперативной памяти. Из вышесказанного очевид­но, что в те времена очень остро стоял вопрос о размерах файлов, загружае­мых в оперативную память.

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

Теперь целесообразно найти наш проект в указанном пути его размещения (рис. 1.6).



Рисунок 1.6 – Окно сохраненного проекта



Рисунок 1.7 – Панель Solution Explorer


Практически то же самое можно найти, если обратиться к панели управления решением (менеджеру проектов) Solution Explorer (в случае отсутствия View \ Solution Explorer) и открыть в ней все вложения (рис. 1.7).


Имевшиеся во времена создания языков высокого уровня средства обеспечения видимости переменных требовали, чтобы все обращения к лю­бой переменной происходили, как минимум, в пределах одного файла. Что­бы обойти это ограничение была предпринята попытка разделить описание классов и программную реализацию используемых в них методов обработки. В результате появились файлы заголовков (header files) или заголовочные фай­лы и файлы реализации (implementation files). Файлы заголовков обычно имеют расширение .h и включают в себя краткое описание классов и других типов данных для включения их в файлы реализации, обычно имеющие расширение
.срр, в которых предполагается использование классов и пере­менных, определенных в данном файле заголовка.

Вкладка View \ ClassView (рис. 1.8) содержит список программных объектов проекта (в самом начале для выбранного вида проекта там находится только объявление функции main()).



Рисунок 1.8 – Панель ClassView

Для того чтобы перейти в окно редактора кода модуля, необходимо в окне проекта во вкладке FileView дважды щелкнуть левой кнопкой мыши на том файле, который мы хотим редактировать (например, Pr1.cpp – рис. 1.9).

Обратите внимание на имя файла в строке заголовка активной вкладки рабочей области окна. Там находится только надпись “Pr1.cpp”. Теперь, поставьте курсор мыши в любое свободное от кода место в окне редактора кода нажатием левой кнопки мыши. Если Вы все правильно сделали, то в этом месте заморгает указатель текущей позиции ввода символа. Нажмите пробел. Удалите его. Обратите внимание на появление символа звездочки в имени файла в заголовке окна. Это говорит о том, что в модуль внесены изменения, которые не сохранены в файле. Нажатие кнопки на панели инструментов позволяет сохранить все текущие изменения во всех модулях проекта.



Рисунок 1.9 – Окно редактора кода

Для того, чтобы закончить работу с текущим проектом, необходимо в командном меню главного окна среды программирования во вкладке File выбрать пункт Close Solution, что позволит приступить к созданию или открытию другого проекта. В этой же вкладке File присутствует пункт Recent Files, который позволяет открыть тот файл (*.cpp), с которым Вы работали ранее, а также пункт Recent Projects, который позволяет открыть тот проект, с которым Вы работали ранее.
3. Отладка и исполнение программы
После сохранения заготовки проекта можно приступить к созданию самого проекта. Разработаем программу вычисления частного двух чисел. Прежде чем разрабатывать программу, необходимо в соответствии с этапами решения задачи на ЭВМ произвести математическую постановку задачи и ее формализацию. Математическая постановка задачи проста: решение заключается в записи формулы вида