Слайд 1Основы программирования на Си, С++
доцент кафедры теоретической кибернетики
Киевского национального университета
имени Тараса Шевченко
Бычков Алексей Сергеевич
Слайд 2Содержание
История.
Архитектура компьютера. Алфавит языка. Пример программы на С. Разбор программы.
Изучение синтаксиса. Функция печати. Спецсимволы управления печатью. Простые типы переменных.
Основные операции. Примеры решения задача.
Контрольные вопросы.
Слайд 3Цели
Узнать:
что такое компьютер, программа
Написать первую программу
Научиться писать простые программы (очень
простые)
Слайд 4Что такое компьютер?
Вкратце: компьютер — устройство для программируемой обработки информации. А
это значит…
Компьютер может управлять доменной печью. А может помогать печатать
тексты. И то, и другое — обработка информации.
Чтобы компьютер работал, в него надо загрузить задание по обработке информации, так называемую программу. И наша задача — научиться эти программы писать.
Слайд 5Что такое компьютер?
Из чего компьютер состоит.
Память, в которой компьютер держит
программу, по которой работает, и данные, которые обрабатывает.
Арифметико-логическое устройство. Состоит
из небольшого количества памяти (т. н. регистров процессора) и логических схем, которые по команде извне соединяют регистры друг с другом. Например, соединили два регистра схемой суммирования — получили сумму двух чисел.
Устройство управления, которое загружает из памяти команды и исполняет их на арифметико-логическом устройстве.
Устройства ввода-вывода.
Слайд 6Что такое компьютер?
арифметико-логическое устройство + устройство управления
=
центральный процессор.
Слайд 7Архитектура компьютера
ГАРВАРДСКАЯ АРХИТЕКТУРА
Слайд 8ГАРВАРДСКАЯ АРХИТЕКТУРА
Применяется в основном в специальных компьютерах и микроконтроллерах. Компьютеры
гарвардской архитектуры работают в ваших флэшках, клавиатурах, модемах.
Два запоминающих устройства
— выше скорость (память намного медленнее арифметико-логического устройства).
Крайне сложно испортить программу по ошибке программиста.
Программная память может быть постоянная, а память данных — оперативная. В таком случае гарвардской ЭВМ вообще не нужна начальная загрузка.
Слайд 10АРХИТЕКТУРА ФОН НЕЙМАНА
Применяется в компьютерах общего назначения. Это ваши настольные
компьютеры, ноутбуки, телефоны, планшеты, маршрутизаторы.
Общая память для программ и данных
=> возможны сложные операционные системы наподобие Windows и Linux, загружающие программы в память и выгружающие их.
Для прикладного программиста разница между этими архитектурами невелика. И на тех, и на других можно программировать на языке Си.
Слайд 11Немного о Си
Язык Си был разработан Брайаном Керниганом и Деннисом
Ричи в 1973 году. Первой крупной разработкой на Си стало
ядро операционной системы Unix.
Существуют три стандарта Си:
ANSI C (1989)
C99 (1999)
C11 (2011)
Си и его последователь Cи++ — основные языки профессионального программирования.
Слайд 12Немного о Си
Наиболее известные компиляторы Си:
Microsoft Visual C++
Intel C Compiler
GNU
Compiler Collection
Clang
Слайд 13Алфавит
Буквы: A–Z, a–z, подчёркивание _.
Подчёркивание считается буквой. Язык Си
отличает заглавные буквы от строчных.
Цифры: 0–9.
Невидимые: пробел; TAB, приравнивающийся к
пробелу; перевод строки.
Специальные: ! # % ^ & * ( ) − + = ~ [ ] ' | \ ; : " { } , . < > / ?
Слайд 14Алфавит
Зарезервированные слова:
Auto, break, case, char, const, continue, default, do, double,else,enum,
extern, float, for,goto, if, inline, int, long, register, return, short,
signed, sizeof, static, struct, switch, typedef, union, unsigned, void, volatile, while
Слайд 15Первая программа на Си
/*
Первая программа на Си
Выводит на экран Hello world
*/
// Подключение заголовочного файла
#include
// Главная функция
int main()
{
printf("Hello world!\n");
return 0;
}
Слайд 16Первая программа на Си
/*
Первая программа на
Си
Выводит на экран Hello world
*/
Это комментарий — пояснение
к программе. Компиляторы его пропускают.
Начиная с C99, разрешены и однострочные комментарии — от // и до конца строки.
Слайд 17Первая программа на Си
#include
Это так называемая «директива препроцессора». Эта
директива подключает к нашей программе файл с функциями ввода-вывода (standard
input-output).
Слайд 18Первая программа на Си
int main()
{
…..
}
Тело программы всегда содержится в функции
с названием main, которая не принимает никаких параметров (пустые скобки)
и возвращает целое число (int, сокращение от integer).
Слайд 19Первая программа на Си
printf("Hello world!\n");
Для чего мы подключали stdio.h? Из
него нам нужна функция printf (print форматный). Текст берётся в
двойные кавычки; \n — обозначение для символа перехода на новую строку.
Хороший тон: всё, что в фигурных скобках, сдвигать вправо.
То есть, мы пишем текст «Hello world» и переводим курсор на новую строку.
В конце каждой команды должна быть точка с запятой.
Слайд 20Первая программа на Си
return 0;
Наша функция main всегда возвращает 0.
Этот ноль — так называемый «код возврата из программы». Принято,
что нормально закончившаяся программа возвращает ноль, закончившаяся с ошибкой — не ноль. Коды возврата используются, когда одна программа вызывает другую.
Слайд 21Первая программа на Си
Кроме \n, существуют такие спецсимволы:
\n — перейти
на новую строку.
\a — звуковой сигнал.
\r — возврат каретки (вернуться
в начало строки).
\t — табуляция (переход к ближайшей позиции 1, 9, 17, 25, 33…)
\b — сдвинуть курсор на одну позицию назад.
\" — кавычка
\' — апостроф
\\ — обратная косая черта.
\123 — символ, заданный восьмеричным кодом. До трёх цифр.
\xAB — символ, заданный шестнадцатеричным кодом. Сколько угодно цифр.
Слайд 22Первая программа на Си
Одной функцией printf можно написать и несколько
строк текста, например,
printf(“Мы студенты первого курса\nКиевского национального университета\n”);
Запись "раз" "два"
эквивалентна "раздва", поэтому тот же оператор можно записать как
printf(“Мы студенты первого курса\n”
“Киевского национального университета\n”);
Слайд 23Первая программа на Си
Хороший тон: многострочный вывод оформлять вот так.
printf(“Мы
студенты первого курса\n”
“Киевского
национального университета\n”);
Слайд 24Типы переменных
Программа, написанная на Си, оперирует переменными. Каждая из переменных
имеет какой-то тип. Например,
int x;
Вот мы объявили переменную x типа
int.
Слайд 26Типы переменных
Опишем ещё пару переменных.
double vectorX, vectorY;
short charCode;
int a_1, a_2,
a_3;
long _test;
Слайд 27Имена переменных
Имена переменных — так называемые идентификаторы — устроены так.
Начинаются с буквы
или подчёркивания.
Состоят из букв, цифр и подчёркиваний.
Регистр важен.
Слайд 28Еще одна программа на Си
Так что давайте напишем вторую программу.
/*
Программа вводит a и b, и выдаёт сумму a+b
*/
#include
int
main()
{
int a, b, sum;
printf("Enter a >");
scanf("%d", &a);
printf("Enter b >");
scanf("%d", &b);
sum = a + b;
printf("a+b=%d\n", sum);
return 0;
}
Слайд 29Еще одна программа на Си
int a, b, sum;
Мы завели три
переменных целого типа: для a, b и суммы.
printf("Enter a >");
С
этим мы уже знакомы. Однако символа \n нет, так что на другую строку не переходим.
Хороший тон: прежде чем просить пользователя ввести что-то, напишите, что именно вы требуете от него.
Слайд 30Еще одна программа на Си
scanf("%d", &a);
Это scan форматный, ещё одна
функция из stdio.h. Команда считывает с клавиатуры одно число типа
int (%d в форматной строке) и помещает его в переменную a.
Для чего нужен амперсанд, мы узнаем позже, через несколько лекций, а пока только скажу: он нужен.
Слайд 31Еще одна программа на Си
printf("Enter b >");
scanf("%d",
&b);
Пишем «Enter b >», остаёмся на той же строке и
просим пользователя ввести число.
Слайд 32Еще одна программа на Си
sum = a + b;
Берём значения
переменных а и b, складываем их и результат помещаем в
sum. Читается как «sum присвоить a+b».
Слайд 33Еще одна программа на Си
printf("a+b=%d\n", sum);
С концепцией форматной строки мы
уже знакомы по scanf. Вместо %d будет подставлено значение переменной
sum, типа int.
Слайд 34Еще одна программа на Си
Вот еще несколько форматных строк.
%d —
для int
%u — для unsigned int
%f — для float
%lf — для double
%%
— знак процента
(Есть и другие форматные строки, об этом позже)
Слайд 35Целые и дробные числа
Целые числа в языке программирования Си имеют
такой вид:
[+|−|0x|0]цифры[U][L|LL]
Слайд 36Целые и дробные числа
Минус — для отрицательного числа (−4)
0x — для
числа в шестнадцатеричной системе счисления (0xF5 = F516 = 245)
0 —
для числа в восьмеричной системе счисления (0267 = 2678 = 183)
U — чтобы сказать, что число беззнаковое (например, 1U).
L — чтобы сказать, что оно long (2L)
LL — чтобы сказать, что оно long long (123456789012LL).
Буквы U, L и LL разрешены как большие, так и маленькие.
Хороший тон: не писать 2l («два-эль»). Это Си разрешает, но легко спутать с числом 21 («двадцать один»).
Слайд 37Целые и дробные числа
Допустим, некоторые компиляторы отказываются работать с таким
кодом:
long long x;
x = 1212121212121212;
Приходится писать
x = 1212121212121212LL;
Слайд 38Целые и дробные числа
Дробные числа выглядят так:
[+|−]цифры.цифры[E][+|−]цифры][F|L]
Например, 3,5·10−6 записывается как
3.5e−6. По умолчанию числовые константы имеют точность double.
Если нужна
точность float, надо добавить F, если long double — L. Число 3,5 называется мантисса, число −6 — порядок.
Слайд 39Еще одна программа….
/*
Вычисление площади круга
*/
#include
int main()
{
double
r, area;
printf("Enter raduis >");
scanf("%lf", &r);
area = 3.14159265*r*r;
printf("Area is %lf.”, area);
return 0;
}
Слайд 40Еще одна программа….
double r, area;
Заводим две переменных типа double: радиус
и площадь.
Внимание! Старайтесь придумывать переменным говорящие имена. Вашу программу будет
проще читать тому, кто не знаком с вашим кодом.
Слайд 41Еще одна программа….
scanf("%lf", &r);
Тут мы вводим радиус типа double, с
соответствующей форматной строкой.
area = 3.14159265*r*r;
Умножение в компьютере принято обозначать звёздочкой.
Вычисляем площадь и присваиваем её переменной area.
printf("Area is %lf.”, area);
Опять-таки: раз уж выводим double, то и в форматной строке пишем %lf.
Слайд 42Операции
1. Унарные суффиксные (наивысший приоритет).
x++ Вернуть x, затем прибавить единицу
x−− Вернуть x,
затем вычесть единицу
( ) Вызов функции; управление порядком операций (скобки как в
математике)
[ ] Элемент массива
. Поле структуры
−> Переход по указателю
Слайд 43Операции
2. Унарные префиксные.
++x Прибавить единицу
−−x Вычесть единицу
+ Ничего не делает (например, +5)
− Изменить знак
(например, −x)
! Логическое «НЕ»
~ Побитовое «НЕ»
(int) Преобразование типа
* Разыменование указателя
& Получить указатель на объект
sizeof() Получить размер
переменной
Слайд 44Операции
3. Операции типа умножения.
* Умножение
/ Деление (для целых чисел — округляет к нулю)
То
есть, 10.0/3.0 == 3.3333333 (дробные числа); 10/3 == 3 (целые
числа)
% Взятие остатка от деления (10%3 == 1).
Работает только для целых чисел, для дробных функция fmod.
Слайд 45Операции
4. Операции типа сложения
+ Сложение
− Вычитание
5. Побитовые сдвиги
>> Сдвиг вправо (для знаковых чисел
— т. н. «арифметический сдвиг»)
Слайд 46Операции
6. Операции сравнения
< Меньше
Больше
>= Больше или равняется
7. Операции сравнения-2
== Равняется
!= Не равняется
Слайд 47Операции
8. & (побитовое «И»)
9. ^ (побитовое «исключающее ИЛИ» aka XOR)
10. | (побитовое
«ИЛИ»)
11. && (логическое «И»)
12. || (логическое «ИЛИ»)
13. x ? y
: z (операция «если-то-иначе») Порядок — справа налево.
Слайд 48Операции
14. Присваивания. Порядок — справа налево.
= Присвоить
+= Прибавить
−= Вычесть
*= Умножить
/= Разделить
%= Взять остаток
= Сдвинуть вправо
&= Перемножить побитово
|= Сложить
побитово
Слайд 49Операции
15. Запятая (минимальный приоритет)
, Выполнить последовательно. Результат — последний из операндов.
Слайд 50И ещё одна задача
Одна сухопутная миля равняется 1,609 км. Один
американский галлон равняется 3,785 л. Перевести американский расход топлива (миль
на галлон, mpg) в наши родные литры/100 км.
Слайд 51И ещё одна задача
/*
Преобразование расхода топлива: mpg →
л/100 км
*/
#include
int main()
{
double mpg, km_l, l_100km;
printf("Enter mpg >");
scanf("%lf", &mpg);
km_l = mpg * 1.609 / 3.785;
l_100km = 100.0 / km_l;
printf("Расход топлива равен %lf l/100 km.", l_100km);
return 0;
}
Слайд 52Как сделать задержку?
И наконец. В некоторых средах программирования, когда вы
запускаете программу, окошко мелькает и исчезает. Чтобы сделать задержку, нужен
вот такой код.
printf("Press Enter!");
fflush(stdin);
getchar();
fflush(stdin);
Слайд 53Как сделать задержку?
1. Напечатать «Press Enter».
2. Выбросить все несчитанные символы
из стандартного потока ввода (stdin).
Замечание. В Windows — работает.
В Linux — нет.
Для чего это нужно? Мы ввели «10 ENTER». Scanf считал число, а enter оставил. Вот getchar этот ENTER и считает.
3. Считать ещё один символ. Символы передаются в программу, когда пользователь нажимает ENTER.
4. И снова выбросить всё, что сверх одного символа.
Слайд 54Задания
1. Вывести printf’ом какой-нибудь узор, например
* * **** *
* **
* * * *
* * *
**** *** * * * *
* * * * * * *
* * **** **** **** **
Постарайтесь это сделать одним printf’ом.
2. Перевести градусы Фаренгейта в градусы Цельсия. 0°F = −18°C, 100°F = 38°C.
Слайд 55Задания
3. Ввести с клавиатуры a, b, c, d, e, f.
Решить методом Крамера систему линейных алгебраических уравнений:
ax + by =
c
dx + ey = f
(считаем, что система невырожденная и имеет только одно решение.)
Слайд 56В следующей лекции будет…
Подробнее об операциях.
Математика. Модуль math.h
Преобразование типов.
Простейшая логика.