
- •1. Общие правила выполнения лабораторных работ
- •2. Программное обеспечение, используемое для выполнения лабораторных работ
- •3. Лабораторная работа № 1. Создание простейшего консольного приложения C
- •3.1. Задание
- •3.2. Методические указания по выполнению лабораторной работы
- •3.2.1. Создание проекта консольного приложения
- •3.2.2. Открытие существующего проекта
- •3.2.3. Редактирование функции main Вашего проекта
- •3.2.4. Компиляция и сборка проекта
- •3.2.5. Пробный запуск проекта из интегрированной среды CodeBlocks
- •3.2.6. Запуск откомпилированного исполнительного файла проекта непосредственно из операционной системы
- •4.1. Задание
- •4.2. Методические указания по выполнению лабораторной работы
- •4.2.1.1. Создание переменных
- •4.2.1.2. Ввод значения входной переменной с клавиатуры
- •4.2.1.3. Выполнение арифметических вычислений
- •4.2.1.4. Вывод результата вычисления
- •4.2.1.5. Пример исходного текста программы
- •4.2.2. Использование переменных с модификатором const в исходных текстах приложений
- •5. Лабораторная работа № 3. Использование оператора выбора и преобразования типов значений переменных
- •5.1. Задание
- •5.2. Методические указания по выполнению лабораторной работы
- •5.2.1. Создание проекта приложения
- •5.2.3. Преобразование сигнала АЦП из целочисленного формата в формат с плавающей десятичной точкой и его масштабирование
- •5.2.4. Вычисление значения физического параметра (температуры) по значению напряжения на выходе датчика
- •5.2.5. Вывод вычисленного значения физического параметра (температуры) на дисплей
- •6. Лабораторная работа № 4. Использование оператора переключателя switch
- •6.1. Задание
- •6.2. Методические указания по выполнению лабораторной работы
- •6.2.1. Создание проекта консольного приложения
- •6.2.2. Ввод с клавиатуры символа - шестнадцатеричной цифры, которую требуется преобразовать в числовой формат
- •6.2.3. Преобразование ASCII-символа шестнадцатеричной цифры в числовой формат
- •6.2.4. Вывод результата преобразования
- •6.2.5. Ввод с клавиатуры произвольного символа и завершение работы приложения
- •7. Лабораторная работа № 5. Создание и использование пользовательских функций
- •7.1. Задание
- •7.2. Методические указания по выполнению лабораторной работы
- •7.2.1. Создание проекта консольного приложения
- •7.2.2. Ввод с клавиатуры символа - шестнадцатеричной цифры, которую требуется преобразовать в числовой формат
- •7.2.3. Создание и вызов функции преобразования кода ASCII-символа в число
- •7.2.3.1. Общий порядок создания и вызова функции
- •7.2.3.2. Использование функции для получения числового значения шестнадцатеричной цифры
- •7.2.4. Вывод на дисплей результата вычисления
- •7.2.5. Ввод с клавиатуры произвольного символа и завершение работы приложения
- •8.1. Методические указания по выполнению лабораторной работы
- •8.1.1. Создание проекта консольного приложения
- •8.1.2. Ввод с клавиатуры символа - шестнадцатеричной цифры, которую требуется преобразовать в числовой формат
- •8.1.3. Создание и вызов функции, размещенной в отдельном файле исходного текста
- •8.1.3.1. Создание нового файла исходного текста и размещение в нем пользовательской функции
- •8.1.3.2. Создание нового файла заголовка и подключение его к проекту
- •8.1.4. Вывод на дисплей результата вычисления
- •8.1.5. Ввод с клавиатуры произвольного символа и завершение работы приложения
- •9. Лабораторная работа №7. Использование массивов, структур и указателей
- •9.1. Методические указания по выполнению лабораторной работы
- •9.1.1. Создание проекта приложения
- •9.1.3. Создание пользовательского типа данных - структуры
- •9.1.4. Подключение файла-заголовка к проекту
- •9.1.5. Создание файла исходного текста и подключение его к проекту
- •9.1.6. Создание функции, выполняющей вычисление значения линейной функции по значению ее аргумента
- •9.1.7. Создание функции, выполняющей поиск линейного отрезка, на котором находится аргумент линеаризуемой функции, и вычисление ее (линеаризуемой функции) значения
- •9.1.7.1. Оператор итерационного цикла for
- •9.1.7.2. Оператор цикла с предусловием while
- •9.1.7.3. Оператор цикла с постусловием do while
- •9.1.7.4. Передача функции вычисления значения линейной функции указателей на используемые элементы массива
- •9.1.8. Создание в файле заголовка прототипа функции
- •9.1.9. Создание константного одномерного массива, содержащего параметры граничных точек линейных отрезков линеаризуемой функции
- •9.1.10. Определение размера массива
- •9.1.11. Объявление объекта данных как глобального
- •9.1.12. Вызов функции MultyLinearFuncCalc из файла main.cpp
- •9.1.13. Вывод результата вычислений и завершение работы приложения
имя_указателя_на_структуру -> имя_поля
Рассмотрим пример использования указателей структур как параметров функции Предположим, что требуется создать функцию, вычисляющую площадь прямоугольника. Параметры прямоугольника (его высота и ширина) находятся в структуре, тип которой ранее определен в файле заголовка проекта и имеет следующий вид:
typedef struct |
|
|
|
{ |
// |
Высота |
прямоугольника. |
int A; |
|||
int B; |
// |
Ширина |
прямоугольника. |
} ExampleStructType; |
|
|
|
Функция должна умножить высоту прямоугольника на его ширину и вернуть результат. Исходный текст функции имеет следующий вид:
int ExampleFunc ( ExampleStructType *ExampleStruct)
{
return ExampleStructType->A * ExampleStructType->B;
}
9.1.7.Создание функции, выполняющей поиск линейного отрезка, на котором находится аргумент линеаризуемой функции, и вычисление ее (линеаризуемой функции) значения
Для для определения отрезка, на котором находится аргумент линеаризуемой функции, предполагается использовать одномерный константный массив, состоящий из элементов - структур типа LinearArrayType, содержащих параметры граничных точек отрезков линеаризации функции в порядке возрастания ее аргументов. Процесс создания такого массива рассмотрен далее в разделе 9.1.9. методических указаний.
Для передачи функции в качестве аргумента массива модно использовать следующее свойство массива - имя массива является указателем на первый элемент массива. Поэтому имя функции при его определении может иметь следующий вид (в случае, если тип используемых данных имеет тип float):
float MultyLinearFuncCalc ( float X, \
LinearArrayType const *PFuncArray, \
unsigned int FuncArraySize)
где:
Xаргумент линеаризуемой функции, для которой требуется вычислить ее значение;
PFuncArray |
указатель на первый элемент массива - в него подставляется имя массива, |
|
содержащего значения точек линеаризуемой функции; |
FuncArraySize |
размер (количество элементов) массива PFuncArray. |
Массив, передаваемый функции в качестве аргумента, должен содержать значения граничных точек линейных отрезков линеаризуемой функции, взятые из таблиц 10 - 17 в соответствии с Вашим вариантом работы. Значения должны размещаться в массиве в порядке возрастания аргументов функции (то есть в том же порядке, в котором они приведены в таблице).
69
Определение отрезка, на котором находится аргумент функции, может быть выполнено простым перебором. Выполняется последовательное сравнение верхних границ линейных отрезков (то есть значений X полей входного массива, начиная с элемента массива с индексом 1) до
тех пор, пока не будет найден элемент, в котором значение поля X превышает значение аргумента
функции для искомой точки. Этот элемент будет являться верхней границей линейного отрезка, а предыдущий элемент массива - нижней границей данного отрезка. В случае, если даже последний элемент массива окажется меньше аргумента функции для искомой точки, для вычисления должен использоваться последний отрезок (то есть последний и предпоследний элементы массива).
Для выполнения последовательного просмотра элементов массива необходимо использовать один из операторов цикла C. В C поддерживаются следующие операторы цикла:
1.Оператор итерационного цикла for.
2.Оператор цикла с предусловием while.
3.Оператор цикла с предусловием do while.
9.1.7.1. Оператор итерационного цикла for
Имеет следующую структуру:
for (инициализация_цикла; выражение_условие; список_выражений)
{
тело_цикла
}
где:
инициализация_цикла
последовательность определений и описаний, выполняемая однократно в начале цикла. Обычно инициирует счетчик цикла и присваивает ему начальное значение;
выражение_условие |
условие продолжения цикла. Если его результат не равен нулю |
|
(истинен), выполняется очередной шаг цикла, если нет - цикл |
|
завершается; |
список_выражений |
выражения, выполняемые на каждом шаге цикла после |
|
выполнения тела цикла. Обычно используется для приращения |
|
счетчика цикла. |
тело_цикла |
Операции, выполняемые на каждом шаге цикла. |
Рассмотрим пример использования итерационного цикла. Имеется массив ExampleArray, определенный в пункте 9.1.9. Количество его элементов содержит переменная ArraySize (см. пункт 9.1.10.). Требуется просмотреть этот массив и найти элемент, значение поля A которого превышает значение переменной A1, определенной ранее и имеющей тип int.
... |
// Счетчик циклов поиска. |
unsigned int i; |
for (i = 1; A1 > ExampleArray [i].A; )
// Цикл просмотра элементов массива. // Условием завершения цикла // является то, что значение
// очередной граничной точки отрезка // стало меньше, чем аргумент // функции в искомой точке.
70
|
// |
Поиск выполняется не с элемента |
|
// |
0, а с элемента 1 массива - |
|
// |
верхней границы первого отрезка. |
|
// |
Никаких действий по |
|
// |
инкрементированию счетчика здесь |
{ |
// |
не выполняется. |
|
|
|
// Тело цикла. |
|
Приращение счетчика элементов |
if (i < (ArraySize - 1)) i++; // |
||
|
// |
массива, если верхняя граница |
|
// |
последнего отрезка еще не |
else break; |
// |
достигнута. |
// |
Завершение цикла, если выполнена |
|
|
// |
проверка верхней границы |
} |
// |
последнего отрезка. |
|
|
|
... |
|
|
По завершении этого цикла переменная i будет содержать индекс элемента массива ExampleArray, поле A которого превышает значение переменной A1, либо максимально возможный индекс отрезка.
9.1.7.2. Оператор цикла с предусловием while
Имеет следующую структуру:
while (выражение_условие)
{
тело_цикла
}
Вначале проверяется выражение_условие. Если его результат не равен 0 (истенен), выполняется тело_цикла, в противном случае цикл завершается. По завершении выполнения тела цикла вновь проверяется выражение_условие.
Рассмотрим выполнение с помощью данного оператора того же примера, что и для оператора for (см. раздел 9.1.7.1.).
... |
// |
Определение переменной — счетчика |
unsigned int i = 1; |
||
|
// |
циклов и присвоение ей начального |
|
// |
значения - индекса элемента |
|
// |
массива, содержащего верхнюю |
|
// |
границу первого линейного |
while (A1 > ExampleArray [i].A) |
// |
отрезка. |
// |
Проверка условия завершения цикла |
|
|
// |
- обнаружения элемента массива, |
|
// |
значение поля A которого |
{ |
// |
превышает значение переменной A1. |
|
|
|
// Тело цикла. |
|
Приращение счетчика элементов |
if (i < (ArraySize - 1)) i++; // |
||
|
// |
массива, если верхняя граница |
|
// |
последнего отрезка еще не |
else break; |
// |
достигнута. |
// |
Завершение цикла, если выполнена |
71
// проверка верхней границы // последнего отрезка.
}
...
9.1.7.3. Оператор цикла с постусловием do while
Имеет следующую структуру:
do
{
тело_цикла
} while (выражение_условие);
Цикл будет выполняться до тех пор, пока выражение условие не равно 0 (истинно).
Рассмотрим для данного оператора выполнение того же примера, что и для двух предыдущих операторов цикла (см. разделы 9.1.7.1., 9.1.7.2.).
... |
// |
Определение переменной — счетчика |
unsigned int i = 0; |
||
|
// |
цикла, и присвоение ей начального |
|
// |
значения, на 1 меньшего индекса |
|
// |
массива для верхней точки первого |
do |
// |
линейного отрезка. |
|
|
|
{ |
|
|
// Тело цикла. |
|
Приращение счетчика элементов |
if (i < (ArraySize - 1)) i++; // |
||
|
// |
массива, если верхняя граница |
|
// |
последнего отрезка еще не |
else break; |
// |
достигнута. |
// |
Завершение цикла, если выполнена |
|
|
// |
проверка верхней границы |
|
// |
последнего отрезка. |
} while (A1 > ExampleArray [i].A); // |
Проверка условия завершения цикла |
|
|
// |
- обнаружения элемента массива, |
|
// |
значение поля A которого |
... |
// |
превышает значение переменной A1. |
|
|
9.1.7.4. Передача функции вычисления значения линейной функции указателей на используемые элементы массива
После определения отрезка, на котором находится аргумент линеаризуемой функции, исходный код функции MultyLinearFuncCalc должен вызвать функцию LinearFuncCalc
(см. пункт 5. задания, раздел 9.1.6. методических указаний). При вызове функции ей неободимо передать в качестве параметров указатели на структуры типа LinearArrayType (см. пункт 3.
задания) - элементы массива PFuncArray (см. пункт 6. задания), являющиеся крайними точками
найденного отрезка. Любой элемент массива является самостоятельной переменной, имеющей свой адрес. Получить адрес любой переменной можно с помощью операции разименовывания "&",
имеющей следующий вид:
&переменная
72