C лекции по программированию: НОУ ИНТУИТ | Введение в языки программирования C и C++

Содержание

100 видео-лекций по программированию / Хабр

Товарищи инженеры, уже четвертый год пошел, как я взялся преподавать в Киевском политехническом институте. За это время у меня накопилось огромное количество примеров кода и материалов, примерно на 90 лекций. Должен сказать, что за весь период своей профессиональной деятельности (а это 24 года почти ежедневного написания кода), я никогда не подымал свой уровень программирования, как за последние годы, работая со студентами. Если раньше мне казалось, что написать кратко, сложно и внушительно — это верх мастерства, то теперь я осознал, что мой код должны понимать студенты после минимальных объяснений, иначе он никуда не годится. Я пришел к выводу, что способность эту можно и нужно распространить не только на обучающий код, но и на весь рабочий код. Более того, обучающий код не должен существенно отличаться от рабочего кода, потому, что мы учим будущих инженеров делать настоящие системы, а не учебные. А после многочисленных просьб, я решил записывать все лекции в виде скринкастов, которые сразу после завершения лекции отправляются на ютюб. За этот учебный год я планирую записать 100 лекций, из которых уже опубликованы 23, готовы материалы еще для 67 лекций и новых 10 лекций еще в процессе подготовки.


Концепция курса

Все вы знаете, что у нас в отрасли есть существенные проблемы с фундаментальным инженерным образованием:


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

Построить курс на базе JavaScript — это конечно экспериментальная затея, но этот язык уж точно не будет лишним ни для кого в современном ИТ. У самих же JavaScript разработчиков очень часто наблюдается плохая базовая инженерная подготовка и нехватка фундаментальных знаний по структурам данных, алгоритмам, базовым абстракциям, паттернам, архитектуре, парадигмам и приемам программирования. Большинство кода, что пишется сейчас в индустрии, просто выбрасывается вскоре после создания, потом опять переписывается и опять выбрасывается. В общем, качество и знания редко требуются, разве что на собеседованиях. Выгоднее всего делать некачественный код и обслуживать его или выбрасывать код и продавать больше времени на его повторное написание. Кроме того, наша отрасль совершенно оторвалась от науки, в этом есть существенные заслуги маркетологов, потому что мы уже программируем не на языках программирования и не на абстракциях, а мы программируем на фреймворках и библиотеках, которые нам «втюхали» в красивой обертке.

Мы собираем все из кубиков, часто без всякого научного осмысления и редко можем ответить на вопрос, почему мы делаем так а не иначе. Все по частям уже давным-давно написано, все можно найти в интернете, но оказалось, что одно с другим не лепится, то есть по частям оно есть, а вместе это не работает. Связывать разобщенные кусочки кода гораздо сложнее чем поодиночке их сделать. Происходит это именно из-за отсутствия системного подхода, терминологического раскола и понятийной рассинхронизации специалистов. Вместе будет работать только то, что идеологически совместимо, что базируется на общей теории и выведенных из этой теории общих стандартах. Я надеюсь, что этим курсом я сделаю хоть небольшой шаг к достижению такого важного для отрасли консенсуса.

Все материалы курса в свободном доступе на github, а лекции открытые, их можно посещать бесплатно. Каждую неделю я записываю 4 лекции. Мы проводим еще семинары и практические занятия, но они не записываются.


Структура курса


  • Базовые понятия: программные абстракции, переменные, операторы, типы данных, массивы, структуры, скалярные и ссылочные типы, отображения;
  • Основные понятия: функции, контексты и область видимости, классы и объекты, прототипы, методы, лямбды, чистые функции, побочные эффекты, замыкания, частичное применение, каррирование, композиция, функции высшего порядка, колбэки, враперы, декораторы, примеси, события, интерфейс, синглтон, итераторы, функциональные объекты, функторы, монады, работа с файлами, потоки, сокеты, мемоизация, наследование, генераторы, асинхронное программирование, чеининг, модули и зависимости, обработка ошибок, фабрики и пулы, таймеры, регулярные выражения;
  • Вспомогательные материалы: git, системы контроля версий и менеджеры пакетов, работа с консолью, тестирование, непрерывная интеграция, логирование, линтеры, оптимизация и производительность, борьба с утечками памяти, скрытые классы, мономорфные функции, дженерики, сборка мусора, управление памятью;
  • Структуры данных: коллекции, массивы и типизированные массивы, буферы, списки, стек, очередь, дек, деревья двоичные и иерархические, многомерные деревья, повороты и балансировка ветвей, множества, хешмапы, графы, развернутые списки, асинхронная очередь, автоматы, итерирование структур данных и поиск;
  • Расширенные понятия
    : символы, прокси, диферы, фьючеры и промисы, линзы, трансдьюсеры, async/await, коллекторы данных, асинхронная композиция, адаптеры асинхронности, асинхронные итераторы, интроспекция, рефлексия, скаффолдинг, инверсия управления и внедрение зависимостей, песочницы, слоистая архитектура, компонентный подход, слой доступа к данным, проекции данных, мониторинг файловой системы, клиент-серверная и трехзвенная архитектура, кластеризация и балансировка, проектирование протоколов, динамическая перегрузка модулей, метаданные, динамическое связывание, межпроцессовое взаимодействие;
  • Примеры кода и комплексного использования технологий: живые электронные таблицы, чат на вебсокетах, реализация языка запросов к графам, альтернативная библиотека асинхронных абстракций metasync, сравнение реализации одинаковых задач на разных парадигмах, сравнение стилей функционального программирования, примеры структуры приложений, маршрутизация обработчиков в node.
    js приложениях, изоляция кода в песочницах, транзакционные объекты;
  • Парадигмы программирования: императивное, структурное и неструктурное, процедурное, объектно-ориентированное, прототипное, функциональное, логическое, декларативное, асинхронное, реактивное, событийное, автоматное, обобщенное, программирование управляемое потоками данных, мультипарадигменное, метапрограммирование.

Ссылки

Календарь лекций доступен в двух митап группах: HowProgrammingWorks (это лекции по программированию на примерах JavaScript) и NodeUA (это лекции по Node.js) и я настоятельно прошу регистрироваться всех, кто хочет посетить лекции очно. Вход свободный для всех, но организационно проще оценивать количество слушателей. За всю историю у меня были случаи и 600 человек и 2 человека, при чем явка непредсказуема.

Все записанные видео появляются в тот же день (через 10-20 минут после завершения лекции) на youtube канале.

Лекции сгруппированы в два плейлиста: по программированию и JavaScript и по Node. js.

Ссылки на лекции и материалы я размещаю в двух телеграм-каналалах: по программированию и JavaScript и по Node.js и другим более сложным темам.

Для обсуждения и вопросов есть две телеграмм-группы: по программированию и JavaScript и по Node.js.

Мой аккайнт на github, учебные репозитории в организации HowProgrammingWorks и библиотеки нашего комьюнити.


Заключение

Жду предложений по дополнению курса новыми темами, надеюсь на контрибьюшен в примеры кода, в том числе на перевод примеров на другие языки. Ваши отзывы помогут улучшить курс.

Системное программирование на языке C — 2017 — iRunner Wiki

Документы

Материалы лекций

Содержание занятий

2017-09-29

Вводная лекция. Рассказывалось об этом курсе и о языке программирования C.

На практическом занятии решали и разбирали тест.

2017-10-06

Вспоминали основы языка C, в частности типы данных. Разбирали устройство вещественных типов согласно стандарту IEEE 754.

2017-10-13

Лекция посвящена стандартной библиотеке C и неопределённому поведению. На практике решали задачи по undefined behavior.

2017-10-20

Лекция вновь посвящена стандартной библиотеке C и синтаксису языка. На практике разбирали примеры ошибок, проявляющихся при переходе с x86 на x64. А также вместе писали программу, выполняющую ввод и вывод, и смотрели, чем отличаются текстовый и бинарный режим под Windows.

2017-10-27

На лекции рассматривались классические этапы сборки программы на C, форматы объектных файлов, типы экспортируемых символов, роль компоновщика, понятие статической библиотеки. Также поднимался вопрос о том, почему объём памяти RSS меняется от запуска к запуску.

2017-11-03

Занятий в этот день не было.

2017-11-10

Задачи на тему сборки для повторения

На паре рассматривали тему динамических библиотек. Преимущества и недостатки динамической компоновки. Relocation, PIC, GOT, PLT. Создание динамических библиотек в UNIX-системах.

2017-11-17

Практическое занятие: писали код чтения zip-архива с помощью библиотеки libzip на Linux. Рассматривали пример переопределения функций через LD_PRELOAD.

2017-11-24

Рассматривались системы сборки GNU Make и CMake. Писали мейкфайл для сборки ранее рассмотренных примеров на Linux. Затем собирали пример по чтению zip-архива на Windows (собрали библиотеки zlib и libzip, немного не успели).

2017-12-01

Дособрали пример чтения zip-архива под Windows.

Затем на Linux посмотрели, что такое GNU Autotools, и собрали свой билд Midnight Commander.

Далее изучали средства отладки, в частности принцип действия отладчика и отладчик gdb.

2017-12-08

Рассмотрели дополнительные инструменты отладки (valgrind, санитайзеры).

Кратко прошлись по особенностям динамических библиотек под Windows. Эти темы остаются для самостоятельного изучения.

Начали разбирать особенности архитектуры x86-64.

2017-12-15

Рассмотрели организацию виртуальной памяти, структуру адресного пространства процесса, механизм передачи параметров в функции.

Начали изучать принцип действия аллокатора.

2017-12-22

Пара перенесена на вторник, 26 декабря.

2017-12-26

Рассматривались вопросы оптимизации кода по скорости выполнения.

Домашние задания

Задания сдаются через систему AnyTask и систему iRunner 2.

AnyTask

Ссылка на курс: http://anytask.org/course/255

Инвайт для доступа (код вида s******) был разослан на почту, курс называется «БГУ 2017 > Системное программирование на языке СИ».

iRunner 2

Ссылка на курс: https://acm.bsu.by/courses/47/

Логины имеют вид oboi17XX.

Задачи

  1. Внутреннее представление float. Задача сдаётся в iRunner. Срок: до 2017-10-20 19:00.
  2. std::vector. Задача сдаётся в iRunner. Кроме прохождения автоматических тестов, проводится
    code review
    . Срок: до 2017-10-27 19:00.
  3. wc. Задача сдаётся в iRunner. Кроме прохождения автоматических тестов, проводится code review. Срок: до 2017-12-04 08:00.
  4. Digest. Сдаётся в AnyTask. Срок: до 2017-12-11 08:00.
  5. Debug. Сдаётся в AnyTask. Срок: до 2017-12-29 08:00.
  6. Python. Сдаётся в AnyTask. Срок: до 2017-12-29 08:00.

Расписание

  • С 29 сентября: две пары по пятницам: 19:00 – 20:20 и 20:30 – 21:50.
  • С 17 ноября: одна пара по пятницам: 20:30 – 21:50.

Всего 40 часов: лекции 20 часов + лабораторные 20 часов.

Форма отчётности: зачёт.

Контакты

Преподаватель: Сергей Соболь.

Литература

  1. Керниган Б., Ритчи Д. Язык программирования Си = The C programming language. — 2-е изд. — М.: Вильямс, 2007. — С. 304.
  2. Michael Kerrisk. The Linux Programming Interface: A Linux and UNIX System Programming Handbook. — No Starch Press, 2010.
  3. W. Richard Stevens, Stephen A. Rago. Advanced Programming in the UNIX Environment. — Addison-Wesley, 2013.
  4. Jeffrey Richter. Windows via C/C++. — Microsoft Press, 2011.
  5. Agner Fog. Optimizing software in C++: An optimization guide for Windows, Linux and Mac platforms.

GitHub — Tgjmjgj/clecture: Свободные лекции по C/C++


Тема 1. Введение в программирование

История программирования. Базовые понятия. Системы счисления.

Лекция

Тема 2. Знакомство с C++

Процедурное программирование. Знакомство с C/C++ и IDE Visual Studio

Лекция

Тема 3. Ввод/вывод

Форматированный ввод/вывод. Строковый ввод/вывод. Потоковый ввод/вывод. Манипуляторы

Лекция

Тема 4. Базовые операции

Операции и их классификация. Приоритеты операций. Преобразование типов. Стандартные математические функции

Лекция

Тема 5. Условия и циклы

Условный оператор if. Оператор выбора switch. Циклы for, while и do-while

Лекция

Тема 6. Графическое представление алгоритмов

Стандарты графического представления алгоритмов. Основные элементы блок-схем. UML

Лекция

Тема 7.

Статические массивы

Статические массивы. Инициализация. Многомерные массивы. Генерация случайных чисел

Лекция

Тема 8. Указатели

Указатели. Разыменование и получение адреса. Арифметика указателей. Указатели и массивы

Лекция

Тема 9. Память

Структура памяти программы. Статическое и динамическое выделение. Контроль динамической памяти

Лекция

Тема 10. Строки

Встроенный строковый тип. Функции работы со строками

Лекция

Тема 11. Файлы

Файлы. Работа с файлами средствами C и средствами C++

Лекция

Тема 12. Структуры данных

Пользовательские типы данных. Структуры, перечисления. Стек, очередь, список. Контейнеры STL

Лекция

Тема 13. Введение в многопоточность

Процессы и потоки. Параллельные вычисления. Потоки Win API и C++ 11. Блокировки: критические секции, семафоры, мьютекс

