понедельник, 13 ноября 2017 г.

«Предчувствие жизни» Светланы Штейнгруд



Мне непонятен замысел, Создатель,
и нестерпимо эту роль играть!
Ведь остальные жители земли
перед тобой – ни в чем не провинились:
ни дерево, ни птица, ни дельфин.
И самый лютый зверь уничтожает
лишь то, что подлежит уничтоженью
для продолженья жизни и потомства.
И неразумность малых сих – разумна
и созиданьем одушевлена.
Из всех известных в этом мире тварей
лишь человек – создание Твоё –
уничтожает с жадностью безумной,
с безжалостной и жалкою тоскою
все то, что Ты так долго, терпеливо,
так вдохновенно, Боже, создавал!
И он, однажды изгнанный из рая,
свою обитель райскую земную
так планомерно превращает в ад,
как будто мстит за прошлое изгнанье
с беспечной беспощадностью – себе!
И в этом оголтелом ослепленье
уже не может он остановиться,
как будто кто-то дёргает за нити
марионетку, а не человека.
И глупая, безжалостная кукла
танцует свой тяжелый смертный рок,
своим металлом яростно бряцает
и по последней, очумелой моде
зеленую, замурзанную землю
заржавленной машинкою прогресса,
как прочих равных – налысо стрижет!
Но равенство такое – непосильно
для всех, лишенных права сильным быть:
лысеют горы, города и дети,
и участь их уже оплакать нечем,
поскольку реки зарастают тиной
и суховеи стонут вдоль пустыни,
оставшейся от высохшего русла
бездонных прежде человечьих душ…
Мне непонятен замысел, Создатель!
Но если только вера укрепляет
стоящего у бездны на краю,
будь милосерд к своим игрушкам бедным,
не отнимай последнюю игрушку,
свой самый лучший сказочный подарок –

божественную сказку – про Себя!

Рыжая дворняга - red mongrel. Remember about soul



В современной мире гаджитов, роботов и бешеной погони за популярность в виде селфи, мы забыли о нашей человеческом начале, о душе. Мы думаем о рае, ходим в церковь просить что-то лично мекрантильное для себя. А рай здесь на Земле и пока мы еще его не убили. Кто создал это многообразие живых существ, таких прекрасных и таких непонятых нами. Мы разучились говорить с природой на одном языке, мы разучились чувствовать. Где те понятия дружба, любовь, преданность. Мы забыли о них, они словно умерли в нашей жизни, где все заменяться деньгами, славой, лайками. Кто мы? Зачем мы здесь. И сможем ли мы снова вернуться к нашим истокам. Эти прекрасные создания - братья наш меньшие учат нас любить снова. 

Эдуард Асадов

Хозяин погладил рукою
Лохматую рыжую спину:
- Прощай, брат! Хоть жаль мне, не скрою,
Но все же тебя я покину.

Швырнул под скамейку ошейник
И скрылся под гулким навесом,
Где пестрый людской муравейник
Вливался в вагоны экспресса.

Собака не взвыла ни разу,
И лишь за знакомой спиною
Следили два карие глаза
С почти человечьей тоскою.

Старик у вокзального входа
Сказал: - Что? Оставлен, бедняга?
Эх, будь ты хорошей породы...
А то ведь простая дворняга!

Огонь над трубой заметался,
Взревел паровоз, что есть мочи,
На месте, как бык потоптался
И ринулся в непогодь ночи.


В вагонах, забыв передряги,
Курили, смеялись, дремали...
Тут, видно, о рыжей дворняге
Не думали, не вспоминали.

Не ведал хозяин, что где-то
По шпалам, из сил выбиваясь,
За красным мелькающим светом
Собака бежит задыхаясь!

Споткнувшись, кидается снова,
В кровь лапы о камни разбиты,
Что выпрыгнуть сердце готово
Наружу из пасти раскрытой!

Не ведал хозяин, что силы
Вдруг разом оставили тело,
И, стукнувшись лбом о перила,
Собака под мост полетела...

Труп волны снесли под коряги...
Старик! Ты не знаешь природы:
Ведь может быть тело дворняги,
А сердце - чистейшей породы! 


среда, 1 ноября 2017 г.

INTRODUCTION OF ETHICAL HACKING I



ESSENTIAL TERMINOLOGY
Hack Value
It is the notion among hackers that something is worth doing or is intersting. 

Exploits
A defined way to brach the security of an IT system through vulnerability.

Vulnerability
Existence of a weakness, design, or implementation error that can lead to an unexpected and undesirable event compromising of the system

Target of Evaluation
An IT system, product, or component that is identified/subjected to a required security evaluation. 

Zero-Day Attack
An attack that exploits computer application vulnerabilities before the software developer releases a path for the vulnerability. 

Daisy Chaining
Hackrs who get away with database theft usually complete their task, then backtrack to cover their tracks by destroying logs, etc. 

ELEMENT OF INFORMATION SECURITY 
Confidentiality
Assurance that the information is accessible only to those authorized to have access.

Interrity
The trustwothiness of data or resources in terms of preventing improper and unauthorized changes.

Availability
Assurance that the systems responsible for delivering, storing, and processing information are accessible when required by the authorized users.

Authenticity
Authenticity refers to the characteristics of a communications, document or any data that ensures the quality of being genuine. 

Non-Repudation
Garantee that the sender of a message cannot later deny having sent the message and that the recipient cannot deny having recived the message.

TOP INFORMATION SECURITY ATTACK VECTORS
An attack vector is a path or means by which an attacker gains access to an information system to perform malicious activities. This attack vector enable an attacker to take adventage of the vulnerabilities present in the information system in order to carry out a particular attack.

Although there are some traditional attacks vectors from which attack can be performed, attack vectors come in many forms; one cannot predict in which form an attack vector can come. 

The following are the possible top attack vectors thought which attackers can attack information systems:
- Virtualization and Cloud Computing
- Organized Cyber Crime
- Unpatched Software
- Targeted Malware
- Social Networking
- Insider Threats
- Botnets
- Lack of Cyber Security Professionals
- Network Applications
- Inadequate Secuity Policies
- Mobile Device Security
- Compliance with Govt.Laws and Regulations
- Complexity of Computer Infrastrucure 
- Hacktivism

INFORMATION SECURITY THREATS
Information security threats are broadly classified into three  categories, as follows:

Natural Threats
Natural Threats include natural disasters such as eathquakes, hurricane, floods or any nature-created disaster that cannot be stop. Information damage or lost due to natural threats cannot be prevented as no one knows in advance that these types of threats will occur. However, you can implement a few safeguards against natural disasters by adopting disaster recovery plans and contigency plans. 

Physical Security Threats
Physical Threats may include loss or damage of system resources through fire, water, theft, and physical impact. Physical impact on resources can be due to a collision or other damage, either intentionally or unintentionally. Sometimes, power may also damage hardware used to store information. 

Human Threats
Human Threats include threats of attacks performed by both insider and outsider. Insider attacks refer to attacks performed by disgruntled or malicious employees. Outsider attacks refer to attacks performed by malicious people not within the organization. Insider attackers can be the biggest threat to information system as they may know the security posture of the information systems, while outsider attackers apply many tricks such as social engineering to learn the security posture of the information system. 

NETWORK THREATS
A network is defined as the collection of computers and other hardware connected by communication channels to share resources and information. As the information travels from one computer to the other through the communication channel, a malicious person may break into the communication channel and steal the information traveling over the network. The attacker can impose various threats on a target network:

- Information gathering
- Sniffing and eaversdropping
- Spoofing
- Session hijacking and man-in-the-middle attacks
- SQL injection
- ARP poisoning
- Password-base attacks
- Denial of service attack
- Compromised-key attack 

HOST THREATS
Host threats are directed at a particualr system on which valuable information resides. Attackers try to breach the security of the information system resource. The following are possible threats to the host:

- Malware attacks
- Target Footprinting
- Password attacks
- Denial of service attacks
- Arbitrary code execution 
- Unauthorized access
- Privilege escalation
- Back door Attacks
- Physical security threats

APPLICATION THREATS
If the proper security measures are not considered during development of the particular application, the application might be vulnerable to different types of application attacks. Attackers take advantage of vulnerabitiles present in the application to steal or damage the information. The following are possible threats to the application:

- Data/Input validation
- Authentication and Authorization attacks
- Configuration management
- Information disclosure
- Session management issues
- Buffer overflow issues
- Cryptography attacks
- Parameter manipulation
- Improper error handling and exeution management
- Auditing and logging issues

INFORMATION WARFARE
Warfare or InfoWar refers to the use of information and communication technologies (ICT) to take competitive advantages over an opponent. 

Defensive Information Warfare: It refers to all strategies and actions to defend against attacks on ICT assets. 
- Prevention
- Deterrence
- Alerts
- Detection
- Emergency Preparendess
- Response

Offensive Informaion Warfare: It refers to information warfare that  involves attacks against ICT assets of an opponent. 
- Web Application Attacks
- Web Server Attacks
- Malware Attacks
- MITM Attacks
- System Hacking 

IPv6 SECURITY THREATS
Auto Configuration Threats
IPv6 enables auto-configuration of IP networks, which may leave user vulnerable to attacks if the network is not configured properly and securely from the very beginning. 

