среда, 17 мая 2017 г.

Операции, выражения, операторы и циклы в языке Си



Программа на языке С состоит из одной или большего числа функций Си. Каждая программа на Си должна содержать функцию по имени main(), поскольку именно эта функция всегда вызывается при запуске программы. (Думаю это связано с тем, что вся информация в компьютере храниться в виде чисел - int main() тип данных функции - целые числа.)

Каждый ОПЕРАТОР языка Си является ИНСТРУКЦИЕЙ компьютеру и обязательно заканчивается точкой с запятой.
ОПЕРАТОР ОБЪЯВЛЕНИЯ - назначает переменной имя и определяет тип данных, которые будут  храниться в этой переменной.
Имя переменной может служить идентификатором.
ОПЕРАТОР ПРИСВАИВАНИЯ - устанавливает значение переменной или область хранения.
ОПЕРАТОР ВЫЗОВА ФУНКЦИИ - запускает на выполнение функцию с указанным именем.
ПЕРЕМЕННАЯ ЭТО ВСЕГО ЛИШЬ ИМЯ ВЫДЕЛЕННОЙ ЯЧЕЙКИ ПАМЯТИ КОМПЬЮТЕРА, КОТОРОЕ МОЖНО ИЗМЕНИТЬ, ПОЭТОМУ НАЗЫВАЕТСЯ ПЕРЕМЕННОЙ КОНСТАНТА - ДАННЫЕ КОТОРЫЕ ХРАНЯТЬСЯ В ЯЧЕЙКЕ.

КАК ПЕРЕМЕННЫЕ ПОЛУЧАЮТ ЗНАЧЕНИЯ?
1) ОПЕРАТОР ПРИСВАИВАНИЯ cows = 112;
2) ПОЛУЧЕНИЕ ПЕРЕМЕННОЙ ЗНАЧЕНИЯ ИЗ ФУНКЦИИ

АРГУМЕНТ - ЭЛЕМЕНТЫ ИНФОРМАЦИИ, ПЕРЕДАВАЕМОЙ ФУНКЦИИ.
ФУНКЦИИ printf() и  scanf() не ограничены конкретным количеством аргументов.
Аргументы отделяются друг от друга запятыми.

Способов обработки данных. Для этих целей язык Си предлагает множество различных операций. Вы можете выполнять арифметические операции, сравнивать значения,  обновлять значения переменных, логически комбинировать отношения и делать многое другое. Начнем с арифметических операций - сложения, вычитания, умножения и деления.
Другим аспектом обработки данных является организация ваших программ с тем, чтобы о ни выполняли правильные действия в нужном порядке.

КОНСТАНТЫ
Константы - данные значения которых устанавливаются до начала выполнения программы и сохраняются неизменными в течение всего времени работы программы.

ПЕРЕМЕННЫЕ
Переменные - данные которые могут изменяться (в частности, путем присваивания новых значений) в ходе выполнения программы.

ОПЕРАТОР - обозначает действие. Операторы проделывают работу над переменными.
Используется:
- оператор объявления, определяющий имя и тип переменной
- оператора присваивания устанавливающий значение переменной
- оператор вывода
- оператор вызова функции
- оператор возврата

ДАННЫЕ
Основные типы данных:
- числа
- буквы
- символы

ОПЕРАНД (англ. operand) в языках программирования ― аргумент операции; данные, которые обрабатываются командой; грамматическая конструкция, обозначающая выражение, задающее значение аргумента операции. Иногда операндом называют место, позицию в тексте, где должен стоять аргумент операции. Отсюда понятие местности операции, то есть числа аргументов операции.
пример
sin x -> x -операнд
a+b -> a и b -> операнды

Операнд над чем производится действие.
ОПЕРАНД может быть
- объект данных как имя переменной
- либо как тип

ОБЪЕКТ ДАННЫХ - это ОБЛАСТЬ ХРАНЕНИЯ ДАННЫХ, КОТОРАЯ МОЖЕТ ПРИМЕНЯТЬСЯ ДЛЯ УДЕРЖАНИЯ ЗНАЧЕНИЙ.
ОБЪЕКТ - это ОБЛАСТЬ ХРАНЕНИЯ ДАННЫХ.

