Você está na página 1de 30

AEDsI Aula 05

Vetores

Universidade Federal de Minas Gerais

2017

DCC

1
Baseado nas aulas do professor Jefersson dos Santos
AEDsI Aula 05

Roteiro

1 Introducao

2 Vetores
Exemplos

3 Cadeias de caracteres
Lendo e escrevendo cadeias
Manipulando cadeias de caracteres

2 / 30
AEDsI Aula 05
Introducao

Como armazenar 3 notas?

float nota1, nota2, nota3;

printf("Nota do aluno 1: ");


scanf("%f", &nota1);
printf("Nota do aluno 2: ");
scanf("%f", &nota2);
printf("Nota do aluno 3: ");
scanf("%f", &nota3);

3 / 30
AEDsI Aula 05
Introducao

Como armazenar 100 notas?

float nota1, nota2, nota3, /* .... */ nota100;

printf("Nota do aluno 1: ");


scanf("%f", &nota1);
printf("Nota do aluno 2: ");
scanf("%f", &nota2);

/* ... */

printf("Nota do aluno 100: ");


scanf("%f", &nota100);

4 / 30
AEDsI Aula 05
Introducao

Como armazenar n (<= 100) notas?

float nota1, nota2, nota3, /* .... */ nota100;

if (n >= 1) { printf("Nota do aluno 1: ");


scanf("%f", &nota1); }
if (n >= 2) { printf("Nota do aluno 2: ");
scanf("%f", &nota2); }

/* ... */

if (n >= 100) { printf("Nota do aluno 100: ");


scanf("%f", &nota100); }

5 / 30
AEDsI Aula 05
Vetores

Vetores Definicao

Colecao de variaveis do mesmo tipo referenciada por um nome comum.


(Herbert Schildt)
acesso por meio de ndice
posicoes contguas na memoria
tamanho pre-definido
ndices fora dos limites podem causar comportamento anomalo do
codigo

6 / 30
AEDsI Aula 05
Vetores

Declaracao de um vetor

<tipo> identificador [<numero de posicoes>];

A primeira posicao de um vetor tem ndice 0.


A ultima posicao de um vetor tem ndice
<numero de posicoes> - 1.

Exemplo
float notas[100];

7 / 30
AEDsI Aula 05
Vetores

Usando um vetor

a = identificador [<posicao>];

Pode-se substituir uma variavel de um determinado tipo por um unico


elemento de um determinado vetor.
Este elemento se comporta como uma variavel: retorna o seu valor como
uma expressao e pode ter valores atribudos.

Exemplo
a = nota[10];
nota[5] = 9.5;

8 / 30
AEDsI Aula 05
Vetores

Vetores

Na memoria: (Ex. int d; int vetor[5]; int f;)

Nome d vetor f
Indice - 0 1 2 3 4 -

9 / 30
AEDsI Aula 05
Vetores

Vetores

Ao executar vetor[3]=10;:

Nome d vetor f
Indice - 0 1 2 3 4 -
10

10 / 30
AEDsI Aula 05
Vetores

Vetores

O que ocorre se digitar os comandos:


vetor[5]=5;
vetor[-1]=1;

11 / 30
AEDsI Aula 05
Vetores

Vetores

Ao executar
vetor[3]=10;
vetor[5]=5;
vetor[-1]=1;

Nome d vetor f
Indice - 0 1 2 3 4 -
1 10 5

12 / 30
AEDsI Aula 05
Vetores

Questoes importantes sobre vetores

O tamanho do vetor e pre-definido. (Ou seja, apos a compilacao o


tamanho nao pode ser mudado)
Indices fora dos limites podem causar comportamento anomalo do
codigo.

Veja exemplo em limites.c

13 / 30
AEDsI Aula 05
Vetores
Exemplos

Como armazenar n (<= 100) notas?

float nota[100];
int n, i;

printf("Numero de alunos: ");


scanf("%d", &n);

for (i = 0; i < n; i++) {


printf("Nota do aluno %d: ", i+1);
scanf("%f", &nota[i]);
}

Veja o codigo: notas.c


14 / 30
AEDsI Aula 05
Vetores
Exemplos

Polinomios

float coef[26];
int grau;

for (i = grau; i >= 0; i--) {


printf("coeficiente de x%d: ", i);
scanf("%f", &coef[i]);
}

Veja o codigo: poli.c

15 / 30
AEDsI Aula 05
Vetores
Exemplos

Derivada de um polinomio

float coef[26];
int grau;

for (i = 1; i <= grau; i++)


coef[i-1] = coef[i]* i;

grau--;

Veja o codigo: deriv.c

16 / 30
AEDsI Aula 05
Vetores
Exemplos

Cadeia de caracteres (string)

Vetor de caracteres terminado pelo caracter \0.

char str[30];
printf("Digite uma cadeia de caracteres: ");
scanf("%s", str);
for (i = 0; str[i] != \0; i++)
printf("%c", str[i]);
printf("\n");

Veja o codigo: str.c

17 / 30
AEDsI Aula 05
Vetores
Exemplos

Busca por um elemento

for (i = 0; str[i] != c && str[i] != \0; i++);

if (str[i] == c)
printf("%c esta presente em %s\n", c, str);
else
printf("%c nao esta presente em %s\n", c, str);

Veja o codigo: busca.c

18 / 30
AEDsI Aula 05
Vetores
Exemplos

Balanceamento de parenteses

Como verificar se uma cadeia do tipo

()()()()())))))))(((())(()))())())()()

