2. A Linguagem C

2.1. Tipos Estruturados

  1. Vetores e matrizes alocados estaticamente
  2. structs: uma variável capaz de armazenar vários camposd e diferentes tipos.

Exemplo:

struct {
    char nome[50];
    int nusp;
    float nota;
} aluno;

...

aluno.nota = aluno.nota - 0.5;
scanf("%d", &(aluno.nusp));

Em C é permitido definir novos tipos usando o typedef:

typedef struct {
    double x;
    double y;
} ponto;
ponto p;
p.x = 3;
p.y = 5;

2.2. Ponteiros

C permite manipular o endereço da memória em que as variáveis estão armazenadas.

Exemplos:

int a;
int *p;
int *q;
a = 10;
p = &a;
scanf("%d", p);
printf("%d", *p);  // o valor apontado por p
int v[5], *pv;
pv = &(v[2]);
*pv = 7;
*(pv - 1) = -4;
// ...
x = 1.3; y = 4.9;
troca(&x, &y);

Ponteiros têm dois usos principais:

  1. Passagem de parâmetros

    void troca(float a, float b) {
        float aux;
        aux = *a;
        *a = *b;
        *b = aux;
    }
    
  2. Vetores e matrizes são ponteiros

    int v[10];
    // v[5] é igual a *(v + 5)
    

Podemos usar isso para fazer alocação dinâmica de vetores e matrizes:

int n;
float *v;
scanf("%d", &n);
v = malloc(n * sizeof(float));
typedef struct {
    double r;
    double im;
} complexo;

complexo *vc;  // vetor complexo

vc = malloc(m * sizeof(complexo));

// ...
// Quando a memória não é mais necessária, deve ser liberada

free(vc);
for (int i = 0; i < m; i++)
    free(mat[i]);
free(mat);
// matriz
int **mat;
mat = malloc(m * sizeof(int *));
for (i = 0; i < n; i++)
    mat[i] = malloc(n * sizeof(int));
mat[4][7] = 10;

2.3. Declarações

// definições globais

#include <stdio.h>
#define PI 3.14159

// protótipo das funções

int mdc(int, int);

int main {
    return(0);
}

2.4. Variáveis

Uma variável em um programa é uma parte da memória reservada para armazenar um valor. As variáveis tem tipos. Em C os tipos não são fortes.

  1. int ex.: int num, soma; Os número inteiros são armazenados em 2 bytes «em copmlemento de dois», podendo assumir valores entre: -2^15 <= num <= 2^15 - 1 = 32767

    1.1 unsigned int: 0 <= x <= 2^16 - 1 1.1 long int: usa 4 bytes

  2. float Uma variável deste tipo armazena um «número real». Usamos o ponto flutuante.

Ex. 1234.5678: .12345678 * 10^4
              |----------|-----|
              |----------|-----|
  1. double Tem o dobro da precisão de float. Para leitura e impressão usamos: %f: float %lf: double

2.5. Tipos de dados

C não tem tipos fortes: Exemplo:

int n;
float x;

n = 7;
x= n / 2;

2.6. Imprimindo valores

// _ representa espaço

float x = 3.14159;
printf("%3.1f", x);  // 3.1
// ponto conta como vírgula
printf("%5.1f", x);   // __3.1
printf("%10.4f", x);  // ____3.1416

int m = 1234;
printf("%7d", m);   // ___1234
printf("%05d", m);  // 01234
printf("%2d", m);   // 1234

Terça, 7 de agosto

Quinta, 9 de agosto