- •Материалы для подоговки к экзамену по дисциплине «основы программировния»
- •Тема №1 Основные понятия
- •Способы записи алгоритма
- •Тема №2 Переменные
- •Типы переменных
- •Типы с плавающей точкой
- •Переполнение переменных
- •Постфиксное обозначение типа
- •Шестнадцатеричный и восьмеричный формат
- •Экспоненциальная форма представления чисел
- •Объявление переменных
- •Начальное значение переменной
- •Область видимости переменной
- •Тема №3 Оператор присваивания
- •Ввод-вывод Форматированный вывод
- •Форматированный ввод
- •Непечатные символы
- •Тема №4 Ветвления и логические операторы
- •Оператор Switch
- •Логические операторы
- •Логическое отрицание
- •Логическое и
- •Логическое или
- •Пример: закон де-Моргана.
- •Порядок выполнения логических операторов
- •Тема №5 Циклы
- •Цикл с предусловием
- •Циклы с постусловием
- •Цикл for
- •Вложенные циклы
- •Тема №6 Одномерные массивы
- •Начальная инициализация массива.
- •Размер массива
- •Переполнение массива
- •Пример с одномерным массивом
- •Многомерные статические массивы
- •Пример с многомерным массивом
- •Тема №7 Строки в си. Введение
- •Чтение строк
- •Указатели
- •Определение
- •Арифметика указателей
- •Указатель на указатель
- •Указатели и приведение типов
- •Null pointer - нулевой указатель
- •Пример работы с указателями
- •Тема №8 Указатели и массивы
- •Многомерные массивы и указатели на многомерные массивы
- •Определение макросов
- •Тема №9 Тернарный оператор и оператор запятая
- •Оператор запятая.
- •Сегментация приложения на си
- •Тема №10 Динамическое выделение памяти
- •Освобождение памяти с помощью free
- •Работа с двумерными и многомерными массивами
- •Тема №11 Параметры командной строки
- •Функции
- •Параметры и аргументы
- •Передача аргументов По значению
- •По указателю (ссылке)
- •Передача массива в качестве аргумента
- •Тема №12 Битовые операции
- •Операции побитового сдвига
- •Примеры
- •Вопросы к экзамену по дисциплине «Основы программирования»
Непечатные символы
В си определён ряд символов, которые не выводятся на печать, но позволяют производить форматирование вывода. Эти символы можно задавать в виде численных значений, либо в виде эскейп-последовательностей:
символа,
экранированного обратным слешем.
Последовательность |
Числовое значение |
Результат |
\a |
0x07 |
Звуковой сигнал |
\b |
0x08 |
Перевод каретки на одно значение назад |
\f |
0x0c |
Новая страница |
\n |
0x0a |
Новая строка |
\r |
0x0d |
Возврат каретки |
\t |
0x09 |
Табуляция |
\v |
0x0b |
Вертикальная табуляция |
\" |
0x22 |
Двойная кавычка |
\\ |
0x5с |
Обратный слеш |
#include <stdio.h>
#include <conio.h>
void main() {
char backspace = 0x08;
//Выводим с использованием символа переноса строки
printf("Hello\nWorld\n");
//Выводим символ переноса строки через его значение
printf("Hello%cWorld\n", 0x0a);
//"Выводим" сигнал
printf("\a");
//Выводим сигнал, как символ
printf("%c", '\a');
//Выводим сигнал через шестнадцатеричное значение
printf("%c", 0x07);
printf("This is sparta!!!\b\b%c", backspace);
printf(" ");
getch();
}
Тема №4 Ветвления и логические операторы
Ветвление служит для выбора определённого набора команд в зависимости от значения некоторого выражения. Например, если человек набрал правильный пароль, то дверь открывается, иначе нет, если температура человека больше 38 градусов, у него кашель и насморк, то есть подозрение на грипп, если дискриминант меньше нуля, то корни уравнения комплексные и т.п.
В си ветвления организуются с помощью конструкции
if (условие) {
<Действия, если условие выполняется>
} else {
<Действия, если условие не выполняется>
}
Например, запрашиваем у человека пароль, если он совпадает, то пишем приветствие, иначе ограничиваем вход.
#include<stdio.h>
#include<conio.h>
int main() {
int pass;
prinf("Enter password: ");
scanf("%d", &pass);
if (pass == 1234) {
printf("Welcome");
} else {
prinf("Access denied!");
}
getch();
}
В си используется несколько логических операторов:
> больше
< меньше
>= больше или равно
<= меньше или равно
== равно
!= не равно
! отрицание выражения
Особенностью Си является то, что в нём отсутствует специальный булев тип. Истиной в си является любой ненулевое значение, ложью 0. Операторы сравнения также возвращают в качестве ложи 0, в качестве истины любое ненулевое значение. С помощью логических операторов можно создавать сложные, составные выражения, об этом поговорим позже.
Одной из самых распространённых ошибок при обучении си является использование оператора присваивания = вместо оператора сравнения ==. Как упоминалось в разговоре про оператор присваивания, он возвращает значение, поэтому это значение воспринимается как истина, или ложь.
Например.
#include<conio.h>
#include<stdio.h>
int main() {
if (1) {
printf("TRUE");
} else {
printf("FALSE");
}
getch();
}
В этом примере будет выведено TRUE.
Вот пример, где ошибочно используется оператор присваивания вместо равно.
#include<conio.h>
#include<stdio.h>
int main() {
int i = 0;
if (i = 1) {
printf("i equals to 1");
} else {
printf("i equals to 0");
}
getch();
}
Здесь при проверке условия переменной i присваивается 1, и эта же единица возвращается как логическая истина, поэтому работать будет первая ветвь.
Оператор if может содержать всего одну ветвь, в этом случае вторая просто опускается, например.
#include<conio.h>
#include<stdio.h>
int main() {
float number;
printf("Enter number");
scanf("%f", &number);
if (number < 0.0f) {
number = -number;
}
printf("%.6f", number);
getch();
}
В этой программе пользователь вводит число, если оно отрицательное, то мы меняем его знак. В том случае, если ветвь оператора if содержит всего один оператор, то можно не использовать фигурные скобки. Прошлый пример можно переписать
#include<conio.h>
#include<stdio.h>
int main() {
float number;
printf("Enter number ");
scanf("%f", &number);
if (number < 0.0f)
number = -number;
printf("%.6f", number);
getch();
}
Однако, это плохой стиль программирования. Пожалуйста, пишите фигурные скобки всегда. Это улучшает читаемость кода, за счёт чего вы будете делать меньше ошибок.
Ветвления могут идти друг за другом, например, можно проверять много условий. Напишем программу, которая по порядковому дню недели выводит его название.
#include<conio.h>
#include<stdio.h>
int main() {
unsigned day;
printf("Enter day ");
scanf("%d", &day);
if (day > 7) {
day = day % 7;
}
if (day == 0) {
printf("Sunday");
} else if (day == 1) {
printf("Monday");
} else if (day == 2) {
printf("Tuesday");
} else if (day == 3) {
printf("Wednesday");
} else if (day == 4) {
printf("Thursday");
} else if (day == 5) {
printf("Friday");
} else if (day == 6) {
printf("Saturday");
}
getch();
}
Ветви оператора if могут содержать любые допустимые к использованию внутри функции конструкции. Например, объявление переменных, ветвления и т.д. Ветвления могут быть вложены друг в друга.
#include <stdio.h>
#include <conio.h>
int main() {
unsigned month, year;
printf("Enter month");
scanf("%d", &month);
printf("Enter year");
scanf("%d", &year);
if (month < 13) {
if (month == 1 ||
month == 3 ||
month == 5 ||
month == 7 ||
month == 8 ||
month == 10 ||
month == 12) {
printf("31 days");
} else if (month == 2) {
if (year % 4 == 0) {
printf("29 days");
} else {
printf("28 days");
}
} else {
printf("30 days");
}
} else {
printf("No such month");
}
}
