Você está na página 1de 31

Arranjos

•  1 dimensão

•  várias dimensões

1 INF 01202 - Prof. Marcelo Walter – Aula 12


Exercício da última aula:
1. Preencher um arranjo X ( 200 ) por leitura.
2. Procurar o maior elemento deste arranjo.
3. Informar o valor do maior elemento, e sua posição
(caso o valor máximo ocorra mais de uma vez, informar
a posição da primeira ocorrência).

2 INF 01202 - Prof. Marcelo Walter – Aula 12


/* Procura maior elemento de um arranjo e informa maior elemento e sua posicao.
Entradas: 200 elementos lidos pelo teclado
Saida: valor e posicao do maior elemento */
#include <stdio.h>
#define TAMVET 200
int main ( )
{
float vet [TAMVET]; // array unidimensional para armazenamento dos 200 valores
int index;
float maior;
int posicao;
// preencher x por leitura
for (index = 0; index < TAMVET; index++)
scanf (“%f”, &vet[index]);
// inicialização de maior e posicao
maior = vet[0];
posicao = 0;
// procura do maior e de sua posicao
for (index = 1; index < TAMVET; index++) //pq o laço começa de 1??
if (vet[index] > maior) //atualiza maior posicao ate o momento
{
maior = vet[index];
posicao = index;
}
// resposta
printf (“O maior valor eh %f, e ocorre na posicao %d”, maior, posicao);

return 0;
}
3 INF 01202 - Prof. Marcelo Walter – Aula 12
Ex: Codifique em C a sequência de passos abaixo:
1. Preencher arranjo (10 elementos inteiros) por leitura.
2. Escrever os valores de arranjo em uma só linha.
3. Ler um valor v.
4. Informar quantas vezes este valor lido aparece em arranjo.
5. Imprimir os valores de arranjo superiores a v.
6. Ordenar arranjo (ordem crescente).
7. Imprimir novamente arranjo, já ordenado.

4 INF 01202 - Prof. Marcelo Walter – Aula 12


Ex: Codifique em C a sequência de passos abaixo:
1. Preencher arranjo (10 elementos inteiros) por leitura.
2. Escrever os valores de arranjo em uma só linha.
3. Ler um valor v.
4. Informar quantas vezes este valor lido aparece em arranjo.
5. Imprimir os valores de arranjo superiores a v.
6. Ordenar arranjo (ordem crescente).
7. Imprimir novamente arranjo, já ordenado.
/* Programa que preenche arranjo por leitura, imprime, verifica quantas vezes um dado valor
Esta no arranjo, e ordena o arranjo
Entradas: 10 valores do arranjo (lidos do teclado), e valor para comparacao
Saida: impressao do arranjo original, do numero de valores igual ao informado, e do arranjo
ordenado */
#include <stdio.h>
#define LIM_ARRANJO 10
int main ( )
{
int arranjo[LIM_ARRANJO];
int ind_arranjo; 1
printf(“Entre os %d valores inteiros do arranjo:”, LIM_ARRANJO);
for (ind_arranjo = 0; ind_arranjo < LIM_ARRANJO; ind_arranjo ++) // item 1
scanf(“%d”, &arranjo[ind_arranjo]);

printf(“Escrita do arranjo\n”); 2
for (ind_arranjo = 0; ind_arranjo < LIM_ARRANJO; ind_arranjo ++) // item 2
printf(“%d ”, arranjo[ind_arranjo]);
printf(“\n\n”);
5 INF 01202 - Prof. Marcelo Walter – Aula 12
...
Ex (cont):
3. Ler um valor v.
4. Informar quantas vezes este valor lido aparece em arranjo.
5. Imprimir os valores de arranjo superiores a v.
6. Ordenar arranjo (ordem crescente).
7. Imprimir novamente arranjo, já ordenado
...
int val_lido; // valor lido 3
int cont; // contador
printf(“Entre um valor inteiro:”);
scanf(“%d”, &val_lido); // item 3

cont = 0; // item 4 4
for (ind_arranjo = 0; ind_arranjo < LIM_ARRANJO; ind_arranjo ++)
if (arranjo[ind_arranjo] == val_lido)
cont++;
printf(“O valor %d aparece %d vezes no arranjo\n”, val_lido, cont);
printf(“\n\n”);
5
printf(“Os seguintes valores do arranjo são maiores do que %d\n”, val_lido);
for (ind_arranjo = 0; ind_arranjo < LIM_ARRANJO; ind_arranjo ++) // item 5
if (arranjo[ind_arranjo] > val_lido)
printf (“%d ” , arranjo[ind_arranjo] );
printf(“\n\n”);
...
6 INF 01202 - Prof. Marcelo Walter – Aula 12
Ex (cont):
6. Ordenar arranjo (ordem crescente).
7. Imprimir novamente arranjo.

0 1 2 3 4 5 6 7 8 9 ...
A 23 14 57 7 89 26 10 14 64 59

Menor

7 INF 01202 - Prof. Marcelo Walter – Aula 12


Ex (cont):
6. Ordenar arranjo (ordem crescente).
7. Imprimir novamente arranjo.

0 1 2 3 4 5 6 7 8 9 ...
A 23
7 14 57 237 89 26 10 14 64 59

Menor
repetir
Ordenação por Seleção
1.  Procura o menor elemento
2.  Colocar este menor na primeira posição
3.  Procurar o menor da segunda em diante
4.  Colocar na segunda posição
5.  ... até o penúltimo
8 INF 01202 - Prof. Marcelo Walter – Aula 12
Ordenação por Seleção

•  Tente fazer em casa a implementação deste algoritmo


de ordenação por seleção
•  Veremos a solução na próxima aula

9 INF 01202 - Prof. Marcelo Walter – Aula 12


VETORES DE CARACTERES

STRINGS

10 INF 01202 - Prof. Marcelo Walter – Aula 12


Ex:Ler o nome de 30 alunos e a nota correspondente.
Calcular e informar a média da turma, seguido dos nomes
dos alunos com nota inferior à média da turma.

Como obter e
armazenar nomes?
Nome: cadeia de caracteres ou string
No C:
•  caractere : char (1 caractere)
•  strings: vetor de caracteres (+ de 1)

11 INF 01202 - Prof. Marcelo Walter – Aula 12


1 caractere

Variável caractere: char caract;


Leitura:
1) scanf - função genérica de leitura:
scanf(“ %c”, &caract);
Atenção: colocar um espaço em branco antes do %c, para que
caracteres de fim de linha, de espaço ou de tabulação, ainda
existentes no buffer do dispositivo, não interfiram na leitura
efetuada. Alternativamente, limpar o buffer usando o comando
fflush(stdin)

