Язык С существует уже 50 лет и до сих пор не теряет своей актуальности. Он применяется для создания операционных систем и прикладного программного обеспечения. Синтаксис Си лег в основу многих структурных и объектно ориентированных языков программирования следующих поколений - от C++ до Java и Python. Именно поэтому С - отличная база для изучения принципов разработки ПО.
Особенности языка C
- Сочетание высокоуровневых и низкоуровневых черт.
Большинство команд на Си пишутся простым, человекопонятным языком. В то же время он может обрабатывать и команды низкого уровня, близкие к машинному языку. - Применимость для любых платформ.
Компилятор С можно поставить практически на любой процессор. Поэтому код на этом языке легко переносится между устройствами. - Широкое распространение.
Учитывая ответвления Си в виде C++ и С# можно утверждать, что С - самый популярный язык для разработки программного обеспечения. На нем пишутся операционные системы, корпоративные приложения и даже игры. - Быстрота и гибкость.
Сейчас программы на Си, несмотря на компилируемость, фактически не уступают в скорости программам, написанных на машинных языках высокого уровня.
История создания
Си - детище американского программиста Денниса Ритчи и его команды. Первая публичная версия языка была выпущена в 1972, но сама разработка началась несколькими годами ранее. Язык изначально не был заказан какой-либо компанией для определенных целей. Основным предназначением С на первоначальных этапах стало создание программного обеспечения для новой тогда операционной системы UNIX.
Первые официально задокументированные стандарты С вышли только в 80-х годах. Примерно в то же время Бьерн Страуструп начал работу над ответвлением Си, которое бы учитывало принципы объектно-ориентированного программирования. Новый язык был сначала назван “C с классами”, а позже был переименован в известный всем C++.
Где применяется C
По сути, Си применим во всех сферах, связанных с программированием. На нем можно создать ПО под любую известную ОС - Linux, Windows, MacOS и пр. Но из-за легкости создания компилятора С также часто используется для создания собственных операционок под новые устройства.
Отличия C, C++ и C#
Несмотря на общее название, рассматриваемые языки значительно отличаются. Роднит их в основном схожий синтаксис. Подходы к обработке данных у них разные.
Классический С предполагает процедурный процесс и лучше всего подходит для создания новых ОС или драйверов.
C++ это объектно ориентированный язык, содержащий классы, структуры и объекты. “Плюсы” считаются языком общего назначения и не имеют конкретной специализации.
C# также поддерживает принципы ООП. Этот язык разработан компанией Microsoft и предназначен для работы с платформой .NET Framework.
Сейчас большинство пользовательских приложений пишутся на C++ или C#. Иногда эти языки становятся частью специализированных платформ. Например, на C# основывается известная среда для создания игр Unity, а на С++ базируется игровой движок Unreal Engine.
Основные понятия и функции
Разберем на примерах, как строятся базовые алгоритмы в СИ и как выглядит синтаксис языка.
Объявление переменных
У каждой переменной, которой будет оперировать программа, есть свой определенный тип. Он зависит от вида используемых данных и от объема выделяемой памяти.
- int - целое число, занимающее 4 байта;
- short int - целое число, занимающее 2 байта;
- long int - целое число, занимающее 8 байт;
- char - текстовая переменная;
- float - дробное число, занимающее 4 байта;
- double - дробное число, занимающее 8 байт;
- int x [20] - целочисленный массив из 20 элементов;
- struct {int x; char y;} str_name - структура, состоящая из целых чисел и текстовых символов.
Объявляется переменная просто:
int x = 10
Иногда удобнее бывает удобнее объявить несколько переменных подряд, а значения им присвоить позже.
float x, y, z; x=2,5: y=3,6.
Внешние файлы
Для корректной работы некоторых функций в программах на Си перед написанием основного кода необходимо вызвать подключение внешних библиотек. Сделать это можно через команду #include. Так, одна из самых популярных библиотек, отвечающая за ввод и вывод данных, вызывается строкой #include <stdio.h>.
Комментарии
Чтобы закомментировать строку, в начале и конце нужно поставить соответственно знаки /* и */. Компилятор не учитывает текст, размещенный внутри этих операторов. Комментарий имеет значение только для разработчика.
Ввод и вывод информации
Ввести пользовательские данные в программу можно через команду scanf. За вывод запрашиваемых данных на экран отвечает команда printf.
Рассмотрим самый базовый пример вывода строки на экран.
#include <stdio.h> int main() { printf("Hello, World!\n"); return 0; }
Здесь строка void main обозначает главную функцию, то есть формальное начало программы. Строка return 0 означает завершение функции.
По правилам синтаксиса языка С функция заключается в фигурные скобки, а после каждой строки обязательно ставится точка с запятой.
Разберем также пример программы с вводом данных с клавиатуры.
#include <stdio.h> int main() { int x; printf( "Введите целое число: " ); scanf("%d", &x ); printf( "Ваше число %d", x ); return 0; }
Символ %d означает, что с консоли должно быть принято целое число. Запись &x приказывает программе записать введенное число в переменную x, которая была заранее объявлена в начале программы.
Чтобы ввести и вывести на экран не число, а текст, нужно применить символьный массив char.
#include <stdio.h> void main() { char name[21]; /* символьный массив с определенным количеством знаков */ printf( "Введите ваше имя: " ); scanf( "%s", name ); printf( "Здравствуйте, %s", name ); return 0; }
Оператор “Если”
Чтобы программа проверила какое-либо условие и в зависимости от его исполнения или неисполнения совершила конкретные действия, необходимо использовать оператор if.
Рассмотрим пример.
#include <stdio.h> void main() { int x; int y = 21; printf("Введите ваш номер: "); scanf("%d", &x); if (x>y) { printf("Ваш номер выше y"); /*если условие не соблюдается, выводим другое сообщение*/ } else { printf("Ваш номер ниже y"); } return 0; }
Здесь мы сравниваем введенное с клавиатуры число с заранее заданным значением и выводим на экран определенную надпись, в зависимости от результатов сравнения.
Оператор множественного выбора
Оператор switch применяется, если нам нужно выбрать больше, чем из двух вариантов.
Допустим, у нас есть пять маршрутов из точки А в точку Б, каждый из которых занимает разное время в пути. Выведем на экран время поездки в минутах в зависимости от номера маршрута.
#include <stdio.h> int main() { int number; printf("Введите номер маршрута "); scanf("%d", &number); switch (number) { case 1: printf("25 мин"); break; case 2: printf("28 мин"); break; case 3: printf("30 мин"); break; case 4: printf("35 мин"); break; case 5: printf("37 мин"); break; default: printf("Номер не найден"); } }
Команда break останавливает проверку при соответствии введенных данных заданному условию. Команда default срабатывает, если введенное значение не подходит ни к одному из условий.
Цикл For
Оператор For включает в себя три условия:
- изначальное значение переменной;
- значения, при которых цикл продолжает выполняться;
- способ обновления переменной.
Цикл последовательно изменяет переменную, пока она соответствует обозначенным параметрам.
Для примера напишем короткую программу, которая выводит на экран в обратном порядке числа от 1 до 10.
#include <stdio.h> int main() { int y; for ( y = 10; y > 0; y-=1){ printf( "%d\n", y ); } }
Пока y больше нуля, от изначального значения 10 на каждом шагу цикла отнимается единица.
Циклы While и Do while
Оператор while схож с For. Он проверяет заданное условие и выполняет указанное действие над переменной, пока условие верно.
#include <stdio.h> int main() { int y; while (y <= 10){ printf("%d\n",y*y); y++; } return 0; }
Оператор Do while сначала выполняет действие, а потом проверяет условие
#include <stdio.h> int main() { int y; y = 0; do { printf("%d\n", y); y++; } while(y < 15); return 0; }
Функции
Функции делают код компактнее и рациональнее. С их помощью можно вызывать конкретные команды, не прописывая их каждый раз повторно. Main(), по сути, также является функцией, в которой просто прописывается основная программа.
Напишем простейший пример из двух функций, вычисляющих сумму и произведение заданных пользователем чисел.
#include <stdio.h> int add ( int x, int y ) { return x+y; } int mpl ( int x, int y ) { return x *y; } int main() { int a; int b; printf( "Введите два числа: " ); scanf( "%d", &a ); scanf( "%d", &b ); printf( "Сумма введенных чисел составляет %d\n" , add( a, b)); printf( "Произведение введенных чисел составляет %d\n" ,mpl( a, b)); return 0; }
Как видно из примера, функции, используемые в основной программе, могут быть прописаны до объявления main().
У каждой функции обязательно должны быть:
- название;
- тип используемых переменных;
- аргументы;
- тело, в котором прописываются действия и алгоритмы.
Функции можно использовать внутри других функций - главное, вовремя их инициализировать.
Заключение
Язык С - основа для многих операционных систем и прикладных программ. На его синтаксисе базируется целое семейство C - подобных языков. Знание основных операторов и алгоритмов Си помогает осваивать различные инструменты программирования - от C++ до Swift и Ruby.
За счет легкой адаптируемости и высокой скорости обработки данных С часто применяется на аппаратных устройствах, на которых невозможно поставить популярные “тяжелые” операционные системы.