Составные (сложные) данные
· Массив - индексированный набор элементов одного типа.
· Строковый тип - массив, хранящий строку символов.
· Структура - набор различных элементов (полей записи), хранимый как единое целое и предусматривающий доступ к отдельным полям структуры.
Другие типы данных
· Указатель - хранит адрес в памяти компьютера, указывающий на какую-либо информацию, как правило — указатель на переменную.
Программа, написанная на языке Си, оперирует с данными различных типов. Все данные имеют имя и тип. Обращение к данному в программе осуществляется по его имени (идентификатору).
Идентификатор — это последовательность, содержащая не более 32 символов, среди которых могут быть любые буквы латинского алфавита a - z, A - Z, цифры 0 - 9 и знак подчеркивания (_). Первый символ идентификатора не должен быть цифрой.
Несмотря на то, что допускается имя, имеющее до 32 символов, определяющее значение имеют только первые 8 символов. Помимо имени, все данные имеют тип. Указание типа необходимо для того, чтобы было известно, сколько места в оперативной памяти будет занимать данный объект.
Компилятор языка Си придерживается строгого соответствия прописных и строчных букв в именах идентификаторов и лексем.
Верно | Неверно |
int a = 2, b; b = a+3; | Int a=2; // правильно int INT a=2; |
int a = 2, b; b = A + 3; // идентификатор А не объявлен | |
int a = 2; b = a + 3; // идентификатор b не объявлен |
Целочисленные данные могут быть представлены в знаковой и беззнаковой форме.
Беззнаковые целые числа представляются в виде последовательности битов в диапазоне от 0 до 2n-1, где n-количество занимаемых битов.
Знаковые целые числа представляются в диапазоне -2n-1...+2n-1-1. При этом старший бит данного отводится под знак числа (0 соответствует положительному числу, 1 – отрицательному).
Основные типы и размеры целочисленных данных:
Количество бит | Беззнаковый тип | Знаковый тип |
unsigned char 0...255 | char -128...127 | |
unsigned short 0...65535 | short -32768...32767 | |
unsigned int | int | |
unsigned long int | long int |
Вещественный тип предназначен для представления действительных чисел. Вещественные числа представляются в разрядной сетке машины в нормированной форме. Нормированная форма числа предполагает наличие одной значащей цифры (не 0) до разделения целой и дробной части. Такое представление умножается на основание системы счисления в соответствующей степени. Например, число 12345,678 в нормированной форме можно представить как
12345,678 = 1,2345678·104
Число 0,009876 в нормированной форме можно представить как
0,009876 = 9,876·10-3
В двоичной системе счисления значащий разряд, стоящий перед разделителем целой и дробной части, может быть равен только 1. В случае если число нельзя представить в нормированной форме (например, число 0), значащий разряд перед разделителем целой и дробной части равен 0.
Значащие разряды числа, стоящие в нормированной форме после разделителя целой и дробной части, называются мантиссой числа.
В общем случае вещественное число в разрядной сетке вычислительной машины можно представить в виде 4 полей.
знак - бит, определяющий знак вещественного числа (0 для положительных чисел, 1 - для отрицательных).
степень - определяет степень 2, на которую требуется умножить число в нормированной форме. Поскольку степень 2 для числа в нормированной форме может быть как положительной, так и отрицательной, нулевой степени 2 в представлении вещественного числа соответствует величина сдвига, которая определяется как
N-1
где n - количество разрядов, отводимых для представления степени числа.
целое - бит, который для нормированных чисел всегда равен 1, поэтому в некоторых представлениях типов этот бит опущен и принимается равным 1.
мантисса - значащие разряды представления числа, стоящие после разделителя целой и дробной части в нормированной форме.
Различают три основных типа представления вещественных чисел в языке Си:
Тип | Обозна- чение в Си | Кол-во бит | Биты степени | Мантисса | Сдвиг |
простое | float | 30...23 | 22...0 | ||
двойной точности | double | 62...52 | 51...0 | ||
двойной расширенной точности | long double | 78...64 | 62...0 |
Как видно из таблицы, бит целое у типов float и double отсутствует. При этом диапазон представления вещественного числа состоит из двух диапазонов, расположенных симметрично относительно нуля. Например, диапазон представления чисел типа float можно представить в виде:
Пример: представить число -178,125 в 32-разрядной сетке (тип float).
Для представления числа в двоичной системе счисления преобразуем отдельно целую и дробную части:
17810 = 101100102.
0,12510 = 0,0012.Тогда 178,12510 = 10110010,0012=1,0110010001·2111
(для преобразования в нормированную форму осуществляется сдвиг на 7 разрядов влево).
Для определения степени числа применяем сдвиг:
0111111+00000111 = 10000110.
Таким образом, число -178,125 представится в разрядной сетке как
Символьный тип хранит код символа и используется для отображения символов в различных кодировках. Символьные данные задаются в кодах и по сути представляют собой целочисленные значения. Для хранения кодов символов в языке Си используется тип char.
Подробнее о кодировке символов
Логический тип имеет два значения: истина и ложь - применяется в логических операциях, используется при алгоритмических проверках условий и в циклах.
В программе должно быть дано объявление всех используемых данных с указанием их имени и типа. Описание данных должно предшествовать их использованию в программе.
Пример объявления объектов
int n; // Переменная n целого типа
double a; // Переменная a вещественного типа двойной точности
Константы и переменные в языке Си
Константа — это ограниченная последовательность символов алфавита
языка, представляющая собой изображение фиксированного (неизменяемого) объекта.
Константы бывают числовые, символьные и строковые. Числовые константы делятся на целочисленные и вещественные.
Целочисленные константы
Целочисленные данные в языке Си могут быть представлены в одной из следующих систем счисления:
Десятичные | Последовательность цифр (0 — 9), которая начинаются с цифры, отличной от нуля. Пример: 1, -29, 385. Исключение — число 0. |
Восьмеричные | Последовательность цифр (0 — 7), которая всегда начинается с 0. Пример: 00, 071, -052, -03. |
Шестнадцатеричные | Последовательность шестнадцатеричных цифр (0 — 9 и A — F), которой предшествует присутствует 0x. Пример: 0x0, 0x1, -0x2AF, 0x17. |
Двоичная система представления данных непосредственно в языке Си не поддерживается. Однако можно воспользоваться файлом binary.h, в котором определены двоичные константы в пределах байта.
Пример использования двоичной системы счисления в языке Си:
#include <stdio.h>
#include "binary.h"
int main()
{
unsigned char p = b10001001 | b00001010; // p=b10001011=139
printf("p = %dd = %xh", p, p);
getchar(); getchar();
return 0;
}
В зависимости от значения целой константы компилятор присваивает ей тот или иной тип (char, int, long int).
С помощью суффикса U (или u) можно представить целую константу в виде беззнакового целого.
Например, Константе 200U выделяется 1 байт, и старший бит используется для представления одного из разрядов кода числа и диапазон значений становится от 0 до 255. Суффикс L (или l) позволяет выделить целой константе 8 байт (long int).
Совместное использование в любом порядке суффиксов U (или u) и L (или l) позволяет приписать целой константе тип unsigned long int, и она займет в памяти 64 разряда, причем знаковый разряд будет использоваться для представления разряда кода (а не знака).
Вещественные константы
Константа с плавающей точкой (вещественная константа) всегда представляется числом с плавающей точкой двойной точности, т. е. как имеющая тип double, и состоит из следующих частей:
· целой части — последовательности цифр;
· точки - разделителя целой и дробной части;
· дробной части — последовательности цифр;
· символа экспоненты е или E;
· экспоненты в виде целой константы (может быть со знаком).
Любая часть (но не обе сразу) из нижеследующих пар может быть опущена:
· целая или дробная часть;
· точка или символ е (Е) и экспонента в виде целой константы.
Примеры вещественных констант
345.
3.14159
2.1Е5
.123ЕЗ
4037е-5
По умолчанию компилятор присваивает вещественному числу тип double. Если программиста не устраивает тип, который компилятор приписывает константе, то тип можно явно указать в записи константы с помощью следующих суффиксов: F (или f) — float для простых вещественных констант, L (или l) — long double для вещественных констант двойной расширенной точности.
Примеры:
· 3.14159F — константа типа float, занимающая 4 байта;
· 3.14L — константа типа long double, занимающая 10 байт.
Символьные константы
Символьная константа — это один символ, например: 'z'. В качестве символьных констант также могут использоваться управляющие коды, не имеющие графического представления. При этом код управляющего символа начинается с символа '\' (обратный слеш).
Код | Обозначение | Описание |
0x00 | '\0' | Нуль-символ, NULL |
0x07 | '\a' | Звуковой сигнал. |
0x08 | '\b' | Возврат на 1 шаг (Backspace) |
0x09 | '\t' | Горизонтальная табуляция (Tab) |
0x0A | '\n' | Перевод строки (Enter) |
0x0B | '\v' | Вертикальная табуляция (в консоли аналогична переводу строки) |
0x0C | '\f' | Смена страницы |
0x0D | '\r' | Возврат каретки |
Как правило, нажатие клавиши "Enter" генерирует сразу два управляющих символа - перевод строки (0x0A) и возврат каретки (0x0D).
Все символьные константы имеют тип char и занимают в памяти 1 байт. Значением символьной константы является числовое значение её внутреннего кода.
Строковые константы
Строковая константа — это последовательность символов, заключенная в кавычки, например:
"Это строковая константа"
Кавычки не входят в строку, а лишь ограничивают её. Технически строковая константа представляет собой массив символов, и по этому признаку может быть отнесена к разряду сложных объектов языка Си.
В конце каждой строковой константы компилятор помещает '\0' (нуль-символ), чтобы программе было возможно определить конец строки. Такое представление означает, что размер строковой константы не ограничен каким-либо пределом, но для определения длины строковой константы её нужно полностью просмотреть.
Поскольку строковая константа состоит из символов, то она имеет тип char. Количество ячеек памяти, необходимое для хранения строковой константы на 1 больше количества символов в ней (1 байт используется для хранения нуль-символа).
Символьная константа 'x' и строка из одного символа "x" - не одно и то же. Символьная константа - это символ, используемый для числового представления буквы x, а строковая константа "x" содержит символ 'x' и нуль-символ '\0' и занимает в памяти 2 байта. Если в программе строковые константы записаны одна за другой через разделители, то при выполнении программы они будут размещаться в последовательных ячейках памяти.
Переменные
Переменная — идентификатор, представляющий собой изображение изменяемого объекта. C технической точки зрения, переменная — это область памяти, в которую могут помещаться различные значения.
Любая переменная до ее использования в программе на языке Си должна быть объявлена, то есть для нее должны быть указаны тип и имя (идентификатор).
Объявление переменных в Си осуществляется в форме
Тип Переменной Имя Переменной;
Каждую переменную можно снабдить комментарием, поясняющим ее смысл. Например,
int i; // счетчик циклов
Если в программе требуется несколько переменных одного типа, то они могут быть объявлены в одной строке через запятую. Например,
int i, n;
При объявлении переменной ей может быть присвоено начальное значение в форме
Тип Переменной Имя Переменной=значение;
Например,
int i=0, k, n, m=1;
float pi=3.1415, y;
char a='a';
Операции в языке Си
Над объектами в языке Си могут выполняться различные операции:
· операции присваивания;
· операции отношения;
· арифметические;
· логические;
· cдвиговые операции.
Результатом выполнения операции является число.
Операции могут быть бинарными или унарными. Бинарные операции выполняются над двумя объектами, унарные — над одним.
Операция присваивания
Операция присваивания обозначается символом = и выполняется в 2 этапа:
· вычисляется выражение в правой части;
· результат присваивается операнду, стоящему в левой части:
объект = выражение;
Пример:
int a = 4; // переменной a присваивается значение 4
int b;
b = a + 2; // переменной b присваивается значение 6,
// вычисленное в правой части
В случае если объекты в левой и правой части операции присваивания имеют разные типы используется операция явного приведения типа.
объект = (тип) выражение;
float a = 241.5;
// Перед вычислением остатка от деления a приводится к целому типу
int b = (int)a % 2; // b = 1
Операции отношения
Основные операции отношения:
· == эквивалентно — проверка на равенство;
· != не равно — проверка на неравенство;
· < меньше;
· > больше;
· <=меньше или равно;
· >= больше или равно.
Операции отношения используются при организации условий и ветвлений. Результатом этих операций является 1 бит, значение которого равно 1, если результат выполнения операции - истина, и равно 0, если результат выполнения операции - ложь.
Арифметические операции
Основные бинарные операции, расположенные в порядке уменьшения приоритета:
· умножение *;
· деление /;
· сложение +;
· вычитание -;
· остаток от целочисленного деления %.
Основные унарные операции:
· инкрементирование (увеличение на 1) ++;
· декрементирование (уменьшение на 1) --;
· изменение знака -.
Результат вычисления выражения, содержащего операции инкрементирования или декрементирования, зависит от того, где расположен знак операции (до объекта или после него). Если операция расположена до объекта, то сначала происходит изменение значения переменной на 1, а потом это значение используется для выполнения следующих операций. Если операция++ или -- расположена после переменной, то сначала выполняется операция, а потом значение переменной изменяется на
Пример:
int a=2; int b=3; int c; c = a*++b; // c=8, поскольку в операции умножения уже b=4 | int a=2; int b=3; int d; d = a*b++; // d=6, поскольку в операции умножения b=3, следующим действием будет b=4 |
Бинарные арифметические операции могут быть объединены с операцией присваивания:
· объект *= выражение; // объект = объект * выражение
· объект /= выражение; // объект = объект / выражение
· объект += выражение; // объект = объект + выражение
· объект -= выражение; // объект = объект - выражение
· объект %= выражение; // объект = объект % выражение
Логические операции
Логические операции делятся на две группы:
· условные;
· побитовые.
Условные логические операции чаще всего используются в операциях проверки условия if и могут выполняться над любыми объектами. Результат условной логической операции:
· 1 если выражение истинно;
· 0 если выражение ложно.
Вообще, все значения, отличные от нуля, интерпретируются условными логическими операциями как истинные.
Основные условные логические операции:
· && - И (бинарная) — требуется одновременное выполнение всех операций отношения;
· || - ИЛИ (бинарная) — требуется выполнение хотя бы одной операции отношения;
· ! - НЕ (унарная) — требуется невыполнение операции отношения.
Побитовые логические операции оперируют с битами, каждый из которых может принимать только два значения: 0 или 1.
Основные побитовые логические операции в языке Си:
· & конъюнкция (логическое И) - бинарная операция, результат которой равен 1 только когда оба операнда единичны (в общем случае - когда все операнды единичны);
· | дизъюнкция (логическое ИЛИ) - бинарная операция, результат которой равен 1 когда хотя бы один из операндов равен 1;
· ~ инверсия (логическое НЕ) - унарная операция, результат которой равен 0 если операнд единичный, и равен 1, если операнд нулевой;
· ^ исключающее ИЛИ - бинарная операция, результат которой равен 1, если только один из двух операндов равен 1 (в общем случае если во входном наборе операндов нечетное число единиц).
Для каждого бита результат выполнения операции будет получен в соответствии с таблицей.
a | b | a & b | a | b | ~a | a ^ b |
Пример:
unsigned char a = 14; // a = 0000 1110
unsigned char b = 9; // b = 0000 1001
unsigned char c, d, e, f;
c = a & b; // c = 8 = 0000 1000
d = a | b; // d = 15 = 0000 1111
e = ~a; // e = 241 = 1111 0001
f = a ^ b; // f = 7 = 0000 0111
Побитовые операции позволяют осуществлять установку и сброс отдельных битов числа. С этой целью используется маскирование битов. Маски, соответствующие установке каждого бита в байте, представлены в таблице
Бит | Маска |
0x01 | |
0x02 | |
0x04 | |
0x08 | |
0x10 | |
0x20 | |
0x40 | |
0x80 |
Для установки определенного бита необходимо соответствующий бит маски установить в 1 и произвести операцию побитового логического ИЛИ с константой, представляющей собой маску:
unsigned char a = 3;
a = a | 0x04; // a = 7, бит 2 установлен
Для сброса определенного бита необходимо соответствующий бит маски сбросить в 0 и произвести операцию побитового логического И с константой, представляющей собой инверсную маску:
unsigned char a = 3;
a = a & (~0x02); // a = 1, бит 1 сброшен
Бинарные побитовые логические операции могут быть объединены с операцией присваивания:
· объект &= выражение; // объект = объект& выражение
· объект |= выражение; // объект = объект | выражение
· объект ^= выражение; // объект = объект ^ выражение
Сдвиговые операции
Операции арифметического сдвига применяются в целочисленной арифметике и обозначаются как:
· >> - сдвиг вправо;
· << - сдвиг влево.
Общий синтаксис осуществления операции сдвига:
объект = выражение сдвиг Количество Разрядов;
Пример:
unsigned char a=6; // a = 0000 0110
unsigned char b;
b = a >> 1; // b = 0000 0110 >> 1 = 0000 0011 = 3
Арифметический сдвиг целого числа вправо >> на 1 разряд соответствует делению числа на 2.
Арифметический сдвиг целого числа влево << на 1 разряд соответствует умножению числа на 2.
Ввод-вывод в Си
Основной задачей программирования является обработка информации,
поэтому любой язык программирования имеет средства для ввода и вывода информации. В языке Си нет операторов ввода-вывода.
Ввод и вывод информации осуществляется через функции стандартной библиотеки. Прототипы рассматриваемых функций находятся в файле stdio.h. Эта библиотека содержит функции
· printf() - для вывода информации
· scanf() - для ввода информации.
Вывод информации
Функция printf() предназначена для форматированного вывода. Она переводит данные в символьное представление и выводит полученные изображения символов на экран. При этом у программиста имеется возможность форматировать данные, то есть влиять на их представление
на экране.
Общая форма записи функции printf():
printf("СтрокаФорматов", объект1, объект2, ..., объектn);
СтрокаФорматов состоит из следующих элементов:
· управляющих символов;
· текста, представленного для непосредственного вывода;
· форматов, предназначенных для вывода значений переменных различных типов.
Объекты могут отсутствовать.
Управляющие символы не выводятся на экран, а управляют расположением выводимых символов. Отличительной чертой управляющего символа является наличие обратного слэша'\' перед ним.
Основные управляющие символы:
· '\n' — перевод строки;
· '\t' — горизонтальная табуляция;
· '\v' — вертикальная табуляция;
· '\b' — возврат на символ;
· '\r' — возврат на начало строки;
· '\a' — звуковой сигнал.
Форматы нужны для того, чтобы указывать вид, в котором информация будет выведена на экран. Отличительной чертой формата является наличие символа процент '%' перед ним:
· %d — целое число типа int со знаком в десятичной системе счисления;
· %u — целое число типа unsigned int;
· %x — целое число типа int со знаком в шестнадцатеричной системе счисления;
· %o — целое число типа int со знаком в восьмеричной системе счисления;
· %hd — целое число типа short со знаком в десятичной системе счисления;
· %hu — целое число типа unsigned short;
· %hx — целое число типа short со знаком в шестнадцатеричной системе счисления;
· %ld — целое число типа long int со знаком в десятичной системе счисления;
· %lu — целоечислотипа unsigned long int;
· %lx — целое число типа long int со знаком в шестнадцатеричной системе счисления;
· %f — вещественный формат (числа с плавающей точкой типа float);
· %lf — вещественный формат двойной точности (числа с плавающей точкой типаdouble);
· %e — вещественный формат в экспоненциальной форме (числа с плавающей точкой типа float в экспоненциальной форме);
· %c — символьный формат;
· %s — строковый формат.
Пример
int a=5;
float x = 2.78;
printf("\n Значение переменной a=%d", a);
printf("\n Значение переменной x=%f", x);
Результат работы программы
Значение переменной a=5
Значение переменной x=2.780000
При указании формата можно явным образом указать общее количество знакомест и количество знакомест, занимаемых дробной частью.
Пример
float y=1.2345;
printf("\n Значение переменной y=%10.5f\n", y);
Результат работы программы
Значение переменной y= 1.23450
В приведенном примере 10 — общее количество знакомест под значение переменной; 5 — количество позиций после десятичной точки. В указанном примере количество знакомест в выводимом числе меньше 10, поэтому свободные знакоместа слева от числа заполняются пробелами. Такой способ форматирования часто используется для построения таблиц.
Ввод информации
Функция форматированного ввода данных с клавиатуры scanf() выполняет чтение данных, вводимых с клавиатуры, преобразует их во внутренний формат и передает вызывающей функции. При этом программист задает правила интерпретации входных данных с помощью спецификаций форматной строки.
Общая форма записи функции scanf( )
scanf ("Cтрока Форматов", адрес1, адрес2,...);
Строка форматов аналогична функции printf(). Для формирования адреса переменной используется символ амперсанд '&':
адрес = &объект
Строка форматов и список аргументов для функции обязательны.
Пример
#include <stdio.h>
#include <stdlib.h>
int main()
{
float y;
system("chcp 1251");
system("cls");
printf("Введите y: ");
scanf("%f",&y); // Ввод значения переменной y
printf("Значение переменной y=%f",y);
getchar(); getchar();
return 0;
}
Условные операторы в Си
Разветвляющимся называется такой алгоритм, в котором выбирается один из нескольких возможных вариантов вычислительного процесса. Каждый подобный путь называется ветвью алгоритма.
Признаком разветвляющегося алгоритма является наличие операций проверки условия. Чаще всего для проверки условия используется условный оператор if.
Условный оператор if
Условный оператор if может использоваться в Фоме полной или неполной развилки.
Неполная развилка | Полная развилка |
if(условие){ блок операций; } | if(условие){ блок операций 1; } else { блок операций 2; } |
В случае неполной развилки если условие истинно, то блок операций выполняется, если условие ложно, то блок операций не выполняется.
В случае полной развилки если условие истинно, то выполняется блок операций 1, иначе выполняется блок операций 2.
Блок операций может состоять из одной операции. В этом случае наличие фигурных скобок, ограничивающих блок, необязательно.
Пример
#include <stdio.h>
int main() {
int k;
printf("k= ");
scanf("%d",&k);
if(k >= 5) {
printf("%d >= 5", k);
} else {
printf("%d < 5", k);
}
getchar(); getchar();
return 0;
}
Оператор if может быть вложенным.
Пример:
#include <stdio.h>
#include <stdlib.h>
int main() {
int key;
system("chcp 1251");
system("cls");
printf("Введите номер пункта, 1 или 2: ");
scanf("%d",&key);
if (key == 1)
printf("\n Выбран первый пункт");
else if (key == 2)
printf("\n Выбранвторойпункт");
else
printf("\n Первый и второй пункты не выбраны");
getchar(); getchar();
return 0;
}
При использовании вложенной формы оператора if опция else связывается с последним оператором if. Если требуется связать опцию else с предыдущим оператором if, внутренний условный оператор заключается в фигурные скобки:
if (key!= 1) {
if (key == 2)
printf("\n Выбранвторойпункт");
} else
printf("\n Выбран первый пункт");
Тернарные операции
Тернарная условная операция имеет 3 аргумента и возвращает свой второй или третий операнд в зависимости от значения логического выражения, заданного первым операндом. Синтаксис тернарной операции в языке Си
условие ? выражение1 : выражение2;
Если выполняется условие, то тернарная операция возвращает выражение1, в противном случае - выражение2.
Тернарные операции, как и операции условия, могут быть вложенными. Для разделения вложенных операций используются круглые скобки.
Приведенный выше пример с использованием тернарных операций можно представить в виде
#include <stdio.h>
#include <stdlib.h>
int main() {
int key;
system("chcp 1251");
system("cls");
printf("Введите номер пункта, 1 или 2: ");
scanf("%d",&key);
key == 1 ? printf("\n Выбранпервыйпункт") :
(key==2 ? printf("\n Выбран второй пункт") :
printf("\n Первый и второй пункты не выбраны")) ;
getchar(); getchar();
}
Оператор ветвления switch (оператор множественного выбора)
Оператор if позволяет осуществить выбор только между двумя вариантами. Для того, чтобы производить выбор одного из нескольких вариантов необходимо использовать вложенный оператор if. С этой же целью можно использовать оператор ветвления switch.
Общая форма записи
switch (целое выражение) {
case константа1: блок операций1;
break;
case константа2: блок операций2;
break;
. . .
case константаn: блок операцийn;
break;
default: блок операций по умолчанию;
break;
}
Оператор ветвления switch выполняется следующим образом:
· вычисляется целочисленное выражение в скобках оператора switch;
· полученное значение сравнивается с метками (константами) в опциях case, сравнение производится до тех пор, пока не будет найдена метка, соответствующая вычисленному значению целочисленного выражения;
· выполняется оператор соответствующей метки case;
· если соответствующая метка не найдена, то выполнится оператор в опции default.
Альтернатива default может отсутствовать, тогда не будет произведено никаких действий.
Опция break; осуществляет выход из оператора switch и переход к следующему за ним оператору. При отсутствии опции break будут выполняться все операторы, начиная с помеченного данной меткой и кончая оператором в опции default.
Константы в опциях case должны быть целого типа (могут быть символами).
Пример: Вывести день недели по его номеру
Назад
Задача Вывести название дня недели по его номеру
Программа представляет собой сопоставление числового значения и соответствующей ему текстовой строки. Для реализации таких конструкций чаще всего используется оператор ветвления switch.
Реализация
#include <stdio.h>
#include <stdlib.h>
int main() {
int day;
system("chcp 1251");
system("cls");
printf("Введите номер дня недели: ");
scanf("%d", &day);
switch (day) {
case 1:
printf("понедельник");
break;
case 2:
printf("вторник");
break;
case 3:
printf("среда");
break;
case 4:
printf("четверг");
break;
case 5:
printf("пятница");
break;
case 6:
printf("суббота");
break;
case 7:
printf("воскресенье");
break;
default:
printf("Неверно введен день недели");
break;
}
getchar(); getchar();
return 0;
}
Операторы цикла в языке Си
Циклом называется блок кода, который для решения задачи требуется повторить несколько раз.
Каждый цикл состоит из
· блока проверки условия повторения цикла
· тела цикла
Цикл выполняется до тех пор, пока блок проверки условия возвращает истинное значение.
Тело цикла содержит последовательность операций, которая выполняется в случае истинного условия повторения цикла. После выполнения последней операции тела цикла снова выполняется операция проверки условия повторения цикла. Если это условие не выполняется, то будет выполнена операция, стоящая непосредственно после цикла в коде программы.
В языке Си следующие виды циклов:
· while - цикл с предусловием;
· do...while - цикл с постусловием;
· for - параметрический цикл (цикл с заданным числом повторений).
Цикл с предусловием while
Общая форма записи
while(выражение) {
блок операций;
}
Если выражение истинно (не равно нулю), то выполняется блок операций, заключенный в фигурные скобки, затем выражение проверяется снова. Последовательность действий, состоящая из проверки и выполнения блока операций, повторяется до тех пор, пока выражение не станет ложным (равным нулю). При этом происходит выход из цикла, и производится выполнение операции, стоящей после оператора цикла.
Пример
int k=5;
int i=1;
int sum=0;
while(i <=k)
{
sum = sum + i;
i++;
}
При построении цикла while, в него необходимо включить конструкции, изменяющие величину проверяемого выражения так, чтобы в конце концов оно стало ложным (равным нулю). Иначе выполнение цикла будет осуществляться бесконечно (бесконечный цикл), например
while(1) {
блок операций;
}
while — цикл с предусловием, поэтому вполне возможно, что тело цикла не будет выполнено ни разу если в момент первой проверки проверяемое условие окажется ложным.
Пример
int k=5;
int n=10;
while(k>n)
{
printf(" k=%d n=%d \n", k, n);
k = k + 2;
}