2) getchar - função específica para leitura de caracteres:


caract = getchar( );

12 INF 01202 - Prof. Marcelo Walter – Aula 12


Função getchar

// Leitura de 1 caractere:
// Forma geral: getchar( )
//testa funcao getchar
#include <stdio.h>

int main( )
{
char ch;

printf("Forneca um caractere: ");


ch = getchar( );
printf("O caractere digitado: %c\n", ch);

return 0;
}

13 INF 01202 - Prof. Marcelo Walter – Aula 12


N caracteres = string

Strings são cadeias ou sequências de caracteres.

Em C, as strings são vetores de caracteres que têm como


característica apresentar o caractere delimitador de fim
‘\0’ (caractere da posição 0 da tabela ASCII – não é o dígito 0).

Importante: toda string é um vetor de caracteres, mas nem todo


vetor de caracteres é uma string (pois pode não apresentar o
delimitador ‘\0’)

Exemplo: vetor de caracteres vet de 9 posições, apenas com as


posições de 0 a 6 ocupadas (outras posições com “lixo”):

0 1 2 3 4 5 6 7 8

vet b r a s i l \0 ? ?

14 INF 01202 - Prof. Marcelo Walter – Aula 12


STRINGS
  Declaração: similar a arranjos

  char nome_do_string [elem];

•  O tamanho de uma string deve sempre prever a inclusão do caractere


delimitador ‘\0’
–  ou seja, antes da declaração de uma variável string, contar o
número máximo de caracteres a serem nela armazenados e somar
1 a este número.
•  Exemplo:
–  sejam 2 variáveis char dia_da_semana[?] e mes[?]: o dia da
semana com maior número de caracteres é segunda-feira (13) e o
mês com maior número de caracteres é fevereiro (9).
–  logo, essas variáveis devem ser declaradas no mínimo como:
char dia_da_semana[14], mes[10];

15 INF 01202 - Prof. Marcelo Walter – Aula 12


STRINGS
ATENÇÃO
è As strings são representadas entre aspas duplas e os
caracteres entre apóstrofes.
è Por definição, toda string tem o caractere terminador
‘\0’ ao final.
è Assim, “A” e ‘A’ NÃO são a mesma coisa!!
“A” : vetor de 2 caracteres- ‘A’ e ‘\0’.
‘A’ : um único caractere.
è Uma string é sempre um vetor de caracteres (com ‘\0’
ao final), mas um vetor de caracteres nem sempre é uma
string !

