• Nenhum resultado encontrado

7. Dados Estruturados Vetores, Matrizes e Strings

N/A
N/A
Protected

Academic year: 2021

Share "7. Dados Estruturados Vetores, Matrizes e Strings"

Copied!
39
0
0

Texto

(1)

1

Unesp – Campus de Guaratinguetá

7. Dados Estruturados

7. Dados Estruturados

Vetores , Matrizes e

Vetores , Matrizes e

Strings

Strings

Curso: Programação de Computadores

Prof. Aníbal Tavares

Profa. Cassilda Ribeiro

2

Array -

Definição



Vetor

ou Array

é a forma mais familiar de

dados estruturados.



Um

array

é um conjunto de componentes do

mesmo tipo, que podem ser acessados

individualmente a partir de um único nome.

7.1 Dados Estruturados:

7.1 Dados Estruturados:

Array

Array

3

Dada uma relação de 5

estudantes, imprimir o

numero de matricula de cada

estudante, cuja nota é maior

do que a média da classe

.

7.1

7.1

Array

Array

-

-

Problema

4 1o. Algoritmo Início algoritmo Leia(num1,nota1,num2,nota2,num3,nota3,num4, nota4,num5,nota5) media (nota1+nota2+nota3+nota4+nota5) / 5.0

Se nota1 > media então escreva (num1) Se nota2 > media então escreva (num2) Se nota3 > media então escreva (num3) Se nota4 > media então escreva (num4) Se nota5 > media então escreva (num5) Fim algoritmo

7.1

(2)

5

7.1 Array -

Solução 1

1.

Uma variável para cada

número de matricula → 100 variáveis

2. Uma variável para cada nota → + 100 variáveis

3. 100 testes

6

7.1 Array -

Definição



Como estes dados têm uma relação entre si, podemos

declará-los com um nome ÚNICO para todos os 100

elementos.



Seja, por ex, um conjunto de 100 números =

Lista

Lista[0]

Lista[3] Lista[99]

1 2 3 4 100

7



O elemento do vetor tem todas as características

de uma variável e pode aparecer em expressões e

atribuições.

Lista[2]

Lista[3] + Lista[20]



Para somar todos os elementos da Lista:

soma

0

para i

0 até 99 faça

soma

soma + Lista[i]

7.1 Array -

Definição

8

7.1Array -

Características



As características básicas de um Array são:



é uma estrutura homogênea, isto é, é formada de

elementos do mesmo tipo



todos os elementos da estrutura são igualmente

acessíveis, isto é, o tempo e o tipo de

procedimento para acessar qualquer um dos

elementos do Array são iguais



cada elemento componente desta estrutura tem

um nome próprio segundo sua posição no

conjunto

(3)

9

Array -

Solução 2

2

o

. Algoritmo

Início algoritmo

Para i 0até 4 faça

Leia(num[i],nota[i])

soma 0,0

Para i 0 até 4 faça

soma soma + nota[i]

media soma/5

Para i 0 até 4 faça Se (nota[i] > media)

então escrever (num[i])

Fim algoritmo 10

7.1 Dados Estruturados: Declara

7.1 Dados Estruturados: Declara

çã

çã

o de Vetores

o de Vetores

Os índices variam de 0 até 4



Na linguagem C a declaração do array é feita

juntamente com as demais variáveis, e é preciso dizer

qual é o tipo de dado que será armazenado no array.

 A declaração de um vetor com uma única dimensão é

feita do seguinte modo:

tipo nome_variavel[no. de elementos]

Exemplo 1:

int val[ 5 ];

Cria um vetor de nome

val

, de

tamanho

5

e cujos elementos são

do tipo

int.

val[0] val[1] val[3] val[2] val[4] 11







 Observações:

1)

O acesso a cada elemento do vetor é feito através de

uma indexação da variável val.

2)

Em C, a indexação de um vetor varia de

zero

a

n-1

,

onde

n

representa a dimensão do vetor. Assim:

val [0]  acessa o primeiro elemento de val

val [1]  acessa o segundo elemento de val

...

val [4]  acessa o último elemento de v

Mas:

val[5]  está

ERRADO

(invasão de memória)

7.1 Dados Estruturados: Declara

7.1 Dados Estruturados: Declara

çã

çã

o de Vetores

o de Vetores

12

Exemplo 2: Para declarar um vetor com 50 números reais

float custo[50];

float - Tipo de cada elemento do vetor

50 - No. de elementos do vetor

custo - Nome do vetor

custo[i] – Aquilo que está na posição índice i do vetor custo

Exemplo 3: Coloque o valor 34.6 na primeira posição do vetor

custo e o valor 56.7 na última posição:

custo[0] = 34.6;

custo[49] = 56.7;

Exemplo 4:Coloque no quarto elemento do vetor o dobro do valor

do segundo elemento:

custo[3] = 2* custo[1];

7.1 Dados Estruturados: Declara

(4)

13

7.1 Dados Estruturados: Declaração de Vetores

7.1 Dados Estruturados: Declaração de Vetores



A Linguagem C permite que se faça a declaração do vetor ao

mesmo tempo que atribuição de valores iniciais.

 O acesso e a modificação dos elementos do vetor é feito

diretamente sobre a variável.

Exemplo 5:

int val[5] = {3, 2, 6, 4, 5};

aqui foi declarado um vetor de inteiros com 5 elementos e atribuído a ele os valores entre chaves



val[0] 2 3 6 4 5









val[1]



val[2]



val[3]



val[4]

Exemplo 6:

val[1] = val[1] + 1;

val[3] = val[1]+ val[3];

    val[0] 3 3 6 7 5     val[1]  val[2]  val[3]     val[4] 14

Exemplo 7: Suponha a seguinte declaração:

int v3[10] = {10,33,45};

Neste caso os três primeiros elementos do vetor v3 (índices 0, 1 e 2)

recebem os valores 10, 33 e 45 respectivamente. e todos os

demais elementos recebem o valor ZERO

Assim a declaração acima é equivalentes à:

int v3[10] = {10,33,45,0,0,0,0,0,0,0};

7.1 Dados Estruturados: Declara

7.1 Dados Estruturados: Declara

çã

çã

o de Vetores

o de Vetores

OBS:Se um vetor for declarado com

n

elementos e forem

atribuídos inicialmente ao vetor, apenas

k

valores

(k<n)

, então

os primeiros

k

elementos do vetor serão iniciados com os

respectivos valores e os restantes serão inicializados com ZERO.

15

7.1 Dados Estruturados: Vetor

7.1 Dados Estruturados: Vetor

-

-

Problemas

Problemas

Programa 1: Criar um programa com um vetor de 10 inteiros

tal que seus elementos são da forma v[i] = i+1. Imprimir o vetor.

main() // incluir <stdio.h> e <stdlib.h>

