Программа построения двухмерных L-фракталов (язык Си).

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <graphics.h>
#include <conio.h>
#define STEP 12 /* Шаг для рисования фрактала */
#define Х0 0
#define Y0 -200

/* Формат файла данных
1-я строка - аксиома
2-я строка - число, на которое надо разделить 360 для получения угла поворота
3-я строка - число, равное количеству правил
    строки (количество которых определено в 3-й строке),
     в каждой из которых записано по одному правилу строки,
     не содержат пробелов, 1-й элемент - заменяемый символ,
      остальные элементы — символы, на которые заменяется 1-й */

  /* Функции преобразования координат */
int xe(float x)
 { return (int) (х+320);}
int ye(float у)
{ return (int)(240-у);}

  /* Функция рисования фрактала */
void ldraw(int x0, int y0,unsigned int step, int direct, char *ls)
 { float x=x0,y=y0;
    float rangle=(360.0/direct)*M_PI/180,curangle=0;
    struct { float x,y,curangle;} stack[100];
    int pstack=-l;
    moveto(xe(x0),ye(y0));
    while (*ls) 
      { switch (*ls)
         { case 'F': x=x+step*cos(curangle);
               y=y+step*sin(curangie);
               lineto(xe(x),ye(y)); break;
           case '+': curangie-=rangle; break;
           case '-': curangle+=rangle; break;
           case '[': pstack++;
               stack[pstack].x=x;
               stack[pstack],y=y;
               stack[pstack].curangle=curangle; break;
           case ']': x=stack[pstack].x;
                y=stack[pstack].y;
                curangle=stack[pstack].curangle;
                pstack--;moveto(xe(x),ye(y) ) ;
              } ls++;
          }
    }

/* Функция получения строки для рисования фрактала */ 
void lstring( char *axiom, unsigned int rс,
                   char (*rules)[50], unsigned int n.char *ls)
   { unsigned int i,j,shift ;
      char *result,*p,*pr;
      strcpy(ls,axiom) ;
      for (i=0;i<n;i++)
        { resuit=ls;
           while (*result)
             { for (j=0;j<rc;j++)
          if (*result==rules[j][0])
          { shift=strlen(rules[j])-1;
             p=result+strlen(result);
             while (p!=result) { *(p+shift-1)=*p; p--;}
             for (pr=rules[j]+l;*pr;pr++) { *result=*pr; result++;}
             result--;break;
           }
          result++;
          }
     }
 }

/* Функция читает данные из файла filename и возвращает:
    строка axiom - аксиома,
    direct - число для получения угла поворота
     rc - количество правил
     массив строк rules - теоремы */
 void readfra( char *filename, char *axiom, unsigned int *direct,
                    unsigned int *rc, char (*rules) [50])
 { unsigned int i,n;
    FILE *f=fopen(filename,"r");
    fscant(f,"%s",axiom) ;
    fscanf(f,"%d\n",direct) ;
    fscanf(f,"%d\n",rc) ;
    for (i=0;i<*rc;i++) fscanf(f,"%s",rules[i] );
    fclose(f) ;
  }

void main(int argc.char* argv[])
  { int gd=DETECT,gm,inrec;
     unsigned int direct,rc;
     char ls[20000];
     char axiom[20] ;
     char rules [10] [50];
     printf("Глубина рекурсии:\n") ;
     scanf("%d", &inrec);
     readfra(argv[1] ,axiom,&direct,&rc, rules);
     lstring(axiom,rc,rules,inrec,ls);
     puts (ls); /* Вывод на экран строки для построения */
     getch () ;
     initgraph(&gd,&gm,"");
     ldraw(X0,Y0,STEP,direct,ls);
     getch () ;
     closegraph() ;
} TopList