16 INF 01202 - Prof. Marcelo Walter – Aula 12


Inicialização de strings

A inicialização de strings , como de arranjos em geral, pode ser feita


de várias maneiras conforme exemplos a seguir.

Exemplo 1:
char primeiro_nome[15] = “Ana”;
char primeiro_nome[15] = {‘A’, ‘n’, ‘a’};
O sistema insere os caracteres entre chaves, a partir da posição 0.
Se o tamanho do vetor for superior ao número de caracteres nele
armazenados, as posições não ocupadas serão preenchidas com
zero, ou seja, nesse caso o arranjo terá um caractere terminador
‘\0’, pois será preenchido com zeros a partir da terceira posição.

17 INF 01202 - Prof. Marcelo Walter – Aula 12


Inicialização de strings
Exemplo 2:
char primeiro _nome[ ] = “Ana”;

O sistema determina o número de caracteres entre as aspas


duplas, soma um para o caractere terminador, e cria uma
string com o tamanho igual a tamanho da string + 1.

Exemplo 3:
char primeiro_nome[4] = “Joao”;

Problema, pois são necessários cinco caracteres para


representar o nome Joao como string (não esquecer da
terminação de string!!!)

18 INF 01202 - Prof. Marcelo Walter – Aula 12


Leitura e escrita de strings com scanf e printf
Leitura
Formato: %s, mas não se deve colocar o & antes do nome da
variável. O scanf encerrará a leitura do string assim que um
branco for encontrado no string de entrada, ou um caractere de
fim de linha ou de tabulação.
Ex.: char nome_cliente[20];
scanf(“%s”, nome_cliente);
// se usuário digitou Maria do Socorro
//em nome do cliente, apenas Maria foi armazenada
Escrita
O formato usado também é o %s.
Ex.: char nome_cliente[20];
(...)
printf(“O nome do cliente eh %s\n”, nome_cliente);

19 INF 01202 - Prof. Marcelo Walter – Aula 12


Leitura e escrita de strings com gets e puts

Leitura
O comando gets permite colocar na variável todos os caracteres
introduzidos, sem estar limitado a 1 palavra.
Ex.: char nome_cliente[30];
gets(nome_cliente);
// se usuário digitou Maria do Socorro Silva,
//todo o nome estará armazenado em nome_cliente

Escrita
O comando puts permite a escrita de 1 único string (constante
literal ou variável), mudando automaticamente de linha após.
Ex.: char nome_cliente[20];
(...)
puts(“Informe nome da cliente:”);
gets(nome_cliente);

20 INF 01202 - Prof. Marcelo Walter – Aula 12


Função gets – getstring e puts - putstring

// Exemplo de leitura de n strings, sem parar no branco:


//testa funcao gets
#include <stdio.h>

