Задания Оценки Ведомость Материалы

Ведомость и материалы для обучения

Литература по Си

Керниган и Ритчи, Язык программирования Си.

Памятка по работе в консоли.

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

Дополнительные занятия проходят во вторник и среду, c 15:30 до 17:30.

Почта преподавателя: valeriy.fedotov [...] gmail.com

Задачник по программированию.

Отличная шпаргалка по питону. На английском языке.

Результаты пробного ЕГЭ

PDF с результатами

Экзаменационные задания

Новые добавленные задания выделены наклонным шрифтом.

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

Список в процессе наполнения, обновление от 2 апреля 2012:

PyQt, работа с графикой:

PyQt:

Физика:

Игры (PyQt и графика):

Текстовые игры:

Работа с сетью:

Прикладные библиотеки:

Интерпретаторы:

Утилиты:

Сайты:

Для энтузиастов:

Задание 42

Написать RSS-клиент. Клиент должен уметь:

Так как есть много разных стандартов RSS, можно обойтись только работой с лентами с news.yandex.ru.

Клиент должен работать как скрипт CGI.

Задание 41, многопользовательский твиттер

Аналогично предыдущему заданию, но теперь пользователей может быть много.

Задание 40, твиттер на одного пользователя

Добавить в задание 39 авторизацию для одного пользователя. Смотреть сообщения на сайте могут все, а писать только один человек. Авторизацию реализовать через Cookies.

Задание 39, чирикалка

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

Подробное описание особенностей работы CGI на нашем сервере и примечания к выполнению задания здесь

Программа 38, "движок блога"

Необходимо написать простейший движок блога, который по файлам в некоторой директории будет генерировать html-файл, который можно просмотреть в браузере. Правила генерации html-страницы:

HTML-файл, написанный на уроке.

А так он выглядит в браузере.

Задание 37, бильярд

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

$$ \beta = \frac{\pi}{2} - arccos \left( \frac{ (\mathbf{r}_{j} - \mathbf{r}_{i}) \cdot \mathbf{v}_{i}^{*} } { \left| \mathbf{r}_{j} - \mathbf{r}_{i} \right| \left| \mathbf{v}_{i}^{*} \right| } \right) $$

На уроке забыли про \( \pi / 2 \).

Задание 36, планета и спутник

С помощью моделирования методом Эйлера-Кромера или алгоритма с перешагиванием промоделировать движение двух лёгких тел вокруг массивного тела. Массивное тело можно считать неподвижным и находящимся в центре координат.

Чтобы написать программу, нужно изменить только метод makeTrajectory в базовой программе. По сравнению с той версией, что была на уроке, добавлено значение по умолчанию 1 во все поля ввода и рисование траекторий переписано без "магии".

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

Задание 35

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

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

формулы к заданию

Задание 34, Бассейны Ньютона

