Скачать презентацию Алгоритмические языки и программирование Кейно Павел Петрович Скачать презентацию Алгоритмические языки и программирование Кейно Павел Петрович

prog.pptx

  • Количество слайдов: 110

Алгоритмические языки и программирование Кейно Павел Петрович Алгоритмические языки и программирование Кейно Павел Петрович

Лекция 1 Введение в программирование и язык C Лекция 1 Введение в программирование и язык C

Машинный код • Машинный код или машинный язык — система команд (набор кодов операций) Машинный код • Машинный код или машинный язык — система команд (набор кодов операций) конкретной вычислительной машины, которая интерпретируется непосредственно процессором или микропрограммами этой вычислительной машины. • Компьютерная программа, записанная на машинном языке, состоит из машинных инструкций, каждая из которых представлена в машинном коде в виде двоичного кода отдельной операции из системы команд машины.

Язык низкого уровня • Низкоуровневый язык программирования (язык программирования низкого уровня) — язык программирования, Язык низкого уровня • Низкоуровневый язык программирования (язык программирования низкого уровня) — язык программирования, близкий к программированию в машинных кодах используемого процессора. Для обозначения машинных команд обычно применяется мнемоническое обозначение. Это позволяет запоминать команды не в виде последовательности двоичных нулей и единиц, а в виде осмысленных сокращений слов человеческого языка (обычно английских). • Пример: язык Assembler’а

Трансляция программы • Трансляция программы — преобразование программы, представленной на одном из языков программирования, Трансляция программы • Трансляция программы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке и равносильную первой. • Язык, на котором представлена входная программа, называется исходным языком, а сама программа — исходным кодом. Выходной язык называется целевым языком или объектным кодом.

Компилятор • Компилятор — программа, выполняющая компиляцию. • Компиляция — трансляция программы, составленной на Компилятор • Компилятор — программа, выполняющая компиляцию. • Компиляция — трансляция программы, составленной на исходном языке высокого уровня, в эквивалентную программу на низкоуровневом языке (машинном коде). • Входной информацией для компилятора (исходный код) является описание алгоритма или программа на понятным человеку языке, а на выходе компилятора — эквивалентное описание алгоритма на машинно-ориентированном языке (объектный код).

Языки C и C++ • Язык C — это императивный, типизированный, высокоуровневый, машинно-ориентированный, не Языки C и C++ • Язык C — это императивный, типизированный, высокоуровневый, машинно-ориентированный, не объектноориентированный язык программирования. • Язык C++ является его объектноориентированным расширением.

Высокоуровневый язык C • Команды и типы данных, которые заложены в С изначально, элементарны, Высокоуровневый язык C • Команды и типы данных, которые заложены в С изначально, элементарны, но на основе них можно создавать свои, сколь угодно сложные функции и структуры данных. • Стандартная библиотека C включает в себя много сложных (высокоуровневых) функций. • Он позволяет определять свои типы данных, создавать свои библиотеки. Создано множество инструментов для разработки больших проектов на языке С.

Машинно-ориентированный язык C • Основная информационная единица, с которой работает программист на C — Машинно-ориентированный язык C • Основная информационная единица, с которой работает программист на C — это байт. • Программист на C представляет, как его программа будет расположена в памяти. • Программист на C может перейти на самый низкий уровень программирования — делать в свой программе "ассемблерные вставки" и писать на уровне команд процессора. • Язык C приспособлен для того, чтобы работать напрямую с любыми устройствами компьютера. • На языке C можно писать операционные системы

Императивный язык C • Прилагательное императивный означает, что в языке C логику работы программы Императивный язык C • Прилагательное императивный означает, что в языке C логику работы программы представляют в виде глаголов (действий): «пока выполнено условие. . . делать действия. . . » , «выполнить последовательность действий. . . N раз» , «если выполнено условие. . . перейти к действию. . . » .

