Escolar Documentos
Profissional Documentos
Cultura Documentos
IPC2
1999/2000
F. Nunes Ferreira
Arrays
Introdução
Arrays
Um exemplo
u Um array de 6 elementos
u Declaração
int c[6];
4
Arrays
Declarações
Arrays
Um exemplo
Arrays
Algumas considerações
Arrays
Cadeia de caracteres (string)
#include <stdio.h>
int main(void)
{
char cadeia1[20], cadeia2[] = "constante literal";
int i;
printf("Indicar uma cadeia: ");
& não é
scanf("%s", cadeia1); necessário
printf("cadeia1 e': %s\ncadeia2 e': %s\n",
cadeia1, cadeia2);
Arrays
Arrays como argumentos de funções
u C passa arrays completos para funções, simulando uma
chamada por referência.
u Boa solução em termos de desempenho
u O nome de um array corresponde ao endereço do seu
primeiro elemento, &nome-array[0]
#include <stdio.h>
int main(void)
{
char cadeia[5];
printf(" cadeia = %p\n&cadeia[0] = %p\n",
cadeia, &cadeia[0]);
cadeia = 0064FDF0
return 0; &cadeia[0] = 0064FDF0
}
#include <stdio.h>
#define TAMANHO 5
void modificArray(int [], int);
int main(void)
{
int i, a[5] = {0, 10, 20, 30, 40};
printf("Valores originais:\n");
for (i = 0; i <= TAMANHO - 1; i++)
printf("%4d", a[i]);
modificaArray(a, TAMANHO);
printf("\nValores modificados:\n");
for (i = 0; i <= TAMANHO - 1; i++) Valores originais:
printf("%4d", a[i]); 0 10 20 30 40
return 0; Valores modificados:
} 0 50 100 150 200
void modificaArray(int x[], int comprimento)
{
int j;
for (j = 0; j <= comprimento - 1; j++)
x[j] *= 5;
}
• O que resultaria se fosse:
modificaArray(&a[2], TAMANHO - 2);
13
Arrays
Qualificador const aplicado a arrays
u Qualificador const utilizado para evitar alterações
(não desejadas) de arrays dentro de funções
void tentaModificar(const int []);
int main(void)
{
int a[] = {10, 20, 30};
tentaModificar(a);
. . .
return 0;
}
void tentaModificar(const int b[]) Erros de compilação, por
{ tentativa de modificar
b[0] *= 10;
constantes ! . . .
b[1] *= 20;
b[2] *= 30;
}
• Desempenho da referência, segurança da passagem por
valor
14
Arrays
Ordenação - bubble sort
u O array vai ser percorrido tantas vezes quantos os
seus elementos menos 1.
Em cada percurso o maior valor encontrado é puxado
para o final...
Valores originais:
5 1 7 3 2 4 0 9 8 6
... Vai comparando Valores em ordenacao:
1 1 5 3 2 4 0 7 8 6 9
pares de valores ... 2 1 3 2 4 0 5 7 6 8 9
... e trocando-os 3 1 2 3 0 4 5 6 7 8 9
4 1 2 0 3 4 5 6 7 8 9
entre si, 5 1 0 2 3 4 5 6 7 8 9
se necessário 6 0 1 2 3 4 5 6 7 8 9
7 0 1 2 3 4 5 6 7 8 9
8 0 1 2 3 4 5 6 7 8 9
9 0 1 2 3 4 5 6 7 8 9
Arrays
Ordenação - bubble sort
u Uma versão em que o bubble sort só trata da
ordenação
- ler nº inteiros a ordenar
- ler vector
- visualizar vector a ordenar
- ordenar vector
#include <stdio.h>
- visualizar vector ordenado
#define DIM_MAX 100
#define N_COL 6
int leVector(int vec[], int dim);
void visuVector(const int vec[], int dim, int nCol);
void bubleSort(int vec[], int dim);
int main(void)
{
...
int main(void)
{
int valores[DIM_MAX], num;
do {
printf("\nNumero valores (< %d):\n", DIM_MAX);
scanf("%d", &num);
} while (num < 1 || num > 100);
printf("\n\nVector a ordenar:\n");
visuVector(valores, num, N_COL);
bubleSort(valores, num);
printf("\nVector ordenado:\n");
visuVector(valores, num, N_COL);
return 0;
}
int leVector(int vec[], int dim)
{
int i;
for(i = 0; i < dim; i++) {
printf("\nInteiro: ");
scanf("%d", &vec[i]);
}
return i;
}
Arrays
Ordenação - A função bubble sort
Arrays
Exemplo: pesquisa linear
u Pesquisa linear (arrays pequenos e não
necessariamente ordenados)...
u Pesquisa binária (arrays grandes e necessariamente
ordenados)...
if (indice == -1)
printf("Valor nao encontrado\n");
else
printf("Valor encontrado na posicao de indice %d\n", indice);
return 0;
}
int procuraLin (int a[], int valorProcurado,
int comprimento)
{
int i;
for (i = 0; i < comprimento; i++)
if (a[i] == valorProcurado)
return i;
return -1;
}
23
Arrays
Exercício: pesquisa binária
u Idêntido ao anterior, mas com pesquisa binária
int procBin(const int quad[], int valor, int indInf, int indSup)
i c e 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
índ -------------------------------------------------------------
t o r 0 2 4 6 8 10 12 14* 16 18 20 22 24 26 28
vec 16 18 20 22* 24 26 28
24 26* 28
24*
25 nao foi encontrado
Indicar um valor entre 0 e 28: 6
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
-------------------------------------------------------------
0 2 4 6 8 10 12 14* 16 18 20 22 24 26 28
0 2 4 6* 8 10 12
6 foi encontrado na posicao 3
24
Arrays
arrays multidimensionais
u Array bidimensional: int q [3][4]
Coluna Coluna Coluna Coluna
0 1 2 3
Linha 0 q[0][0] q[0][1] q[0][2] q[0][3]
Linha 1 q[1][0] q[1][1] q[1][2] q[1][3]
Linha 2 q[2][0] q[2][1] q[2][2] q[2][3]
Arrays
arrays multidimensionais
u Para percorrer um array (linha a linha, coluna ...)
soma = 0;
for (linha = 0; linha <= 2; linha++)
for (coluna = 0; coluna <= 3; coluna++)
soma += q[linha][coluna];
u Inicialização
int a[2][3] = {{1, 2, 3},{4, 5, 6}}; a: 1 2 3
4 5 6
Exercícios
Simulação de um helicóptero digital - 1
u Um helicóptero imaginário é comandado
através do teclado. O helicóptero, quando no
ar, não deixa rasto. Para deixar rasto
deverá estar em contacto com o terreno.
Comando Efeito
1 Põe o helicóptero no ar
2 Põe o helicóptero em contacto com o terreno
3 Faz o helicóptero rodar 90o para a direita
4 Faz o helicóptero rodar 90o para a esquerda
5 d Desloca o helicóptero (pelo ar ou em
contacto com o terreno) d posições para a frente
6 Visualiza o terreno (com os rastos feitos
pelo helicóptero)
7 Limpa os rastos do helicóptero no terreno
9 Termina o programa
27
Exercícios
Simulação de um helicóptero digital - 2
u O terreno é suposto ser um quadrado de dimensão 20 x
20, a que corresponde 20 x 20 células, cada uma
identificada pela linha e coluna respectivas. O
helicóptero é caracterizado pela sua posicao, dada
pela linha e coluna onde se encontra (não
necessariamente uma linha e uma coluna do terreno,
pois o helicóptero pode deslocar-se para fora dos
limites daquele), e é ainda caracterizado pela sua
orientacao (um dos pontos cardeais: N, S, E ou O) e
situacao (no ar ou no plano do terreno).
linha 20 --------------------
-------------------- Helicóptero
-------------------- posição: 16 11
-------------------- situação: terreno
----------H--------- orientação: N
N
...
linha 1 --------------------
28
Exercícios
Simulação de um helicóptero digital - 3
u O helicóptero é visualizado pela letra H, as células
ainda não visistadas por ele são visualizadas com -,
enquanto que as já visitadas serão representadas por
O. Por exemplo, após o comando 5 com d=2, obtém-se:
linha 20 --------------------
-------------------- Helicóptero
----------H--------- posição: 18 11
----------O--------- situação: terreno
----------O--------- orientação: N
...
linha 1 --------------------
Exercícios
Simulação de um helicóptero digital - 4
u Comando: 3 ; roda para a direita 90o
u Comando: 5 ; avança
u Posicoes em frente: 3 ; 3 posições
u Comando: 4 ; roda para a esquerda 90o
u Comando: 5 ; ...
u Posicoes em frente: 2
u Comando: 4
u Comando: 5
u Posicoes em frente: 6
u Comando: 6
linha 20 --------------------
--------------------
-------HOOOOOO------
-------------O------
----------OOOO------
...
linha 1 --------------------
30
Exercícios
Simulação de um helicóptero digital - 5
u 1- Definir e implementar, se necessário, uma
abstracção de dados compatível com o problema
exposto.
u 2- Fazer uma abordagem de-cima-para-baixo ao
programa helicoptero-digital, para identificar as
suas tarefas e sub-tarefas principais.
u 3- Escrever em C o programa helicoptero-digital,
tomando por base os resultados da abordagem
anterior.
u Nota:
O helicóptero na sua deslocação pode ultrapassar os
limites do terreno, situação em que não deixa rasto.
O programa continuará a actualizar as suas
características, de acordo com os comandos que vai
recebendo.
31
Exercícios
Bubble sort
u A ordenação bubble sort já apresentada é
extremamente ineficiente para arrays de
grandes dimensões. Introduzir os seguintes
melhoramentos àquela solução.
Arrays
Ordenação - A função bubble sort
Exercícios
Bucket Sort - 1
u Um array contém n inteiros positivos para ordenar.
Considerar um array auxiliar 10 x n. Cada uma das
suas 10 linhas é designada por bucket. Escrever a
função bucketSort que toma um array de inteiros e o
seu comprimento como argumentos e implementa o
seguinte algoritmo:
1- Percorre o array e coloca os seus elementos nas
linhas do array 10 x n, de acordo com o seu dígito
das unidades. Por exemplo, 97 é colocado na linha 7,
3 é colocado na linha 3, e 100 na linha 0.
2- Percorre o array auxiliar e obtém o array inicial
agora ordenado da seguinte maneira: 100, 3, 97.
3- Repete 1- e 2- agora com o dígito das dezenas,
depois das centenas, ... e termina quando é tratado
o dígito mais significativo do maior número.
34
Exercícios
Bucket Sort - 2
Array a 10 buckets
ordenar B0 B1 B2 B3 B4 B5 B6 B7 B8 B9
97 3 100 100 3 97
100 3 97 100 97
3
100 3 97 3 100
97
Exercícios
Selection sort
Exercícios
Pesquisas linear e binária
u Foi apresentado um exemplo relativo à procura linear
(para arrays pequenos e com os respectivos elementos
não ordenados). Escrever agora uma função recursiva que
faz a mesma pesquisa e recebe como argumentos um array
de inteiros, um inteiro que é o valor a procurar e um
inteiro que é o tamanho daquele array. Se o valor é
encontrado, a função devolve a sua posição. Se não for
encontrado, devolve -1.
Exercícios
Recursividade
Exercícios
Recursividade