{ int i; int v[10];

// Colocando valores em v. for(i=0; i < 10; i++)

v[i] = i + 1;

// Mostra os elementos de v -> v[i]. for(i=0; i < 10; i++)

printf(“ %d ", v[i]); puts(“”);

// Mostra os indices i de v[i]. for(i=0; i < 10; i++)

printf(“ v[%d] ", i+1); } // fim programa

Programa 1 – Usando vetores

2

1

v[0] v[1]

9

•••

•••

v[8]

10

v[9]

V [ i ] = i + 1;

printf(“ %d ”,v[i]);

printf(“ v[%d] ”,i+1);

16 Programa 2 : Fazer um programa que leia um conjunto de 10 elementos

numéricos,a partir do teclado, armazene-os na variável A e depois os imprima.

7.1 Dados Estruturados: Vetor

7.1 Dados Estruturados: Vetor

-

-

Problemas

Problemas

#include <stdlib.h> #include <stdio.h> main() { int A[10]; int I; // inicio

printf("Digite os 10 elementos do vetor; sendo um em cada linha\n");

for (I=0; I< 10;I++)// ler o vetor scanf("%d",&A[I]);

printf("Vetor lido\n");

for (I=0; I<10;I++) // imprimir vetor printf("A[%d] = %d\n", I, A[I]); system("pause");

(5)

17 Programa 2 – Exemplo de Execução

7.1 Dados Estruturados: Vetor

7.1 Dados Estruturados: Vetor

-

-

Problemas

Problemas

18

7.1 Dados Estruturados: Vetor

7.1 Dados Estruturados: Vetor

-

-

Problemas

Problemas

Programa 3: Criar um programa que armazene em um vetor os

10 primeiros termos da seqüência de Fibonacci. Imprimir o vetor.

F(n)=F(n-1)+F(n-2)

onde: n=0,1,2, 3,...

e F(0) = F(1) = 1

Espiral de Fibonacci

main() // incluir <stdio.h> e <stdlib.h>

{ int i;

int v[10]; v[1] = v[0] = 1; // Colocando valores em v. for(i=2; i < 10; i++)

v[i] = v[i-1] + v[i-2];

// Mostra os elementos de v -> v[i]. for(i=0; i < 10; i++)

printf(“ %d ", v[i]); puts(“”);

// Mostra os indices i de v[i]. for(i=0; i < 10; i++) printf(“ v[%d] ", i+1); } // fim programa Programa 3 – Fibonacci

E

I

I

E

19 //Programa 4 – Notas Maiores main() // incluir <stdio.h> e <stdlib.h>

{int i; float v[5], media = 0.0;

// Colocar valores em v. for(i=0; i < 5; i++) {

printf(“ Insira Nota %d: ”,i+1); scanf(“%f”,&v[i]); }

for(i=0; i < 5; i++) // Cálculo média.

media=media+v[i]; media=media/5;

printf(“Media = %f \n”, media); for(i=0; i < 5; i++) // Ver v[i]>media.

if (v[i] > media)

printf(“ v[%d] = %f \n", i+1,v[i]); } // fim programa

1. Ler e armazenar notas.

2. Calcular a média.

3. Exibir notas > média.

Etapas de Resolução

1

2

3

O programa ao lado pode

ser melhorado com o uso

dos comandos const ou

ainda define.

7.1 Dados Estruturados: Vetor

7.1 Dados Estruturados: Vetor

-

-

Problemas

Problemas

Programa 4 : Dada uma relação de 5 estudantes, imprimir a a nota do estudante cuja nota é maior que a média da classe.

20 Programa 4 – Exemplo de Execução

7.1 Dados Estruturados: Vetor

(6)

21  Ao se escrever um programa, deve-se fazê-lo de modo que

uma pequena alteração nos dados não provoque grandes transformações no código.

 A solução para esse problema é a utilização de constantes,

que uma vez alteradas, propagam o novo valor por todas as ocorrências.

 Uma constante nada mais é que um nome correspondendo a um valor fixo, isto é que não pode ser alterado ao longo da execução do programa.

O programa 3, por exemplo, foi escrito para rodar com um vetor de 5 elementos. Para que ele possa ser executado para um vetor de 40 elementos (40 alunos), é preciso alterar todas as ocorrências do número 5 pelo número 40.

7.1 Vetor:

7.1 Vetor:

Definição de Constantes

Definição de Constantes

22

7.1 Vetor: Defini

7.1 Vetor: Defini

çã

çã

o de Constantes

o de Constantes

A definição de constantes pode ser feita de duas maneiras distintas:

 Através da palavra reservada const

const tipo

simbolo

=valor;

 Através da diretiva de pré processamento#define

#define simbolo

valor

OBS: As constantes declaradas com o #define devem ser feitas imediatamente após as linhas dos #includes.

As constantes declaradas com o const podem ser feitas após os #includesou após o main().

Pode-se então, reescrever o programa 3, usando constantes.

23

7.1 Vetor

7.1 Vetor

-

-

Constantes

Constantes

-

Uso do comando #define

//Problema 3 – Notas Maiores

#include <stdio.h>

#define n 5 //sem ponto e virgula

main() { int i; float v[n], media = 0.0; // Colocar valores em v. for(i=0; i < n; i++) {

printf(“ Insira Nota %d: ”,i+1); scanf(“%f”,&v[i]); }

for(i=0; i < n; i++)// Cálculo média.

media=media + v[i]; media=media/n;

for(i=0; i < n; i++) // Ver v[i]>media.

if (v[i] > media) printf(“ v[%d] = %f \n", i+1,v[i]); } // fim programa  Quando o defineé utilizado,o compilador substitui todas as ocorrências do símbolo pelo valor definido.

 Às constantes definidas

com o símbolo #define

chamam-se constantes simbólicas.

Com a declaração:

#define n 5

Em todo lugar onde

aparecer a variável n, ela

terá o valor constante

igual a 5

24

7.1 Vetor

7.1 Vetor

-

-

Constantes

Constantes

-

-

Uso do comando const

//Problema 3 – Notas Maiores //usando const #include <stdio.h> main() { const int n = 5; int i; floatv[n], media = 0.0; // Colocar valores em v. for(i=0; i < n; i++) {

printf(“ Insira Nota %d: ”,i+1); scanf(“%f”,&v[i]); }

for(i=0; i < n; i++)// Cálculo média.

media=media+v[i]; media=media/n;

for(i=0; i < n; i++) //Ver v[i]>media. if (v[i] > media)

printf(“ v[%d] = %f \n", i+1,v[i]); } // fim programa

O qualificador const permite ao programador informar que o valor de uma variável particular não deve ser modificado.

Ou seja, a constante obtida com const existe fisicamente em uma dada posição de memória.

Exemplo de declaração:

(7)

25 Problema 4:Escreva um programa que realize a leitura dos salários pagos a um

individuo durante um ano. Em seguida, o programa deverá mostrar os valores mensais e o total anual.

7.1 Vetor

7.1 Vetor

Constantes

Constantes

-

-

Problemas

Problemas

#include <stdio.h> #include <stdio.h>

main()

{ const int mes = 12;

float sal[mes+1]; /* 12 meses */

float total; int i;

for (i=1; i<= mes ; i++) { //inicio for

printf("Introd. o salário do mês %d:",i); scanf("%f",&sal[i]);

} //fim for

/* Mostrar valores Mensais e calcular total */

puts(" Mes Valor ");

for (i=1, total=0.0; i<=mes ; i++) {// inicio for

printf(" %3d %9.2f\n",i,sal[i]); total+=sal[i];

} //fim for

printf("Total Anual: %9.2f\n",total); system(“pause”);

}

OBS: Neste exemplo,

desconsiderou-se a posição zero do vetor 26

7.1 Vetor

7.1 Vetor

Relembrando...

Relembrando...

1. Os elementos de um vetor que foi declarado sem qualquer

valor inicial contêm valores aleatórios.

2. O índice do primeiro elemento do vetor é sempre zero.

3. Os índices de um vetor com n elementos variam entre 0 e

n-1.

4. O valor existente em uma posição do vetor vet pode ser

obtido através do índice em que essa posição está

armazenada vet[indice].

27

7.1 Vetor

7.1 Vetor

Relembrando...

Relembrando...

6. Não se pode declarar um vetor sem dimensão, ou usar

uma variável como dimensão. Se não sabemos qual é o

espaço de memória que deve ser reservado para o vetor,

como o compilador vai saber qual é esse espaço.

7. Quando não se sabe a dimensão exata do vetor a ser

declarado, deve-se utilizar um valor de dimensão maior que

o valor que pensamos ser necessário.

5. O compilador não verifica se os índices utilizados em um

vetor estão corretos ou não, por exemplo se num vetor de

dimensão n, for utilizada a posição vet[n], vai gerar um

erro grave, pois não existe esta posição na memória.

28

7.1 Vetor

7.1 Vetor

-

-

Problemas

Problema 5: Uma companhia de energia elétrica dispõem

dos dados de consumo mensal de energia elétrica em kWh

de uma pequena empresa e deseja determinar algumas

estatísticas. Para efeito de planejamento da manutenção

e expansão da rede elétrica ela deseja determinar os valores

e os meses de maior e menor consumo, bem como o

consumo médio.

1246

Mês kWh

1

824

2

1152

3

1236

4

1313

5

750

Mês kWh

6

700

7

728

8

800

9

900

Mês kWh

10

1032

11

12

1304

(8)

29

7.1 Vetor

7.1 Vetor

Problemas:

Problema 5

824

1152

1236

v[0]

v[1]

v[2]

Mês

1

2

3

kWh

•••

•••

•••

1304

v[11]

12

Posição

Elemento

Associar posição i com o (i+1) mês

1)

Criar um vetor v de 12

elementos e associar o

consumo em KWh do

mês (i) com a posição

(i-1). Ou seja:

v[ i -1 ]

consumo

em kWh no mês i.

Idéia do Programa

30

7.1 Vetor

7.1 Vetor

Problemas:

Problema 5

Idéia do programa

824 1152 1236 ••• 1304 v[0] v[1] v[2] ••• v[11]

2)

Achar o mês de maior consumo = Achar o Maior Elemento do Vetor. Para isso é preciso:

 Criar uma variável maiore guardar nela o primeiro

elemento do vetor v. Isto é:maior ←←←← v[0].

 Comparar a variável maior com os demais elementos do

vetor v[i]. Se maior < v[i], colocar v[i]na variável maior. maior = v[0] = 824

maior > v[1] ? não, então: maior = v[1] = 1152 maior > v[2]? não, então:

maior = v[2] = 1236 E assim por diante.

31

7.1 Vetor

7.1 Vetor

Problemas:

Problema 5

Idéia do programa

3. Achar o mês de Menor consumo = Achar o Menor Elemento do Vetor.

 Idem maior valor

 Criar uma variável menore guardar nela o primeiro

elemento do vetor v.Isto é:menor ←←←←v[0].

 Comparar a variável menorcom os demais elementos do

vetor v[i]. Se menor > v[i], colocar v[i]na variável menor.

32

#include <stdio.h>

main() {

const int n = 12; int i, imenor, imaior;

float v[n], media, maior, menor; media = 0.0;

// Leitura dos valores de energia. for(i=0; i < n; i++) {

printf(“ Insira kwh %d: ”,i+1); scanf(“%f”,&v[i]); }

for(i=0; i < n; i++) // Cálculo média.

media=media+v[i]; media=media/n;

// Preparando para encontrar o maior e // e o menor valor.

maior = menor = v[0]; imaior = imenor = 0;

Problema 5 – Consumo Energia

7.1 Vetor

7.1 Vetor

-

-

Problemas

// Laço encontra índice e maior valor. for(i=1; i < n; i++)

if (v[i] > maior)

{ maior = v[i]; imaior = i; }

// Laço encontra índice e menor valor. for(i=1; i < n; i++)

if (v[i] < menor)

{ menor = v[i]; imenor = i; }

// Mostrando valores encontrados.

printf(“ Maior Valor = %f no mes %d \n",maior, imaior+1);

printf(“ Menor Valor = %f no mes %d \n", v[imenor], imenor+1);

printf(“ Valor medio = %f \n”,media); } // fim programa

(9)

33

7.1 Vetor

7.1 Vetor

-

-

Problemas

Problema 5 – Exemplo de Execução

34

7.1 Vetor

7.1 Vetor

Problemas : Problema 6

Problema 6: Criar um programa que simule 60 lançamentos de um dado de 6 faces e armazena o número de vezes que uma face foi sorteada nos elementos de um vetor. Depois, a partir dos valores contidos nos elementos deste vetor construir um histograma, tal como dado a seguir:

Face 1 – 10: [][][][][][][][][][]

Face 2 – 12: [][][][][][][][][][][][]

Face 3 – 8: [][][][][][][][]

Face 4 – 10: [][][][][][][][][][]

Face 5 – 11: [][][][][][][][][][][]

Face 6 – 9: [][][][][][][][][]

35

7.1 Vetor

7.1 Vetor

Problemas: Problema 6

Idéia do programa

v[0] v[1] v[2] Face 1 2 3 # Sorteio 4 v[3] v[4] 5 Posição Elemento v[5] 6

Criar um vetor

v

de 6 posições

que vai armazenar o no. de

vezes que uma face

i

é

sorteada.

Então: v[0] vai guardar o no. de

vezes que a face 1 foi sorteada.

v[1] vai guardar o no. de vezes

que a face 2 foi sorteada e

assim por diante.

Então: v[ i -1 ] ↔ no.de vezes

que a face i foi sorteada.

Associa a posição i com a face (i+1). 36

7.1 Vetor

7.1 Vetor

Problemas Problema 6

2

4

3

•••

6

Vetor do número de ocorrências de uma face para 60 lançamentos.

0

fr[0]

Idéia do programa

60 lançamentos

1

2

3

•••

60

0

fr[1]

+1

0

fr[2]

0

fr[3]

0

fr[4]

0

fr[5]

+1 +1 +1

(10)

37

Idéia do programa

7.1 Vetor

7.1 Vetor

Problemas Problema 6

Gerador linear congruêncial

S

n+1

= (S

n

*a + b) mod m

onde: é uma boa estratégia usar m, a e b números primos.

S0é a semente Sn+1será o número

aleatório gerado.

Gerar uma seqüência de números pseudo- aleatória, ou seja, uma seqüência S que utilize uma fórmula para obter seus termos Sndentro de um intervalo [a, b], os mesmos não se repetem para um valor suficientemente grande de n.

Sn+1= (Sn* 32749 + 3) mod m Uma boa escolha para m, a e b

38 Como gerar

valores aleatórios em C?

7.1 Vetor

7.1 Vetor

Problemas Problema 6

srand(time(0))

s = rand( )

Fornece semente S0 Fornece Sn+1

Os números gerados por rand( ) estão no intervalo [0, RAND_MAX], onde:

RAND_MAX = 327679719.

Então para gerar valores aleatórios entre [0 e 5], tem-se

Para gerar números inteiros no intervalo [a, b-1] usa-se o operador % (resto inteiro da divisão):

s = (rand() % b) + a.

39

7.1 Vetor

7.1 Vetor

Problemas Problema 6

O operador % funciona de acordo com o exemplo abaixo:

0 % 6 = 0 1 % 6 = 1 2 % 6 = 2 3 % 6 = 3 4 % 6 = 4 5 % 6 = 5 6 % 6 = 0 7 % 6 = 1 8 % 6 = 2 9 % 6 = 3 10 % 6 = 4 11 % 6 = 5

Ou seja, operações com % funcionam como se tivéssemos um relógio: 1 2 3 4 5 0

Por esse motivo, as operações com o operador % são chamadas de aritmética

modular ou ainda aritmética do relógio.

1 2 3 4 5 0 1 2 3 4 5 0 713 40 #include <stdio.h> #include <time.h> #include <stdlib.h> const int lanc = 60; main()

{

int fr[6] = {0, 0, 0, 0, 0, 0}; int i, j, face;

// Inicializa gerador aleatório.

srand(time(0));

// Laço gera 60 valores em [0,5].

for(i=0; i < lanc; i++)

{ face = rand( ) % 6; fr[face]++; } Problema 6 – 60 lançamentos

7.1 Vetor

7.1 Vetor

Problemas Problema 6

// Laço para imprimir o histograma //a partir dos valores armazenados //no vetor fr.

printf(“ \n\n“);

for(i=0; i < 6; i++)

{

printf(“\bFace %2d-%2d:”,i+1,fr[i]);

// Impressão fr[i] vezes do //caractere [] para formar a //freqüência de ocorrência de uma //dada face.

for (j=0; j < fr[i]; j++)

printf(“[]”);

// Criando uma nova linha.

printf(“ \n “); }

} // fim programa

(11)

41

7.1 Vetor

7.1 Vetor

-

-

Problemas

Problema 6 – Exemplo de Execução

42

Conceito

Problema 7: Escreva um programa que solicite ao usuário

o número de alunos de uma sala. Depois, de acordo com o

valor da nota de cada aluno, deverá ser atribuído um

conceito de acordo com a seguinte tabela:

Faixa de Valores

9 ≤ Nota ≤ 10

7 ≤ Nota < 9

A

B

5 ≤ Nota < 7

C

3 ≤ Nota < 5

D

0 ≤ Nota < 3

E

Por fim, deverá

ser fornecido

o percentual

de notas da

turma para

cada conceito.

7.1 Vetor

7.1 Vetor

-

-

Problemas

43

10.0 8.5 5.5 ••• 0.0

vn[0] vn[1] vn[2] ••• vn[m]

Idéia do programa

7.1 Vetor

7.1 Vetor

-

-

Problemas

1) Criar um vetor notas de dimensão m, onde vn[0] vai guardar a nota do 1º. aluno; vn[1] a nota do segundo aluno e assim por diante.

2) Criar um vetor vc[i] de dimensão 5, para guardar a quantidade de cada conceito. Assim vc[0] vai guardar quantos conceitos A tem na turma, vc[1] vai guardar quantos conceitos B tem na turma e assim por diante. Inicialmente vc[i] = 0.

3) Verificar em qual faixa de valores a nota de cada aluno se encontra. Para cada conceito A encontrado, somar mais 1 no vetor vc[0], para cada conceito B encontrado, somar mais 1 em vc[1] e assim por

diante. 44

Idéia do programa

9 ≤ ≤ ≤ ≤vn[i] ≤≤≤≤ 10 A 7 ≤ ≤ ≤ ≤vn[i] < 9 B 5 ≤ ≤ ≤ ≤vn[i] < 7 C 3 ≤ ≤ ≤ ≤vn[i] < 5 D 0 ≤ ≤ ≤ ≤vn[i] < 3 E 0 0 0 0 0 vc[0] vc[1] vc[2] vc[3] vc[4] +1 +1 +1 +1

7.1 Vetor

7.1 Vetor

-

-

Problemas

+1

(12)

45 #include #include #include #include <stdio.h> main main main main() { const const const

const intintintint m = 100; int int int int i, num, vc[5] = {0,0,0,0,0}; float float float float tmp, vn[m];

// Leitura do número de alunos.

printf(“Entre com no. alunos: “); scanf(“%d”, &num);

// Leitura dos valores das notas.

for for for

for(i=0; i < numi < numi < numi < num; i++) {

printf(“ Insira nota %d: ”,i+1); scanf(“%f”,&vn[i]); }

//construir vetor de conceitos //construir vetor de conceitos //construir vetor de conceitos //construir vetor de conceitos //de acordo com a Tabela. //de acordo com a Tabela. //de acordo com a Tabela. //de acordo com a Tabela.

Problema 7 – Conceito x Notas

for for for

for(i=0; i < numi < numi < numi < num; i++) {

ifififif (vn[i] >= 9.0) vc[0]++; else

else else

else ifififif (vn[i] >= 7.0) vc[1]++; else

else else

else ifififif (vn[i] >= 5.0) vc[2]++; else

else else

else ifififif (vn[i] >= 3.0) vc[3]++; else

else else

else vc[4]++; }

// Mostrar percentual cada conceito.

for forfor

for(i=0; i < 5i < 5i < 5i < 5; i++)

{ // Mostrando percentuais.

tmp = (floatfloatfloatfloat(vc[i])*100)/num; printf(“Conceito%d=%f \n", i, tmp); }

} // fim programa

Problema 7 – Continuação

7.1 Vetor

7.1 Vetor

Problemas:

Problema 7

46

7.1 Vetor

7.1 Vetor

-

-

Problemas

Problema 7 – Exemplo de Execução

47

7.1 Vetor

7.1 Vetor

-

-

Problemas

Conceito 1 – 20.00%: [][]

Conceito 2 – 20.00%: [][]

Conceito 3 – 20.00%: [][]

Conceito 4 – 30.00%: [][][]

Conceito 5 – 10.00%: []

Número de ocorrências de notas dentro de cada conceito.

Problema 8: Acrescentar ao final do programa que resolve o

Problema 7, e depois de mostrar a informação de freqüência

em percentual, um histograma tal como elaborado para

resolver o Problema 6. O programa deve apresentar os

resultados como abaixo.

48

7.1 Vetor

7.1 Vetor

-

-

Problemas

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

if (vn[i] >= 9.0) vc[0]++; else if (vn[i] >= 7.0) vc[1]++; else if (vn[i] >= 5.0) vc[2]++; else if (vn[i] >= 3.0) vc[3]++; else vc[4]++; }

// Mostrar percentual cada conceito.

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

// Mostrando percentuais. tmp = (float(vc[i])*100)/num;

printf(“\n Conceito %d=%f",i+1,tmp); // Impressão do Histograma !

for(j=0; j < vc[i] ;j++) printf(“[]”);} } // fim programa Problema 8 – continuação #include <stdio.h> main() { const int m = 100; int i, j, num, vc[5] = {0,0,0,0,0}; float tmp, vn[m];

// Leitura do número de alunos. printf(“Entre com no. alunos: ”); scanf(“ %d ”, &num);

// Leitura dos valores das notas.

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

printf(“ Insira nota %d: ”,i+1); scanf(“%f”,&vn[i]); }

// Laço para o vetor de concei-// tos com o número de notas em // cada faixa de acordo com as // estabelecidas na Tabela.

(13)

49

Problema 5 – Exemplo de Execução

7.1 Vetor

7.1 Vetor

-

-

Problemas

50

7.1 Vetor

7.1 Vetor

Problemas –

Ordenação de Vetores

http://www.cs.oswego.edu/~mohammad/classes/csc241/samples/sort/Sort2-E.html http://olli.informatik.uni-oldenburg.de/fpsort/Animation.html

Um possível algoritmo de ordenação é o Bubble Sort, cujo nome em português é: algoritmo da bolha. Seu funcionamento consiste em fazer os valores maiores “afundarem“ gradualmente até a base do vetor, ao mesmo tempo que os valores menores sobem gradualmente, como as bolhas de ar sobem na água, enquanto os valores maiores afundam para a parte de baixo do vetor.

Problema 9: Ordenação de dados (em ordem crescente ou decrescente)

pode ser utilizada para classificar e mostrar os resultados mais significativos obtidos por um buscador Web (Google ou Altavista, por exemplo) para uma dada palavra-chave. Crie um programa que coloca em ordem crescente um vetor de elementos gerados aleatoriamente

51

7.1 Vetor

7.1 Vetor

Problemas –

Ordenação de Vetores

 Este é o mais popular dos método de ordenação. O principio básico

desta técnica, está na comparação e troca entre dois elementos consecutivos do vetor . O exemplo a seguir nos dá uma idéia de como funciona o algoritmo. 93 10 76 62 59 91 15 46

 O método começa comparando o primeiro elemento do vetor com o segundo

elemento. Se o primeiro elemento for maior, é feito a troca entre os dois. A seguir compara-se o segundo com o terceiro, e assim por diante, até a comparação do penúltimo com o último elemento.

93 10 76 62 59 91 46 15 46 >15 troca 46 < 91 não troca 91 > 59 troca 93 10 76 62 91 59 46 15 93 10 76 91 62 59 46 15 93 10 91 76 62 59 46 15 93 91 10 76 62 59 46 15 91 > 62 troca 91 > 76 troca 91 > 10 troca 52

7.1 Vetor

7.1 Vetor

Problemas –

Ordenação de Vetores

 Observe , no nosso exemplo, que agora o maior elemento do vetor

está ocupando a última posição.

93 91 76 62 59 46 10 15 93 91 10 76 62 59 46 15

 A seguir recomeça-se a comparar o primeiro elemento do vetor, assim

modificado, com o segundo e assim por diante até a comparação do ante antepenúltimo com o penúltimo

93 91 76 10 62 59 46 15 93 91 76 62 10 59 46 15 15>46? não troca 46>59? não troca 59 > 62 não troca 62>76? não troca 76>10? Troca 76>91? não troca 15>46? não troca 46>59? não troca 59 > 10 troca 93 91 76 62 59 10 46 15 93 91 76 62 59 10 46 15 59>62? não troca 62>76? não troca 15>46? não troca 46>10? troca 46>59 não troca 59>62 não troca

(14)

53

7.1 Vetor

7.1 Vetor

Problemas –

Ordenação de Vetores

 Observe , no nosso exemplo, que os maiores elementos do vetor

estão sendo colocados ocupando nas últimas posições.

93 91 76 62 59 46 10 15 15>10?troca 46>59? não troca 59 > 62 não troca 62>76? não troca 76>10? Troca 15>46? não troca 46<59? não troca 93 91 76 62 59 46 15 10 54

7.1 Vetor

7.1 Vetor

-

-

Problemas

#include <stdio.h> #include <time.h> const int n = 10; main() { int i, j, tmp, v[n];

// Geração aleatória dos elementos de v entre [0,n-1] //

srand(time(0));

for(i=0; i < n; i++) v[i] = rand()%n;

// Impressão de v antes de ordenar.

printf(“\n v = ”); for(i=0; i < n; i++)

printf(“ [%2d] ”,v[i]);

// Laços encadeados que realizam a // ordenação segundo o algoritmo do // Bubble Sort.

Problema 9 – Bubble Sort

for(i=0; i < n-1; i++) for (j=0; j < n-i-1;j++) if (v[j] > v[j+1]) { tmp = v[j]; v[j] = v[j+1]; v[j+1] = tmp; }

// Mostrar vetor ordenado.

printf(“\n v = ”); for(i=0; i < n; i++)

printf(“ [%2d] ”,v[i]); } // fim programa