Для ИДЕНТИФИКАЦИЯ ОБЪЕКТА (ОБЛАСТИ ХРАНЕНИЯ ДАННЫХ) используются ИМЯ ПЕРЕМЕННОЙ также
- УКАЗАТЬ ЭЛЕМЕНТ МАССИВА - включает адрес объекта

const - позволяет создавать объект, значение которого не может изменяться.

ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННЫХ
Инициализация переменных - значит присвоить ей начальное значение.
Операция присваивания (=)
int hogs = 21;
int cows = 32; goats = 14;

МЕТОДЫ ОБРАБОТКИ ДАННЫХ
- арифметические операции
- сравнения
- обновление переменных
- логические операции

Введение в циклы
Язык Си предлагает несколько методов выполнения повторных вычислений, и здесь мы рассмотрим один из них. Этот метод, получивший название цикла while

/*СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ определяет каким образом данные преобразуется в отображаемую форму*/
%d //СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ десятичное число со знаком
%f       //число с плавающей запятой, десятичное представление
%c       //одиночный символ
%s       //интерпретирует введенные данные как строку
%e       //Экспонициальная форма
%a       //Двоично-экспонициальное представление

&         //спецификатор где можно найти переменную 

//ПРИМЕР 1
/*Программа преобразует часы в минуты*/
#include <stdio.h>     //КОМАНДА ПРЕПРОЦЕССОРА - подключение файла стандартной библиотеки С stdio.h                                                 содержит библиотеку функций ввода-вывода
#define MIN 60

int main(void)             //ОБЪЯВЛЕНИЕ ФУНКЦИИ с именем main() - главная функция, каркас программы на С
                                   //int - ф-ция возвращает целое число, void - ф-ция не принимает аргументов
{
           int hours, minutes;      //ОПЕРАТОР ОБЪЯВЛЕНИЯ. Инициализация переменной. Тип данных целые                                                                     числа.
            printf("Перевод часов в минуты \n");
           printf("Введите часы\n");       //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() - функция ВЫВОД                                                                                      ДАННЫХ НА ЭКРАН.
           
            /*получить входные данные от пользователя*/
            scanf("%d", &hours);             //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем scanf() - ВВОД ДАННЫХ                                                                                    с   клавиатуры
                                                           //&hours -> что введенное число будет присвоено переменной по имени                                                                                   hours
                                                                               //(& амперсанд) для указания на то, где можно найти переменную hours
            /*цикл с условием*/                        
                                                           //Спецификатор %d показывает, что переменная вводится как десятичное                                                                                 число
            while (hours > 0)                    //ЦИКЛ - while обеспечивает возможность повторного ввода значения и                                                                                  для  ПРЕКРАЩЕНИЯ ЦИКЛА 
            {                                                                                                                                                                   //ЕСЛИ ВВОДИТСЯ ЗНАЧЕНИЕ ВРЕМЕНИ МЕНЬШЕЕ ИЛИ РАВНОЕ НУЛЮ
             minutes = hours * MIN;
            printf("%d часа это %d минут \n", hours, minutes);
           
            printf("Введите следующее значение\n");
            /*получить входные данные от пользователя*/             
            scanf("%d", &hours);                                                           
}
           
            printf("End \n");
                       
            getchar();
            getchar();
           
            return 0;
            }
ВЫВОД НА ЭКРАНЕ
Перевод часов в минуты
Введите часы
2
2 часа это 120 минут
Введите следующее значение
3
3 часа это 180 минут
Введите следующее значение

Перевод часов в минуты
Введите часы
3
3 часа это 180 минут
Введите следующее значение
4
4 часа это 240 минут
Введите следующее значение                                                                             
0                                                                          
End






Фундаментальные операции
Операция присваивания: =
В языке Си знак равенства не означает "равно". Это операция присваивания значения. Например, оператор
cat = 25;
Присваивает значение 25 переменной с именем cat.

Операция сложения: +
Операция сложения приводит к тому, что два значения с обеих сторон знака + образуют
сумму. Например , оператор
printf ( " % d " , 4 + 2 0 ) ;
выводит число 24, но не выражение 4 + 2 0

Складываемые значения (операнды) могут быть как переменными, так и константами.
Пример
income = salary + bribes;
заставляет извлечь значения двух переменных в правой части оператора, выполнить их сложение, а результат сложения присвоить переменной income.