Нарисовать фрактал Ньютона. Фрактал получается решением уравнения \( z^{k} - a = 0 \) на множестве комплексных чисел. Решая уравнение методом Ньютона (он работает и для комплексных функций), $$ z_{i+1} = z_{i} - \frac{f(z_{i})}{f'(z_{i})}, $$ подставив \(f(z) = z^{k} - a\), получим $$ z_{i+1} = z_{i} - \frac{z_{i}^{k} - a}{kz_{i}^{k-1}} $$ Выполняя такие действия для набора начальных точек из некоторого прямоугольника из W*H точек, центрированного относительно начала комплексных координат, где W -- ширина окна приложения, а H -- его высота, и выполнив для каждой точки по 5-6 итераций метода Ньютона, можно определить, к какому из комплексных коней исходного уравнения мы подошли наиболее близко. После этого остаётся нарисовать точку цветом, соответствующим этому корню.

import cmath  # Модуль для работы с комплексными числами, имена функций аналогичны
              # именам из math

z = сomplex(1,2)  # комплексное число 1+2i

Олимпиада "Курчатов"

Традиционная курчатовская олимпиада проходит в этом году в два этапа: интернет-отбор и очный тур.

Цитата с сайта олимпиады ( http://olimpiadakurchatov.ru/internet_etap ):

Интернет-этап олимпиады «Курчатов» в 2012/2013 учебном году будет проводиться в декабре 2012–январе 2013 года и будет включать в себя конкурсы по математике, физике, информатике, химии и биологии, а также межпредметный конкурс и конкурс по истории науки. К участию допускаются ученики всех классов. Для участия необходимо зарегистрироваться на портале Единой системы регистрации http://reg.olimpiada.ru/.

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

Интернет-этап будет проводиться с декабря 2012 года по январь 2013 года. Победители будут приглашены к участию в очных турах. Победители интернет-этапа в выпускных классах по решению Оргкомитетов могут быть приглашены на финальные туры олимпиад, входящих в Перечень (иными словами, олимпиад, по результатам которых ВУЗы предоставляют льготы при поступлении).

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

Олимпиада продлена до 23:59 9 января

Задание 33, Ковёр Серпинского

Пример 1.

Пример 2.

Пример 3.

Пример 4.

Пример 5.

Пример c циферблатом.

Примеры взяты с сайта http://zetcode.com/tutorials/pyqt4/ . Там же можно найти больше примеров на другие разделы PyQt4.

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

Подход к написанию программы на питоне следующий: нужна рекурсивная функция или метод, принимающая объект класса QPainter, настроенный на рисование на виджете, уровень вложенности level (целое число), и четыре числа, описывающие текущий квадрат или прямоугольник. Следуя соглашениям, принятым в библиотеке PyQt, выберем для этого координаты верхнего левого угла (x0, y0), ширину w0 и высоту h0. Затем, если уровень вложенности равен максимальному (4 или 5), нужно нарисовать квадрат, соответствующий аргументам функции. Иначе, нужно пройтись по 8 непустым квадратам и вызывать рекурсивную функцию для этих квадратов и уровня вложенности level + 1.

Программу лучше всего писать, модернизируя пример 4 или 5. Чтобы при вызове метода drawRect для объекта qp класса QPainter, нужно сначала задать стиль закрашивания фигур с помощью qp.setBrush(QtCore.Qt.red) .

Задание 32, регулярные выражения

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

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

Задание 31

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

Для векторов должны быть реализованы специальные методы:

Для матриц:

Для комплексных чисел:

Окружная олимпиада

В воскресенье 2 декабря состоится окружная олимпиада по информатике. Потренироваться на задачах 2009, 2010, 2011 года можно тут: http://olympiads.ru/moscow/2012-13/okrug/training.shtml

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

Задание 30. Записная книжка не сдаётся.

Необходимо написать записную книжку с использованием объектно-ориентированного программирования. Программа должна содержать определения следующих классов:

методы: конструктор, загрузить записную книжку из файла, сохранить в файл, вывести все записи, найти запись по телефону, найти запись по имени, удалить запись по индексу)

Пример с животными

Более продвинутый вариант того же примера.

Задание 29, записная книжка без ошибок

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

Добавить в записную книжку загрузку и сохранение из/в файл. Для него также обрабатывать ошибки.

Задание 28, стековый язык программирования

Добавив к калькулятору, вычисляющему выражения в польской нотации несколько инструкций для управления потоком вычислений (if, for, while), можно получить настоящий язык программирования. Такие ЯП называются стековыми, см., например, Forth и Factor.

Операторы

К калькулятору надо добавить следующие операторы:

  • var <имя> ...<инструкции>... end

    Присваивает переменной с именем <имя> значение, получившееся на вершине стека (т.е. последнее добавленное) после вычисления <инструкций> в обратной польской нотации. Если переменной с именем x не существует, создать её.

    Пример:

    Присвоить x результат операции 2 * 2:
    var x 2 2 * end
    Увеличить x на единицу:
    var x x 1 + end
    
  • fun <имя> ( ...<аргументы>... ) ...<инструкции>... еnd

    Создаёт функцию с именем <имя>, которая выполняет <инструкции>, со значениями аргументов, переданными во время вызова функции

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

  • if ...<выражение>... then ...<главная ветвь>... else ...<альтернативная ветвь>... end

    Всё стандартно, как в старом добром паскале. then и еlse здесь нужны для того, чтобы можно было отделить <выражение> от <главной ветви> и <альтернативной ветви>. Сначала вычисляется <выражение>, затем оператор if извлекает значение из вершины стека и, если оно истинно, выполняет <главную ветвь>, иначе выполняет <альтернативную ветвь>.

  • for <имя счётчика> <начало> <конец> <шаг> ...<инструкции>... end

    Поскольку мы все знаем, что такое for, сразу перейдём к примеру:

    for i a0 a1 step i print end
    

    полностью аналогично следующему циклу на питоне:

    for i in range(a0, a1, step):
        print(i)
    

    Сначала оператор while вычисляет <выражение>, затем извлекает результат из вершины стека и, если оно истинно, выполняет <инструкции>. Как работает оператор while дальше, вы уже догадались.

Функции

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

  • print

    a print распечатает a.

  • dup

    a dup сначала удалит a со стека, затем дважды положит его на стек.

  • < > <= >= == !=

    a b op, где op -- одна из указанных функций, эквивалентно a op b в математике.

Подробности реализации

Имена функций и переменных хранятся в компиляторах или интерпретаторах в таблицах имён. Таблица имён представляет собой хэш-таблицу, в которой имени объекта соответствует его тип (то есть, переменная или функция) и содержание. Для переменной хранится её значение, для функции — её код, количество аргументов и прочее.

В нашем случае можно описывать значения хеш-таблицы списками или кортежами вида
['var', 1]  # Переменная со значением 1. Имя переменной хранится не здесь,
            # а в ключе хеш-таблицы.
['user_fun', ['x', 'y'], ['x', 'y', +]]
       # пользовательская функция, принимает два аргумента,
       # которые внутри функции будут видны как x и y.
       # Внутри себя она кладёт на свой персональный стек x и y,
       # и из функции возвращается верхнее значение стека, которое кладётся
       # на вершину стека того кода, который её вызывал.
['internal_fun', <ссылка на функцию на питоне>]
       # встоенная функция вашего языка, например +, -, /, * и т.д.
       # будет вызвана функция на питоне, которую вы написали для пользователя,
       # которая возьмёт со стека нужное ей количество аргументов и выполнит с
       # ними требуемые операции.

Вложенные таблицы имён

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

Чтобы реализовать механизм областей видимости, который позволит каждой функции иметь свои локальные переменные, нужно завести стек таблиц имён. В начале в стеке будет лежать одна глобальная таблица имён с именами функций и переменных, определённых на "верхнем уровне" программы. Затем, каждый раз при вызове функции, в стек будет добавляться новая таблица имён, в которой будут содержаться только значения аргументов функции. При завершении функции с вершины стека нужно удалить одну таблицу имён. Понятно, что если текущей функции потребуется значение переменной "x", то начинать поиск значения надо с вершины стека, в которой хранится таблица имён этой функции, и нисходить до основания стека, в котором лежит глобальная таблица имён. Если переменная не найдена ни в одной из таблиц, следует выдать ошибку.

Хорошая статья на английском про написание интерпретатора языка Scheme на питоне от Питера Норвига на английском языке: http://norvig.com/lispy.html Рьяно рекомендуется к прочтению.

Задание 27, калькулятор выражений в обратной польской нотации

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

2 2 *           => 4

2 1 + 10 1 - * 8 +        => 35

Алгоритм смотрите в тетради. Распишу его здесь, когда будет время.

Школьная олимпиада 2012

Решали муниципальный тур новосибирской олимпиады за 2009 год.

Текст задания

Те, кто не присутствовал, но хочет написать олимпиаду, может засечь на часах два часа, написать её и прислать мне на почту.

Задание 26, записная книжка наносит ответный удар

Переписать записную книжку из задания 16 на питоне. Сохранение и загрузку из файла можно не реализовывать.

Задание 25, знакомство со строками

Пользователь вводит имя файла с клавиатуры. Программа открывает подсчитывает:

Заготовка для построчной работы с файлом:

f = open(input("Введите имя файла: "), "r")
for line in f:
    # Здесь line по очереди будет содержать в себе
    # каждую строку файла f с '\n' на конце

    # ...
f.close()

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

  1. Пользователь вводит строку, посчитать количество слов в ней.

  2. Пользователь вводит основание системы исчисления base (считываем как целое число) и число в этой системе (считываем как строку). Далее необходимо эту строку вручную преобразовать из системы исчисления base в десятичную систему счисления. Для проверки: число ff в шестнадцатеричной системе исчисления равно 255, число 101 в двоичной -- пяти.

Задание 23, бисекция и НОД

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

файл с демонстрацией работы циклов и if-ов

Задание 22, экспонента на питоне

Написать вычисление фукнции e ** x как суммы ряда. Пользователь вводит x и число членов ряда.

Объявление о дополнительных занятиях

Дополнительные занятия пройдут 8, 15, 18 июня. Сбор на проходной в 9:45.

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

Задание 21, хеш-таблица

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

Про хеш-таблицы

Задание 20, шифрование

Написать программу для шифрования файлов с помощью перестановки бит. Перестановка для каждого байта одинаковая и задаётся из коммандной строки. Перестановка вида

57420361

означает, что значение 0-го байта перейдёт в первый байт, 1-го -- в 6-ой, 2-го в 3-ий, 4-го в 0-ой и т.д.

Програма должна принимать данные от пользователя через аргументы командной строки и иметь следующий формат аргументов:

./proga <MODE> <CYPHER> <IN> <OUT>
   <MODE> -- режим работы, encode для шифрования, decode для расшифровки.
   <CYPHER> -- перестановка
   <IN> -- имя входного файла
   <OUT> -- имя выходного (зашифроманного или расшифрованного) файла.

Пример

./proga edcode 57420361 secret_data.txt encoded_secret_data.txt

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

Программа 19, бинарные деревья

Переписать (или написать с нуля) программу 12 для посчёта кратности слов, но список слов хранить не в линейном массиве, а в виде бинарного дерева.

Примечание. Программа есть в Кернигане и Ритчи, но если будете брать оттуда, прочитайте окружающий текст.

Задание 18

Рекурсивный обход доски конём. Конь обходит доску n * n, начиная из клетки (x0, y0). n, x0, y0 вводятся с клавиатуры. Конь должен обойти все клетки доски, побывав в каждой из них только по одному разу.

Возможно написать функцию в двух вариантах:

void horses(int n, int k, int *board);

, где n -- размер доски, k -- количество уже заполненных (в данном узле рекурсивного дерева) клеток доски, board -- массив размера n * n, в элементе board[y * n + x] хранится номер хода, на котором конь пришёл в клетку (x, y), или -1, если конь не заходил в эту клетку.

void horses(int n, int k, int *x, int *y);

, где n -- размер доски, k -- количество уже заполненных (в данном узле рекурсивного дерева) клеток доски, x -- массив размера n, в элементе x[i] хранится x-координата i-го хода конём, в элементе y[i] -- хранится y-координата i-го хода конём.

Задание 17

Переписать программу 16 так, чтобы сохранить весь её функционал, но разнести код на два файла. В файле с именем book.с должны лежать функции для работы с записной книжкой, в файле book.h -- прототипы этих функций. Файл book.h должен подключаться из main.c, который должен работать с записной книжкой только с помощью функций из main.c.

Для компиляции надо написать makefile. Впрочем, это можно будет сделать уже после того, как программа написана и отлажена, до этого программу компилируйте так:

gcc main.c book.c -o proga17

Задание 16

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

Пункты меню.

  1. «Создать новую книгу». Программа освобождает все ресурсы, связанные с текущей телефонной книгой, запрашивает у пользователя значение максимального числа записей и создает новую, пустую книгу.

  2. «Просмотреть содержимое». Программа выводит содержимое всех непустых записей и их полное количество. Каждая запись должна иметь свой уникальный номер по которому ее можно распознать.

  3. «Добавить запись». Программа спрашивает пользователя о имени и телефоне объекта и создает новую запись, если это возможно.

  4. «Удалить запись». Программа требует ввода номера записи, которая будет удалена, и проводит процедуру удаления записи.

  5. «Поиск по имени». Пользователь вводит имя объекта, а программа в ответ выводит все записи, у которых имена объектов совпадают с введенным пользователем.

  6. «Поиск по номеру телефона». То же, что и предыдущий пункт, только критерием поиска является телефон объекта.

  7. «Сохранить книгу в файл». Программа запрашивает у пользователя имя файла и сохраняет текущее содержимое телефонной книги в указанный файл.

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

  9. «Выход».

Задание 15

Написать программу для нахождения числа Пи методом Монте-Карло через подсчёт площади еденичного круга.

Задание 14

Написать программу, которая должна находить

  1. корень уравнения методом хорд;

  2. корень уравнения методом Ньютона;

  3. минимум функции методом золотого сечения.

Каждый метод должен быть выделен в отдельную фунцию и принимать как аргумент обрабатываемую функцию (в случае метода Ньютона две -- математическую функию и прозводную).

Задание 13

Написать программу, которая работает с аргументами командной строки. Программа должна принимать следующие ключи и аргументы:

./proga --search pattern str1 ... strN
./proga --split pattern str1 ... strN
./proga --subst pattern substitution str1 ... strN

При передаче ключа --search программа ищет текстовый шаблон pattern в строках str1 ... strN и выводит те из них, в которых шаблон встречается:

./proga --search abc 12abc3 abd abc jabcdef ababab
12abc3
abc
jabcdef

При передаче ключа --split программа "разбивает" строки по шаблону pattern, заменяя его пробелом. При этом, если шаблон встречается в начале или конце строки, его надо просто удалить без замены на пробел.

./proga --split pattern bc abc bcadef abcdef bcabcbbccbc
a
adef
a def
a b c

При передаче ключа --subst программа должна заменять pattern на substitution в каждой из строк.

./proga --subst x AB xyz x abcxxz
AByz
AB
abcABABz

Задание 12

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

Задание 11, строковые функции.

Написать свои реализации функций для работы со строками из стандартной библиотеки Си (определены в заголовочном файле string.h):

char *strcpy(char *dest, char *src);
char *strncpy(char *dest, char *src, int n);
char *strcat(char *dest, char *src);
char *strncat(char *dest, char *src, size_t n);
int strcmp(char *s1, char *s2);
int strncmp(char *s1, char *s2, int n);
int strlen(char *s);
void *memcpy(char *dest, char *src, size_t n);

Все функции должны быть реализованы в двух вариантах: с работой с указателями как с массивами (string[i]), и с инкрементированием указателей (x = *string; string++;).

Подробности того, что делают эти функции, можно посмотреть:

  1. в лекциях

  2. в справочнике по стандартной библиотеке Си в Кернигане и Ритчи.

  3. по адресу http://www.opennet.ru/man.shtml , введя в строке поиска

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

Задание 10

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

Пример для N == 3

   1
  1 1
 1 2 1
1 3 3 1

Задание 9

Программа сортирует аккумуляторы. В коде программы должны быть заданы некоторые тестовые значения тока I и напряжения U для 4 аккумуляторов. Пользователя надо спросить, хочет ли он ввести свои значения этих параметров или оставить тестовые. Затем предложить 3 варианта: 1) Сортировка по U. 2) Сортировка по I. 3) Сортировка по мощности P=UI.