Problema 9 – Bubble Sort

55

7.1 Vetor

7.1 Vetor

-

-

Problemas

Problema 9 – Exemplo de Execução

56

7.1 Vetor

7.1 Vetor

-

-

Problemas

(i) Pesquisa Linear: Cada elemento do vetor é analisado até encontrar a

chave de pesquisa. Encontra-se o índice da posição onde a chave está, ou se chegar ao fim do vetor sem encontrar nada, o valor ( -1) é

retornado.

(ii) Pesquisa Binária: Supõe que o vetor esta ordenado, de forma que a

cada comparação da chave com um elemento, metade do vetor é eliminado.

Problema 10: Um problema freqüente de programação é o de pesquisar

um valor-chave, denominado também de chave de pesquisa, em um dado vetor, indicando se o valor existe e qual posição ocupa no vetor. Este processo é chamado de pesquisa e duas técnicas podem ser utilizadas:

Criar um programa que gera um vetor v[i]=2*i de tamanho 14 e verificar o funcionamento de (i) e (ii) para chaves digitadas.

(15)

57

7.1 Vetor

7.1 Vetor

-

-

Problemas

#include <stdio.h> const int n = 14; main() {

int i, chave, ind, v[n];

// Digitando a chave de pesquisa.

printf(“Entre com a chave: ”); scanf(“%d”, &chave);

