Тема №3. Циклы, символьный (литерный) тип данных.
Задание: написать программу при помощи оператора цикла for (без применения массивов и прямой адресации курсора) для распечатки на экране монитора указанного в варианте набора символов. Начертить блок-схему к программе.
При выполнении заданий в первую очередь обратите внимание на то, что в языке Си литерный тип данных – это число (один байт). Поэтому с ним можно выполнять все операции, предусмотренные для работы с числами.
Второе – цикл for. Формат использования цикла for имеет следующий вид:
for ( [действие до цикла]; [предусловие цикла]; [последнее действие]).
Любое действие в прямоугольных скобках может отсутствовать. Предусловие (условие выполнения цикла) – это любое действие, результат которого будет интерпретироваться как int. Если результат равен нулю, то условие ложно, в противном случае истинно.
Третье, на что надо обратить внимание – цикл do…while будет повторяться, если условие в конструкции while – истинно.
Примеры выполнения задания по теме №3.
Распечатать на экране монитора таблицу символов, используя только циклы (без использования массивов и строк)
-
A
C
E
G
I
I
A
C
E
G
G
I
A
C
E
E
G
I
A
C
C
E
G
I
A
Используя замеченные закономерности можно предложить следующий алгоритм решения:
-
надо организовать счет по строкам от первой до пятой (цикл по счетчику i), при каждом повторении этого цикла, т.е. внутри него будет выполняться три действия, объединенные в составном операторе:
-
распечатка строки символов (сначала A C E G I, а потом и других),
-
переход на следующую строку,
-
вычисление значения первого символа в следующей строке;
-
в каждой строке необходимо организовать счет (переменная j) по символам (с 1-ого до 5-ого); при каждом повторении цикла будет выполняться три действия (опять нужен составной оператор):
-
будет проверяться значение печатаемого символа (переменная C), и если окажется, что оно больше ‘I’, тогда переменной C присваивается значение ‘A’,
-
значение переменной C выводится на экран монитора,
-
переменной C присваивается новое значение (следующее за следующим, т.е. символы следуют через один).
Как при описании алгоритма, так и по тексту программы, действия внешнего цикла обозначены римскими цифрами, а внутреннего – арабскими. Решение записано в двух вариантах: подробном и сокращенном для демонстрации возможностей цикла for.
#include <conio.h>
#include <stdio.h>
int main() // ПОДРОБНЫЙ ВАРИАНТ ЗАПИСИ ПРОГРАММЫ
{
int i,j; /* Счетчики */
char c='A'; /* Переменная для хранения значения первого символа
в строке */
// Цикл по строкам
for (i=1; i<=5; i++)
{ /* Начало действий внутри цикла по строкам */
/**** I) Печать строки символов */
for (j=1; j<=5; j++)
{ /* Начало тела цикла печати строки */
if (c>'I') c='A'; /*** 1) Проверка значения символа */
printf ("%2c",c); /*** 2) Вывод символа на экран */
c++; c++; /*** 3) Новое значение символа */
} /* Конец тела цикла печати строки */
/**** II) Переход на следующую строку */
printf ("\n");
/**** III) Подготовка первого символа следующей строки */
c--;
c--;
} /* Конец действий внутри цикла по строкам */
getch();
return 0;
}
После подробно описанного алгоритма работы, особенностей, на которые можно было бы обратить внимание в первой программе, совсем немного. Это инициализация переменной C во время объявления и изменение значения литерной переменной C оператором декремента («минус-минус»), хотя С – переменная литерного типа.
Вторая программа (сокращенный вариант записи программы) также содержит особенности свойственные языку Си:
-
переменные i и j - литерного типа, но потом будут использованы как целочисленные;
-
в циклах for использован оператор запятая, позволяющий сделать программу более компактной.
Несмотря на перечисленные особенности, нетрудно заметить, что алгоритм решения задачи и в первом и во втором случае один и тот же.
#include <conio.h>
#include <stdio.h>
int main() // СОКРАЩЕННЫЙ ВАРИАНТ ЗАПИСИ ПРОГРАММЫ
{
char i, j, c;
for (i=1,c='A'; i<=5; printf ("\n"),c-=2,i++)
{
for (j=1; j<=5; c+=2,j++)
{
if (c>'I') c='A';
printf ("%2c",c);
}
}
return 0;
}
Вторая программа рисует ту же таблицу, но используется цикл while и другой алгоритм (см. пример для языка Паскаль):
#include <stdio.h>
#include <conio.h>
char First; /* Первый символ в строке */
char C; /* Текущий символ в строке */
int main()
{
First='K'; /* Первый символ в первой строке */
while (First>='C')
{
/* Печать первой части строки символов */
C=First;
while (C<='I')
{
printf("%2c",C); // Печать очередного символа
C+=2; // Вычисление следующего значения
}
/* Печать второй части строки символов */
C='A';
while (C<First)
{
printf("%2c",C); // Печать символа
C+=2; // Вычисление следующего значения
}
/* Переход на другую строку */
printf("\n");
/* Вычисление значения первого символа */
First-=2;
}
getch();
return 0;
}
Контрольные вопросы к теме № 3
-
Как использовать цикл for в языке Си?
-
Что означают операторы «++», «– –», «+=» и т.д.?
-
Назначение оператора break в языке Си?
-
К какому типу относится цикл for (с пред- или пост- условием)?
-
В чем отличие цикла for в языках Паскаль и Си?
-
Как использовать цикл while?
-
Как использовать цикл do…while?
-
Чем отличаются циклы с пред-и пост-условиями?