Операция вычитания: -
Операция вычитания состоит в том, что число, стоящее в операторе после знака - , вычитается из числа, стоящего перед этим знаком. Оператор
takehome = 224.00 - 24.00 ;
присваивает переменной takehome значение 200.0 .

Операции знака + и -
 

Например , следующая последовательность:
rocky = - 12;
smokey = - rocky ;
завершается тем, что переменная smokey получает значение 12.

Операция умножения: *
Умножение обозначается символом * . Оператор
cm = 2 . 5 4 * inch ;
умножает переменную inch на 2.54 и присваивает результат умножения переменной cm.

Операция деления: /
В языке Си символ / используется для обозначения деления. Значение слева от символа
/ делится на значение, указанное с права . Например, следующее выражение дает в результате 4.0 :
four = 12.0/ 3.0;

В Си любая дробная часть, полученная при делении двух целых чисел, отбрасывается. Этот процесс называется усечением.

Операция деления по модулю: %
Операция деления по модулю применяется в целочисленной арифметике . Ее результатом
является остаток от деления целого числа, стоящего слева от знака операции, на число, расположенное справа от него. Например, 13 % 5 ( читается как "13 по модулю 5" ) дает в результате 3 , поскольку 5 содержится в 13 дважды с остатком, равным 3 . Не пытайтесь выполнять эту операцию над числами с плавающей запятой. Она просто не работает.

Операции инкремента и декремента: ++ и - -
Операция инкремента решает простую задачу; она увеличивает (икрементирует) значение  своего операнда на 1. Существует две разновидности этой операции. В первом случае символы ++  идут непосредственно перед переменной, это так называемая префиксная форма. Во втором случае символы + + следуют сразу за переменной; это постфиксная форма . Эти две формы отличаются друг от друга по моменту выполнения
инкремента .

Декремент: - -
Для каждой формы операции инкремента существует соответствующая операция декремента. При этом вместо + + применяется обозначение - - .
- - count ; / * префиксная форма операции декремента * /
count- - ; / * постфиксная форма операции декремента * /


Выражения и операторы
Операторы образуют основные элементы программы на Си, а большая часть операторов состоит из выражений.

Выражения
Выражение представляет собой некоторую комбинацию операций и операндов.
Операнд есть то, над чем выполняется операция.

Операторы
Операторы служат основными строительными блоками программы. Программа - это последовательность операторов с необходимыми знаками пунктуации. Оператор есть законченная команда компьютеру. В языке Си операторы распознаются по точке с запятой в конце.
legs = 4
это всего лишь выражение ( которое может быть частью другого выражения ), в тоже время
legs = 4;
является оператором.

//ПРИМЕР ОПЕРАТОРОВ
/*addemup.c - четыре вида операторов*/
#include <stdio.h>
int main (void)                                    //находит сумму первых 20 натуральных чисел
{
int count, sum ;                                  //оператор объявления
count = 0;                                           // оператор присваивания
sum = 0;                                             // оператор присваивания
while (count++ < 20)                         // оператор цикла while

sum = sum + count;                           // операторы
printf (" sum = %d\n" , sum);             //оператор вызова функции
return 0;
}
ОПЕРАТОР ОБЪЯВЛЕНИЯ - вводит в употребление имена и типы переменных, а также выделяет под них память.
ОПЕРАТОР ПРИСВАИВАНИЯ - это "рабочая лошадка" многих программ; он присваивает значения переменной.
Этот оператор состоит из имени переменной, за которым следует операция присваивания ( = ), далее идет выражение, сопровождаемое точкой с запятой.
ОПЕРАТОР ВЫЗОВА ФУНКЦИИ - заставляет функцию делать то, для чего она предназначена. Функция printf() вызывается для того, чтобы распечатать некоторые результаты.



ПРИСВАИВАНИЕ ЗНАЧЕНИЙ - ПЕРЕМЕННАЯ МОЖЕТ ПОЛУЧИТЬ ЗНАЧЕНИЯ
- с помощью оператора присваивания
cows = 112;
- переменная может получить значение ИЗ функции
scanf()
letters = strlen(name);
- инициализация переменной
int hogs = 21;
float digs = 3.213;
double abet = 2.14e9;
long double dip = 5.32e-5;
char grade = 'A';