// Gerar o vetor ordenado v. for(i=0; i < n; i++)

v[i] = 2*i;

// Impressão dos valores de v. for(i=0; i < n; i++) printf(“%3d ”,v[i]); // Cabeçalho. printf(“\n”); for(i=0; i < n; i++) printf(“----”); printf(“\n”);

Problema 10 – Pesquisa Linear

// Laços encadeados: Pesquisa Linear.

ind = -1;

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

// Se a chave foi encontrada, então, // armazenar o índice i de v[i]. if (chave == v[i]) { ind = i; break; } // Mostrar resultado. if(ind == -1)

printf(“ Chave nao encontrada !\n”); else

printf(“Chave no indice: %d \n”,ind); } // fim programa

Problema 10 – Pesquisa Linear

58

7.1 Vetor

7.1 Vetor

Problemas

Problema 10 – Pesquisa Linear Problema 10 – Exemplos de Execução

Chave < v[0] Chave = v[0] Chave

[0,26] mas ∉∉∉∉ Chave = v[13] Chave > v[13] 59

7.1 Vetor

7.1 Vetor

Problemas

Problema 11 – Pesquisa Binária

Idéia da Pesquisa Binária (supõe vetor ordenado !)

1) Faça a= primeiro índice do vetor. 2) Faça b=último índice do vetor.

