courses:programming:extra_tasks

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
courses:programming:extra_tasks [2017/04/07 09:08]
pro100kot
courses:programming:extra_tasks [2022/12/10 09:08] (current)
Line 1: Line 1:
 ====== Дополнительные задачи по программированию ====== ====== Дополнительные задачи по программированию ======
 +
 +===== Легенда =====
 +
 +  * <color green>​3</​color>​ -- простые задачи
 +  * <color blue>​4</​color>​ -- задачи средней сложности
 +  * <color red>​5</​color>​ -- более сложные задачи
 + 
 +===== Задачи =====
  
   * <color green>​3</​color>​ Написать программу,​ которая выводит строку "HELLO WORLD!"​ на консоль.   * <color green>​3</​color>​ Написать программу,​ которая выводит строку "HELLO WORLD!"​ на консоль.
    * На вход подаются два целых числа    * На вход подаются два целых числа
-     * если они > 0 вывести их сумму+     * если ​первое больше второго, ​вывести их сумму
      * если они равны, вывести 0      * если они равны, вывести 0
-     * если они < 0 вывести их произведение.+     * если ​второе больше первого, ​вывести их произведение.
   *  <color green>​3</​color>​ Найти и вывести максимальное число из трех целых чисел (числа вводятся с консоли).   *  <color green>​3</​color>​ Найти и вывести максимальное число из трех целых чисел (числа вводятся с консоли).
   *  <color green>​3</​color>​ Заполнить значениями,​ введенными с клавиатуры,​ одномерный массив целых чисел длиной 15 и вывести эти значения на консоль.   *  <color green>​3</​color>​ Заполнить значениями,​ введенными с клавиатуры,​ одномерный массив целых чисел длиной 15 и вывести эти значения на консоль.
Line 30: Line 38:
  
  
-Задачи на массивы (в задачах следует полагать,​ что на вход программе сначала подается количество элементов N, а после - N чисел. Массив создавать ​динамически.)+Задачи на массивы (в задачах следует полагать,​ что на вход программе сначала подается количество элементов N<=100, а после - N чисел. Массив создавать ​статически.)
   * <color green>​3</​color>​ Найти разницу между максимальным и минимальным числом в этом массиве.   * <color green>​3</​color>​ Найти разницу между максимальным и минимальным числом в этом массиве.
   * <color green>​3</​color>​ Найти сумму элементов массива,​ расположенных до минимального элемента   * <color green>​3</​color>​ Найти сумму элементов массива,​ расположенных до минимального элемента
Line 41: Line 49:
  
 Строки:​ Строки:​
-  * Определить длину строки,​ введенной пользователем. +  * <color green>​3</​color> ​Определить длину строки,​ введенной пользователем. 
-  * Найти разницу между числом строчных и прописных (заглавных) букв в строке. +  * <color blue>​4</​color> ​Найти разницу между числом строчных и прописных (заглавных) букв в строке. 
-  * Дана строка состоящая из букв и цифр (считается,​ что больше одной цифры подряд идти не может). Требуется посчитать сумму этих цифр. +  * <color blue>​4</​color> ​Дана строка состоящая из букв и цифр (считается,​ что больше одной цифры подряд идти не может). Требуется посчитать сумму этих цифр. 
-  * Дана строка состоящая из букв и цифр Требуется сформировать и вывести новую строку,​ состоящую только из этих цифр, разделенных пробелами. +  * <color blue>​4</​color> ​Дана строка состоящая из букв и цифр Требуется сформировать и вывести новую строку,​ состоящую только из этих цифр, разделенных пробелами. 
-  * Поменять местами слова в строке,​ состоящей из двух слов. +  * <color blue>​4</​color> ​Поменять местами слова в строке,​ состоящей из двух слов. 
-  * Вводится строка,​ представляющая собой некоторое слово. Требуется определить,​ является ли это слово палиндромом - одинаково читающимся в обоих направлениях. (Saippuakivikauppias - слово палиндром) +  * <color blue>​4</​color> ​Добавить в строку пробелы после знаков препинания,​ если они там отсутствуют. 
-  * Добавить в строку пробелы после знаков препинания,​ если они там отсутствуют. +  * <color blue>​4</​color> ​Требуется в произвольной строке удалить последнее слово, т.е. все символы после последнего пробела в строке. 
-  * Требуется в произвольной строке удалить последнее слово, т.е. все символы после последнего пробела в строке. +  * <color blue>​4</​color> ​Найти слово, стоящее в тексте под определенным номером,​ и вывести его первую букву. 
-  * Найти слово, стоящее в тексте под определенным номером,​ и вывести его первую букву. +  * <color blue>​4</​color> ​Подсчитать количество слов во введенной пользователем строке. Для упрощения задачи считать,​ что слова разделяются исключительно одним пробелом,​ а первый и последний символы строки не являются пробелами. 
-  * Подсчитать количество слов во введенной пользователем строке. Для упрощения задачи считать,​ что слова разделяются исключительно одним пробелом,​ а первый и последний символы строки не являются пробелами. +  * <color blue>​4</​color> ​Во введенной строке удалить все символы между первым и вторым вопросительным знаком. Сами знаки в троке оставить 
-  * Во введенной строке удалить все символы между первым и вторым вопросительным знаком. Сами знаки в троке оставить +  * <color blue>​4</​color> ​Дана строка. Определите процентное отношение строчных и прописных букв к общему числу символов в ней. 
-  * Дана строка. Определите процентное отношение строчных и прописных букв к общему числу символов в ней. +  * <color blue>​4</​color> ​Написать функцию int mystrlen(char *); вычисляющую длину переданной ей строки
-  * Написать функцию int mystrlen(char *); вычисляющую длину переданной ей строки+
  
