Можешь использовать олимпиадные задачи
http://acm.timus.ru/problemset.aspxОни не так хороши для развития, но в них есть автоматические проверки, частично заменяющие препода.
Но лучше скачать лабораторные работы настоящих вузов и прорешивать их, потому что они отличаются от олимпиадных задач тем, что они сделаны таким образом, чтобы сформировать навыки программирования у обучающегося. Олимпиадные задачи такими не являются чаще всего. В вузовских заданиях тебя будут именно дрючить на определённый навык, пока ты не научишься.
И вот потом ты уже можешь пробовать повторить реально существующие программы, потому что как бы то ни было, тебе иногда придётся что-то в них делать, для чего нужны именно навыки, а навык быстро получить нельзя - только через многократное прорешивание одного и того же. Как в школе дети сидят и выводят буквы в тетради целый день, так и в программировании нужно сидеть и делать одно и то же целый день. А потом ты раз и что-то быстро записал.
droncheck
С чего начинали сами, какие интересные цели и задачи себе ставили?
Брал лабораторки из Интернета и делал десятки задач на поиск корней разных степеней и значений тригонометрических функций типа синуса. Потом с книги брал задачи на движение треугольника вокруг препятствий и писал рекурсивный обход препятствия. Потом задачки про матрицы, типа там заполнение числами по спирали. Вот этого всего было много-много и смысла не было видно, зачем это делать.
А вот вчера скачал словарь для StarDict'а, а он не открывается, залез в этот словарь, а он в теговом формате каком-то (типа xml). Словарь большой, видно, где слово и где его перевод, вручную им можно пользоваться, но StarDict умеет ведь сканировать и довольно удобный для чтения текстов в браузере, поэтому хочется именно к нему подключить словарь. Вот и пришла мысль “а не написать ли конвертер к этому?”, это первая мысль, вторая мысль “а я смогу его написать вообще?”. Полез в обычные словари, которые работают уже, но они какие-то странные, состоят из нескольких файлов, полез внутрь этих файлов, стал в 16-ричном виде смотреть эти файлы, догадываться, что там за что отвечает. Чисто догадками предположил, что в файле сначала идёт слово, потом нуль-символ, потом 4-байтовое число и ещё одно 4-байтовое число. Потом проверил на всех ли словах так, оказалось, что на всех. Потом стал выяснять, а что это за два числа, предположил, что это позиция начала и длина от неё. Так и оказалось. В результате анализа я понял, как в рабочем словаре проиндексирован файл переводов с помощью отдельного файла с индексами. Дальше встал вопрос “а как разложить неработающий файл, где всё в тегах?”. Стал его читать, а там куча каких-то тегов дополнительных, то есть этот формат файла не такой простой, как кажется изначально. Следовательно, его надо будет не просто представить в виде xml, а, возможно, ещё почистить перед этим каким-нибудь
умным способом. Понимаешь, да? Вот оно программирование пошло - надо
уметь составлять алгоритм для парсинга, не имея никаких модулей для парсинга. Надо просто проанализировать текст через конечный автомат или что-то в этом роде. Поэтому я что сделал, я пошёл и стал искать этот словарь в Интернете, чтобы найти уже готовый и решить эту проблему, потому что у меня сейчас нет времени писать конечные автоматы для словаря, в котором ещё хрен знает что может оказаться и где надо будет ещё что-то писать. Но вот эту всю информацию я запомнил. Теперь я знаю, что нужно получить в результате, чтобы сделать хороший словарь. На будущее я понял, что если я что-то найду, а оно не подойдёт и в Интернете его тоже не будет, то мне надо будет написать конечный автомат по приготовлению формата к созданию индексированного словаря для StarDict'а. Писать это буду на питоне, но питон вообще к этому отношения не имеет. В книжке по питону ты не узнаешь, как писать конечные автоматы, потому что это целый слой из теории программирования, который относится ко всем языкам одинаково.
Это к чему всё - вот если ты будешь писать какой-нибудь NC, то ты будешь его писать-писать-писать, а потом раз и встал на какой-нибудь такой шпуньке, где надо уметь программировать. А ты её написать не можешь, а из-за неё из-за одной вся программа не пишется в итоге. Хочешь сидеть с полупрограммой, которая в целом не работает, - не изучай матрицы, синусы, работу со строками и прочие базовые вещи. Только ты потратишь два месяца или четыре, а потом раз и всё, и дальше ты её не можешь писать, потому что не умеешь какую-то мелочь делать.