3) Calcule o índice k do meio do vetor: k=(a+b)/2 4) Verifique se chave < v[k]

Então a chave se encontra entre os elementos v[0]

e v[k]. Faça b=k-1, e volte ao passo 3. Senão a chave se encontra entre os elemento v[k]

e v[b]. Faça a=k, e volte ao passo 3.

60

7.1 Vetor

7.1 Vetor

Problemas

Problema 11 – Pesquisa Binária

Idéia da Pesquisa Binária (supõe vetor ordenado !)

12

v[4]

10

v[3]

8

v[2]

4

v[1]

2

v[0]

EX: Seja chave = 10

a=0 b=4 k=2 a=0; b=4 k = (a+b)/2 = 2 Se (chave>v[k])

então o novo intervalo é a=k+1=3 e b=4; senão o novo intervalo é b=k-1=1 e a=0 Se (chave= v[k])

então encontrou o valor. A chave está na posição k a=3 b=4 Novo intervalo k = (a+b)/2 = 3. chave = v[3], então a chave está na posição 3 do vetor

(16)

61

Quadro resumo dos casos para Pesquisa Binária

Caso 1 Condição Ações chave < v[k] b = k – 1; k = (a+b)/2; Imagem 2 chave = v[k] Retornar k 3 chave > v[k] a = k + 1; k = (a+b)/2; 4 b < a Retornar -1

7.1 Vetor

7.1 Vetor

Problemas:

Problema 11 – Pesquisa Binária

62

7.1 Vetor

7.1 Vetor

Problemas

Problema 11 – Pesquisa Binária

#include <stdio.h> const int n = 14; main()

