Tabelas
Tabelas para Guardar Conjuntos de Elementos
Tabelas Unidimensionais (Vectores)
Uma tabela permite guardar vários elementos do mesmo tipo - é aceite qualquer tipo de dados que seja reconhecido, mas não podemos misturar tipos de dados na mesma tabela. int tab[DIM];, por exemplo, cria uma tabela tab de tamanho DIM que armazena inteiros (apenas inteiros).
Esta propriedade advém, claro, do facto de C ser uma linguagem tipificada - em Python, por exemplo, a não ser que tipifiquemos explicitamente uma lista, esta pode armazenar tipos de dados diferentes.
Para aceder ao valor da tabela na posicao i, devemos usar a notação tab[i]. Já para atribuir um valor à posição i da tabela, devemos usar a notação tab[i] = n.
Tal como em Python, as tabelas são indexadas a partir de 0. Assim sendo, o primeiro índice é o 0 e o último índice é o DIM - 1.
AVISO
Quando a tabela é criada, os valores que esta guarda não são inicializadas a 0, têm valores pseudo-aleatórios. Para defini-las a 0, podemos fazer um loop atribuindo a cada posição da tabela o valor 0.
#include <stdio.h>
int main () {
int i;
int tab[10];
// Inicializa uma tabela cujos
// valores são o dobro dos índices
// e.g. [0, 2, 4, 6, ...]
for (i = 0; i < 10; i++) {
tab[i] = 2 * i;
}
for (i = 0; i < 10; i++) {
printf("%d\n", tab[i]);
}
return 0;
}Output do programa acima
0
2
4
6
8
10
12
14
16
18
20Tabelas Bidimensionais (Matrizes)
Uma tabela permite guardar vários elementos do mesmo tipo. Podemos, claro, guardar tabelas dentro de tabelas! char tab[DIM1][DIM2]; cria uma tabela tab de tamanho DIM1 que armazena tabelas de tamanho DIM2 que armazena caracteres.
Para aceder ao valor da posição j na tabela indexada por i, devemos escrever tab[i][j]. Por outro lado, para atribuir um valor à posição j na tabela i, devemos escrever tab[i][j] = n.
Strings (Cadeias de Caracteres)
Leitura de Valores do Standard Input
Podemos guardar caracteres em tabelas (Vetores).
Em C, qualquer cadeia de caracteres que se preze acaba com \0: a cadeia de caracteres "hello\n", por exemplo, é composta pelos caracteres h, e, l, l, o, \n e \0.
O \0 indica o fim da cadeia de caracteres, e a função printf espera strings neste formato (podemos printar cadeias de caracteres usando %s).
Os Vetores são copiados posição a posição!
#include <stdio.h>
#define DIM 100
int main() {
int c, i;
char origem[DIM], destino[DIM];
for (i = 0; i < DIM - 1 && (c = getchar()) != EOF && c != '\n'; i++) {
origem[i] = c;
}
origem[i] = '\0';
i = 0;
while ((destino[i] = origem[i]) != '\0') {
i++;
}
printf("Origem: %s\nDestino: %s\n", origem, destino);
return 0;
}Leitura de Strings com o Scanf
#include <stdio.h>
#define DIM 100
int main() {
char palavra[DIM];
scanf("%s", palavra);
printf("%s", palavra);
return 0;
}O scanf permite ler uma string através da formatação %s. A leitura é feita até encontrar um "whitespace" (" ", \n, \t, etc) - não podemos, com um único scanf("%s", ...), ler toda uma cadeia com várias palavras. Mais ainda, o scanf automaticamente insere \0 no final da leitura da cadeia.
Será, contudo, de grande utilidade poder ler linhas inteiras (ou, pelo menos, mais que uma palavra de cada vez) - a função fgets entra aqui em cena, permitindo ler linhas inteiras!
String.h
Ao escrever #include <string.h>, estamos a adicionar ao nosso programa uma biblioteca equipada com um conjunto bastante razoável de funções para manipulação de strings.
Exemplos úteis (que vão certamente ser-vos úteis nos vossos projetos) incluem:
strcmp(compara strings)strcpy(copia strings)strdup(duplica uma string)strlen(devolve o tamanho da string dada como argumento)- entre outros.
tip
Escrever man <nome da função> no terminal permite ver o que as funções fazem. Caso não tenham um sistema onde manpages estejam à vossa disposição, as manpages online podem ser-vos particularmente útil.