Сначала рассмотрим заголовок функции:
void pound (int n)
Если для выполнения функции аргументы не требуются, в круглых скобках заголовка функции будет присутствовать ключевое слово void. Поскольку рассматриваемая функция принимает один аргумент типа int, в круглых скобках содержится объявление переменной типа int с именем n.
Функция принимает один аргумент, но ничего не возвращает.

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

Теперь рассмотрим вызовы функций.
Первым вызовом является
pound (times)
данный вызов приводит к тому, что значение переменной times, равное 5, присваивается переменной n . В результате эта функция выводит на печать пять знаков фунта и знак новой строки.

Второй вызов этой функции выглядит как
pound (ch)
В данном случае переменная ch имеет тип char . Она инициализируется символом ! , который в системах с кодировкой ASCII означает, что ch получила числовое значение 33.

Последний вызов,
pound ((int)f) ,
использует преобразование типов для приведения типа переменной f типа float к типу, соответствующему назначению этого аргумента.

void pound (int n) ;    / /прототип ANSII

Прототип - это объявление функции, в котором дается описание возвращаемого значения функции и всех ее аргументов. Прототипом функции в языке Си или C++ называется объявление функции, не содержащее тела функции, но указывающее имя функции, арность, типы аргументов и возвращаемый тип данных. В то время как определение функции описывает, что именно делает функция, прототип функции может восприниматься как описание её интерфейса.
Рассматриваемый прототип сообщает следующие сведения о функции pound () :
- у рассматриваемой функции возвращаемое значение отсутствует
- эта функция принимает один аргумент, каковым является значение типа int

//ПРИМЕР 4
#include "stdio.h"       //КОМАНДА ПРЕПРОЦЕССОРА - подключение файла стандартной библиотеки С                                                           stdio.h   содержит библиотеку функций ввода-вывода

void jolly(void);                     //Объявления ПРОТОТИП ФУНКЦИИ с именем jolly()
void deny(void);                    //Объявления ПРОТОТИП ФУНКЦИИ с именем deny()
int main(void)                        //ИМЯ ФУНКЦИИ С АРГУМЕНТАМИ. Имя функции - main(). Функция которой                                                                всегда  присутствует в программе на С. 
                                               //int - ф-ция возвращает целое число, void - ф-ция не принимает аргументов
{
         printf("He is funny good guy. \n");             
         jolly();                                                //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем  jolly() - это                                                                                                          ПРОТОТИП ФУНКЦИИ
           printf("He is funny good guy. \n");
           deny();                                                         //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем  deny() - это                                                                                                            ПРОТОТИП ФУНКЦИИ
            return 0;                                                         //ОПЕРАТОР ВОЗВРАТА
}
void jolly(void)                                                  //начало определения функции с именем jolly, функция не                                                                                                              принимает аргументов и нечего не возвращает
{
printf("He is funny good guy. \n");                  
}
void deny(void)                                                        //начало определения функции с именем deny
{
 printf("Nobody say another \n");                           //\n код указывающий начать новую строку
}

void jolly(void)         
//начало определения функции с именем jolly, функция не принимает аргументов и нечего не  возвращает
printf("He is funny good guy. \n"); 
//ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() - функция   ВЫВОД ДАННЫХ НА ЭКРАН. Имеет один аргумент. АРГУМЕНТ - ЭЛЕМЕНТЫ ИНФОРМАЦИИ  ПЕРЕДАВАЕМОЙ ФУНКЦИИ. 

Символьные строки и форматированный ввод-вывод на Си


Еще раз о типах данных в языке Си.
Целые числа со знаком
Могут быть положительными и отрицательными.
int - базовый целочисленный тип. Си гарантирует для int не менее 16 битов.
short или short int - максимальное число типа short. Си гарантирует для short не менее 16 битов.
long или long int - может хранить число, которое как минимум, не меньше наибольшего числа типа int или больше его. Си гарантирует для long не менее 32 битов.
long long или long long int - этот тип может быть целым числом. Си гарантирует для long long int не менее 64 битов.

Символы
Ими являются типографские символы, такие как А, &, + и т.д. По определению char для представления использует 1 байт памяти. 1 байт = 8 битам. Но char может быть длиной 16 бит и больше.
char - ключевое слово для типа символы.
signed char и unsigned char.

Булевские значения
Булевский тип представляет собой значения true(истина) и false(ложь).
_Bool

