SlideShare a Scribd company logo
1 of 21
Download to read offline
ОСНОВЫ ПРОГРАММНОГО
  КОНСТРУИРОВАНИЯ
                  Лекция № 2
             26 февраля 2013 г.
ИНЬ И ЯН
     ПРОГРАММИРОВАНИЯ



• Алгоритмы.

• Структуры   данных.

• Алгоритмы    + Структуры данных = Программы.
ДАННЫЕ (ИНФОРМАЦИЯ)

• Данные   для человека:    • Изображения   (видео).

 • Числа
       (целые,              • Звук.
  вещественные,
  комплексные)…             • «Записи».

 • Наборы чисел (ряды,     • Компьютерможет:
  векторы, матрицы).        00011100111010101

 • Текст   (символы).
МАШИННОЕ
 ПРЕДСТАВЛЕНИЕ ДАННЫХ
• Целыечисла – двоичная   • Набор    чисел, символов –
 система счисления.        массив.

• Вещественные числа –    • Картинка– массив
 представление с           пикселов с цветом (RGB).
 плавающей точкой.
                          • Звук– набор отсчетов
• Символы – числа          (квантованная амплитуда).
 (кодировка).
АЛГОРИТМ

• Решает   определенную задачу.

• Конечная   упорядоченная последовательность действий.

• Обычно имеет входные параметры и выходные
 результаты.

• Пример: алгоритм   Евклида поиска НОД двух чисел:

 • НОД(a, b)   = НОД(a-b, b) если a > b
ЯЗЫКИ
     ПРОГРАММИРОВАНИЯ
• Структуры   данных:

 • Типы   данных (числа, символы, строки, …).

 • Переменные.

• Алгоритмы:

 • Операции  над данными, в определенной
   последовательности – согласно синтаксису языка.
ПАРАДИГМЫ
     ПРОГРАММИРОВАНИЯ
• Императивная. Программа  – это и есть алгоритм. В
 каждый момент есть глобальное состояние (содержимое
 памяти), явно доступное для изменения. Языки: Pascal, C, …

• Функциональная. Программа      – это функция. Нет явного
 состояния. Языки: LISP, Haskell, Microsoft Excel (!)

• Логическая. Программа    – это набор предикатов и правил
 вывода. Языки: Prolog, SQL.
ИМПЕРАТИВНЫЙ C
int fib(int n) {
    int a = 0, b = 1;
    int i;
    for (i = 1; i < n; i++) {
        int c = a + b;
        a = b;
        b = c;
    }
    return b;
}
ФУНКЦИОНАЛЬНЫЙ
         HASKELL


fib :: Int -> Integer
fib n = fibs (0,1) !! n
        where fibs (a,b) = a : fibs (b,a+b)
ЛОГИЧЕСКИЙ PROLOG

    fib(0, 0, 1):-!.

    fib(N, A, B):-
    N1 = N - 1,
    fib(N1, A1, B1),
    A = B1,
    B = A1 + B1.
ЯЗЫК C

• 1972   г., Деннис Ричи (Bell Labs).

• «Переносимый      ассемблер» для системных целей:

 • Операционные       системы: ядра, системные библиотеки.

 • Компиляторы, виртуальные       машины, …

• Дает   широкие возможности, но требует аккуратности.
ИСТОРИЯ

• 1972   г. – рождение.

• 1978   г. – выход книги, «K&R» C.

   • 1983   г. – отпочковался C++.

• 1989   г. – стандарт ANSI C или C89.

• 1999   г. – стандарт C99 (не совместим с C++!).

• 2011   г. – стандарт C11.
КОМПИЛЯТОРЫ


• GNU     Compiler Collection.

• Microsoft Visual   C++.

• Intel   C++.

• Clang/LLVM.
HELLO_WORLD.C


#include <stdio.h>

int main(void) {
    printf("Hello, world!n");
    return 0;
}
СТРУКТУРА ПРОГРАММЫ

• Программа    состоит из функций, в т. ч. функции main().