Лекция

Записки ламера

Ссылка

Задания

  • Первое задание

Первое задание

  • Второе задание

Второе задание

  • Третье задание

Третье задание

  • Четвёртое задание

Четвёртое задание Решение

  • Пятое задание

Пятое задание

  • Шестое задание

Шестое задание

  • Седьмое задание

Седьмое задание

  • Восьмое задание

Восьмое задание

  • Девятое задание

Девятое задание

  • Десятое задание

Десятое задание

  • Одиннадцатое задание

Одиннадцатое задание

Язык программирования C.

Лекции и упражнения | Стивен Прата | ISBN 9785907114142 Язык программирования C. Лекции и упражнения | Стивен Прата | ISBN 9785907114142 | Купить книгу

Язык программирования C. Лекции и упражнения

Количество страниц

928

Отправка: 2-3 недели после оформления заказа

Эта книга представляет собой тщательно проверенное, хорошо продуманное и всеобъемлющее учебное пособие, предназначенное для программистов и разработчиков. Ставшая классикой, она обучает принципам программирования, в том числе структуризации кода и нисходящему проектированию.Автор и преподаватель Стивен Прата создал поучительное, ясное и проницательное введение в С. Наряду с деталями языка С объясняются фундаментальные концепции программирования. Многочисленные короткие практические примеры иллюстрируют только одну или две концепции за раз и поощряют читателей проработать новые темы, непосредственно приступив к их реальному использованию.Вопросы для самоконтроля и упражнения по программированию, приводимые в конце каждой главы, ориентированы на критически важные сведения и помогают читателям по… Рекомендуем! Eta kniga predstavljaet soboj tschatelno proverennoe, khorosho produmannoe i vseobemljuschee uchebnoe posobie, prednaznachennoe dlja programmistov i razrabotchikov. Stavshaja klassikoj, ona obuchaet printsipam programmirovanija, v tom chisle strukturizatsii koda i niskhodjaschemu proektirovaniju. Avtor i prepodavatel Stiven Prata sozdal pouchitelnoe, jasnoe i pronitsatelnoe vvedenie v S. Narjadu s detaljami jazyka S objasnjajutsja fundamentalnye kontseptsii programmirovanija. Mnogochislennye korotkie prakticheskie primery illjustrirujut tolko odnu ili dve kontseptsii za raz i pooschrjajut chitatelej prorabotat novye temy, neposredstvenno pristupiv k ikh realnomu ispolzovaniju.Voprosy dlja samokontrolja i uprazhnenija po programmirovaniju, privodimye v kontse kazhdoj glavy, orientirovany na kriticheski vazhnye svedenija i pomogajut chitateljam po… Rekomenduem!

Цена:

166.00 € 150.91 € без НДС Похожие товары Мы — книжный магазин в Финляндии с доставкой по всему миру. Все заказы отправляются из Хельсинки.

Углубленное программирование на C/C++ — Техносфера Mail.ru

Длительность

  • 19 занятий
  • 76 ак. часов

Курс преподают

  • Алексей Петров
  • Михаил Мальцев
  • Константин Кривякин

Получаемые навыки

В процессе изучения курса у студентов формируются знания в области многопоточного программирования, шаблонов объектно-ориентированного программирования, стандартах кодирования и определения качества кода, а также формируются навыки и умения написания безопасного кода, использования элементов библиотек STL и BOOST и рефакторинга своего и чужого кода.

Контроль знаний

На протяжении всего семестра за определенные виды работ, выполняемые студентами, выставляются баллы. Итоговый рейтинг по дисциплине представляет собой сумму баллов, полученных студентом за прохождение контрольных точек – рубежных контролей, домашних заданий, защиты итогового проекта. Важное условие — своевременное выполнение работ.
Для успешной аттестации по данному курсу студентам необходимо набрать пороговый рейтинг — 50 баллов. При пересчете баллов студенты могут получить итоговую оценку: 0–49 неудовлетворительно, 50–69 удовлетворительно, 70–79 хорошо, 80–100 отлично.

Цель курса — формирование практических навыков и умений, необходимых специалистам по разработке программного обеспечения (ПО) UNIX-подобных операционных систем для участия в проектах промышленной разработки среднего уровня сложности на языках C и C++, в том числе для замещения стажерских должностей разработчиков серверной части высоконагруженных приложений.

Учебный курс «Углубленное программирование на C/C++» состоит из 9 лекций и 7 практикумов. Общая аудиторная нагрузка составляет 64 а.ч., из которых 36 а.ч. приходится на лекционные занятия, 28 а.ч. — на практические работы.
Внеаудиторная нагрузка на слушателей компенсирует незначительный дисбаланс в пользу теоретической направленности аудиторных занятий, обусловлена доступностью лабораторной инфраструктуры и определяющей ролью проектной работы в практической части курса, предполагает самостоятельное изучение рекомендуемой литературы по дисциплине и в представленном варианте учебно-методического плана не регламентирована.
Итоговая оценка знаний студентов по дисциплине формируется на протяжении учебного семестра в соответствии с правилами балльно-рейтинговой системы (см. ниже).

4 часа 4 часа СР

4 часа 4 часа СР

4 часа 3 часа СР

4 часа 3 часа СР

Рубежный контроль №1

4 часа 4 часа СР

4 часа 3 часа СР

4 часа 3 часа СР

Практическое занятие №3. Проектирование полиморфной иерархии классов повышенного уровня сложности

4 часа 3 часа СР

4 часа 3 часа СР

Рубежный контроль №2

Практическое занятие №4. Разработка и обеспечение безопасности полиморфной иерархии с шаблонами классов

4 часа 2 часа СР

Практическое введение в STL

4 часа 3 часа СР

Рубежный контроль №3

4 часа 4 часа СР

4 часа 3 часа СР

4 часа 3 часа СР

4 часа 2 часа СР

4 часа 3 часа СР

Рубежный контроль №4

Экзамен

4 часа 2 часа СР

Рубежный контроль №5

Пересдача

4 часа 2 часа СР

Программа курса «Программирование и информатика», I-1

Язык программирования Си

Данный курс доступен на сайте «Университет без границ».

  1. Основы работы в среде Microsoft Visual Studio. Создание проекта «Win32 Console Application». Основные файлы проекта. Этапы компиляции программ.
  2. Основы синтаксиса языка Си, структура консольного приложения. Ключевые слова. Базовые типы данных (bool, char, int, double). Определение переменных и констант. Выражения, операции, комментарии. Приведение типов. Приоритет операторов.
  3. Директивы препроцессора и их использование.
  4. Блоки и правила видимости переменных. Управляющие операторы (if, goto, switch). Циклы (while, do, for).
  5. Процедурный подход программирования. Определение функции. Прототип функции. Передача параметров в функции по значению, передача массивов в функции. Локальные, глобальные, статические переменные. Рекурсия.
  6. Модульный подход в программировании. Использование *.h файлов. Раздельная компиляция. Внешние (extern) и статические (static) глобальные переменные и функции.
  7. Математические функции стандартной библиотеки Си (<math.h>). Консольный ввод-вывод (<stdio.h>). Форматированный ввод-вывод.
  8. Указатели. Массивы. Передача параметров в функции по указателю. Функции работы с динамической памятью (malloc/free/realloc). Динамические массивы. Сложные декларации, определение синонимов типов (typedef). Указатель на функцию.
  9. Строки Си. Функции работы со строками (<string.h>, <ctype.h>).
  10. Пользовательские типы данных (enum, struct, union).

Фундаментальные алгоритмы программирования

  1. Поиск элемента в массиве.
  2. Поиск последовательности элементов в массиве (метод Боуера-Мура).
  3. Одно- и двусвязные списки.
  4. Методы сортировки массивов (сортировка выбором, быстрая сортировка).

Численные методы

  1. Машинная арифметика, точность вычислений.
  2. Поиск корня уравнения (методы вилки, хорд и касательных).
  3. Интерполяция и экстраполяция значений функции.
  4. Линейная аппроксимация измерений.
  5. Вычисление определенных интегралов (методы прямоугольников, трапеций и Симпсона).

Литература

  1. В.В. Подбельский, С.С. Фомин. «Программирование на языке Си» – Москва,  Финансы и статистика, 2005, 600 с.
  2. Стивен Прата. «Язык программирования C. Лекции и упражнения» – Москва, «Вильямс», 2015, 928 с.
  3. Д.А. Бикулов, Н.В. Иваницкая, А.П. Иванов. «Язык программирования Си, учебно-методическое пособие»
  4. В.А. Антонюк, А.П. Иванов. «Программирование и информатика. Краткий конспект лекций. » – Москва, физический ф-т МГУ, 2015, 64 с.
  5. Керниган, Д. Ритчи. «Язык программирования Си» – Санкт-Петербург,  Невский диалект, 2003, 304 с.
  6. Т. Кормен, Ч. Лейзерсон, Р. Ривест, К. Штайн. «Алгоритмы: построение и анализ» – Вильямс, 2011, 1296 c.
  7. Н.Н. Калиткин. «Численные методы» – Москва, Наука, 1978, 592 с.

Основы программирования на языке Си.

134

Содержание.

1. Лекция: Общее знакомство.

-Происхождение языка Си.

-Достоинства языка Си.

-Будущее языка Си.

-Использование языка Си.

-Использование текстового редактора для подготовки программ.

-Исходные и выполняемые файлы. Примеры простой программы.

-Пример простой программы на языке Си.

-Структура простой программы.

2. Лекция: Данные, символьные строки, директива #define

-Основные типы данных.

-Описание различных типов, переменные и константы.

-Символьные строки.

-Препроцессор языка Си.

3. Лекция: Операции.

-Основные операции.

-Дополнительные операции.

-Перечень операций языка Си.

4. Лекция: Операторы.

-Выражения.

-Простейшие выражения.

-Операторы.

-Составные операторы.

5. Лекция: Преобразование типов.

-Эквивалентность типов.

-Преобразование типов.

-Неявное преобразование типа.

-Арифметические преобразования.

-Явное преобразование типов.

-Синтаксис типов.

6. Лекция: Функции и переключение ввода-вывода.

-Ввод и вывод одного символа.

-Буферы.

-Чтение одной строки.

-Чтение файла.

-Переключение и работа с файлами.

7. Лекция: Выбор вариантов.

-Выбор вариантов.

-Оператор if.

-Расширение оператора if.

-Операции отношения.

-Логические операции.

-Операция условия: ?:.

-Множественный выбор.

8. Лекция: Циклы и другие управляющие средства. Структурное программирование.

-Цикл с предусловием.

-Цикл со счетчиком.

-Цикл с постусловием.

-Другие управляющие операторы.

-Структурное программирование.

9. Лекция: Функции.

-Создание и использование функций.

-Аргументы функции.

-Возвращение значений.

-Локальные переменные.

-Нахождение адресов.

-Указатели, первое знакомство.

-Функции с переменным количеством аргументов.

10. Лекция: Классы памяти и разработка программ.

-Классы памяти и область действия.

-Автоматические переменные.

-Внешние переменные.

-Статические переменные.

-Внешние статические переменные.

-Регистровые переменные.

11. Лекция: Препроцессор языка Си.

-Общие сведения.

-Символические константы: #define.

-Использование аргументов с #define.

-Макроопределение или функция?

-Включение файла #include.

-Условная компиляция.

12. Лекция: Массивы и указатели.

-Указатели и массивы.

-Массивы.

-Указатели.

-Динамические объекты.

-Создание динамических объектов.

-Доступ к динамическим объектам.

-Строки — дополнительные сведения о связи между указателями и массивами.

-Инициализация массивов и классы памяти.

-Функции.

-Операции с указателями.

13. Лекция: Символьные строки и функции над ними.

-Строковые константы.

-Массивы символьных строк и их инициализация.

-Массив и указатель: различия.

-Указатели и строки.

-Ввод-вывод строк.

-Обработка строк.

14. Лекция: Структуры.

-Определение структурных переменных.

-Доступ к компонентам структуры.

-Поля битов в структурах.

-Объединения.

-Перечисления.

­­-Переменные структуры.

-Указатели структуры.

-Массив структур.

-Переименования типов.

15. Лекция: Библиотека языка Си и файлы ввода-вывода.

-Библиотека языка Си содержит множество функций и макроопределений.

-Библиотеки меняются от системы к системе, но есть ядро функций (стандартная библиотека).

-Распределение памяти.

16. Лекция: Функции в примерах.

-Функция получения случайных чисел.

-Поиск узлов из простых чисел.

-Матрица инцидентности.

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

-Работа с файлами.

-Все операции со стеком.

-Примеры из графики, все преобразования трехмерного пространства.

1. Лекция: Общее знакомство.

-Происхождение языка Си.

-Достоинства языка Си.

-Будущее языка Си.

-Использование языка Си.

-Использование текстового редактора для подготовки программ.

-Исходные и выполняемые файлы. Примеры простой программы.

-Пример простой программы на языке Си.

-Структура простой программы.

Происхождение языка Си.

