




                                APNDICE F                         
            
                     CONVERTENDO TURBO PASCAL EM TURBO C           
            
            
                 Neste apndice  pretendemos mostrar algumas semelhanas
            entre o Turbo Pascal e o Turbo C. O leitor interessado sobre
            esse assunto encontrar um excelente e detalhado captulo no
            "TURBO C  USER'S GUIDE",  o manual  original do  Turbo C.  O
            livro "TURBO C AVANADO" de Herbert Schildt tambm contm um
            captulo interessante sobre isso. Este apndice  apenas uma
            rpida introduo   (nem  sempre fcil) converso de Pascal
            para C.
                 A linguagem de programao C foi criada nos anos 70 e 
            o resultado  do desenvolvimento de uma linguagem mais antiga
            chamada BCPL,  que deu origem a uma linguagem chamada B, que
            influenciou no surgimento de C.
                 Nos exemplos  apresentados em duas verses, a verso da
            esquerda sempre   em  Pascal e  o da direita em C. Onde nos
            referirmos simplesmente  linguagem  estamos nos referindo
             verso 2.0 do Turbo  lanado pela Borland em 1988.
            
            O PROGRAMA PRINCIPAL  
            
                 O programa  principal em C  uma funo chamada main. A
            execuo de todo programa se inicia pela funo main.
            
                      BEGIN                     main() {
                        comando1;                 comando1;
                        comando2;                 comando2;
                        ...                       ...
                      END.                      }
            
            TIPOS DE DADOS  
            
                 A  maioria   dos  tipos   de  dados   do  Pascal,   tm
            equivalentes em  C. O  tipo booleano  do  Pascal,  pode  ser
            considerado como  o tipo  inteiro, no  qual o  0 equivale ao
            falso  e   qualquer  valor   diferente  de   0  equivale  ao
            verdadeiro. O  tipo string do Pascal  considerado em C como
            sendo um vetor de caracteres. Outros tipos so:
            
                      Turbo Pascal        Turbo C
                      --------------------------------------
                      char                char
                      byte                unsigned char
                      integer             int
                      word                unsigned int
                      longint             long (ou long int)
                      real                float
                      double              double
                      extended            long double
            

                                       - 225 -





                 As  constantes   do  tipo   char  so   escritas  entre
            apstrofos, mas as do tipo string so escritas entre aspas.
                 O tipo  enumerado definido pelo usurio tambm pode ser
            definido em C de forma anloga, usando a palavra "enum":
            
            TYPE
              vogal = (a, e, i, o, u)    enum vogal = {a, e, i, o, u} x;
            
            VAR x: vogal;
            
                 O anlogo em C ao TYPE do Pascal  o typedef:
            
                 TYPE                          typedef inteiro int;
                   inteiro = integer;
            
                 O tipo  conjunto (SET) do Pascal no possui assemelhado
            em C.
            
            CONSTANTES      
            
                 As declaraes  de constantes em C podem ser feitas com
            a palavra reservada const:
            
                 CONST                        const float e = 2.718;
                   e: real  = 2.718;
            
            VARIVEIS       
            
                 As variveis  em C  devem ser declaradas antes de serem
            usadas. Para  isso, basta  colocar o  nome do  tipo antes do
            nome da varivel:
            
                 VAR
                   x, y, z: real;                float x, y, z;
            
                 O C   "sensvel  ao caso das letras", o que quer dizer
            que  feita distino entre letras minsculas ou maisculas.
            As variveis aux, Aux e AUX sero consideradas distintas. As
            funes SIN(x) ou Sin(x) no sero reconhecidas como sendo a
            funo seno sin(x).
            
            OPERADORES      
            
                 C  tem  todos  os  operadores  do  Pascal;  alguns  so
            idnticos, como  os  operadores  de  adio  (+),  subtrao
            (-), multiplicao  (*), diviso  real (/), maior (>), maior
            ou igual (>=), menor (<) e menor ou igual (<=).
            
              Operador                 Pascal             C
              --------------------------------------------------------
              atribuio               a := b;            a = b;
              igualdade                a = b              a == b
              diferena                a <> b             a != b
              diviso inteira          a := b DIV c;      a = b/c;

                                       - 226 -





              mdulo                   a := b MOD c;      a = b % c;
              AND lgico               a AND b            a && b
              OR lgico                a OR b             a || b
              NOT lgico               NOT a              !a
              AND bit a bit            a := b AND c;      a = b & c;
              OR bit a bit             a := b OR c;       a = b | c;
              NOT bit a bit            a := NOT b;        b = ~a;
              deslocamento p/ dir.     a := b SHR c;      a = b >> c;
              deslocamento p/ esq.     a := b SHL c;      a = b << c;
              incremento               a := Succ(a);      a++  ou  ++a
              decremento               a := Pred(a);      a--  ou  --a
              endereo                 @a                 &a
              referncia a apontador                    *a
            
                 O C  tambm admite  declaraes como "a OP= b" como uma
            forma abreviada  da atribuio  "a =  a OP  b" onde  OP  um
            operador binrio.  Por  exemplo,  x  +=  1    o  mesmo  que
            x = x + 1.
            
            COMANDOS COMPOSTOS    
            
                 O bloco  de comandos  que em  Pascal   delimitado  por
            BEGIN e  END, em  C   delimitado por  { e  }. No entanto, o
            ponto-e-vrgula  que   vier  imediatamente   antes  do  }  
            obrigatrio e depois de } no deve ter um ponto-e-vrgula.
            
                      BEGIN                   {
                        comando1;                comando1;
                        ...                      ...
                        comandoN                 comandoN;
                      END;                    }
            
            COMENTRIOS           
            
                 Os comentrios em C so delimitados por /* e */.
            
                 /* Isto  um exemplo  de um comentrio em C! */
            
            ARQUIVOS DE INCLUSO  
            
                 Arquivos  podem  ser  includos  em  C  atravs  de  um
            #include seguido  do nome  do arquivo  entre <  e > ou entre
            aspas.   muito comum  a incluso  de arquivos-cabealho (de
            extenso .H) que contm constantes e cabealhos de funes.
            
                 {$I TESTE.INC}                #include "teste.inc"
                 {$I FUNCOES}                  #include <stdio.h>
            
            COMANDOS DE ENTRADA E SADA  
            
                 O C  possui muitos  comandos para  entrada e  sada  de
            dados. Talvez  os mais  comuns sejam  o SCANF  e  o  PRINTF,
            semelhantes ao READ e WRITE do Pascal.

                                       - 227 -





                 A sintaxe  do SCANF   scanf(string, &var1, &var2, ...)
            onde string   uma  string de formatao e &var1, &var2, ...
            so os  endereos das variveis que vo ser lidas. No string
            de formatao,  especificado o tipo de cada varivel:
            
                   %d   decimal                   %x   hexadecimal
                   %u   inteiro sem sinal         %f   real
                   %c   caracter simples          %s   string
            
                 Por exemplo,  para se  ler um  inteiro positivo  x e um
            real y, deve-se usar um  scanf("%u %f", &x, &y); .
                 A sada  com  o  PRINTF  tem  uma  sintaxe  semelhante:
            printf(string, var1,  var2, ...),  onde string  a string de
            formatao que  inclui a  definio dos  tipos, mensagens  e
            caracteres de  controle como  "\n", usado  para indicar  uma
            nova linha.
            
              WRITE('Valor de x = ', x);   printf("Valor de x = %f", x)
              WRITE(a, ' *  ', b);         printf("%d * %d", a, b);
              WRITELN(a, ' *  ', b);       printf("%d * %d\n", a, b);
              WRITELN(Lst, 'FIM.');        printf(stdprn, "FIM.\n")
            
                 O comando  anlogo   funo READKEY  do  Pascal,    a
            funo getch()  (OBS.: tem  outra funo  muito parecida com
            essa que  a getche()).
            
            ch := ReadKey;                     ch = getch();
            if ch = #0 then                    if (ch == 0)
            begin                              {
              ch := ReadKey;                     ch = getch();
              Write('Codigo estendido = ',       printf("Codigo "
                     Ord(ch))                    "estendido = %d", ch);
            end;                               }
            
            ESTRUTURAS DE DECISO    
            
                 O C  tambm tem  um comando  IF, que  funciona de forma
            semelhante ao  do Pascal,  com as  seguintes diferenas: (1)
            antes do  else tem  um ponto-e-vrgula,  a no ser que tenha
            uma chave  (}); (2)  a  condio  lgica  deve  estar  entre
            parnteses, pois no h um delimitador como o THEN.
            
                      IF condio THEN            if (condio)
                        comando1                    comando1;
                      ELSE                        else
                        comando2;                   comando2;
            
                 O anlogo do CASE do Pascal  o comando SWITCH:
            
                 CASE expr OF                  switch (expr) {
                   val1 : comando1;              case val1: comando1;
                                                            break;
                   val2, val3, ...: comando2;    case val2:
                                                 case val3: comando2;

                                       - 228 -





                                                            break;
                   ...                           ...
                   ELSE                          default: comandoN;
                     comandoN;                 }
                 END;
            
            Exemplo:
            
              if opcao = 1 then        if (opcao == 1)
                case x of                switch (x) {
                  1 : y := Sin(x);         case 1  : y = sin(x); break;
                  2 : y := Cos(x);         case 2  : y = cos(x); break;
                  3 : y := Ln(x);          case 3  : y = log(x); break;
                  else                     default :
                    Encerrar;                encerrar();
                end;                     }
            
            ESTRUTURAS DE REPETIO    
            
                 Dos trs  tipos de laos das linguagens, os que mais se
            parecem so os WHILEs:
            
                 WHILE expresso DO           while (expresso)
                   comando;                     comando;
            
                 O equivalente ao REPEAT-UNTIL  o DO-WHILE. No entanto,
            a condio  lgica do  REPEAT-UNTIL   a negao  da do  DO-
            WHILE:
            
                 REPEAT                        do {
                   comando1;                     comando1;
                   ...                           ...
                 UNTIL condio;               } while !condio;
            
                 O comando  FOR do C tem mais semelhanas com o WHILE do
            Pascal do que com o prprio FOR. Todo FOR do Pascal pode ser
            convertido facilmente em um FOR do C:
            
                 FOR i := a TO b DO         for(i = a; i <= b; i++)
                   comando;                   comando;
            
                 FOR j := b DOWNTO a DO     for(j = b; j >= a; j--)
                   comando;                   comando;
            
            Exemplo:
            (* Caracteres aleatorios *)      /* Caracteres aleatorios */
            
            USES                             #include <stdio.h>
              Crt;                           #include <time.h>
                                             #include <stdlib.h>
            VAR                              #include <conio.h>
              n: char;
                                             main() {

                                       - 229 -





            BEGIN                              int n;
            
              ClrScr;                          clrscr();
              Randomize;                       randomize();
              repeat                           do {
                n := Chr(Random(200));           n = random(200);
                Write(n);                        putchar(n);
              until (n = #27)                  } while (n != 27);
            END.                             }
            
            FUNES E PROCEDIMENTOS    
            
                 As funes  em C  so definidas  de forma  anloga  do
            Pascal, observando-se  o seguinte:  (1) o  tipo do  valor de
            retorno   escrito antes  do nome  da funo; (2) o valor de
            retorno  definido com o comando "return valor;"
                 Em C  no tem procedimentos; todo subprograma  funo.
            O anlogo  dos procedimentos  do Pascal,  so as funes que
            retornam um valor vazio (void).
            
            FUNCTION Max(x, y:real):real;   float max(float x, float y);
            begin                           {
              if x < y then                   if (x < y)
                Max := y                        return y;
              else                            else
                Max := x                        return x;
            end;                            }
            
            PROCEDURE Cor(x, y: byte);      void cor(char x, char y)
            begin                           {
              TextColor(x);                   textcolor(x);
              TextBackground(y)               textbackground(y);
              ClrScr;                         clrscr();
            end;                            }
            
                 Os parmetros  de um procedimento declarados com "var",
            devem ser declarados em C como apontadores:
            
            PROCEDURE Troca(var a, b: byte);  void troca(int *a, int *b)
            var                               {
              aux: byte;                        int aux;
            begin
              aux := a;                         aux = *a;
              a := b;                           *a = *b;
              b := aux                          *b = aux;
            end;                              }
            
            
                  permitida  a recursividade  das funes do  como na
            funo S a seguir, que calcula a soma dos n primeiros termos
            da forma 1/(nS02T + 1).
            
            
            

                                       - 230 -





            function S(n:integer):real;   float s(int n)
            begin                         {
              if (n = 0) then               if (n == 0)
                S := 0                        return 0;
              else                          else
                S:=S(n-1)+1/(n*n+1);          return s(n-1) + 1/(n*n+1);
            end;                          }
            
            APONTADORES    
            
                 Os apontadores  do C  so declarados  e usados de forma
            semelhante aos do Pascal, bastando trocar "^" por "*" ou "@"
            por "&". O "*" sempre  escrito antes do nome da varivel.
            
                 VAR x: ^real;                    float *x;
                     y:  integer;                 int y, *z;
                     z: ^integer;
                 ...                              ...
                 x^ := -3.7;                      *x = -3.7;
                 y := 11;                          y = 11;
                 z := @y;                          z = &y;
            
            VETORES E MATRIZES      
            
                 A declarao  de um  vetor em  C  feita colocando-se o
            tipo antes  do nome  do vetor,  seguido do seu tamanho entre
            colchetes.  Uma   matriz     declarada  de  forma  anloga,
            colocando-se dois  abre e  fecha colchetes na frente do nome
            da matriz. O primeiro elemento de um vetor tem ndice nulo.
            
                 v: array[1..5] of real;             float v[5];
                 mat: array[1..3, 1..7] of byte;     char mat[3][7];
            
            Exemplo: A seguir, esta definida uma matriz identidade 3 x 3.

            VAR                               main()
              m: array[1..3, 1..3] of byte;   {
              i, j: byte;                     int m[3][3];
                                              int i, j;
            BEGIN
              for i := 1 to 3 do              for (i = 0; i <= 2; i++)
                for j := 1 to 3 do              for (j = 0; j <= 2; j++)
                  if i = j then                   if (i == j)
                    m[i, j] := 1                    m[i][j] = 1;
                  else                            else
                    m[i, j] := 0;                   m[i][j] = 0;
            END.                              }
            
            REGISTROS    
            
                 Os registros do Pascal correspondem s estruturas do C.
            
                 aluno = record              struct aluno {
                   nome: string[30];           char nome[30];

                                       - 231 -





                   matricula: string[8];       char matricula[8];
                   curso: integer;             int curso;
                   aprovado: boolean;          int aprovado;
                 end;                        }
            
                 Se X  for um registro ou estrutura do tipo aluno, ento
            so vlidas as seguintes atribuies:
            
                 X.nome := 'Rzinha';       strcpy(X.nome, "Rzinha");
                 X.curso := 44;             X.curso = 44;
                 X.aprovado := false;       X.aprovado = 0;
            
            PARMETROS FORNECIDOS AO PROGRAMA 
            
                 Parmetros podem  ser fornecidos  a um  programa  em  C
            atravs dos  identificadores  argc  e  argv,  parmetros  da
            funo main.  argc   o nmero  de argumentos e argv[]  uma
            matriz de strings que correspondem aos parmetros.
            
            VAR                          main(int arg char *argv[]) {
              n: integer;                  int n;
              p1, p2: string[80];          char p1[80], p2[80];
            BEGIN
              n := ParamCount;             n = argc;
              p1 := ParamStr(1);           strcpy(p1, argv[1]);
              p2 := ParamStr(2);           strcpy(p2, argv[2]);
              ...                          ...
            END.                         }
            
            ARQUIVOS   
            
                 A abertura  de arquivos  do disco  em C   feita  com o
            comando fopen, que inclui as funes do ASSIGN e do RESET ou
            REWRITE do Pascal. O primeiro parmetro do fopen  o nome do
            arquivo do  disco e  o segundo  parmetro  especifica  se  o
            arquivo vai  ser aberto  para leitura  ("r"), para  gravao
            ("w"), alm de outras possibilidades.
                 A leitura/gravao  de dados  pode ser  feita com get
            fgets,  fread,   fwrite,  fputs,   fprint,  alm  de  outros
            comandos. Todo  arquivo em  C    declarado  como  sendo  um
            apontador do  tipo FILE (escrito em maisculas). Para fechar
            arquivos, usa-se um fclose.
            
            VAR                             #include <stdio.h>
              arq: file of char;
              ch: char;                     main(int arg char *argv[])
                                            {
            BEGIN                             FILE *arq;
                                              int ch;
              Assign(arq, ParamStr(1));
              Reset(arq);                     arq = fopen(argv[1], "r");
              repeat                          do {
                Read(arq, ch);                  ch = getc(arq);
                Write(ch);                      putchar(ch);

                                       - 232 -





              until Eof(arq);                 } while (ch != EOF);
            
              Close(arq);                     fclose(arq);
            END.                            }
            
            GRFICOS   
            
                 Todos os  comandos grficos  do Turbo  C so totalmente
            anlogos aos  do Turbo  Pascal. Basta  escrever o comando em
            letras minsculas  e a  maioria das  constantes  da  unidade
            Graph do  Pascal em  letras maisculas.  Nos parmetros  que
            correspondam a  parmetros  VAR  de  procedimentos,  deve-se
            colocar  um  "&".  Observe  a  grande  semelhana  entre  os
            comandos grficos  (initgraph, settextstyle,  ...) e aqueles
            mostrados no captulo 12.
            
            /* ================================================== */
            /*         TESTANDO O MODO GRAFICO DO TURBO C         */
            /* ================================================== */
            
            #include <stdio.h>
            #include <stdlib.h>
            #include <dos.h>
            #include <graphics.h>
            
            void iniciamodografico(void) {
            
            /* Coloca a tela no modo grafico */
            
              int drivergrafico, modografico;
            
              drivergrafico = DETECT;
              initgraph(&drivergrafico, &modografico, "C:\\LING\\TC");
              if (graphresult() < 0) {
                printf("ERRO na mudana para o modo grafico.\n");
                abort();
              }
            }
            
            void escrevenome(void) {
            
            /* Escreve uma mensagem em letras goticas */
            
              cleardevice();
              settextstyle(GOTHIC_FONT, HORIZ_DIR, 8);
              outtextxy(80, 60, "Graficos em C");
            }
            
            main() {
              iniciamodografico();
              escrevenome();
              delay(8000);  /* pausa de 8 segundos    */
              closegraph(); /* encerra o modo grafico */
            }

                                       - 233 -
