Основы алгоритмизации и программирования

Содержание
1. Основы алгоритмизации

1.1 Этапы решения задач на ЭВМ.

Решение задачи разбивается на этапы:
  1. Постановка задачи
  2. Формализация (математическая постановка)
  3. Выбор (или разработка) метода решения
  4. Разработка алгоритма
  5. Составление программы
  6. Отладка программы
  7. Вычисление и обработка результатов
  1. При постановке задачи выясняется конечная цель и вырабатывается общий подход к решению задачи. Выясняется сколько решений имеет задача и имеет ли их вообще. Изучаются общие свойства рассматриваемого физического явления или объекта, анализируются возможности данной системы программирования.
  2. На этом этапе все объекты задачи описываются на языке математики, выбирается форма хранения данных, составляются все необходимые формулы.
  3. Выбор существующего или разработка нового метода решения (очень важен и, в то же время личностный этап).
  4. На этом этапе метод решения записывается применительно к данной задаче на одном из алгоритмических языков (чаще на графическом).
  5. Переводим решение задачи на язык, понятный машине.

1.2. Алгоритм. Свойства алгоритмов.

Алгоритм - это определенным образом организованная последовательность действий, за конечное число шагов приводящая к решению задачи.
Свойства алгоритмов:
  1. Определенность
  2. Дискретность
  3. Целенаправленность
  4. Конечность
  5. Массовость
Порядок выполнения алгоритма:
  1. Действия в алгоритме выполняются в порядке их записи
  2. Нельзя менять местами никакие два действия алгоритма
  3. Нельзя не закончив одного действия переходить к следующему
Для записи алгоритмов используются специальные языки:
  1. Естественный язык (словесная запись)
  2. Формулы
  3. Псевдокод
  4. Структурограммы
  5. Синтаксические диаграммы
  6. Графический (язык блок-схем)
  1. Естественный язык:
    если условие то действие1 иначе действие2
  2. Структурограмма:
    структурограмма
  3. Синтаксическая диаграмма:
    синтаксическая диаграмма
  4. Графический язык:
    графический язык
Составление алгоритмов графическим способом подчиняется двум ГОСТам:
  1. ГОСТ 19.002-80, соответствует международному стандарту ИСО 2636-73. Регламентирует правила составления блок-схем.
  2. ГОСТ 19.003-80, соответствует международному стандарту ИСО 1028-73. Регламентирует использование графических примитивов.
Название Символ (рисунок) Выполняемая функция (пояснение)
1. Блок вычислений
блок 			вычислений
Выполняет вычислительное действие или группу действий
2. Логический блок
логический блок
Выбор направления выполнения алгоритма в зависимости от условия
3. Блоки ввода/вывода
блок ввода/вывода
Ввод или вывод данных вне зависимости от физического носителя
блок 		ввода/вывода
Вывод данных на печатающее устройство
4. Начало/конец (вход/выход)
начало/конец (вход/выход)
Начало или конец программы, вход или выход в подпрограмму
5. Предопределенный процесс
предопределенный процесс
Вычисления по стандартной или пользовательской подпрограмме
6. Блок модификации
блок модификации
Выполнение действий, изменяющих пункты алгоритма
7. Соединитель
соединитель
Указание связи между прерванными линиями в пределах одной страницы
8. Межстраничный соединитель
межстраничный соединитель
Указание связи между частями схемы, расположенной на разных страницах

Правила построения блок-схем:
  1. Блок-схема выстраивается в одном направлении либо сверху вниз, либо слева направо
  2. Все повороты соединительных линий выполняются под углом 90 градусов

1.3. Алгоритмическая конструкция ветвления.

Ветвление - управляющая структура, организующая выполнение лишь одного из двух указанных действий в зависимости от справедливости некоторого условия.
Условие - вопрос, имеющий два варианта ответа: да или нет.
Запись ветвления выполняется в двух формах: полной и неполной.
Полная форма:
полная формаполная форма
Неполная форма:
неполная форманеполная форма
Пример: найти наименьшее из трех чисел.
1 вариант решения:

2 вариант решения:




1.4. Алгоритмическая конструкция цикла.

Цикл - управляющая структура, организующая многократное выполнение указанного действия.

циклы

