Cábula para  C




// definição de variáveis *********************************************************

int x,y,z ;       // variaveis inteiras
short i;          // inteiro curto
long a,b;         // variaveis inteiras tamanho duplo
unsigned y;       // inteiros positivos
long unsigned z;  // inteiro positivo longo

float w;          // real
double ww;        // real tamanho duplo
char c;           // 1 caracter

int a=2;


// a variaveis podem ser locais  ou globais (definidas antes das funcoes)
// às variaveis locais é feito o reset quando se sai da função

// variaveis que mantem os seu valores nas funçoes (static)

static int k=3;

// variaveis globais usadas por rotinas noutras files são chamadas externas e devem
// ser definidas como tal

extern float x=2.;


// Alguns caracteres constantes

'\n'  // linha nova
'\t'  // tab
'\\'  // backslash
'\''  // sigle quote
'\0'  // null : terminaçaõ das strings


//Arrays   ***************************************************************

//começam em 0

int arre[10][30];


// Os arrays podem ser passados como argumentos sem precisar de dar o tamanho
// no caso do tamanho ser necessario vai numa variavel à parte
// as variaveis em arrays passam de umas rotinas para outras

int add_array(int array[], int size)
{       int i;
        int total = 0;

        for(i = 0; i < size; i++)
                total += array[i];

        return(total);
}


// Operadores ********************************************

/*
 
  +, - , * , /

*/
y = (m * x) + c  // exemplo


//      %       // modulo (resto da divisão inteira)

int i1=9;
int i2=2;
int i3=9%2;   // i3=1



// abreviaturas

/* i++;  ou ++i;  é equivalente a   i=i+1;
   i--;  ou --i;  é equivalente a   i=i-1;  */
int i=9;
int j=2;
int k=i+ ++j;  // j=12

int i=9;
int j=2;
int k=i+ j++;  // j=11   !  o incremento é feito depois


/* i+=10;      é equivalente  i=i+10;
   i-=10;      é equivalente  i=i-10;
   i*=10;      é equivalente  i=i*10;
   i/=10;      é equivalente  i=i/10;   */
  
  
// Comparação entre valores   0= falso  diferente 0 verdadeiro
  
  
/* 
    ==   igual
    >    maior
    <    menor
    >=   maior ou igual
    <=   menor ou igual
    !=     diferente
*/

/*   Operadores lógicos

    &&    e
    ||    ou
    !     não
*/


//   ciclos de controlo *****************************************

//  if  ----------------------------------------------------------

if (result >= 45)
        printf("Pass\n");
else
        printf("Fail\n");


if (result >= 45)
{       printf("Passed\n");
        printf("Congratulations\n");
}
else
{       printf("Failed\n");
        printf("Good luck in the resits\n");
}



if (result >= 75)
        printf("Passed: Grade A\n");
else if (result >= 60)
        printf("Passed: Grade B\n");
else if (result >= 45)
        printf("Passed: Grade C\n");
else
        printf("Failed\n");


//   switch   -----------------------------------------------------


/* Estimate a number as none, one, two, several, many */

    int number = 8;
{       switch(number) {
        case 0 :
                printf("None\n");
                break;
        case 1 :
                printf("One\n");
                break;
        case 2 :
                printf("Two\n");
                break;
        case 3 :
        case 4 :
        case 5 :
                printf("Several\n");
                break;
        default :
                printf("Many\n");
                break;
        }
}

//     resultado  Many !


/* while  ------------------------------------------------------------

As an example, here is a function to return the length of a string.
Remember that the string is represented as an array of characters terminated
by a null character '\0'
*/

int string_length(char string[])
{       int i = 0;

        while (string[i] != '\0')
                i++;

        return(i);
}


// do while -------------------------------------------------------


do
{       printf("Enter 1 for yes, 0 for no :");
        scanf("%d", &input_value);
} while (input_value != 1 && input_value != 0)


// for --------------------------------------------------

float average(float array[], int count)
{       float total = 0.0;
        int i;

        for(i = 0; i < count; i++)
                total += array[i];

        return(total / count);
}

// loop com varios argumentos: for (hi = 100, lo = 0; hi >= lo; hi--, lo++)


break;  // para a execução do loop e sai

continue; // salta para a condição de controlo do loop

goto nome;  // salto incondicional


// definição de funções

int funcao(int x[]){
............
return(valor);}

// função sem valor de retorno

void error_line(int line)
{      fprintf(stderr, "Error in input data: line %d\n", line);
}


//The function would be called as follows

error_line(line_number);

// ********  Pointers  ***********

// definicao (referenciao da variavel)
// o pointer contem o endereço de memoria onde se encontra a variável

int *pi = &i;    // pi é o pointer para o inteiro i
float *px =&x;   // px é o pointer para o float x


// derefenciacao  do pointer

   i =*pi;
  
  
//   exemplo

fiddle(int x, int *y)
{   printf(" Starting fiddle: x = %d, y = %d\n", x, *y);
    x ++;
    (*y)++;  // como y é um pointer precisa ser de-referenciado antes de ser incrematado
             //  o valor da variável para onde aponta
    printf("Finishing fiddle: x = %d, y = %d\n", x, *y);
}

main()
{   int i = 0;
    int j = 0;
    printf(" Starting main  : i = %d, j = %d\n", i, j);
    fiddle(i, &j);
    printf("Finishing main  : i = %d, j = %d\n", i, j);
}


// arrays e pointers

// arrays e pointers estão ligados. os arrays são um tipo de pointer. de-referenciar
// o nome do array dá-nos o elemento 0 do array


arr[0]   ->   *arr
arr[1]   ->   *(arr+1)  etc

// os arrays podem ser passados nas funções mantendo o valor das variáveis
// na passagem nas funções podemos usar
//  int arr[]  ou  int *arr

//atenção         arr[2]++  é legal  mas arr ++  é ilegal!

//     INPUT E OUTPUT
#include <stdio.h>  // standard package


getchar(); // lê um caracter do keyboard. em caso de erro retorna EOF
putchar(character); //escreve um caracter no ecrã

// escrita e leitura formatadas
printf()
scanf()

printf("o numero %d\n",n);
scanf()

 scanf("%d", &i);


// Strings de controlo
%d  inteiro
%f  float/double
%c  character
%s  character string
%e  exponencial

%8.2f  formato float com 8 caracteres, 2 a seguir ao ponto decimal
%-8.2f a saida vem justificada à direita


// Acesso a files

FILE *outfile;  // definição do pointer outfile como sendo do tipo FILE

outfile = fopen("filename","w"); // abertura para escrita
fprintf(outfile,"um número %d\n",n);

// w   write
// r   read
// a   append