Ответ:

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

Например, процедуру вызывают отдельно:

PrintRectangle(5, 3, '*');

А результат функции можно присвоить переменной:

k := CountDigits(n);