Buscar

C_Aula7_Vetores

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 78 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 78 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 78 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

1
Unesp – Campus de Guaratinguetá
7. Dados Estruturados7. Dados Estruturados
Vetores , Matrizes e Vetores , Matrizes e StringsStrings
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: ArrayArray
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 ArrayArray -- 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 7.1 ArrayArray -- Problema
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 3 4 1002
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
9
Array - Solução 2
2o. Algoritmo
Início algoritmo
Para i ← 0 até 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: Declara7.1 Dados Estruturados: Declaraçãção de Vetoreso 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: Declara7.1 Dados Estruturados: Declaraçãção de Vetoreso 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: Declara7.1 Dados Estruturados: Declaraçãção de Vetoreso de Vetores
13
7.1 Dados Estruturados: Declaração de Vetores7.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]
23 46 5
!!!!
val[1]
!
val[2]
!
val[3]
!
val[4]
Exemplo 6: val[1] = val[1] + 1; 
val[3] = val[1]+ val[3];
!!!!
val[0]
33 76 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: Declara7.1 Dados Estruturados: Declaraçãção de Vetoreso 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 -- ProblemasProblemas
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
21
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 -- ProblemasProblemas
#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");
}
17
Programa 2 – Exemplo de Execução
7.1 Dados Estruturados: Vetor 7.1 Dados Estruturados: Vetor -- ProblemasProblemas
18
7.1 Dados Estruturados: Vetor 7.1 Dados Estruturados: Vetor -- ProblemasProblemas
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 -- ProblemasProblemas
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 7.1 Dados Estruturados: Vetor -- ProblemasProblemas
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 ConstantesDefinição de Constantes
22
7.1 Vetor: Defini7.1 Vetor: Definiçãção de Constanteso 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 #includes ou após o main().
Pode-se então, reescrever o programa 3, usando constantes.
23
7.1 Vetor 7.1 Vetor -- ConstantesConstantes - 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 Vetor7.1 Vetor-- Constantes Constantes -- Uso do comando const
//Problema 3 – Notas Maiores
//usando const
#include <stdio.h>
main() 
{
const int n = 5; 
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
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:
const int n=5;
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 -- ProblemasProblemas
#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
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
••• ••••••
1304v[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 maior e 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 menor e guardar nela o primeiro 
elemento do vetor v. Isto é: menor ←←←← v[0].
" Comparar a variável menor com 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
Problema 5 – Continuação
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
37
Idéia do programa
7.1 Vetor 7.1 Vetor –– Problemas Problema 6
Gerador linear congruencial
Sn+1 = (Sn *a + b) mod m
onde: é uma boa estratégia usar
m, a e b números primos. 
S0 é a semente
Sn+1 será 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 Sn dentro 
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 7
13
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
Problema 6 - Continuação
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
45
#include#include#include#include <stdio.h>
mainmainmainmain() 
{
constconstconstconst intintintint m = 100; 
intintintint i, num, vc[5] = {0,0,0,0,0}; 
floatfloatfloatfloat tmp, vn[m];
// Leitura do número de alunos.
printf(“Entre com no. alunos: “);
scanf(“%d”, &num);
// Leitura dos valores das notas.
forforforfor(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
forforforfor(i=0; i < numi < numi < numi < num; i++) 
{
ifififif (vn[i] >= 9.0) vc[0]++;
elseelseelseelse ifififif (vn[i] >= 7.0) vc[1]++;
elseelseelseelse ifififif (vn[i] >= 5.0) vc[2]++;
elseelseelseelse ifififif (vn[i] >= 3.0) vc[3]++;
elseelseelseelse vc[4]++; 
}
// Mostrar percentual cada conceito.
forforforfor(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.
Problema 8 – Histograma
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
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.
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 !)
12v[4]
10v[3]
8v[2]
4v[1]
2v[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
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 numero 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 ...
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 7.1 Vetor –– ProblemasProblemas
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 –– ProblemasProblemas
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
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
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
ttexto
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]
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 Matrizes7.2 Matrizes
7.2 Dados Estruturados: Matrizes7.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: Matrizes7.2 Dados Estruturados: Matrizes
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
...
...
*
MatMat[2][3][2][3]
7.2 Dados Estruturados: Matrizes7.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: Matrizes7.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: Matrizes7.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 [dim1][dim2][dim3] ... [dimn]
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: Matrizes7.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 1Coluna 0
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]=3a[2][0]=3
a[1][1]=2a[1][0]=2
a[0][1]]=1a[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: Matrizes7.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 Matriz FinalOperações
a[1][0]=a[0][1]+1
a[2][0]=a[2][0]*a[1][0]
92
7.2 Dados Estruturados: Matrizes7.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]
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
01 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
00 0
0 1 2
0
1
2
1
1
1 0 0
0 0
00
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 122222
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
97
7.2 Matrizes 7.2 Matrizes -- Problemas
Como multiplicar uma matriz por um vetor ?
a11 a12 ••••••••••••
a21 a22 ••••••••••••
•••••••••••• •••••••••••• ••••••••••••
am1 am2 ••••••••••••
•••• v11
v21
••••••••••••
a1n
a2n
••••••••••••
amn vn1
= r11
r21
••••••••••••
rm1
Matriz m x n
Vetor n x 1
Vetor m x 1
a11 a12 •••••••••••• a1n
98
7.2 Matrizes 7.2 Matrizes -- Problemas
Como é calculado o i-ésimo elemento do vetor r ?
ri1 ai1 ai2 •••••••••••• ain •••• v11
v21
••••••••••••
vn1
=
1
1
1 k
n
k
iki var ∑
=
= 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 7.2 Matrizes -- Problemas
101
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
Idéia do Programa
Região 1
Região 2
Região 3
Milho Soja Feijão Arroz
3.0
1.0
2.0
4.0
5.0
6.0
2.0
4.0
3.0
3.0
2.0
5.0
Uma matriz 
3x4 para 
os dados
Região 1
Região 2
Região 3
Milho Soja Feijão Arroz
Total cultura
Total região
12.0
12.0
16.0
6.0 15.0 9.0 10.0
3.0
1.0
2.0
4.0
5.0
6.0
2.0
4.0
3.0
3.0
2.0
5.0
102
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
#include <stdio.h>
const int m = 3; const int n = 4;
main() 
{ int i, j, k; 
float a[m][n], r[m], c[n]; 
// Armazenando a produção em a.
for (i=0; i < m; i++) { 
printf(“Regiao %d: ”, i+1); 
for (j=0; j < n; j++) { 
printf(“\n Cultura %d: ”,j+1);
scanf(“%f”, &a[i][j]); } }
// Calculo do total para cada região.
for (i=0; i < m; i++) { 
r[i] = 0.0; // Valor inicial.
// Soma das culturas da região i. 
for (k=0; k < n; k++) 
r[i] = r[i] + a[i][k]; 
printf(“Regiao %d: %4f\n”,i+1,r[i]); } 
Problema 4 – Fazenda 
// Calculo do total para cada cultura.
for (j=0; j < n; j++) 
{ 
c[j] = 0.0; // Valor inicial.
// Soma da regiões da cultura i. 
for (k=0; k < m; k++) 
c[j] = c[j] + a[k][j]; 
printf(“Cultura %d: %4f\n”,j+1,c[j]); 
}
} // fim programa
Problema 4 – Fazenda
103
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
ValorCobertura Vegetal
Entre 80% e 100%
Entre 60% e 80%
5
4
Entre 40% e 60% 3
Entre 20% e 40% 2
Entre 0% e 20% 1
Problema 5: Para monitorar o desmatamento de uma determinada 
área são utilizadas imagens produzidas por um satélite. Para 
tanto, é necessário dividir a área a ser monitorada em sub-áreas 
e depois atribuir um valor que indica o grau de cobertura vegetal 
existente em cada sub-área de acordo com a seguinte tabela
104
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
Ou seja, associa-se uma imagem a uma matriz de valores:
Assim, o cálculo do desmatamento de uma área, que consiste 
em se comparar as diferenças entre duas imagens da área 
para anos diferentes, pode ser obtido com a soma das 
diferenças dos elementos de duas matrizes. 
5
5
5
4
5
5
4
4
5
4
3
2
5
5
3
1
105
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
5
5
5
4
5
5
4
3
5
4
2
2
5
4
2
1
Ano de 2007
5
5
5
4
5
5
4
4
5
4
3
2
5
5
3
1
Ano de 2006
- =
0
0
0
0
0
0
0
-1
0
0
-1
0
0
-1
-1
0
Matriz de
variação da
cobertura
vegetal
No caso acima pode-se dizer que o 
desmatamento entre 2006 e 2007 
foi da ordem de 4 unidades.
- 4 unidades
106
Problema 5: Utilizando as informações anteriores, construir 
um programa que, dadas duas matrizes A e B correspondentes
aos dados de cobertura vegetal de uma área em dois anos 
consecutivos, imprime uma matriz C de variação da cobertura 
vegetal, bem como o total de unidades desmatadas. Supor 
A e B como dadas no exemplo abaixo:
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
5
5
5
4
5
5
4
3
5
4
2
2
5
4
2
1
5
5
5
4
5
5
4
4
5
4
3
2
5
5
3
1
- =
0
0
0
0
0
0
0
-1
0
0
-1
0
0
-1
-1
0
- 4 unidades
Matriz A Matriz B
107
7.2 Matrizes 7.2 Matrizes –– Problemas 
#include <stdio.h>
const int m = 4; const int n = 4;
main() 
{int i, j, soma, c[m][n]; 
int a[m][n] = {{5,5,5,5}, {5,5,4,4}, 
{5,4,2,2}, {4,3,2,1}}; 
int b[m][n] = {{5,5,5,5}, {5,5,4,5}, 
{5,4,3,3}, {4,4,2,1}};
// Contabilizando desmatamento em c.
for (i=0; i < m; i++) 
for (j=0; j < n; j++) 
c[i][j] = a[i][j] - b[i][j];
// Mostrando a matriz c.
for (i=0; i < m; i++) { 
for (j=0; j < n; j++) 
printf(“ %4d ”,c[i][j]); 
printf(“\n”); } 
Problema 5 – Desmatamento
// Totalizando n. unidades
//desmatadas.
soma = 0;
for (i=0; i < m; i++) 
for (j=0; j < n; j++) 
soma = soma + c[i][j]; 
// Exibindo n. unidades desmatadas.
printf(“Cobertura Veg. = %d\n”,soma); 
} // fim programa
Problema 5 – Desmatamento
Resolvidos
108
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
Problema 6: Construir um programa que simule um jogo da
velha. O programa deve cumprir os seguintes requisitos:
(i) Permitir movimentos alternados de dois jogadores A e B.
(ii) Identificar se um movimento pode ser realizado ou não.
(iii) Identificar o término de um jogo, indicando as 3 possíveis
situações: (1) A ganhou, (2) B ganhou, (3) Empate.
(iv) Construir um tabuleiro que permita a representação das
jogadas tal como dado abaixo. 
x
o
Espaço livreJogada de A
Jogada de B
109
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
x
Requisito (i): Movimentos alternados de A e B.
0 x o
o o x
x x o
1
2 3
4
6
78
5
if (cont%2 == 0)
// Movimento de A
else
// Movimento de B
if (cont == 9)
// Empate !
Requisito (iii): Identificar empate.
Variável contadora de jogadas válidas: cont.
110
Requisito (iv): Representação das jogadas.
. x .
o . .
. . .
Matriz de caracteres
Coordenadas: 0 1 Coluna 0
Linha 0
Linha 1
Linha 2
Coluna 1 Coluna 2
0
0
Coordenadas: 1 01
Caractere ‘.’
1
Requisito (ii): Se a jogada pode ser realizada.
if (m[i][j] == ‘.’)
Pode fazer jogada
7.2 Matrizes 7.2 Matrizes ––Problemas Resolvidos
111
Requisito (iii): Situações de jogadas vencedoras.
x x x
x x x
x x x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
x
if (m[0][0] == ‘X’ && m[1][0] == ‘X’ && m[2][0] == ‘X’)
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
112
// Algoritmo Simples do Jogo da Velha.
Passo 1: Criar matriz m de caracteres 3 x 3 cujos elementos são ‘.’.
Passo 2: Mostrar estado atual da matriz.
Passo 3: Enquanto (True) faça
Passo 3.1: Verificar se jogador A fez jogada vencedora. 
Se sim, pare. O jogador A venceu.
Passo 3.2: Verificar se jogador B fez jogada vencedora. 
Se sim, pare. O jogador B venceu.
Passo 3.3: Verificar se a jogada atual é a décima. 
Se sim, pare. Ocorreu empate. 
Passo 3.4: Capturar coordenadas i (linha) e j (coluna) da jogada. 
Se i e j foram válidos então ( ou seja m[i][j]== ‘.’)
Passo 3.4.1: Se (jogada de A) preencher a casa com a marca de ‘x’.
Senão preencher a casa com a marca ‘o’.
Passo 3.4.2: Incrementar uma variável contadora de jogadas.
Problema 6 – Jogo da Velha – Algoritmo Simples
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
113
#include <stdio.h>
#include <stdlib.h>
main() 
{char m[3][3]; 
int i, j, cont =0; 
const int TRUE = 1;
const char O = 'o', X = 'x';
printf("Digite lin col \n");
// Inicializando a matriz m com ‘.’. 
for (i=1; i <= 3; i++)
for (j=1; j <=3; j++)
m[i][j] = '.';
while (TRUE) // Laço infinito.
{
// Mostrando a matriz m.
for (i=1; i <= 3; i++) 
{ 
for (j=1; j <= 3; j++) 
printf(" %c ",m[i][j]);
printf("\n");
}
Problema 6 – Jogo da Velha 
// Verificando se o jogador A ganhou.
if ((m[1][1]==X && m[1][2]==X && m[1][3]==X) ||
(m[2][1]==X && m[2][2]==X && m[2][3]==X) ||
(m[1][1]==X && m[2][1]==X && m[3][1]==X) ||
(m[1][2]==X && m[2][2]==X && m[3][2]==X) || 
(m[1][3]==X && m[2][3]==X && m[3][3]==X) || 
(m[3][1]==X && m[2][2]==X && m[1][3]==X) ||
(m[1][1]==X && m[2][2]==X && m[3][3]==X) )
{printf("Jogador A ganhou !!! \n"); break;}
// Verificando se o jogador B ganhou.
if ((m[1][1]==O && m[1][2]==O && m[1][3]==O) ||
(m[2][1]==O && m[2][2]==O && m[2][3]==O) ||
(m[3][1]==O && m[3][2]==O && m[3][3]==O) ||
(m[1][1]==O && m[2][1]==O && m[3][1]==O) ||
(m[1][2]==O && m[2][2]==O && m[3][2]==O) || 
(m[1][3]==O && m[2][3]==O && m[3][3]==O) || 
(m[1][1]==O && m[2][2]==O && m[3][3]==O) ||
(m[1][3]==O && m[2][2]==O && m[3][1]==O) )
{printf("Jogador B ganhou !!! \n\n"); break;}
Problema 6 – Jogo da Velha
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
114
if (cont == 9) // Sem jogadas.
{ printf("\a Empatou !!! \n\n"); break;}
// Capturando nova jogada.
printf("Digite as Coordenadas: ");
scanf("%d %d",&i,&j);
if (m[i][j] == '.') // Verifica se Casa está livre ?
{
if (cont % 2 == 0) // O jogador A é quem jogou.
m[i][j] = X;
else // O jogador B é quem jogou. 
m[i][j] = O;
// Contado o n. de jogadas.
cont++; 
} // Fim if que verifica casa livre.
} // Fim do while.
Problema 6 – Jogo da Velha (Cont.)
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
115
Problema 7: Construir um programa que simule o jogo Yucky
Choccy. O programa deve cumprir os seguintes requisitos:
(i) Permitir movimentos alternados de dois jogadores A e B.
(ii) Identificar se um movimento pode ser realizado ou não.
(iii) Identificar o término de um jogo, indicando as 2 possíveis
situações: (1) A ganhou, (2) B ganhou.
(iv) Construir um tabuleiro que permita a representação das
jogadas tal como dado abaixo. 
Barra de sabão
Jogada de A
Jogada de B
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
116
Requisito (iv): Representação das jogadas.
. x x
. x x
. x x
Matriz de caracteres
Coordenadas: 0 1 Coluna 0
Linha 0
Linha 1
Linha 2
Coluna 1 Coluna 2
0
0
Coordenadas: 1 01
Caractere ‘.’
1
Requisito (ii): Se a jogada pode ser realizada.
if (m[i][j] == ‘.’)
Pode fazer jogada
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
117
#include <stdio.h>
main() 
{const int m = 4;
char A[m][m]; 
int i, j, lin, col, cont =0; 
const char O = ‘o’, X = ‘x’;
printf(“Digite linha e coluna \n”);
// Inicializando a matriz m com ‘.’.
for (i=0; i < m; i++)
for (j=0; j < m; j++)
A[i][j] = ‘.’;
while (1) // Laço infinito.
{
// Mostrando a matriz m.
for (i=0; i < m; i++) 
{ 
for (j=0; j < m; j++) 
printf(“ %c ”, A[i][j]);
printf(“\n”);
}
Problema 7 – Yucky Choccy Problema 7 – Yucky Choccy
// Capturando nova jogada.
if (cont%2 == 0) printf(“Jogada de A: ”);
else printf(“Jogada de B: ”);
scanf(“%d %d”,&lin,&col);
// Casa livre ?
if (A[lin][col] == ‘.’ &&(lin == 0||col == 0) ) 
{
// É a vez do jogador A.
if (cont % 2 == 0) 
{ // Verificando se A perdeu e B ganhou.
if (lin == 0 && col == 0)
{printf(“ B ganhou ! \n”); break;} }
else
{ // Verificando se B perdeu e A ganhou.
if (lin == 0 && col == 0)
{printf(“ A ganhou ! \n”); break;} }
// Contado o n. de jogadas.
cont++; 
// Modificar elementos da matriz A para ‘x’.
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
118
// Apenas os seguintes elementos serão 
// modificados: da linha de i até m e da 
// coluna de i até m. 
for (i=lin; i < m; i++)
for (j=col; j < m; j++)
A[i][j] = ‘x’; 
} // Fim if que verifica casa livre.
} // Fim do while. 
} // Fim main.
Problema 7 – Yucky Choccy (Cont.)
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
119
Figura 1 Tabela 1
G QAV Nafta
17.4 4.3 2.1
7.1 12.3 8.2
2.1 0.3 35.6
Solo
Tabela 2
G
Insumo Valor
4.12
QAV 8.74
Nafta 3.78
Problema 8: Um veículo submarino autônomo é utilizado para 
realizar o mapeamento do leito oceânico de uma certa área e 
a mesma é dividida nas sub-áreas, dada na Figura 1. Cada sub
área pode fornecer uma quantidade de insumos (Tabela 1), e 
cada insumo tem um valor (Tabela 2). Construir um programa 
que calcula o lucro que pode ser obtido em cada sub-área.
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
120
Passo 1:
2
3
1 1 2
1 2 2
31 3 3
2
3
1 1 2
1 2 2
31 3 3
Passo 2: Se área = 1:
17.4 4.3 2.1
6.1 12.3 8.2
2.1 0.3 35.6
* 4.12
8.74
3.78
Indíce da linha: 0
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
121
#include <stdio.h>
const int m = 3; const int n = 4;
main() 
{ int i, j, k; 
float s, C[m][n], v[m] = {4.12, 8.74, 
3.78}; 
int A[m][n] = {{1,1,2,2}, {1,2,3,2}, 
{1,3,3,3}}; 
float B[m][m] = {{17.4, 4.3, 2.1}, {6.1, 
12.3, 8.2}, {2.1, 0.3, 35.6}};
// Varrendo a matriz A e de acordo
// com o valor A[i][j], calcular o valor
// com B*v e guardar em C[i][j].
for (i=0; i < m; i++) 
for (j=0; j < n; j++) 
{ s = 0.0;
for (k=0; k < m; k++) 
s = s + B[A[i][j]-1][k]*v[k];
C[i][j] = s; }
Problema 8 – Petróleo 
// Mostrando a matriz C com os lucros.
printf(“Matriz de lucros \n”);
for (i=0; i < m; i++) 
{ 
for (j=0; j < n; j++) 
printf(“ [%7.2f] ”,C[i][j]); 
printf(“\n”);
}
} // fim programa
Problema 8 – Petróleo
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
122
2
3
1 1 2
1 2 2
31 3 3
Resultado da Execução
7.2 Matrizes 7.2 Matrizes –– Problemas Resolvidos
123
7.3 Dados Estruturados: Strings 7.3 Dados Estruturados: Strings 
7.3 Strings7.3 Strings
124
7.3 Strings 7.3 Strings -- Definições
" A linguagem C apresenta algumas limitações no que 
diz respeito ao tratamento da string, pois 
diferentemente das outras linguagem, em C a string 
não é um tipo básico
" Logo, em C não é possível atribuir uma string a uma 
variável ou concatenar uma string a outra utilizando 
os sinais de atribuição (=) e soma (+) como é 
possível nas outras linguagens
Definição: Na linguagem C uma string é um conjunto 
de caracteres armazenados num vetor.
125
7.3 Strings 7.3Strings -- Definições
" Em C, as strings são representadas usando aspas, 
enquanto que os caracteres são representados 
entre aspas simples
Exemplos de strings Exemplos de caracteres
“Luis Carlos” ‘L’
“Pedro Henrique” ‘>’
“Receita de Bolo de Chocolate ” ‘B’
" Em C, declaração de strings obedece à sintaxe de 
declaração de vetores de caracteres. 
" Para marcar o fim da string , é colocado na ultima 
posição do vetor, um marcador de final de string
126
" Então, em C, strings são seqüências de caracteres 
adjacentes na memória. O caractere ‘\0’ (= valor inteiro 
zero) indica o fim da seqüência.
7.3 Strings 7.3 Strings -- Definições
OBS: No exemplo acima o caractere de fim de seqüência ‘\0’
ocupa a primeira posição do vetor, porque ainda não foi 
atribuído nenhum caractere ao mesmo.
str: \0
0 12
aluno
Exemplo 1: char aluno[13];
• define um string de nome “aluno” e reserva para ele um 
espaço de 13 (12 + ‘\0’) bytes na memória.
127
Exemplo 2: char nome[16] = “Pindamonhangaba”;
" define uma string de nome “nome”, reserva para ele um 
espaço de memória de 16 (15 + ‘\0’) bytes e o inicia com o 
texto indicado
0 15
P i n d a m o n h a n g a b a \0nome:
7.3 Strings 7.3 Strings -- Definições
" Os caracteres podem ser individualmente acessados por
indexação:
" Exemplo 3: nome[0] = ‘P’;
nome[10] = ‘n’
128
" A função printf pode ser utilizada para imprimir cada 
caractere da string s, ou verificando se n caracteres foram 
percorridos, ou verificando se o caractere ‘\0’ foi encontrado.
7.3 Strings 7.3 Strings –– Leitura e Impressão de Strings
#include <stdio.h>
const int n = 100;
main() 
{ 
int i; 
char s[n] = “Uma string tipica.”;
// Varrendo cada componente do 
//vetor e imprimindo até que i < 
n.
for (i=0; i < 18; i++) 
printf(“%c”,s[i]); 
}
Exemplo 4 – Usando n
#include <stdio.h>
const int n = 100;
main() 
{ 
int i; 
char s[n] = “Uma string tipica.”;
// Varrendo cada componente do 
// vetor e imprimindo até 
// que s[i] == ‘\0’.
for (i=0; s[i] != ‘\0’; i++) 
printf(“%c”,s[i]); 
}
Exemplo 5 – Usando ‘\0’ 
129
7.3 Strings 7.3 Strings –– Entradas e Saídas de Strings
" A função printf pode também utilizar a tag %s que é
válida para imprimir strings. A função puts também 
pode ser utilizada para imprimir o conteúdo de strings.
#include <stdio.h>
const int n = 100;
main() 
{ 
int i; 
char s[n] = “Uma string tipica.”;
// Usando a tag %s e printf.
printf(“%s”, s); 
}
Exemplo 6 – Printf + %s
printf(“%s”,s);
#include <stdio.h>
const int n = 100;
main() 
{ 
int i; 
char s[n] = “Uma string tipica.”;
// Impressão usando puts.
puts(s); 
}
Exemplo 7 – Puts
puts(s);
130
7.3 Strings 7.3 Strings –– Entradas e Saídas de Strings
" A função scanf pode ser usada com a tag %s, mas se ela 
encontrar <TAB>, <ESPAÇO> ou <ENTER> a leitura será 
interrompida.
#include <stdio.h>
const int n = 100;
main() 
{ 
int i; 
char s[n];
printf(“Entre com uma string:”);
scanf(“%s”,s);
printf(“\n String digitada: %s”,s); 
}
Exemplo 8 – Scanf
Palavra Digitada é:
“a vida eh bela !”
Só armazenou:
“a”
OBS: Na leitura das variáveis string com a função scanf não se utiliza o &
131
7.3 Strings 7.3 Strings –– Entradas e Saídas de Strings
" A função gets pode ser empregada sem se utilizar a tag
%s e só ao encontrar <ENTER> a leitura da string será 
interrompida.
#include <stdio.h>
const int n = 100;
main() 
{ 
int i; 
char s[n];
printf(“Entre com uma string:”);
gets(s);
printf(“\n String digitada: %s”,s); 
}
Exemplo 9 – gets
Palavra Digitada:
“a vida eh bela !”
Armazenou:
“a vida eh bela !”
132
7.3 Strings 7.3 Strings –– Problemas
Problema 1: Determinar o tamanho de uma string, ou seja, 
determinar o número de caracteres que ela possui sem contar
o caractere especial que delimita o final da string, ‘\0’.
A V i d a e h b e l a !
Digite uma string: A vida eh bela!
Tamanho da string: 15
Exemplo de Execução:
‘\0’
Os espaços também são contabilizados !
Não contabilizar e indica final da contagem !
133
#include <stdio.h>
const int m = 100; 
main() 
{ 
int i, soma=0; 
char s[m]; 
printf(“Digite uma string: ”);
gets(s);
// Varrendo string até encontrar ‘\0’. 
for (i=0; s[i] != ‘\0’; i++) 
soma++;
// Impressão do número de carac-
//teres ou seja do tamanho da string.
printf(“Tamanho: %d \n”,soma); 
}
Problema 1 – Tamanho String
7.3 Strings 7.3 Strings –– Problemas
Exemplo de Execução
for (i=0; s[i] != ‘\0’; i++)
134
7.3 Strings 7.3 Strings –– Problemas
Problema 2: Dada uma string e um caractere digitados pelo 
usuário, mostrar o número de ocorrências do caractere na
String. Um exemplo de execução do programa é como dado:
A V i d a e h b e l a !String
Número de ocorrências: 2
Digite uma string: A vida eh bela !
Digite um caractere: a
Número de ocorrências: 2
Exemplo de Execução:
Caractere a
135
7.3 Strings 7.3 Strings –– Problemas
#include <stdio.h>
const int m = 100; 
main() 
{ 
int i, soma=0; 
char ch, s[m]; 
printf(“Digite uma string: ”);
gets(s);
printf(“Digite um caractere:”);
scanf(“%c”,&ch);
// Varrendo string até encontrar ‘\0’. 
for (i=0; s[i] != ‘\0’; i++) 
if (s[i] == ch)
soma++;
// Impressão do número de carac 
//teres ou seja o tamanho da string.
printf(“Ocorrencias: %d \n”,soma); 
}
Problema 2 – Ocorrências Exemplo de Execução
for (i=0; s[i] != ‘\0’; i++)
if (s[i] == ch)
136
7.3 Strings 7.3 Strings –– Problemas
Problema 3: Modificar o Problema 2 de modo que o caractere
seja contabilizado independentemente se ele é maiúsculo ou 
minúsculo. Um exemplo de execução do programa é dado por:
A V i d a e h b e l a !
Caractere a
String
Número de ocorrências: 3
Digite uma string: A vida eh bela !
Digite um caractere: a
Número de ocorrências: 3
Exemplo de Execução:
137
7.3 Strings 7.3 Strings –– Problemas
#include <stdio.h>
#include <ctype.h>
const int m = 100; 
main() 
{ 
int i, soma=0; 
char ch, s[m]; 
printf(“Digite uma string: ”);
gets(s);
printf(“Digite um caractere:”);
scanf(“%c”,&ch);
// Varrendo string até encontrar ‘\0’. 
for (i=0; s[i] != ‘\0’; i++) 
if (toupper(s[i]) == toupper(ch))
soma++;
// Impressão do número de caracteres
// ou seja o tamanho da string.
printf(“Ocorrencias: %d \n”,soma); 
}
Problema 3 – Ocorrências Mod
if (toupper(s[i]) == toupper(ch))
Exemplo de Execução
Lembrando que o comando toupper(c) 
transforma as letras minúsculas
contidas em C, em maiúsculas
138
7.3 Strings 7.3 Strings –– Problemas
Problema 4: Construir um programa que substitui todas as 
ocorrências de um caractere ch1 em uma string por um 
caractere ch2 :
R E D C o d
Caractere ch1 e
String
Digite uma string: RED Code!
Digite ch1 e ch2: e *
Nova string: R*d Cod*
Exemplo de Execução:
e
R * D C o d
Caractere ch2 *
String *
139
7.3 Strings 7.3 Strings –– Problemas
#include <stdio.h>
#include <ctype.h>
const int m = 100; 
main() 
{ 
int i; 
char ch1, ch2, s[m]; 
printf(“Digite uma string: ”);
gets(s);
printf(“Digite ch1 e ch2:”);
scanf(“%c%c”,&ch1,&ch2);
//Varrendo string até encontrar ‘\0’. 
for (i=0; s[i] != ‘\0’; i++) 
if (toupper(s[i]) == toupper(ch1))
s[i] = ch2;
// Impressão do número de carac 
// teres ou seja o tamanho da string.
printf(“Nova string %s \n”,s); 
}
Problema 4 – Substituição Exemplo de Execução
if (toupper(s[i]) == toupper(ch))
s[i] = ch2;
140
7.3 Strings 7.3 Strings –– Problemas
Problema 5: Construir um programa que contabiliza todas as 
ocorrências de uma sub-string s1 em uma string s2.
t r e s p r
Sub-string s1
String s2 
Digite a string: tres pratosde trigo para tres tigres tristes
Digite a sub-string: tr 
Frequencia:4
Exemplo de Execução:
a t o s ••••••••••••
t r
141
7.3 Strings 7.3 Strings –– Problemas
#include <stdio.h>
#include <ctype.h>
const int m = 100; 
main() 
{int i, j, k, soma = 0; 
char s1[m], s2[m]; 
printf("Digite a string: ");
gets(s1);
printf("Digite substring:");
gets(s2);
// Varrendo string s1 até achar ‘\0’.
for (i=0; s1[i]!='\0'; i++) 
{ j= 0; k = i;
// Procura s2 em s1 a partir de i.
while (s2[j] == s1[k])
{ j++; k++; }
if (s2[j] == '\0')
soma++; } // fim for
printf("Ocorrencias: %d \n",soma); 
getchar(); // para parar a tela
}
Problema 5 – Substring
if (s2[j] == ‘\0’)
soma++;
Exemplo de Execução
j=0; k = i;
while (s2[j] == s1[k]) 
{j++; k++;}
142
"A biblioteca padrão do C possui diversas funções que 
manipulam strings. 
"Estas funções são úteis, pois não se pode, por exemplo, 
igualar duas strings: 
string1 = string2; /* NAO faca isto */
7.3 7.3 StringsStrings –– Algumas funções
" Igualar duas strings é um desastre. Quando você estudar o 
capítulo que trata de ponteiros você entenderá por que. As 
strings devem ser igualadas elemento a elemento.
" As funções apresentadas nestas seções estão no arquivo 
cabeçalho string.h.
143
1. Função strcpy() → Sintaxe
strcpy(destino,origem); 
Copia o conteúdo da string origem, na string destino
7.3 7.3 StringsStrings –– Algumas funções
Ex:
main(){
char str[80];
strcpy(str,"alo");
puts(str);
}
Neste exemplo a função strcpy vai 
copiar a string “alo” na variável 
str[ ]. 
A seguir o puts vai imprimir a string 
que está armazenada em str[ ]. 
144
2. Função strcat() → Sintaxe
strcat(string1,string2); 
Concatena a string2 no final da string1. Não verifica tamanho
7.3 7.3 StringsStrings –– Algumas funções
Ex:
main()
{
char um[20],dois[10];
strcpy(um,"bom");
strcpy(dois," dia");
strcat(um,dois);
printf("%s\n",um);
}
Neste exemplo a função 
strcpy vai copiar a string 
“bom” na variável um[ ], e a 
string “dia” na variável 
dois[ ]. 
A seguir a função strcat ()
vai concatenar as duas 
strings colocando-as na 
variável um[ ]. O printf vai 
então, imprimir a frase 
”bom dia”. 
145
3. Função strcmp() → Sintaxe:
strcmp(s1,s2);
Compara a string s2 com s1. Se elas forem iguais, devolve o valor 0.
7.3 7.3 StringsStrings –– Algumas funções
Ex:
main()
{
char s[80];
printf("Digite a senha:");
gets(s);
if (strcmp(s,"laranja"))
printf("senha inválida\n");
else
printf("senha ok!\n") ;
}
Neste exemplo o gets(s) vai 
armazenar a palavra digitada 
na variável s. A função
strcmp vai comparar a palavra 
digitada com a string 
“laranja”. Se elas forem 
diferentes, vai ser impresso a 
frase “senha invalida”. Se 
elas forem iguais vai ser 
impresso a frase ”senha ok! ”. 
146
4. Função strlen( ) → Sintaxe:
strlen (string);
A função strlen() retorna o comprimento da string fornecida. O 
terminador nulo “\0” não é contado. Isto quer dizer que, de fato, o 
comprimento do vetor da string deve ser um a mais que o inteiro 
retornado por strlen().
7.3 7.3 StringsStrings –– Algumas funções
Ex:#include#include#include#include <<<<stdiostdiostdiostdio.h>.h>.h>.h>
#include <string.h>#include <string.h>#include <string.h>#include <string.h>
int main ()
{int size; char str[100];
printf ("Entre com uma string: ");
gets (str);
size=strlen (str);
printf ("\n\nA string que voce digitou tem tamanho %d",size);
return(0);}
147
7.3 7.3 StringsStrings –– MaisMais funções
Converte todos os caracteres de uma string para 
maiúsculas.
strupr
Converte todos os caracteres de uma string para 
minúsculas.
strlwr
Procura uma string dentro da outra.strstr
Procura um caractere numa string.strchr
Faz a mesma coisa que a função strcmp
(comparação de strings) mas ignorando se os 
caracteres estão em maiúsculas ou minúsculas.
stricmp
DescriçãoFunção
148
7.3 7.3 StringsStrings –– Matrizes de strings
Matrizes de strings
" Matrizes de strings são matrizes bidimensionais. Imagine uma 
string. Ela é um vetor. Se fizermos um vetor de strings
estaremos fazendo uma lista de vetores. Esta estrutura é uma 
matriz bidimensional de chars. 
" A forma geral de uma matriz de strings é: 
char nome_da_variável [num_de_strings][compr_das_strings];
Aí surge a pergunta: como acessar uma string individual?
Fácil. É só usar apenas o primeiro índice. 
Então, para acessar uma determinada string faça: 
nome_da_variável [índice]
149
Exemplo1: Usando uma Matriz de strings, faça um 
programa que leia 5 strings e as exiba na tela. 
7.3 7.3 StringsStrings –– Matrizes de strings
#include <stdio.h>
main ()
{ char Mat_strings [5][100];
int count;
for (count=0;count<5;count++)
{
printf ("\n\nDigite uma string: ");
gets (Mat_strings[count]);
}
printf ("\n\n\n As strings que voce digitou foram:\n\n");
for (count=0;count<5;count++) 
printf("%s\n",Mat_strings[count]);
getchar();
}
150
7.3 7.3 StringsStrings –– Matrizes de strings
Exemplo 2: Refazer o Exemplo 1 usando o comando 
scanf para ler a Matriz de strings, para tanto você
precisa ler a matriz elemento a elemento, isto é a 
matriz será lida como caractere.
Solução
151
7.3 7.3 StringsStrings –– Matrizes de strings - Exemplo 2:
#include <stdio.h> 
#include <conio.h> // biblioteca para usar o comando getche
main ()
{
char strings [3][100];
char pare;
int j, count;
for (count=0;count<3;count++)
{
printf ("\nDigite uma string com enter no final\n ");
j=0;
strings[count][j]=getche(); //lê caractere a caractere
while ((j < 99 )&&(int(strings[count][j]) != 10))
{ j++;
strings[count][j]=getche();
}
strings[count][j] ='\0'; 
}
printf ("\n\n\nAs strings que voce digitou foram:\n\n");
for (count=0;count<3;count++)
printf ("%s\n",strings[count]);
getchar();
}
Utilizando o getche para ler 
152
#include <stdio.h> 
main ()
{ char strings [3][100];
char pare;
int j, count;
for (count=0;count<3;count++)
{
printf ("\n\nDigite uma string com enter no final \n ");
j=0;
scanf("%c",&strings[count][j]);
while ((j < 99 )&&(int(strings[count][j]) != 10))
{ j++;
scanf("%c",&strings[count][j]);
}
strings[count][j] = '\0'; 
}
printf ("\n\n\nAs strings que voce digitou foram:\n\n");
for (count=0;count<3;count++)
printf ("%s\n",strings[count]);
getchar();
}
Utilizando scanf para ler
7.3 7.3 StringsStrings –– Matrizes de strings - Exemplo 2:
153
Uma editora deve produzir vários livros e por esta razão ela 
deseja fazer um relatório contendo: Titulo do Livro a ser 
editado, numero de páginas, previsão de quantos livros 
serão vendidos, e o preço de venda de cada exemplar
O preço de venda é calculado com base no custo total de 
produção acrescido de 20%. O custo total de produção é 
dado pela formula abaixo: 
custo_produção = custo_fixo + ( previsão_vendas* 
no._paginas* custo_pagina)
preço_venda = (custo_produção/previsão_vendas) * 1.20
Fazer um Programa em C que leia a quantidade de títulos a 
serem produzidos e os dados relativos a cada título e 
imprima o relatório desejado.
7.3 7.3 StringsStrings –– Matrizes de strings - Exemplo 3Exemplo 3
154
#include <stdlib.h>
#include <stdio.h>
main()
{
int i, j, k,ntitulo;
char titulo[100][150];
int vendas_previ[150],npage[150];
float Preco_Venda[150], 
custo_prod[150],c_fixo[150];
float c_page[150];
printf(" Digite o numero de titulos: ");
scanf("%d", &ntitulo);
printf("\n\n");
//Ler os dados de cada livro
for(i=0; i<ntitulo; i++)
{ fflush(stdin); 
printf("Digite o titulo do %d livro:",i+1);
gets(titulo[i]);
printf("Digite o numero de paginas deste
livro: ");
scanf("%d", &npage[i]);
printf("Digite o custo fixo: ");
scanf("%f",&c_fixo[i]);
printf(“Qual a previsao

Outros materiais