esta balanceada?

Veja o codigo: balanc.c

19 / 30
AEDsI Aula 05
Cadeias de caracteres

Cadeias de caracteres

Uma cadeia de caracteres, mais conhecida como string, e uma


sequencia de letras e smbolos, onde os smbolos podem ser espacos
em branco, dgitos e varios outros como pontos de exclamacao e
interrogacao, smbolos matematicos, etc.
Em C, uma cadeia de caracteres e representada por um vetor de
variaveis do tipo char e e terminada com o marcador \0.

20 / 30
AEDsI Aula 05
Cadeias de caracteres

Declarando uma cadeia de caracteres

Exemplo de declaracao
char texto [TAMANHO + 1];

Devemos utilizar uma posicao alem do tamanho maximo desejado para


que possa ser colocado o marcador \0 no final da maior cadeia
armazenavel nesta variavel.

21 / 30
AEDsI Aula 05
Cadeias de caracteres
Lendo e escrevendo cadeias

Lendo uma cadeia do teclado

Podemos ler uma cadeia caracter a caracter, como faramos com


qualquer outro vetor, mas e mais simples ler a cadeia inteira, utilizando o
formato %s.

scanf ("%s", texto);

Note que nao utilizamos o e comercial (&) para cadeias. Isso ocorre pois
o nome de um vetor ja e um endereco de memoria (o endereco de
memoria do comeco do vetor).
Veja o exemplo em scanf.c.

22 / 30
AEDsI Aula 05
Cadeias de caracteres
Lendo e escrevendo cadeias

Lendo uma cadeia do teclado

Infelizmente, a leitura a partir do teclado utilizando o scanf le somente ate


o primeiro espaco, ou seja, le somente uma palavra, o que torna o seu
uso desta forma um pouco restrito.
Para contornar isso, podemos utilizar a funcao gets, que faz a leitura
ate encontrar o caracter de fim de linha (enter ).

gets(texto);

Veja o exemplo em gets.c.

23 / 30
AEDsI Aula 05
Cadeias de caracteres
Lendo e escrevendo cadeias

Lendo uma cadeia do teclado

Outra opcao e explorar as outras possibilidades fornecidas pela funcao


scanf. Por exemplo, a opcao abaixo le uma cadeia de caracteres ate
encontrar um enter.

scanf("%[\n]");

Veja um exemplo em scanf-alternativo.c. Veja mais opcoes


consultando a pagina de manual com o comando man scanf.

24 / 30
AEDsI Aula 05
Cadeias de caracteres
Lendo e escrevendo cadeias

Lendo uma cadeia do teclado

Aqui, deparamos com outro problema: tanto o comando scanf quanto o


gets podem ler mais caracteres que os existentes na cadeia,
provocando erros.
A solucao aqui, e utilizar uma funcao que tenha o mesmo
comportamento do gets, mas que permita limitar a leitura a um tamanho
maximo. As opcoes sao:

fgets (texto, 50, stdin);


scanf ("%50[\n]", texto);

Veja os exemplos em fgets.c e scanf-alternativoN.c.

25 / 30
AEDsI Aula 05
Cadeias de caracteres
Lendo e escrevendo cadeias

Escrevendo uma cadeia na tela

Podemos escrever uma cadeia na tela caracter a caracter, mas e mais


simples escrever utilizando o comando printf, com o mesmo formato
utilizado para le-la (%s)

printf ("%s", texto);

26 / 30
AEDsI Aula 05
Cadeias de caracteres
Lendo e escrevendo cadeias

Escrevendo uma cadeia na tela

De forma analoga ao gets e fgets, temos o puts e fputs, que


escrevem a cadeia na tela.

puts (texto);
fputs (texto, stdout);

Veja o exemplo em puts.c.

27 / 30
AEDsI Aula 05
Cadeias de caracteres
Manipulando cadeias de caracteres

Manipulando cadeias de caracteres

As cadeias de caracteres sao tao importantes que existe uma biblioteca de


funcoes so com comandos para ela, a biblioteca string.h. Entre as
diversas funcionalidades oferecidas por esta biblioteca, podemos destacar:
strlen(texto) Retorna o tamanho da cadeia texto em numero
de caracteres.
strcpy(destino, fonte) Copia a cadeia fonte para a
cadeia destino.
strcat(destino, fonte) Concatena a cadeia fonte no fim
da cadeia destino.
Veja o exemplo de uso em funcoes.c.

28 / 30
AEDsI Aula 05
Cadeias de caracteres
Manipulando cadeias de caracteres

Manipulando cadeias de caracteres

Apesar de ser mais pratico usar as funcoes da biblioteca string.h, e


importante sabermos como manipular cadeias diretamente.
Em especial, cadeias nao possuem um valor indicando explicitamente o
seu tamanho, pois sao terminadas pelo caracter \0.
Veja como reimplementar a funcao strlen() no exemplo em
tamanho.c

Exerccio
Reimplemente a funcao strcpy(). Veja o arquivo copia.c.

29 / 30
AEDsI Aula 05
Cadeias de caracteres
Manipulando cadeias de caracteres

Manipulando cadeias de caracteres

Mais uma funcao util da biblioteca string.h:


strcmp(str1, str2) Compara duas cadeias de caracteres e
retorna um valor:
= 0: se str1 e str2 forem iguais;
< 0: se str1 for menor que str2;
> 0: se str1 for maior que str2.
Veja um exemplo de uso em ordena.c.

30 / 30