
- •Основы алгоритмизации и программирования (лекции)
- •5.1 Процедуры и функции
- •6.1 Файлы
- •8.1 История создания языка
- •Модуль 1. Основы алгоритмизации
- •1.1 Этапы решения задач на эвм.
- •1.2. Алгоритм. Свойства алгоритмов.
- •1.3. Алгоритмическая конструкция ветвления.
- •1.4. Алгоритмическая конструкция цикла.
- •1.5. Использование циклов с параметром для обработки массивов.
- •Модуль 2. Основные конструкции языка Паскаль
- •2.1. История создания языка.
- •2.2. Интегрированная инструментальная оболочка (иио) Turbo Pascal (tp).
- •2.3. Алфавит и программа на tp 7.0.
- •2.4. Простые типы данных.
- •2.5. Константы, переменные и оператор присваивания.
- •2.6. Операторы ввода/вывода.
- •Модуль 3. Управляющие конструкции языка тп
- •3.1. Безусловные конструкции.
- •3.2. Условные конструкции.
- •3.3. Конструкция выбор.
- •3.4. Циклические конструкции.
- •1. Цикл с предусловием.
- •2. Цикл с постусловием.
- •3. Цикл с параметром.
- •Модуль 4. Структурированные типы данных
- •4.1. Массивы.
- •4.2. Сортировка массивов.
- •4.3. Строковый тип данных.
- •4.4. Множества.
- •4.5. Записи.
- •Модуль 5. Процедуры и функции
- •5.1. Процедуры и функции.
- •5.2. Функции пользователя.
- •5.3. Процедуры пользователя.
- •5.4. Использование функций в приближенных вычислениях.
- •5.5. Использование процедур в приближенных вычислениях.
- •5.6. Использование библиотек стандартных процедур в программах. Модуль Crt. Текстовые режимы использования экрана.
- •Модуль 6. Файлы
- •6.1. Файлы.
- •6.2. Сортировка файлов.
- •Модуль 7. Объектно - ориентированное программирование
- •7.1. Тип объект.
- •7.2. Инкапсуляция.
- •7.3. Наследование.
- •7.4. Полиморфизм.
- •Модуль 8. Язык программирования Си
- •8.1. История создания языка.
- •8.2. Структура простой программы на языке Си.
- •8.3. Представление данных в языке Си.
- •8.4. Форматированный ввод/вывод.
- •8.5. Операции, выражения и операторы.
- •8.6. Директивы препроцессора.
- •8.7. Реализация циклов в языке Си.
- •8.8. Условные и безусловные переходы в языке Си.
- •8.9. Использование массивов при реализации циклов.
8.6. Директивы препроцессора.
Одной из самых распространенных директив является директива #define. Эта директива используется для определения назначения указанных в ней идентификаторов. Использование этой директивы внешне похоже на работу с константами. Каждая строка #define состоит из трех частей:
1) сама директива;
2) выбранная вами аббревиатура или идентификатор, который принято называть макрос;
3) подставляемые значения или список замены или тело.
Процесс начинающийся макросом и завершающийся процессом замены, называется макрорасширением.
Пример:
#include
#define TWO 2
#define FOUR TWO*TWO
#define PX printf ("x - это %d, \n", x)
int main (void)
{
int x = TWO;
PX;
x = FOUR;
PX;
}
При исполнении приведенной программы на этапе работы препроцессора происходят следующие замены: строка int x = TWO заменяется на int x = 2; строка PX на printf (…); x = FOUR на x = TWO*TWO, а затем на x = 2*2. На этом процесс макрорасширения заканчивается, т.е. на этапе препроцесса умножение не исполняется, а исполняются только предложенные подстановки.
Результатом работы программы будет вывод двух строк:
x - это 2
x - это 4
При объявлении директивой #define значений превышающих длину строки возможно разбиение значения на несколько строк с использованием символа "\".
Пример:
#include
#define PX printf ("Сегодня первой па\
рой - алгоритмизация.\n")
int main (void)
{
PX
}
Если в приведенном примере перед слогом "рой" поставить несколько пробелов, то они будут выведены в результирующей строке. Используя аргументы директивы #define, можно создавать макросы функции, которые выглядят и действуют подобно функциям.
Пример:
#define SQUARE (x) x*x
Эта директива может быть использована в следующих операторах:
int x = 4;
int z;
1) z = SQUARE (2);
2) z = SQUARE (x);
3) z = SQUARE (x+2);
4) z = 100/SQUARE (2);
На этапе препроцесса первая запись будет заменена на z = 2*2; вторая на z = x*x; третья на z = x+2*x+2; четвертая на 100/2*2. Соответственно результатами будут значения: 4, 16, 14, 100.
Если в третьем случае необходимо исполнения действия (x+2)*(x+2), то подставляемое значение в директиве #define должно быть заменено на (x)*(x). При этом в четвертой записи получим z = 100/(2)*(2). Для исполнения этого действия как 100/(2*2) необходимо в директиве #define записать ((x)*(x)).
Иногда даже предусмотренные предосторожности не позволят обеспечить необходимый результат. Например, если в качестве аргумента используется инкремент или декремент.
8.7. Реализация циклов в языке Си.
Для реализации цикла с предусловием в языке Си используется ключевое слово while. Операторная часть может состоять как из одного оператора, так и из нескольких, объединенных фигурными скобками. В общем виде оператор можно записать так:
while (условие)
{
оператор 1;
оператор 2;
}
Операторная часть цикла повторяется до тех пор, пока условие не станет ложным или равным нулю. При составлении условий могут быть использованы следующие относительные операции: <, <=, ==, >=, >, !=. В условиях также можно использовать логические конструкции, которые в Си имеют следующий вид:
&& - логическое "И"
|| - логическое "ИЛИ"
! - логическое отрицание
Для реализации цикла с параметром используется ключевое слово for. В записи оператора используются 3 выражения, управляющие работой цикла. В общем виде цикл имеет следующую форму:
for (присвоение начального значения; проверяемое выражение; выражение изменяющее значение переменной) оператор;
Выражение присваивающее начальное значение выполняется только один раз перед первым действием в цикле. Затем оценивается проверяемое выражение. Затем вычисляется выражение изменяющее переменную цикла. Цикл for в Си - это цикл с предусловием.
Цикл с постусловием в Си реализуется ключевыми словами do и while. В общем случае оператор можно записать:
do
оператор;
while (условие);
Задача: написать программу выводящую на экран следующую последовательность:
ABCDEF
BCDEF
CDEF
DEF
EF
F
#include
int main (void)
{
const int a = 6;
int i;
char k;
for (i=0; i<6; i++)
{
for (k='A'+i; k<'A'+a; k++)
printf ("%c", k);
printf ("\n");
}
}