Цикл "пока":
цикл 'пока'
Выполнение цикла "пока" начинается с проверки условия, поэтому такую разновидность циклов называют циклы с предусловием. Переход к выполнению действия осуществляется только в том случае, если условие выполняется, в противном случае происходит выход из цикла. Можно сказать что условие цикла "пока" - это условие входа в цикл. В частном случае может оказаться что действие не выполнялось ни разу. Условие цикла необходимо подобрать так, чтобы действия выполняемые в цикле привели к нарушению его истинности, иначе произойдет зацикливание.
Зацикливание - бесконечное повторение выполняемых действий.
Цикл "до":
цикл 'до'
Исполнение цикла начинается с выполнения действия. Таким образом тело цикла будет реализовано хотя бы один раз. После этого происходит проверка условия. Поэтому цикл "до" называют циклом с постусловием. Если условие не выполняется, то происходит возврат к выполнению действий. Если условие истинно, то осуществляется выход из цикла. Таким образом условие цикла "до" - это условие выхода. Для предотвращения зацикливания необходимо предусмотреть действия, приводящие к истинности условия.
Цикл с параметром, или цикл со счетчиком, или арифметический цикл - это цикл с заранее известным числом повторов.
цикл с параметром
В блоке модификации указывается закон изменения переменной параметра.
Xo - начальное значение параметра
h - шаг
Xn - последнее значение параметра
Для создания циклов с параметром необходимо использовать правила:
  1. Параметр цикла, его начальное и конечное значения и шаг должны быть одного типа
  2. Запрещено изменять в теле цикла значения начальное, текущее и конечное для параметра
  3. Запрещено входить в цикл минуя блок модификации
  4. Если начальное значение больше конечного, то шаг - число отрицательное
  5. После выхода из цикла значение переменной параметра неопределенно и не может использоваться в дальнейших вычислениях
  6. Из цикла можно выйти не закончив его, тогда переменная параметр сохраняет свое последнее значение

1.5. Использование циклов с параметром для обработки массивов.

Массив - упорядоченная структура, предназначенная для хранения однотипных данных.
Упорядочение элементов в массиве происходит по их индексам.
Индекс - порядковый номер элемента.
Массив задается именем (заглавные латинские буквы), типом данных и размерностью.
Размерность - максимально возможное количество элементов в массиве. В один момент времени можно обратиться только к одному элементу массива. Для этого указывается имя массива и в скобках индекс элемента.
Массивы делятся на одномерные (линейные) и двумерные.
Прообразом в математике для одномерного массива является вектор. Для двумерного - матрица.
Пример: вычислить n!

Пример: вычислить an


Пример: ввести элементы массива:
а)одномерного, размерности 10

б)двумерного, 5x5



2. Язык программирования Си

2.1. История создания языка.

Первая версия языка Си была разработана в 1972 году сотрудником фирмы Bell Laboratories Денисом Ритчи. В это время он и Кен Томбсон занимались разработкой ОС UNIX. В основу языка был положен язык B. Целью создания было: создание инструмента для программистов-практиков. На основе языка Си в дальнейшем были разработаны Си+, Си++ и Java. В 2000 году международной организацией по стандартизации (ISO) и американским институтом национальных стандартов (ANSI) был принят стандарт под именем Си99.
Языку Си присуща высокая степень переносимости. Это означает, что программы, написанные на Си для одной ОС, могут быть легко адаптированы для другой ОС. В настоящее время Си компилируется примерно для 40 ОС.
Чтобы подчеркнуть достоинства языка Си можно сказать, что многие компиляторы и интерпретаторы других языков программирования (Фортран, APL, Pascal, LISP, Basic) написаны на языке Си.
Программы, написанные на языке Си применяются для решения физических и инженерных задач, а также для создания анимационных спецэффектов в кинофильмах. Например, с этой целью Си применялся в фильмах "Гладиатор" и "Звездные войны".
Если сравнивать язык Си с языком Pascal, то можно сделать вывод, что Си дает большую свободу действиям программиста. С другой стороны Си позволяет совершить ошибки, которые в Pascal совершить невозможно.

2.2. Структура простой программы на языке Си.