Вещественные числа с плавающей запятой
Могут быть положительными и отрицательными.
float - базовый тип данных с плавающей запятой. Может представлять шесть значащих цифр с заданной точностью.
double - базовый тип данных с плавающей запятой. Может представлять десять и более значащих цифр с заданной точностью.
long double - базовый тип данных с плавающей запятой. Может представлять более 10 значащих цифр с заданной точностью.

Комплексные и мнимые числа с плавающей запятой
float_Complex
double_Complex
long double_Complex
float_Imaginary
double_Imaginary
long double_Imaginary

В языке Си имеется встроенная операция sizeof, которая возвращает размер типа в байтах.

Символьная строка - это последовательность из одного или большего количества символов, например:
"Это длинная строка символов"

Строки символов: введение
Символьная строка представляет собой последовательность из одного или большего числа символов, например :
" Это длинная строка символов."
Двойные кавычки не являются частью строки. Они сообщают компилятору, что охватывают строку, в то время как одиночные кавычки идентифицируют конкретный символ.

Массив значений типа char и нулевой символ

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


Обратите внимание, что на рис. 4.1 в последней позиции массива показан символ \ 0 . Это нулевой (nиll) символ, и язык Си использует его для того, чтобы отметить конец строки. Нулевой символ - это не цифра нуль; это непечатаемый символ, значение которого в кодировке ASCII (или эквивалентной) равно 0. Все строки языка С всегда сохраняются с этим символом в конце. То , что в конце массива всегда проставляется нулевой символ, означает, что массив должен иметь, по крайней мере, на одну ячейку больше, чем количество символов, которое вы хотите сохранить.

Что же представляет собой массив? Вы можете рассматривать массив как несколько ячеек памяти, расположенных в ряд. Если вы предпочитаете более формальную и точную формулировку, то массив - это упорядоченная последовательность элементов данных одного типа. В рассматриваемом примере создается массив из 40 ячеек памяти, или элементов, каждый из которых может хранить одно значение типа char . При этом используется следующее объявление:

char name [ 40 ] ;
Квадратные скобки после name говорят о том, что это массив. Число 40 внутри скобок показывает число элементов в массиве. Ключевое слово char идентифицирует тип каждого элемента ( рис. 4.2) .


Пример использования строк

//ПРИМЕР 1
//Программа запрашивает мое имя и фамилию и выводит ее

#include <stdio.h>      //Команда препроцессора.  Подключение стандартной библиотеки Си ввод-вывод.
#include <string.h>     // Команда препроцессора.  Подключить файл обработки строк.
int main(void) {
    char name[20];        //Объявление переменной типа char строка, ей выделяется 20 байтов - ячейки  памяти
    char surname [20];  //Объявление переменной типа char строка, ей выделяется 20 байтов
    printf("Как ваше имя\n"); 
/*Функция ввода имени. /*получить входные данные от пользователя*/ */
    scanf("%s", name); //функция ввода данных, %s - спецификатор для ввода символьных данных
    printf("Как ваше фамилия \n");
/*Функция ввода фамилии. /*получить входные данные от пользователя*/ */
    scanf("%s", surname);       
    printf("Вас зовут %s %s\n", name, surname);     
    return 0;
}

//СПЕЦИФИКАЦИЯ
int main(void)
/*int - указывает на то, что функция main() возвращает целое число,
void - говорит о том, что функция main() не принимает никаких аргументов.*/
%s                                          //интерпретирует введенные данные как строку
printf("Как ваше имя\n");      //функция вывода, применяется для вывода фраз и значений переменных
printf("Вас зовут %s %s\n", name, surname);     //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет три аргумента управляющая строка и СПИСОК ПЕРЕМЕННЫХ -> name, surname

ВЫВОД НА ЭКРАНЕ
Как ваше имя
Olga
Как ваше фамилия
Orlova
Вас зовут Olga Orlova

//ПРИМЕР 3
 #include "stdio.h"       //Команда препроцессора.  Подключение стандартной библиотеки Си ввод-вывод.