Язык программирования Си был разработан и реализован в 1972 году сотрудником фирмы AT&T Bell Laboratories Денисом Ритчи. Прообразом языка Си для Д. Ритчи послужил язык Би, разработанный Кеном Томпсоном. Он является результатом эволюционного развития языков BCPL (Richards, M., «BCPL: A. Tool for Compiler Writing and System Programming», Proc. AFIPS SJCC, 34, 557-566, 1969) и Би (Johnson, S. C., and B. W. Kernighan, «The Programming Language B», Comp. Sci. Tech. Rep. No. 8, Bell Laboratories. 1973). Основным достоинством языка Си по сравнению с языками BCPL и Би является введение в него типов данных. Язык Си был разработан во время создания операционной системы UNIX (OC UNIX). Развитие языка Си продолжалось и после окончания его разработки и касалось, в частности, проверки типов данных и средств, облегчающих перенос программ в другую среду. Например, разработка проекта переноса OC UNIX на компьютер Interdata 8/32 привела к некоторым добавлениям в язык Си, а именно, к включению в язык таких средств, как объединение (union). Позднее были сделаны попытки включения в язык Си средств абстрагирования данных. В настоящее время рассматривается проект стандарта ANSI C — стандарт языка Си Американского национального института и the C Programming Language — Reference Manual, AT&T Bell Laboratories. С языка Си разработаны совместимые по входному языку трансляторы для 40 типов вычислительных систем, начиная от 8-разрядных микропроцессоров и кончая CRAY-1 — одним из самых мощных в настоящее время суперкомпьютеров. В ходе работ по созданию Мобильного Транслятора с языка Си сам он был переработан для повышения мобильности написанных на нем программ.

Лекций


На этой странице представлена ​​информация об онлайн-лекциях и слайды лекций для использования в преподавании и изучении книги Компьютерные науки: междисциплинарный подход . Эти лекции подходит для использования инструкторами в качестве основы для «перевернутого» класса по предмету или для самостоятельного изучения отдельными лицами.

Перевернутый класс.

Если вы преподаватель вводной информатики, эффективный способ преподавать материал в Типичный класс колледжа должен придерживаться еженедельной каденции, а именно:
  • Каждую неделю отправляйте электронное письмо всем учащимся в классе, которые кратко описывает занятия на этой неделе (лекции, чтение, и задания по программированию, взятые из книги или с этого книжного сайта).
  • Студенты смотрят видео лекций в своем собственном темпе, читают, и работаем над заданиями по программированию.
  • Назначьте еженедельное «классное собрание» для обсуждения материала, отзывы к экзаменам, неформальное общение со студентами, и любой дополнительный материал, который вы хотите охватить.
Это всего лишь одно предложение — этот материал может поддерживать множество различных стилей обучения. и форматы.

Важное примечание: Распространенная ошибка при преподавании перевернутого класса заключается в добавлении слишком большого количества обогащающего материала.Наш опыт — это время в классные собрания гораздо лучше проводить, готовя студентов к успеху на задания по программированию и экзамены. Если инструктор дает понять, что лучший способ подготовиться к экзаменам — это посмотреть видео лекций и прочитать их, большинство студентов так и поступят. Тогда собрания класса могут включать взаимодействие со студентами и с материалом таким образом, чтобы усилить понимание. Например, работа с потенциальными экзаменационными вопросами — это отличная деятельность.

Самостоятельная работа.

Эффективный способ выучить материал самостоятельно это смотреть видео лекций по какому-то регулярному графику, делать соответствующие чтение и попытка решить некоторые упражнения из книги или на книжном сайте самостоятельно. Если вы застряли в каком-то упражнении, найдите другие или попробуйте решить какие-то проблемы дается на лекциях, не глядя на там решения.

Доступные лекции.

Весной 2020 года видео лекций будут доступны в свободном доступе. При просмотре видео лекции очень важно выбрать подходящая скорость.Если он будет слишком медленным, скорее всего, вам будет скучно; если он будет слишком быстрым, вы можете заблудиться. Также обязательно сделайте либеральное использование паузы и перемотки назад.

Видео лекций можно получить по адресу CUvids; слайды лекций представлены в формате pdf.

  • Лекция 0: Пролог — простая машина. Эта лекция знакомит с фундаментальными идеями вычислений в контексте знакомого и важного приложения из области криптографии. История мотивирует изучение информатики, но охваченные концепции немного продвинуты, поэтому новички могут захотеть пересмотреть ее еще раз после просмотра других лекций в курсе.
  • Лекция 1: Основы. Зачем программировать? В этой лекции рассматривается этот основной вопрос. Затем он описывает анатомию вашей первой программы и процесс разработки программы на Java с использованием виртуальных терминалов или среды разработки программ с некоторым историческим контекстом. Большая часть лекции посвящена подробному рассмотрению встроенных типов данных Java с примерами программ для каждого из них.
  • Лекция 2: Условные выражения и циклы. Операторы if, while и for являются фундаментальными управляющими структурами Java.Эта лекция построена на коротких программах, которые используют эти конструкции для решения важных вычислительных задач. Примеры включают сортировку, вычисление квадратного корня, разложение на множители и моделирование случайного процесса. Лекция завершается подробным примером, иллюстрирующим процесс отладки программы.
  • Лекция 3: Массивы. Вычисления с большой последовательностью значений одного типа чрезвычайно распространены. В этой лекции описывается встроенная в Java структура данных массива, которая поддерживает такие приложения, с несколькими примерами, включая перетасовку колоды карт, тест сборщика купонов на случайность и случайные блуждания по сетке.
  • Лекция 4: Ввод и вывод. Для взаимодействия с нашими программами нам нужны механизмы для получения информации из внешнего мира и для представления информации внешнему миру. В этой лекции описывается несколько таких механизмов: для текста, рисунков и анимации. Рассматриваемые подробные примеры включают фрактальные рисунки, моделирующие природные явления, и анимацию прыгающего мяча в окне дисплея.
  • Лекция 5: Функции и библиотеки. Модульное программирование — это искусство и наука разбиения программы на части, которые можно разработать индивидуально.Эта лекция знакомит с функциями (методами Java), фундаментальным механизмом, обеспечивающим модульное программирование. К мотивационным примерам относятся функции классического распределения по Гауссу и приложение для создания цифровой музыки.
  • Лекция 6: Рекурсия. Рекурсивная функция — это функция, которая вызывает сама себя. Эта лекция знакомит с концепцией, подробно рассматривая функцию линейки и (связанные) классические примеры, включая загадку Ханойских башен, H-дерево и простые модели реального мира, основанные на рекурсии. Мы показываем типичную ловушку при использовании рекурсии и простой способ ее избежать, который вводит другую (связанную) парадигму программирования, известную как динамическое программирование.
  • Лекция 7: Производительность. Когда вы разрабатываете программу, вы должны знать о ее требованиях к ресурсам. В этой лекции мы описываем научный подход к пониманию производительности, при котором мы разрабатываем математические модели, описывающие время работы наших программ, а затем запускаем эмпирические тесты для их проверки.В конце концов мы приходим к простому и эффективному подходу, который вы можете использовать для прогнозирования времени работы ваших собственных программ, требующих значительного объема вычислений.
  • Лекция 8: Абстрактные типы данных. В Java вы можете создавать свои собственные типы данных и использовать их в своих программах. В этой и следующей лекции мы покажем, как эта способность позволяет нам рассматривать наши программы как абстрактные представления концепций реального мира. Сначала мы покажем механику написания клиентских программ, использующих типы данных.В наших примерах используются такие абстракции, как цвет, изображения и гены. Этот стиль программирования известен как объектно-ориентированное программирование, потому что наши программы манипулируют объектами, которые содержат значения типов данных.
  • Лекция 9: Создание типов данных. Создание ваших собственных типов данных — центральное направление современного программирования на Java. Эта лекция посвящена механике (переменные экземпляра, конструкторы, методы экземпляра и тестовые клиенты), а затем разрабатывает несколько примеров, кульминацией которых является программа, использующая типичную математическую абстракцию (комплексные числа) для создания визуальных представлений знаменитого множества Мандельброта.
  • Лекция 10: Языки программирования. Мы завершаем курс обзором важных вопросов, связанных с языками программирования. Чтобы убедить вас в том, что ваши знания Java позволят вам изучить другие языки программирования, мы показываем реализации типичной программы на C, C ++, Python и Matlab. Мы описываем важные различия между этими языками и обращаемся к фундаментальным вопросам, таким как сборка мусора, проверка типов, объектно-ориентированное программирование и функциональное программирование, с кратким историческим контекстом.
  • Лекция 11: Поиск и сортировка. Основываясь на научном подходе, разработанном в лекции 7, мы представляем и изучаем классические алгоритмы для решения двух фундаментальных проблем в контексте реальных приложений. Наше сообщение состоит в том, что эффективные алгоритмы (в данном случае двоичный поиск и сортировка слиянием) являются ключевым компонентом в решении вычислительных проблем с помощью масштабируемых решений, которые могут обрабатывать огромные экземпляры.
  • Лекция 12: Стеки и очереди. Наше введение в структуры данных — это внимательный взгляд на фундаментальные абстракции стека и очереди, включая спецификации производительности.Затем мы представляем концепцию связанных структур и сосредотачиваемся на их полезности при разработке простых, безопасных, понятных и эффективных реализаций стеков и очередей.
  • Лекция 13: Таблицы символов. Абстракция таблицы символов — один из наиболее важных и полезных инструментов программиста, который мы проиллюстрируем несколькими примерами в этой лекции. Расширяя научный подход предыдущих двух лекций, мы представляем и изучаем бинарные деревья поиска, классическую структуру данных, которая поддерживает эффективные реализации этой абстракции.
  • Лекция 14: Введение в теорию вычислений. Теория вычислений помогает нам решать фундаментальные вопросы о природе вычислений, в то же время помогая нам лучше понять способы, которыми мы взаимодействуем с компьютером. В этой лекции мы представляем формальные языки и абстрактные машины, уделяя особое внимание простым моделям, которые на самом деле широко используются в практических приложениях.
  • Лекция 15: Машины Тьюринга. В 1936 году Алан Тьюринг опубликовал статью, которую многие считают одной из самых важных научных работ 20 века.Эта лекция посвящена двум далеко идущим центральным идеям статьи: все вычислительные устройства обладают эквивалентной вычислительной мощностью, и есть ограничения на эту мощность.
  • Лекция 16: Несговорчивость. По мере расширения компьютерных приложений ученые-информатики и математики осознали необходимость уточнения идей Тьюринга. Какие вычислительные задачи мы можем решить при ограниченных ресурсах, неизбежных в реальном мире? Как описано в этой лекции, этот вопрос, по сути, остается без ответа.
  • Лекция 17: Вычислительная машина. Каждому программисту необходимо понимать основные характеристики используемого процессора компьютера. К счастью, фундаментальная конструкция компьютерных процессоров мало изменилась с 1960-х годов. В этой лекции мы даем представление о том, как ваш Java-код на самом деле выполняет свою работу, представляя воображаемый компьютер, который похож как на мини-компьютеры 1960-х годов, так и на микропроцессорные чипы, используемые в современных ноутбуках и мобильных устройствах.
  • Лекция 18: Машины фон Неймана. Продолжая наше описание конструкции процессора и низкоуровневого программирования, мы приводим контекст, уходящий в 1950-е годы, и обсуждаем будущие последствия машины фон Неймана, где программы и данные хранятся в одной и той же памяти. Мы подробно исследуем идею о том, что мы проектируем новые компьютеры, моделируя их на старых, что, как гарантирует теория Тьюринга, всегда будет эффективным.
  • Лекция 19: Комбинационные схемы. Начав с нескольких простых абстракций (провода, которые могут передавать значения включения / выключения, и переключатели, которые могут управлять значениями, передаваемыми по проводам), мы рассмотрим в этой лекции дизайн схем, реализующих компьютерные процессоры. Мы рассматриваем вентили, которые реализуют простые логические функции и компоненты для функций более высокого уровня, таких как сложение. Лекция завершается полной схемой арифметико-логического устройства.
  • Лекция 20: ЦП. В этой лекции мы даем последнюю часть нашего ответа на вопрос «Как работает компьютер?» разработав полную схему процессора компьютера, где видны все переключатели и провода.Хотя эта схема значительно отличается по масштабу, с точки зрения дизайна, она имеет многие из тех же характеристик, что и схемы в современных вычислительных устройствах.

Авторские права © 2000–2019 и . Все права защищены.

Лекция 1: Что такое вычисления? | Видео лекций | Введение в информатику и программирование на Python | Электротехника и информатика

Следующий контент предоставляется по лицензии Creative Commons. Ваша поддержка поможет MIT OpenCourseWare продолжать предлагать высококачественные образовательные ресурсы бесплатно.Чтобы сделать пожертвование или просмотреть дополнительные материалы из сотен курсов MIT, посетите MIT OpenCourseWare на ocw.mit.edu.

АНА БЕЛЛ: Хорошо. Давайте начнем. Как я упоминал ранее, эта лекция будет записана для OCW. Опять же, на будущих лекциях, если вы не хотите, чтобы у вас был виден затылок, просто не сидите здесь в этой передней части.

Прежде всего, вау, какая толпа, ребята. Наконец-то 26-100. 6.0001 сделали его большим, да? Добрый день и добро пожаловать в самый первый класс из 6 человек.0001, а также 600 в этом семестре.

Меня зовут Ана Белл. Имя, Ана. Фамилия, Белл. Я преподаватель кафедры EECS. И я буду читать несколько лекций на сегодня, а позже в этом семестре профессор Эрик Гримсон, который сидит прямо там, также будет читать некоторые из лекций.

Сегодня мы собираемся рассмотреть некоторые основные административные вопросы, немного, конечно, информации. А затем мы поговорим немного о том, что такое вычисления? Мы обсудим на очень высоком уровне, что делают компьютеры, просто чтобы убедиться, что мы все на одной странице.

А затем мы собираемся погрузиться прямо в основы Python. Мы собираемся немного поговорить о математических операциях, которые можно выполнять с помощью Python. А затем мы поговорим о переменных и типах Python.

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

И еще здорово, если бы можно было делать заметки о коде для использования в будущем. Это верно. Это действительно динамичный курс, и мы очень быстро набираем обороты. Мы хотим, чтобы вы преуспели в этом курсе.

Когда я писал это, я пытался думать о том, когда я только начинал программировать, что помогло мне пройти мой самый первый курс программирования. И это действительно хороший список. Первым делом я просто прочитал псеты, как только они вышли, убедился, что терминология просто вникла.

А потом, во время лекций, если лектор говорил о чем-то, что я внезапно вспомнил, о, я видел это слово в псе, и я не знал, что это было. Что ж, теперь я знаю, что это такое. Правильно? Так что просто прочтите это. Вам не нужно его запускать.

Если вы новичок в программировании, я думаю, что ключевое слово — практика. Это как математика или чтение. Чем больше вы практикуетесь, тем лучше у вас получается. Вы не будете поглощать программирование, наблюдая, как я пишу программы, потому что я уже умею программировать. Ребята, вам нужно практиковаться.

Загрузите код перед лекцией. Следуйте. Что бы я ни печатал, вы можете печатать. И еще я думаю, что если вы новичок в программировании, вы боитесь, что сломаете свой компьютер. И вы не можете сделать это, просто запустив Anaconda и введя несколько команд.

Так что не бойтесь просто набрать что-нибудь и посмотреть, что он делает. В худшем случае просто перезагрузите компьютер. Да уж. Это, наверное, самое главное.Наверное, надо было выделить это, но не бойтесь.

Отлично. Так что это в значительной степени дорожная карта для 6.0001 или 600, как я только что объяснил. Есть три важные вещи, которые мы хотим извлечь из этого курса. Во-первых, это знание концепций, что практически справедливо для любого класса, который вы изучаете.

Класс научит вас чему-то посредством лекций. Экзамены проверят ваши знания. Это урок программирования. Еще одна вещь, которую мы хотим, чтобы вы получили от этого, — это навыки программирования.

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

И в основе всего этого лежит практика. Вам нужно просто набрать что-то и много писать. И я думаю, вы добьетесь успеха на этом курсе.

ОК. Итак, что мы собираемся изучить в этом классе? Мне кажется, что то, что мы собираемся изучить в этом классе, можно разделить в основном на три разных раздела.Первый связан с этими первыми двумя пунктами здесь. Это действительно о том, как научиться программировать.

Изучение программирования, часть его — выяснение, какие объекты создавать. Вы узнаете об этом позже. Как вы представляете знания с помощью структур данных? Это своего рода широкий термин для этого.

И затем, когда вы пишете программы, вам нужно — программы не просто линейные. Иногда программы прыгают. Они принимают решения. Есть некоторый поток управления программами.Вот о чем будет вторая строка.

Вторая большая часть этого курса немного более абстрактна и посвящена тому, как писать хороший код, хороший стиль, читабельный код. Когда вы пишете код, вы хотите написать его так, чтобы … вы в большой компании, другие люди его читали, другие люди использовали его, поэтому он должен быть читаемым и понятным для других.

Для этого вам нужно написать хорошо организованный, модульный и простой для понимания код. И не только это, не только ваш код будет прочитан другими людьми, но в следующем году, возможно, вы пройдете еще один курс, и вам захочется оглянуться на некоторые из проблем, которые вы написали в этом классе.

Вы хотите иметь возможность перечитать свой код. Если это большой беспорядок, вы не сможете понять — или заново понять — что вы делали. Так что написание читаемого кода и организация кода также являются большой частью.

И последний раздел будет касаться — первые два фактически являются частью программирования в Введение в программирование и информатику на Python. И последний в основном посвящен информатике в разделе Введение в программирование и информатику на Python.

Мы собираемся поговорить о том, как вы научитесь писать программы на Python, как вы будете сравнивать программы на Python? Как узнать, что одна программа лучше другой?

Как узнать, что одна программа эффективнее другой? Как узнать, что один алгоритм лучше другого? Об этом мы и поговорим в последней части курса.

ОК. На этом все по административной части курса. Давайте начнем с разговора на высоком уровне о том, что делает компьютер.

По сути, он выполняет две функции. Один выполняет вычисления. Выполняет много вычислений. В наши дни компьютеры действительно очень быстрые, миллиард вычислений в секунду, вероятно, не за горами. Он выполняет эти вычисления и должен их где-то хранить. Правильно? Хранит их в памяти компьютера.

Значит, компьютер тоже должен запоминать результаты. И в наши дни нередко можно найти компьютеры с сотнями гигабайт памяти. Есть два вида вычислений, которые делают компьютеры.

Один из них — это вычисления, встроенные в язык. Это типы вычислений очень низкого уровня, такие как сложение, вычитание, умножение и так далее.

И когда у вас есть язык с этими примитивными типами вычислений, вы, как программист, можете объединить эти типы, а затем определить свои собственные вычисления. Вы можете создавать новые типы расчетов. И компьютер тоже сможет это сделать.

Думаю, я хочу подчеркнуть одну вещь — и мы собираемся вернуться к этому снова во время всей лекции, — это то, что компьютеры знают только то, что вы им говорите.Компьютеры делают только то, что вы им приказываете. Они не волшебные. У них нет ума.

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

Перейдем к типам знаний. Первый тип знаний — это декларативные знания. А это такие вещи, как констатация фактов. И здесь в игру вступила моя электронная почта. Если вы прочитаете его до конца, вы станете участником розыгрыша.

Итак, констатация сегодняшней лекции заключается в том, что кто-то выиграет приз до окончания урока. И призом стал Google Cardboard. Современные очки виртуальной реальности Google. И они у меня прямо здесь. Да. Я сдержал обещание.

Это констатация факта. Так что представь, что я машина. ХОРОШО? Я ничего не знаю, кроме того, что вы мне говорите. Я не знаю. Я знаю, что вы мне это заявление говорите. Я такой: ОК. Но как кто-то собирается выиграть Google Cardboard до окончания урока, верно?

Вот тут-то и нужны важные знания.Обязательные знания — это рецепт, или инструкция, или последовательность шагов. Сожалею. Это просто смешно для этого. Итак, последовательность шагов — это обязательное знание.

Если я машина, вы должны сказать мне, как кто-то выиграет Google Cardboard перед уроком. Если я буду следовать этим шагам, то технически я должен прийти к выводу.

Шаг первый, я думаю, мы это уже сделали. Кто хотел зарегистрироваться, уже подписался. Теперь я собираюсь открыть свою IDE. Я просто машина и следую шагам, которые вы мне сказали.

IDE, которую мы используем в этом классе, называется Anaconda. Я просто прокручиваю вниз. Надеюсь, вы установили его с нулевым набором проблем. Я открыл свою IDE. Я буду следовать следующему набору инструкций. Я собираюсь выбрать случайное число между первым и n-м респондентом.

Теперь я собираюсь использовать для этого Python. И это также пример того, как это действительно простая задача в вашей жизни, вы можете использовать для этого компьютеры или программирование. Потому что, если я выберу случайное число, я могу быть предвзятым, потому что, например, мне может понравиться число 8.

Чтобы выбрать случайное число, я пойду и скажу: хорошо, а где список респондентов? Он начинается с 15. На самом деле, с 16, потому что это я. Мы собираемся выбрать случайное число между 16 и конечным 266. О, мы только что … о. ОК.

ОК. Я собираюсь отрезать его прямо здесь. 271. Хорошо. 16 и 271. Отлично. ОК. Я выберу случайное число. Собираюсь зайти в свою IDE. И вам пока не нужно знать, как это сделать, но к концу этого урока вы узнаете.Я просто буду использовать Python.

Я просто собираюсь получить пакет случайных чисел, который даст мне случайное число. Я скажу random.randint. И я собираюсь выбрать случайное число от 16 до 272,

ОК. 75. Хорошо. Отлично. Я выбрал случайное число. И я найду номер в листе ответчика. Опять какой был номер? Сожалею. 75. Хорошо. Мы идем вверх. Вот и все. Лорен З-О-В. Да уж. Ницца. Ты здесь.

Отлично. Все в порядке. Это пример того, как я являюсь машиной и в то же время использую Python в повседневной жизни, просто читая лекции, чтобы найти случайное число.Старайтесь использовать Python везде, где можете. И это просто дает вам практику.

Это было весело. Но мы в Массачусетском технологическом институте. Мы студенты Массачусетского технологического института. И мы любим числа здесь, в MIT. Вот числовой пример, показывающий разницу между декларативным и императивным знанием.

Примером декларативного знания является квадратный корень из числа x = y, такого что y, умноженное на y, равно x. Это просто констатация факта. Это правда. Компьютеры не знают, что с этим делать. Они не знают, что делать с этим заявлением.Но компьютеры знают, как следовать рецепту.

Вот известный алгоритм. Чтобы найти квадратный корень из числа x, предположим, что x изначально равен 16, если компьютер следует этому алгоритму, он будет начинать с предположения, g, скажем, 3. Мы пытаемся найти квадратный корень из 16.

Мы собираемся вычислить g, умноженное на g, равно 9. И мы зададимся вопросом: если g умноженное на g достаточно близко к x, остановимся и скажем, что g — это ответ.

Я не очень доволен тем, что 9 действительно близко к 16.Итак, я собираюсь сказать, что не собираюсь останавливаться на достигнутом. Я буду продолжать.

Если это недостаточно близко, я сделаю новое предположение, усредняя g и x по g. Здесь x больше g. И это там средний показатель.

И новое среднее значение будет моим новым предположением. Так и сказано. И затем, последний шаг — использовать новое предположение, повторить процесс. Затем мы возвращаемся к началу и повторяем весь процесс снова и снова.

И это то, что делают остальные строки.И вы продолжаете делать это, пока не решите, что вы достаточно близки. То, что мы видели для императивного знания в предыдущем числовом примере, было рецептом того, как найти квадратный корень из x. Какие три части рецепта?

Первый — это простая последовательность шагов. Было четыре ступени. Другой был поток контроля, поэтому были части, где мы принимали решения. Достаточно ли мы близки? Были места, где мы повторяли некоторые шаги. В конце, как мы сказали, повторите шаги 1, 2, 3. Это поток управления.

И последняя часть рецепта была способом остановиться. Вам не нужна программа, которая постоянно продолжается и продолжается. Или для рецепта, вы не хотите вечно печь хлеб. В какой-то момент вы хотите остановиться. Вроде 10 хлебов достаточно, правда? Так что у вас должен быть способ остановиться.

В предыдущем примере способ остановки заключался в том, что мы решили, что мы достаточно близко. Достаточно близко могло быть в пределах 0,01, 0,001, что бы вы ни выбрали. Этот рецепт есть для алгоритма. Говоря языком информатики, это будет алгоритм. И это то, что мы собираемся узнать в этом классе.

Мы имеем дело с компьютерами. И мы действительно хотим запечатлеть рецепт внутри компьютера, ведь компьютер — это механический процесс. Исторически существовало два разных типа компьютеров. Первоначально это были компьютеры с фиксированной программой.

И я достаточно взрослый, чтобы использовать что-то вроде этого, где есть только числа и плюс, минус, умножение, деление и равенство. Но калькуляторы в наши дни намного сложнее.

Но в то время примером компьютера с фиксированной программой был этот калькулятор. Он умеет только сложение, умножение, вычитание, деление. Если вы хотите что-то построить, вы не можете. Если вы хотите выйти в Интернет, отправьте с ним электронное письмо, вы не можете.

Он может только одно. А если вы захотите создать машину, которая будет делать что-то еще, вам придется создать другой компьютер с фиксированной программой, который будет выполнять совершенно отдельный тест. Это не очень хорошо.

Вот когда в игру вступили компьютеры с сохраненными программами.И это были машины, которые могли хранить последовательность инструкций. И эти машины могли выполнять последовательность инструкций. И вы можете изменить последовательность инструкций и выполнить эту другую последовательность инструкций.

На одном компьютере можно выполнять разные задачи. И это компьютер, каким мы его знаем сегодня. Все эти решения принимаются в центральном процессоре. А это все периферия.

Базовая машинная архитектура — в основе каждого компьютера есть только эта базовая архитектура — и она, я полагаю, состоит из четырех основных частей.Первое — это память. Вход и выход — это еще один.

ALU — это место, где выполняются все операции. А операции, которые может выполнять ALU, — это действительно примитивные операции, сложение, вычитание и так далее.

Память содержит набор данных и вашу последовательность инструкций. С блоком арифметической логики взаимодействует блок управления. А блок управления содержит один программный счетчик.

Когда вы загружаете последовательность инструкций, счетчик программ запускается с первой последовательности.Он начинается с последовательности, с первой инструкции. Он получает указание и отправляет его в ALU.

ALU спрашивает, над чем мы здесь выполняем операции? Что происходит? Он может получить некоторые данные. Если вы складываете два числа, он может получить два числа из памяти. Он может выполнять некоторые операции. И он может сохранять данные обратно в память.

И после того, как это будет сделано, ALU вернется назад, а счетчик программ увеличится на 1, что означает, что мы перейдем к следующей последовательности в наборе команд.И все идет линейно, инструкция за инструкцией.

Может быть одна конкретная инструкция, которая выполняет какой-то тест. Он скажет, является ли это конкретное значение большим, равным или таким же, как это другое конкретное значение? Это тест, пример теста. И тест вернет либо истину, либо ложь.

И, в зависимости от результата этого теста, вы можете либо перейти к следующей инструкции, либо установить счетчик программ на полное возвращение к началу и так далее.Вы не просто выполняете все инструкции линейно. Может быть задействован некоторый поток управления, когда вы можете пропустить инструкцию, начать с начала и так далее.

И после того, как вы закончите, когда вы закончите выполнение последней инструкции, вы можете что-то вывести. Это действительно основной способ работы компьютера. Напомним, что у вас есть компьютер с сохраненной программой, который содержит эти последовательности инструкций.

Примитивные операции, которые он может выполнять, — это сложение, вычитание, логические операции, тесты — которые равны чему-то другому, что-то меньшее и т. Д. — и перемещение данных, то есть хранение данных, перемещение данных и т. Д. такие вещи.

И интерпретатор просматривает каждую инструкцию и решает, собираетесь ли вы перейти к следующей инструкции, пропустить инструкции или повторить инструкции и т. Д.

Итак, мы поговорили о примитивах. И действительно, Алан Тьюринг, великий ученый-компьютерщик, показал, что с помощью шести примитивов можно вычислить все, что угодно. И шесть примитивов: перемещение влево, перемещение вправо, чтение, запись, сканирование и ничего не делать.

Используя эти шесть инструкций и кусок ленты, он показал, что можно вычислить все, что угодно.И с помощью этих шести инструкций возникли языки программирования, которые создали более удобный набор примитивов. Вам не нужно программировать только эти шесть команд.

И одна интересная вещь, или одна действительно важная вещь, которая возникла из этих шести примитивов, заключается в том, что если вы можете что-то вычислить на Python, скажем, — если вы напишете программу, которая что-то вычисляет на Python, то теоретически вы можете написать программу, которая вычисляет то же самое на любом другом языке.И это действительно мощное заявление.

Подумайте об этом сегодня, просматривая свои слайды. Подумайте об этом еще раз. Это действительно мощно. Когда у вас есть набор примитивов для определенного языка, вы можете приступить к созданию выражений. И эти выражения будут комбинациями примитивов языка программирования.

И выражения будут иметь некоторую ценность. И они приобретают какое-то значение в языке программирования. Давайте проведем небольшую параллель с английским языком, чтобы вы понимали, о чем я.В английском языке примитивные конструкции будут словами. В английском языке много слов.

Языки программирования — в Python есть примитивы, но их не так много. Есть числа с плавающей запятой, логические значения, это числа, строки и простые операторы, такие как сложение, вычитание и так далее. Итак, у нас есть примитивные конструкции.

Используя эти примитивные конструкции, мы можем начать создавать на английском языке фразы, предложения и то же самое на языках программирования.По-английски мы можем сказать что-то вроде: «кошка, собака, мальчик. Это, как мы говорим, синтаксически неверно. Это плохой синтаксис. Это существительное, существительное, существительное. Это не имеет смысла.

Что есть хорошее? синтаксис в английском языке — существительное, глагол, существительное. Итак, «кот, обнимает мальчика» синтаксически корректно. Точно так же в языке программирования, что-то вроде этого — в данном случае в Python — слово, а затем цифра пять не соответствует На самом деле это не имеет смысла. Это синтаксически неверно. Но что-то вроде оператора, операнда, оператора в порядке.

Итак, как только вы создали эти фразы или эти выражения, которые являются синтаксически допустимыми, вы должны подумать о статической семантике вашей фразы или вашего выражения. Например, в английском языке «Я голоден» — хороший синтаксис.

Но это странно говорить. У нас есть местоимение, глагол и прилагательное, что на самом деле не имеет смысла. «Я голоден» лучше. У этого нет хорошей статической семантики.

Точно так же в языках программирования — и вы научитесь этому, чем больше вы это делаете, — что-то вроде этого: «3. 2 раза по 5, все в порядке. Но что это значит? Что означает добавление слова к числу? В этом нет никакого смысла.

Его синтаксис в порядке, потому что у вас есть оператор, операнд, оператор. Но, например, нет смысла добавлять число к слову.

Как только вы создали эти синтаксически правильные и статические, семантически правильные выражения, например, на английском языке, вы думаете о семантике. Что означает эта фраза? В английском языке фраза может иметь несколько значений.

В этом случае «летающие самолеты могут быть опасными» может иметь два значения. Это — полет на самолете опасен, или самолет, который находится в воздухе, опасен.

И это может быть более симпатичный пример. «Эта лампа для чтения не произнесла ни слова с тех пор, как я ее купил. Что происходит?» Так что это имеет два значения. Играет на слове «лампа для чтения».

Это на английском. В английском языке вы можете иметь предложение, которое имеет более одного значения, синтаксически правильное и статичное, семантически правильное. Но в языках программирования программа, которую вы пишете, набор инструкций, которые вы пишете, имеет только одно значение. Помните, мы возвращаемся к тому факту, что компьютер делает только то, что вы ему приказываете.

Не собирается вдруг почему-то решить добавить еще одну переменную. Он просто выполнит любые поставленные вами утверждения. В языках программирования есть только одно значение.

Но проблема, которая возникает в языках программирования, заключается в том, что это не то значение, которое вы, как программист, могли иметь в виду.Вот где что-то может пойти не так.

Немного позже в курсе будет лекция по отладке. Но это здесь просто для того, чтобы сказать вам, что если вы видите всплывающее сообщение об ошибке в вашей программе, это просто текст, в котором говорится, что ошибка. Например, если мы сделаем что-то подобное, это синтаксически правильно. Неправильно. Синтаксически неверно. Увидеть? Прямо здесь есть сердитый текст. Что происходит?

Чем больше вы программируете, тем больше у вас навыков чтения этих ошибок. Но это в основном говорит мне, что написанная мною строка синтаксически неверна. И он указывает на точную строку и говорит, что это неправильно, поэтому я могу вернуться и исправить это как программист.

Синтаксические ошибки действительно легко обнаруживаются Python. Это был пример синтаксической ошибки. Статические семантические ошибки также могут быть обнаружены Python, если ваша программа должна принять какие-то решения, если вы спустились по той ветви, где происходит статическая семантическая ошибка.

И это, вероятно, будет самым неприятным, особенно когда вы только начинаете.Программа может сделать что-то другое, чем вы ожидали. И это не потому, что программа внезапно — например, вы ожидали, что программа выдаст вам результат 0 для определенного тестового примера, а результат, который вы получили, был 10.

Ну, программа не внезапно решила измените его ответ на 10. Он только что выполнил написанную вами программу. Это тот случай, когда программа дала вам другой ответ, чем ожидалось.

Программы могут аварийно завершить работу, что означает, что они перестают работать.Это хорошо. Просто вернитесь к своему коду и выясните, что было не так. И еще один пример значения, отличного от того, что вы планировали, — возможно, программа не остановится. Это тоже нормально. Есть способы остановить это, кроме перезагрузки компьютера.

Итак, программы Python будут последовательностями определений и команд. У нас будут выражения, которые будут оцениваться, и команды, которые сообщают интерпретатору что-то делать.

Если вы выполнили набор задач 0, вы увидите, что здесь вы можете вводить команды прямо в оболочке, это та часть справа, где я сделал несколько действительно простых вещей, 2 плюс 4.Или вы можете ввести команды здесь, слева, а затем запустить свою программу.

Обратите внимание, что мы поговорим об этом … Я не буду говорить об этом сейчас. Но это … с правой стороны, как правило, вы пишете очень простые команды, просто если вы что-то тестируете. А в редакторе слева вы пишете больше строк и более сложные программы.

Теперь поговорим о Python. И в Python мы вернемся к этому, все является объектом.И программы Python манипулируют этими объектами данных. Все объекты в Python будут иметь тип.

Тип будет сообщать Python, какие операции вы можете выполнять с этими объектами. Например, если объект представляет собой число пять, вы можете добавить это число к другому числу, вычесть число, возвести его в степень чего-либо и так далее.

В качестве более общего примера, например, я человек. Так что это мой типаж. И я могу ходить, говорить по-английски и так далее. Чубакка будет похож на вуки.Он может ходить, издавать тот звук, который я не могу. Он может это сделать, а я — нет. Я даже не буду пробовать и тд.

Когда у вас есть эти объекты Python, все становится объектом в Python. На самом деле есть два типа объектов. Один из них — скалярные объекты. Это означает, что это очень простые объекты в Python, из которых можно сделать все. Это скалярные объекты. Это невозможно разделить.

Другой тип объекта — нескалярный объект. А это объекты, которые имеют некую внутреннюю структуру.Например, число пять — это скалярный объект, потому что он не может быть подразделен.

Но список чисел, например, 5, 6, 7,8, будет нескалярным объектом, потому что вы можете его разделить. Вы можете разделить его на … вы можете найти его части. Он состоит из последовательности чисел.

Вот список всех скалярных объектов в Python. У нас есть целые числа, например, все целые числа. Плавающие числа, которые представляют собой действительные числа, любые числа с десятичной дробью.

Булы являются логическими.У Booleans всего два значения. Это правда и ложь. Обратите внимание на заглавные буквы, заглавные буквы T и F. И еще одну вещь, называемую NoneType. Это особенное. У него есть только одно значение — None. И это означает отсутствие типа. И это иногда бывает полезно для некоторых программ.

Если вы хотите узнать тип объекта, вы можете использовать эту специальную команду под названием type. А затем в скобках вы указываете, какой тип вы хотите найти. Вы можете написать в оболочке «тип 5», и оболочка сообщит вам, что это целое число.

Если вам нужно преобразовать между двумя разными типами, Python позволяет это сделать. И для этого вы помещаете тип, в который хотите преобразовать, прямо перед объектом, в который хотите преобразовать. Таким образом, float (3) преобразует целое число 3 в float 3.0.

Аналогично, вы можете преобразовать любое число с плавающей запятой в целое число. А преобразование в целое число просто усекает. Он просто убирает десятичную дробь и все, что после нее — не округляет — и сохраняет только целую часть.

На этом слайде я собираюсь поговорить об этом. Но если вы хотите, чтобы слайды у вас были вверх, переходите к этому упражнению. И после того, как я закончу говорить о слайде, посмотрим, что люди думают об этом упражнении.

Одна из самых важных вещей, которые вы можете делать практически при любом программировании, в том числе и на Python, — это распечатывать. Распечатка — это то, как вы взаимодействуете с пользователем.

Для распечатки используйте команду печати. Если вы находитесь в оболочке, если вы просто наберете «3 плюс 2», вы увидите здесь значение.Пять, да? Но на самом деле это не распечатка.

И это становится очевидным, когда вы на самом деле набираете текст в редакторе. Если вы просто сделаете «3 плюс 2» и запустите программу — это зеленая кнопка здесь — вы видите здесь справа, она запустила мою программу. Но на самом деле он ничего не печатал.

Если вы введете это в консоль, оно покажет вам это значение, но для вас как программиста это все равно что заглядывать в это значение. На самом деле он никому не распечатывает.Если вы хотите что-то распечатать, вы должны использовать такой оператор печати. В этом случае на консоль будет выведено это число пять.

Это в основном то, что написано. Он просто говорит вам, что это взаимодействие только внутри оболочки. Он ни с кем не взаимодействует. А если у вас нет «Out», это означает, что он был распечатан на консоли.

Хорошо. Мы немного поговорили об объектах. Когда у вас есть объекты, вы можете комбинировать объекты и операторы для формирования этих выражений.И каждое выражение будет иметь значение. Таким образом, выражение оценивается как значение. Синтаксис выражения будет таким: объект, оператор, объект.

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

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

Остальные операции, которые вы можете выполнять, и они также полезны, — это остаток, поэтому знак процента. Если вы используете знак процента между двумя операндами, это даст вам остаток при делении i на j.

И возвести что-то во власть чего-то другого — это использовать звездный оператор.И i звездная звезда j возьмет i в степень j.

Эти операции имеют типичный приоритет, который можно ожидать, например, в математике. И если вы хотите отдать приоритет некоторым другим операциям, вы можете использовать круглые скобки для этого.

Хорошо. Итак, у нас есть способы создавать выражения. И у нас есть операции, которые мы можем выполнять с объектами. Но что будет полезно, так это возможность сохранять значения под какое-то имя. И имя будет тем, что вы выберете.

И имя должно быть описательным.И когда вы сохраните значение в имени, вы сможете получить доступ к этому значению позже в своей программе. И это очень полезно.

Чтобы сохранить значение в имени переменной, вы используете знак равенства. А знак равенства — это присвоение. Он присваивает правую часть, которая является значением, левой части, которая будет именем переменной. В данном случае я присвоил переменной pi число с плавающей запятой 3.14159.

И во второй строке я возьму это выражение, разделив 22 на 7, я собираюсь вычислить его.Будет какое-то десятичное число. И я собираюсь сохранить его в переменной pi_approx. значения хранятся в памяти. И это присвоение в Python, мы говорим, что присвоение связывает имя со значением.

Когда вы позже будете использовать это имя в своей программе, вы будете ссылаться на значение в памяти. И если вы когда-нибудь захотите позже сослаться на значение в своем коде, вы просто набираете имя переменной, которой вы его присвоили.

Итак, почему мы хотим давать имена выражениям? Что ж, вы хотите повторно использовать имена вместо значений.И это делает ваш код намного лучше. Это фрагмент кода, который вычисляет площадь круга. И обратите внимание, я присвоил переменной пи 3,14159. Я присвоил другой переменной радиус равной 2,2.

А потом, позже в моем коде, у меня есть еще одна строка, в которой говорится, что площадь — это другая переменная — равна — это присвоение — этому выражению. И это выражение относится к этим именам переменных, пи и радиусу.

И он ищет их значения в памяти.И он собирается заменить эти имена переменных этими значениями. И он сделает за меня расчет. И, в конце концов, все это выражение будет заменено одним числом. И это будет поплавок.

Вот еще одно упражнение, пока я говорю о слайде. Я действительно хочу отметить разницу между программированием и математикой.

В математике вы часто сталкиваетесь с проблемой, которая гласит: решите для x. x плюс y что-то равно чему-то. Найдите, например, x.Это возвращается к тому факту, что компьютеры не знают, что с этим делать. Компьютерам нужно сказать, что им делать.

В программировании, если вы хотите найти x, вам нужно указать компьютеру, как именно решать x. Вам нужно выяснить, какую формулу вам нужно дать компьютеру, чтобы иметь возможность найти x.

Это означает, что при программировании правая часть всегда будет выражением. Это то, что будет оценено как ценность. А левая часть всегда является переменной.Это будет задание.

Знак равенства — это не то же самое, что в математике, где много вещей может быть слева и много вещей справа от знака равенства. Слева от знака равенства есть только одно. И это будет переменная. Знак равенства означает присвоение.

После того, как мы создали выражения и получили эти назначения, вы можете повторно связать имена переменных, используя новые операторы присваивания. Давайте посмотрим на это на примере. Допустим, это наша память.Вернемся к примеру с поиском радиуса.

Скажем, пи равно 3,14. В памяти мы собираемся создать это значение 3.14. Мы собираемся привязать его к переменной с именем pi. Следующая строка, радиус равен 2,2. В памяти мы создаем это значение 2.2. И мы собираемся привязать его к переменной с именем radius.

Тогда у нас есть это выражение. Он будет заменять значения пи из памяти и значение радиуса из памяти. Он рассчитает значение, которое оценивает это выражение.

Это вставит в память. И он назначит — потому что мы используем знак равенства — он назначит это значение этой переменной области.

Теперь предположим, что мы повторно привязываем радиус к чему-то другому. Радиус i привязан к значению 2.2. Но когда мы делаем эту линию, радиус равен радиусу плюс 1, мы собираемся убрать привязку к 2.2. Мы собираемся провести этот расчет. Новое значение — 3,2.

И мы собираемся повторно привязать это значение к той же переменной.Обратите внимание, что в памяти мы все еще будем иметь это значение, 2.2, плавающее. Но мы потеряли для этого ручку. Нет возможности вернуть его. Это просто память, сидящая там. В какой-то момент его может собрать то, что мы называем сборщиком мусора. В Python он извлекает эти потерянные значения и повторно использует их для новых значений и тому подобного.

Но радиус теперь указывает на новое значение. Мы никогда не сможем вернуться 2.2. Вот и все. Ценность площади — обратите внимание, это очень важно.Стоимость площади не изменилась. И это не изменилось, потому что это все инструкции, которые мы указывали компьютеру.

Мы просто сказали ему изменить радиус на радиус плюс 1. Мы никогда не говорили ему пересчитывать значение площади. Если бы я скопировал эту строку сюда, значение площади изменилось бы. Но мы никогда не говорили ему этого. Компьютер делает только то, что мы ему приказываем.

Это последнее. В следующей лекции мы поговорим о добавлении потока управления в наши программы, так как же сказать компьютеру сделать то или иное? Все в порядке.

CS252: Продвинутые темы языков программирования — Гарвардский университет

Информация о курсе

Этот курс будет охватывать множество продвинутых тем в языках программирования. См. Расписание лекций для получения списка тем для класса этого года.

Курс будет представлять собой комбинацию лекций и бумаги. обсуждение. Смотрите расписание лекций для получения дополнительной информации Подробная информация.

Для тех, кто проходит курс для получения кредита, оценка будет на основе участия в классе и финального проекта. Больше информация о финальном проекте доступна здесь. Приглашаются аудиторы.

Рекомендуемые предварительные условия

Курс предназначен для аспирантов всех уровней, а также для студентов продвинутого уровня. Ожидается, что студенты пройдут курс по основам языков программирования, например CS 152.

Время и место

вторник и четверг, 10:30 — 11:45, кабинет 323.

Лекции / расписание

См. Здесь для получения дополнительной информации.

Приемные часы

Часы работы курса

профессора Чонга (в MD145) на следующие две недели:

Часы работы курса профессора Чонга рассчитаны на группы по предварительной записи: вам не нужна запись, и в аудитории может одновременно находиться много студентов. Если вам нужна частная встреча, вы можете посетить его офис DUS, который является закрытым индивидуальным заседанием, или связаться с ним, чтобы записаться на прием.

Разнообразие и инклюзивность

Я хотел бы создать среду обучения, поддерживающую разнообразие мыслей, точек зрения и опыта, а также уважает вашу личность (включая расу, пол, класс, сексуальность, религия, способности и т. д.) Для этого:

  • Если у вас есть имя и / или набор местоимений, которые отличаются из тех, что указаны в ваших официальных отчетах Гарварда, пожалуйста, дайте мне знать!
  • Если вы чувствуете, что ваша успеваемость в классе под влиянием вашего опыта вне учебы, пожалуйста не стесняйтесь прийти и поговорить со мной. я хочу быть ресурс для вас. Если вы предпочитаете поговорить с кем-нибудь вне курса отличным помощником являются члены Комитета SEAS по разнообразию, инклюзивности и принадлежности.
  • Я (как и многие люди) все еще учусь о различных точках зрения и идентичностях. Если что-то было сказал (кем-либо) в классе, в часы работы, на площади или в проекте групповая работа, из-за которой вы чувствовали себя некомфортно, пожалуйста, поговорите с мне об этом.
  • Как участник обсуждения курса, часы работы, и групповые проекты, вы также должны стремиться соблюдать разнообразие одноклассников.

Если вы когда-нибудь боретесь и вам просто нужно с кем поговорить, не стесняйтесь зайти в рабочее время или связаться со мной и мы можем организовать частную встречу.

Инклюзивное обучение и доступность

Мне важен твой успех в этом классе. Нам всем понадобится приспособление, потому что все мы учимся по-разному. Если есть аспекты этого курса, которые мешают вам учиться или исключают вас, сообщите мне как можно скорее. Вместе мы разработаем стратегии для удовлетворения как ваших потребностей, так и требований курса.

Я рекомендую вам посетить Управление доступного образования, чтобы узнать, как вы также можете улучшить свое обучение.Если вам нужно официальное жилье, вы имеете право на его встречу. В кампусе также есть ряд ресурсов. Бюро советников по обучению предоставляет множество ресурсов, включая академические консультации и наставников.

Психическое здоровье

Если вы испытываете значительный стресс или беспокойство, изменения настроения или проблемы с едой или сном в этом семестре, будь то из-за CS252 или других курсов или факторов, пожалуйста, не стесняйтесь немедленно связаться с любым из сотрудников курса в любое время. обсуждать.Каждый может получить поддержку в трудные времена. Мы не только рады выслушать и согласовать сроки по мере необходимости, мы также можем направить вас к дополнительным структурам поддержки на территории кампуса, включая, но не ограничиваясь:

Финансовая помощь

Мы не требуем от студентов покупки каких-либо книг, оборудования или программного обеспечения. Хотя это не обязательно, полезно иметь собственный ноутбук. Студентам, не имеющим собственных ноутбуков, рекомендуется обратиться к участникам в начале курса, чтобы обсудить возможности.

Политика сотрудничества

Обсуждение и обмен идеями необходимы для выполнения Академическая работа. Для бумажных чтений, заданий, в классе упражнения и т. д., рекомендуется проконсультироваться со своим одноклассники, и поделиться источниками. Для классного проекта вы может работать в группах, а работа, представленная на оценку, может быть результат совместных усилий вашей группы. Все члены группы должны быть четко указаны персонал курса, и персонал курса должен быть уведомлен, если членство в группе меняется. Проект класса должен быть оригинальные исследования и те же стандарты профессиональных проводить исследования для публикации примените к вашему классу проект.

При подаче окончательного проекта студенты колледжа приложат заявление, подтверждающее Кодекс чести Гарвардского колледжа: «Я подтверждаю, что осведомлен о стандартах Кодекса чести Гарвардского колледжа».

Студенты колледжа: См. Кодекс чести.

Некоторые тексты политик этого курса основаны на материалах Моники Линден, нейробиология, Брауновский университет, и Дэвида Малана, информатика, Гарвардский университет.

Изучение примеров в курсе программирования

WebEx: Изучение примеров в курсе программирования Петр Брусиловский Школа информационных наук
Питтсбургский университет
Питтсбург Пенсильвания 15260
[email protected]
Abstract : Опытные и начинающие программисты часто используют примеры программ, которые они создали или изучили в прошлом, для решения новых задач программирования. Опытные преподаватели курсов, связанных с программированием, знают и применяют силу примера в своем обучении.В этом документе представлен WebEx — веб-инструмент для изучения примеров программирования, который позволяет учителям использовать подход к программированию на основе примеров с разнородными классами. WebEx максимизирует возможности обучения для каждого учащегося, дает каждому учащемуся второй шанс понять ключевые примеры программирования и поощряет каждого учащегося изучать примеры программ.

Часто утверждается, что люди используют решения предыдущих проблем для решения новых проблем или задач планирования. Как опытные, так и начинающие программисты, особенно в области программирования, часто используют примеры программ, которые они создали или изучили в прошлом, для решения новых задач программирования.Опытные преподаватели курсов, связанных с программированием, знают и применяют силу примера в своем обучении. Традиционный подход к использованию примеров в курсах программирования следующий. Для каждой лекции преподаватель готовит несколько тщательно подобранных примеров решения проблем в виде небольших программ. Учитель во время лекции анализирует эти примеры. Чтобы студенты могли дальше изучать примеры и использовать их для решения поставленных задач, преподаватель предоставляет код всех проанализированных примеров как часть печатных или онлайн-конспектов лекции.Авторы хороших учебников по программированию (которые сами являются хорошими учителями) также следуют этому подходу и предоставляют множество объясненных примеров программ в своих книгах. Чтобы побудить студентов запустить и изучить предоставленные примеры, многие авторы в настоящее время предпочитают размещать код всех примеров либо на компакт-диске, поставляемом с книгой, либо на веб-сайте книги.

Проблема с традиционным подходом к использованию примеров программирования в классе заключается в том, что он хорошо работает только для небольших однородных групп студентов.Студенты в однородной группе имеют примерно одинаковый уровень знаний в области программирования и одинаковую скорость усвоения материала. Работая с небольшой однородной группой, учитель обычно может предсказать количество и сложность примеров для каждой лекции и выбрать подходящий темп и уровень детализации для презентации. В больших разнородных классах, где учащиеся имеют очень разный начальный уровень знаний по предмету и способности усвоения, эффективность традиционного подхода, основанного на примерах, резко снижается.Разным ученикам нужны существенно разная скорость и уровень детализации в примерах объяснения. Более того, более слабым ученикам обычно требуется больше примеров, чтобы понять ту же концепцию. Учитель, столкнувшийся с неоднородным классом, обречен «потерять» как самые сильные, так и самые слабые части класса во время лекции. К сожалению, для студентов, которые не смогли понять примеры, представленные в классе, второго легкого шанса нет. Даже в ситуации, когда код всех примеров доступен в Интернете, он мало пригоден для этих студентов, потому что в самом коде отсутствует поясняющая часть.

Мы разработали WebEx, веб-инструмент для изучения примеров программирования, позволяющий учителям использовать основанный на примерах подход к программированию с разнородными классами. Наша цель заключалась в том, чтобы максимально расширить возможности обучения для каждого ученика, дать каждому ученику второй шанс понять ключевые примеры программирования, побудить каждого ученика изучить примеры программ и повторно использовать их для решения проблем. Ядром WebEx является база данных с поясненными примерами программирования, подготовленная учителями в специальном формате «вскрытия».Среда позволяет каждому учащемуся изучать примеры программ в своем собственном темпе и порядке. В частности, более слабые ученики смогут работать с большим количеством примеров и более подробно изучать каждый пример. В настоящее время мы используем WebEx в контексте курса по структурам данных и принципам программирования в Университете Питтсбурга. Однако WebEx не зависит от языка и курса и может использоваться с любым курсом, связанным с программированием. В этом документе представлена ​​первая версия WebEx, сравнивается ее с более ранними подходами к использованию технологий в контексте преподавания курсов программирования на основе примеров и резюмируются ее преимущества.

Ключевая инновационная идея предлагаемого проекта состоит в том, чтобы заменить простой код примеров программирования, предлагаемых на веб-сайте курса, на самообъясняющих примеров . Чтобы предоставить поясняющие примеры, мы намерены использовать популярный подход к объяснению примеров, используемый в ряде учебников по программированию и иногда называемый «вскрытиями» (Kelley & Pohl, 1995). При таком подходе автор примера (учитель) предоставляет текстовые пояснения для каждой строки в программе-примере.Объяснения служат как минимум двум разным целям. Во-первых, он объясняет студенту значение каждой программной строки и ее роль в общем решении проблемы программирования. Во-вторых, он комментирует конкретный способ использования языковых конструкций в каждой строке кода, тем самым устраняя разрыв между общими знаниями студентов о конструкциях языка программирования и практическими навыками их использования для решения задач программирования.