Методология повторного использования кода • Важным моментом в культуре программирование является методология reuse (повторное Методология повторного использования кода • Важным моментом в культуре программирование является методология reuse (повторное использование кода) — методология обеспечения модульности, то есть умение использовать разработанные инструменты, программы и библиотеки и умение экспортировать разработанную функциональность в виде удобных, подключаемых к другим проектам, модулей.

Типы ошибок при разработке программ • Синтаксические ошибки (syntax errors) – Забыли ; в Типы ошибок при разработке программ • Синтаксические ошибки (syntax errors) – Забыли ; в конце выражения – Неправильно написали имя оператора • Ошибки выполнения (runtime errors) – Деление на 0 – Нет места при записи данных на диск • Семантические (semantic errors) – Работает, но делает не то, что нужно.

Здравствуй, мир! #include <stdio. h> int main (void) { printf ( Здравствуй, мир! #include int main (void) { printf ("Hello, world!n"); return 0; }

Директивы препроцессора • Директива препроцессора – команда, выполняемая до начала компиляции исходного текста программы. Директивы препроцессора • Директива препроцессора – команда, выполняемая до начала компиляции исходного текста программы. • Директива #include <. . . > вставляет в файл программы содержимое другого файла. • Обычно заголовочные файлы содержат только прототипы функций, то есть просто список функций с указанием аргументов и типа возвращаемого значения.

Типы данных Целые типы Размер в байтах (битах) 1 (8) 2 (16) 2 (16) Типы данных Целые типы Размер в байтах (битах) 1 (8) 2 (16) 2 (16) Интервал изменения от -128 до 127 от 0 до 255 от -128 до 127 от -32768 до 32767 от 0 до 65535 от -32768 до 32767 long int 4 (32) от -2147483648 до 2147483647 unsigned long int 4 (32) от 0 до 4294967295 signed long int 4 (32) от -2147483648 до 2147483647 Размер в байтах (битах) 4 (32) 8 (64) 10 (80) Интервал изменения от 3. 4 Е-38 до 3. 4 Е+38 от 1. 7 Е-308 до 1. 7 Е+308 от 3. 4 Е-4932 до 3. 4 Е+4932 char unsigned char int unsigned int short int unsigned short int Типы с плавающей запятой float double long double

Команда • Команда – это инструкция (приказ) машине выполнить одну элементарную операцию над данными, Команда • Команда – это инструкция (приказ) машине выполнить одну элементарную операцию над данными, например: сложить два числа, прочитать данное с диска. Каждая команда программы занимает ячейку памяти и имеет свой адрес (адрес ячейки). Для всякого процессора команда имеет строго фиксированную длину и стандартный формат.

Операторы • Знак операции – это символ или группа символов, которые сообщают компилятору о Операторы • Знак операции – это символ или группа символов, которые сообщают компилятору о необходимости выполнения определенных арифметических, логических или других действий.

Операторы Математические операторы: Знак операции * / % + ++ -Операторы присваивания: Знак операции Операторы Математические операторы: Знак операции * / % + ++ -Операторы присваивания: Знак операции = +=, - =, *=, /=, %= Назначение Умножение Деление Определение остатка от деления Сложение Вычитание Увеличение на единицу Уменьшение на единицу Назначение Присваивание Составные операции присваивания (например, а *= b (т. е. a = a * b) и т. д. )

Логические операторы Знак операции x>y x>=y x<=y x==y x!=y x&&y x||y !x Назначение x Логические операторы Знак операции x>y x>=y x<=y x==y x!=y x&&y x||y !x Назначение x больше y x больше или равен y x меньше или равен y x не равен y x ИЛИ y НЕ x

Приоритет операций Операторы Выполняются () [] ->. слева направо ! ~ ++ -- + Приоритет операций Операторы Выполняются () [] ->. слева направо ! ~ ++ -- + - * & (тип) sizeof справа налево * / % слева направо + - слева направо << >> слева направо < <= > >= слева направо == != слева направо & слева направо ^ слева направо | слева направо && слева направо || слева направо ? : справа налево = += -= *= /= %= &= ^= |= <<= >>= справа налево , слева направо

Программа вывода температур #include <stdio. h> /* печать таблицы температур по Фаренгейту и Цельсию Программа вывода температур #include /* печать таблицы температур по Фаренгейту и Цельсию для fahr = 0, 20, . . . , 300 */ main() { int fahr, celsius; int lower, upper, step; lower = 0; /* нижняя граница таблицы температур */ upper = 300; /* верхняя граница */ step = 20; /* шаг */ fahr = lower; while (fahr <= upper) { celsius = 5 * (fahr-32) / 9; printf ("%dt%dn", fahr, celsius); fahr = fahr + step; } }

Программа вывода температур с числами с плавающей запятой #include <stdio. h> /* печать таблицы Программа вывода температур с числами с плавающей запятой #include /* печать таблицы температур по Фаренгейту и Цельсию для fahr = 0, 20. . . 300; вариант с плавающей точкой */ main() { float fahr, celsius; int lower, upper; step; lower = 0; /* нижняя граница таблицы температур */ upper = 300; /* верхняя граница */ step = 20; /* шаг */ fahr = lower; while (fahr <= upper) { celsius = (5. 0/9. 0) * (fahr-32. 0); printf ("%3. 0 f %6. 1 fn", fahr, celsius); fahr = fahr + step; } }

Цикл for #include <stdio. h> /* печать таблицы температур по Фаренгейту и Цельсию */ Цикл for #include /* печать таблицы температур по Фаренгейту и Цельсию */ main() { int fahr; for (fahr = 0; fahr <= 300; fahr = fahr + 20) printf ("%3 d %6. 1 fn", fahr, (5. 0/9. 0)*(fahr-32)); } Цикл for состоит из трёх выражений: инициализация, проверка условия продолжения цикла, приращение цикла.

Именованные константы • Строка #define определяет символьное имя, или именованную константу, для заданной строки Именованные константы • Строка #define определяет символьное имя, или именованную константу, для заданной строки символов: • #define имя подставляемый-текст #include #define LOWER 0 /* нижняя граница таблицы */ #define UPPER 300 /* верхняя граница */ #define STEP 20 /* размер шага */ /* печать таблицы температур по Фаренгейту и Цельсию */ main () { int fahr; for (fahr = LOWER; fahr <= UPPER; fahr = fahr + STEP) printf ("%3 d %6. 1 fn", fahr, (5. 0/9. 0)*(fahr-32)); }

Упражнения • Усовершенствуйте программу преобразования температур таким образом, чтобы над таблицей она печатала заголовок. Упражнения • Усовершенствуйте программу преобразования температур таким образом, чтобы над таблицей она печатала заголовок. • Напишите программу, которая будет печатать таблицу соответствия температур по Цельсию температурам по Фаренгейту. • Измените программу преобразования температур так, чтобы она печатала таблицу в обратном порядке, т. е. от 300 до 0.

Конструкция if-else if (выражение) инструкция 1 else инструкция 2 Конструкция if-else if (выражение) инструкция 1 else инструкция 2

Конструкция if-else if (а > b) z = a; else z = b; // Конструкция if-else if (а > b) z = a; else z = b; // Переменной z присваивается большее значение из a или b. // Тернарная форма записи: z = (a > b) ? а : b;

Вложенный if-else if (n > 0) { if (a > b) z = а; Вложенный if-else if (n > 0) { if (a > b) z = а; } else z = b;

Конструкция else-if if (выражение) инструкция else инструкция Конструкция else-if if (выражение) инструкция else инструкция

Цикл while (с предусловием) // Инструкция for (выр1; выр2; выр3) инструкция // эквивалентна конструкции Цикл while (с предусловием) // Инструкция for (выр1; выр2; выр3) инструкция // эквивалентна конструкции выр1; while (выр2) { инструкция выр3; }

Цикл do-while (с постусловием) do инструкция while (выражение); Цикл do-while (с постусловием) do инструкция while (выражение);

Сложение двух чисел #include <stdio. h> int main () { int a, b; printf Сложение двух чисел #include int main () { int a, b; printf ("Введите два числа: "); scanf ("%d%d", &a, &b); printf ("%dn", a + b); return 0; }

Escape-последовательности Экранирующие последовательности • n – new line • r – возврат каретки • Escape-последовательности Экранирующие последовательности • n – new line • r – возврат каретки • t – табуляция • b – backspace • " и ' – кавычки • \ – символ • a – alarm (звуковой сигнал)

Форматы printf и scanf %d – десятичный вывод (int) %ld – десятичный длинный вывод Форматы printf и scanf %d – десятичный вывод (int) %ld – десятичный длинный вывод (long int) %u – десятичный (unsigned int) %o – восьмеричный (octet) %h – шестнадцатеричный (hex) %f или %g – дробный %6 d – печатать в 6 позиций %. 2 f – печатать 2 знака после запятой %6. 2 f – печатать 2 знака после запятой в поле на 6 позиций • %s – строка char[]. • • •

Математические функции • В <math. h> описано множество математических функций. Входные и выходные данные Математические функции • В описано множество математических функций. Входные и выходные данные типа double. sin(х) cos(x) atan 2(y, х) ехр(х) log(x) log 10(x) pow(x, y) sqrt(х) синус х, х в радианах. косинус х, х в радианах. арктангенс y/х, y и х в радианах. экспоненциальная функция еx. натуральный (по основанию е) логарифм х (х>0). обычный (по основанию 10) логарифм х (х > 0). степень xy. корень квадратный х (х > 0). fabs(x) абсолютное значение x.

Ввод символов через getchar() • Стандартная библиотека включает несколько функций для чтения и записи Ввод символов через getchar() • Стандартная библиотека включает несколько функций для чтения и записи одного символа. Простейшие из них — getchar и putchar. За одно обращение к getchar считывается следующий символ ввода из текстового потока, и этот символ выдается в качестве результата. Так, после выполнения с = getchar() переменная c содержит очередной символ ввода.

Вывод символов через putchar() • Обращение к putchar приводит к печати одного символа. Так, Вывод символов через putchar() • Обращение к putchar приводит к печати одного символа. Так, putchar(c) напечатает содержимое целой переменной c в виде символа (обычно на экране). Вызовы putchar и printf могут произвольным образом перемежаться. Вывод будет формироваться в том же порядке, что и обращения к этим функциям.

Константа EOF • EOF является индикатором операционной системы, означающим, что данные в источнике закончились. Константа EOF • EOF является индикатором операционной системы, означающим, что данные в источнике закончились. Источниками данных обычно являются файлы и потоки. • EOF (аббревиатура от end of file — конец файла) — целая константа, определенная в . Какое значение имеет эта константа — неважно, лишь бы оно отличалось от любого из возможных значений типа char. • Для указания терминалу в UNIX и LINUX «EOF» следует воспользоваться комбинацией клавиш Ctrl+D. В Windows — Ctrl+Z.

Копирование ввода на вывод 1 #include <stdio. h> main() { int с; с = Копирование ввода на вывод 1 #include main() { int с; с = getchar(); while (с != EOF) { putchar (c); с = getchar(); } }

Копирование ввода на вывод 2 #include <stdio. h> main() { int с; while ((с Копирование ввода на вывод 2 #include main() { int с; while ((с = getchar()) != EOF) putchar (c); }

Подсчёт символов 1 #include <stdio. h> main() { long nc; nc = 0; while Подсчёт символов 1 #include main() { long nc; nc = 0; while (getchar() != EOF) ++nc; printf ("%ldn", nc); }

Подсчёт символов 2 #include <stdio. h> main() { double nc; for (nc = 0; Подсчёт символов 2 #include main() { double nc; for (nc = 0; getchar() != EOF; ++nc) ; printf ("%. 0 fn", nc); }

Подсчет строк входного потока #include <stdio. h> main() { int с, nl; nl = Подсчет строк входного потока #include main() { int с, nl; nl = 0; while ((с = getchar()) != EOF) if (c == 'n') ++nl; printf ("%dn", nl); }

Подсчёт строк, слов и символов #include <stdio. h> #define IN 1 /* внутри слова Подсчёт строк, слов и символов #include #define IN 1 /* внутри слова */ #define OUT 0 /* вне слова */ main () { int с, nl, nw, nc, state; state = OUT; nl = nw = nc = 0; while ((c = getchar()) != EOF) { ++nc; if (c == 'n' ) ++nl; if (c == " " || c == 'n' || с == 't') state = OUT; else if (state == OUT) { state = IN; ++nw; } printf ("%d %d %dn", nl, nw, nc); }

Таблица ASCII Таблица ASCII

Массивы #include <stdio. h> /* подсчет цифр, символов-разделителей и прочих символов */ main() { Массивы #include /* подсчет цифр, символов-разделителей и прочих символов */ main() { int с, i, nwhite, nother; int ndigit[10]; nwhite = nother = 0; for (i = 0; i < 10; ++i) ndigit[i]= 0; while ((c = getchar()) != EOF) if (c >= '0' && с <= '9' ) ++ndigit[c - '0' ]; else if (c == ' ' || с == 'n' || с == 't') ++nwhite; else ++nother; printf ("цифры ="); for (i=0; i < 10; ++i) printf(" %d", ndigit[i]); printf (", символы-разделители = %d, прочие = %dn", nwhite, nother); }

Сортировка методом пузырька #include <stdio. h> #define N 1000 int main() { int n, Сортировка методом пузырька #include #define N 1000 int main() { int n, i, j; int a[N]; // считываем количество чисел n scanf("%d", &n); // считываем n чисел for(i = 0 ; i < n; i++) { scanf("%d", &a[i]); } for(i = 0 ; i < n ; i++) { // сравниваем два соседних элемента. for(j = 0 ; j < n - i - 1 ; j++) { if(a[j] > a[j+1]) { // если они идут в неправильном порядке, то // меняем их местами. int tmp = a[j]; a[j] = a[j+1] ; a[j+1] = tmp; } }

Функции #include <stdio. h> int power(int m, int n); /* тест функции power */ Функции #include int power(int m, int n); /* тест функции power */ main() { int i; for (i = 0; i < 10; ++i) printf("%d %d %dn", i, power(2, i), power(-3, i)); return 0; }

Функции /* возводит base в n-ю степень; n >= 0 */ int power(int base, Функции /* возводит base в n-ю степень; n >= 0 */ int power(int base, int n) { int i, p; p = 1; for (i = 1; i <= n; ++i) p = p * base; return p; }

Символьные массивы #include <stdio. h> #define MAXLINE 1000 /* максимальный размер вводимой строки */ Символьные массивы #include #define MAXLINE 1000 /* максимальный размер вводимой строки */ int getline(char line[], int maxline); void copy(char to[], char from[]); /* печать самой длинной строки */ main() { int len; /* длина текущей строки */ int max; /* длина максимальной из просмотренных строк */ char line[MAXLINE]; /* текущая строка */ char longest[MAXLINE]; /* самая длинная строка */ max = 0; while ((len = getline(line, MAXLINE)) > 0) if (len > max) { max = len; copy(longest, line); } if (max > 0) /* была ли хоть одна строка? */ printf("%s", longest); return 0; }

Символьные массивы /* getline: читает строку в s, возвращает длину */ int getline(char s[], Символьные массивы /* getline: читает строку в s, возвращает длину */ int getline(char s[], int lim) { int c, i; for (i = 0; i < lim-1 && (c = getchar()) != EOF && с != 'n'; ++i) s[i] = c; if (c == ‘n') { s[i] = c; ++i; } s[i] = ''; return i; }

Символьные массивы /* copy: копирует строку 'from' в 'to'; длина to считается достаточной */ Символьные массивы /* copy: копирует строку 'from' в 'to'; длина to считается достаточной */ void copy (char to[], char from[]) { int i ; i = 0; while ((to[i] = from[i]) != '') ++i; }

Символьные массивы • Функция getline в конец создаваемого ею массива помещает символ '�' (null-символ, Символьные массивы • Функция getline в конец создаваемого ею массива помещает символ '' (null-символ, кодируемый нулевым байтом), чтобы пометить конец строки символов. То же соглашение относительно окончания нулем соблюдается и в случае строковой константы вроде "hellon". • В данном случае для него формируется массив из символов этой строки с '' в конце. • h e l l o n

Преобразование в целое /* atoi: преобразование s в целое */ int atoi(char s[]) { Преобразование в целое /* atoi: преобразование s в целое */ int atoi(char s[]) { int i, n; n = 0; for (i = 0; s[i] >= '0' && s[i] <= '9'; ++i) n = 10 * n + (s[i] - '0'); return n; }

Преобразование в строку /* lower: преобразование с в строчную; только для ASCII */ int Преобразование в строку /* lower: преобразование с в строчную; только для ASCII */ int lower(int с) { if (с >= 'А' && с <= 'Z' ) return с + 'а' - 'А'; else return с; }

Проверка на число Проверку с >= '0' && с <= '9' можно заменить на Проверка на число Проверку с >= '0' && с <= '9' можно заменить на isdigit(c)

Удаление символов из строки /* squeeze: удаляет все с из s */ void squeeze(char Удаление символов из строки /* squeeze: удаляет все с из s */ void squeeze(char s[], int с) { int i, j; for (i = j = 0; s[i] != ''; i++) if (s[i] != c) s[j++] = s[i]; s[i] = ''; }

strcat() /* strcat: помещает t в конец s; s достаточно велика */ void strcat strcat() /* strcat: помещает t в конец s; s достаточно велика */ void strcat (char s[], char t[]) { int i, j; i = j = 0; while (s[i] != '') /* находим конец s */ i++; while ((s[i++] = t[j++]) != '') /* копируем t */ ; }

Внешние переменные и область видимости #include <stdio. h> #define MAXLINE 1000 /* максимальный размер Внешние переменные и область видимости #include #define MAXLINE 1000 /* максимальный размер вводимой строки */ int max; /* длина максимальной из просмотренных строк */ char line[MAXLINE]; /* текущая строка */ char longest[MAXLINE]; /* самая длинная строка */ int getline(void); void copy(void); /* печать самой длинной строки; специализированная версия */ main () { int len; extern int max; extern char longest[]; max = 0; while ((len = getline()) > 0) if (len > max) { max = len; copy(); } if (max > 0) /* была хотя бы одна строка */ printf("%s", longest); return 0; }

Внешние переменные и область видимости /* getline: специализированная версия */ int getline(void) { int Внешние переменные и область видимости /* getline: специализированная версия */ int getline(void) { int c, i; extern char line[]; for (i=0; i < MAXLINE-1 && (c=getchar()) != EOF && с != 'n'; ++i) line[i] = c; if(c == 'n') { line[i]= c; ++i; } line[i] = ''; return i; }

Символьные массивы /* copy: специализированная версия */ void copy(void) { int i; extern char Символьные массивы /* copy: специализированная версия */ void copy(void) { int i; extern char line[], longest[]; i = 0; while ((longest[i] = line[i]) != '') ++i; }

Преобразование типов • Если в выражении появляются операнды различных типов, то они преобразуются к Преобразование типов • Если в выражении появляются операнды различных типов, то они преобразуются к некоторому общему типу. int a = 30000; float b; . . . . b = (float) a * 12; • (переменная a целого типа явно преобразована к типу float; если этого не сделать, то результат будет потерян, т. к. a * 12 > 32767).

Оператор switch (выражение) { case констант-выраж: операторы default: операторы } Оператор switch (выражение) { case констант-выраж: операторы default: операторы }

Подсчёт цифр, пробелов, других символов #include <stdio. h> main() /* подсчет цифр, пробелов, других Подсчёт цифр, пробелов, других символов #include main() /* подсчет цифр, пробелов, других символов */ { int с, i, nwhite, nother, ndigit[10]; nwhite = nother = 0; for (i = 0; i < 10; i++) ndigit[i] = 0; while ((с = getchar()) != EOF) { switch (c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': ndigit[c-'0']++; break;

Подсчёт цифр, пробелов, других символов case ' ': case 'n': case 't': nwhite++; break; Подсчёт цифр, пробелов, других символов case ' ': case 'n': case 't': nwhite++; break; default: nother++; break; } } printf("digits = ") ; for (i = 0; i < 10; i++) printf(" %d", ndigit[i]); printf(", white space = %d, other = %dn", nwhite, nother); return 0; }

Цикл do…while /* itoa: преобразует число n в строку символов s */ void itoa(int Цикл do…while /* itoa: преобразует число n в строку символов s */ void itoa(int n, char s[]) { int i, sign; if ((sign = n) < 0) /* записываем знак */ n = -n; /* делаем число положительным */ i = 0; do { /* генерируем цифры в обратном порядке */ s[i++] = n % 10 + '0'; /* извлекаем цифру */ } while ((n /= 10) > 0); /* удаляем ее */ if (sign < 0) s[i++] = '-'; s[i] = ''; reverse(s); }

Оператор break /* trim: удаляет символы пустого пространства из конца строки */ int trim Оператор break /* trim: удаляет символы пустого пространства из конца строки */ int trim (char s [] ) { int n; for (n = strlen(s)-1; n >= 0; n--) if (s[n] != ' ' && s[n] != 't' && s[n] != 'n') break; s[n+1] = ''; return n; }

Функции, возвращающие нецелые значения #include <ctype. h> /* atof: преобразование строки s в число Функции, возвращающие нецелые значения #include /* atof: преобразование строки s в число типа double */ double atof(char s[]) { double val, power; int i, sign; for(i = 0; isspace(s[i]); i++) /* пропуск пробелов */ sign = (s[i] =='-') ? -1 : 1; if (s[i] == '+' || s[i] == '-') i++; for(val = 0. 0; isdigit(s[i]); i++) val = 10. 0 * val + (s[i] - '0'); if (s[i] == '. ') i++; for (power = 1. 0; isdigit(s[i]); i++) { val = 10. 0 * val + (s[i] - '0'); power *= 10; } return sign * val / power; }

Поиск подстроки #include <stdio. h> /* максимальный размер вводимой строки */ #define MAXLINE 1000 Поиск подстроки #include /* максимальный размер вводимой строки */ #define MAXLINE 1000 int getline(char line[], int max); int strindex(char source[], char searchfor[]); char pattern[] = "ould"; /* образец для поиска */ /* найти все строки, содержащие образец */ main() { char line[MAXLINE]; int found = 0; while (getline(line, MAXLINE) > 0) if (strindex(line, pattern) >= 0) { printf ("%s", line); found++; } return found; }

Поиск подстроки /* getline: читает строку в s, возвращает длину */ int getline(char s[], Поиск подстроки /* getline: читает строку в s, возвращает длину */ int getline(char s[], int lim) { int c, i; i = 0; while (--lim > 0 && (c = getchar()) != EOF && с != 'n' ) s[i++] = с; if (с == 'n') s[i++] = c; s[i] = ''; return i; }

Поиск подстроки /* strindex: вычисляет место t в s или выдает -1, если t Поиск подстроки /* strindex: вычисляет место t в s или выдает -1, если t нет в s */ int strindex (char s[], char t[]) { int i, j, k; for (i = 0; s[i] != ''; i++) { for (j = i, k = 0; t[k] != '' && s[j] == t[k]; j++, k++) ; if (k > 0 && t[k] == '') return i; } return -1; }

Польская форма записи В обратной польской записи каждый оператор следует за своими операндами. Выражение Польская форма записи В обратной польской записи каждый оператор следует за своими операндами. Выражение в инфиксной записи, скажем (1 - 2) * (4 + 5) в польской записи представляется как 1 2 - 4 5 + *

Рекурсивный вызов #include <stdio. h> /* printd: печатает n как целое десятичное число */ Рекурсивный вызов #include /* printd: печатает n как целое десятичное число */ void printd(int n) { if (n < 0) { putchar('-'); n = -n; } if (n / 10) printd(n / 10); putchar(n % 10 + '0'); }

Структуры struct point { int x; int у; }; Структуры struct point { int x; int у; };

Структуры struct {…} х, у, z; По синтаксису аналогично: int x, у, z; // Структуры struct {…} х, у, z; По синтаксису аналогично: int x, у, z; // если структура была задана ранее struct point pt; // присваивание в структуре struct point maxpt = { 320, 200 }; // обращение к структуре printf("%d, %d", pt. x, pt. y);

Вычисление расстояния от начала координат double dist, sqrt(double); dist = sqrt((double)pt. x * pt. Вычисление расстояния от начала координат double dist, sqrt(double); dist = sqrt((double)pt. x * pt. x + (double)pt. y * pt. y);

Вложенные структуры struct rect { struct point pt 1; struct point pt 2; }; Вложенные структуры struct rect { struct point pt 1; struct point pt 2; };

Вложенные структуры Структура rect содержит две структуры point. Если мы объявим screen как struct Вложенные структуры Структура rect содержит две структуры point. Если мы объявим screen как struct rect screen; то screen. pt 1. x обращается к координате х точки pt 1 из screen.

Структуры в функциях /* makepoint: формирует точку по компонентам х и y */ struct Структуры в функциях /* makepoint: формирует точку по компонентам х и y */ struct point makepoint(int x, int y) { struct point temp; temp. x = x; temp. у = у; return temp; }

Структуры в функциях struct rect screen; struct point middle; struct point makepoint(int, int); screen. Структуры в функциях struct rect screen; struct point middle; struct point makepoint(int, int); screen. pt 1 = makepoint(0, 0); screen. pt 2 = makepoint(XMAX, YMAX); middle = makepoint((screen. pt 1. x + screen. pt 2. x)/2, (screen. pt 1. y + screen. pt 2. y)/2);

Структуры в функциях /* addpoint: сложение двух точек */ struct point addpoint(struct point p Структуры в функциях /* addpoint: сложение двух точек */ struct point addpoint(struct point p 1, struct point p 2) { p 1. x += p 2. x; p 1. y += p 2. y; return p 1; }

Структуры /* ptinrect: возвращает 1, если р в r, и 0 в противном случае Структуры /* ptinrect: возвращает 1, если р в r, и 0 в противном случае */ int ptinrect(struct point p, struct rect r) { return p. x >= r. ptl. x && p. x < r. pt 2. x && p. y >= r. ptl. y && p. y < r. pt 2. y; }

Практические задачи Практические задачи

Деление числа на разряды • Составить программу, которая будет считывать введённое пятизначное число. После Деление числа на разряды • Составить программу, которая будет считывать введённое пятизначное число. После чего, каждую цифру этого числа необходимо вывести в новой строке. • Если число не пятизначное, вывести ошибку и приглашение повторить ввод. • Результат: Деление Введите 1 цифра 2 цифра 3 цифра 4 цифра 5 цифра числа на разряды пятизначное число: 10819 равна 1 равна 0 равна 8 равна 1 равна 9

Математическое выражение • Запрограммировать следующее выражение: (а + b — f / а) + Математическое выражение • Запрограммировать следующее выражение: (а + b — f / а) + f * a - (a + b) • Числа а, b, f вводятся с клавиатуры. Организовать пользовательский интерфейс, таким образом, чтобы было понятно, в каком порядке должны вводиться числа. • Результат: Введите цифры a, b и f: a=15 b=10 f=3 Вычисляем по формуле: x=(a + b - f / a) + f * a - (a + b) x=675

Перевод числа из метров в километры • Программа должна переводить число, введенное с клавиатуры Перевод числа из метров в километры • Программа должна переводить число, введенное с клавиатуры в метрах, в километры. • Результат: Перевод числа из метров в километры Введите количество метров: 15 15 метров будет 0. 015 километра

Сравнение чисел с использованием оператора ветвления • Составить программу, которая требует ввести два числа. Сравнение чисел с использованием оператора ветвления • Составить программу, которая требует ввести два числа. Если первое число больше второго, то программа печатает слово больше. Если первое число меньше второго, то программа печатает слово меньше. А если числа равны, программа напечатает сообщение Эти числа равны. • Результат: Сравнение чисел используя оператор ветвления Введите 1 число: 22 Введите 2 число: 314 МЕНЬШЕ

Увеличение переменных с оператором if • Составить алгоритм увеличения всех трех, введённых с клавиатуры, Увеличение переменных с оператором if • Составить алгоритм увеличения всех трех, введённых с клавиатуры, переменных на 5, если среди них есть хотя бы две равные. В противном случае выдать ответ «равных нет» . • Результат: Увеличение переменных с оператором if Введите 1 число: Введите 2 число: Введите 3 число: 1 число = 15 2 число = 14 3 число = 14 10 9 9

Квадратное уравнение • Написать программу, вычисляющую корни квадратного уравнения. • В случае неверного ввода, Квадратное уравнение • Написать программу, вычисляющую корни квадратного уравнения. • В случае неверного ввода, выдать ошибку и приглашение повторить ввод.

Алгебраическая сумма • Найти Y, если Y = X 1 + X 2 + Алгебраическая сумма • Найти Y, если Y = X 1 + X 2 + … + Xn, X = Z^3 - B + A^2 / tg^2 b. Количество X вводятся пользователем программы. Для каждого X значения Z, B, А, b разные (вводятся пользователем программы). Введите количество иксов: 3 Введите значения Z, B, A, Betta для X 1: Z = 2. 3 B = 45. 1 A = 12. 9 Betta = 3. 67 Введите значения Z, B, A, Betta для X 2: Z = 3. 3 B = 12. 12 A = 7 Betta = 8 Введите значения Z, B, A, Betta для X 3: Z = 4 B = 3 A = 1. 14 Betta = 2 y = 541. 51

Вывод строки в обратном порядке • Напишите программу, которая переворачивает все слова в строке. Вывод строки в обратном порядке • Напишите программу, которая переворачивает все слова в строке. • Строка вводится пользователем. На экран выводится результат.

Верхний регистр • Написать программу, переводящую все символы входной строки в верхний регистр. • Верхний регистр • Написать программу, переводящую все символы входной строки в верхний регистр. • Алгоритм перевода в верхний регистр оформить в виде функции: void upcase(char *string).

Поиск максимального делителя • Напишите программу, которая для введённого натурального числа N находит максимальный Поиск максимального делителя • Напишите программу, которая для введённого натурального числа N находит максимальный делитель отличный от N. • Алгоритм поиска оформить в виде функции divider(int N).

Поиск наибольшего общего делителя • Напишите программу, которая находит наибольший общий делитель трёх введённых Поиск наибольшего общего делителя • Напишите программу, которая находит наибольший общий делитель трёх введённых чисел a, b и c. • Алгоритм поиска НОДа оформить в виде функции: int gcd(int a, int b, int c).

Максимальное значение массива • Создать компьютерную программу, выводящую на экран минимальное и максимальное значения Максимальное значение массива • Создать компьютерную программу, выводящую на экран минимальное и максимальное значения массива, состоящего из нескольких целых знаковых чисел. • Количество элементов массива задаётся пользователем. • Значения массива вводятся с клавиатуры. • После ввода введенные значения из массива распечатываются на экране в одну строку.

Сортировка методом пузырька • Создать компьютерную программу, сортирующую массив из вещественных чисел по возрастанию, Сортировка методом пузырька • Создать компьютерную программу, сортирующую массив из вещественных чисел по возрастанию, используя “пузырьковую” сортировку. • Число элементов массива вводится пользователем перед вводом значений из массива. • Исходный и отсортированный массивы выводятся на экран в 2 строках: один под другим. • Под каждое выводимое значение отводится 10 знакомест, значения выравниваются по левому краю, знак числа (и “+” и “-”) выводится всегда, вещественные значения округляются при выводе на экран до 1 знака после десятичного разделителя.

Преобразование шестнадцатиричных чисел • Напишите функцию htoi(s), которая преобразует строку шестнадцатеричных цифр (учитывая необязательные Преобразование шестнадцатиричных чисел • Напишите функцию htoi(s), которая преобразует строку шестнадцатеричных цифр (учитывая необязательные элементы 0 х или 0 Х) в ее целочисленный эквивалент. • В число допустимых цифр входят десятичные цифры от 0 до 9, а также буквы a-f и A-F. • За основу взять функции atoi();

Удаление символов • Напишите альтернативную версию функции squeeze (si, s 2), которая бы удаляла Удаление символов • Напишите альтернативную версию функции squeeze (si, s 2), которая бы удаляла из строки si все символы, встречающиеся в строке s 2.

Поиск любых символов • Напишите функцию any (si, s 2), возвращающую номер первой позиции Поиск любых символов • Напишите функцию any (si, s 2), возвращающую номер первой позиции в строке si, в которой находится какой-либо из символов строки s 2, либо -1, если строка si не содержит ни одного символа из s 2. (Стандартная библиотечная функция strpbrk делает то же самое, но возвращает указатель на найденную позицию. )

Условные выражения • Перепишите функцию lower, которая преобразует буквы в верхнем регистре к нижнему, Условные выражения • Перепишите функцию lower, которая преобразует буквы в верхнем регистре к нижнему, с использованием условного выражения вместо конструкции if-else. • Напишите функцию upper, выполняющую обратное преобразование. • Добавьте возможность преобразования символов кириллицы (кодировка DOS 866). • Написать функции, которые аналогично работают со строками: str. To. Lower и str. To. Upper.

escape-последовательности • Напишите функцию под именем escape (s, t), которая бы преобразовывала символы наподобие escape-последовательности • Напишите функцию под именем escape (s, t), которая бы преобразовывала символы наподобие конца строки и табуляции в управляющие последовательности языка С, такие как n и t, в процессе копирования строки t в строку s. • Воспользуйтесь оператором switch. • Напишите функцию также и для противоположной операции—преобразования символических управляющих последовательностей в фактические управляющие символы.

Совпавшие символы • Напишите функцию any(s 1, s 2), которая возвращает либо ту позицию Совпавшие символы • Напишите функцию any(s 1, s 2), которая возвращает либо ту позицию в s 1, где стоит первый символ, совпавший с любым из символов в s 2, либо -1 (если ни один символ из s 1 не совпадает с символами из s 2).

Гистограммы слов • Напишите программу, печатающую гистограммы длин вводимых слов. Гистограмму легко рисовать горизонтальными Гистограммы слов • Напишите программу, печатающую гистограммы длин вводимых слов. Гистограмму легко рисовать горизонтальными полосами. Рисование вертикальными полосами — более трудная задача. • Напишите программу, печатающую гистограммы частот встречаемости вводимых символов.

Развёртывание последовательностей • Напишите функцию expand(s 1, s 2), заменяющую сокращенную запись наподобие a-z Развёртывание последовательностей • Напишите функцию expand(s 1, s 2), заменяющую сокращенную запись наподобие a-z в строке s 1 эквивалентной полной записью abc. . . xyz в s 2. В s 1 допускаются буквы (прописные и строчные) и цифры. • Следует уметь справляться с такими случаями, как a-b-c, a-z 0 -9 и -а-b. Считайте знак - в начале или в конце s 1 обычным символом минус.

atof() с экспоненциальной записью • Дополните функцию atof таким образом, чтобы она справлялась с atof() с экспоненциальной записью • Дополните функцию atof таким образом, чтобы она справлялась с числами вида 123. 456 e-6

Рекурсивный itoa • Примените идеи, которые мы использовали в рrintd, длянаписания рекурсивной версии функции Рекурсивный itoa • Примените идеи, которые мы использовали в рrintd, длянаписания рекурсивной версии функции itoa; иначе говоря, преобразуйте целое число в строку цифр с помощью рекурсивной программы.

Рекурсивная reverse • Напишите рекурсивную версию функции reverse(s), переставляющую элементы строки в ту же Рекурсивная reverse • Напишите рекурсивную версию функции reverse(s), переставляющую элементы строки в ту же строку в обратном порядке.

Площади прямоугольников Дана структура, описывающая прямоугольник со сторонами, параллельными осям координат. Реализуйте функцию max, Площади прямоугольников Дана структура, описывающая прямоугольник со сторонами, параллельными осям координат. Реализуйте функцию max, возвращающую больший по площади прямоугольник. Если два прямоугольника имеют равные площади, возвратите любой из них. struct Rect max(struct Rect pa, struct Rect pb); Структура уже определена в программе: struct Rect { int x; // верхняя левая точка, х-координата int y; // верхняя левая точка, y-координата int width; // ширина int height; // высота };

Литература • Керниган, Ритчи «Язык программирования С» • Дейтл Х. , Дейтл П. «Как Литература • Керниган, Ритчи «Язык программирования С» • Дейтл Х. , Дейтл П. «Как программировать на С» • Андрей Богатырев «Хрестоматия по программированию на Си в Unix» • Керниган, Пайк «Практика программирования» • http: //dfe. petrsu. ru/koi/posob/c/c. htm - введение в язык C. • http: //acm. mipt. ru/twiki/bin/view/Cintro/ • http: //mati. su/prog/DOSBox_install. exe