-**Линейный односвязный список**+ 
 +  ​<color blue>​4</​color>​ На вход программе подается число n, х, а после - n целых чисел, являющиеся коэффициентами многочлена степени n. Коэффициенты заданы по убыванию степеней. Треуется вычислить и вывести на экран значение многочлена в точке х. 
 + 
 +**<color red>​5</​color>​ Встреча с Римлянами** 
 + 
 +Попав в 500 год до нашей эры, вы столкнулись с необходимостью перевести число, записанное арабскими цифрами в число, записанное [[https://​ru.wikipedia.org/​wiki/​%D0%A0%D0%B8%D0%BC%D1%81%D0%BA%D0%B8%D0%B5_%D1%86%D0%B8%D1%84%D1%80%D1%8B|римскими цифрами]] 
 + 
 +Напишите программу,​ которая переводит число (<=3000) из арабской записи в римскую. 
 + 
 +Примеры
 + 
 +1994 -> MCMXCIV 
 + 
 +123 -> CXXIII 
 + 
 + 
 + 
 +**<color red>​5</​color>​ Часы** 
 + 
 +Представьте обычные цифровые часы, время на которых отображается на 7-ми сегментных индикаторах с учетом ведущего нуля. Например,​ 9:30 на таких часах отображается так: 
 +{{courses:​programming:​screenshot_from_2017-03-07_11-03-10.png?​150|}} 
 + 
 +Числа отображатся следующим образом:​ 
 + 
 +{{courses:​programming:​screenshot_from_2017-03-07_11-03-22.png?​400|}} 
 + 
 +Требуется написать программу,​ на вход которой подается целое число n, обозначающее количество зажженных сегментов в отображении некого времени. Програма должна по этому числу востановить время, которое отображается на часах. Время должно быть корректным (подразумевается 24 формат представления времени). Если это невозможно,​ программа должна вывести "​Impossible"​. Если может быть несколько вариантов корректного времени,​ вывести любой
 + 
 +Примеры:​ 
 + 
 + ​Вход:​ 23 
 + 
 + ​Выход:​ 09:30 
 + 
 + ​Вход:​ 28 
 + 
 + ​Выход:​ Impossible 
 + 
 + ​Вход:​ 2 
 + 
 + ​Выход:​ Impossible 
 + 
 +**<color red>​5</​color>​ Могила** 
 + 
 +Территория некоторого кладбища имеет ровную прямоугольную форму. На нем (не выходя за его границы) расположена прямоугольная церковь. Требуется определить, хватит ли на кладбище места для прямоугольной могилы?​ могила может ​касаться границы кладбища и/или церкви,​ но не должна перекрывать их. 
 + 
 +На вход программе подаются 10 чисел:​ 
 + 
 +сначала ​**x1**, **y1**, **x2**, **y2** - координаты левого нижнего и правого верхнего углов гладбища  
 + 
 +после **x1**, **y1**, **x2**, **y2** - координаты левого нижнего и правого верхнего углов церкви 
 + 
 +а потом **w** и **h** - ширина и высота могилы. Сторона длины **w** должна располагаться вдоль оси OX, а сторона длины **h** - вдоль оси OY 
 + 
 +Программа должна вывести "​Yes",​ если место имеется и "​No"​ в проиивном случае. 
 + 
 +Пример:​ 
 + 
 +{{courses:​programming:​screenshot_from_2017-03-07_11-37-39.png?​400|}} 
 + 
 +Вход: 
 + 
 +1 1 11 8 
 + 
 +2 3 8 6 
 + 
 +3 2 
 + 
 +Выход:​ 
 + 
 +Yes 
 + 
 +Вход: 
 + 
 +1 1 11 8 
 + 
 +2 3 8 6 
 + 
 +4 3 
 + 
 +Выход:​ 
 + 
 +No 
 + 
 +**<color red>​5</​color>​ Углы углы углы** 
 + 
 +Даны **n** попарно различных точек на плоскости с целыми координатами до 10^6 по абсолютной величине. Требуется найти среди этих точек две точки **A** и **B** такие, что угол **AOB** минимальный. **O** – центр координат. 
 + 
 +**<color red>​5</​color>​ Делим пространство** 
 + 
 +Дан набор прямых линий на плоскости (прямая может задаваться уравнением прямой или с помощью двух точек - на ваш выбор),​ которые могут пересекаться. Найти количество областей,​ на которые они разбивают плоскость. 
 + 
 +**<color red>​4</​color>​ Задачи на структуры** 
 +В задачах подразумевается,​ что хранения связных данных (данных об одном логическом объекте) будет осуществляться с помощью типа struct. 
 +  * На вход программе подается число n, а после - n пар <​Название журнала>​ <​цена>​. Следует полагать,​ что название не содержит пробельные символы. Требуется сохранить данные в массив и вывести информацию о журналах с ценой выше 100. 
 +  * На вход программе подается число n, а после - n пар <​Название журнала>​ <​цена>​. Следует полагать,​ что название не содержит пробельные символы. Требуется создать и заполнить еще один массив теми журналами,​ стоимость которых меньше 30 
 + 
 + 
 +===== Линейный односвязный список =====
  
 **Структуры:​ ** **Структуры:​ **
Line 83: Line 188:
   * Подумать как можно реализовать удаление n-го элемента списка. ​ (int remove(struct node *root, int n);)   * Подумать как можно реализовать удаление n-го элемента списка. ​ (int remove(struct node *root, int n);)
  
-**Бинарное дерево поиска**+===== Бинарное дерево поиска ​=====
  
 Подробнее,​ например,​ [[https://​en.wikipedia.org/​wiki/​Binary_search_tree|тут]] Подробнее,​ например,​ [[https://​en.wikipedia.org/​wiki/​Binary_search_tree|тут]]
Line 105: Line 210:
   * Определение высоты дерева   * Определение высоты дерева
   * Вывод элементов дерева в порядке их возрастания (ЛКП обход дерева)   * Вывод элементов дерева в порядке их возрастания (ЛКП обход дерева)
-  * Вывод элементов дерева с отображением структуры. Например:​ ((5) 10 (15)) 20 ((25) 30 (35))+  * Вывод элементов дерева с отображением структуры. Например: ​<​code>​((5)10(15))20((25)30(35))</​code>​
   * Удаление всех элементов дерева   * Удаление всех элементов дерева
-  * ?+  * Удаление заданного элемента - рекомендую подумать и попробовать реализовать самостоятельно
  
 Для удобства,​ рекомендуется использовать отдельную функцию для создания узла: Для удобства,​ рекомендуется использовать отдельную функцию для создания узла:
Line 120: Line 225:
 } }
 </​code>​ </​code>​
 +
 +===== Пример на обзор txt файлов во вложенных папках =====
 +
 +
 +<code c dir-list.c>​
 +#include <​stdio.h>​
 +#include <​string.h>​
 +
 +#include <​sys/​types.h>​
 +#include <​dirent.h>​
 +
 +void printFile(const char *path, const int lvl);
 +
 +void dirTraveler(const char *startDir, const int lvl);
 +
 +int main()
 +{
 + dirTraveler("​.",​0);​
 + return 0;
 +}
 +
 +void dirTraveler(const char *startDir, const int lvl)
 +{
 +    char path[1000];
 +    strcpy(path,​ startDir);
 +
 +    DIR *dir=opendir(path);​
 +    if(dir)
 +    {
 + struct dirent *de = readdir(dir);​
 +        while(de)
 +        {
 + if(de->​d_type == DT_REG && strstr(de->​d_name,"​.txt"​))
 + {
 + int path_len = strlen(path);​
 +                strcat(path,​ "/"​);​
 +                strcat(path,​ de->​d_name);​
 + printFile(path,​ lvl);
 +                path[path_len] = '​\0';​
 + }
 +            if(de->​d_type == DT_DIR && 0!=strcmp("​.",​ de->​d_name) && 0!=strcmp("​..",​ de->​d_name))
 +            {
 +                int path_len = strlen(path);​
 +                strcat(path,​ "/"​);​
 +                strcat(path,​ de->​d_name);​
 +                dirTraveler(path,​ lvl+1);
 +                path[path_len] = '​\0';​
 +            }
 +           de = readdir(dir);​
 +        }
 +    }
 +    closedir(dir);​
 +}
 +
 +void printFile(const char *path, const int lvl)
 +{
 + int i;
 + char s[100];
 + for(i=0;​i<​lvl;​i++)
 + printf("​\t"​);​
 + printf("​%s[\n",​ path);
 +
 + FILE *f = fopen(path, "​r"​);​
 + if(f)
 + {
 + while(fgets(s,​sizeof(s)/​sizeof(char),​f))
 + {
 + for(i=0;​i<​lvl+1;​i++)
 + printf("​\t"​);​
 + printf("​%s",​s);​
 + }
 + fclose(f);​
 + }
 +
 + for(i=0;​i<​lvl;​i++)
 + printf("​\t"​);​
 + printf("​]\n"​);​
 +}
 +</​code>​
 +
  
courses/programming/extra_tasks.1491556087.txt.gz · Last modified: 2022/12/10 09:08 (external edit)