f.f.o. :: /add

Александр Фенстер

add@fenster.name fenster.name

Все записи

[741] 29 мая 2009; 1:30

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

Третий курс ФИТ, предмет «парадигмы программирования», язык Haskell:

charToDigit c = (findIndex (== c) "0123456789abcdefghijklmnopqrstuvwxyz")

Чертовски функционально, а главное — работает. Когда осознал, как будет выглядеть аналогичная функция на C, ржал как конь:

int charToDigit(char c)
{
    char *s = "0123456789abcdefghijklmnopqrstuvwxyz";
    return (strchr(s, c) - s);
}

Ну, опустим проверку на некорректный символ. Всё равно впечатляет.

Первый курс ММФ, предмет «программирование», язык C, дополнительное задание: написать программу, копирующую input.txt в output.txt.

FILE *f = fopen("input.txt", "r");
FILE *h = fopen("output.txt", "w");
char c;
while (c = fgetc(f))
    fputc(c, h);

«Александр Геннадьевич, работает! Он всё копирует, только не останавливается почему-то...»

Первый курс ММФ, предмет «программирование», после нескольких наступаний на грабли вида «сегфолт при чтении из несуществующего файла» студенты начинают обрабатывать ошибки:

inf = fopen("input.txt", "r");
if (inf == NULL)
{
    printf("файла input.txt нема\n");
    return (-1);
}

(и аналогично "памяти нема", если malloc вернул NULL — впрочем, чего это я стебусь, это же надо только приветствовать...)

Первый курс ММФ, предмет «программирование», по плану каждому студенту нужно решить пятнадцать задач:

$ cd /home/........; ls *.c
aaa.c bbb.c ccc.c ddd.c eee.c fff.c ggg.c hhh.c iii.c jjj.c kkk.c lll.c mmm.c nnn.c ooo.c

Первый курс ФИТ, предмет «программирование на языке высокого уровня», задание «архиватор Хаффмана». Здесь просто рассказ, без кода. Принимаю архиватор. Смотрю код, затем, как обычно, скриптом сжимаю, разжимаю и сравниваю diff'ом тестовый набор файлов — всё сходится. Готов уже пойти ставить плюсик в табличку, но что-то заставляет меня сказать ls -l в каталоге, в котором лежат тесты и их заархивированные варианты. Выясняется, что «архиватор» из-за косяка при выводе стабильно создаёт архивы раза в четыре больше исходного файла, но при этом из-за косяка при вводе вполне корректно их распаковывает. Мораль: будьте бдительны всегда...

Тот же автор, задание «калькулятор с длинной арифметикой». Вашему вниманию предлагается кусок заголовочного файла long.h:

long_int *add(long_int *a, long_int *b);
long_int *sub(long_int *a, long_int *b);
long_int *mul(long_int *a, long_int *b);
long_int *division(long_int *a, long_int *b);
int firstislessthensecondortheyaresame(long_int *a, long_int *b, int type, int whenaandbaresameishouldsmthreturn);

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