Главная > Уроки > Структура программ на языке Си

Записывайся на этот курс на Stepike!

Структура программ на языке Си

Я надеюсь вы уже установили себе на компьютер какую-нибудь IDE и научились в ней компилировать программы. Если нет, то подробная инструкция как установить IDE для языка Си.

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

Будем заполнять простую карту. На данный момент мы знаем, что существуют программы, но как они устроены внутри нам неизвестно. Поэтому наша карта будет иметь следующий вид.

Структура программы. Нулевой уровень знаний.

Рис.1 Карта "Структура программ на языке Си." Начальный уровень.

На протяжении всего курса мы к этой карте будем возвращаться, уточнять её, дополнять новыми элементами и блоками.

Сейчас внимание. Не пугайтесь! Ниже написан исходный код трёх простеньких программ. Ваша задача внимательно на них посмотреть и попытаться найти в их коде какую-то закономерность (нечто общее, что есть в каждой программе).

Листинг 1. Программа 1. Печатает «Hello, World!»

#include <stdio.h>
int main(void) {
  printf("Hello, World!\n");
  return 0;
}

Листинг 2. Программа 2

int main(void) {
  int a, b, c;
  
  a = 5;
  b = 10;
  c = a+b;
  
  return 0;
}

Листинг 3. Программа 3

#include <stdio.h>
int main(void) {
  FILE *fp;
	
  fp = fopen("input.txt", "w");
  fprintf(fp, "This is Sparta!");
  fclose(fp);
	
  return 0;
}

Не торопитесь смотреть продолжение урока и правильный ответ на эту задачу. Для начала попробуйте ответить самостоятельно. После этого нажмите кнопку "Смотреть продолжение!"

Смотреть продолжение!

Итак, ответ: Во всех программах выше присутствует следующая конструкция:

Листинг 4. Главная функция любой программы на языке Си - функция main.

int main(void) {
	
	return 0;
}

Что же это за конструкция. Это объявление функции main. Такая функция обязательно есть в каждой программе, которая написана на языке Си.Большая программа или маленькая, компьютерная игра или программа "Hello, World!", написана вами или Биллом Гейтсом -- если программа написана на языке Си -- в ней есть функция main. Это так сказать главная функция нашей программы. Когда мы запускаем программу, то можно думать, что запускаем функцию main этой программы.

Остановимся на секундочку. Мы, кажется, уже кое-что выяснили о структуре программ на языке Си. Любая программа на языке Си должна содержать функцию main. Отобразим этот факт на нашей карте знаний "Структура программ на языке Си."

Структура программы. Нулевой уровень знаний.

Рис.2 Карта "Структура программ на языке Си." Функция main.

Теперь карта не напрягает нас своей зияющей пустотой. Продолжим наши исследования.

Давайте я расскажу немного о функции main и о функциях вообще.

Перед именем функции написано int, это сокращение от слова integer, которое переводится с английского, как "целое". Подобная запись означает, что когда функция main завершит свою работу, она должна вернуть вызывающей программе (в нашем случае это операционная система) какое-нибудь целое число. Обычно, для функции main это число ноль, которое оповещает операционную систему: "Мол, всё хорошо. Происшествий не случилось."

Случалось ли вам видеть сообщения об ошибках на экране своего компьютера? Обычно там пишут что-то вроде "Программа аварийно завершена ... бла-бла-бла... Код -314." Вот это примерно тоже самое. Разница в том, что когда случаются проблемы операционная система нас об этом оповещает, а когда всё хорошо она нас лишний раз не беспокоит.

После имени функции в скобках записано слово void. Вообще в скобках обычно записывают аргументы функции, но в нашем случае, когда в скобках пишут void, это означает, что аргументов у функции нет. Другими словами, чтобы функция main начала работу ей не нужны никакие дополнительные данные извне. Мы ещё поговорим обо всём этом подробно, а пока просто запомним, что слово void вместо аргументов функции обозначает, что для данной функции никаких аргументов не требуется.

Внутри фигурных скобок идёт описание функции main, т.е. непосредственно то, что эта функция должна делать.

Перед закрывающей фигурной скобкой мы видим команду return. Именно эта команда и отвечает за то, чтобы вернуть значение из функции. Т.е. смотрите, если программа дошла до этого места, то значит всё было хорошо и никаких ошибок не возникло, а значит можно вернуть значение нуль.

Вы можете спросить, а почему именно нуль? А чёрт его знает! Просто так обычно делают. Можно, в принципе, возвращать какое-нибудь другое целое число, например 100, или -236. Лишь бы оно было целым числом. Помните про int? Поэтому и целое.

Вот мы и разобрались с функцией main. Ещё один момент. То что записано в фигурных скобках обычно называют "тело функции" (или описание функции), а первую часть, та что перед фигурными скобками называется заголовок функции.

Вернёмся теперь к нашей первой программе "Hello, World" и посмотрим, что там к чему.

Листинг 5. Программа «Hello, World»