{

int i, j, a, b, k, chave, ind, v[n]; // Digitando da chave de pesquisa.

printf(“Entre com a chave: ”); scanf(“%d”, &chave);

// Preenchendo o vetor ordenado v. for(i=0; i < n; i++) v[i] = 2*i; for(i=0; i < n; i++) //Imprime vetor

printf(“%3d ”,v[i]);

printf(“\n”); // Imprime cabeçalho for(i=0; i < n; i++) printf(“---”); printf(“\n”);

// Inicializando limites da Pesquisa // Binária e valor do inicial do índice.

a = 0; b = n-1; ind = -1;

Problema 11 – Pesquisa Binária

// Laços encadeados: Pesquisa Binária. while(a <= b) {// Enquanto!= Caso4

k = (a+b)/2;

for (j=0;j < n;j++) // Imprime vetor if (j < a || j > b) printf(“ ”); else if (j == k) printf(“%3d*”,v[j]); else printf(“%3d ”,v[j]);

printf(“\n”);

// Tratando os 3 casos existentes. if (chave == v[k]) // Caso 2.

{ ind = k; break; }

else if (chave < v[k]) // Caso 1.

b = k – 1; else// Caso 3.

a = k + 1; } // Fim do while. if (ind == -1) printf(“Sem Chave\n”); else printf(“Chave - indice:%d\n”,ind); } // fim programa

Problema 11 – Pesquisa Binária

63

7.1 Vetor

7.1 Vetor

Problemas

Problema 11 – Pesquisa Binária

64

7.1 Vetor

7.1 Vetor

Problemas

Problema 12:Na FEG existe uma quantidade de alunos matriculados na disciplina PC e na disciplina de Cálculo II. Mas acontece que estas duas disciplinas estão no mesmo horário. É preciso então saber quais são os alunos que estão matriculados nas duas disciplinas ao mesmo tempo. Fazer um programa que seja capaz de imprimir o número de matricula desses alunos. É dado o número de alunos matriculados em cada disciplina, bem como seus números de matricula. //Programa Simultaneo #include <stdlib.h> #include <stdio.h> main() { int PC[150], CN[220], matrisimult[150]; int NCN,NPC,i, j, k; continua ...

(17)

65

7.1 Vetor

7.1 Vetor

Problemas

Problema 12:Continuação....

//leitura de dados

printf("Digite o numero de alunos cursando PC "); scanf("%d",&NPC);

for(i=1; i <= NPC; i++) {

printf("Digite o no. de matric do aluno %d, em PC ", i); scanf("%d",&PC[i]);

}

printf("Digite o numero de alunos cursando CN "); scanf("%d",&NCN);

i=1;

while (i <= NCN) {

printf("Digite o no. de matric do aluno %d, em CN ", i); scanf("%d",&CN[i]);

i= i+1;

} 66

7.1 Vetor

7.1 Vetor

Problemas

Problema 12: continuação . . . //Verificação dos alunos que estão com matrícula simultânea

k= 0;

for( i= 1;i<= NPC;i++) for (j=1; j<= NCN; j++)

if (PC[i]==CN[j]) { k= k+1;

matrisimult[k]= PC[i]; }

// Escrever o vetor de matricula simultânea

printf ("vetor de matricula simultanea\n"); for (j= 1; j<= k; j++)

printf(" aluno no. %d \n",matrisimult[j]); system("pause");

}

67 Problema 13: Fazer um programa em C para ler um vetor A de

dimensão N e calcular um vetor B da seguinte maneira: B [1]  1 * A [1]

B [2]  2 * A [2] B [3]  3 * A [3] B [4]  4 * A [4] ... B [N]  N * A [N]

Em seguida calcular a soma dos elementos de B e imprimir o vetor B.

7.1 Vetor

7.1 Vetor

Problemas

68

#include <stdlib.h> // Problema 13

#include <stdio.h>

main() {

int a[150], b[150], n, i, soma_b;

//ler o vetor A

printf("quantos elementos tem o seu vetor?"); scanf("%d",&n);

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

{ printf("digite o elemento %d do vetor A ", i); scanf("%d", &a[i]);

}

// Gerar o vetor B e

for (i=1; i<=n; i++) b[i]= i*a[i];

7.1 Vetor

(18)

69 //Continuação ... Problema 13

// calcular a soma de b

soma_b =0;

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

soma_b= soma_b + b[i];

// imprimir b

printf("\n\tVetor B \n"); for (i=1; i<=n; i++)

printf("\tb[%d] = %d\n", i,b[i]);

printf("\n\tSoma de B = %d\n\n", soma_b); system("PAUSE");

}

7.1 Vetor

7.1 Vetor

Problemas

Problemas

70

7.1 Vetor

7.1 Vetor

-

-

Problemas

Problema 14: Um método de Criptografia consiste em substituir

as letras de uma mensagem através do emparelhamento de

alfabetos tal como dado abaixo. Construir um programa que

codifica mensagens usando este esquema.

Alfabeto original

a b c d ... v w x y z

Alfabeto cifrado

B C D E ... W X Y Z A

Texto cifrado

Texto original

v e n i

v i d i

v i c i

W F O J W J E J W J D J

71

7.1 Vetor

7.1 Vetor

-

-

Problemas

#include <stdio.h> main() { int i;

// Laço para construir a Tabela ASCII.

printf(“Tabela ASCII: \n”); printf(“ int -> char \n”);

// A tabela possui 2^8 valores, pois // char é um tipo de 1 byte (8 bits).

for(i=0; i < 255; i++)

printf(“ %4d -> %c \n”, i, char(i)); }

Problema 14– Tabela ASCII

E se imprimir usando (i+1) % 256? e (i+2)%256?

O que ocorre ?

72

7.1 Vetor

7.1 Vetor

-

-

Problemas

(i+1) % 256

(i+2) % 256

Deslocamento do alfabeto

(19)

73

7.1 Vetor

7.1 Vetor

-

-

Problemas

// Inicialização.

char tmp, texto[1000]; // Ler até encontrar‘.’ .

i = 0; while (i < 1000) { tmp = getche(); if (tmp == '.') break; else { texto[i] = tmp; i++; } // Guardar tamanho da msg. n = i; texto[0] texto[1]

•••

•••

•••

•••

••• ••• ••• ••• texto[100]

M

texto[0]

e

texto[1]

•••

•••

•••

•••

••• ••• ••• •••

a

texto[16]

Mensagem Secreta.

n=17

74

7.1 Vetor

7.1 Vetor

-

-

Problemas

// Inicialização char tmp, texto[1000];

// Ler até ‘.’. Não ler backspace.

i = 0; while (i < 1000) { tmp = getche(); if (tmp == '.') break; if (int(tmp) != 8) { texto[i] = tmp; i++; } else i--; } // Guardar tamanho da msg. n = i;

M

texto[0]

e

texto[1]

•••

•••

•••

•••

••• ••• ••• •••

a

texto[16]

Mensagem Secreta

Mr←

ensagem Secreta.

Corresponde ao caractere backspace na Tabela ASCII.

75 #include <stdio.h> #include <conio.h> main() { int i, n; char tmp, texto[1000]; // Armazenando a mensagem. printf(“Entre com a mensagem: ”); i=0; while (i < 1000) { tmp = getche(); // Termina o laço. if (tmp == ‘.’) break;

// Se não for backspace, guarde.

if (int(tmp) != 8) {

texto[i] = tmp; i = i + 1; }

else i--;//Backspace: elimina ant.}

Problema 14 – Criptografia n = i; // Tamanho do vetor em n. // Codificando a mensagem. for(i=0; i < n; i++) texto[i] = (texto[i]+1)%256; // Mostrando a mensagem //codificada.

printf(“\n Mensagem Codificada:\n”);

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

{ printf(“%c”,texto[i]); } printf(“\n”); } // fim programa Problema14– Criptografia

7.1 Vetor

7.1 Vetor

-

-

Problemas

76

7.1 Vetor

7.1 Vetor

-

-

Problemas

Observe que:

M e n s a g e m

S e c r e t a

N f o t b h f n ! T f d s f u b

(20)

77

Problema 15: Criar um programa que captura uma senha e

compara com uma palavra previamente cadastrada. No