Программа, записанная на языке Си состоит из совокупности функций, одна из которых - функция main(). () означают, что main - это функция, но не означает, что у нее нет аргументов. Описание функции состоит из заголовка и тела функции. Заголовок содержит операторы препроцессора, например, директиву #include , которая является стандартной частью всех программных компиляторов языка Си. Этот файл содержит информацию об операторах ввода/вывода.
Тело функции заключается в фигурные скобки и состоит из ряда операторов, каждый из которых заканчивается ";".
Пример:
#include
int main (void)   /* простая программа */
{
   int num;   /* определить переменную с именем num*/
   num=1;   /* присвоить переменной num значение*/
   printf ("Я - простой");
   printf (" компьютер ");
   printf ("Моим любимым числом будет %d, поскольку оно…", num);
   return 0;
}

Результатом исполнения программы будет сообщение на экране:
Я - простой компьютер Моим любимым числом будет 1, поскольку оно…

2.3. Представление данных в языке Си.

В языке Си существует несколько разновидностей целочисленных данных. Они различаются диапазоном возможных значений и тем, что могут ли использоваться отрицательные числа. Основным типом целочисленных данных является тип int. К этому типу относятся целые числа со знаком. Диапазон возможных значений зависит от компьютерной системы для хранения данного типа int. Обычно используется одно машинное слово. При объявлении целочисленной переменной указывается ключевое слово, определяющее тип, затем выбранное имя переменной и ставится ";". Несколько переменных можно объявлять в одном операторе, разделяя их имена запятыми. Значение переменной может быть присвоено способом инициализации, т.е. присвоением первоначального значения при объявлении.
Пример:
   int a=21;
   int a=21, b= -2;

Обычно в языке Си предполагается, что целочисленное значение записано в десятичной системе счисления, однако в программировании широко используются восьмеричные и шестнадцатеричные числа. Для того, чтобы отметить в какой системе счисления записано данное, перед ним ставится префикс. Для восьмеричного числа префикс 0, для шестнадцатеричного - 0x. При использовании 8-ой и 16-ой систем следует помнить, что в них представляются числа без знака. В языке Си используются три модификации основного целочисленного типа. Для их объявления используются слова short, long и unsigned.
Данные типа short занимают меньший объем памяти и являются данными со знаком. Данные типа long занимают больший объем памяти и являются данными со знаком. Данные типа unsigned используются для представления только положительных чисел. Их диапазон смещен относительно типа int.
В языке Си при достижении максимального значения происходит сброс на минимальное значение и отсчет от него. Разновидностью целочисленных типов в языке Си являются данные символьного типа - char. Объявляется символьный тип также, как и целочисленный. Записи символьных значений заключаются в кавычки. При присвоении символьного значения можно воспользоваться кодом числа. При этом код записывается без вспомогательных знаков.
Пример:
   char c="a";
   char b=65;

Описанный способ применяется для обозначения непечатаемых символов. В языке Си существуют еще одни "неудобные" символы - управляющие последовательности.

Последовательности Действия
\a предупреждение (звукокой сигнал)
\b возврат на одну позицию
\f перевод страницы
\n перевод строки
\r возврат каретки
\t горизонтальная табуляция
\v вертикальная табуляция
\\ вывести на экран \
\' вывести на экран '
\" вывести на экран "
\0 для вывода 8-го значения
\0x для вывода 16-го значения