Unavailability Reputation-based Protection
Current security solutions use reputation of IP addresses to filter out known sources of malware; vendors will take time to develop reputation-based protection for IPv6.

Incompatibility of Logging Systems
IPv6 uses 128-bit addresses, which are stored as a 39-digit string whereas IPv4 addresses stored in a 15-charater field; logging solutions designed for IPv4 may not work on IPv6 based networks. 

Rated Limited Problem
Administrators use rate limiting strategy to slow down the automated attack tool; however, it is impractical to rate limit at the 128-bit address level. 

Default IPv6 Activation
IPv6 may be activated without the administrator's knowledge, which wil leave IPv4-base security controls ineffective. 

Complexity of Network Management Tasks
Administrators may adopt easy-to-remember address (::10, ::20, ::F00D,::C5C0 so simply IPv4 last octet for dual stack) leading to a potential vulnerability. 

Complexity in Vulnarability Assessment
IPv6's 128-bit address space makes active scanning of infrastructure for unauthorized or vulnerable systems more complex. 

Overloading of Perimeter Security Controls
IPv6 has a 40-byte fixed header with an add-on "extension headers" that may be chained, which required complex processing by various security controls systems such as routers, security gateways, firewalls and IDS. 

IPv4 to IPv6 Translation Issues
Translating IPv4 traffic to IPv6 may result in poor implementation and may provide a potential attack vector. 

Security Information and Event Management (SIEM) Problems
Every IPv6 host can have multiple IPv6 addresses simultaneously, which leads to complexity of log or event correlation. 

Denial-of-Service (DOS)
Overloading of network security and control devices can significantly reduce the availability theshold of network resources, leading to DoS attacks. 

Trespassing
IPv6's advanced network discovery features can be exploted by attackers who can traverse through your network and access the restricted resources. 

HACKING VS. ETHICAL HACKING
- Hacking refers to exploiting system vulnerabilities and compromising secure controls to gain unauthorized or inappropriate access to the system resources. 

- It involves modifying system or application features to achive a goal outside of the creator's original purpose. 

- Ethical hacking involes the use of hacking tools, tricks and techniques to identify vulnerabilities so as to ensure syste security. 

- It focuses on simulating techniques used by attackers to verify the existence of exploitable vulnerabilities in the system security. 

WHO IS A HACKER?
A hacker is a person who illegally breaks into a system or network without any authorizatin to destroy, steal sensitive data, or perform malicious attacks. Hackers may be motivated by a multitude of reasons:

- Intelligent individuals with excellent computer skills, with the ability to create and explore the computer's software and hardware. 

- For some hackers, hacking is a hobby to see how many computers or networks they can compromise. 

- Their intention can either be to gain knowledge or to poke around doing illegal things. 

- Some hack with malicious intent, such as stealing business data, credit card information, social security numbers, email passwords, etc. 

HACKER CLASSES
BLACK HATS
Black hats are individuals with extraordiary computing skills, resorting to malicious or disctructive activities and are also known as crackers. These individuals mostly use their skills for only desctructive activities, causing huge losses for companies as well as individuals. They use their skills in finding vulnerabilities in the various networks including defense and goverment websites, banking and finance etc. Some do it to cause damage, steal information, destroy data, or earn money easily by hacking IDs of bank customers. 

WHITE HATS
White hats are individuals who possess hacking skills and use them for defensive purposes; they are also known as security analysts. These days, almost every company has security analysts. These days, almost every company has security analysts to defend their systems against the malicious attacks. White hats help companies secure their networks from outside intruders.

GRAY HATS
Gray hats are the individuals who work both offensively and defensively at various times. Gray hats fall between white and black hats. Gray hats might help hackers by finding various vulnerabilities of a system or network and at the same time help vendors to improve products (software or hardware) by checking limitations and making them more secure, etc. 

SUICIDE HACKERS
Suicide hackers are individuals who aim to bring down critical infrastructure for a "cause" and are not worried about facing 30 years in jail for their actions. Suicide hackers are closely related to suicide bombers, who sacrifice their life for the attack and are not concerned with the consequences of their actions. There has been a rise in cyber terrorism in recent years. 

SCRIPT KIDDIES
Script kiddies are the unskilled hackers who compromise systems by running scripts, tools, and software developed by real hackers. They utilize small, easy-to-use programs or scripts as well as distinguished techniques to find and exploit the vulnerabilities of a machine. Script kiddies usually focus on the quantity of attacks rather than the quality of the attacks.

SPY HACKERS
Spy hackers are individuals who are employed by an organization to penetrate and gain trade secrets of the competitor. These insiders can take advantage of the privileges they have to hack a system or network. 

CYBER TERRORISTS
Cyber terrorists could be people, organized groups, formed by terrorist organizations, that have a wide range of skills, motivated by religious or political beliefs, to create fear by large-scale disruption of computer networks. This type of hackers is more dangerous as they can hack not only a website but whole Internet zones. 

STATE SPONSORED HACKERS
State sponsored hackers are individuals employed by the government to penetrate and gain top-secret information and to damage information systems of other government. 

HACKTIVISM
Hacktivism is an act of promoting a political agenda by hacking, especially by defacing or disabling website. The person who does these things is known as a hacktivist. 

- Hacktivism thrives in an enviroment where information is easily accessible.
- It aims to send a message through hacking activities and gain visibility for a cause. 
- Common targets include government agencies, multinational corporations,  or any other entity perceived as "bad" or "wrong" by these groups or individuals. 
- It remains a fact, howerver, that gainig unauthorized access is a crime, no matter what the intention is. 
- Hacktivism is motivated by revenge, political or social reasons, ideology, vandalism, protest, and a desire to humiliate victims. 

HACKING PHASES
The various phases involved in hacking are:
- Reconnaissance
- Scanning
- Gainin Access
- Maintainig Access
- Clearing Tracks

вторник, 31 октября 2017 г.

How to bypass AV

Ever since Symantec added Netcat's signature to their virus database, there have been repeated outcries against the detection of Netcat as a “Hack Tool”; while Netcat is a very useful networking utility. Here we try to show how to locate the signature used to identify Netcat, and modify it.  The executable no longer matches Symantec's signature, without interfering with any of the program's functionality. This is an exercise in identifying and modifying sections of code (aka, signatures) that are used by anti virus programs to identify malicious code; the tools and techniques used here can be applied to any program that is marked as malicious by AV applications.

