Arrays e Strings
Linguagem de Programação Estruturada Prof. Leandro Carlos Fernandes
2º semestre 2015
Pense na seguinte situação ...
• Imagine que desejamos armazenar as notas de 10 alunos.
• Com o nosso conhecimento até agora, faríamos:
intmain() {
floata1,a2,a3,a4,a5,a6,a7,a8,a9,a10;
printf("\n Favor inserir 10 números reais:");
scanf("%f %f %f %f ...", &a1, &a2, ..., &a10);
} ...
• Como proceder se tivéssemos 100 ou 200 alunos?
• Percebe o problema da escalabilidade do programa!?
Tipos compostos
• O que precisamos é de um tipo de dados composto, capaz de armazenar não somente um valor, mas sim um conjunto de valores.
• Como resposta a isso temos:
–Estrutura com dados homogêneos:
Vetores e Matrizes
–Estrutura com dados heterogêneos:
Registros (Structs)
Vetores (Arrays)
• Vetores são agrupamentos contíguos de dados em memória, capazes de armazenar um valor em cada uma de suas posições.
• Cada elementos do array é identificado de maneira exclusiva por intermédio de um índice seqüencial, iniciando em 0 (0,1,2,..,n-1).
0 1 2
...
(n-3) (n-2) (n-1)
V
Vetores (Arrays)
• Declaração:
tipo_dado nome_array[<tamanho>];
define um arranjo de <tamanho> elementos adjacentes na memória do tipo tipo_dado.
• Ex: floatm[10]; /* m contém 10 posições reais */
intv[3], k[5], i; /* declara dois vetores, v e k*/
charnome[30]; /* uma string */
• Ex: /* declaração e incialização*/
intx[3] = { 10, 20, 30 };
inty[] = { 10, 20, 30, 40, 50 };
Referenciando Elementos
• Referenciamos os elementos do array através do seu nome e, entre colchetes, o índice da posição desejada:
• Ex: m[5] = 5.5;
if(m[5] == 5.5) printf("Êxito");
else
printf("Falha");
Exemplo
#include <stdio.h>
#define SIZE 7 /* define uma constante ... aqui, representa o tamanho do array */
intmain () { inti;
intarint[] = {10, 20, 30, 40, 50, 60, 70};
for(i=0; i < SIZE; i++) printf("%d ", arint[i] );
return0;
} /* saída: 10 20 30 40 50 60 70 */
Cuidados …
• C nãocontrola os limites dos arrays, o programador deve fazê-lo ... sempre!
• Encontre o erro no código abaixo:
#include <stdio.h>
intmain() {
intarint[] = { 1, 2, 3, 4, 5, 6, 7 }, i;
for(i=0; i <=7; i++) printf("%d ", arint[i]);
return0;
}
Cuidados …
• Em floatm[10] o identificador mé uma constante que endereça o primeiro elemento do array.
–Portanto, não é possível mudar o valor de m.
• Ex:floatm[10], n[10];
m = n; /* erro: m é constante ! */
0 1 2
...
8 9
m
0 1 2
...
8 9
n
Arrays Multidimensionais
• Arrayspodem ter diversas dimensões, cada uma identificada por um par de colchetes na declaração.
• Ex: intmatriz[5][10];
– declara uma matriz de 5 linhas e 10 colunas:
– na memória, entretanto, cada um dos inteiros são armazenados linearmente:
[0,0] [0,9] [1,9] [4,9]
[0,0]
[4,9]
Exemplo: Arrays Multidimensionais
• Faça um programa que leia os elementos de uma matriz 2x2 de inteiros e calcule seu determinante.
#include <stdio.h>
#define MAX_LIN 2 /* constante: numero máximo de linhas */
#define MAX_COL 2 /* constante: numero máximo de colunas */
intmain() {
intlin, col, m[2][2], det;
for( lin = 0; lin < MAX_LIN; lin++) /* para cada linha da matriz ... */
for( col = 0; col < MAX_COL; col++) { /* nesta linha, para cada coluna ... */
printf("Informe o elemento a[%d,%d]: ", lin, col);
scanf("%d", &m[lin][col] );
det = m[0][0] * m[1][1] – m[0][1] * m[1][0];} printf("O determinante é %d\n.", det);
return0;
}
Exemplo: Arrays Multidimensionais
• Considere o problema de conversão de data dia_do_ano (um dos 365 dias do ano), convertido a partir do mês e dia do mês
• A tabela que indica a quantidade de dias de cada mês, incluindo anos bissextos, poderia ser dada por:static chartabela_dias[2][12] = {
{ 31,28,31,30,31,30,31,31,30,31,30,31 } , { 31,29,31,30,31,30,31,31,30,31,30,31 } };
Conversão de Data
#include <stdio.h>
intmain() {
inti, bis, dia, mes, ano;
chartabela_dias[2][12] = {
{ 31,28,31,30,31,30,31,31,30,31,30,31 }, { 31,29,31,30,31,30,31,31,30,31,30,31 }
printf("Informe uma data no formato dd/mm/aaaa: ");};
scanf("%d/%d/%d", &dia, &mês, &ano);
bis = (ano%4)==0 && (ano%100)!=0 || (ano%400)==0;
for(i = 0; i < mes-1; i++) dia += tabela_dias[bis][i];
printf("A data informada corresponde ao %dº dia do ano\n.", dia);
return0;
}
Strings
• Em C as strings são entendidas como vetores de caracteres.
• Porém como a quantidade de caracteres em uma string pode ser menor do que seu tamanho declarado, elas foram implementadas em C seguindo o modelo “null terminated”, isto é, o término de uma string é dado pelo caractere de controle ‘\0’.
• Atenção:
–Constantes caractere são delimitadas por apóstrofos –Constantes string são delimitadas por aspas
Strings
• Por exemplo, para declarar uma string nome capaz de armazenar até 5 caracteres:
charnome[6];
• Lembre-se que o tamanho da string deve ser suficiente para conter também o '\0'no final.
• Assim, temos tamanho 6 = 5 caracteres + '\0'.
• Do mesmo modo que os arrays, também é possível incializar uma string no momento de sua declaração.
–Ex.: charnome[8] = "Leandro";
charsobrenome[] = "Fernandes";
Strings
• Problema:
charx[10], y[10];
x = "Ola";
x = y; /* Não faça isso! */
x = x + y; /* Não faça isso! */
if (x == y) ... /* Não faça isso! */
• Strings não podem ser atribuídas ou comparadas diretamente
• Afim de tornar mais fácil sua manipulação, a linguagem provê recursos específicos através da biblioteca string.h
string.h
• Strlen: Retorna o números de caracteres da cadeia de caracteres, sem contar o ‘\0’.
strlen("casa") ==> 4
• Strcmp: Compara, caractere a caractere, duas cadeias e retorna o resultado dessa
comparação.
strcmp("casa","carro") == 1 strcmp("casa","casa") == 0 strcmp("carro","casa") == -1
string.h
• Como a linguagem C entende como diferentes letras minúsculas de maiúsculas, no
tratamento de strings podemos utilizar:
• Stricmp: Compara, caractere a caractere, duas cadeias e retorna o resultado dessa
comparação ignorando a diferença entre maiúsculas e minúsculas.
strcmp(“Casa","casa") == 1 stricmp(“Casa","casa") == 0
string.h
• Strcpy: Copia uma string para dentro de outra.
strcpy(vetor, "carro");
strcpy(vetor2, vetor1); /* copia 1 em 2 */
• Strcat: Concatena duas strings, a primeira string recebe o seu conteúdo seguido do conteúdo da segunda string.
strcpy(vetor, "uva + ");
strcat(vetor, "banana + ");
strcat(vetor, "pera");
/* vetor = "uva + banana + pera" */
Strings
• Assim, retomando nosso exemplo:
charx[10], y[10];
x = "Ola";
/* ao invés de */ /* utilize */
x = y; strcpy(x,y);
x = x + y; strcat(x,y);
if(x == y) ... if(strcmp(x,y) == 0) ...