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

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

 

Программа на языке Си состоит из одной или более подпрограмм, называемых функциями.

Язык Си является блочно-структурированным. Каждый блок заключается в фигурные скобки {}.

Основным блоком в программе консольного приложения на языке Си является главная функция, имеющая имя main().

Каждое действие в языке Си заканчивается символом «точка с запятой» — ;. В качестве действия может выступать вызов функции или осуществление некоторых операций.

Имя функции — это коллективное имя группы описаний и операторов,
заключенных в блок (фигурные скобки). За именем функции в круглых скобках указываются параметры функции.

Комментарии в языке Си

В языке Си  для комментариев используются символы

/* — начало комментария;
*/ — конец комментария.


Вся последовательность, заключенная между этими символами, является комментарием.

Это удобно для написания многострочных комментариев:

 
 
int a;   /* целая
переменная */

Многострочные комментарии также удобно использовать при отладке для сокрытия от выполнения части кода.

В дополнение к этому, для написания коротких комментариев могут использоваться символы //. При этом комментарием является все, что расположено после символов // и до конца строки:

 
float b; // вещественная переменная

 

Главная функция

При выполнении консольного приложения, написанного на языке Си, операционная система компьютера передаёт управление функции с именем main(). Функцию main() нельзя вызывать из других функций программы, она является управляющей.

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

Главную функцию можно записать по-разному:

  • int main()
  • void main().

Перед именем функции указывается тип возвращаемого значения. При обращении к главной функции значение возвращается операционной системе. Последняя запись не будет возвращать значения. Однако void main() — не совсем корректная запись, так как сообщает компилятору, что функция main() не возвращает никакого значения.

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

 
return 0; // вещественная переменная

 
В фигурные скобки заключены описания и операторы.

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

 
Пример: Вывод на экран сообщения "Hello, world!".

1
2
3
4
5
6
7
#include <stdio.h>  // Подключение библиотеки ввода-вывода
int main()         // Главная функция
{
  printf("Hello, world!"); // Вывод сообщения
  getchar();               // Задержка окна консоли
  return 0;
}

Результат работы программы:
Результат работы Hello world

Теперь попробуем написать текст на русском языке.
1
2
3
4
5
6
7
#include <stdio.h>
int main()
{
  printf("Здравствуй, мир!");
  getchar();
  return 0;
}

Результат работы программы:
Результат работы Здравствуй, мир!
Проблема русского языка в консольных приложениях заключается в том, что консоль и редактор кода Microsoft Visual Studio поддерживают разные кодовые страницы. Для того, чтобы увидеть русские символы в консоли необходимо поменять кодовую страницу в консоли, чтобы она соответствовала кодовой странице редактора (1251). С этой целью вызывается функция system("chcp 1251") с соответствующей командной строкой. Прототип функции system() содержится в библиотеке <stdlib.h>.

При этом текст программы будет выглядеть следующим образом:
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include <stdlib.h>
int main()
{
  system("chcp 1251");        // Текущая кодовая страница 1251
  system("cls");              // Очистка консоли
  printf("Здравствуй, мир!"); // Вывод сообщения
  getchar();
  return 0;
}

Результат работы программы:
Результат работы Здравствуй, мир!


Назад: Язык Си