Using tools
1. Netcat 1.11  (https://eternallybored.org/misc/netcat/)
2. Anti-Virus  ( https://nodistribute.com)
3. HexWorkshop v6.8 (http://www.bpsoft.com/downloads)
4. Olly Debugger (http://www.ollydbg.de)


Lets see to the Netcat via Antivirus tools. 



Identifying a Signature

What is the Signature of the file – File magic number: bytes within a file used to identify the format of the file; generally a short sequence of bytes (most are 2-4 bytes long) placed at the beginning of the file.

The Portable Executable (PE) format is a file format for executables, object code, DLLs, FON Font files, and others used in 32-bit and 64-bit versions of Windows operating systems. The PE format is a data structure that encapsulates the information necessary for the Windows OS loader to manage the wrapped executable code. This includes dynamic library references for linking, API export and import tables, resource management data and thread-local storage (TLS) data.

How to find the PE headers? Notice a few text strings such as “This program cannot be run in DOS mode”, “.text”, “.data” and “.rdata”, followed by several hundred bytes of 0s. This is the PE header section of the program; the actual program instructions begin immediately after the section of 0s at offset 1000:


Changing File Signatures
Once your AV agent has identified a file as a virus, trojan, worm, or other malicious program,
you need to locate the section of the file that is used by the AV application to identify the program as malicious. If you open the program in a hex editor and replace making the second half of the file with a string of 0’s, and the AV application no longer identifies the file as a malicious program, then the AV signature (or at least part of it) is located in the second half of the file. Conversely, if it is still identified as a malicious program, then the signature is located in the first half of the file. This halving technique can be used again and again to narrow down the location of the signature, until you can positively identify the exact location and length of the signature.

There are some easy ways of changing the signature of a program (packers, encryptors, etc), they may not always be viable options for those wishing to bypass anti virus applications. Additionally, it would be easy for anti virus companies to run a program such as Netcat through a few popular packers/encryptors and add signatures for the resulting binaries to their virus databases as well. We will manually examining and editing the Netcat program in order to create a custom “version” of the Netcat utility.

How to edit the signature of file? First open up Netcat with Hex Workshop (right click nc.exe and select ‘Hex edit with Hex Workshop’). If you scroll to the bottom of the hex dump, you see the last byte is located at offset 8EAF. Divide 8EAF in half and you get 4547; open up a goto box (Ctl+G) and go to the offset 4547 from the beginning of the file:


Select everything from 4547 to the end of the file (8EAF), right click, select ‘Fill’, and fill the selected section with 0s:



Save your changes; when prompted to make a backup, say yes. 

We can safely eliminate the PE header, as it would not be used as part of a virus signature. Thus, we know that the signature must be somewhere between offsets 1000 and 4547; this can be confirmed by zeroing out all the file contents between these two addresses as we did with the second half of the file, and running a virus scan on nc.exe again.

We can continue this process of elimination by systematically modifying sections of code between 1000 and 4547 and testing the resulting file against AV. If the file is still detected as the Netcat “Hack Tool”, then we know that the section that was modified was not used as part of the signature; if it is not detected, then we know that the modified section was used as part of the signature. Of course, it is important to delete the modified file after each modification and make any new changes to a copy of the original file (just as we did in the previous example), or else your results may be skewed and you will have a non-functioning program to boot. For brevity, I will simply list the sections that I zeroed out and the results that each modification had on the AV detection.

When Ollydbg helps
The easiest way to identify where and how to change the program code is to open it up in a disassembler/debugger and analyze the resulting assembly code; for this we will use OllyDbg. Open up the original copy of nc.exe in Olly, and scroll up to the top of the code window.
The enter point offset 00401160.
Notice that the code starts at offset 1020, and that the hex dump of the code located there matches the hex dump at offset 1020 in Hex Workshop. This confirms our previous assumption that this offset was the beginning of the actual program instructions:



If we stroll down we find a string of INT3 instructions starting at offset 1355.


INT3 is a software interrupt that is used by debuggers to pause program execution. Since Netcat
obviously doesn't pause indefinitely during execution, these bytes are just filler and can be modified without worrying about affecting the program execution flow. Additionally, they are within the signature code which we need to modify. If you are using Olly, select one of these INT3 instructions (I chose the first one at 1355), and press the space bar. In the 'Assemble' text box that appears, enter 'nop' (no quotes) and click assemble:



We continue the modify the file. The hexadecimal equivalent of the INT3 instruction is CC and the hex equivalent of the NOP instruction is 90. We try to make modification with it changing INT3 instructions (they are just displayed in their hexadecimal format of 'CC'); change one of those CC's to 90 or vise varse and save the changes.


How to see the PE-header signature dump



Antivirus results:


четверг, 26 октября 2017 г.

Функция в языке Си



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

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

-----------------------------------------------------------------------------------------------------------------

/*ЧТО НУЖНО ЗНАТЬ О ФУНКЦИЯХ
- КАК ИХ ПРАВИЛЬНО ОПРЕДЕЛЯТЬ
- ВЫЗЫВАТЬ
- ОБЕСПЕЧИВАТЬ ВЗАИМОДЕЙСТВИЕ МЕЖДУ НИМИ*/

#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки компилятора С. Заголовочный файл.
#include <string.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки компилятора С. Для strlen()
#define NAME "GIGATHINK, INC." //СИМВОЛИЧЕСКАЯ КОНСТАНАТА
#define ADDRESS "101 Megabuck Plaza" //СИМВОЛИЧЕСКАЯ КОНСТАНАТА
#define PLACE "megapolis, CA 94904"
#define WIDTH 40
#define SPACE '*'
/*ОПРЕДЕЛЕНИЕ ФУНКЦИИ*/
void show_n_char (char ch, int num); //ОПРЕДЕЛЕНИЕ ФУНКЦИИ show_n_char() (разновидность функции), первое void - говорит, что функция show_n_char() не возвращает никакого
//значения, функция принимает два аргумента (ФОРМАЛЬНЫЕ ПАРАМЕТРЫ - являются ЛОКАЛЬНЫМИ ПЕРЕМЕННЫМИ определены внутри ф-ции)->
//переменная с типом данных строка ch, переменная типом данных целые числа int
int main(void) //ОБЯВЛЕНИЕ ФУНКЦИИ с именем main() - главная функция, каркас программы на С
{
int spaces; //ОБЪЯВЛЕНИЕ ПЕРЕМЕННОЙ с именем spaces, тип данных -> целые числа
show_n_char('*', WIDTH); //оператор вызова функции, ИСПОЛЬЗОВАНИЕ КОНСТАНТ В КАЧЕСТВЕ АРГУМЕНТОВ
putchar("\n"); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем putchar() имеет один аргумент -> управляющая строка
show_n_char(SPACE, 12); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ, использование констант в качестве аргументов
printf("%s\n", NAME); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет два аргумента -> управляющая строка "" и список переменных
spaces = (WIDHT - strlen(ADDRESS))/2; //позволить программе вычислить, сколько пробелов нужно вывести
show_n_char(SPACE, spaces); //оператор вызова функции, ИСПОЛЬЗОВАНИЕ ПЕРЕМЕННОЙ В КАЧЕСТВЕ АРГУМЕНТОВ
printf("%s\n", ADDRESS); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет два аргумента -> управляющая строка "" и список переменных
show_n_char(SPACE, (WIDTH - strlen(PLACE)) / 2); //Оператор вызова функции, ИСПОЛЬЗОВАНИЕ ВЫРАЖЕНИЯ В КАЧЕСТВЕ АРГУМЕНТА
printf("%s\n", PLACE); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет два аргумента -> управляющая строка "" и список переменных
show_n_char('*', WIDTH); //оператор вызова функции, ИСПОЛЬЗОВАНИЕ КОНСТАНТ В КАЧЕСТВЕ АРГУМЕНТОВ
putchar("\n");
return 0;
}
/*ОПРЕДЕЛЕНИЕ ФУНКЦИИ show_n_char()*/
void show_n_char(char ch, int num) //ОПРЕДЕЛЕНИЕ (ЧТО ДЕЛАЕТ ФУНКЦИЯ) - ВЫВОДИТ '*' НА ЭКРАН, первое void - говорит, что функция show_n_char()
//не возвращает никакого значения, функция принимает аргументы  show_n_char(char ch, int num)
{
int count; //ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННОЙ c имененм count, тип данных целочисленный Данная переменная ЛОКАЛЬНАЯ
for (count = 1; count <= num; count++) //ЦИКЛ. ИНИЦИАЛИЗАЦИЯ ЦИКЛА
putchar(ch); //ОПЕРАТОР ФУНКЦИИ putchar();
}

ВЫВОД НА ЭКРАН
****************************************0         
GIGATHINK, INC.
           101 Megabuck Plaza
          megapolis, CA 94904
****************************************0



void show_n_char (char ch, int num);
/*Эта строка обозначает, что функция show_n_char() принимает ДВА АРГУМЕНТА  с именем ch -> тип char, и с именем num -> тип int
Эти переменные называются ФОРМАЛЬНЫМИ ПАРАМЕТРАМИ. Эти переменные определены ВНУТРИ ФУНКЦИИ, и ФОРМАЛЬНЫЕ ПАРАМЕТРЫ ЯВЛЯЮТСЯ ЛОКАЛЬНЫМИ
ПЕРЕМЕННЫМИ
КОГДА ФУНКЦИЯ ПРИНИМАЕТ АРГУМЕНТЫ, ПРОТОТИП ОТРАЖАЕТ ИХ КОЛИЧЕСТВО И ТИПЫ.
*/

show_n_char (SPACE, 12);
/*ФАКТИЧЕСКИЕ АРГУМЕНТЫ -> SPACE, 12
ФОРМАЛЬНЫЙ ПАРАМЕТР - это ПЕРЕМЕННАЯ в вызванной ФУНКЦИИ
ФАКТИЧЕСКИЙ АРГУМЕНТ - это конкретное значение, которое вызывающая функция присваивает переменной внутри вызванной функции. Фактическим
аргументом может может быть константа, переменная, выражение. Фактический аргумент представляет собой конкретное значение, которое
присваивается переменной, известной как формальный параметр.
*/

int main(void) //Фактический аргумент - это значение 25, переданное main() в функцию space() и присвоенное number
{
space(25); //Фактический аргумент - это выражение, указанное в круглых скобках при вызове функции.
}


void space (int number) //Формальный параметр - это имя, созданное определением функции
{ //Формальный параметр - это переменная, объявленная в заголовке определения функции. Локальная переменная

}

double klink(int a, int b); //ОПРЕДЕЛЕНИЕ ФУНКЦИИ, КОТОРАЯ ПРИНИМАЕТ ДВА АРГУМЕНТА int, НО ВОЗВРАЩАЕТ ЗНАЧЕНИЕ ТИПА double

double sqrt(double); //ФУНКЦИЯ sqrt() ПРИНИМАЕТ ПАРАМЕТР ТИПА double и ВОЗВРАЩАЕТ ЗНАЧЕНИЕ ТИПА double

spaces = (WIDHT - strlen(ADDRESS))/2; //ОПЕРАТОР ПРИСВАИВАНИЯ - получить значение константы WIDTH, вычесть результат работы функции
//strlen(ADDRESS), разделить на два и ПРИСВОИТЬ РЕЗУЛЬТАТ ВЫЧИСЛЕНИЯ ПЕРЕМЕННОЙ spaces

int main(void) //имя функции (объявление функции с именем main
/*Программа на С состоит из одной или большего числа функций - базовых
модулей программ на С.
Круглые скобки показывают, что main() есть имя функции,
int - указывает на то, что функция main() ВОЗВРАЩАЕТ ЦЕЛОЕ ЧИСЛО,
void - говорит о том, что функция main() НЕ ПРИНИМАЕТ НИКАКИХ АРГУМЕНТОВ.

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

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

------------------------------------------------------------------------------------------------------------------
//EXAMPLE

#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки компилятора С. Заголовочный файл.
#include <string.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки компилятора С. Для strlen()
#define NAME "MY HOME" //СИМВОЛИЧЕСКАЯ КОНСТАНАТА
#define ADDRESS "DOMODEDOVSKAYA" //СИМВОЛИЧЕСКАЯ КОНСТАНАТА
#define PLACE "MOSCOW"
#define WIDTH 40

/*ОПРЕДЕЛЕНИЕ ФУНКЦИИ*/
void starbar (void); //ОПРЕДЕЛЕНИЕ ФУНКЦИИ void starbar(void) (разновидность функции), первое void - говорит, что функция starbar() не возвращает никакого
//значения, функция не принимает аргументы
int main(void) //ОБЯВЛЕНИЕ ФУНКЦИИ с именем main() - главная функция, каркас программы на С
{
starbar(); //ВЫЗОВ ФУНКЦИИ
printf("%s \n", NAME);
printf("%s \n", ADDRESS);
printf("%s \n", PLACE);
starbar(); //ИСПОЛЬЗОВАНИЕ ФУНКЦИИ
return 0;
}
/*ОПРЕДЕЛЕНИЕ ФУНКЦИИ void starbar (void)*/
void starbar (void) //ОПРЕДЕЛЕНИЕ ФУНКЦИИ (ЧТО ДЕЛАЕТ ФУНКЦИЯ)? Функция выводит звездочки
{
int count; //ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННОЙ c имененм count, тип данных целочисленный Данная переменная ЛОКАЛЬНАЯ только для ф-ции starbar()
for (count = 1; count <= WIDTH; count++) //ЦИКЛ. Вызывается функция void starbar (void)  который печатает '*'
putchar('*'); //ОПЕРАТОР ФУНКЦИИ putchar();
putchar('\n');
}

ВЫВОД НА ЭКРАН

MY HOME
DOMODEDOVSKAYA
MOSCOW
****************************************


void show_n_char (char ch, int num);
/*Эта строка обозначает, что функция show_n_char() принимает ДВА АРГУМЕНТА  с именем ch -> тип char, и с именем num -> тип int
Эти переменные называются ФОРМАЛЬНЫМИ ПАРАМЕТРАМИ. Эти переменные определены ВНУТРИ ФУНКЦИИ, и ФОРМАЛЬНЫЕ ПАРАМЕТРЫ ЯВЛЯЮТСЯ ЛОКАЛЬНЫМИ
ПЕРЕМЕННЫМИ*/

spaces = (WIDHT - strlen(ADDRESS))/2; //ОПЕРАТОР ПРИСВАИВАНИЯ - получить значение константы WIDTH, вычесть результат работы функции
//strlen(ADDRESS), разделить на два и ПРИСВОИТЬ РЕЗУЛЬТАТ ВЫЧИСЛЕНИЯ ПЕРЕМЕННОЙ spaces

int main(void) //имя функции (объявление функции с именем main
/*Программа на С состоит из одной или большего числа функций - базовых
модулей программ на С.
Круглые скобки показывают, что main() есть имя функции,
int - указывает на то, что функция main() ВОЗВРАЩАЕТ ЦЕЛОЕ ЧИСЛО,
void - говорит о том, что функция main() НЕ ПРИНИМАЕТ НИКАКИХ АРГУМЕНТОВ.

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

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

--------------------------------------------------------------------------------------------------------------------------

/*СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ определяет каким образом данные преобразутся в отображаемую форму*/
%d //СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ десятичное число со знаком
%ld //СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ десятичное число со знаком для типа long
& //СПЕЦИФИКАТОР чтения типов из одного базового элемента
%p //спецификатор для адресов

//Проверка для выяснения где храняться переменные
#include <stdio.h>
void mikado(int); //объявление функции, которая принимает агрумент типа int, и ничего не возвращает

int main(void)
{
int pooh = 2, bah = 5; //локальные переменные для main()
printf("Внутри main() pooh = %d и &pooh = %p \n", pooh, &pooh);
printf("Внутри main() bah = %d и &bah = %p \n", bah, &bah);
mikado(pooh);
return 0;
}
void mikado(int bah) //определение функции, что функция делает - вычисляет где хранятся переменная bah
{
int pooh = 10; //локальная для mikado()
printf("Внутри mikado() pooh = %d и &pooh = %p \n", pooh, &pooh);
printf("Внутри mikado() bah = %d и &bah = %p \n", bah, &bah);
}

ВЫВОД НА ЭКРАН
Внутри main() pooh = 2 и &pooh = 0xffffcc0c
Внутри main() bah = 5 и &bah = 0xffffcc08
Внутри mikado() pooh = 10 и &pooh = 0xffffcbcc
Внутри mikado() bah = 2 и &bah = 0xffffcbe0

---------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------
//ПРИМЕР 14 Inverted half pyramid

#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА - подключение файла стандартной библиотеки С stdio.h содержит библиотеку функций ввода-вывода
void figure(void); //объявление прототипа функции
int main(void)
{
int i, j, rows; //объявление переменных, тип данных целочслен. значения
printf("Enter the number of rows: \n"); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() - функция вывода на экран.
/*получить входные данные от пользователя*/
scanf("%d", &rows); //(& амперсанд) для указания на то, где можно найти переменную
printf("Поучить фигуру \n");
return 0;

void figure(void) //определение функции, что функция делает

for (i=rows; i>= 1; --i) //ВНЕШНИЙ ЦИКЛ - условие для рядов rows - ряд

{
for (j=1; j<=i; ++j) //ВНУТРЕНИИЙ ЦИКЛ - для рспечатывания всех колонок каждого ряда
{
printf("* "); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() - функция ВЫВОДА НА ЭКРАН - управляющая строка и переменная
}
printf("\n");
}
}
-----------------------------------------------------------------------------------------------------------------

/*Объявление аргумента создает ПЕРЕМЕННУЮ, которая называется ФОРМАЛЬНЫМ АРГУМЕНТОМ или ФОРМАЛЬНЫМ ПАРАМЕТРОМ*/
/*ПРОТОТИП - ЭТО ОБЪЯВЛЕНИЕ ФУНКЦИИ, В КОТОРОМ ДАЕТСЯ ОПИСАНИЕ ВОЗВРАЩАЕМОГО ЗНАЧЕНИЯ ФУНЦИИ И ВСЕХ ЕЕ АРГУМЕНТОВ*/

/*ЧТО НУЖНО ЗНАТЬ О ФУНКЦИЯХ
- КАК ИХ ПРАВИЛЬНО ОПРЕДЕЛЯТЬ
- ВЫЗЫВАТЬ
- ОБЕСПЕЧИВАТЬ ВЗАИМОДЕЙСТВИЕ МЕЖДУ НИМИ*/


//ПРИМЕР 
#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки компилятора С. Заголовочный файл.
void pound(int n); //ОБЪЯВЛЕНИЕ ПРОТОТИПА ФУНКЦИИ, функция pound() принимает один аргумент int (целое число)
int main(void) //ИМЯ ФУНКЦИИ С АРГУМЕНТАМИ. Имя функции - main(). Функция которая всегда присуствует в программе на С.
//void - говорит о том, что функция main() не принимает никаких аргументов
{
int times = 5; //ОПЕРАТОРА ОБЪЯВЛЕНИЯ ПЕРЕМЕННОЙ с именем times и уведомляет, что ей приствоено целочислен.знач константа 5.
char ch = '!'; //ОПЕРАТОРА ОБЪЯВЛЕНИЯ ПЕРЕМЕННОЙ с именами ch -> символьный тип
float f = 6.0f; //ОПЕРАТОР ПРИСВАИВАНИЯ переменной f -> вещественное число
pound(times); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ pound(), аргумент типа int. ПРИСВАИВАНИЕ ПЕРЕМЕННОЙ n ЗНАЧЕНИЯ times
pound(ch); //Эквивалентно pound((int)ch); ПРЕОБРАЗОВАНИЕ АРГУМЕНТА В тип int с помощью ПРОТОТИПА void pound(int n)
pound(f); //Эквивалентно pound((int)f); ПРЕОБРАЗОВАНИЕ АРГУМЕНТА В тип int с помощью ПРОТОТИПА void pound(int n)
return 0;
}
void pound(int n) //ОПРЕДЕЛЕНИЕ ФУНКЦИИ (ЧТО ДЕЛАЕТ ФУНКЦИЯ)? , функция рисует узор с помощью "#"
{
while (n --> 0) //начало цикла while (МЕТОД ОБРАБОТКИ ДАННЫХ), проверка условия цикла
printf("#"); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем  printf() имеет один аргумент
printf("\n");
}

ВЫВОД НА ЭКРАН
#####
#################################
######

-------------------------------------------------------------------------------------------------------------------
//ПРИМЕР
/*ПАРАМЕТРЫ - это переменные,
АРГУМЕНТЫ - это ЗНАЧЕНИЯ, которые предоставляются вызовом функции и присваиваются соответствующим параметрам */
pound(times);
//(times) -> АРГУМЕНТ(ЗНАЧЕНИЕ) функции pound()
//n -> параметр функции

/*ПРОТОТИП  - это форма объявления, которая уведомляет компилятор о том, что вы
используете КОНКРЕТНУЮ ФУНКЦИЮ, поэтому он называется ОБЪЯВЛЕНИЕМ ФУНКЦИИ. Он также определяет СВОЙСТВА ФУНКЦИИ.
В данном примере pound() есть прототип функции. */

void pound(int n);
Первое void - говорит, что функция pound() не возвращает никакого значения
Второе pound(int n) говорит о том, функция pound() принимает один аргумент int тип - целое число

-----------------------------------------------------------------------------------------------------------------

//ПРИМЕР ПРОГРАММЫ КОТОРАЯ ВЫБИРАЕТ МЕНЬШЕЕ ИЗ ДВУХ ЧИСЕЛ
#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки компилятора С. Заголовочный файл.
int imin(int n, int m); //ОБЪЯВЛЕНИЕ ПРОТОТИПА ФУНКЦИИ, функция imin() принимает один два аргумент int (целое число), возвращает int - целое число
int main(void) //ИМЯ ФУНКЦИИ С АРГУМЕНТАМИ. Имя функции - main(). Функция которая всегда присуствует в программе на С.
//void - говорит о том, что функция main() не принимает никаких аргументов
{
int evil1, evil2;
printf("Введите два целых числа (или q для заверешения): \n");
while (scanf("%d %d", &evil1, &evil2) == 2)
{
printf("Меньшим из двух чисел %d и %d является %d. \n", evil1, evil2, imin(evil1, evil2));
printf("Введите два целых числа (или q для заверешения): \n");
}
printf("Программа завершенаю \n");
return 0;
}
int imin(int n, int m) //ОПРЕДЕЛЕНИЕ ФУНКЦИИ (ЧТО ДЕЛАЕТ ФУНКЦИЯ)? Функция сравнивает два числа
{
int min;
if(n < m)
min = n;
else
min = m;
return min;
}
ВЫВОД НА ЭКРАНЕ
Введите два целых числа (или q для заверешения):
4 5
Меньшим из двух чисел 4 и 5 является 4.
Введите два целых числа (или q для заверешения):
17 56
Меньшим из двух чисел 17 и 56 является 17.
Введите два целых числа (или q для заверешения):
q
Программа завершенаю

-----------------------------------------------------------------------------------------------------------------------

//ДЕМОНСТРАЦИОННАЯ ПРОГРАММА
#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки компилятора С. Заголовочный файл.
const int S_PER_M = 60; //ОБЪЯВЛЕНИЕ КОНСТАНТЫ тип данных - целочисленный int -> кол-во секунд в милях
const int S_PER_Н = 3600; //ОБЪЯВЛЕНИЕ КОНСТАНТЫ тип данных - целочисленный int -> кол-во секунд в часе
const double M_PER_K = 0.62137; //ОБЪЯВЛЕНИЕ КОНСТАНТЫ тип данных - вещественный -> кол-во миль в км
int main(void) //ОБЯВЛЕНИЕ ФУНКЦИИ с именем main() - главная функция, каркас программы на С
{
double distk, distm; //ОПЕРАТОРА ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ с именами distk, distm и уведомляет, что они имеют вещественный тип
//дистанция пробега в км и милях
double rate; //ОПЕРАТОРА ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ с именами rate и уведомляет, что она имеет вещественный тип
//средняя скорость в милях в час
int time; //ОПЕРАТОРА ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ с именами time и уведомляет, что они имеют целочисленный тип
//время пробега только с сек.
double mtime; //ОПЕРАТОРА ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ с именами mtime и уведомляет, что они имеют вещественный тип
//время пробега одной мили в секундах
int mmin, msec; //ОПЕРАТОРА ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ с именами mmin, msec и уведомляет, что они имеют целочисленный тип
//время пробега одной мили в минутах и секундах
printf("Эта программа преобразует время пробега дистанции в метрической системе.\n"); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ имеет один аргумент - управляющая строка
printf("во время пробега одной мили и вычислет вашу среднюю\n");
printf("скорость в милях в час\n");

/*получить входные данные от пользователя*/
printf("Введите дистанцию пробега в километрах\n");
scanf("%lf", &distk); //ОПЕРАТОР ВЫЗОВА ИНТЕРАКИВНОЙ ФУНКЦИИ, УКАЗАТЕЛИ НА ПЕРЕМЕННЫЕ, %lf для типа double
printf("Введите время в минутах и секундах.\n");
printf("Начните с ввода минут.\n");
scanf("%d", &min); //ОПЕРАТОР ВЫЗОВА ИНТЕРАКИВНОЙ ФУНКЦИИ, УКАЗАТЕЛИ НА ПЕРЕМЕННЫЕ
printf("Теперь введите секунды\n");
scanf("%d", &sec);
//переводим время в секунды
time = S_PER_M * min + sec; //ОПЕРАТОР ПРИСВАИВАНИЯ - получить значение константы S_PER_M, умножить на значение переменной min,
//прибавить значение переменной sec и ПРИСВОИТЬ РЕЗУЛЬТАТ ВЫЧИСЛЕНИЯ переменной time
//переводит километры в мили
distm = M_PER_K * distk; //OПЕРАТОР ПРИСВАИВАНИЯ - получить значение константы M_PER_K, умножить на значение переменной distk,
//и ПРИСВОИТЬ РЕЗУЛЬТАТ ВЫЧИСЛЕНИЯ переменной distm
//умножение миль в секунду на количество секунд в часе дает кол-во миль в час
rate = distm / time * S_PER_Н //OПЕРАТОР ПРИСВАИВАНИЯ - получить значение переменной distm, time, получить значение константы S_PER_Н.
//Вычислить выражение и ПРИСВОИТЬ РЕЗУЛЬТАТ ВЫЧИСЛЕНИЯ переменной rate
//деление времени на расстояние дает время пробега одной мили
mtime = (double) time / distm; //OПЕРАТОР ПРИСВАИВАНИЯ
mmin = (int) mtime / S_PER_M; //OПЕРАТОР ПРИСВАИВАНИЯ. Вычисление полного количества минут
msec = (int) mtime % S_PER_M; //OПЕРАТОР ПРИСВАИВАНИЯ. Вычисление остатка в секундах
printf("Вы пробежали %1.2f км (%1.2f мили) за %d мин, %d сек. \n", distk, distm, min, sec); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ имеет пять аргументов ->
//управляющая строка и СПИСОК ПЕРЕМЕННЫХ
prinf("Такая скорость соответсвует пробегу одной мили за %d мин", mmin);
printf("%d сек. \n Ваша средняя скорость составила %1.2f миль в секунду ", msec, rate);
return 0;
}

//ВЫРАЖЕНИЯ - КОМБИНАЦИИ ОПЕРАЦИЙ И ОПЕРАНДОВ
//ОПЕРАЦИИ - ИНСТРУКЦИИ ДЛЯ КОМПЬЮТЕРА, МЕТОДЫ ОБРАБОТКИ ДАННЫХ
//ОПЕРАНДЫ - ТО НАД ЧЕМ ПРОВОДЯТ ОПЕРАЦИИ. ТИП ДАННЫХ.

/*При определении ФУНКЦИИ, которая принимает АРГУМЕНТ, в определении функции мы объявляем ПЕРЕМЕННУЮ или ФОРМАЛЬНЫЙ АРГУМЕНТ.
Затем, значение, передаваемое в вызове функции, прсваивается этой переменной и может применятся внутри данной функции. */
printf("скорость в милях в час\n", min); //ВЫЗОВ ФУНКЦИИ printf(), то что в "", min  -> аргумент(значение). ПЕРЕМЕННАЯ - min -> ФОРМАЛЬНЫЙ АРГУМЕНТ

%lf //СПЕЦИФИКАТОР указывают, что значение  будет сохранено с типом double более точное число с плавающей точкой
& //СПЕЦИФИКАТОР чтения типов из одного базового элемента
%d //СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ десятичное число со знаком
int main(void)
/*int - указывает на то, что функция main() возвращает целое число,
void - говорит о том, что функция main() не принимает никаких аргументов.*/

-------------------------------------------------------------------------------------------------------------------------

//ФУНКЦИЯ strlen()
sizeof - операция, которая предоставляет размер типа в байтах
strlen() - возращает длину строки в символах

/*ЧТО НУЖНО ЗНАТЬ О ФУНКЦИЯХ
- КАК ИХ ПРАВИЛЬНО ОПРЕДЕЛЯТЬ
- ВЫЗЫВАТЬ
- ОБЕСПЕЧИВАТЬ ВЗАИМОДЕЙСТВИЕ МЕЖДУ НИМИ*/

//EXAMPLES

#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки компилятора С.
#include <string.h> //предоставляет ПРОТОТИП ФУНКЦИИ strlen() (Данный заголовочный файл содержит прототипы для обработки строк)
#define PRAISE "Вы выдающаяся личность" // СИМВОЛИЧЕСКАЯ КОНСТАНАТА
int main(void) //ИМЯ ФУНКЦИИ С АРГУМЕНТАМИ. Имя функции - main(). Функция которая всегда присуствует в программе на С.
{
char name[40]; //ОПЕРАТОР ОБЪЯВЛЕНИЯ МАССИВ ИЗ 40 ЭЛЕМЕНТОВ с именем name, и уведомляет что он имеет тип данных char - символьное значение
printf("Как ва зовут?\n"); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет один аргумент

/*получить входные данные от пользователя*/
scanf ("%s", name); //ОПЕРАТОР ВЫЗОВА ИНТЕРАКИВНОЙ ФУНКЦИИ - пользователь вводит символ, имеет два аргумента => УПРАВЛЯЮЩАЯ СТРОКА И УКАЗАТЕЛЬ НА ПЕРЕМЕННЫХ
printf("Здравствуйте, %s. %s\n", name, PRAISE); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет три аргумента -> управляющая строка "", список переменных
printf("Ваше имя состоит из %zd символов и занимает %zd ячеек памяти. \n", strlen(name), sizeof name);//ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет три аргумента
printf("Хвалебная фраза содержит %zd символов", strlen(PRAISE)); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет два аргумента
printf("и занимает %zd ячеек памяти. \n", sizeof PRAISE); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет два аргумента -> управляющая строка "", список переменных
return 0; //ОПЕРАТОР ВОЗВРАТА
}

ВЫВОД НА ЭКРАН
Как ва зовут?
Tanya
Здравствуйте, Tanya. Вы выдающаяся личность
Ваше имя состоит из 5 символов и занимает 40 ячеек памяти.
Хвалебная фраза содержит 42 символови занимает 43 ячеек памяти.

-------------------------------------------------------------------------------------------------------------

/* В общем случае С разделяет БИБЛИОТЕКУ ФУНКЦИЙ на семейство связанных функций и предоставляет отдельный заголовочный файл для
каждого семейства.
ФУНКЦИИ printf(), scanf() принадлежит семейству стандартных функций ввода-вывода и имеют свой заголовочный файл stdio.h
ФУНКЦИЯ strlen() объединяет вокруг себя ряд других функций обработки строк таких как фунции функции копирования и поиска
в строках и имеют заголовочный файл string.h
*/

sizeof - //Операция сообщает что массив name имеет 40 ячеек памяти.
strlen() - //Функции strlen() известно, когда остановить подсчет символов

//КОНСТАНТЫ
circumference = 3.14159 * diameter; //общеизвестная константа Пи
circumference = Pi * diameter; //символическая константа Пи

#define ИМЯ значение //формат символической константы
#define TAXRATE 0.015 //СИМВОЛИЧЕСКАЯ КОНСТАНТА ФОРМАТ
----------------------------------------------------------------------------------------------------------------

//ПРИМЕР 
#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки компилятора С.
#define PI 3.14159 // СИМВОЛИЧЕСКАЯ КОНСТАНАТА
int main(void) //ИМЯ ФУНКЦИИ С АРГУМЕНТАМИ. Имя функции - main(). Функция которая всегда присуствует в программе на С.
{
float area, circum, radius; //ОПЕРАТОР ОБЪЯВЛЕНИЯ ПЕРЕМЕННЫХ с именами area, circum, radius и уведомляет что онb имеет тип число с плавающей точкой
printf("Каков радиус вашей пиццы?\n"); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет один аргумент. 

/*получить входные данные от пользователя*/
scanf ("%f", &radius); //ОПЕРАТОР ВЫЗОВА ИНТЕРАКИВНОЙ ФУНКЦИИ - пользователь вводит символ, имеет один аргумент.Спецификатор %f для вывода числе типа float и double
area = PI * radius * radius; //ОПЕРАТОР ПРИСВАИВАНИЯ, получить значение переменной radius  и умножить его на PI -константа
//и присвоить результат вычисления переменной area
circum = 2.0 * PI * radius; //ОПЕРАТОР ПРИСВАИВАНИЯ, получить значение переменной radius, умножить его на PI -символич. константа, умножить на 2.0 (числовая константа)
//и присвоить результат вычисления переменной area

printf("Основные параметры вашей пиццы:\n"); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет один аргумент
printf("Длина окружности = %1.2f, площадь = %1.2f\n", circum, area); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет три аргумента
return 0; //ОПЕРАТОР ВОЗВРАТА
}

ВЫВОД НА ЭКРАН
Каков радиус вашей пиццы?
20
Основные параметры вашей пиццы:
Длина окружности = 125.66, площадь = 1256.64

------------------------------------------------------------------------------------------------------------
//ПРИМЕР 
#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки компилятора С. Заголовочный файл.
#include <limits.h> //Заголовочный файл - пределы для целых чисел (размеры)
#include <float.h> //пределы для чисел с плавающей точкой
int main(void) //ИМЯ ФУНКЦИИ С АРГУМЕНТАМИ. Имя функции - main(). Функция которая всегда присуствует в программе на С.
{
printf("Некоторые пределы числе для данной системы:\n"); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет один аргумент
printf("Наибольшее значение типа int: %d \n", INT_MAX);//ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет два аргумента
printf("Наименьшее значение типа long long: %lld", LLONG_MIN); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет два аргумента
printf("В данной системе один байт = %d битов. \n", CHAR_BIT);
printf("Наибольшее значение типа double: %e\n", DBL_MAX);
printf("Наименьшее нормализованное значение типа float: %e\n", FLT_MIN);
printf("Точность значения типа float = %d знаков\n", FLT_DIG);
printf("Разница между 1.0 и минимальным значением float, которое больше 1.00 = %e знаков\n", FLT_EPSILON);
return 0; //ОПЕРАТОР ВОЗВРАТА
}

INT_MAX //Символьная константа - максимальное значение типа int
LLONG_MIN //Минимальное значение типа long long
CHAR_BIT //Количество битов в типе char
DBL_MAX //Наибольшее значение типа double
FLT_MIN //Наименьшее нормализованное значение типа float сохраняющее полную точность
FLT_DIG //Минимальное количество значащих десятичных цифр для типа float - число в плавающей точкой типа 2.8076
FLT_EPSILON //Разница межд 1.00 и минимальным значением float, которое больше 1.00

-------------------------------------------------------------------------------------------------------------

#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки С
void butler(void); //Объявления ПРОТОТИП ФУНКЦИИ с именем batler()
int main(void) //ИМЯ ФУНКЦИИ С АРГУМЕНТАМИ. Имя функции - main(). Функция которой всегда присуствует в программе на С.
{
printf("I call the boss. \n"); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет один аргумент
butler(); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем  butler() - это ПРОТОТИП ФУНКЦИИ 
printf("yes. \n");
return 0; //ОПЕРАТОР ВОЗВРАТА 
}
void butler(void) //ОПРЕДЕЛЕНИЕ ФУНКЦИИ (ЧТО ДЕЛАЕТ ФУНКЦИЯ)? , функция выводит на экран "yes". Функция не принимает аргументов и нечего не возвращает
{
printf("Yes. \n"); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет один аргумент. АРГУМЕНТ - ЭЛЕМЕНТЫ ИНФОРМАЦИИ, ПЕРЕДАВАЕМОЙ ФУНКЦИИ. 
}

ВЫВОД НА ЭКРАН
I call the boss. 
Yes. 
yes. 

//БУФЕР - ПРОМЕЖУТОЧНАЯ ОБЛАСТЬ ХРАНЕНИЯ

/*ФУНКЦИЯ в программировании — фрагмент программного кода (подпрограмма), к которому можно обратиться из другого места программы.
Функция может принимать параметры и должна возвращать некоторое значение, возможно пустое. Функции, которые возвращают пустое значение, часто называют ПРОЦЕДУРАМИ.
ПОДПРОГРАММА (ПРОЦЕДУРА) (англ. subroutine) — поименованная или иным образом идентифицированная часть компьютерной программы, содержащая описание определённого набора 
действий. ПОДПРОГРАММА может быть многократно вызвана из разных частей программы. 
*/

/* В данном примере функция batler() трижды появилась в программе 
1) в виде прототипа void butler(void) передающего компилятору информацию о функциях
которые будут использоваться в данной программе 
2) появлятся в теле функции main() в форме вызова функции 
3) в виде определения функции, которое является исходным кодом самой функции 

ПРОТОТИП  - это форма объявления, которая уведомляет компилятор о том, что вы 
используете КОНКРЕТНУЮ ФУНКЦИЮ, поэтому он называется ОБЪЯВЛЕНИЕМ ФУНКЦИИ. Он также определяет СВОЙСТВА ФУНКЦИИ. 
В данном примере butler() есть прототип функции. 

void butler(void) 
Первое void - говорит, что butler() не имеет возвращаемого значения 
Второе butler(void) говорит о том, что функция butler() не принимает аргументов 

Т.о. функция butler() не принимает никаких аргументов(параметров) и не возвращает значения. 

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

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

УКАЗАТЕЛИ
/*УКАЗАТЕЛЬ - представляет собой переменную, используемую для хранения адреса. 
СТЭК - ВРЕМЕННАЯ ПАМЯТЬ - Сегмент который содержит величины, данные проходящиее через функции и процедуры внутри программы
Функция scanf() работает с адресами аргументов. 
*/

& - //унитарная операция предоставляет адрес по которому хранится переменная. 
pooh //переменная
&pooh //адрес этой переменной 

//ПРИМЕР
pooh = 24; //оператор, инициализация переменной и присваивание ей целочисл. значения константы 24
//адрес по котрому храниться переменная pooh является 0B76 - шестнадцатиричное число

printf("%d %p\n", pooh, &pooh); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ имеет один аргумент - управляющая строка

/*СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ определяет каким образом данные преобразутся в отображаемую форму*/
%d //СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ десятичное число со знаком 
%p //спецификатор варьируется

//ПРИМЕР 
#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки компилятора С. Заголовочный файл. 
void mikado(int); //Объявление функции с именем mikado(), КОТОРАЯ ПРИНИМАЕТ АРГУМЕНТ int, и НИЧЕГО НЕ ВОЗВРАЩАЕТ 
int main(void)
{
int pooh = 2; bah = 5; //Инцициализация локальных переменных для main(). Тип переменных целочислен. int 
printf("Внутри main() pooh = %d и &pooh = %p\n", pooh, &pooh); //Оператор вызова фунции имеет три аргумента -> упаравляющая строка, переменная, указатель 
printf("Внутри main() bah = %d и &bah = %p\n", bah, &bah); //Оператор вызова фунции имеет три аргумента -> упаравляющая строка, переменная, указатель 
mikado(pooh); //оператор вызова фунции
return 0;
}
void mikado(int bah); //Объявление функции с именем mikado(), КОТОРАЯ ПРИНИМАЕТ АРГУМЕНТ int, и НИЧЕГО НЕ ВОЗВРАЩАЕТ 
{
int pooh = 10; //Инициализация локальной переменной для mikado(), тип данных int 
printf("Внутри mikado() pooh = %d и &pooh = %p\n", pooh, &pooh); //Оператор вызова фунции имеет три аргумента -> упаравляющая строка, переменная, указатель 
printf("Внутри mikado() bah = %d и &bah = %p\n", bah, &bah); //Оператор вызова фунции имеет три аргумента -> упаравляющая строка, переменная, указатель 
}

interchange() //Изменение переменных в вызывающей функции 

//ПРИМЕРЫ
nurse = 22;
ptr = &nurse; //указатель на nurse
val = *ptr; //присваивает val значение, хранящееся в ячейке ptr 

//ОБЪЯВЛЕНИЕ УКАЗАТЕЛЕЙ 
int * pi; //pi - указатель на целочисленную переменную
char * pc; //pc - указатель на символьную переменную 
float * pf, * pg //pf, pg - указатели на переменные с плавающей запятой 

//В ОБЩЕМ СЛУЧАЕ В ФУНКЦИЮ МОЖНО ПЕРЕДАТЬ ДВА ВИДА ИНФОРМАЦИИ О ПЕРЕМЕННОЙ. 
//Первая форма требует чтобы определение функции включало формальный аргумент 
int function1 (int num) //ф-ции передают значение для вычисления или действия 

// Вторая форма - определение функции должно включать формальный параметр, который является указателем на конкретный тип
int function2 (int * ptr) //испол. если ф-ция должна изменять значения переменных из вызывающей функции 

/*ПЕРЕМЕННАЯ ИМЕЕТ ДВА АТРИБУТА
- ИМЯ
- ЗНАЧЕНИЕ 
а также 
- ТИП

ПОСЛЕ ТОГО КАК ПРОГРАММА СКОМПИЛИРОВАНА И ЗАГРУЖЕНА ПЕРЕМЕННАЯ РАСПОЛАГАЕТ 
- АДРЕСОМ
- ЗНАЧЕНИЕМ */
&barn //адрес переменной barn 

//СВОДКА ФУНКЦИИ
int diff (int x, int y) //функция с именем diff, список объявлен. переменных int x, int y 
{
int z; //объявление локальной переменной
z = x - y;
return z; //возвращение значения 
}
//ПРИМЕР 
double duff (double, int); //прототип функции
int main(void)
{
double q,x;
int n;
.....
q = duff(x, n); //вызов функции 
}
double duff (double u, int k) //определение фунции 
{
double tor;
.....
return tor; //возврат значение типа double 
}

РЕКУРСИЯ
/*РЕКУРСИЯ - ФУНКЦИИ РАЗРЕШЕНО ВЫЗЫВАТЬ САМУ СЕБЯ
КОД - это последовтельность инструкций, а ВЫЗОВ ФУНКЦИИ представляет собой команду перехода на начало этой последовательности
инструкций. РЕКУРСИВНЫЙ ВЫЗОВ затем возвращает программу в начало упомянутой последовтельности инструкций. 

ХВОСТОВАЯ РЕКУРСИЯ - рекурсивный вызов находится в конце функции, непосредственно перед оператором return - это хвостовая или концевая рекурсия. 
СТЭК - ВРЕМЕННАЯ ПАМЯТЬ - Сегмент который содержит величины, данные проходящиее через функции и процедуры внутри программы
/*ПРОТОТИП - ЭТО ОБЪЯВЛЕНИЕ ФУНКЦИИ, В КОТОРОМ ДАЕТСЯ ОПИСАНИЕ ВОЗВРАЩАЕМОГО ЗНАЧЕНИЯ ФУНЦИИ И ВСЕХ ЕЕ АРГУМЕНТОВ*/

/*ЧТО НУЖНО ЗНАТЬ О ФУНКЦИЯХ
- КАК ИХ ПРАВИЛЬНО ОПРЕДЕЛЯТЬ
- ВЫЗЫВАТЬ
- ОБЕСПЕЧИВАТЬ ВЗАИМОДЕЙСТВИЕ МЕЖДУ НИМИ*/

//ПРИМЕР
#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки компилятора С. Заголовочный файл. 
void up_and_down(int); //ОПРЕДЕЛЕНИЕ ФУНКЦИИ с именем up_and_down(), КОТОРАЯ ПРИНИМАЕТ АРГУМЕНТ int, НО НИЧЕГО НЕ ВОЗВРАЩАЕТ 

int main(void) //ОБЯВЛЕНИЕ ФУНКЦИИ с именем main() - главная функция, каркас программы на С
{
up_and_down(1);
return 0;
}

void up_and_down(int n) //ОПРЕДЕЛЕНИЕ ФУНКЦИИ с именем up_and_down(), КОТОРАЯ ПРИНИМАЕТ АРГУМЕНТ int, НО НИЧЕГО НЕ ВОЗВРАЩАЕТ 
{
printf("Level %d: ячейка n %p\n", n, &n); //1 На каждом уровне рекурскии прим. собств. закрытая переменная n 
if (n < 4)
up_and_down(n + 1);
printf("Level %d: ячейка n %p\n", n, &n); //2
}

ВЫВОД НА ЭКРАНЕ
Level 1: ячейка n 0xffffcbf0
Level 2: ячейка n 0xffffcbc0
Level 3: ячейка n 0xffffcb90
Level 4: ячейка n 0xffffcb60
Level 4: ячейка n 0xffffcb60
Level 3: ячейка n 0xffffcb90
Level 2: ячейка n 0xffffcbc0
Level 1: ячейка n 0xffffcbf0

/*СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ определяет каким образом данные преобразутся в отображаемую форму*/
%d //СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ десятичное число со знаком 
%ld //СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ десятичное число со знаком для типа long 
& //СПЕЦИФИКАТОР чтения типов из одного базового элемента 

/*ФАКТОРИЛ ЦЕЛОГО ЧИСЛА - это результат произведения всех целых чисел, начиная с 1 и заканчивая заданным числом. Например 
факторил 3 (записывается как 3!) соответствует 1*2*3 
*/

//ПРИМЕР 
#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки компилятора С. Заголовочный файл. 
long fact(int n); //ОПРЕДЕЛЕНИЕ ФУНКЦИИ с именем fact(), КОТОРАЯ ПРИНИМАЕТ АРГУМЕНТ int, и ВОЗВРАЩАЕТ ЗНАЧЕНИЕ ТИПА long
long rfact (int n); //ОПРЕДЕЛЕНИЕ ФУНКЦИИ с именем rfact(), КОТОРАЯ ПРИНИМАЕТ АРГУМЕНТ int, и ВОЗВРАЩАЕТ ЗНАЧЕНИЕ ТИПА long
int main (void)
{
int num; //ОБЪЯВЛЕНИЕ ПЕРЕМЕННОЙ с именем num, тип int 
printf ("Эта программа вычисляет факториалы. \n"); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ имеет один аргумент - управляющая строка
printf ("Введите значение в диапазоне 0-12 (q для завершения) : \n");
while (scanf("%d", &num) == 1) //ЦИКЛ. ОПЕРАТОР ВЫЗОВА ИНТЕРАКИВНОЙ ФУНКЦИИ, УКАЗАТЕЛИ НА ПЕРЕМЕННЫЕ, == РАВНО 
{
if (num < 0)
printf ("Отрицаельные числа не подходят. \n");
else if (num > 12)
printf ("Вводимое значение должно быть меньше 13. \n");
else
{
printf("Цикл: факториал %d = %ld\n", num, fact(num)); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ имеет три аргумента - управляющая строка, переменная, функцияd
printf("Цикл: факториал %d = %ld\n", num, rfact(num)); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ имеет три аргумента - управляющая строка, переменная, функцияd
}
printf("Введите значение в диапазоне 0-12 (q для завершения) : \n"); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ имеет один аргумент - управляющая строка
}
printf("Программа завершена. \n");
return 0;
}
long fact(int n) //функция, основанная на цикле. ОПРЕДЕЛЕНИЕ ФУНКЦИИ (ЧТО ДЕЛАЕТ ФУНКЦИЯ - вычисляет факториал). Принимает аргумент(параметр) int, возвращает тип long 
{
long ans; //ОБЪЯВЛЕНИЕ ПЕРЕМЕННОЙ с именем ans, ТИПА long 
for (ans = 1; n > 1; n--)
ans *= n;
return ans; 
}
long rfact (int n) //Рекурсивная версия. ОПРЕДЕЛЕНИЕ ФУНКЦИИ - что делает функция - вычисляет факториал.  Принимает аргумент(параметр) int, возвращает тип long 
{
long ans; //ОБЪЯВЛЕНИЕ ПЕРЕМЕННОЙ с именем ans, ТИПА long 
if (n > 0)
ans = n * rfact(n - 1);
else
ans = 1; 
return ans; 
}
ВЫВОД НА ЭКРАН
Эта программа вычисляет факториалы. 
Введите значение в диапазоне 0-12 (q для завершения) : 
6
Цикл: факториал 6 = 720
Цикл: факториал 6 = 720
Введите значение в диапазоне 0-12 (q для завершения) : 
3
Цикл: факториал 3 = 6
Цикл: факториал 3 = 6
Введите значение в диапазоне 0-12 (q для завершения) : 
q
Программа завершена. 

//РЕГИСТРЫ - хранят элементы данных без доступа к памяти. 
------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------

//ПРИМЕР 
#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки компилятора С. Заголовочный файл. 
long fact(int n); //ОПРЕДЕЛЕНИЕ ФУНКЦИИ с именем fact(), КОТОРАЯ ПРИНИМАЕТ АРГУМЕНТ int, и ВОЗВРАЩАЕТ ЗНАЧЕНИЕ ТИПА long
int main (void)
{
int num; //ОБЪЯВЛЕНИЕ ПЕРЕМЕННОЙ с именем num, тип int 
printf ("Эта программа вычисляет факториалы. \n"); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ имеет один аргумент - управляющая строка
printf ("Введите значение в диапазоне 0-12 (q для завершения) : \n");
while (scanf("%d", &num) == 1) //ЦИКЛ. ОПЕРАТОР ВЫЗОВА ИНТЕРАКИВНОЙ ФУНКЦИИ, УКАЗАТЕЛИ НА ПЕРЕМЕННЫЕ, == РАВНО 
{
if (num < 0)
printf ("Отрицаельные числа не подходят. \n");
else if (num > 12)
printf ("Вводимое значение должно быть меньше 13. \n");
else
{
printf("Цикл: факториал %d = %ld\n", num, fact(num)); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ имеет три аргумента - управляющая строка, переменная, функцияd
}
printf("Введите значение в диапазоне 0-12 (q для завершения) : \n"); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ имеет один аргумент - управляющая строка
}
printf("Программа завершена. \n");
return 0;
}
long fact(int n) //функция, основанная на цикле. ОПРЕДЕЛЕНИЕ ФУНКЦИИ (ЧТО ДЕЛАЕТ ФУНКЦИЯ - вычисляет факториал). Принимает аргумент(параметр) int, возвращает тип long 
{
long ans; //ОБЪЯВЛЕНИЕ ПЕРЕМЕННОЙ с именем ans, ТИПА long 
for (ans = 1; n > 1; n--)
ans *= n;
return ans; 
}

ВЫВОД НА ЭКРАН
Эта программа вычисляет факториалы. 
Введите значение в диапазоне 0-12 (q для завершения) : 
6
Цикл: факториал 6 = 720
Введите значение в диапазоне 0-12 (q для завершения) :
9
Цикл: факториал 9 = 362880
Введите значение в диапазоне 0-12 (q для завершения) : 
q
Программа завершена. 

//ФОРМАТ ФУНКЦИИ printf()
//В ФУНКЦИИ printf() ПРИМЕНЯЮТСЯ ИМЕНА ПЕРЕМЕННЫХ, КОНСТАНТЫ И ВЫРАЖЕНИЯ
//В ФУНКЦИИ scanf() ПРИМЕНЯЮТСЯ УКАЗАТЕЛИ НА ПЕРЕМЕННЫЕ 
printf("управляющая-строка", элемент1, элемент2, ...);
элемент1, элемент2 и т.д. - //эти элементы которые нужно вывести. Ими могут быть переменные, константы или выражения 
//которые вычисляются до того, как значение будет выведено 
управляющая-строка, //это символьная строка, описывающая способ вывода элементов, заключена в "" кавычки. 

printf("%d участников соревнований съели %f пирожков с вишнями. \n", number, pies);
/*ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет три аргумента: управляющая строка и список из двух переменных number, pies
В управляющей строке есть два СПЕЦИФИКАТОРА ПРЕОБРАЗВАНИЯ 
%d //СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ десятичное число со знаком 
%f //число с плавающей запятой, десятичное представление 
УПРАВЛЯЮЩАЯ СТРОКА содержит два разных вида информации:
- символы которые в действительности выводятся
- спецификаторы преобразования 
*/

/*СТРОКА - это последовательности символов, трактуемая как отдельная единица. 
МАССИВ - это последовательность элементов, имеющих один и тот же тип. 
char name [30];
*/

//ПРИМЕР 
#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки компилятора С. Заголовочный файл. 
#define PI 3.141593 //СИМВОЛИЧЕСКАЯ КОНСТАНАТА 
int main(void) //ИМЯ ФУНКЦИИ С АРГУМЕНТАМИ. Имя функции - main(). Функция которая всегда присуствует в программе на С.
//void - говорит о том, что функция main() не принимает никаких аргументов
{
int number = 7; //ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННОЙ с именем name и ПРИСВАИВАНИЕ ей целочисленного значени int, КОНСТАНТА -7
float pies = 12.75; //ИНИЦИАЛИЗАЦЯ ПЕРЕМЕННОЙ с именами pies и ПРИСВАИВАНИЕ ЕЙ вещественное значение. КОНСТАНТА -> 12.75 (Вещественный тип - Литерал)
int coast = 7800; //ИНИЦИАЛИЗАЦИЯ ПЕРЕМЕННОЙ с именем coast и ПРИСВАИВАНИЕ ей целочисленного значени int, КОНСТАНТА -7800
printf("%d участников соревнований съели %f пирожков с вишнями. \n", number, pies); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет три аргумента
//управляющая строка "" и список переменных
printf("Значение pi равно %f \n", PI);//ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет два аргумента -> управляющая строка "" и список переменных
printf("До свидания! Ваше искусство слишком дорого обходится, \n"); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет один аргумент -> управляющая строка ""
printf("%c%d\n", 2 * coast); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет два аргумента -> управляющая строка "" и ссписок переменных
return 0; //ОПЕРАТОР ВОЗВРАТА
}
/*СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ определяет каким образом данные преобразутся в отображаемую форму*/
%d //СПЕЦИФИКАТОР ПРЕОБРАЗОВАНИЯ десятичное число со знаком 
%f //число с плавающей запятой, десятичное представление 
%c //одиночный символ 
%s //интерпретирует введенные данные как строку

//В ФУНКЦИИ printf() ПРИМЕНЯЮТСЯ ИМЕНА ПЕРЕМЕННЫХ, КОНСТАНТЫ И ВЫРАЖЕНИЯ
//В ФУНКЦИИ scanf() ПРИМЕНЯЮТСЯ УКАЗАТЕЛИ НА ПЕРЕМЕННЫЕ 

#include <stdio.h> //КОМАНДА ПРЕПРОЦЕССОРА. Подключение файла из стандартной библиотеки компилятора С. Заголовочный файл. 
int main(void) //ИМЯ ФУНКЦИИ С АРГУМЕНТАМИ. Имя функции - main(). Функция которая всегда присуствует в программе на С.
//void - говорит о том, что функция main() не принимает никаких аргументов
{
int age; //ОПЕРАТОР ОБЪЯВЛЕНИЯ ПЕРЕМЕННОЙ с именем age и уведомляет что переменная имеет тип int целочисленное значение 
float assets; //ОПЕРАТОР ОБЪЯВЛЕНИЯ ПЕРЕМЕННОЙ с именами assets и и уведомляет что переменная имеет тип float - вещественное значение 
char pet[30]; //ОПЕРАТОР ОБЪЯВЛЕНИЯ МАССИВ ИЗ 30 ЭЛЕМЕНТОВ с именем pet, и уведомляет что он имеет тип данных char - символьное значение
printf("Введите информацию о своем возрасте, сумме в банке и любимом животном \n"); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет один аргумент
//управляющая строка ""
scanf("%d %f", &age, &assets); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем scanf() имеет три аргумента -> управляющая строка "" и УКАЗАТЕЛИ НА ПЕРЕМЕННЫЕ
scanf("%s", pet); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем scanf() имеет два аргумент -> управляющая строка "" и УКАЗАТЕЛЬ НА ПЕРЕМЕННУЮ
printf("%D $%.2f %s\n", age, assets, pet); //ОПЕРАТОР ВЫЗОВА ФУНКЦИИ с именем printf() имеет четыре аргумента -> управляющая строка "" и СПИСОК ПЕРЕМЕННЫХ 
return 0; //ОПЕРАТОР ВОЗВРАТА
}