Рис. 1. Код примера программирования остался в WebEx.
Зеленая и белая кнопки слева указывают на наличие комментария для данная строка (полный размер).

В типичном учебнике программирования разобранный пример предоставляется в специальном формате, где каждая строка кода сопровождается пояснениями, которые могут варьироваться от строки или двух до нескольких абзацев текста. У этого формата есть очевидная проблема: даже в учебниках, где для строк кода используется специальный шрифт и цвет, код трудно понять, поскольку строки кода разбросаны по пояснениям.Объяснения тоже непросто понять. Обычно у студента возникает проблема с несколькими строками кода в программе, и им нужны пояснения. Одновременное представление всех объяснений отвлекает учащегося от наиболее необходимых объяснений. Наконец, чтение через большое «вскрытие» — это довольно пассивный вид обучения.

WebEx, веб-инструмент для интерактивного изучения примеров программирования, был разработан для решения перечисленных выше проблем.Наша ключевая идея — оставить примерный код в максимально возможной степени нетронутым (рисунок 1). Пример программы выглядит в WebEx точно так же, как в редакторе программы. Единственное видимое отличие — наличие зеленых или белых маркеров слева от каждой строки. Зеленая метка указывает на наличие пояснений к этой строке кода. В то время как пуля сообщает, что пояснений к строке нет. Естественно, нажатие на зеленую метку открывает пояснительную записку для выбранной строки (рисунок 2). В духе хорошего гипертекста этот интерфейс позволяет пользователю использовать его или ее предпочтительную стратегию просмотра.Некоторые пользователи могут захотеть просмотреть пример построчно. Другие студенты могут сосредоточиться на самых трудных для понимания строках и выборочно читать пояснения к этим строкам. В примере на Рисунке 3 роль исследуемой линии не очевидна даже для хороших учеников, у которых может не быть проблем с пониманием всех остальных линий. Изучая этот пример, такие студенты могут сразу перейти к этой неприятной линии, игнорируя другие ненужные объяснения.

Рисунок 2: В примере WebEx объяснения отображаются по очереди рядом с поясняемая строка (маркер и шрифт для этой строки изменяются на предоставить контекст) (Полный размер).

Подход WebEx предлагает несколько преимуществ по сравнению с традиционным книжным форматом. Во-первых, код примера показан как простой для понимания отдельный фрагмент, а не распределен по комментариям. Во-вторых, объяснения показываются одно за другим, помогая ученику сосредоточиться на чем-то одном. В-третьих, работа с каждым примером из пассивного чтения превращается в интерактивное исследование. Дополнительным преимуществом является то, что каждое действие ученика в этой среде может быть записано, что дает учителю возможность отслеживать деятельность ученика и дает исследователю в области образования мощный инструмент для изучения того, как ученик работает с примерами в курсе программирования.

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

Рис. 3. С помощью WebEx учащийся может выборочно выбирать объяснения труднее всего понять строки кода, которые обычно различаются для разных студенты (полный размер).База данных примеров реализована с использованием Microsoft Access. Интерактивная часть среды (примерное исследование и навигация между примерами и концепциями) реализована с использованием технологии Microsoft Internet Server и Active Server Pages. Выбор инструментов Microsoft определяется их бесплатной доступностью для преподавателей и студентов или нашего университета. Кроме того, система Microsoft Access относительно проста в использовании и имеет простой интерфейс. Мы обнаружили, что у учителей и помощников учителя нет проблем с копированием, комментированием и добавлением своих примеров в таблицы Access.В настоящее время мы используем WebEx в контексте системы управления курсами (CMS) Blackboard CourseInfo (Blackboard, 1999), однако она не зависит от CourseInfo и может использоваться как отдельное приложение или в сочетании с любой CMS. Хотя идея интерактивных самообъясняющих примеров в Интернете является новаторской, идея общей базы данных примеров не совсем нова. Мы знаем (и будем использовать опыт) несколько сред программирования, основанных на примерах, которые позволяют студентам использовать базу данных примеров в процессе решения задач (Брусиловский и Вебер, 1996; Брусиловский, 1992; Буров и Вебер, 1996; Фарис Reiser, 1988; Guzdial, 1995; Hohmann, Guzdial & Soloway, 1992; Linn, 1992a; Linn, 1992b; Redmiles, 1993).За двумя исключениями, единственная функция систем программирования, основанных на примерах, заключалась в том, чтобы помочь учащимся найти соответствующий пример. В большинстве случаев системы просто позволяют студенту выбрать статический пример программы из большого списка или выполнить поиск примера по ключевым словам. Две системы пошли дальше и предоставили учащимся некоторый интерфейс для изучения примера. В системе, разработанной Redmiles (1993), объяснения примера были «зашиты» в код системы самим автором. ELM-PE (Burow & Weber, 1996) применил подход искусственного интеллекта.Используя свои знания о целях программирования и способность «понимать» программу, он может в интерактивном режиме генерировать целевое объяснение каждой функции любого примера программы, представленного в системе. Наш подход — интеграция этих двух. WebEx может предоставить объяснение каждой строчки программы на любом языке с очень небольшими затратами на разработку. WebEx — это практичный инструмент, который можно использовать в любом курсе программирования. Тем не менее, как и упомянутые выше инструменты, у него есть важная исследовательская программа — изучить, как студенты используют примеры на курсах программирования.Опыт предыдущих работ с базами данных примеров позволяет нам предвидеть проблему навигации. Как мы уже отмечали, известные базы данных обычно позволяют студенту выбрать пример из большого списка или выполнить поиск примера по ключевым словам. Однако эксперимент со средой ELM-PE (Weber, 1996) показывает, что только в двух третях всех случаев пользователи могли найти наиболее подходящий пример, используя эти простые инструменты выбора примеров. В нашем случае проблема навигации может быть еще более серьезной, поскольку предполагаемое количество примеров в нашей среде будет в несколько раз больше, чем в известных базах данных.

Чтобы помочь студентам ориентироваться в нашей базе данных примеров, мы планируем организовать все примеры в гиперпространство. Эта идея была первоначально исследована Линном (1992b), который также показал, что это гиперпространство должно быть структурировано после понимания предмета на уровне эксперта. Мы намерены применить концептуальный подход к структурированию гиперпространства примеров. Концептуальный подход был первоначально предложен автором для структурирования гиперпространства страниц в системе InterBook (Брусиловский, Эклунд и Шварц, 1998).Ядром основанной на концепциях навигации является глоссарий концепций, используемых в курсе — от программных конструкций C (оператор присваивания) до концепций более высокого уровня (цикл). Пользователи могут увидеть описание каждой концепции на отдельной странице глоссария. Система поддерживает двусторонние связи между примером и каждой концепцией, использованной в этом примере. Это означает, что с каждой страницы концепции студенты могут перейти ко всем примерам, демонстрирующим использование этой концепции. И наоборот, с каждой страницы с примером студент сможет перейти к описанию каждой задействованной концепции.Этот подход поддерживает расширенную навигацию. В частности, начиная с интересующего примера, ученик сможет перейти к объяснению проблемной концепции, использованной в этом примере, и от этого к другому более простому примеру, в котором используется эта концепция. Наш опыт работы с InterBook показывает, что эта организация может успешно поддерживать навигацию в гиперпространстве с несколькими сотнями страниц контента (то есть примерами) и более чем сотней концепций. В дополнение к новому доступу к примерам, основанному на концепциях, мы намерены сохранить реализованный в настоящее время доступ на основе учебных планов, когда студент может получить список ссылок на все примеры, относящиеся к данной лекции.

Одно из ключевых предположений, лежащих в основе WebEx, заключается в том, что примеры в базе данных предоставлены несколькими преподавателями, которые преподают разные разделы одного курса. Таким образом, база данных примеров из вторичной поддержки для преподавания определенного раздела курса станет общим ресурсом для всего курса, местом для накопления «педагогической мудрости» нескольких учителей. После запуска эта база данных может использоваться несколькими поколениями инструкторов, которые также могут вносить свои любимые примеры.Как это часто бывает, в разные годы преподают разные преподаватели. В этой ситуации общая база данных примеров значительно сократит объем работы нового преподавателя курса. Вместо того, чтобы готовить и проверять большое количество примеров для анализа на каждой лекции, преподаватель может просто выбрать и повторно использовать подмножество примеров из базы данных, которое он или она считает наиболее подходящим. Сами студенты могут иметь доступ ко всему богатству объясненных примеров, что позволит более слабым ученикам работать с большим количеством примеров, чем было представлено в классе.

Сейчас мы работаем над улучшением учительской части WebEx. В исходной версии WebEx учителя должны создавать и комментировать примеры напрямую с помощью Microsoft Access. Такой подход хорошо сработал для одного или двух учителей. Чтобы поддержать более широкое сообщество учителей, работающих над одним и тем же курсом, мы разрабатываем веб-интерфейс, позволяющий учителям создавать, обновлять и повторно использовать примеры. Цель — сделать систему инструментом в руках учителя; поддерживать все основные виды деятельности учителя, работающего с примерами.Наш опыт показывает, что это один из главных ключей к успеху любой образовательной системы в классе.

Вместо того, чтобы предоставлять краткое изложение документа, мы выбрали краткое изложение преимуществ WebEx.

  • WebEx максимизирует образовательные возможности для каждого учащегося на основе примеров курс программирования, предоставляя возможность исследовать и повторно использовать самоочевидные примеры программирования. Это дает «второй шанс» студентам, пропустившим лекция или студенты, которые не понимают ее полностью.Он также предоставляет поддержка возможных дистанционных студентов.
  • Учитель может тратить меньше времени на рутинный разбор примеров во время лекции и уделите больше времени интерактивной и творческой работе с ученики. Нет необходимости следить за тем, чтобы большинство учеников «усвоили» примеры. поскольку у них у всех будет второй шанс. Мы ожидаем выхода инструкторских время, которое в настоящее время тратится на анализ примеров во время чтения и в офисе часов.
  • База данных примеров будет служить ресурсом «сообщества» для всех инструкторов. целевого курса. Время, необходимое преподавателям для подготовки качественная лекция по этому курсу значительно сокращается.
  • База данных примеров, разработанная и структурированная опытным преподавателем. может помочь менее опытным инструкторам лучше преподавать курс
  • Благодаря тому, что инструмент не зависит от проблем, WebEx может применяться в контексте преподавания различных курсов, связанных с программированием.

Blackboard (1999) CourseInfo 1.5, Blackboard Inc. http://company.blackboard.com/CourseInfo/index.html (по состоянию на 21 августа 1999 г.)

Брусиловский П., Эклунд Дж. И Шварц Э. (1998) Интернет-образование для всех: инструмент для разработки адаптивного программного обеспечения. Компьютерные сети и системы ISDN (Материалы седьмой Международной конференции по всемирной паутине, 14-18 апреля 1998 г.) 30 (1-7), 291-300.

Брусиловский П., Вебер Г.(1996) Коллективный выбор примеров в интеллектуальной среде программирования на основе примеров. В: DC Edelson and EA Domeshek (ред.) Proceedings of International Conference on Learning Sciences, ICLS’96, Evanston, IL, USA, AACE, pp. 357-362, http://www.contrib.andrew.cmu.edu /~plb/papers/icls96.html.

Брусиловский, П. Л. (1992) Интеллектуальный наставник, среда и руководство для вводного программирования. Международные технологии образования и обучения 29 (1), 26-34.

Буроу Р. и Вебер Г. (1996) Пример объяснения в обучающей среде. В: К. Фрассон, Г. Готье и А. Лесголд (ред.) Intelligent Tutoring Systems . Конспект лекций по информатике, Vol. 1086, (Труды Третьей Международной конференции по интеллектуальным системам обучения, ITS-96, Монреаль, 12-14 июня 1996 г.) Берлин: Springer Verlag, стр. 457-465.

Фарис, Дж. М. и Райзер, Б. Дж. (1988) Доступ к предыдущим решениям и их использование в ситуации решения проблем.В: Материалы десятой ежегодной конференции Общества когнитивных наук, Монреаль, 1988 г., Lawrence Erlbaum Associates, стр. 433-439.

Guzdial, M. (1995) Программно-реализованные строительные леса для облегчения программирования для обучения естественным наукам. Интерактивные среды обучения 4 (1), 1-44.

Хоманн, Л., Гуздиал, М., Солоуэй, Э. (1992) SODA: среда автоматизированного проектирования для выполнения и обучения проектированию программного обеспечения. В: I. Tomek (ed.) Proceedings of 4th International Conference, ICCAL’92, Berlin, Wolfville, Canada, 17-20 июня 1992 г. , Springer-Verlag, pp.307-318.

Келли, А. и Поль, И. (1995) C по Dissection: Основы программирования на языке C. Нью-Йорк: Эддисон-Уэсли.

Линн, М. С. (1992a) Могут ли объяснения экспертов помочь студентам развить навыки разработки программ. Int. J. Человеко-машинные исследования, Международный журнал по исследованиям человека и машины 36, 511-551.

Линн, М. С. (1992b) Как инструменты гипермедиа могут помочь в обучении программированию. Учить. Instr., Обучение и обучение 2, 119-139.

Редмайлз, Д.F. (1993) Уменьшение вариативности работы программистов с помощью объясненных примеров. В: Proceedings of INTERCHI’93, New York, Amsterdam, 24-29 April 1993, ACM, pp. 67-73.

