Лекция 1 - Основы языка Си.pptx
- Количество слайдов: 61
Лекция № 1 Обзор синтаксиса языка Си
План лекции 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Алфавит языка Си Идентификаторы. Константы. Ключевые слова. Типы данных. Структура Си программы. Стандартные библиотеки. Математические функции. Функции форматного ввода вывода. Операции. Условный оператор. Выбор. Циклы с параметром. Циклы с предусловием. Циклы с постусловием.
Алфавит В алфавит языка Си входят: • прописные и строчные буквы латинского алфавита (A, B, . . . , Z, а, b, . . . , z) • цифры: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 • специальные знаки: " , {} | [ ] () * + / % ; ' . : ? < = >_ ! & # • неотображаемые символы ("обобщенные пробельные символы"), используемые для отделения лексем друг от друга (например, пробел, табуляция, переход на новую строку).
Идентификаторы Последовательность букв, цифр и символов подчеркивания "_" , начинающаяся с буквы или символа подчеркивания, считается идентификатором языка Си. Примеры идентификаторов: КОМ_16, size 88, _MIN, TIME, time Прописные и строчные буквы различаются, т. е. два послед них идентификатора различны. Идентификаторы могут иметь любую длину, но компилятор учитывает не более 31 го символа от начала идентификатора.
Ключевые слова Следующие идентификаторы зарезервированы для использования в качестве ключевых слов и не могут использоваться иным образом: INT EXTERN ELSE CHAR REGISTER FOR FLOAT TYPEDEF DO DOUBLE STATIC WHILE STRUCT GOTO SWITCH UNION RETURN CASE LONG SIZEOF DEFAULT SHORT BREAK ENTRY UNSIGNED CONTINUE AUTO IF
Типы данных К спецификаторам типов относятся: char символьный; double вещественный двойной точности с плавающей точкой; float вещественный с плавающей точкой; int целый; long целый увеличенной длины (длинное целое); short целый уменьшенной длины (короткое целое); signed знаковый, т. е. целое со знаком (старший бит считается знаковым); unsigned беззнаковый, т. е. целое без знака (старший бит не считается знаковым); void отсутствие значения; Для описания констант используют служебное слово const перед описанием типа. Например, const float g=9. 8;
Структура Си-программы директивы препроцессора (подключаемые библиотеки) (функции) int main() { определения объектов; исполняемые_операторы; return 0; }
Пример Си-программы #include <stdio. h> main() { int a, b, s; printf("Введите два числа: "); scanf("%d %d”, &a, &b); s = a + b; printf("CУММА = %d n", s); }
Стандартные библиотеки Язык Си имеет богатую поддержку в виде более 450 библиотечных подпрограмм функций и макросов, которые вы можете вызывать из своих Си программ для решения широкого спектра задач, включая ввод/вывод низкого и высокого уровня, работу со строками и файлами, распределение памяти, управление процессами, преобразование данных, математические вычисления и многое другое.
Подключение библиотек Для подключения библиотек используется директива препроцессора # include [имя файла] Например: #include <stdio. h> #include “mylib. h”
Некоторые стандартные библиотеки ALLOC. H Описание функций управления памятью (allocation, deallocation и др. ) BIOS. H Описание различных функций, используемых при обращении к подпрограммам BIOS (базовой системе ввода вывода). CONIO. H Описание различных функций, используемых в обращении к подпрограммам DOS ввода вывода с клавиатуры.
Некоторые стандартные библиотеки GRAPHICS. H Содержит прототипы графических функций. MATH. H Содержит описание прототипов математических функций STDIO. H Определяет типы и макросы, необходимые для стандартного пакета ввода вывода. Определяет так же стандартные потоки ввода вывода stdin, stdout и описывает подпрогpаммы ввода/вывода.
Некоторые стандартные библиотеки STDLIB. H Описывает некоторые подпрограммы общего назначения: подпрограммы преобразования, поиска, сортировки и другие. STRING. H Описывает несколько подпрограмм обработки строк и работы с памятью.
Основные математические функции библиотеки MATH. H Функция abs Назаначение Синтаксис acos Вычисляет абсолютное int abs (int i); значение аргумента (по модулю) Вычисляет аркосинус double acos(double x); asin Вычисление арксинуса double asin(double x); atan Вычисление арктангенса double atan(double x); ceil cosh Округление значениия double ceil (double x); аргумента сверху (наименьшее целое не меньше x) Вычисление косинуса double cos(double x); Вычисление гиперболического double cosh(double x); косинуса
Основные математические функции библиотеки MATH. H div Деленеие нацело и определение остатка частное (. quot), остаток (. rem) exp floor Определение экспоненты ex Округление сверху вещественного аргумента Остаток от x/y fmod typedef struct { int qout; int rem; } div_t; div_t div(int n, int d) Результаты : x. quot; x. rem double exp(double x); double floor(double x); double fmod(double x, double y);
Основные математические функции библиотеки MATH. H hypot log 10 pow 10 sinh sqrt tanh Вычисляет гипотенузу прямоугольного треугольника Логарифмическая функция ln x double hypot(double x, double y); double log(double x); Логорифмическая функция lg x Вычисляет значение x в степени y Вычисляет значение 10 в степени р Тригонометрическая функция синус Гиперболическая функция синус Вычисляет корень квадратный Вычисляет тангенс Вычисляет гиперболический тангенс double log 10(double x); double pow(double x, double y); double pow 10(int x); double sin(double x); double sinh(double x); double sqrt(double x); double tanh(double x);
Пример Си-программы #include <stdio. h> #include <math. h> main() { float x 1, y 1, x 2, y 2; printf("Введите два числа: "); scanf("%f %f”, &x 1, &y 1, &x 2, &y 2); float d = sqrt(pow((x 2 x 1), 2)+pow((y 2 y 1), 2)); printf(“d= %f n", d); }
Функция форматного вывода PRINTF Мы уже использовали наиболее употребительную функцию вывода в Си подпрограмму printf. Ее целью является запись информации на экран. Ее формат как прост, так и гибок: printf(<строка формата>, <объект>, . . . );
Строка формата это строка, которая начинается и заканчивается двойными кавычками ("как эта"); цель printf запись этой строки на экран. Перед выводом printf заменяет все дополнительно перечисленные объекты в строке в соответствии со спецификациями формата, указанными в самой строке. Например, если написать строку программного кода на языке Си для разобранного ранее алгоритма, будет описан оператором printf следующим образом: printf(“ d= %f n", d);
Строка формата %f в строке формата это спецификация формата. Все спецификации формата начинаются с символа процента (%) и (обычно) сопровождаются одной буквой, обозначающей тип данных и способ их преобразования. %f, используемое в спецификации, говорит о том, что ожидается некоторое вещественное число. Вот несколько других обще используемых спецификаций формата: %u целое число без знака %ld длинное целое число %p значение указателя %i целое число %e число с плавающей точкой в экспоненциальной форме %c cимвол %s строка %x или %X целое в шестнадцатиричном формате.
Строка формата Вы можете задать ширину поля, помещая ее между % и буквой, например, десятичное поле шириной 4 задается, как %4 d. Значение будет напечатано сдвинутым вправо (впереди пробелы), так что общая ширина поля равна 4. Или например %6. 2 f будет обозначать что отведено 6 позиций под вещественное число, причем 2 – под дробную часть. Если нужно напечатать знак %, то вставьте %%.
Строка формата n в строке не является спецификацией формата, а употребляется (по историческим мотивам) как управляющая (escape) последовательность, и представляет специальный символ, вставляемый в строку. В этом случае n вставляет символ в начале новой строки, поэтому после вывода строки курсор передвинется к началу новой строки. f (перевод формата или очистка экрана) t (табуляция) b (забой < ) xhhh (вставка символа c кодом ASCII hhh, где hhh содержит от 1 до 316 ричных цифр) Если вам нужно напечатать обратную косую черту, то вставьте \.
Пример Си-программы #include <stdio. h> #include <math. h> main() { float x 1, y 1, x 2, y 2; printf("Введите два числа: "); scanf("%f %f”, &x 1, &y 1, &x 2, &y 2); float d = sqrt(pow((x 2 x 1), 2)+pow((y 2 y 1), 2)); printf(“d= %f n", d); }
Другие функции вывода PUTS, PUTCHAR Имеются две другие функции вывода, которые могут вас заинтересовать: puts и putchar. Функция puts выводит строку на экран и завершает вывод символом новой строки. Рассмотрим пример программы : #include <stdio. h> main () { puts("Привет, студент ВКИ НГУ"); } Заметим, что в конце строки опущен n; это не нужно, так как puts сама добавляет этот символ. Наоборот, функция putchar записывает единственный символ на экран и не добавляет n. Оператор putchar(ch) эквивалентен printf("%c", ch).
Функция форматного ввода SCANF Для интерактивного режима ввода, вероятно, можно использовать в большинстве случаев функцию scanf это функция ввода, по смыслу эквивалентная printf; ее формат выглядит так: scanf(<строка формата>, <адрес>, . . . ) В scanf используются многие из тех же спецификаторов формата %<буква>, что и у функции printf: %d для целых, %f для чисел с плавающей точкой, %s для строк и т. д.
Функция форматного ввода SCANF Однако scanf имеет одно очень важное отличие: объекты, следующие за строкой формата, должны быть адресами, а не значениями. Например, в программе содержится следующий вызов: scanf("%d %d", &a, &b); Этот вызов сообщает программе, что она должна ожидать от вас ввода двух десятичных (целых) чисел, разделенных пробелом; первое будет присвоено а, а второе b. Заметим, что здесь используется операция адреса (&) для передачи адресов а и b функции scanf.
Функции. GETS, GETCH main () { char name [60]; printf("Как вас зовут: "); scanf (“%s”, name); printf ("Привет, %sn", name); } Если ввести фамилию и имя, то выведется только фамилия. Потому, что введенный вами после имени пробел сигнализирует scanf о конце вводимой строки. Решить эту проблему можно, используя функцию gets. main () { char name [60]; printf("Как вас зовут: "); gets (name); printf ("Привет, %sn", name);
Функции. GETS, GETCH # include <stdio. h> # include <conio. h> main () { clrscr(); char name [60]; printf("Как вас зовут: "); gets (name); printf ("Привет, %sn", name); getch(); } Здесь функция getch ожидает ввода любого символа. Функция getch читает единственный символ с клавиатуры, не выдавая его на экран (в отличии от scanf и gets). Заметим, что у нее нет параметра. Если же присвоить функцию символьной переменной, то она получит значение нажатого символа. Например : c=getch();
Комментарии Часто бывает полезно вставлять в программу текст, который пред назначается в качестве комментария только для читающего программу человека и игнорируется компилятором в программе. В Си это можно сделать одним из двух способов. Символы /* начинают комментарий, заканчивающийся символами */. Вся эта последовательность символов эквивалентна символу пропуска (например, символу пробела). Это наиболее полезно для многострочных комментариев и изъятия частей программы при редактировании, однако следует помнить, что комментарии /* */ не могут быть вложенными.
Комментарии Символы // начинают комментарий, который заканчивается в конце строки, на которой они появились. Опять все последовательности символов эквивалентны пропуску. Этот способ наиболее полезен для коротких комментариев. Символы // можно использовать для того, чтобы закомментировать символы /* или */, а символами /* можно закомментировать //.
Операция присваивания Самой общей операцией является присваивание, например, p=a/b или ch = getch(). В Си присваивание обозначается одним знаком равенства (=); при этом значение справа от знака равенства присваивается переменной слева. Можно применять также последовательные присваивания, например: sum=a= b. В таких случаях присваивание производится справа налево, то есть b будет присвоено a, которая в свою очередь будет присвоена sum, так что все три переменных получат одно и то же значение (а именно, начальное значение b).
Арифметические операции Си поддерживает обычный набор арифметических операций: умножение (*) деление (/) определение остатка от деления (%) сложение (+) вычитание ( )
Инкремент. Декремент. Для увеличения значений переменной на единицу используют инкремент (++), для уменьшения на единицу декремент ( ). Так : x++; // увеличивает x на единицу y ; // уменьшает y на единицу Примеры постфиксных и префиксных операций: a=2; a=2; x=18 2*a++; x=18 2*(++a); Получим : a=3 a=3 x= 14 x=12
Комбинированные операции Ниже приводятся некоторые примеры выражений и способы их сокращения: a = a + b; сокращается до a += b; a = a b; сокращается до a = b; a = a * b; сокращается до a *= b; a = a / b; сокращается до a /= b; a = a % b; сокращается до a %= b;
Решение задач Задача 1. Дан угол в радианах. Вычислить синус и косинус угла. #include <stdio. h> #include <math. h> float Angle, Result 1, Result 2; main() { printf("n Программа вычисления sin и сos углаn"); puts("Задайте значение угла в радианах"); scanf("%f", &Angle); Result 1=sin(Angle); Result 2=cos(Angle); printf("Синус угла равен %f n", Result 1); printf("Косинус угла равен %f", Result 2); }
Решение задач Задача 2. Вычислите X 3 и X 10 , используя четыре операции умножения для заданного целого значения X. #include <stdio. h> int x, x 2, x 3, x 5, x 10; main() { printf("n Программа расчета X^3 и X^10n"); puts("Введите значение X"); scanf("%i", &x); x 2=x*x; x 3=x*x 2; x 5=x 2*x 3; x 10=x 5*x 5; printf("%i в 3 ей степени = %i n", x, x 3); printf("%i в 10 ой степени = %i", x, x 10); }
Условный оператор. Логический тип данных. Имеется несколько операторов, о которых мы еще не говорили: условные и логические операторы. При этом возникают некоторые непростые моменты в выражениях, которые мы приберегли для обсуждения условных (true или false истина или ложь) операторов. Операции сравнения: > больше >= больше или равно < меньше <= меньше или равно == равно != не равно
Условный оператор. Логический тип данных. #include <stdio. h> main () { float a, b, ratio; printf("Введите два числа: "); scanf("%f %f", &a, &b); ratio= a / b; printf("Отношение = %f n", ratio); }
Условный оператор. Логический тип данных. Условный оператор if ( [логическое выражение] ) { [операторы выполняемые при истинности логического выражения] } else { [операторы выполняемые при значении ложь для логического выражения] }
Условный оператор. Логический тип данных. #include <stdio. h> main () { float a, b, ratio; printf("Введите два числа: "); scanf("%f %f", &a, &b); if (b == 0) printf("Отношение не определеноn"); else { ratio= a / b; printf("Отношение = %f n", ratio); }
Логические операции && логическое «и» || логическое «или» ! логическое «не» exp 1 0 exp 2 0 exp 1 && exp 2 0 exp 1 || exp 2 0 !exp 1 1 0 1 1 1 0 0 1 1 1 1 0
Решение задач Задача 3. Для заданного значения Х вычислить значение функции F(X)=Y, которая определяется следующим образом. #include <stdio. h> main() { float y, x; puts("Введите значение х"); scanf("%f", x); if(x>=0) y=4*x; else y=0; printf("%f", y); }
Выбор. SWITCH, CASE, DEFAULT Оператор switch производит сопоставление значения с множеством констант. Оператор выбора switch имеет следующую форму: switch (проверяемое_выражение) case значение 1: оператор(ы); case значение 2: оператор(ы); . . . case значение. N: оператор(ы); default : оператор(ы); где <значение 1> должно быть уникальным
Выбор. SWITCH, CASE, DEFAULT switch(input_value) { case 1: { puts("Пользователь ввел еденицу"); break; } case 2: { puts("Пользователь ввел двойку"); break; } default: { puts("Пользователь ввел что то ещё"); break; } }
Циклыc параметром (for) c предусловием (while) с постусловием (do. . while)
Циклыс параметром for ([сп. 1]; [сп. 2]; [сп. 3]) S где сп. 1 – список операторов, инициализирующих начальные значения; выполняется 1 раз, до начала выполнения тела цикла; как правило, используется для установки начальных значений параметров цикла; сп. 2 – список операторов и выражений для проверки конца цикла; конец цикла обычно определяется на основе анализа значения параметра цикла; выполняется перед каждым выполнением тела цикла; если значение последнего выражения сп. 2 истинно (!=0), тело цикла выполняется , а если ложно (==0) – завершается; сп. 3 – список операторов и (или) выражений для корректировки параметров цикла; выполняется после каждого выполнения тела цикла; S – простой или составной оператор тела цикла; составной для выполнения более одного оператора тела цикла.
Циклыс параметром Пример : … int x; for (x=1; x<=10; x++) printf (“t %i”, x); …
Решение задач Задача 4. Дано n. Определить и вывести значения x=2 i – степени двойки от i=1 до n (n>1) по 5 значений в строке. #include <stdio. h> // Подключение библиотек #include <math. h> #include <conio. h> main() { int i, n; long int x; clrscr (); // Очистка экрана printf ("Введите число максимальную степень двойки n"); scanf ("%i", &n); // Ввод n
Решение задач for (x=i=1; i<=n ; i++) { x*=2; // Определение х printf ("%10 ld", x); // Вывод х if (fmod(i, 5)==0) printf ("n"); // Переход на новую строку } printf ("n Для завершения программы нажмите любую клавишуn"); getch(); }
Решение задач Задача 5. Вычислите #include <stdio. h> // Подключение библиотек main() { float S=0; int i, j; for (i=1, j=20; i<=10; i++, j =2) S+=i/j; printf (“%f”, S); }
Циклы с предусловием Нет В(x) Условие при котором выполняются итерации цикла Да continue S break Тело цикла Форма записи оператора имеет такой вид : while (B(x)) S; где B(x) – логическое выражение , в том случае, когда это выражение будет иметь значение Ложь, произойдет выход из цикла; S – один оператор, простой или составной; он должен включать операторы тела цикла, в том числе оператор изменения операторов логического выражения B(x)
Циклы с предусловием Тело цикла выполняется только в случае, если выражение B(x) истинно (!=0); если оно ложно (==0), тело цикла не выполняется. Если выражение B(x) ложно до начала первого выполнения тела цикла, то тело цикла не выполниться ни разу.
Решение задач Задача 6. Дано x. Надо делить его пополам до тех пор, пока x будет >0, 1 # include <stdio. h> # include <conio. h> main() { float x; clrscr(); printf (“n Введите вещественное число xn”); scanf (“%f”, &x); while (x>0. 1) { x/=2; printf (“n x=%. 5 f”, x); } printf (“n Для завершения программы нажмите любую клавишу”); getch(); }
Циклы с предусловием Задача 7 Определить значение суммы S=1/x 1+1/x 2+… 1/xn, где n – количество слагаемых. # include <stdio. h> void main() { float x, s=0; int i=0, n; scanf (“%i”, &n); while i<n do { i++; scanf (“%f”, &x); s+=1/x; } printf (“%f”, s) } Как будет работать программа, если пользователь введет x=0?
Циклы с предусловием Программа завершит выполнение с сообщением об ошибке (Деление на 0). # include <stdio. h> void main() { float x, s=0; int i=0, n; scanf (“%i”, &n); while i<n do { i++; scanf (“%f”, &x); if (x==0) break; s+=1/x; } printf (“%f”, s) } # include <stdio. h> void main() { float x, s=0; int i=0, n; scanf (“%i”, &n); while i<n do { i++; scanf (“%f”, &x); if (x==0) continue; s+=1/x; } printf (“%f”, s) }
Циклы с постусловием Начало цикла Тело цикла S Да continue В(x) break Нет Условие завершения цикла do S; while (B(x)); где B(x) – логическое выражение, при истинности которого происходит выполняется следующий шаг цикла; S – один или несколько операторов тела цикла.
Циклы с постусловием Тело цикла выполняется хотя бы 1 раз. После каждого выполнения тела цикла анализируется значение выражения B(x): если оно не равно нулю, т. е. истинно (==1), то выполнение тела цикла повторяется, если ложно (==0) – цикл завершается. По операторам continue и break можно перейти за последний оператор тела цикла, т. е. на анализ условия конца цикла, или на первый оператор после цикла соответственно.
Решение задач Задача 8. Дано x>1. Вычислить и вывести степени x; вычисления производятся до тех пор, пока вычисляемое значение станет >108 # include <stdio. h> #include <math. h> # include <conio. h> main() { float x; long int y=1; int k=0; clrscr(); printf (“n Введите значение для возведения его в степень : n”); scanf (“%f”, &x);
Решение задач do { y*=x; k++; printf (“n %. 0 f в степени %i =%ld”, x, k, y); } while (y<=1 e 8); printf (“n Для завершения программы нажмите любую клавишу”); getch(); }
Вложенные циклы На языке Си такая структура вложенных циклов будет выглядеть следующим образом: for ( i = in ; i < = in ; i+=id ) { …. . }
Лекция 1 - Основы языка Си.pptx