Когда символьным переменным присваиваются управляющие последовательности, они должны быть заключены в кавычки.
Ключевые слова, начинающиеся с символа _ включены в компиляторы Си, начиная со стандарта Си99. Так, ключевым словом _bool обозначаются данные логического типа. В языке Си логические данные true принято обозначать 1, а данные false - 0. Таким образом, логические данные являются целочисленными. Т.к. в различных компьютерах используются различные форматы представления слов, то как следствие появляется различие в диапазонах целочисленных значений. Для уточнения диапазонов можно воспользоваться обозначениями 16_t или 32_t, указывающими на 16-битовое или 32-битовое представление слова. Перед словом int можно поставить букву u, указывающую на отсутствие знака в формате представления данных. Для распознания программой введенных обозначений, к ней нужно присоединить файл inttypes.h. При работе с обозначенными типами может возникнуть ситуация, когда конкретная система не поддерживает введенный тип. В связи с этим, в языке Си стандарта Си97 определяется второй набор имен, который гарантирует, что рассматриваемый тип данных будет как минимум достаточно велик, чтобы удовлетворять требованиям спецификации и, по сравнению с другими аналогичными типами, имеет наименьшие размеры. Подобные типы данных именуют данными минимальной ширины. Например, int_least8_t означает наименьший доступный тип данных, хранящий 8-битовое целочисленное значение со знаком. При этом тип может быть реализован как 16-битовое значение.
В некоторых программах необходимо обеспечить максимально-возможную скорость исполнения. Для этой цели в стандарте Си99 имеются типы, называемые быстрейшими типами данных минимальной ширины. Для таких типов используется префикс fast. Например, int_fast8_t. В случае, когда необходимо использовать максимально-возможное по величине целочисленное значение, используются int_max_t или uint_max_t.
В языке Си числа с плавающей точкой относятся к типам float, double и longdouble.
В стандарте Си установлено, что данные типа float должны иметь как минимум 6 значащих цифр и диапазон значений от 10-37 до 1037. Для типа double установлен тот же диапазон значений, а минимальное число значащих цифр увеличено до 10.
Для сообщения о переполнении в стандарте Си99 при выводе значения переменной отображается inf или infinity.
В ситуации связанной с потерей точности образуется т.н. субнормальное значение. Чаще всего это значение отображается как ноль.
В стандарте Си99 появилась поддержка комплексных чисел. Для них существует 3 типа данных: float_complex, double_complex и long double_complex. Все эти типы состоят из двух частей, одна из которых является вещественной, а другая - мнимой частью. При работе с этими типами можно использовать константу I для обозначения квадратного корня из -1.

2.4. Форматированный ввод/вывод.

Задачи ввода/вывода в языке Си решают функции printf() и scanf().
Операторы вывода используются для вывода значений переменных и текста.
Тексты в Си записываются в кавычках. В языке Си отсутствует специальный тип для работы со строками. Вместо этого строки представляются как массив типа char. Элементы строки, хранясь в массиве, записываются в смежные ячейки памяти. В конце строки ставится отметка \0. Наличие этой отметки говорит о том, что строка должна иметь размер на единицу больший, чем количество символов. Объявляется строка указанием типа char и записью размера в [].
Пример:
   char name[40];

Для работы со строками к программе необходимо подключить файл string.h.
Каждая из функций ввода/вывода использует управляющую строку и список аргументов. Управляющая строка записывается первой и заключается в кавычки. Управляющие строки и аргументы не перемешиваются. Управляющие строки прежде всего содержат указание на вывод значения того или иного типа. Их называют спецификаторами преобразования.

Спецификаторы Действия
%a, %A возвращают число с плавающей точкой и 16-е цифры
%c возвращает одиночный символ
%d, %i возвращают целое число в десятичной форме
%e, %E возвращают число с плавающей точкой в экспоненциальной форме
%f возвращает число с плавающей точкой в десятичной форме
%g использует спецификатор %f или %e в зависимости от значения (выбирается автоматически)
%o возвращает восьмеричное целое число без знака
%p вывод указателя в шестнадцатеричном формате
%s возвращает строку символов
%u возвращает десятичное целое число без знака
%x, %X возвращают шестнадцатеричное целое число без знака
%% вывод на печать символа %

Основную спецификацию можно модифицировать вставляя между % и символом преобразования модификаторы.

Модификаторы Действия
цифра/цифры минимальная ширина поля вывода (количество экранных символов)
.цифра точность
h используется при целочисленных преобразованиях для кодирования значений short int и unsigned short int
hh используется при целочисленных преобразованиях для кодирования значений signed char и unsigned char
j используется при целочисленных преобразованиях для получения типов int_max_t и uint_max_t
l используется при целочисленных преобразованиях для получения типа long int и unsigned long int
ll используется при целочисленных преобразованиях для получения типа long long int и unsigned long long int
t используется с целью кодирования значений типа ptroliff_t, который является разностью двух указателей
z используется с целью кодирования значений size_t
L используется при преобразовании чисел с плавающей точкой типа long double
флаг + значения со знаком печатаются со знаком "+" или "-"
флаг - элемент выравнивается по левому краю
флаг пробел значение со знаком "+" печатается с пробелом, но без знака
флаг # для спецификаторов %o, %x, %X выводит не значащие нули. Для форм с плавающей точкой гарантировано печатается точка, даже если десятичных знаков нет
флаг 0 для числовых форм вместо пробелов на свободные экранные места выводятся нули