int main( )
{
int seguir;
char nome[30];
seguir = 1;
while (seguir)
{
puts(“\nNome:");
gets(nome);
if (nome[0] == '\0') // para quando sem conteúdo – enter direto
seguir = 0;
else
printf("\nNome informado:%s", nome); // não pode puts:2 conteúdos
}
return 0; puts(“Nome informado:");
} puts (nome); //em linhas diferentes…

21 INF 01202 - Prof. Marcelo Walter – Aula 12


STRINGS

Como strings não são um tipo em C, não se pode


atribuir uma string a outra:
string1 = string2;

Para isso: funções para manipulação de strings.

22 INF 01202 - Prof. Marcelo Walter – Aula 12


Manipulação de STRINGS

Uma string em C é basicamente um array de


caracteres com um delimitador (‘\0’ no final), que
pode ser explorado para diversas finalidades.

Exemplo: escrever um programa que leia uma string


str_in do teclado, copie para outra string str_out, e
imprima a segunda variável na tela.

23 INF 01202 - Prof. Marcelo Walter – Aula 12


/* Copiar uma string para outra, e imprimir a string copia
Entradas: string lida do teclado
Saidas: copia da string lida e impressao na tela */
#include<stdio.h>
#define TAMSTRING 30
int main()
{
int num;
char str_in[TAMSTRING], str_out[TAMSTRING];
int cont = 0; // contador para caracteres das strings
printf("Entre o texto:");
gets(str_in);
// varre a string lida ate achar '\0'
while (str_in[cont]!='\0')
{
str_out[cont] = str_in[cont];
cont++;
}
printf(“%s-Acabou”,str_out);
return 0;
}
Qual o problema?
Faltou o ‘\0’ no final de str_out !!!
24 INF 01202 - Prof. Marcelo Walter – Aula 12
/* Copiar uma string para outra, e imprimir a string copia
Entradas: string lida do teclado
Saidas: copia da string lida e impressao na tela */
#include<stdio.h>
#define TAMSTRING 30
int main()
{
int num;
char str_in[TAMSTRING], str_out[TAMSTRING];
int cont = 0; // contador para caracteres das strings
printf("Entre o texto:");
gets(str_in);
// varre a string lida ate achar '\0'
while (str_in[cont]!='\0')
{
str_out[cont] = str_in[cont];
cont++;
}
str_out[cont]='\0'; //coloca o '\0' no final
printf(“%s-Acabou”,str_out);
return 0;
}

25 INF 01202 - Prof. Marcelo Walter – Aula 12


Funções para manipular strings

•  Utilização da biblioteca string.h


•  Funções:
strcpy
strcat
strlen
strcmp

26 INF 01202 - Prof. Marcelo Walter – Aula 12


Função strcpy

•  Copia string_origem para string_destino.


•  Formato:
strcpy(string_destino, string_origem);
•  Exemplo:
#include <stdio.h>
#include <string.h>

int main( )
{
char string_origem[10], string_destino[10];
printf("Forneca um nome: ");
gets(string_origem);
strcpy(string_destino, string_origem);
printf("\n%s\n", string_destino );
return 0;
}
27 INF 01202 - Prof. Marcelo Walter – Aula 12
Função strcat
•  A string_origem, sem alteração, é anexada ao final da
string_destino.
•  Formato: strcat(string_destino, string_origem);
•  Exemplo: ATENÇÃO:
… // outros includes
A string_destino
#include <string.h>
int main( ) deve ter tamanho
{ suficiente para
char string_origem[30], string_destino[60]; armazenar o
resultado de
printf("Forneca um texto: "); strcat!
gets(string_origem);
strcpy(string_destino, "O rato roeu ");
strcat(string_destino, string_origem);
printf("\n%s\n", string_destino );

return 0;
}
28 INF 01202 - Prof. Marcelo Walter – Aula 12
Função strlen

• Retorna o tamanho de uma string, sem contar o ‘\0’.


• Formato: strlen(string);
• Exemplo:
#include <string.h>
int main( )
{
char string_primeiro[40], string_segundo[40];
printf("Forneca um texto: ");
gets(string_primeiro);
printf("Forneca um texto: ");
gets(string_segundo);
printf("\n%s tem comprimento %d\n”,
string_primeiro, strlen(string_primeiro) );
printf("\n%s tem comprimento %d\n”,
string_segundo, strlen(string_segundo) );

return 0;
}

29 INF 01202 - Prof. Marcelo Walter – Aula 12


Função strcmp

•  A função strcmp(s1,s2) começa comparando o primeiro


caracter das strings s1 e s2. Se forem iguais, continua a
comparação com os caracteres seguintes, até que encontre
alguma diferença (incluindo o delimitador de fim).
•  o resultado retornado depende da comparação entre o
primeiro caractere distinto encontrado na mesma posição em s1
e s2

ü Se este caracterfor maior que s2, retorna um valor maior


que zero.
ü Se este caracter for menor que s2, retorna um valor
menor que zero.
ü Se s1 e s2 forem iguais, retorna zero.

•  Obs.:a comparação é feita com base no código ASCII dos


caracteres
Lembrar que as maiúsculas vêm antes
das minúsculas na tabela ASCII.
30 INF 01202 - Prof. Marcelo Walter – Aula 12
Função strcmp
EXEMPLO
/* Programa que le 3 pares de strings, comparando cada par
Entradas: 3 pares de strings
Saidas: resultados das 3 comparacoes */
#include <stdio.h>
#include <string.h>
int main( )
{
int i;
char string_primeiro[40];
char string_segundo[40];
for (i = 1; i <=3; i++)
{
printf("Forneca um texto: ");
gets(string_primeiro);
printf("Forneca um texto: ");
gets(string_segundo);
printf("Resultado da comparacao de %s com %s: %d\n\n",
string_primeiro, string_segundo,
strcmp(string_primeiro, string_segundo) );
}
return 0;
}

31 INF 01202 - Prof. Marcelo Walter – Aula 12

Você também pode gostar