Сортировка должна быть описана в отдельной функции и иметь следующую сигнатуру (набор аргументов):

// Сортировка по напряжению.
void sort_by_U(double *I1, double *U1, double *I2, double *U2,
               double *I3, double *U3, double *I4, double *U4)
{
     ...
}

Аналогично для функции сортировки по мощность

Задание 8

Написать программу (или две программы), которые должны:

1) Спрашивать у пользователя имена входного и выходного файла. С помощью fgetc пересчитывать во входном файле строки, слова и символы. Результат выводить в выходной файл с помощью fprintf.

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

Задание 7

Написать программу (или программы) для заполнения массива

  1. Змейкой:

 0  1  2  3  4  5
11 10  9  8  7  6
12 13 14 15 16 17
23 22 21 20 19 18
24 25 26 27 28 29
35 34 33 32 31 30
36 37 38 39 40 41
  1. По спирали:

 0  1  2  3  4  5
21 22 23 24 25  6
20 35 36 37 26  7
19 34 41 38 27  8
18 33 40 39 28  9
17 32 31 30 29 10
16 15 14 13 12 11
  1. Зигзагом:

 0  1  5  6 14 15
 2  4  7 13 16 26
 3  8 12 17 25 27
 9 11 18 24 28 35
10 19 23 29 34 36
20 22 30 33 37 40
21 31 32 38 39 41

