Оператор Case в Си OTUS
Изучая операторы в Си, нужно учитывать, что их очень много. Все они имеют одну цель – управление операндами (объектами, которыми можно управлять в процессе обработки имеющегося кода). При работе с потоками и крупными приложениями нужно использовать конструкцию типа case. Чаще встречается связка «switch-case». Именно о ней зайдет речь далее. Информация будет одинаково полезна и новичкам, и опытным разработчикам.
Определение
Оператор switch case в C работает подобно if…else. Это – своеобразная конструкция выбора. Используется как механизм потока управления, определяющий дальнейшее исполнение кода, отталкиваясь от значений переменных или выражений.
Switch дает возможность организации тестирования нескольких прописанных условий. Тот или иной блок будет выполняться, если значение, полученное на «выходе» является истиной. Работает как if…else, хотя имеет более простой синтаксис. Switch Case – конструкция, которая обладает более простой системой управления. Используется в СИ-семействе достаточно часто.
Инструкция – общий вид
If else и switch c – операторы, схожие между собой по действию. Это – своеобразный цикл, который будет проверять достоверность условия, выполняя заданную операцию. Структура Switch Case в Си будет такой:
Switch (желаемое выражение) {
case 1 контекст: операторы
case 2 контекст: операторы
case 3 контекст: операторы
default: инструкции
}
Структура состоит из двух элементов:
- заголовка switch;
- тела инструкции, которое записано в составном операторе (после фигурных скобок, внутри).
В зависимости от значения соответствующего выражения будет меняться выполняемая ветка кода. Выражение должно содержать только целочисленные параметры (число) или символьные данные. Это – единственное ограничение, накладываемое на оператор switch case c.
Принцип работы
Рассматриваемое выражение базируется на простой логике оценки каждого блока case. Начинается процесс с вычисления выражения, прописанного внутри блока переключателя. Далее сравнивается значение из имеющегося блока с каждым case.
При обнаружении совпадений происходит реализация кода, написанного в «кейсе». Происходит это до тех пор, пока система не встретит ключевое слово. Это – оператор break.
Если совпадений в конструкции switch-case нет, код переходит к оператору по умолчанию, выполняя условия, предусмотренные им. Компонент изначально не является обязательным. Его можно исключить, если нет определенных инструкций для несоответствующего сценария.
Чтобы использование «множественного выбора» (рассматриваемой конструкции) функционировало нормально, внутри каждого case прописывают break. Это поможет избежать выполнения всех инструкций после соответствующего «истинного» блока.
Примеры заголовков и ветки case
Далее – примеры записи switch case default c, которые являются правильными и неправильными. Эта информация поможет избежать ошибок, when новичок осваивает соответствующий функционал языка:
int c, a;
char s;
double g;
switch (c) – правильно;
switch (g) – неправильно, речь идет о вещественной переменной;
switch (s) – неправильно, символьная переменная;
switch ((a+c)+2) – правильно, выражение целочисленного характера.
В фигурных скобках можно записывать несколько блоков. Там может быть далеко не одна функция (или две), а значительно больше. Каждая такая команда – это определенный выбор. Из-за этого соответствующая запись носит название «множественного».
При составлении case существует одно ограничение – константы ветки должны отличаться. When в коде встречаются сходства, он выдает ошибку. Поэтому перед запуском программы проводят проверку значений case.
Вложенность
In Switch выражении структура предусматривает вложенность. Это – переключение внутри конструкции. Функция работает, если switch-запись будет привязываться к значениям of внешнего переключателя.
Вот – example of множественного выбора, где можно использовать вложенность:
Здесь:
- Реализовываются конструкторы. Интересующий «множественный» цикл нужно использовать два раза.
- Предложенный синтаксис первой записью в functions проводит проверку равенства dept 1.
- Если выражение имеет «истину», следуют переходы ко второму блоку. Там происходит проверка of действительности кода доступа.
- When dept имеет значение false, код будет пользоваться function default (условием по умолчанию).
Использование записи switch case int даже с вложениями – несколько условий в одном, легко реализуемых. Особенно если изучить конструкцию if else и наглядные примеры множественной выборки.
Пример с отделами доступа
Ниже – examples использования рассмотренного ранее примера с правильным и неправильным кодом отдела доступа:
Первый цикл – в нем верен и отдел, и код доступа. Выполнение приложение никогда не достигнет cases по умолчанию. Всегда будет обрабатываться команда. Применение ключа Break здесь помогает остановить приложение при необходимости.
Второй пример – ситуация, при которых и код доступа, и отдел неверные. Цикл switch case break c перейдет к первому блоку по умолчанию.
Рекомендации – как лучше использовать
Для того, чтобы не запутаться в записи оператора, рекомендуется:
- Разобраться in syntax конструкции switch c. Он прост.
- Присваивать «кейсам» уникальные значения. Иначе цикл не будет обработан in codes.
- Каждый блок заканчивать ключевым словом break. Этот прием позволит избежать образования петель.
- Использовать int и иные целочисленные параметры (включая zero) в процессе. Также допускаются символы. Остальные типы данных не поддерживаются.
Для сокращения объема кода подходит оператор switch в Си с вложениями. Поддерживается многоуровневая вложенность. Образцом послужит пример выше.
А еще программист должен подумать, что делать, если ни одно условие цикла не истинно. В данном случае рекомендуется предусмотреть оператор по умолчанию.
Быстрое изучение
Switch Case d c – запись, которая известна не всем новичкам. Чтобы лучше разобраться в ней, можно посмотреть туториалы. Пример – тут.
Быстро разобраться в switch case int и иных операторах помогут специализированные компьютерные курсы. Организовываются дистанционно. Подойдут новичкам и опытным программистам. В конце программы выдается электронный сертификат.
Интересует разработка на C? Обратите внимание на курс «Программист C» в Otus.
Подзапросы в выражении CASE / Хабр
По материалам статьи Craig Freedman: Subqueries in CASE Expressions
В этой статье будет рассмотрено, как SQL Server обрабатывает подзапросы в выражении CASE. Кроме того, будут рассмотрены несколько экзотических возможностей соединений.
Скалярные выражения
Для простых случаев использования выражений CASE (без подзапросов), возможна оценка только выражения CASE, состоящего из нескольких скалярных выражений:
create table T1 (a int, b int, c int) select case when T1.a > 0 then T1.b else T1.c end from T1
|—Compute Scalar(DEFINE:([Expr1004]=CASE WHEN [T1].[a]>(0) THEN [T1].[b] ELSE [T1]. [c] END)) |—Table Scan(OBJECT:([T1])) |
Этот план запроса подразумевает просмотр таблицы T1 и оценку выражения CASE для каждой её строки. Оператор Compute Scalar вычисляет значение выражения CASE, включая оценку условия и принятие решения, будет ли выполняться оценка в предложении THEN или ELSE.
Предложение WHEN
Давайте сначала добавим к предложению WHEN простой подзапрос:
create table T2 (a int, b int) select case when exists (select * from T2 where T2.a = T1.a) then T1.b else T1.c end from T1
|—Compute Scalar(DEFINE:([Expr1009]=CASE WHEN [Expr1010] THEN [T1].[b] ELSE [T1].[c] END)) |—Nested Loops(Left Semi Join, OUTER REFERENCES:([T1]. [a]), DEFINE:([Expr1010] = [PROBE VALUE])) |—Table Scan(OBJECT:([T1])) |—Table Scan(OBJECT:([T2]), WHERE:([T2].[a]=[T1].[a])) |
Как и для других EXISTS подзапросов, этот план использует левое полусоединение, позволяющее проверить, имеется ли для каждой строки в T1 соответствующая строка в T2. Однако, нормальное полусоединение (или анти-полусоединение) возвращает только парные строки (или непарные). В этом случае, должно быть возвращено хоть что-то (T1.b или T1.c) для каждой строки в T1. Мы не можем просто отказаться от строки T1 только потому, что для неё нет соответствующей строки в T2.
Решением стал специальный тип полусоединения со столбцом пробной таблицы. Это полусоединение возвращает все внешние соответствующие или не соответствующие строки, и устанавливает столбец пробной таблицы (в нашем случае это [Expr1010]) в истину или ложь, что указывает, была ли найдена соответствующая строка T1. После этого, выполняется оценка выражения CASE, для чего используется столбец пробной таблицы, с помощью которого определяется, какое значение будет возвращено.
Предложение THEN
Давайте теперь попробуем добавить к предложению THEN простой подзапрос:
create table T3 (a int unique clustered, b int) insert T1 values(0, 0, 0) insert T1 values(1, 1, 1) select case when T1.a > 0 then (select T3.b from T3 where T3.a = T1.b) else T1.c end from T1
Я добавил к T3 ограничение уникальности, позволяющее гарантировать, что скалярный подзапрос возвратит только одну строку. Без ограничения, план запроса был бы более сложен, поскольку оптимизатору нужно было бы гарантировать, что подзапрос действительно возвратит только одну строку, и ему пришлось бы выдавать ошибку, если бы вернулось больше одной строки.
Я также добавил в T1 ещё две строки, причём, условие в предложение WHEN выдаст ложь для первой строки и истину для второй строки.
Ниже показан профиль статистики для плана исполнения этого запроса:
Rows Executes 0 0 |—Compute Scalar(DEFINE:([Expr1008]=CASE WHEN [T1].[a]>(0) THEN [T3].[b] ELSE [T1].[c] END)) 2 1 |—Nested Loops(Left Outer Join, PASSTHRU: (IsFalseOrNull [T1].[a]>(0)), OUTER REFERENCES:([T1].[b])) 2 1 |—Table Scan(OBJECT:([T1])) 0 1 |—Clustered Index Seek(OBJECT:([T3]. [UQ__T3__412EB0B6]), SEEK:([T3].[a]=[T1].[b]) ORDERED FORWARD) |
Этот план запроса использует специальный тип соединения вложенных циклов, в котором задействуется предикат PASSTHRU. Соединение оценивает предикат PASSTHRU для каждой внешней строки. Если предикат PASSTHRU оценивается как истина, соединение немедленно возвращает строку, подобную полусоединению или внешнему соединению. Если же предикат PASSTHRU оценивается как ложь, соединение выполняется обычным образом, т.е. выполняется попытка соединения внешней строки с внутренней строкой.
Обратите внимание, что просмотр T1 возвращает 2 строки, хотя поиск в T3 выполняется только один раз. Так происходит потому, что в нашем примере предложение WHEN истинно только для одной из двух строк. Предиката PASSTHRU является единственным механизмом, когда число строк на внешней стороне соединения вложенных циклов не соответствует в точности числу строк на внутренней стороне.
Предложение ELSE и несколько предложений WHEN
Подзапрос в предложении ELSE работает точно так же, как и подзапрос в предложении THEN. Для оценки условия подзапроса будет использован предикат PASSTHRU.
Точно так же выражение CASE с несколькими предложениями WHEN с подзапросами в каждом предложении THEN будет работать аналогичным образом. Отличие только в том, что предикатов PASSTHRU будет больше.
Например:
create table T4 (a int unique clustered, b int) create table T5 (a int unique clustered, b int) select case when T1.a > 0 then (select T3.b from T3 where T3.a = T1.a) when T1. b > 0 then (select T4.b from T4 where T4.a = T1.b) else (select T5.b from T5 where T5.a = T1.c) end from T1
|—Compute Scalar(DEFINE:([Expr1016]=CASE WHEN [T1].[a]>(0) ELSE CASE WHEN [T1].[b]>(0) THEN [T4].[b] ELSE [T5].[b] END END)) |—Nested Loops(Left Outer Join, PASSTHRU:([T1].[a]>(0) OR [T1].[b]>(0)), OUTER REFERENCES:([T1]. [c])) |—Nested Loops(Left Outer Join, PASSTHRU:([T1].[a]>(0) OR IsFalseOrNull [T1].[b]>(0)), OUTER REFERENCES:([T1].[b])) | |—Nested Loops(Left Outer Join, PASSTHRU: (IsFalseOrNull [T1].[a]>(0)), OUTER REFERENCES:([T1].[a])) | | |—Table Scan(OBJECT:([T1])) | | |—Clustered Index Seek(OBJECT:([T3].[UQ__T3__164452B1]), SEEK:([T3].[a]=[T1].[a]) ORDERED FORWARD) | |—Clustered Index Seek(OBJECT:([T4]. [UQ__T4__182C9B23]), SEEK:([T4].[a]=[T1].[b]) ORDERED FORWARD) |—Clustered Index Seek(OBJECT:([T5].[UQ__T5__1A14E395]), SEEK:([T5].[a]=[T1].[c]) ORDERED FORWARD) |
В этом плане запроса три соединения вложенных циклов с предикатами PASSTHRU. Для каждой строки T1, только один из трех предикатов PASSTHRU оценивается как истина, и только один из трех подзапросов будет выполнен. Обратите внимание, что пока второе предложение WHEN соответствует «T1.b > 0», это значит, что первое предложение WHEN, где «T1.a > 0» оказалось ложным. Это также относится и к предложению ELSE. Таким образом, предикаты PASSTHRU для второго и третьего подзапроса включают проверку «T1. a > 0 OR…».
Столбец пробной таблицы в качестве предиката PASSTHRU
Наконец, давайте рассмотрим запрос с подзапросами в предложениях WHEN и в предложениях THEN. Также, для разнообразия, давайте переместим выражение CASE из списка SELECT в предложение WHERE.
select * from T1 where 0 = case when exists (select * from T2 where T2.a = T1.a) then (select T3.b from T3 where T3.a = T1.b) else T1.c end
|—Filter(WHERE:((0)=CASE WHEN [Expr1013] THEN [T3].[b] ELSE [T1].[c] END)) |—Nested Loops(Left Outer Join, PASSTHRU:(IsFalseOrNull [Expr1013]), OUTER REFERENCES:([T1].[b])) |—Nested Loops(Left Semi Join, OUTER REFERENCES:([T1]. [a]), DEFINE:([Expr1013] = [PROBE VALUE])) | |—Table Scan(OBJECT:([T1])) | |—Table Scan(OBJECT:([T2]), WHERE:([T2].[a]=[T1].[a])) |—Clustered Index Seek(OBJECT:([T3].[UQ__T3__164452B1]), SEEK:([T3].[a]=[T1].[b]) ORDERED FORWARD) |
В этом плане исполнения запроса имеется левое полусоединение со столбцом пробной таблицы, позволяющее оценить подзапрос в предложении WHEN, и соединение вложенных циклов с предикатом PASSTHRU для столбца пробной таблицы, позволяющее решить, выполнять ли оценку подзапроса в предложении THEN. Поскольку выражение CASE было перемещено в предложение WHERE, для оценки выходных значений из списка SELECT вместо оператора Compute Scalar используется оператор Filter, с помощью которого определяется, какие строки будут возвращены. Все остальное работает точно так же.
Далее…
В следующей статье, я рассмотрю несколько других типов подзапросов.
оператор switch — cppreference.com
Язык C++
Операторы
Передает управление одному из нескольких операторов в зависимости от значения условия.
|
[править] Синтаксис
атрибут (необязательно) переключатель ( оператор инициализации (необязательно) условие ) оператор | |||||||||
атрибут | — | (начиная с C++11) любое количество атрибутов | ||
инструкция инициализации | — | (начиная с C++17) либо
| ||
состояние | — | любое выражение интегрального типа или типа перечисления, или типа класса, контекстуально неявно преобразуемого в целочисленный тип или тип перечисления, или объявление одиночной переменной такого типа, не являющейся массивом, с инициализатором скобок или равенства. Если тип (возможно, преобразованный) подлежит интегральным повышениям, условие преобразуется в повышенный тип. | ||
заявление | — | любой оператор (обычно составной оператор). случай: и по умолчанию: метки разрешены в операторе и разрыве; высказывание имеет особое значение. |
атрибут (необязательно) case константное выражение : оператор | (1) | ||||||||
атрибут (необязательно) по умолчанию : выписка | (2) | ||||||||
константное выражение | — | постоянное выражение того же типа, что и тип условия после преобразований и интегральных повышений |
[править] Объяснение
Тело оператора switch может иметь произвольное число 9Случай 0047: меток, если значения всех констант-выражений уникальны (после преобразований/продвижений). Может присутствовать не более одной метки по умолчанию:
(хотя вложенные операторы switch могут использовать свои собственные метки по умолчанию:
или иметь метки case:
, константы которых идентичны тем, которые используются во включенном переключателе).
Если условие оценивается как значение, равное значению одного из выражений-констант, то управление передается оператору, помеченному этим выражением-константой.
Если условие оценивается как значение, которое не соответствует ни одной из меток case:
, и присутствует метка default:
, управление передается оператору, помеченному меткой default:
.
Если условие оценивается как значение, которое не соответствует ни одной из меток case:
, а метка по умолчанию:
отсутствует, то ни один из операторов в теле переключателя не выполняется.
Оператор break, встречаясь в операторе, выходит из оператора switch:
переключатель (1) { Случай 1: cout << '1'; // печатает "1", случай 2: cout << '2'; // затем печатает "2" }
переключатель (1) { Случай 1: cout << '1'; // печатает "1" ломать; // и выходим из переключателя случай 2: cout << '2'; ломать; }
Компиляторы могут выдавать предупреждения о провале (достижение следующей метки варианта без разрыва), если только атрибут Если используется оператор инициализации, оператор switch эквивалентен
За исключением того, что имена, объявленные оператором инициализации (если оператор инициализации является объявлением), и имена, объявленные условием (если условие является объявлением), находятся в одной и той же области видимости, которая также является областью действия инструкции. | (начиная с C++17) |
Поскольку передача управления не разрешена для входа в область действия переменной, если оператор объявления встречается внутри оператора, его область действия должна быть определена в его собственном составном операторе:
переключатель (1) { Случай 1: интервал х = 0; // инициализация std::cout << x << '\n'; ломать; дефолт: // ошибка компиляции: перейти к умолчанию: // войдет в область действия 'x' без его инициализации std::cout << "по умолчанию\n"; ломать; }
переключатель (1) { Случай 1: { интервал х = 0; std::cout << x << '\n'; ломать; } // область 'x' заканчивается здесь дефолт: std::cout << "по умолчанию\n"; // Нет ошибок ломать; }
[править] Ключевые слова
переключатель, кейс, дефолт
[править] Пример
В следующем коде показано несколько вариантов использования оператора switch
#includeосновной () { константа int я = 2; переключатель (я) { Случай 1: std::cout << "1"; case 2: // выполнение начинается с этой метки case std::cout << "2"; случай 3: std::cout << "3"; [[провалиться]]; // Атрибут C++17 для отключения предупреждения о провале случай 5: std::cout << "45"; ломать; // выполнение последующих операторов прекращается случай 6: std::cout << "6"; } std::cout << '\n'; переключатель (я) { случай 4: std::cout << "а"; дефолт: std::cout << "d"; // нет применимых константных выражений // поэтому выполняется значение по умолчанию } std::cout << '\n'; переключатель (я) { случай 4: std::cout << "а"; // ничего не выполняется } // когда в операторе switch используются перечисления, многие компиляторы // выдавать предупреждения, если один из перечислителей не обрабатывается цвет перечисления {КРАСНЫЙ, ЗЕЛЕНЫЙ, СИНИЙ}; переключатель (КРАСНЫЙ) { чехол КРАСНЫЙ: std::cout << "красный\n"; ломать; чехол ЗЕЛЕНЫЙ: std::cout << "зеленый\n"; ломать; чехол СИНИЙ: std::cout << "синий\n"; ломать; } // синтаксис оператора инициализации C++17 может быть полезен, когда есть // нет неявного преобразования в целочисленный или перечисляемый тип структура Устройство { enum State {SLEEP, READY, BAD}; автоматическое состояние () const { return m_state; } /*. ..*/ частный: Состояние m_state{}; }; переключатель (auto dev = Device{}; dev.state()) { case Устройство::SLEEP: /*...*/ ломать; case Устройство::ГОТОВО: /*...*/ ломать; случай Устройство:: ПЛОХОЕ: /*...*/ ломать; } // патологические примеры // оператор не обязательно должен быть составным оператором переключатель (0) std::cout << "это ничего не делает\n"; // метки также не требуют составного оператора переключатель (целое n = 1) { случай 0: Случай 1: std::cout << n << '\n'; } }
Выход:
2345 д красный 1
[править] Отчеты о дефектах
Следующие отчеты о дефектах, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
ДР | Применяется к | Поведение после публикации | Правильное поведение |
---|---|---|---|
CWG 1767 | С++ 98 | условия типов, которые не подлежат интегральному продвижению , не могут быть продвинуты | не продвигать условия этих типов |
[изменить] См.
также документациюC для коммутатора |
[править] Внешние ссылки
- Развертка цикла с использованием устройства Даффа
- Устройство Даффа можно использовать для реализации сопрограмм на C/C++
Операторы Switch Case Control в C: Учебное пособие по C на хинди #11
Зачем изучать язык программирования C? : Учебник C на хинди #1
Что такое кодирование и язык программирования C? : Учебное пособие по C на хинди #2
Установка и настройка кода VS с помощью компилятора C: Учебное пособие по C на хинди #3
Базовая структура программы на языке C на хинди: Учебное пособие по C на хинди #4
Основной синтаксис программы на языке C: C Учебное пособие на хинди #5
Переменные и типы данных на языке C: Учебное пособие по C на хинди #6
Операторы на языке C: Учебное пособие по C на хинди #7
Программирование на C. Упражнение 1. Таблицы умножения: Учебное пособие по C на хинди #8
Спецификаторы формата C и Escape-последовательности с примерами: Учебное пособие по C на хинди #9
Операторы управления If Else на языке C: Учебное пособие по C на хинди #10
Операторы Switch Case Control на языке C: Учебное пособие по C на хинди #11
Циклы In C: Учебное пособие по C на хинди #12
Do While Loop В C: Учебное пособие по C на хинди #13
While Loop В C: Учебное пособие по C на хинди #14
For Loop В C: Учебное пособие по C на хинди #15
Операторы Break and Continue на C: Учебное пособие по C на хинди #16
Оператор Goto на C: Учебник по C на хинди #17
Приведение типов на C: Учебник по C на хинди #18
Функции на C: Учебник по C на хинди #19
C Упражнение 1: Решение таблицы умножения + Shoutouts: C Учебное пособие на хинди #20
Рекурсивные функции: рекурсия на языке C: Учебное пособие по C на хинди #21
Упражнение 2: Единицы и преобразования: Учебное пособие по C на хинди #22
Массивы на языке C: Учебное пособие по C на хинди #23
Упражнение 2: Решение + Shoutouts: Учебник C на хинди № 24 9#26 : Учебник C на хинди #28
Всегда ли рекурсия хороша? : Учебное пособие по C на хинди #29
Упражнение 4. Печать узоров звезд на языке C: Учебное пособие по C на хинди #30
Вызов по значению и вызов по ссылке на языке C: Учебное пособие по C на хинди #31
Передача массивов в качестве аргументов функций: Учебное пособие по C на хинди #32
Шаблон звезды на языке C — Упражнение 4 Решение: Учебное пособие по C на хинди #33
Строки на языке C: Учебное пособие по C на хинди #34
Строковые функции на языке C и string Библиотека .h: Учебное пособие по C на хинди #35
Обращение массива на языке C - Упражнение 5: Учебное пособие по C на хинди #36
Структуры на языке C: Учебное пособие по C на хинди #37
Typedef На языке C: Учебное пособие по C на хинди #38
Unions In C: Учебное пособие по C на хинди #39
C Language Reversal Array Упражнение 5: Решение: Учебное пособие по C на хинди #40
C Language Parser Упражнение 6: Учебное пособие по C на хинди #41
Статические переменные на языке C: Учебное пособие по C на хинди #42
Учебное упражнение по C 6: Решения и комментарии: Учебное пособие по C на хинди #43
Упражнение для менеджера туристического агентства по языку C 7: Учебное пособие по C на хинди #44
Распределение памяти в программах на C — динамическое выделение памяти: Учебное пособие по C на хинди #45
C Языковой менеджер туристического агентства. Упражнение 7. Решение: Учебник C на хинди № 46
Динамическое выделение памяти Malloc Calloc Realloc и Free(): Учебное пособие по C на хинди #47
Язык C Упражнение менеджера сотрудников 8: Учебное пособие по C на хинди #48
Классы хранения в C Auto, Extern Static и Register Классы хранения: C Учебное пособие на хинди #49
Менеджер сотрудников на языке C - Упражнение 8 Решение: Учебное пособие на языке C на языке хинди #50
Камень, бумага, ножницы для кодирования на языке C Упражнение 9: Учебное пособие по языку C на языке хинди #51
Void Pointer на языке C: C Учебник на хинди # 52
NULL Указатель на языке C: Учебное пособие по C на хинди #53
Висячий указатель на языке C: Учебное пособие по C на хинди #54
Дикий указатель на языке C: Учебное пособие по C на хинди #55
Rock, Paper & Scissors In Язык C — Упражнение 9 Решение: Учебник C на хинди #56
Умножение матриц на языке C — Упражнение 10: Учебник C на хинди #57
Введение и работа с препроцессором C: Учебник C на хинди #58
#define и #include Директивы препроцессора: Учебное пособие по C на хинди # 59
Предопределенные макросы и другие директивы препроцессора: Учебное пособие по C на хинди №60
Умножение матриц на языке C — Упражнение 10 Решение: Учебное пособие по C на хинди №61
Файловый ввод-вывод на языке C: Учебное пособие по C на хинди №62
Проверка палиндрома на языке C.