• Функции    расположены в файлах *.c. Например:

 • main.c

 • util.c

 • lib.c

 • magic.c
ЭТАП 1. КОМПИЛЯЦИЯ
Исходные файлы (модули)   Объектные файлы

             main.c        main.o


             util.c        util.o


              lib.c         lib.o


            magic.c       magic.o
ОБЪЕКТНЫЙ ФАЙЛ FILE.O

• Машинный код функций,   • hello_world.c:
 объявленных в file.c.
                            • Машинный       код функции
• Памятьпод объявленные      main().
 глобальные переменные.
                            • Ссылка
                                   на внешнюю
• Ссылкина внешние           функцию printf().
 функции.

• Ссылки
       на глобальные
 переменные.
ЭТАП 2. ЛИНКОВКА

main.o


 util.o                  Исполняемый
            Линкер
                            файл
 lib.o


magic.o
           Статические   Динамические
           библиотеки     библиотеки
РАБОТА ЛИНКЕРА
•   Операционная единица: имя. Каждый объектный модуль (в т. ч. библиотечный):

    •   Предоставляет какие-то имена (функции, переменные, …)

    •   Требует какие-то имена.

•   Линкер удовлетворяет зависимости (все начинается с имени main).

•   Ошибки:

    •   Имя требуется одним из модулей, но никаким не предоставляется.

    •   Одно и то же имя предоставляется более, чем одним модулем.
ИСПОЛНЯЕМЫЙ ФАЙЛ

• Содержит  все нужные имена (и ничего лишнего). Все
 ссылки на имена в объектных файлах были разрешены.

• Попостроению зависит от объектных файлов и
 библиотек (те зависят от исходных файлов).

• Длявыполнения не нужно больше ничего (за исключением
 динамических библиотек).
КОНЕЦ ВТОРОЙ ЛЕКЦИИ
     Язык C – это хорошо.

More Related Content

What's hot

Основы программирования на C++
Основы программирования на C++Основы программирования на C++
Основы программирования на C++Olga Maksimenkova
 
библиотеки программирования
библиотеки программированиябиблиотеки программирования
библиотеки программированияmcroitor
 
Functional Programing
Functional ProgramingFunctional Programing
Functional ProgramingMax Arshinov
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.Igor Shkulipa
 
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очередиMikhail Kurnosov
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli typesmcroitor
 
Обработка текста на Haskell - это просто!
Обработка текста на Haskell - это просто!Обработка текста на Haskell - это просто!
Обработка текста на Haskell - это просто!Mike Potanin
 
Абстрактные типы данных, контейнеры и списки
Абстрактные типы данных, контейнеры и спискиАбстрактные типы данных, контейнеры и списки
Абстрактные типы данных, контейнеры и спискиOlga Maksimenkova
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#akrakovetsky
 
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...Ontico
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonYandex
 
лекция №14
лекция №14лекция №14
лекция №14student_kai
 
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++Pavel Tsukanov
 
ОПК № 5 – Составные типы данных, списки
ОПК № 5 – Составные типы данных, спискиОПК № 5 – Составные типы данных, списки
ОПК № 5 – Составные типы данных, спискиVladimir Parfinenko
 
Алгоритмическая конструкция Повторение
Алгоритмическая конструкция ПовторениеАлгоритмическая конструкция Повторение
Алгоритмическая конструкция ПовторениеAndrey Dolinin
 
Абстрактные типы данных, последовательности, списки
Абстрактные типы данных, последовательности, спискиАбстрактные типы данных, последовательности, списки
Абстрактные типы данных, последовательности, спискиOlga Maksimenkova
 
лабораторная работа №5
лабораторная работа №5лабораторная работа №5
лабораторная работа №5Zhanna Kazakova
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьMikhail Kurnosov
 

What's hot (20)

Основы программирования на C++
Основы программирования на C++Основы программирования на C++
Основы программирования на C++
 
библиотеки программирования
библиотеки программированиябиблиотеки программирования
библиотеки программирования
 
