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

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

 

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

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

Основным блоком в программе консольного приложения на языке Си является главная функция, имеющая имя 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;
}

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


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

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

  • Александра
    Здравствуйте, помогите найти ошибку:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<malloc.h>
    #include<time.h>
    #include<locale.h>
    #include<math.h>
    #include<string.h>

    void Zadanie1()
    {
      char* str = calloc(100 + 1, sizeof(char)); 
      printf("Введите строку:\n");
      getchar(); 
      gets(str);
      for (int i = 0; str[i] != '\0'; i++) 
      {
        switch (str[i]) 
        {
        case 'a': printf(""); break;
        case 'b': printf(""); break;
        case 'c': printf(""); break;
        case 'd': printf(""); break;
        case 'e': printf(""); break;
        case 'f': printf(""); break;
        case 'g': printf(""); break;
        case 'h': printf(""); break;
        case 'i': printf(""); break;
        case 'j': printf(""); break;
        case 'k': printf(""); break;
        case 'l': printf(""); break;
        case 'm': printf(""); break;
        case 'n': printf(""); break;
        case 'o': printf(""); break;
        case 'p': printf(""); break;
        case 'q': printf(""); break;
        case 'r': printf(""); break;
        case 's': printf(""); break;
        case 't': printf(""); break;
        case 'u': printf(""); break;
        case 'v': printf(""); break;
        case 'w': printf(""); break;
        case 'x': printf(""); break;
        case 'y': printf(""); break;
        case 'z': printf(""); break;

        case 'A': printf(""); break;
        case 'B': printf(""); break;
        case 'C': printf(""); break;
        case 'D': printf(""); break;
        case 'E': printf(""); break;
        case 'F': printf(""); break;
        case 'G': printf(""); break;
        case 'H': printf(""); break;
        case 'I': printf(""); break;
        case 'J': printf(""); break;
        case 'K': printf(""); break;
        case 'L': printf(""); break;
        case 'M': printf(""); break;
        case 'N': printf(""); break;
        case 'O': printf(""); break;
        case 'P': printf(""); break;
        case 'Q': printf(""); break;
        case 'R': printf(""); break;
        case 'S': printf(""); break;
        case 'T': printf(""); break;
        case 'U': printf(""); break;
        case 'V': printf(""); break;
        case 'W': printf(""); break;
        case 'X': printf(""); break;
        case 'Y': printf(""); break;
        case 'Z': printf(""); break;

        case 'а': printf(""); break;
        case 'б': printf(""); break;
        case 'в': printf(""); break;
        case 'г': printf(""); break;
        case 'д': printf(""); break;
        case 'е': printf(""); break;
        case 'ё': printf(""); break;
        case 'ж': printf(""); break;
        case 'з': printf(""); break;
        case 'и': printf(""); break;
        case 'й': printf(""); break;
        case 'к': printf(""); break;
        case 'л': printf(""); break;
        case 'м': printf(""); break;
        case 'н': printf(""); break;
        case 'о': printf(""); break;
        case 'п': printf(""); break;
        case 'р': printf(""); break;
        case 'с': printf(""); break;
        case 'т': printf(""); break;
        case 'у': printf(""); break;
        case 'ф': printf(""); break;
        case 'х': printf(""); break;
        case 'ц': printf(""); break;
        case 'ч': printf(""); break;
        case 'ш': printf(""); break;
        case 'щ': printf(""); break;
        case 'ъ': printf(""); break;
        case 'ы': printf(""); break;
        case 'ь': printf(""); break;
        case 'э': printf(""); break;
        case 'ю': printf(""); break;
        case 'я': printf(""); break;

        case 'А': printf(""); break;
        case 'Б': printf(""); break;
        case 'В': printf(""); break;
        case 'Г': printf(""); break;
        case 'Д': printf(""); break;
        case 'Е': printf(""); break;
        case 'Ё': printf(""); break;
        case 'Ж': printf(""); break;
        case 'З': printf(""); break;
        case 'И': printf(""); break;
        case 'Й': printf(""); break;
        case 'К': printf(""); break;
        case 'Л': printf(""); break;
        case 'М': printf(""); break;
        case 'Н': printf(""); break;
        case 'О': printf(""); break;
        case 'П': printf(""); break;
        case 'Р': printf(""); break;
        case 'С': printf(""); break;
        case 'Т': printf(""); break;
        case 'У': printf(""); break;
        case 'Ф': printf(""); break;
        case 'Х': printf(""); break;
        case 'Ц': printf(""); break;
        case 'Ч': printf(""); break;
        case 'Ш': printf(""); break;
        case 'Щ': printf(""); break;
        case 'Ъ': printf(""); break;
        case 'Ы': printf(""); break;
        case 'Ь': printf(""); break;
        case 'Э': printf(""); break;
        case 'Ю': printf(""); break;
        case 'Я': printf(""); break;
        default: printf("%c", str[i]); break;
        }
      }
    }

    void Zadanie2()
    {
      char* str = calloc(100 + 1, sizeof(char));
      printf("Введите строку:\n");
      getchar();
      gets(str);
      for (int i = 0; str[i] != '\0'; i++)
      {
        switch (str[i])
        {
        case 'g': printf("9"); break;
        case 'o': printf("0"); break;
        default: printf("%c", str[i]); break;
        }
      }
    }

    void Zadanie3()
    {
        char* str = calloc(100 + 1, sizeof(char));
      printf("Введите строку:\n");
      getchar();
      gets(str);
      for (int i = 0; str[i] != '\0'; i++)
      {
        if (str[i] != ' ')
        {
          printf("%c", str[i]);
        }
      }
    }

    void CreateRandArray(int* massiv, int* len) 
    {
      srand(clock());
      for (size_t i = 0; i < len; i++) 
      {
        massiv[i] = ((rand() % 200) - 100); 
        printf("%3d ", massiv[i]);
      }
      printf("\n");
    }
    void Zadanie4()
    {
      int N;
      printf("Введите размерность массива:\n");
      scanf("%d", &N);
      int* massiv = calloc(N, sizeof(int));
      CreateRandArray(massiv, N); 
      for (int i = 0; i < N; i++)
      {
        if (massiv[i] >= 0)
        {      
          printf("%5d", massiv[i] * 2);
        }
        else if (massiv[i] < 0)
        {      
          printf("%5d", massiv[i] * 3);
        }
      }
    }

    int RandArrey2(int** massiv, int M, int N)
    {
      srand(clock());  
      for (size_t i = 0; i < N; i++) 
      {
        printf("\n");
        massiv[i] = calloc(M, sizeof(int)); 
        for (size_t j = 0; j < M; j++)
        {
          massiv[i][j] = ((rand() % 200)-100);
          printf("%3d ", massiv[i][j]);
        }
      }
    }

    void Zadanie5()
    {
      int N, M, count = 0;
      printf_s("Введите количество строк:\n");
      scanf("%d", &N);
      printf_s("Введите количество столбцов:\n");
      scanf("%d", &M);
      int** massiv = calloc(N, sizeof(int*));
      RandArrey2(massiv, M, N);
      printf("\n");
      for (int i = 0; i < N; i++)
      {
        printf("\n");
        for (int j = 0; j < M; j++)
        {
          if ((i + j) % 2 == 0) 
          {
            printf("%3d ", massiv[i][j]);
          }
        }
      }
    }

    int main(void)
    {
      system("chcp 1251>nul");
      int n;
      printf("Контрольная по строкам и массивам.\n");
      printf("\nВариант 3:\n");
      printf("1. Написать программу, которая выводит все символы строки, не являющиеся буквами.\n");
      printf("2. Написать программу, которая заменяет в исходной строке букву “g” на “9”, а “o” на “0”.\n");
      printf("3. Написать программу, которая убирает все пробелы из исходной строки.\n");
      printf("4. Написать программу, которая все положительные элементы массива умножить на 2, а отрицательные умножить на 3.\n");
      printf("5. Написать программу, которая печатает на экран все элементы двумерного массива, сумма индексов которых четная.\n");
      int Zadanie = 0;
      while (Zadanie == 0)
      {
        printf("\nВыберите номер задачи (1-5):");
        scanf_s("%d", &n);
        switch (n)
        {
        case 1:
          Zadanie1();
          break;
        case 2:
          Zadanie2();
          break;
        case 3:
          Zadanie3();
          break;
        case 4:
          Zadanie4();
          break;
        case 5:
          Zadanie5();
          break;
        default:
          printf("\nТакого задания нет");
          break;
        }
        int c = -1;
        printf("\nВыберать другое задание (0(Нет)/1(Да))");
        scanf_s("%d", &c);
        if (c == 0) Zadanie = 1;
      }
      return 0;
    }

  • В соответствии с вариантом реализовать программу обработки массива на ал-горитмическом языке С. Длина массива не более 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 не будет опубликован. Обязательные поля помечены *