#include "string.h"      // Команда препроцессора.  Подключить файл обработки строк.
int main() {
    float num;                           //Объявление переменной типа float - число с плавающей точкой
    printf("Введите число\n"); //функция вывода, применяется для вывода фраз и значений переменных
/*Функция ввода. Получить входные данные от пользователя */
    scanf("%f", &num);                                              
    printf("Число в десятичной форме %f\n", num);           
    printf("Число в экспоненциальной форме %e\n", num);
    return 0;
}
ВЫВОД НА ЭКРАНЕ
Введите число
5
Число в десятичной форме 5.000000
Число в экспоненциальной форме 5.000000e+00

ПОЯСНЕНИЯ
printf("Число в десятичной форме %f\n", num);     //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет два аргумента управляющая строка и СПИСОК ПЕРЕМЕННЫХ -> num

/*СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ определяет каким образом данные преобразуются в отображаемую форму*/
%d //СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ десятичное число со знаком
%f       //число с плавающей запятой, десятичное представление
%c       //одиночный символ
%s       //интерпретирует введенные данные как строку
%e       // экспоненциальная форма
%a       //Двоично- экспоненциальное представление
&         //амперсанд - спецификатор где можно найти переменную

Функция strlen()
В языке Си имеется встроенная операция sizeof, которая возвращает размеры типов в байтах. Функция strlen() определяет длину строки в символах.
Поскольку для размещения одного символа требуется один байт, можно предположить, что применительно к строке обе операции дадут одинаковый результат, но это не так.

/*Прототипом функции в языке Си или C++ называется объявление функции, не содержащее тела функции, но указывающее имя функции, арность, типы аргументов и возвращаемый тип данных. В то время как определение функции описывает, что именно делает функция, прототип функции может восприниматься как описание её интерфейса.*/

//sizeof - это унарный оператор, возвращающий длину в байтах переменной или типа, помещенных в скобки.
//strlen() - определяет длину строки в символах
//%zd - спецификатор для определения размера байтов

#include <stdio.h>
#include <string.h>                 //предоставляет прототип функции для обработки строк strlen()
#define PRAISE "Cool!"         //объявление константы

int main(void)                                               
{
            char name[40];                       //Объявление переменной типа char строка, ей выделяется 40 байтов - ячейки памяти
            printf("What is your name\n");
            /*получить входные данные от пользователя*/
            scanf("%s", name);
            printf("Hello %s. %s \n", name, PRAISE); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет три аргумента -> управляющая строка и СПИСОК ПЕРЕМЕННЫХ
            printf("Your name consist of %zd symbols and located %zd cell of memory.\ n", strlen(name), sizeof name);
            printf("The praise consist of %zd symbol\n", strlen(PRAISE));
            printf("And located %zd cell of memory\n", sizeof PRAISE);

            getchar();                                //для того чтобы не закрывалось окно программы после исполнения
            getchar();

            return 0;
}
//ВЫВОД НА ЭКРН
What is your name
Tanya
Hello Tanya. Cool!
Your name consist of 5 symbols and located 40 cell of memory. The praise consist of 5 symbol
And located 6 cell of memory.

Вариант с использование спецификатора %u
//sizeof - это унарный оператор, возвращающий длину в байтах переменной или типа, помещенных в скобки.
//strlen() - определяет длину строки в символах
//%zd - спецификатор для определения размера байтов
//%u - спецификатор десятичное целое число без знака

#include <stdio.h>
#include <string.h>                 //предоставляет прототип функции для обработки строк strlenf()
#define PRAISE "Cool!"         //объявление константы

int main(void)                                               
{
            char name[40];                                                           //Объявление переменной типа char строка, ей выделяется 40 байтов - ячейки памяти
            printf("What is your name\n");
            /*получить входные данные от пользователя*/
            scanf("%s", name);
            printf("Hello %s. %s \n", name, PRAISE); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет три аргумента -> управляющая строка и СПИСОК ПЕРЕМЕННЫХ
            printf("Your name consist of %u symbols and located %u cell of memory.\ n", strlen(name), sizeof name);
            printf("The praise consist of %u symbol\n", strlen(PRAISE));
            printf("And located %u cell of memory. \n", sizeof PRAISE);

            getchar();                                //для того чтобы не закрывалось окно программы после исполнения
            getchar();

            return 0;
}
//ВЫВОД НА ЭКРАН
What is your name
Inessa
Hello Inessa. Cool!
Your name consist of 6 symbols and located 40 cell of memory. The praise consist of 5 symbol
And located 6 cell of memory.