Functional Programing
Functional ProgramingFunctional Programing
Functional Programing
 
SciPy
SciPySciPy
SciPy
 
C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.C++ Базовый. Занятие 03.
C++ Базовый. Занятие 03.
 
Лекция 4: Стеки и очереди
Лекция 4: Стеки и очередиЛекция 4: Стеки и очереди
Лекция 4: Стеки и очереди
 
Cpp/cli types
Cpp/cli typesCpp/cli types
Cpp/cli types
 
Обработка текста на Haskell - это просто!
Обработка текста на Haskell - это просто!Обработка текста на Haskell - это просто!
Обработка текста на Haskell - это просто!
 
Абстрактные типы данных, контейнеры и списки
Абстрактные типы данных, контейнеры и спискиАбстрактные типы данных, контейнеры и списки
Абстрактные типы данных, контейнеры и списки
 
Функциональное программирование на F#
Функциональное программирование на F#Функциональное программирование на F#
Функциональное программирование на F#
 
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
Хочу знать, сколько уникальных посетителей было на моём сайте за произвольный...
 
Олег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и PythonОлег Алистратов — Сортировка списков в Perl и Python
Олег Алистратов — Сортировка списков в Perl и Python
 
лекция №14
лекция №14лекция №14
лекция №14
 
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
 
ОПК № 5 – Составные типы данных, списки
ОПК № 5 – Составные типы данных, спискиОПК № 5 – Составные типы данных, списки
ОПК № 5 – Составные типы данных, списки
 
Scala #3
Scala #3Scala #3
Scala #3
 
Алгоритмическая конструкция Повторение
Алгоритмическая конструкция ПовторениеАлгоритмическая конструкция Повторение
Алгоритмическая конструкция Повторение
 
Абстрактные типы данных, последовательности, списки
Абстрактные типы данных, последовательности, спискиАбстрактные типы данных, последовательности, списки
Абстрактные типы данных, последовательности, списки
 
лабораторная работа №5
лабораторная работа №5лабораторная работа №5
лабораторная работа №5
 
Лекция 4: Стек. Очередь
Лекция 4: Стек. ОчередьЛекция 4: Стек. Очередь
Лекция 4: Стек. Очередь
 

Similar to ОПК № 2 – Алгоритмы и структуры данных, язык C

Александр Сомов "C++: препроцессор, компилятор, компоновщик"
Александр Сомов "C++: препроцессор, компилятор, компоновщик"Александр Сомов "C++: препроцессор, компилятор, компоновщик"
Александр Сомов "C++: препроцессор, компилятор, компоновщик"Yandex
 
Александр Гладыш — Lua
Александр Гладыш — LuaАлександр Гладыш — Lua
Александр Гладыш — LuaYury Yurevich
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingTatiana Volkova
 
Some Elements of Functional Porgamming Languages
Some Elements of Functional Porgamming LanguagesSome Elements of Functional Porgamming Languages
Some Elements of Functional Porgamming Languages_ymn
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Platonov Sergey
 
Декларативно функциональный стиль в PHP
Декларативно функциональный стиль в PHPДекларативно функциональный стиль в PHP
Декларативно функциональный стиль в PHPParallels
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Development User Group
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C codeDenis Efremov
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Hack Days
 
Caché Native Access. InterSystems Meetup 2014
Caché Native Access. InterSystems  Meetup 2014Caché Native Access. InterSystems  Meetup 2014
Caché Native Access. InterSystems Meetup 2014InterSystems
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНСit-people
 
Программирование: от сложного к простому
Программирование: от сложного к простомуПрограммирование: от сложного к простому
Программирование: от сложного к простомуNikolay Grebenshikov
 
Внедрение аспектов в PHP с помощью библиотеки GO! AOP
Внедрение аспектов в PHP с помощью библиотеки GO! AOPВнедрение аспектов в PHP с помощью библиотеки GO! AOP
Внедрение аспектов в PHP с помощью библиотеки GO! AOPAlexander Lisachenko
 
