Данный код выполняет следующую задачу, он получает на входе массив из 4-х целых чисел, и определяет, могут ли они являться 4-мя сторонами прямоугольной трапеции.
Этот код ни в коей мере не претендует ни на эффективность, ни на выразительность и рассматривать его стоит только как пример того, что это возможно. Это связано с тем, что ни язык, ни задача не способствуют данному стилю программирования. И не смотря на это, можно выделить 1 сильную сторону этого кода, это хорошо выделенные абстракции.
Подробнее о переменных, и в более общем понимание, изменяемых состояниях можно прочитать статью «Изменяемое состояние: опасности и борьба с ними» Евгения Кирпичёва в первом выпуске журнала «Практика функционального программирования» по этой ссылке:
fprog.ru/2009/issue1/eugene-kirpichev-fighting-mutable-state
#include <stdio.h>
int find_dublicate(const int *lines)
{
return find_dublicate2(lines, 0, 0);
}
int find_dublicate2(const int *lines, const int i)
{
const int result = find_dublicate3(lines, i, i + 1);
if (result == -1)
if (i < 3) return find_dublicate2(lines, i + 1);
else return -1;
else return result;
}
int find_dublicate3(const int *lines,
const int i,
const int j)
{
if (lines[i] == lines[j])
return lines[j];
else
if (j < 4) return find_dublicate3(lines, i, j + 1);
else return -1;
}
int delete_duplicate(const int *lines, const int a, const int number)
{
return delete_duplicate2(lines, a, 0, 2, number);
}
int delete_duplicate2(const int *lines, const int a,
const int i, const int j, const int number)
{
if (lines[i] == a && j != 0)
delete_duplicate2(lines, a, i + 1, j - 1, number);
else if (number != 0)
delete_duplicate2(lines, a, i + 1, j, number - 1);
else return lines[i];
}
int max_AB(const int *AB)
{
if (AB[0] > AB[1]) return 0;
else return 1;
}
int main (int argc, char** argv)
{
const int lines[] = {2,3,8,2};
const int a = find_dublicate(lines);
if (a == -1) goto no;
const int AB[2] = {delete_duplicate(lines, a, 0), delete_duplicate(lines, a, 1)};
const int max = max_AB(AB);
const int delta = AB[max] - AB[max ? 0 : 1];
if (delta/2 < a) goto yes;
else goto no;
yes:
printf ("yes\n");
return 0;
no:
printf ("no\n");
return 0;
}
* This source code was highlighted with Source Code Highlighter.
PS Код вроде работает правильно, хотя нормально не трестировался. Компилил gcc-4.2.1
PPS В веду некоторого непонимания, под переменной подразумевались объекты с изменяемым состоянием, а не именованный участоки памяти.
