Практическое заняти №4
Программирование на Си++
Цель работы: Приобретение навыков программирования и работы в с реде программирования С/С++
Программа работы
- Постановка задачи,
2. Создание, отладка и выполнение простой программы, содержащей ввод/вывод информации и простейшие вычисления в соответствии с постановкой задачи в п,1,.
Методические указания
К п.1. Т ребуется вычислить значение выражения при различных вещественных типах данных (float и double). Вычисления следует выполнять с использованием вспомогательных переменных для хранения промежуточных результатов. Следует сравнить и объяснить полученные промежуточные результаты и результаты выражений. Варианты заданий представлены в таблице 6.
Для ввода и вывода данных следует использовать операции >> и <<и стандартные потоки cin и cout. Для вычисления степени использовать функцию pow(x,y) из библиотечного файла math.h. Промежуточные расчеты следует организовать следующим образом, например, для расчета выражения f=3a^5b^3: с=pow(a,5); d=pow(b,3); f=3*c*d.
К п.2. Краткие теоретические сведения. Язык Си создан в 1972 гДэннисомРитчи при разработке ОС Unix. Он проектировался как инструмент системного программирования с ориентацией на разработку хорошо структуророванных программ. Таким образом он сочетает в себе, с одной стороны, средства языка программрования высокого уровня: описание типов данных, операторы for,while, if и т. д., с другой стороны, содержит средства языка типа Ассемблер: регистровые переменные, адресную арифметику, возможность работы с полями и т. д..
Структура программы
Программа на языке Си имеет следующую структуру:
#директивы препроцессора
.........
#директивы препроцессора
функция а ()
операторы
функция в ()
операторы
voidmain () //функция, с которой начинается выполнение программы
операторы
описания
присваивания
функция
пустой оператор
составной
выбора
циклов
перехода
Директивы препроцессора - управляют преобразованием текста программы до ее компиляции. Исходная программа, подготовленная на языке Си в виде текстового файла проходит 3 этапа обработки:
l препроцессорное преобразование текста;
l компиляция;
l компоновка (редактирование связей или сборка).
После этих 3 этапов формируется исполняемый машинный код программы.
Задача препроцессора - преобразование текста программы до ее компиляции. Правила препроцессорной обработки определяет программист с помощью директив препроцессора. Директива начинается с #. Например,
l #define - указывает правила замены в тексте.
#define ZERO 0.0- означает, что каждое использование в программе имени ZERO будет заменяться на 0.0.
l #include< имя заголовочного файла> - предназначена для включения в текст программы текста из каталога «Заголовочных файлов», поставляемых вместе со стандартными библиотеками. Каждая библиотечная функция Си имеет соответствующее описание в одном из заголовочных файлов. Список заголовочных файлов определен стандартом языка. Употребление директивы include не подключает соответствующую стандартную библиотеку, а только позволяют вставить в текст программы описания из указанного заголовочного файла. Подключение кодов библиотеки осуществляется на этапе компоновки, т. е. после компиляции. Хотя в заголовочных файлах содержатся все описания стандартных функций, в код программы включаются только те функции, которые используются в программе.
После выполнения препроцессорной обработки в тексте программы не остается ни одной препроцессорной директивы. Программа представляет собой набор описаний и определений, и состоит из набора функций. Среди этих функций всегда должна быть функция с именем main. Без нее программа не может быть выполнена. Перед именем функции помещаются сведения о типе возвращаемого функцией значения (тип результата). Если функция ничего не возвращает, то указывается тип void: voidmain (). Каждая функция, в том числе и main должна иметь набор параметров, он может быть пустым, тогда в скобках указывается (void).
За заголовком функции размещается тело функции. Тело функции - это последовательность определений, описаний и исполняемых операторов, заключенных в фигурные скобки. Каждое определение, описание или оператор заканчивается точкой с запятой.
Определения - вводят объекты (объект - это именованная область памяти, частный случай объекта - переменная), необходимые для представления в программе обрабатываемых данных. Примером являются
int y = 10; //именованная константа
float x; //переменная
Описания - уведомляют компилятор о свойствах и именах объектов и функций, описанных в других частях программы.
Операторы - определяют действия программы на каждом шаге ее исполнения.
Константы и переменные
Константа - это значение, которое не может быть изменено. Синтаксис языка определяет 5 типов констант:
l символы;
l константы перечисляемого типа;
l вещественные числа;
l целые числа;
l нулевой указатель (NULL).
Переменные можно изменять. При задании значения переменной в соответствующую ей область памяти помещается код этого значения. Доступ к значению возможен через имя переменной, а доступ к участку памяти - по его адресу. Каждая переменная перед использованием в программе должна быть определена, т. е. ей должна быть выделена память. Размер участка памяти, выделяемой для переменной и интерпретация содержимого зависят от типа, указанного в определении переменной. Простейшая форма определения переменных:
тип список_имен_переменных;
Таблица 3 - Основные типы данных
Тип данных | Название | Размер, бит | Диапазон значений |
unsignedchar | беззнаковый целый длиной не менее 8 бит | 0.. 255 | |
char | целый длиной не менее 8 бит | -128.. 127 | |
enum | перечисляемый | -32768.. 32767 | |
unsignedint | беззнаковый целый | 0.. 65535 | |
shortint (short) | короткий целый | -32768.. 32767 | |
unsignedshort | беззнаковый короткий целый | 0.. 65535 | |
int | целый | -32768.. 32767 | |
unsignedlong | беззнаковый длинный целый | 0.. 4294967295 | |
long | длинный целый | -214748348.. 2147483647 | |
float | вещественный одинарной точности | 3.4Е-38.. 3.4Е+38 | |
double | вещественный двойной точности | 1.7Е-308.. 1.7Е+308 | |
longdouble | вещественный максимальной точности | 3.4Е-4932.. 1.1Е+4932 |
В соответствии с синтаксисом языка переменные автоматической памяти после определения по умолчанию имеют неопределенные значения. Переменным можно присваивать начальные значения, явно указывая их в определениях:
тип имя_переменной = начальное_значение;
Этот прием называется инициализацией.
Примеры:
float pi = 3.14, cc=1.3456;
unsignedint year = 1999;
Операции
Описание операций представлены в таблице 4
Таблица 4
Знак операции | Описание | ||||||
Унарные операции | |||||||
& | получение адреса операнда | ||||||
* | обращение по адресу (разыменование) | ||||||
- | унарный минус, меняет знак арифметического операнда | ||||||
~ | поразрядное инвертирование внутреннего двоичного кода (побитовое отрицание) | ||||||
! | логическое отрицание (НЕ). В качестве логических значений используется 0 - ложь и не 0 - истина, отрицанием 0 будет 1, отрицанием любого ненулевого числа будет 0. | ||||||
++ | увеличение на единицу: префиксная операция - увеличивает операнд до его использования, постфиксная операция увеличивает операнд после его использования. | ||||||
- - | уменьшение на единицу: префиксная операция - уменьшает операнд до его использования, постфиксная операция уменьшает операнд после его использования. | ||||||
sizeof | вычисление размера (в байтах) для объекта того типа, который имеет операнд | ||||||
Бинарные операции. Аддитивные | |||||||
+ | бинарный плюс (сложение арифметических операндов) | ||||||
- | бинарный минус (вычитание арифметических операндов) | ||||||
Бинарные операции. Мультипликативные | |||||||
* | умножение операндов арифметического типа | ||||||
/ | деление операндов арифметического типа (если операнды целочисленные, то выполняется целочисленное деление) | ||||||
% | получение остатка от деления целочисленных операндов | ||||||
Операции сдвига (определены только для целочисленных операндов). Формат выражения с операцией сдвига: операнд_левыйоперация_сдвигаоперанд_правый | |||||||
<< | сдвиг влево битового представления значения левого целочисленного операнда на количество разрядов, равное значению правого операнда | ||||||
>> | сдвиг вправо битового представления значения правого целочисленного операнда на количество разрядов, равное значению правого операнда | ||||||
Поразрядные операции | |||||||
& | поразрядная конъюнкция (И) битовых представлений значений целочисленных операндов | ||||||
| | поразрядная дизъюнкция (ИЛИ) битовых представлений значений целочисленных операндов | ||||||
^ | поразрядное исключающее ИЛИ битовых представлений значений целочисленных операндов | ||||||
Операции сравнения: | |||||||
< | меньше, чем | ||||||
> | больше, чем | ||||||
<= | меньше или равно | ||||||
>= | больше или равно | ||||||
== | равно | ||||||
!= | не равно | ||||||
Логические бинарные операции: | |||||||
&& | конъюнкция (И) целочисленных операндов или отношений, целочисленный результат ложь(0) или истина(1) | ||||||
|| | дизъюнкция (ИЛИ) целочисленных операндов или отношений, целочисленный результат ложь(0) или истина(1) | ||||||
Условная операция | |||||||
В отличие от унарных и бинарных операций в ней используется три операнда. Выражение1? Выражение2: Выражение3; | |||||||
В условном операторе первым вычисляется значение выражения1. Если оно истинно, то вычисляется значение выражения2, которое становится результатом. Если при вычислении выражения1 получится 0, то в качестве результата берется значение выражения3. Например:
x<0? -x: x; //вычисляется абсолютное значение x.
Операция явного (преобразования) приведения типа. Существует две формы: каноническая и функциональная:
l (имя_типа) операнд
l имя_типа (операнд)
Таблица 5 - Приоритеты операций
Ранг | Операции |
() [ ] ->. | |
! ~ - ++ -- & * (тип) sizeof тип() | |
* / % (мультипликативные бинарные) | |
+ - (аддитивные бинарные) | |
<<>> (поразрядного сдвига) | |
<><= >= (отношения) | |
==!= (отношения) | |
& (поразрядная конъюнкция «И») | |
^ (поразрядное исключающее «ИЛИ») | |
| (поразрядная дизъюнкция «ИЛИ») | |
&& (конъюнкция «И») | |
|| (дизъюнкция «ИЛИ») | |
?: (условная операция) | |
= *= /= %= -= &= ^= |= <<= >>= (операция присваивания) | |
, (операция запятая) |
Выражения
Из констант, переменных, разделителей и знаков операций можно конструировать выражения. Каждое выражение состоит из одного или нескольких операндов, символов операций и ограничителей, в качестве которых чаще всего выступают квадратные скобки. Если выражение формирует целое или вещественное число, то это арифметическое выражение. В арифметических выражениях допустимы операции: + - * / %.
Отношение - это пара арифметических выражений, объединенных знаком операции отношения. Логический тип в Си отсутствует, поэтому принято, что отношение имеет ненулевое значение, если оно истинно и 0, если оно ложно.
Ввод и вывод
Ввод и вывод в стандартном Си
Обмен данными с внешним миром программа на стандартном Си реализует с помощью библиотеки функций ввода-вывода
l #include<stdoi.h>
l printf(<форматная строка>,<список аргументов>);
<форматная строка> - строка символов, заключенных в кавычки, которая показывает, как должны быть напечатаны аргументы. Например:
printf(“Значение числа Пи равно %f\n”, pi);
Форматная строка может содержать
l символы печатаемые текстуально;
l спецификации преобразования
l управляющие символы.
Каждому аргументу соответствует своя спецификация преобразования:
l %d - десятичное целое число;
l %f - число с плавающей точкой;
l %c - символ;
l %s - строка.
l \n - управляющий символ новая строка.
l scanf(<форматная строка>,<список аргументов>);
В качестве аргументов используются указатели. Например:
l scanf(“ %d%f ”, &x,&y);
2.5.2 Ввод и вывод в Си++
Используется библиотечный файл iostream.h, в котором определены стандартные потоки ввода данных от клавиатуры cin и вывода данных на экран дисплея cout, а также соответствующие операции
l << - операция записи данных в поток;
l >> - операция чтения данных из потока.
Например:
#include<iostream.h>;
.........
cout<< “\nВведите количество элементов: ”;
cin>> n;
2.6 Работа в среде программирования СИ
Графическая оболочка загружаемой интегрированной среды программирования на Си Borland C V5.0 имеет знакомый по работе со средой программирования на Паскале оконный интерфейс Основное меню и его элементы имеют те же функции и правила запуска и настройки. Новым элементом меню является Project- rкоманды создания и модификации проектного файла(создание и удаление проектного файла и создание и удаление программного модуля из него). Разработка программы в среде начинается именно с этой команды -с создания нового проекта.
На следующем этапе в созданный проект добавить файл для набора текста программы командой Project/AddItem. Файл для набора программы вызывается двойным щелчком мыши в окне проекта.
Таблица 6 – Варианты заданий
№ варианта | Содержание индивидуального задания |
Перевод вещественного числа из десятичной системы счисления в двоичную | |
Вычисление среднего значения одномерного массива чисел и нахождение максимального среднеквадратичного отклонения. | |
Вычисление суммы N элементов ряда1-1/3 +1/5 -1/7+… и определение разности этой суммы и значения пи/4 | |
Определить в трехмерном массиве количество нулевых массивов и вывести их индексы. | |
Определить номер строки, сумма элементов которой максимальна. | |
Перевод вещественного числа из двоичной системы счисления в десятичную | |
Проверка, является ли матрица диагональной. | |
Перевод из восьмеричной системы в двоичную с проверкой правильности введенных символов | |
Вычисление суммы и среднего значения отрицательных чисел, лежащих в диапазоне от -1 до -99 | |
Определить сколько элементов массива попадает в интервалы от А до В с шагом (А-В)/5 | |
Проверка, является ли матрица ленточной. | |
Перевод вещественного числа из десятичной системы счисления в восьмеричную | |
Найти на отрезке В-А значение х, при котором значение функции лежит в интервале -0.1 +0.1 Методом деления пополам | |
Вычисление дохода по вкладу в зависимости отстрока хранения и размера вклада. | |
Перевод из шестнадцатеричной системы в двоичную с проверкой правильности введенных символов | |
Перевод вещественного числа из восьмеричной системы счисления в десятичную | |
Программа занесения результатов соревнований спортсменов с определением трех призеров. | |
Проверка, является ли введенная строка шестнадцатеричным числом. | |
Вычисление скалярных произведения двух векторов из набора трех и определение большего из них. | |
Перевод вещественного числа из шестнадцатеричной системы счисления в десятичную | |
Определить номер строки, сумма элементов которой максимальна. | |
Перевод вещественного числа из десятичной системы счисления в шестнадцатеричную | |
Транспонирование матрицы с нахождением суммы всех ее элементов. | |