В языке Си имеется встроенная операция sizeof, которая возвращает размеры типов в байтах.
//%zd - спецификатор для определения размера байтов
//%u - спецификатор десятичное целое число без знака
int main(void)
/*int - указывает на то, что функция main() возвращает целое число,
void - говорит о том, что функция main() не принимает никаких аргументов.*/

#include <stdio.h>      //КОМАНДА ПРЕПРОЦЕССОРА.  Начало программы. Включить другой файл, подключение стандартной библиотеки С.

int main(void)
{
            printf("Type int have size %zd byte.\n", sizeof(int));
            printf("Type char have size %zd byte.\n", sizeof(char));
            printf("Type long have size %zd byte.\n", sizeof(long));
            printf("Type long long have size %zd byte.\n", sizeof(long long));
            printf("Type double have size %zd byte.\n", sizeof(double));
            printf("Type long double have size %zd byte.\n", sizeof(long double));
           
            getchar();                     //для того чтобы не закрывалось окно программы после исполнения
            getchar();

            return 0;         
}
//ВЫВОД НА ЭКРАН
Type int have size 4 byte.
Type char have size 1 byte.
Type long have size 4 byte.
Type long long have size 8 byte.
Type double have size 8 byte.
Type long double have size 8 byte.

Сброс буфера вывода
Когда функция printf() отправляет вывод на экран?
Первоначально операторы printf() пересылают выходные данные в промежуточную область хранения, называемую буфером. Время от времени данные, находящиеся в буфере, отправляются на экран. Стандартные правила Си - когда пересылать вывод из буфера на экран - вывод из буфера передается на экран:
- когда буфер заполнен,
- когда встречается символ новой строки,
- когда наступает время ввода данных.
Отправка вывода из буфера на экран или в файл называется сбросом буфера.

Функции printf() и scanf()
Функции printf() и scanf() позволяют организовать взаимодействие с программой и называются функциями ввода-вывода.
Инструкции, которые вы даете функция printf(), запрашивая у нее вывод переменной, зависят от типа этой переменной.
Например:
%d - при выводе целого числа
%с - при выводе символа
%s  - при выводе символьной строки
Это спецификаторы преобразования. 

Формат использования функции printf () имеет вид :
printf ( управляющая - строка , элементl , элемент2 , . . . ) ;
Где элементl , элемент2 и так далее - это элементы, которые нужно напечатать. Они могут быть переменными либо константами, либо даже выражениями, значение которых вычисляется при выводе на печать, а управляющая - строка - это строка символов, описывающая, каким образом необходимо выполнить печать элементов. Как уже говорилось управляющая строка должна содержать спецификатор преобразования для каждого выводимого элемента.


printf ( "%d администраторов выпили % f чашек кофе эспрессо . \ n ",  number, espresso);

Здесь управляющая строка представляет собой фразу, заключенную в двойные кавычки.
Она содержит два спецификатора преобразования, соответственно, для переменных number и espresso - двух выводимых на печать элементов. 


Резюме
Строка - это последовательность символов, рассматриваемая как единый блок. В языке С строки представлены последовательностями символов, завершающимися нулевым символом, АSСII-код которого равен 0. Строки могут сохраняться в символьных массивах. Массив представляет собой последовательность элементов, имеющих ОДИН и тот же тип.

Чтобы объявить массив с именем name, содержащий 30 элементов типа char, воспользуйтесь следующей конструкцией:
char name [30];

Функцию strlen() можно использовать для определения длины строки (без нулевого символа в конце ) . Функция scanf() , будучи вызванной вместе со спецификатором % s , может применяться для чтения строк, состоящих из одного слова.

Директива #include заставляет процессор добавлять с одержимое другого файла в ваш файл в то место, где расположена эта директива. Директива #define позволяет определять явные константы, то есть задавать символические представления констант. Заголовочные файлы limits.h и float.h используют директиву #define , чтобы определить набор констант, представляющих различные свойства цело численных типов и чисел с плавающей запятой. Для создания символических констант вы также можете использовать модификатор const.

Функции printf() и scanf () обеспечивают универсальную поддержку ввода и вывода. Каждая из них использует управляющую строку, содержащую вложенные спецификаторы преобразования, которые указывают количество и типы элементов данных для чтения или вывода на печать.