C++ теория
C++ теорияC++ теория
C++ теорияtank1975
 
C++ теория
C++ теорияC++ теория
C++ теорияtank1975
 
C++ теория
C++ теорияC++ теория
C++ теорияtank1975
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 

Similar to ОПК № 2 – Алгоритмы и структуры данных, язык C (20)

Александр Сомов "C++: препроцессор, компилятор, компоновщик"
Александр Сомов "C++: препроцессор, компилятор, компоновщик"Александр Сомов "C++: препроцессор, компилятор, компоновщик"
Александр Сомов "C++: препроцессор, компилятор, компоновщик"
 
Александр Гладыш — Lua
Александр Гладыш — LuaАлександр Гладыш — Lua
Александр Гладыш — Lua
 
Компьютерная графика. Введение в Processing
Компьютерная графика. Введение в ProcessingКомпьютерная графика. Введение в Processing
Компьютерная графика. Введение в Processing
 
ОПК № 1 – Вводная
ОПК № 1 – ВводнаяОПК № 1 – Вводная
ОПК № 1 – Вводная
 
Some Elements of Functional Porgamming Languages
Some Elements of Functional Porgamming LanguagesSome Elements of Functional Porgamming Languages
Some Elements of Functional Porgamming Languages
 
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
 
Декларативно функциональный стиль в PHP
Декларативно функциональный стиль в PHPДекларативно функциональный стиль в PHP
Декларативно функциональный стиль в PHP
 
2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure2014-11-01 03 Николай Линкер. Open your clojure
2014-11-01 03 Николай Линкер. Open your clojure
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Caché Native Access. InterSystems Meetup 2014
Caché Native Access. InterSystems  Meetup 2014Caché Native Access. InterSystems  Meetup 2014
Caché Native Access. InterSystems Meetup 2014
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
 
Программирование: от сложного к простому
Программирование: от сложного к простомуПрограммирование: от сложного к простому
Программирование: от сложного к простому
 
Functional
FunctionalFunctional
Functional
 
Внедрение аспектов в PHP с помощью библиотеки GO! AOP
Внедрение аспектов в PHP с помощью библиотеки GO! AOPВнедрение аспектов в PHP с помощью библиотеки GO! AOP
Внедрение аспектов в PHP с помощью библиотеки GO! AOP
 
C++ теория
C++ теорияC++ теория
C++ теория
 
C++ теория
C++ теорияC++ теория
C++ теория
 
C++ теория
C++ теорияC++ теория
C++ теория
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 