#include <stdio.h>
int main(void) {
  printf("Hello, World!\n");
  return 0;
}

Кое-что нам теперь уже понятно в этой программе. Не ясными остаются только две строки, пойдём по порядку.

Листинг 6. Директива include

#include <stdio.h>

Данная строчка это сообщение компилятору. Такие сообщения, начинающиеся с символа #, называются директивами компилятора. Буквально: «подключи файл stdio.h». Во время компиляции вместо этой строчки вставится содержимое файла stdio.h. Теперь немного поговорим об этом файле. stdio.h (от англ. STanDart Input Output) это заголовочный файл, в нем описаны различные стандартные функции, связанные с вводом и выводом.

Возникает резонный вопрос "А зачем нам писать эту строчку? Зачем нам вообще понадобилось вставлять сюда этот файл?" Это нужно для того, что бы в своей программе, мы могли использовать стандартную функцию вывода на экран printf().

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

Так же и компилятор. Когда он встречает какую-нибудь функцию, он ищет её описание (т.е. что она должна делать и что обозначает) в начале программы (с самого начала и до момента её использования в программе). Так вот, функция printf() описана в файле stdio.h. Поэтому мы и подключаем его. А вот когда мы его подключим, компилятор сможет найти функцию printf(), иначе он выдаст ошибку.

Кстати, настало время дополнить нашу карту знаний. Перед функцией main добавим ещё один блок, блок подключения заголовочных файлов.

Структура программы. Блок подключения заголовочных файлов.

Рис.3 Карта "Структура программ на языке Си." Блок подключения заголовочных файлов.

Продолжим разбираться с нашей программой.

Листинг 7. функция printf()

printf("Hello, World!\n");

В этой строке мы вызываем стандартную функцию вывода на экран printf(). В данном простейшем случае мы передаем ей один параметр, строку, записанную в кавычках, которую надо вывести на экран, в нашем случае это Hello, World! \n. Но постойте, а что это за \n? На экране, во время запуска программы, никаких \n не было. Зачем тогда мы тут это написали? Данная последовательность это специальный символ, который является командой перейти на следующую строку. Это как в MS Word нажать клавишу Enter. Таких специальных символов несколько, все они записываются с помощью символа "\" - обратный слеш. Такие специальные символы называются управляющими символами. Потом я еще покажу вам их. В остальном на экране появится именно то, что вы написали в двойных кавычках.

Кстати, обратите внимание, каждая команда языка Си заканчивается символом «;» (точкой с запятой). Это похоже на точку в конце предложения, в русском языке. В обычном языке мы разделяем точкой предложения, а в языке программирования Си, точкой с запятой отделяем команды друг от друга. Поэтому ставить точку с запятой обязательно. Иначе компилятор будет ругаться и выдаст ошибку.

Чтобы вызвать какую-нибудь функцию, необходимо написать её имя и указать передаваемые ей параметры в круглых скобках. У функции может быть один или несколько параметров. А может не быть параметров вовсе, в таком случае в скобках писать ничего не нужно. Например, выше мы вызвали функцию printf() и передали ей один параметр строку, которую необходимо вывести на экран.

Кстати, полезный совет. Так как в каждой программе обязательно присутствует функция main, и буквально в каждой программе нам потребуется что-то выводить на экран, то рекомендую вам сразу создать файл со следующей заготовкой, чтобы каждый раз не писать одно и то же.

Листинг 8. Стандартная заготовка для программ на языке Си.

#include <stdio.h>
int main(void) {
  return 0;
}

Ну вот вроде бы и всё. Этом первый урок можно считать законченным. Хотя нет, ещё один момент есть.

Самое главное в этом уроке это, конечно, общая структура программы. Но кроме того, мы научились выводить на экран произвольный текст. Кажется, что совсем ничего вроде и не узнали, но даже этого хватит для того, чтобы, например, сделать небольшой подарок своей маме на 8 марта.

Программа-открытка на 8 марта

Рис.4 Программа-открытка на 8 марта.

Исходный код программы-открытки есть в архиве с исходными кодами этого урока. Экспериментируйте! У вас всё получится.

Сохрани в закладки или поддержи проект.

Практика

Задачи с автоматической проверкой решения. Для удобства работы сразу переходите в полноэкранный режим

Исследовательские задачи для хакеров:

  1. Попробуйте добавить управляющий символ после слова Hello,. Посмотрите, как изменится ситуация на экране.
  2. Попробуйте добавить в программу еще несколько функций вывода на экран.
  3. Попробуйте удалить из программы точку с запятой после какого-нибудь оператора. Посмотрите, как на это отреагирует ваш компилятор, какую ошибку он вам выдаст.

Дополнительные материалы

  1. Переживаете из-за того, получится ли у вас научиться или нет? Тогда посмотрите следующее видео.

Оставить комментарий

Чтобы код красиво отображался на странице заключайте его в теги [code] здесь писать код [/code]

Комментарии