Вебер, Г. (1996) Индивидуальный подбор примеров в интеллектуальной обучающей среде. Журнал искусственного интеллекта в образовании 7 (1), 3-31.

EECS 590 — Расширенные языки программирования

Встречи

Учебник

Нет , но полезные варианты см. Ниже

Курс персонала

Ханна Поттер

Часы работы

Сайтов

Вкратце

Этот курс для выпускников разработан, чтобы познакомить вас с фундаментальными идеи, лежащие в основе разработки и анализа современных языков программирования.В конечном итоге вы должны понимать текущие исследования и применять методы здесь к вашим собственным проектам.

Курс состоит из трех широких тем:

  • Семантика
  • Тип Системы
  • Приложения для исследований

Первая часть этого курса посвящена семантике различные конструкции языка программирования (например, «что делает в то время как цикл действительно означает? «- это на самом деле намного интереснее чем кажется). Изучим конструкцию эксплуатационных семантика как способ формализации предполагаемого исполнения и реализация языков. Понятия и обозначения операционной семантики широко используются в современных исследованиях ФЛ. Мы рассмотрим аксиоматических семантика , которая полезна при разработке, а также проверке, программы. Аксиоматическая семантика лежит в основе недавних исследований в области формального проверка и поиск ошибок (например, код подтверждения и SLAM). Мы также покроет выполнимость теории по модулю, автоматическое доказательство теорем, DPLL (T) и доказательство проверка. Мы будем применять эти методы для императивных, функциональных и объектно-ориентированных языков.Хорошая дополнительная ссылка для этой части курса: Глинн Винскель Формальная семантика языков программирования .

Вторая часть этого курса охватывает методы, используемые при изучении Системы типа для языков программирования. Мы начнем наше исследование с просто набранный лямбда исчисление. Мы также рассмотрим более сложные понятия, такие как типы для императивные особенности и исключения, параметрический полиморфизм, экзистенциальный типы для использования в абстракциях и модульных системах, а также зависимые типы. Тип системы изобилуют современными исследованиями PL и составляют подавляющее большинство «Греческий буквы «найдены в бумагах. Понимание и представление новых Типовые системы имеют решающее значение при работе в этой области. А хорошим дополнительным справочником для этой части курса является книга Джона Митчелла Основы языков программирования .

Последняя часть курса охватывает специальных тем, взятых из недавних исследования по таким темам, как параллелизм, локализация сбоев или программа ремонт.Список тем лекций также служит краткое изложение основных концепций курса.

Предварительные условия для этого курса: программирование, и математический опыт. Идеальный опыт программирования — это компиляторы бакалавриата. курс, а также практическое знакомство с несколькими различными программами языки, такие как C, ML, LISP и Java. Идеальный математический опыт — это знание математической логики и умение строить строгие доказательства (в частности, с помощью структурных индукция). Эти предпосылки не строгие. Однако ваш желание познакомиться с этим материалом очень важно . В прошлом небольшое количество студентов смогли завершить курс.

Примечательно, что курс языков программирования для бакалавриата — это , а не . требуется. Студенты без соответствующего уровня бакалавриата должны быть готовы потратить дополнительное время на этот курс и обратиться за помощью и дополнительные ресурсы самостоятельно.

Вы будете нести ответственность за:

  • Домашние задания.Шесть «математические» или «формальные» наборы задач. Последнее задание имеет нетривиальный компонент реализации и включает в себя применение анализа к реальный код.
  • Чтение викторин. Хотя это, строго говоря, не семинарский курс, будет для каждой лекции отводится требуемый раздел статьи или книги. Чтение викторины будут задействованы.
    • Тесты по чтению обычно запускаются с помощью шкалы оценок. Чтение тесты обычно доступны утром в течение дня чтение необходимо. Обычно у вас будет большое окно времени (например, 48 часов), в течение которого вы можете начать тест по чтению. Как только вы начнете тест на чтение, как правило, у вас будет меньше времени (например, 5 минут), чтобы пройти тест. Другими словами, вы Вы можете выбрать любое 5-минутное окно в течение 48 часов, чтобы пройти тест. В мы обычно позволяем дополнительное время (например, вы можете использовать 10 минут вместо 5) в качестве приспособления для дистанционного обучения (например, сетевой проблемы) или SSD.В результате этих больших льготных периодов нам будет сложно сделать какие-либо дополнительные условия для студенты, пропускающие викторины.
  • Участие и экспертная оценка . Мы будем отслеживать участие во время удаленных (Zoom) лекций. К тому же, потому что одна из целей класса — оценить использование формализмов в этом область исследования, мы рассмотрим и оценим домашние задания в разделах обсуждения. За каждое задание вы несете ответственность для представления оценки работы коллеги.

Результат поставки, опоздавший на часов на часов, снизился на ( ч * 2)%. Мы следуем Политика академической и профессиональной честности Rackham. Мы не можем принять отправку задания после того, как соответствующий ключ ответа был обсуждали в классе.

Студенты, которые находятся на расстоянии более одного часового пояса, могут не иметь возможности посещать лекции и демонстрировать участие в обычном порядке. Ученики с формами U-M SSD должны присутствовать те как можно быстрее.Пока нет экзаменов или аналогичных по времени заданий, мы будем работать, чтобы найти справедливые способы поддержать студентов, выполняющих материал.

Классификация выглядит следующим образом:

  • 5% Домашнее задание 0
  • 10% Домашнее задание 1
  • 10% Домашнее задание 2
  • 10% Домашнее задание 3
  • 10% Домашнее задание 4
  • 10% Домашнее задание 5
  • 20% Домашнее задание 6
  • 10% тесты на понимание прочитанного
  • 5% Участие и профессионализм
  • 10% экспертная оценка

Запросы на повторную оценку экзаменов, заданий или письменных заданий должны быть получено в течение одной недели после получения вами результата. Все переоценить запросы должны быть сделаны через шкалу оценок . Когда мы обновляем задание мы очень внимательно рассмотрим на правильность: это возможно, что после обновления вы получите на баллов меньше, чем на перед обновлением. К повторным сортам следует относиться с осторожностью и использовать только когда оценщики сделали явную ошибку при оценке вашей работы.

Если вы пропустите крайний срок выполнения задания или проводите время в классе, мы можем очень снисходительно относится к наращиванию или макияжу, но только , если вы предоставите документация .Например, для смерти или тяжелой утраты копия некролога или похоронной программы достаточно; по болезни или травме, любой вроде справки от врача достаточно. Эта политика следует политике других профессора кафедры. Вы можете отправить TA по электронной почте сопутствующая документация.

Все материалы курса, представленные для оценки, должны быть сданы до полуночи. последняя дата, указанная в программе курса.

Студенты, добавившие курс с опозданием, по-прежнему несут ответственность за все задания. в обычный срок.Если вы заинтересованы в прохождении курса и в списке ожидания вы должны выполнить все задания как обычно.

В настоящее время нет планов по увеличению числа учащихся сверх установленного на курс указанная мощность. Однако студенты часто бросают курсы после первых нескольких занятий. лекции или около первого задания.

Всем студентам в списке ожидания будет предоставлен полный доступ к курсу. форум, лекции, выставление оценок и обсуждения.

Студенты часто испытывают натянутые отношения, повышенное беспокойство, проблемы с алкоголем или наркотиками, подавленность, трудности с концентрацией внимания, семья проблемы или отсутствие мотивации.Студент проблемы с психическим здоровьем довольно распространены, но мы не всегда говорим о их. Мичиганский университет стремится к улучшению психического здоровья и благополучия своих студентов. Если вы или кто-то из ваших знакомых чувствуете себя подавленным, подавленным или нужным поддержка, конфиденциальная психическая медицинские услуги доступны на территории кампуса.

Вам могут быть полезны следующие дополнительные ресурсы:

Ваша классная работа может быть использована в исследовательских целях. Например, мы можем использовать анонимные студенческие задания для разработки алгоритмов или создания инструментов для помогите программистам.Любой студент, желающий отказаться от участия, может связаться с инструктор или помощник учителя, чтобы сделать это после окончательной оценки выпущен. Это никак не влияет на вашу оценку.

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

задач по программированию аудио

задач по программированию аудио

В лучшем случае информатика — это захватывающая смесь программирования, математика и решение проблем.Этот курс познакомит с интересное разнообразие предметов по программированию, алгоритмам и дискретная математика через возникшие головоломки и задачи в Международной олимпиаде по программированию ACM и подобных местах.

Эти аудиолекции взяты из моего курса Проблемы программирования преподавал в Стоуни-Брук и на основе книги Задачи по программированию: Учебное пособие по программированию от Стивен С. Скиена и Мигель А. Ревилья, Springer-Verlag, Нью-Йорк, 2003.

Доступен полный видеоролик лекции из версии курса 2009 г. онлайн! Вероятно, вы хотите, чтобы это было вместо страницы, которую вы просматриваете.

Конспекты лекций и аудиозаписи для версии курса 2003 года:

  • Неделя 1 — Начало работы в html и PDF. Аудио для первый и вторые лекции.
  • Неделя 2 — структур данных в html и PDF. Аудио для первый и вторые лекции.
  • Неделя 3 — струн дюймов html и PDF.Аудио для первый и вторые лекции.
  • Неделя 4 — Сортировка в html и PDF. Аудио для первая лекция (второй снег выпал).
  • Неделя 5 — Арифметика в html и PDF. Аудио для первый и вторые лекции.
  • Неделя 6 — Комбинаторика в html и PDF. Аудио для первый и вторые лекции.
  • Неделя 7 — Теория чисел в html и PDF. Аудио для первый и вторые лекции.
  • Неделя 8 — Возврат в html и PDF.Аудио для первый и вторые лекции.
  • Неделя 9 — Обход графика в html и PDF. Аудио для первый лекция (вторая лекция проиграна).
  • Неделя 10 — Графические алгоритмы в html и PDF. Аудио для первый лекция (вторая лекция потеряна — моя дочь В тот день родилась Эбби!).
  • Неделя 11 — Динамическое программирование в html и PDF. Аудио для первый и вторые лекции.
  • Неделя 12 — Сетки в html и PDF. Аудио лекций недоступно.
  • Неделя 13 — Геометрия в html и PDF. Аудио для первый и вторые лекции.
  • Неделя 14 — Вычислительная геометрия в html и PDF. Аудио для первый и вторые лекции.
  • Обзор проблемы — Аудио для первый и вторые лекции.

Введение в программирование: начните свою карьеру в области программного обеспечения

Вы когда-нибудь говорили себе: «Я бы хотел научиться программированию, но с чего мне начать?»

Существует огромное количество вариантов, доступных для тех, кто хочет учиться. Введение в программирование призвано дать вам базовые навыки, которые окажутся важными для любого типа программирования, которым вы хотите заниматься. Вы научитесь кодировать веб-страницы, создавать мобильные приложения и использовать внешние источники данных. (Мобильные устройства рассматриваются на Уровне II курса)

Этот курс, который включает видеолекции, лабораторные упражнения и полный программный код, подготовит вас к работе начального уровня в разработке — или просто поможет вам освоить код и стать более продвинутым. изучение.

По мере того, как вы создаете портфель навыков, вы также создадите портфель завершенных проектов, которые можно использовать для демонстрации ваших новых навыков.

На уровне I курса мы фокусируемся на основах — вещах, которые все разработчики должны знать, чтобы добиться успеха. С каждой прохождением главы курса вы будете изучать новые навыки и демонстрировать их в лабораторных упражнениях.

Технологии
Эта программа познакомит участников со всеми следующими технологиями:

  • HTML5 и CSS: создание визуальных аспектов веб-сайтов и мобильных приложений с помощью этой языковой пары

  • Python: вы узнаете основы кодирования и логики программирования с использованием языка программирования Python

На уровне II курса мы рассмотрим мобильные технологии, Javascript, jQuery и SQL.

Мы создали введение в программирование для вас
Если вы подумывали научиться программировать — или пробовали раньше, но это не помогло, — то этот курс для вас. Мы не обучаем произвольному языку программирования, а вместо этого закладываем профессиональную основу с навыками, которые необходимы сегодняшним программистам .

Этот курс, состоящий из лекции и занятий, разработан не только для того, чтобы познакомить вас с важными темами для начинающих программистов, но и для того, чтобы помочь вам сохранить информацию и сразу же использовать ее.

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

Проекты
Вы узнаете на практике в программе Введение в программирование. Этот курс включает в себя несколько проектов, которые помогут вам понять и запомнить, что вы изучаете. Вот лишь некоторые из проектов, которые вы завершите:

Веб-сайт обзора ресторанов: публикуйте обзоры любимых ресторанов на своем собственном сайте
MP3-плеер: воспроизводите вашу любимую музыку
Веб-сайт с адаптивным дизайном: заставьте веб-сайт работать на многоразмерные экраны
Калькулятор интереса: выясните, сколько времени вам понадобится, чтобы разбогатеть
Magic 8 Ball: принимать действительно важные решения
Проект веб-сервисов: получать данные из внешнего источника — они важны для многих приложений

Более 500 000 студентов LearnToProgram
Вы будете среди нашего сообщества, состоящего из более чем 500 000 студентов, которые изучили программирование на одном из наших курсов LearnToProgram.Имея более 250 000 учеников только в Udemy, мы узнали кое-что об обучении людей — и эти уроки вводятся во Введение в программирование.