Смотря ещё, что объяснять - просто то, что было задано в вопросах или вообще всё расписать. Ладно, пока ограничусь ответами на конкретно заданные вопросы, а если надо расписать, что каждая строка делает - это уже в комментариях к этому ответу распишу, если надо и по отдельной просьбе).
Итак:
1) "как получилась эта программа" - программа была написана, исходя из заданных условий.
2) " что такое «n”?" - дополнительная переменная для цикла for, конечный шаг. Т.е. какая-либо переменная (в данном случае "years") принимает значения от 1 до n с шагом 1, т.е. "+1", а в конкретном случае - 1, 2, 3, ... и т.д. до n. Число n (значение n) вводится вручную с клавиатуры. Т.е. если бы было введено число 4, то years принимала бы значения: 1, 2, 3, 4 (ну и для каждого значения были бы произведены вычисления). Если будет введено число 6, то years примет значения: 1, 2, 3, 4, 5, 6. Иными словами в 1-ом случае (с введением числа 4) years бы принимала значения от 1 до 4, а во 2-ом случае из моего примера (где было введено число 6) - от 1 до 6.
3) "почему if years<>1 then?" - потому что таково условие работы программы. if - означает "если", <> - не равно, years - переменная, 1 - число в условии, then - тогда. Т.е. если years не равно 1, тогда выполняются следующие несколько действий от begin до end; (внимание: до end с точкой с запятой на конце! Это важно!). Ну а какое задание (условие для программы) - изначальное требование? - Правильно: когда племяннику исполнился 1 год, то дядя подарил ему подарок и немного финансов в виде 1 доллара. А с каждым последующим днём рождения количество подарков и количество финансов удваивалось. Соответственно, если years (возраст такой переменной обозначен) =1 году (years=1), то подарок 1 и 1 доллар, а если не равен 1, то тогда в зависимости от возраста подарки и финансовая подачка увеличиваются в 2 раза с каждым годом.
4) "почему dollars:=1; gift:=1;?" - знак ":=" человеком читается как просто "=". Просто т.к. компьютер не особо понимает человеческий язык и не может так широко мыслить как человек, то компьютер не понимает ситуативной многозадачности, когда просто x= (т.е. значение), а когда надо это = использовать в сравнении. Поэтому в языках программирования (а их около 40) для того, чтобы компьютер понимал эту разницу, знаки слегка изменили для операций. В разных языках программирования по-разному. В частности, в Паскале знак ":=" используется для значения, а просто "=" для сравнения. В Python же, например, "=" используется для значений, а для сравнения - "==". Но задание в Паскале, поэтому вернёмся к Паскалю. Почему ":=" я объяснил. А ":=1" - это исходя из условия - начальные значения. Т.е. возраст=1 году, ну и подарок 1 был подарен. Такое вот объяснение компьютеру.
5) "и почему на конце
«end
end;
writeln(gift);
end.»?" - компьютер читает по строкам. end - конец. Но end; (с точкой запятой на конце - на что я просил обратить внимание в п.3) означает конец выполнения промежуточных действий (применяются операторные скобки begin-end - выполнить действия - закончить для нескольких действий), а end. (с точкой на конце) означает конец программы. Т.к. операторных скобок было открыто несколько (begin), то каждая из них после выполнения своих действий должна заканчиваться закрывающей скобкой end. Это касается как основной программы - самой большой по объему действий скобкой, которую закрывает end с точкой, так и нескольких внутренних. Ну а "writeln(gift);" - вывести на экран значение переменной gift (число) - в данном случае - число полученных подарков.