Александр
Во-второй программе: int main(), а в Листинге 4: int main(void), разница в слове VOID
Александр
Что же это за конструкция. Это объявление функции main. ТакоОЕ функция ОЕ поменяйте на АЯ
Александр
ВернЁмся теперь к нашей первой программе "Hello, World!" и посмотрим
KaDeaT
Спасибо! Устраним.)
P.S. Устранили!
Izzat
Здравствуйте! Я хотел попробовать но курсор не является. Чего мне делать?
KaDeaT
Добрый день. Сначала подробно опишите, что вы хотели попробовать, что вы делали, где у вас не появился курсор и пр.
Сергей
Окно заданий не разворачивается до конца, не могу ответить.Браузер - Макстон
KaDeaT
Будем разбираться.
Пока предлагаю воспользоваться прямой ссылкой на задачи.
Евгений
Выдает "POLINK: fatal error: отказано в доступе", что бы я ни делал. Что делать?..
KaDeaT
Добрый день. Попробуйте последовательно следующие действия.
1. Попробуйте просто перезапустить Pelles C и создать новый проект.
2. Попробуйте отключить антивирус и скомпилировать проект после этого. Если поможет, то добавьте папку с проектом в исключения антивируса. Не забудьте потом включить антивирус.
3. Попробуйте перезагрузить компьютер.
4. Попробуйте запустить Pelles C "от имени администратора".
Alla
В тексте есть опечатка: «На данный момент мы знаем, что есть существуют программы…».
KaDeaT
Спасибо, Алла.
Исправил.
Юрий Раскошный
Скажите пожалуйста файл-заготовку создавать так-же как вы показывали создавать первый наш файл?
KaDeaT
Так точно. )
Константин Великий
Прошел пару уроков на курсах Яндекса, затем попробовал YC
Остановился на втором) Удобная и понятная подача материала, автору спасибо!
KaDeaT
Спасибо!
Константин Великий
А видео в концовке - просто пушка) ЛаБаф замотивировал на весь курс вперед)
KaDeaT
=)
Рецензент
Выражаю Вам огромную благодарность за Ваш труд, который позволяет знаниям быть доступными для ВСЕХ!

Вопросы:

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

2. "Попробуйте добавить управляющий символ после слова Hello"
Ни в этом, ни в предыдущих уроках не нашел определения словосочетанию "управляющий символ"
KaDeaT
И вам спасибо, что проходите уроки.

1. О той, что написана тут Листинг 1.
http://youngcoder.ru/lessons/1/ide/pelles_c/osnovy_pellesc.php

2. Добавил в урок подобное словосочетание. Спасибо за внимательность. Имелся ввиду "n".
abychutkin
Такие сообщения, начинающиеся с символа #, называются директивами компилятора - а разве не директивами препроцессора? или это для простоты?

Зачем нам вообще понадобилось надо вставлять сюда этот файл? - опечатка, надо или вообще лишнее на выбор)
KaDeaT
Да, для простоты. Чтобы не рассказывать о том, что такое препроцессор.

Спасибо, поправил.)
Владинар
("Failed. Cannot check answer. Perhaps output format is wrong.
Input:


Your output:
Hello,World!
The world is yours!
Correct output:
Hello, World!
The world is yours! ") ошибка вылазит, что делать?
KaDeaT
Вероятно, у вас где-то лишний пробел, например после восклицательного знака, первого.
Игорь
Спасибо за интересный материал и мастерство его подачи обучающимся.
KaDeaT
Спасибо на добром слове!
Анна
Здравствуйте, подскажите пожалуйста, где найти архив с исходными кодами, о которых говорится в конце?
KaDeaT
Архив находится в блоке Файлы. Если вы смотрите сайт с компьютера, то блок находится вверху страницы справа, после блока Содержание.
Если вы смотрите сайт с телефона/планшета, то этот блок находится внизу после блока Дополнительные материалы.
Ярослав
А как вызвать функцию без параметров, я так и не нашёл?
KaDeaT
Просто в скобках ничего указывать не надо. Например:
fun1();

Это вызов функции fun1 без параметров.
Максим
Цитата со страницы: "В этом нам поможет наша первая программа, написанная на предыдущем шаге."
О какой программе идет речь? На прошлом шаге мы ничего не писали, там была теория про стандарт языком программирования...
KaDeaT
Здесь речь идёт об ответвлении от основной ветки курса: http://youngcoder.ru/lessons/1/ide/pelles_c/osnovy_pellesc.php

Смотрите Листинг 1.
Артем
Опечатка в тексте, пропущена буква:
"Такие специальныЕ символы называются управляющими символами. Потом я еще покажу вам их. В остальном на экране появится именно то, что вы написали в двойных кавычках."
KaDeaT
Благодарю! Исправил.
[/code]
Спасибо все понятно)
KaDeaT
Пожалуйста!
igor
void _getch(void)
Пока неверно. Не опускайте руки - попробуйте еще раз! в чем ошибка?
Sevara
а где тут архив? для просмотра исходного кода карточки на 8 марта