Комментариев к записи: 26

  • В соответствии с вариантом реализовать программу обработки массива на ал-горитмическом языке С. Длина массива не более 20 элементов. Элементы массива вводятся вручную или генерируются случайным образом. Размер массива задается пользователем с клавиатуры. 7. Дана последовательность натуральных чисел {Aj} произвольной длины. Найти произведение нечетных чисел, меньших 70, наибольшее из этих чисел и номер это-го числа в последовательности.

  • Здрасте! Вы не правы и функцию main() можно вызвать из самой функции main(). Это классический пример для организации переполнения стека и аварийного завершения программы.
    1
    2
    3
    4
    int main() {
        main();
        return 0;
    }


    • Самый лучший способ!
      1
      2
      3
      4
      5
      6
      #include <stdio.h>
      #include <locale.h>
      int main() {
      setlocale(0, "");
             return 0;
      }
      Все языки будеть подходить!

  • Вот этот кусок кода не работает, вместо кириллических знаков - кракозябры:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
      system("chcp 1251");        // Текущая кодовая страница 1251
      system("cls");              // Очистка консоли
      printf("Здравствуй, мир!"); // Вывод сообщения
      getchar();
      return 0;
    }

    • Я знаю способ включить поддержку русского языка с помощью библиотеки locale.h
      1
      2
      3
      4
      5
      6
      7
      8
      9
      #include <stdio.h>
      #include <locale.h>
      int main()
      {
        setlocale(LC_ALL, "Rus");  // Добавление поддержки русского языка
        printf("Здравствуй, мир!"); // Вывод сообщения
        getchar();
        return 0;
      }

      • Елена Вставская
        Кракозябры могут быть из-за настроек в окне консоли. Нужно в свойствах консоли поменять шрифт, чтобы он поддерживал русский язык. Переход на русский через setlocale() меняет язык для вывода, но ввод строк при этом будет кракозябрами.


    • Елена Вставская
      Шрифт и размер задаются в окне консоли, а не в тексте программы.

      • Пользуюсь VIM с русским текстом сразу всё получилось. Это нормально?

  • ./\. /..\ \../ .\/. ./\. /..\ \../ .\/. ./\. /..\ \../ .\/. **************** *\.*./*\.*./*\.* *.\*/.*.\*/.*.\* **************** *./*\.*./*\.*./* */.*.\*/.*.\*/.* **************** **************** *..............* *..............* **************** *...........*\.* *...........*.\* **************** Помогите написать программу

  • Еще один способ вывода кириллицы в консоли с помощью таблицы ASCII(1251) Подключаем библиотеку
    1
    2
    SetConsoleCP(1251)//настройка на ввод кириллицы (в числе прочего)
    SetConsoleOutputCP(1251)// на вывод
    Примечание:работает только со шрифтом Consolas(можно изменить в свойствах самого окна консоли).




    • Елена Вставская
      Такая конструкция прекрасно работает на вывод, но не работает на ввод. Строку на русском языке ввести не удастся :(

  • Лично у меня указанный способ подключения русской локализации в последней версии DevC++ не работает. Зато работает это:
    1
    2
    3
    4
    #include <locale.h>
    int main{
      setlocale(LC_ALL, "Rus");
    }
    Это код из Си или уже Си++? Если Си++, то как сделать это в Си?

    • Елена Вставская
      Заголовочный файл locale.h, судя по описанию, является стандартным заголовочным файлом языка Си. Существует множество способов смены кодовой страницы для воспроизведения русского языка в консоли. И я использую лишь один из них, который работает в Microsoft Visual Studio (проверено c 2005 по 2015 версии).

      • Понимаю, разница в IDE, но в том же QT Creator не нужно прописывать
        1
        2
        system("chcp 1251");  // Текущая кодовая страница 1251
        system("cls");  // Очистка консоли
        Там сразу выводит на русском. Меня интересует конечный результат, который видит пользователь, когда запускает .exe и видит что-то на экране, если в IDE всё работало после отладки, то и у пользователя тоже будет работать?

        • Елена Вставская
          Да, у пользователя тоже должно все работать. Чтобы это проверить достаточно запустить на выполнение .exe файл из папки, куда он выгрузился компилятором (минуя IDE).

          • У меня почему то не переводится на русский текст

          • Елена Вставская
            Скорее всего, у Вас в консоли не установлен соответствующий шрифт. О том, как его поменять смотрите здесь.

        • Да оно не зависит от IDE(отчасти). Программа пихает на вывод и ждет на ввод кирилицу при подключении нужной локали, но у винды по дефолту стоит CP-866, который игнорирует правильное написание всей или части кирилицы. Кратко: нужно либо насильно сменять используя команду Виндовс "chcp", либо в случае с QT создавать консоль с нуля*, только это делает сам компилятор, и потому вопросов не возникает при подключении нужной локали. (подключил и забыл) Для линукс-подобных - QT и вовсе является единственной удобной панацеей, потому что чтобы подключить кириличные символы нужно нехило повозится со средой bash-а, вплоть до экспорта нужной локали... и для разных реализаций систем Linux способы еще и отличатся могут. У меня правда получалось запустить с кирилицей без смены в консоли от mingw-gcc, но оно не отображало часть украинский символов, а также по разному считывало кириличные символы с каким-то смещением. То есть в памяти они записывались по разному если сравнивать с CP-1251 и CP-866 в консоле Виндовс.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *