Lab 4 - Arrays, Strings e Matrizes
Na última aula trabalhamos com conceitos básicos de C e com tipos de dados simples (inteiros e números fracionários). Hoje veremos as primeiras estruturas complexas em C: arrays (também chamados de vetores), matrizes e strings.
Arrays em C
Criamos arrays de tamanho fixo em C usando a seguinte sintaxe:
long A[100];
Basta adicionar []
após o tipo e teremos um array de tamanho constante (i.e. não dependente da entrada do usuário). Não é possível redimensionar o array. Depois de declarado ele terá para sempre o mesmo tamanho.
O acesso a elementos também é bastante simples:
printf("%ld\n", A[3]);
A linha acima imprime o quarto elemento do vetor. O uso com scanf
segue a mesma lógica dos tipos simples:
scanf("%ld", &vetor[0]);
Exercise 1
Exercise 2
Answer
Como podemos ver, o código compila, mas seu comportamento é indefinido por duas razões:
- O vetor não é inicializado com 0 quando é criado, embora seja em outras linguagens como Java.
- A posição
vetor[5]
não é válida e pode resultar na leitura de dados inválidos da memória.
Tip 1
Diferentemente de outras linguagens, C não verifica os índices automaticamente nem inicializa o elementos do vetor com algum valor padrão. Além disto, nem sempre é possível obter o tamanho de um vetor a partir de seu nome.
Exercise 3
Um ponto importante é que o sistema de tipos não permite a conversão/passagem de vetores do mesmo tipo, mas com tamanhos diferentes. Assim, a função abaixo não aceitaria como argumento a variável double arr[4]
, pois só aceita vetores de tamanho 3.
double soma_3doubles(double arr[3]) {
double s = 0;
for (int i = 0; i < 3; i++) {
s += arr[i];
}
return s;
}
Para fazê-la aceitar vetores de tamanho qualquer poderíamos mudar sua assinatura para não checar o tamanho do vetor e passá-lo como argumento da função.
double soma(double arr[], int n);
Exercise 4
Exercise 5
Answer
int vec[] = {0, 2, 3, 2, 5};
Strings
Como visto na expositiva, strings são arrays de caracteres sendo que o último elemento da string contém um caractere '\0'
. Logo, uma string declarada como char str[100]
pode guardar strings de até 99 caracteres (mais 1 para o '\0'
). Se a string tiver comprimento menor o restante das posições simplesmente não é utilizado.
Note
Em C podemos usar: \0
, NULL
, e 0
para representar a mesma coisa!
Tip 2
Uma string em C nada mais é do que um array do tipo char
cujo último elemento é um \0
.
As duas linhas abaixo tem o mesmo efeito.
char arr[] = "insper";
char arr2[] = {'i', 'n', 's', 'p', 'e', 'r', '\0'};
Exercise 6
Answer
Em C, aspas duplas "a"
indicam um vetor composto por: [a
, \0
] e a aspas simples indicam apenas um char.
Para imprimir uma string no terminal basta usar o código %s
na string de formatação do printf:
char str[10] = "world!";
printf("hello %s\n", str);
Já a leitura de strings é feita usando a função fgets, que recebe um array de char
com tamanho n
e lê até n-1
caracteres de um arquivo ou do terminal. fgets para quando encher o vetor ou quando encontrar uma quebra de linha \n
. No exemplo abaixo, stdin
(Standard Input) representa o terminal.
#define STRING_LEN 10 // Tamanho da string 0..9
char str[STRING_LEN];
fgets(str, STRING_LEN, stdin); // precisamos passar o tamanho máximo
// + 1 da nossa string.
Exercise 7
Answer
O último caractere de uma string é sempre '\0'
! Logo, podemos percorrer os caracteres até que um '\0'
seja encontrado.
Exercise 8
Exercise 9
Matrizes
Como visto na expositiva, matrizes em C nada mais são que "vetores de vetores", ou seja, vetores colocados um após o outro.
long mat[10][3];
printf("%d", mat[0][2]); /* acessa linha 0, coluna 3 */
scanf("%d", &mat[1][1]); // armazena inteiro digitado na posição 1,5
Perceba que toda a primeira linha é armazenada (contendo 3 long
s) antes do início da segunda linha. Ou seja, a matriz é armazenada "deitada" na memória, uma linha após a outra.
Exercise 10
Answer
Respectivamente: 2, 5 e 6.
| offset
v
0: [0][0]
1: [0][1]
2: [0][2] <---
3: [1][0]
4: [1][1]
5: [1][2] <---
6: [2][0] <---
7: [2][1]
8: [2][2]
Warning
As próximas tarefas devem ser feitas a partir de um arquivo vazio e compiladas usando os conhecimentos que vocês obtiveram no Lab 3.
Exercise 11
Exercise 12
Exercícios
Agora que já trabalhamos um pouco com arrays, strings e matrizes está na hora de praticar com exercícios mais complexos. Estes exercícios não são opcionais: sua realização é essencial para cumprir os objetivos do Mutirão.
Exercise 13
Exercise 14