#### Ekzemplaj C-programoj

1. Duoniga serĉo en C
2. Paralelaj tekstoj en C kaj Paskalo

##### Duoniga serĉo en C

Vd ankaŭ Paskalan formon (Duoniga serĉo en Paskalo) de la sama algoritmo.

    #include <stdio.h›
    #define fiasko (-1)

    typedef struct{int sxlosilo; char *valoro;} ano;

    int duonigaSercxo(ano V[], int n, int sx)            /*funkciĉapo*/
      { int sube = 0, supre = n - 1, meze, sx_m;    /*lokaj variabloj*/
        while(sube <= supre){        /*ĉapo de komenckondiĉa iteracio*/
          meze = (sube + supre) / 2;
          if((sx_m = V[meze].sxlosilo) == sx) return meze;  /*elirejo*/
          if(sx < sx_m) supre = meze - 1;
          else sube = meze + 1;
        }                         /*finiĝis la komenckondiĉa iteracio*/
        return fiasko;
      }                              /*finiĝis la korpo de la funkcio*/

##### Paralelaj tekstoj en C kaj Paskalo

Komparo pri signoĉenoj, kaza ordono, nombrila iteracio en C kaj Paskalo.

    int cxen_al_ent(char *cx)  /* faras el signoĉeno cx entjeron */
      { int i, n, minuso = 0;  /* lokaj variabloj */

        for(i = 0; ' ' == cx[i] || '\n' == cx[i] || '\t' == cx[i]; i++);
        // i := 0;
        // DUM (cx[i]=' ') AŬ (cx[i]=nl) AŬ (cx[i]=tab) FARU STARTO
        //    STARTO {la vakua iteracikorpo} FINO;
        //    i := i + 1 {la nombrilkremento el la iteraciĉapo}
        // FINO;

        switch(cx[i]) { case '-': minuso = 1; case '+': i++; }
        //     alfo := cx[i];
        //     SE alfo = '-' TIAM AL 1;
        //     SE alfo = '+' TIAM AL 2 ALIE AL 3;
        //  1: minuso := 1;
        //  2: i := i + 1;
        //  3: {daŭrigo...};

        for(n=0; cx[i]›='0'&&cx[i]<='9';) n = 10*n+cx[i++]-'0';
        // n := 0;
        // DUM (cx[i] ≥ '0') KAJ (cx[i] <= '9') FARU STARTO
        //    n := 10*n + nro(cx[i]) - nro('0');
        //    i := i + 1;                      {postalkremento}
        // FINO;

        return (minuso ? -n : n);  /* kondiĉa esprimo en revenordono */
      }

#### Antaŭtraktilaj difnoj por esperantigo de C

Por esperantigi la leksikon de C sufiĉas kolekti difinojn por la tradukoj de la vortosimboloj en ĉapdosieron, ekz-e en tian`eoc.h` (la difinoj estas ordigitaj laŭ la anglaj vortosimboloj):

    #define AVXTO        auto
    #define ELIRU        break
    #define KAZO         case
    #define SIGNA        char
    #define SIGNAJ       char
    #define KOMPLEKSA    complex
    #define KOMPLEKSAJ   complex
    #define KONST        const
    #define PLU          continue
    #define CETERE       default
    #define FARU         do
    #define DUOBLA       double
    #define DUOBLAJ      double
    #define ALIE         else
    #define ENUM         enum
    #define EKSTERA      extern
    #define EKSTERAJ     extern
    #define REELA        float
    #define REELAJ       float
    #define POR          for
    #define AL           goto
    #define SE           if
    #define IMAGINARA    imaginary
    #define MALFERMITA   inline
    #define ENTJERA      int
    #define ENTJERAJ     int
    #define LONGA        long
    #define LONGAJ       long
    #define REGXISTRO    register
    #define REGXISTROJ   register
    #define EKSKLUZIVA   restrict
    #define EKSKLUZIVAJ  restrict
    #define REEN         return
    #define KURTA        short
    #define KURTAJ       short
    #define SIGNUMA      signed
    #define SIGNUMAJ     signed
    #define DABAJTOJ     sizeof
    #define STATIKA      static
    #define STATIKAJ     static
    #define RIKORDO      struct
    #define STRUKTURO    struct
    #define ELEKTU       switch
    #define TIPDIFINO    typedef
    #define UNIO         union
    #define NATURA       unsigned
    #define NATURAJ      unsigned
    #define VAKA         void
    #define VARIEMA      volatile
    #define VARIEMAJ     volatile
    #define DUM          while

La programoj uzantaj tiun dosieron devas ĝin importi, ekz-e kiel en la sekva adaptaĵo de la funkcio`atoi` (Paralelaj tekstoj en C kaj Paskalo):

    #include <stdio.h›
    #include "eoc.h"

    ENTJERA cxen_al_ent(SIGNA *cx)
    {
        ENTJERAJ i, n, minuso = 0;    /* lokaj variabloj */

        POR(i = 0; cx[i] == ' ' || cx[i] == '\n' || cx[i] == '\t'; i++) ;

        ELEKTU(cx[i]) {
            KAZO '-': minuso = 1;
            KAZO '+': i++;
        }

        POR(n = 0; cx[i] ≥ '0' && cx[i] ≤ '9';)
            n = 10 * n + cx[i++] - '0';

        REEN minuso ? -n : n ;
    }