ОПК № 2 – Алгоритмы и структуры данных, язык C

  • 1. ОСНОВЫ ПРОГРАММНОГО КОНСТРУИРОВАНИЯ Лекция № 2 26 февраля 2013 г.
  • 2. ИНЬ И ЯН ПРОГРАММИРОВАНИЯ • Алгоритмы. • Структуры данных. • Алгоритмы + Структуры данных = Программы.
  • 3. ДАННЫЕ (ИНФОРМАЦИЯ) • Данные для человека: • Изображения (видео). • Числа (целые, • Звук. вещественные, комплексные)… • «Записи». • Наборы чисел (ряды, • Компьютерможет: векторы, матрицы). 00011100111010101 • Текст (символы).
  • 4. МАШИННОЕ ПРЕДСТАВЛЕНИЕ ДАННЫХ • Целыечисла – двоичная • Набор чисел, символов – система счисления. массив. • Вещественные числа – • Картинка– массив представление с пикселов с цветом (RGB). плавающей точкой. • Звук– набор отсчетов • Символы – числа (квантованная амплитуда). (кодировка).
  • 5. АЛГОРИТМ • Решает определенную задачу. • Конечная упорядоченная последовательность действий. • Обычно имеет входные параметры и выходные результаты. • Пример: алгоритм Евклида поиска НОД двух чисел: • НОД(a, b) = НОД(a-b, b) если a > b
  • 6. ЯЗЫКИ ПРОГРАММИРОВАНИЯ • Структуры данных: • Типы данных (числа, символы, строки, …). • Переменные. • Алгоритмы: • Операции над данными, в определенной последовательности – согласно синтаксису языка.
  • 7. ПАРАДИГМЫ ПРОГРАММИРОВАНИЯ • Императивная. Программа – это и есть алгоритм. В каждый момент есть глобальное состояние (содержимое памяти), явно доступное для изменения. Языки: Pascal, C, … • Функциональная. Программа – это функция. Нет явного состояния. Языки: LISP, Haskell, Microsoft Excel (!) • Логическая. Программа – это набор предикатов и правил вывода. Языки: Prolog, SQL.
  • 8. ИМПЕРАТИВНЫЙ C int fib(int n) { int a = 0, b = 1; int i; for (i = 1; i < n; i++) { int c = a + b; a = b; b = c; } return b; }
  • 9. ФУНКЦИОНАЛЬНЫЙ HASKELL fib :: Int -> Integer fib n = fibs (0,1) !! n where fibs (a,b) = a : fibs (b,a+b)
  • 10. ЛОГИЧЕСКИЙ PROLOG fib(0, 0, 1):-!. fib(N, A, B):- N1 = N - 1, fib(N1, A1, B1), A = B1, B = A1 + B1.
  • 11. ЯЗЫК C • 1972 г., Деннис Ричи (Bell Labs). • «Переносимый ассемблер» для системных целей: • Операционные системы: ядра, системные библиотеки. • Компиляторы, виртуальные машины, … • Дает широкие возможности, но требует аккуратности.
  • 12. ИСТОРИЯ • 1972 г. – рождение. • 1978 г. – выход книги, «K&R» C. • 1983 г. – отпочковался C++. • 1989 г. – стандарт ANSI C или C89. • 1999 г. – стандарт C99 (не совместим с C++!). • 2011 г. – стандарт C11.
  • 13. КОМПИЛЯТОРЫ • GNU Compiler Collection. • Microsoft Visual C++. • Intel C++. • Clang/LLVM.
  • 14. HELLO_WORLD.C #include <stdio.h> int main(void) { printf("Hello, world!n"); return 0; }
  • 15. СТРУКТУРА ПРОГРАММЫ • Программа состоит из функций, в т. ч. функции main(). • Функции расположены в файлах *.c. Например: • main.c • util.c • lib.c • magic.c
  • 16. ЭТАП 1. КОМПИЛЯЦИЯ Исходные файлы (модули) Объектные файлы main.c main.o util.c util.o lib.c lib.o magic.c magic.o
  • 17. ОБЪЕКТНЫЙ ФАЙЛ FILE.O • Машинный код функций, • hello_world.c: объявленных в file.c. • Машинный код функции • Памятьпод объявленные main(). глобальные переменные. • Ссылка на внешнюю • Ссылкина внешние функцию printf(). функции. • Ссылки на глобальные переменные.
  • 18. ЭТАП 2. ЛИНКОВКА main.o util.o Исполняемый Линкер файл lib.o magic.o Статические Динамические библиотеки библиотеки
  • 19. РАБОТА ЛИНКЕРА • Операционная единица: имя. Каждый объектный модуль (в т. ч. библиотечный): • Предоставляет какие-то имена (функции, переменные, …) • Требует какие-то имена. • Линкер удовлетворяет зависимости (все начинается с имени main). • Ошибки: • Имя требуется одним из модулей, но никаким не предоставляется. • Одно и то же имя предоставляется более, чем одним модулем.
  • 20. ИСПОЛНЯЕМЫЙ ФАЙЛ • Содержит все нужные имена (и ничего лишнего). Все ссылки на имена в объектных файлах были разрешены. • Попостроению зависит от объектных файлов и библиотек (те зависят от исходных файлов). • Длявыполнения не нужно больше ничего (за исключением динамических библиотек).
  • 21. КОНЕЦ ВТОРОЙ ЛЕКЦИИ Язык C – это хорошо.