momento da digitação, a senha não deve aparecer. Somente

após a validação da senha é que deverá aparecer a palavra

digitada e se a palavra digitada confere com a senha ou não.

7.1 Vetor

7.1 Vetor

-

-

Problemas

78

7.1 Vetor

7.1 Vetor

-

-

Problemas

// Inicialização. char texto[100], tmp;

char senha[100] = “Secreta”; // Ler até encontrar o enter (‘’’).

i = 0;

while( i < 100 ) {

tmp = getch();

// Se digitou , pare leitura.

if (int(tmp) == 13) break; else {texto[i]=tmp; printf(“*”); i++;} } // Fim while. // Guardar tamanho da msg. n = i;

É preciso ter cuidado com backspace !

 Lê o caractere do teclado,

mas o que foi digitado não aparece na tela.

Verifica se foi digitado o enter.

79

7.1 Vetor

7.1 Vetor

-

-

Problemas

// Ler até encontrar ‘

’’.

i = 0;

while( i < 100 ) { tmp = getch();

// Se digitou , pare leitura.

if (int(tmp) == 13) break; else if (int(tmp) != 8) // ≠←≠←≠←≠←. {printf(“*”); texto[i]=tmp; i++; }

else i--; // =←←←←.} // Fim for. // Guardar tamanho da msg. n = i; Tratamento do Backspace

S x ←

e c

S e c r e

r e t

t

texto Palavra Digitada 80

verif = 1;// Supõe que senha = texto. // Tamanho senha igual tamanho texto?

if (ns == nt) //nt= tamanho digitado { // Ler até achar letra ou fim palavras.

for (i=0; i < nt; i++) if (texto[i] != senha[i]) { verif = 0; break; } } else // Tamanhos . verif = 0;

7.1 Vetor

7.1 Vetor

-

-

Problemas

Caso 1: texto senha S S i e e c c r r e e t t a a 0 1 2 3 4 5 6 o a Caso 2: texto senha S S e e g c r r e e d t texto[2] != senha[2]

(21)

81

7.1 Vetor

7.1 Vetor

-

-

Problemas

#include <stdio.h> #include <conio.h> main() { int i, verif, nt, ns = 7; char tmp, texto[100]; char senha[100]="secreta";

// Armazenando a senha digitada.

printf("Digite a senha "); i=0;

while (i < 100) { tmp = getch();

// Termina o laço se for ?. if (int(tmp) == 13) break; else if (int(tmp) != 8) // ??. { printf("*"); texto[i] = tmp; i++; } else { putchar('*'); putchar(' '); putchar(char(8)); i--; }//? }//fim laço Problema 15 – Senha nt = i; // Tamanho digitada em nt.

verif = 1; // Supõe texto == senha. // Ver se texto e senha tem tam?==. if (nt == ns)

{

for (i=0; i < nt; i++) if (texto[i] != senha[i]) { verif = 0; break; } } else verif = 0; // Mostrando mensagem. if (verif)

printf("\nSenha Correta ! \n"); else

printf("\nSenha incorreta ! \n"); getchar(); }// fim programa Problema 15 – Senha 82

7.1 Vetor

7.1 Vetor

-

-

Problemas

83

7.2 Matrizes

7.2 Matrizes

7.2 Dados Estruturados: Matrizes

7.2 Dados Estruturados: Matrizes

84

Matrizes -

Definição



Também chamadas conjuntos bidimensionais,

contém:

um número fixo de elementos;

todos são do mesmo tipo;

arranjados na forma de tabela de 2 dimensões;

7.2 Dados Estruturados: Matrizes

(22)

85

Matrizes -

Definição



Ex.: Uma matriz chamada

MAT

que tenha

m

elementos (horizontal) e

n

elementos (vertical)

0 1 2 3 4 n-1 0 1 2 3 4 m-1 ... ... *

Mat

Mat

[2][3]

[2][3]

7.2 Dados Estruturados: Matrizes

7.2 Dados Estruturados: Matrizes

86

Matrizes ou Array bidimesionais

são estruturas

de dados que organizam informações; de mesmo

tipo e mesmo nome; em tabelas.

7.2 Dados Estruturados: Matrizes

7.2 Dados Estruturados: Matrizes

Para se acessar ou modificar um elemento da matriz

deve-se especificar o nome da matriz seguido de dois

números entre colchetes ([ ]), sendo que o primeiro

corresponde a linha e o segundo corresponde a

coluna relativa a posição que o elemento ocupa na

Tabela.

Para tanto, são utilizados dois índices, que

correspondem a linhas e colunas.

87

7.2 Dados Estruturados: Matrizes

7.2 Dados Estruturados: Matrizes

int a[ 3 ][ 2 ]; Declaração

Declaração e Atribuição de Matrizes



Uma matriz nada mais é que um vetor de duas

dimensões, logo a atribuição de valores a uma matriz é

feita de modo semelhante atribuição de valores a um

vetor.

A declaração de um vetor com n dimensões é feita do

seguinte modo:

tipo nome_do_vetor [dim

1

][dim

2

][dim

3

] ... [dim

n

]

88

Ex: Declaração de uma matriz de inteiro de

dimensão 3x2.

main()

int mat[3][2];

//3 linhas, cada uma delas com 2 posições

7.2 Dados Estruturados: Matrizes

7.2 Dados Estruturados: Matrizes

mat[2][1] mat[2][0] Linha 2 mat[1][1] mat[1][0] Linha 1 mat[0][1] mat[0][0] Linha 0 Coluna 1 Coluna 0

(23)

89



Atribuição Automática Inicial

A atribuição inicial é feita da mesma maneira que para

vetores de uma só dimensão.

Ex: int a[ 3 ][ 2 ] = {1, 1, 2, 2, 3, 3};

Neste exemplo, o vetor tem 3 linha e duas colunas, logo

está sendo feita a seguinte atribuição:

7.2 Dados Estruturados: Matrizes

7.2 Dados Estruturados: Matrizes

-

-

Atribuição Inicial

a[2][1]=3 a[2][0]=3 a[1][1]=2 a[1][0]=2 a[0][1]]=1 a[0][0]=1

Observe que os dois primeiros números da chave estão sendo atribuídos a 1ª. linha, os dois seguintes são atribuídos à segunda linha e os dois últimos são atribuídos a terceira linha.

90

A atribuição inicial também pode ser feita da seguinte maneira

Ex: int a[ 3 ][ 2 ] = { {1, 1}, {2, 2}, {3, 3} };

Observe que agora existe uma separação por linhas, sendo: {1,1} relativa a 1ª. linha; {2,2} relativa a 2ª. linha e {3,3} relativa a 3ª. linha.

7.2 Dados Estruturados: Matrizes

7.2 Dados Estruturados: Matrizes

-

-

Atribuição Inicial

Vetor de tamanho 2x1

Na realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima:

a – É um vetor com 3 elementos (cada elemento é um vetor de 2 inteiros)

a[i] – É um vetor de 2 inteiro

a[i][j] – É um inteiro que está colocado na posição i, j do vetor a

91

7.2 Dados Estruturados: Matrizes

7.2 Dados Estruturados: Matrizes

Acesso e Modificação de valores de uma Matriz

1

1

2

2

3

3

a[0][1]=a[0][1]+2

1

3

4

2

12

3

Matriz Inicial

Operações

Matriz Final

a[1][0]=a[0][1]+1

a[2][0]=a[2][0]*a[1][0]

92

7.2 Dados Estruturados: Matrizes

7.2 Dados Estruturados: Matrizes

Problema 1: Criar programa com uma matriz 3 x 3 de inteiros cujos elementos são da forma a[i][j] = i + j + 1. Imprimir a matriz.