Ввод данных осуществляется с помощью функции scanf(). В языке Си существует несколько функций ввода. scanf() употребляется чаще других, т.к. ей присущ различный формат ввода. Также как и функция printf(), ввод использует управляющую строку, сопровождаемую списком аргументов. Управляющая строка указывает в какие форматы должен быть преобразован вводимый текст. В качестве параметров функция scanf() использует не сами переменные, а указатели на них. Для использования scanf() необходимо выполнять два правила:
1) если функция используется для считывания значений в переменную основного типа, то перед именем переменной ставится знак &.
2) если значение считывается в символьный массив, то символ & не ставится.
Преобразование одного вводимого данного осуществляется указанием спецификатора преобразования. Если данных вводится несколько, то они разделяются знаком пробела.

Спецификаторы Действия
%c интерпретирует результат ввода в качестве символа
%d интерпретирует результат ввода как десятичное целое число со знаком
%e, %f, %g, %a интерпретирует результат ввода как число с плавающей точкой
%E, %F, %G, %A интерпретирует результат ввода как число с плавающей точкой. Все вводимые символы преобразуются в заглавные
%o интерпретирует результат ввода как восьмеричное целое число со знаком
интерпретирует результат ввода как указатель
%s интерпретирует результат ввода как строку. Ввод начинается с первого символа, не являющегося служебным и включает все символы до следующего служебного
%u интерпретирует результат ввода как целое число без знака
%x, %X интерпретирует результат ввода как шестнадцатеричное целое число со знаком

Между знаком % и символом преобразования могут использоваться модификаторы. Если их более одного, то они должны записываться в порядке, указанном в таблице ниже:

Модификаторы Действия
* подавить присваивание
цифра/цифры максимальная ширина поля ввода. Ввод прекращается когда указанная ширина достигнута или при обнаружении служебного символа
hh определяет считывание целого числа в виде signed char или unsigned char
ll определяет считывание целого числа в виде long long или unsigned long long
L, l, h определяет считывание числа в виде short int, unsigned short int, unsigned long, long, double или long double

2.5. Операции, выражения и операторы.

Основными операциями языка Си считаются +, *, -, /, а также оператор присваивания =. Как и в языке Паскаль, в Си нет возведения в степень. Основные операции выполняются в Си также как и в Паскаль, но имеют несколько дополнений. Так, знак "-" может использоваться как унарная операция, изменяющая знак переменной на противоположный. Особое использование отличает операцию деления. Она может применяться как к целым, так и к вещественным числам. Если результат операции деления должен быть присвоен целочисленной переменной, то дробная часть просто отбрасывается. Это действие называется усечением. Если деление применяется к операндам разного типа, то целочисленное значение преобразуется к виду с плавающей точкой.
Среди наиболее распространенных операций Си можно выделить:
1) sizeof - она возвращает размер операнда, выраженный в байтах. Операндом может быть конкретная данная или тип данных. При использовании последнего, оно записывается в скобках.
2) деление по модулю (%). Используется в целочисленной арифметике. Ее аналогом в Паскаль является функция mod.
3) инкремент (++). Выполняет простое действие: увеличивает значение операнд на 1. Эта операция может быть записана в префиксной форме, когда символ "++" предшествует переменной, и в постфиксной форме, когда "++" следует за переменной. Эти формы различаются последовательностью приращения значения операнда.
Пример:
   a++;
   ++a;
   b=a++;
   b=++a;

Первые два оператора не имеют различий. В третьем примере сначала значение переменной a будет присвоено переменной b, а затем увеличено на 1. В четвертом примере сначала значение переменной a увеличится, а затем присвоится.
4) декремент (--). Существует в префиксной и постфиксной формах. Результат его действия - уменьшение значения оператора на 1.
Операции "++" и "--" имеют очень высокий приоритет исполнения. Выше только исполнение действий в скобках.
В языке Си существует несколько форм оператора присваивания:

Записи Действия
+= к переменной левой части прибавляется величина правой части
-= вычитается величина правой части из значения переменной левой части
*= умножается значение переменной левой части на величину правой части
/= делится значение переменной левой части на величину правой части
%= присваивается переменной левой части остаток от деления левой части на правую

Под выражением в языке Си понимают некоторую комбинацию операций и операндов. Важным свойством выражений является обязательное наличие у него значения. Из операторов языка Си можно составлять блоки. Операторы в блоке объединяются посредством фигурных скобок. Обычно в операторах и выражениях должны использоваться переменные и константы только одного типа. В Си употребление разных типов не прекратит исполнение программы. В этом случае будет активизирован набор правил для автоматического преобразования типов:
1) когда в выражении встречаются типы char и short, они автоматически преобразуются в int. Тип float преобразуется в double. Поскольку такие действия преобразуют к типу, обеспечивающему больший размер данных, то они называются повышением типа.
2) если операция выполняется над данными разных типов, то обе величины преобразуются к высшему из этих типов.
3) последовательность типов, упорядоченных по принципу от высшего к низшему выглядит так: long double, double, float, unsigned long, long, unsigned int, int.
4) в операторе присваивания окончательный результат вычислений преобразуется к типу переменной, которой присваивается вычисленный результат.
По мере возможности требуется избегать автоматического преобразования типов. При составлении выражения вы можете потребовать выполнение того вида преобразования, которое необходимо вам. Этот способ называется привидением типов и определяется следующим образом. Перед заданной величиной в круглых скобках записывается имя требуемого типа данных.
Пример:
   b=(int)3.3+4;


2.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)).
Иногда даже предусмотренные предосторожности не позволят обеспечить необходимый результат. Например, если в качестве аргумента используется инкремент или декремент.

2.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");
   }
}


2.8. Условные и безусловные переходы в языке Си.

В языке Си оператор ветвления в общем виде имеет запись:
if (выражение)
   оператор;

Язык Си допускает использование конструкции if else, которая в общем виде имеет следующую запись:
if (выражение)
   оператор 1;
else
   оператор 2;

Язык Си также разрешает использование конструкции else if. В этом случае может возникнуть неправильное прочтение программы пользователем.
Пример:
if (выражение 1)
   if (выражение 2)
      оператор 1;
   else
      оператор 2;

В языке Си используется стенографическая запись одной из форм ветвления. Эта форма называется условным выражением и записывается условным оператором ?:
В общем виде условный оператор имеет две части и три операнда. Записать его можно следующим способом:
   (выражение1)? выражение2: выражение3;

Пример: требуется определить наибольшую из двух величин:
1 способ:
   if (a<b)
      max = b;
   else
      max = a;

2 способ:
   max = (a<b)?b:a;

Для разрешения ситуации с заранее известным числом исходов в языке Си используется конструкция выбор. В общем виде выбор записывается в следующем виде:
switch (выражение)
{
   case значение1:
      оператор1;
   case значение2:
      оператор2;
   default: оператор3;
}

Выбор в языке Си допускает краткую запись тех значений выражения, для которых исполняется одно и то же действие.
Пример:
switch (выражение)
{
   case значение1:
   case значение2:
      оператор1;
   case значение3:
      оператор2;
}

Язык Си может использовать следующие безусловные переходы или прерывания: break, continue и goto. Их использование в основном совпадает с использованием в Паскаль, а именно: break прерывает исполнение любого вида циклов, continue - завершает текущую итерацию цикла, goto - осуществляет переход по метке. В отличие от языка Паскаль, break может использоваться в Си для завершения выбора. Использование оператора goto в языке Си считается нежелательным. Метки специально не объявляются.

2.9. Использование массивов при реализации циклов.

Само понятие массива в языке Си не изменяется. При объявлении массива указывается общее имя элементов массива, размерность и его тип.
Пример:
   int a[20];

В данном случае последний элемент в массиве будет иметь индекс 19, т.к. обязательно нумерация начинается с нуля. Обращение к одному элементу организуется по имени массива и индексу элемента.
Каждая строка в языке Си является символьным массивом, но не всякий символьный массив является строкой. Строкой считается массив, последним значением которого будет нулевой элемент.