• Nenhum resultado encontrado

Arrays e Strings

N/A
N/A
Protected

Academic year: 2022

Share "Arrays e Strings"

Copied!
5
0
0

Texto

(1)

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

(2)

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;

}

(3)

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 } };

(4)

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

(5)

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) ...

Referências

Documentos relacionados

Quando os dados são analisados categorizando as respostas por tempo de trabalho no SERPRO, é possível observar que os respondentes com menor tempo de trabalho concordam menos que

ITIL, biblioteca de infraestrutura de tecnologia da informação, é um framework que surgiu na década de mil novecentos e oitenta pela necessidade do governo

“O aumento da eficiência e o plano de produção fizeram com que a disponibilidade das células de fabricação aumentasse, diminuindo o impacto de problemas quando do

Este trabalho traz uma contribuição conceitual sobre a utilização do sistema de gestão de produtividade que poderá motivar futuras pesquisas sobre o tema, bem

Prejuízo estético, em grau médio ou máximo, quando atingidos crânios, e/ou face, e/ou pescoço ou perda de dentes quando há também deformação da arcada

Como objetivos específicos pretendeu-se iden- tificar os taxa existentes nesta gruta, determinar a riqueza de es- pécies de sua comunidade; verificar a influência de fatores

3º Lugar – Seletiva Nacional Combat Games - Lívia Braga Luciano 3º Lugar - Taça Brasil de Juniores – André Henrique Humberto 3º Lugar - Brasileiro Sênior - André

Outro aspecto a ser observado é que, apesar da maioria das enfermeiras referirem ter aprendido e executado as fases do processo na graduação, as dificuldades na prática