Задание 6

Написать программу для вычисления exp(x), sin(x), cos(x) с помощью разложения в ряд Тейлора в нуле. Программа должна работать двуми спобобами:

1) Если пользователь вводит 1, то программа просит его ввести x и N, где x -- аргумент ряда, N -- число членов ряда в сумме. 2) Если пользователь вводит 2, то программа просит его ввести x и delta, и суммирует ряд до тех пор, пока текущий член ряда не станет меньше delta.

Задание 5

Программа считвает у пользователя числа A, B, N и выводит результат интегрирования от A до B функции sin(x)

  1. Методом средних прямоугольников.

  2. Методом трапеций.

  3. Методом Симсона.

Во всех методах N -- число подотрезков, на которое разбивается отрезок [A, B].

Чтобы проверить, правильно ли работает программа, можно использовать тождество

pi / 2
   /
   | sin(x) dx = 1
   /
   0

Задание 4

Программа считывает со стандартного ввода строку в массив, выводит количество слов в ней, количество английских гласных, английских согласных, длину строки и печатает саму строку.

Задание 3

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

Программа должна спрашивать у пользователя номер дейтвия от 1 до 5.

1. Добавить число в массив (первоначально он пуст). При добавлении массива по индексу i все элементы, которые стояли по индексу i и далее, должны быть сдвинуты. 2. Удалить число из массива, сдвинув влево все числа справа от удалённого так, чтобы заполнить пустое место. 3. Найти число в массиве. Пользователь вводит некоторое число y и программа выводит наименьший индекс i, такой что x[i] == y. Если такого числа в массиве нет, программа должна сказать, что оно не найдено. 4. Отсортировать массив пузырьковой сортировкой. 5. Выход.

Задание 2

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

Задание 1

Написать программу, в цикле считывающую у пользователя число x и выводящую x!, x!!, сумму текущего и всех предыдущих введённых чисел и их прозведение. При вводе отрицателького числа x программа говорит "Bye" и завершается.

Пример:

Vvedite x: 5
5! = 120, 5!! = 15, sum = 5, product = 5
Vvedite x: 6
6! = 720, 6!! = 48, sum = 11, product = 30
Vvedite x: 4
4! = 24, 4!! = 8, sum = 19, product = 120
Vvedite x: 0
0! = 1, 0!! = 1, sum = 19, product = 0
Vvedite x: -1
Bye!