# include <stdio.h> # include <stdio.h> main() { int i, j; int a[3][3]; // Colocando valores em a.

for (i=0; i < 3; i++) for (j=0; j < 3; j++)

a[i][j] = i + j + 1;

// Mostra elementos de a-> a[i][j].

for (i=0; i < 3; i++)

{ for (j=0; j < 3; j++) printf(“ %d ", a[i][j]); puts(“”); } } // fim programa

a [ i ] [ j ] = i + j + 1;

1 2 3 2 3 4 3 4 5

a[0][0] a[0][1] a[0][2]

a[2][0] a[2][1] a[2][2] a[1][0] a[1][1] a[1][2]

(24)

93

7.2 Matrizes

7.2 Matrizes

-

-

Problemas

Problema 2: Criar um programa que dado um valor n construa

o triângulo de Pascal correspondente até a n-ésima linha.

0 1 2 3 4 5 6 0 1 2 3 4 5 6

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

 O Triângulo de Pascal pode ser

calculado usando uma matriz tal que cada elemento é dado por : a[i][j] = a[ i-1 ][ j-1 ]+a[ i-1 ][ j ]

0 1 2 0 1 2

1

1 1

1 2 1

0 0

0

0

1

0

a[1][1] a[0][0] a[0][1] 94

7.2 Matrizes

7.2 Matrizes

-

-

Problemas

Para gerar o triângulo basta seguir os seguintes passos:

Passo 1:

Construir uma

matriz nxn

de zeros

Passo 2:

Preencher

a primeira

coluna com 1

Passo 3:

Obter os demais

elementos utilizando:

a[i][j] = a[ i-1 ][ j-1 ]+a[ i-1 ][ j ]

0 1 2 0 1 2

0 0

0 0 0

0

0

0 0

0 1 2 0 1 2

1

1

1 0 0

0 0

0

0

0 1 2 0 1 2

1 1

1 2 1

0 0

0

1 0

2

0

2

0

2

1

2

0

2

1

2 1

22222

95 #include <stdio.h> const int n = 10; main() { int i, j, a[n][n]; // Inicializando os elementos de a. // Passos 1 e 2.

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

if (j == 0)

a[i][j] = 1;

else

a[i][j] = 0;

// Demais elementos de a. Passo 3.

for (i=1; i < n; i++) for (j=1; j <= i; j++)

a[i][j] = a[i-1][j-1]+a[i-1][j];

Problema 2 – Pascal

7.2 Matrizes

7.2 Matrizes

Problemas :

Problema 2 – Pascal

// Mostrando os elementos de a.

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

{ for (j=0; j < n; j++) printf(“ %4d ”,a[i][j]); printf(“\n”); } } // fim programa Problema 2 – Continuação 96 Problema 3: As notas de uma turma são armazenadas em

uma matriz de forma que a i-ésima linha contém todas as 4 notas bimestrais de um aluno. Supondo que o 1, 2, 3 e 4 bimestre possuem pesos 1, 2, 1 e 2, respectivamente, calcular e mostrar a média de cada aluno.

7.2 Matrizes

7.2 Matrizes

-

-

Problemas

Idéia do Programa

7.0 3.5 4.0 8.5

•••

•••

•••

•••

2.0 5.5 7.0 9.5

*

=

5.8

6.5

Matriz alunos x notas Vetor pesos Vetor médias M1 Mm

•••

•••

•••

•••

5.8

6.5

1

2

1

2

P1 P2 P3 P4

1

2

1

2

Aluno 1 • • • • •••• •••• Aluno m B1 B2 B3 B4

7.0 3.5 4.0 8.5

• •

• •

2.0 5.5 7.0 9.5

(25)

97

7.2 Matrizes

7.2 Matrizes

-

-

Problemas

Como multiplicar uma matriz por um vetor ?

a

11

a

12

•••

•••

•••

•••

a

21

a

22

•••

•••

•••

•••

•••

•••

•••

•••

•••

•••

•••

•••

•••

•••

•••

•••

a

m1

a

m2

•••

•••

•••

•••

v

11

v

21

•••

•••

•••

•••

a

1n

a

2n

•••

•••

•••

•••

a

mn

v

n1

=

r

11

r

21

•••

•••

•••

•••

r

m1

Matriz m x n

Vetor n x 1

Vetor m x 1

a

11

a

12

•••

•••

•••

•••

a

1n 98

7.2 Matrizes

7.2 Matrizes

-

-

Problemas

Como é calculado o i-ésimo elemento do vetor r ?

r

i1

a

i1

a

i2

•••

•••

•••

•••

a

in

v

11

v

21

•••

•••

•••

•••

v

n1

=

1 1 1 k n k ik i

a

v

r

=

=

i = 1, ..., m

Primeiro laço

Segundo laço

99 #include <stdio.h>

// Supondo uma classe com 10 alunos. const int m = 10; main() { int i, j, k; float soma; float a[m][4], r[m], p[4] = {1,2,1,2}; // Armazenando as notas.

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

printf(“Aluno %d: ”, i+1); for (j=0; j < 4; j++) { printf(“\n Nota %d: ”,j+1); scanf(“%f”, &a[i][j]); } } Problema 3 – Notas

// Calculo da media e resultado em r. for (i=0; i < m; i++)

{

soma = 0.0;

// Media do aluno i: armazenar a // soma das k notas vezes k pesos. for (k=0; k < 4; k++)

soma = soma + a[i][k]*p[k];

// Calculo da media do aluno i.

r[i] = soma/6; }

// Mostrando a media de cada aluno.

printf(“ Aluno Media \n“); for (i=0; i < m; i++)

printf(“ %4d %4.2f \n”,i+1,r[i]); } // fim programa Problema 3 – Notas

7.2 Matrizes

7.2 Matrizes

-

-

Problemas

100

Problema 4: Uma fazenda foi dividida em 3 regiões e para

cada uma delas é armazenada em uma matriz a informação

da produção, em toneladas de 4 tipos de culturas: milho, soja,

feijão e arroz. Os dados de 1 ano são registrados em uma

matriz A. Construir um programa que realize as seguintes

tarefas:

(1) Ler os dados de produção de cada cultura em cada uma

das regiões da fazenda.

(2) Calcular a produção de grãos de cada região.

(3) Calcular a produção de grãos de cada cultura.

(4) Calcular o total de grãos produzidos pela fazenda.

7.2 Matrizes

Referências

Documentos relacionados

Abra a sua loja connosco e entre num

Para avaliar a ativação do oxidante persulfato de sódio promovida pelo ferro natural dos solos, ensaios utilizando persulfato de sódio a concentração 0,2 mol/L durante 24

A revisão desses índices de secas foi importante para escolher àquele que melhor represente o evento seca na região semiárida do Nordeste do Brasil e em especial na

O !omem é como mani0estação concreta, o que ele mesmo se 0e' e 0a' constantemente, com seus pensamentos conscientes e subconscientes, sua maneira de ser e sua atividade#

Durante o armazenamento, a qualidade das sementes foi avaliada a cada seis semanas, por 30 semanas, por meio das seguintes determinações: teor de água (105±3 °C/24 h), porcentagem

Os agricultores possuem uma maior percepção dos Serviços de Produção, principalmente devido ao fato de que possuem uma relação mais direta com estes Serviços e atribuem um

Neste cenário, a primeira rede (Rede 1), responsável pela organização das feiras de Lagoa Seca, da Estação Velha e do bairro Catolé, é composta primordialmente por entidades da

com objetivo de comparar as gramíneas Coast cross e Tifton 85, do gênero Cynodon, e as gramíneas Suázi (Digitaria swazilandensis) e Transvala (D. decumbens), do gênero Digitaria,