Você está na página 1de 78

7.

Dados Estruturados
Vetores , Matrizes e Strings
Unesp – Campus de Guaratinguetá

Curso: Programação de Computadores


Prof. Aníbal Tavares
Profa. Cassilda Ribeiro

7.1 Dados Estruturados: Array

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.
2
7.1 Array - Problema

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 Array - Problema

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 4
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

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

1 2 3 4 100

Lista[0] Lista[99]
Lista[3]

6
7.1 Array - Definição

" 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

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
8
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 9

7.1 Dados Estruturados: Declaração de Vetores


" 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 ]; val[0]


val[1] Os índices
variam de
Cria um vetor de nome val, de val[2] 0 até 4
tamanho 5 e cujos elementos são val[3]
do tipo int. val[4] 10
7.1 Dados Estruturados: Declaração de Vetores

! 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)
11

7.1 Dados Estruturados: Declaração de Vetores


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];
12
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.
Exemplo 5:
int val[5] = {3, 2, 6, 4, 5}; 3 2 6 4 5
aqui foi declarado um vetor de inteiros ! ! ! ! !
com 5 elementos e atribuído a ele os val[0] val[1]val[2] val[3] val[4]
valores entre chaves

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


diretamente sobre a variável.
Exemplo 6: val[1] = val[1] + 1;
3 3 6 7 5
val[3] = val[1]+ val[3];
! ! ! ! !
val[0] val[1] val[2] val[3] val[4]13

7.1 Dados Estruturados: Declaraçã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.

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};
14
7.1 Dados Estruturados: Vetor - 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.
Programa 1 – Usando vetores
main() // incluir <stdio.h> e <stdlib.h> V [ i ] = i + 1;
{ int i;
int v[10];
// Colocando valores em v. 1 2 ••• 9 10
for(i=0; i < 10; i++)
v[i] = i + 1;
v[0] v[1] ••• v[8] v[9]
// Mostra os elementos de v -> v[i].
for(i=0; i < 10; i++)
printf(“ %d ", v[i]); puts(“”); printf(“ %d ”,v[i]);
// Mostra os indices i de v[i].
for(i=0; i < 10; i++)
printf(“ v[%d] ", i+1); printf(“ v[%d] ”,i+1);
15
} // fim programa

7.1 Dados Estruturados: Vetor - Problemas


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.
#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");
16
}
7.1 Dados Estruturados: Vetor - Problemas
Programa 2 – Exemplo de Execução

17

7.1 Dados Estruturados: Vetor - Problemas


Programa 3: Criar um programa que armazene em um vetor os
10 primeiros termos da seqüência de Fibonacci. Imprimir o vetor.
Programa 3 – Fibonacci
F(n)=F(n-1)+F(n-2)
main() // incluir <stdio.h> e <stdlib.h>
E { int i;
onde: n=0,1,2, 3,... int v[10]; v[1] = v[0] = 1; I
// Colocando valores em v.
e F(0) = F(1) = 1 I for(i=2; i < 10; i++)
v[i] = v[i-1] + v[i-2];
E
// 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); 18
Espiral de Fibonacci } // fim programa
7.1 Dados Estruturados: Vetor - 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.

Etapas de Resolução //Programa 4 – Notas Maiores


main() // incluir <stdio.h> e <stdlib.h>
1. Ler e armazenar notas. {int i; float v[5], media = 0.0;
// Colocar valores em v.
2. Calcular a média. for(i=0; i < 5; i++) {
3. Exibir notas > média. 1 printf(“ Insira Nota %d: ”,i+1);
scanf(“%f”,&v[i]); }
for(i=0; i < 5; i++) // Cálculo média.
O programa ao lado pode 2 media=media+v[i];
media=media/5;
ser melhorado com o uso printf(“Media = %f \n”, media);
dos comandos const ou for(i=0; i < 5; i++) // Ver v[i]>media.
if (v[i] > media)
ainda define. 3 printf(“ v[%d] = %f \n", i+1,v[i]);19
} // fim programa

7.1 Dados Estruturados: Vetor - Problemas

Programa 4 – Exemplo de Execução

20
7.1 Vetor: Definição de Constantes

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

" 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. 21

7.1 Vetor: Definiçã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 #includes ou após o main().

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


22
7.1 Vetor - Constantes - Uso do comando #define
//Problema 3 – Notas Maiores " Quando o define é
#include <stdio.h> utilizado,o compilador
#define n 5 //sem ponto e virgula substitui todas as
main() ocorrências do
{ símbolo pelo valor
int i; definido.
float v[n], media = 0.0; " Às constantes definidas
// Colocar valores em v. com o símbolo #define
for(i=0; i < n; i++) { chamam-se constantes
printf(“ Insira Nota %d: ”,i+1);
scanf(“%f”,&v[i]); }
simbólicas.
for(i=0; i < n; i++)// Cálculo média. Com a declaração:
media=media + v[i]; #define n 5
media=media/n; Em todo lugar onde
for(i=0; i < n; i++) // Ver v[i]>media.
if (v[i] > media) aparecer a variável n, ela
printf(“ v[%d] = %f \n", i+1,v[i]); terá o valor constante
} // fim programa
igual a 5 23

7.1 Vetor- Constantes - Uso do comando const


O qualificador const //Problema 3 – Notas Maiores
//usando const
permite ao programador #include <stdio.h>
informar que o valor de uma main()
{
variável particular não deve const int n = 5;
ser modificado. int i;
Ou seja, a constante obtida float v[n], media = 0.0;
com const existe fisicamente // Colocar valores em v.
for(i=0; i < n; i++) {
em uma dada posição de printf(“ Insira Nota %d: ”,i+1);
memória. scanf(“%f”,&v[i]); }
for(i=0; i < n; i++)// Cálculo média.
media=media+v[i];
Exemplo de declaração: media=media/n;
const int n=5; 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 24
7.1 Vetor – Constantes - Problemas
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.

#include <stdio.h> /* Mostrar valores Mensais e calcular total */


#include <stdio.h> puts(" Mes Valor ");
main() for (i=1, total=0.0 ; i<=mes ; i++)
{ const int mes = 12; { // inicio for
float sal[mes+1]; /* 12 meses */ printf(" %3d %9.2f\n",i,sal[i]);
float total; total+=sal[i];
int i; } //fim for
for (i=1; i<= mes ; i++) printf("Total Anual: %9.2f\n",total);
{ //inicio for system(“pause”);
printf("Introd. o salário do mês %d:",i); }
scanf("%f",&sal[i]);
} //fim for OBS: Neste exemplo, desconsiderou-
25
se a posição zero do vetor

7.1 Vetor – 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].
26
7.1 Vetor – Relembrando...

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.

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

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.
Mês kWh Mês kWh Mês kWh
1 824 5 750 9 900
2 1152 6 700 10 1032
3 1236 7 728 11 1246
4 1313 8 800 12 1304 28
7.1 Vetor – Problemas: Problema 5

Idéia do Programa Posição Elemento


Mês kWh
1) Criar um vetor v de 12
1 v[0] 824
elementos e associar o
consumo em KWh do 2 v[1] 1152
mês (i) com a posição 3 v[2] 1236
(i-1). Ou seja:
••• ••• •••
v[ i -1 ] ↔ consumo
12 v[11] 1304
em kWh no mês i.
Associar posição i
com o (i+1) mês
29

7.1 Vetor – Problemas: Problema 5


Idéia do programa
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.

824 1152 1236 ••• 1304 maior = v[0] = 824


v[0] v[1] v[2] ••• v[11] 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. 30
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.

31

7.1 Vetor - Problemas

Problema 5 – Consumo Energia Problema 5 – Continuação


#include <stdio.h> // Laço encontra índice e maior valor.
main() for(i=1; i < n; i++)
{ if (v[i] > maior)
const int n = 12; { maior = v[i]; imaior = i; }
int i, imenor, imaior; // Laço encontra índice e menor valor.
float v[n], media, maior, menor; for(i=1; i < n; i++)
media = 0.0; if (v[i] < menor)
// Leitura dos valores de energia. { menor = v[i]; imenor = i; }
for(i=0; i < n; i++) { // Mostrando valores encontrados.
printf(“ Insira kwh %d: ”,i+1); printf(“ Maior Valor = %f no mes %d
scanf(“%f”,&v[i]); } \n",maior, imaior+1);
for(i=0; i < n; i++) // Cálculo média. printf(“ Menor Valor = %f no mes %d
media=media+v[i]; \n", v[imenor], imenor+1);
media=media/n; printf(“ Valor medio = %f \n”,media);
// Preparando para encontrar o maior e } // fim programa
// e o menor valor.
maior = menor = v[0];
imaior = imenor = 0; 32
7.1 Vetor - Problemas Problema 5 – Exemplo de Execução

33

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: [][][][][][][][][]
34
7.1 Vetor – Problemas: Problema 6
Idéia do programa
Posição Elemento
Criar um vetor v de 6 posições
que vai armazenar o no. de Face # Sorteio
vezes que uma face i é 1 v[0]
sorteada. 2 v[1]
3 v[2]
Então: v[0] vai guardar o no. de
vezes que a face 1 foi sorteada. 4 v[3]
v[1] vai guardar o no. de vezes 5 v[4]
que a face 2 foi sorteada e 6 v[5]
assim por diante.
Então: v[ i -1 ] ↔ no.de vezes Associa a posição i com a face
que a face i foi sorteada. (i+1). 35

7.1 Vetor – Problemas Problema 6


Idéia do programa
1 2 3 ••• 60
60 lançamentos
2 4 3 ••• 6

+1 +1 +1 +1

Vetor do número de
0 0 0 0 0 0
ocorrências de uma
fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] face para 60
lançamentos.

36
7.1 Vetor – Problemas Problema 6

Gerar uma seqüência de Idéia do programa


números pseudo- aleatória,
ou seja, uma seqüência S que
Gerador linear congruencial
utilize uma fórmula para
obter seus termos Sn dentro Sn+1 = (Sn *a + b) mod m
de um intervalo [a, b], os
onde: é uma boa estratégia usar
mesmos não se repetem para
m, a e b números primos.
um valor suficientemente
grande de n.

S0 é a semente

Sn+1 será o número Uma boa escolha para m, a e b


aleatório gerado.
Sn+1 = (Sn* 32749 + 3) mod m
37

7.1 Vetor – Problemas Problema 6

srand(time(0)) Fornece semente S0


Como gerar s = rand( ) Fornece Sn+1
valores
aleatórios em C? Os números gerados por rand( ) estão
no intervalo [0, RAND_MAX], onde:
RAND_MAX = 327679719.

Então para gerar Para gerar números inteiros no


valores aleatórios intervalo [a, b-1] usa-se o operador
% (resto inteiro da divisão):
entre [0 e 5], tem-se
s = (rand() % b) + a.
38
7.1 Vetor – Problemas Problema 6
O operador % funciona de Ou seja, operações com
acordo com o exemplo abaixo: % funcionam como se
tivéssemos um relógio: 0
0 % 6 = 0 6 % 6 = 0 5 1
1 % 6 = 1 7 % 6 = 1 0
2 % 6 = 2 8 % 6 = 2 5 1 4 2
3
3 % 6 = 3 9 % 6 = 3
4 % 6 = 4 10 % 6 = 4 4 2 13
3 0 7
5 % 6 = 5 11 % 6 = 5 5 1

Por esse motivo, as operações com o


operador % são chamadas de aritmética 4 2
modular ou ainda aritmética do relógio. 3
39

7.1 Vetor – Problemas Problema 6

Problema 6 – 60 lançamentos Problema 6 - Continuação


#include <stdio.h> // Laço para imprimir o histograma
#include <time.h> //a partir dos valores armazenados
#include <stdlib.h> //no vetor fr.
const int lanc = 60; printf(“ \n\n“);
main() for(i=0; i < 6; i++)
{ {
int fr[6] = {0, 0, 0, 0, 0, 0}; printf(“\bFace %2d-%2d:”,i+1,fr[i]);
int i, j, face; // Impressão fr[i] vezes do
// Inicializa gerador aleatório. //caractere [] para formar a
srand(time(0)); //freqüência de ocorrência de uma
// Laço gera 60 valores em [0,5]. //dada face.
for(i=0; i < lanc; i++) for (j=0; j < fr[i]; j++)
{ printf(“[]”);
face = rand( ) % 6; // Criando uma nova linha.
fr[face]++; printf(“ \n “);
} }
} // fim programa 40
7.1 Vetor - Problemas
Problema 6 – Exemplo de Execução

41

7.1 Vetor - Problemas


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 Conceito Por fim, deverá


9 ≤ Nota ≤ 10 A ser fornecido
7 ≤ Nota < 9 B o percentual
5 ≤ Nota < 7 C de notas da
3 ≤ Nota < 5 D turma para
0 ≤ Nota < 3 E cada conceito.
42
7.1 Vetor - Problemas
Idéia do programa
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.

10.0 8.5 5.5 ••• 0.0


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

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

7.1 Vetor - Problemas


Idéia do programa

9 7 5 3 0
≤ vn[i] ≤ ≤ vn[i] < ≤ vn[i] < ≤ vn[i] < ≤ vn[i] <
10 9 7 5 3

A B C D E

+1 +1 +1 +1 +1

0 0 0 0 0

vc[0] vc[1] vc[2] vc[3] vc[4]

44
7.1 Vetor – Problemas: Problema 7
Problema 7 – Conceito x Notas Problema 7 – Continuação
#include <stdio.h> for(i=0;
for i < num;
num i++)
main()
main {
{ if (vn[i] >= 9.0) vc[0]++;
const int m = 100; else if (vn[i] >= 7.0) vc[1]++;
int i, num, vc[5] = {0,0,0,0,0}; else if (vn[i] >= 5.0) vc[2]++;
float tmp, vn[m];
// Leitura do número de alunos. else if (vn[i] >= 3.0) vc[3]++;
printf(“Entre com no. alunos: “); else vc[4]++;
scanf(“%d”, &num); }
// Leitura dos valores das notas. // Mostrar percentual cada conceito.
for(i=0;
for i < num;
num i++) {
printf(“ Insira nota %d: ”,i+1); for(i=0;
for i<5 5; i++)
scanf(“%f”,&vn[i]); } { // Mostrando percentuais.
//construir vetor de conceitos tmp = (float
float(vc[i])*100)/num;
float
//de acordo com a Tabela. printf(“Conceito%d=%f \n", i, tmp);
}
} // fim programa 45

7.1 Vetor - Problemas


Problema 7 – Exemplo de Execução

46
7.1 Vetor - Problemas

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.

Conceito 1 – 20.00%: [][] Número de


Conceito 2 – 20.00%: [][] ocorrências de
Conceito 3 – 20.00%: [][] notas dentro de
cada conceito.
Conceito 4 – 30.00%: [][][]
Conceito 5 – 10.00%: []
47

7.1 Vetor - Problemas

Problema 8 – Histograma Problema 8 – continuação


#include <stdio.h> for(i=0; i < num; i++) {
main() if (vn[i] >= 9.0) vc[0]++;
{ else if (vn[i] >= 7.0) vc[1]++;
const int m = 100;
int i, j, num, vc[5] = {0,0,0,0,0}; else if (vn[i] >= 5.0) vc[2]++;
float tmp, vn[m]; else if (vn[i] >= 3.0) vc[3]++;
// Leitura do número de alunos. else vc[4]++; }
printf(“Entre com no. alunos: ”);
scanf(“ %d ”, &num); // Mostrar percentual cada conceito.
// Leitura dos valores das notas. for(i=0; i < 5; i++) {
for(i=0; i < num; i++) { // Mostrando percentuais.
printf(“ Insira nota %d: ”,i+1); tmp = (float(vc[i])*100)/num;
scanf(“%f”,&vn[i]); } printf(“\n Conceito %d=%f",i+1,tmp);
// Laço para o vetor de concei- // Impressão do Histograma !
// tos com o número de notas em for(j=0; j < vc[i] ;j++) printf(“[]”);}
// cada faixa de acordo com as } // fim programa
// estabelecidas na Tabela. 48
7.1 Vetor - Problemas
Problema 5 – Exemplo de Execução

49

7.1 Vetor – Problemas – Ordenação de Vetores


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

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.

http://www.cs.oswego.edu/~mohammad/classes/csc241/samples/sort/Sort2-E.html
http://olli.informatik.uni-oldenburg.de/fpsort/Animation.html 50
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.
" 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.

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

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.

" 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
15>46? 15>46?
15 15 15 15 15 não 15
15>46? não
não troca troca troca 10
46 46 46 46 46
46>59?
59 59 10 10 46>10? 46
não troca 59 46>59?
59 > 62 não 59>62? troca 59
62 62 10 59 59
não troca troca não
76 10 62 troca 62 62
62>76? 62 46>59
10 não troca 76 59 > 10 76 76 não 76
76
76>10? 76>91? troca 62>76? troca
91 91 91 91 91 91
Troca não não 59>62
93 93 troca 93 93 troca 93 não 93
52
troca
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.

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

53

7.1 Vetor - Problemas

Problema 9 – Bubble Sort Problema 9 – Bubble Sort


#include <stdio.h> for(i=0; i < n-1; i++)
#include <time.h> for (j=0; j < n-i-1;j++)
const int n = 10; if (v[j] > v[j+1])
main() { tmp = v[j];
{ v[j] = v[j+1];
int i, j, tmp, v[n]; v[j+1] = tmp; }
// Geração aleatória dos elementos de // Mostrar vetor ordenado.
v entre [0,n-1] // printf(“\n v = ”);
srand(time(0));
for(i=0; i < n; i++) for(i=0; i < n; i++)
v[i] = rand()%n; printf(“ [%2d] ”,v[i]);
// Impressão de v antes de ordenar. } // fim programa
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. 54
7.1 Vetor - Problemas
Problema 9 – Exemplo de Execução

55

7.1 Vetor - Problemas


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:

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

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.
56
7.1 Vetor - Problemas
Problema 10 – Pesquisa Linear Problema 10 – Pesquisa Linear
#include <stdio.h> // Laços encadeados: Pesquisa Linear.
const int n = 14; ind = -1;
main() for(i=0; i < n; i++)
{ // Se a chave foi encontrada, então,
int i, chave, ind, v[n]; // armazenar o índice i de v[i].
// Digitando a chave de pesquisa. if (chave == v[i])
printf(“Entre com a chave: ”); {
scanf(“%d”, &chave); ind = i;
// Gerar o vetor ordenado v. break;
for(i=0; i < n; i++) }
v[i] = 2*i; // Mostrar resultado.
// Impressão dos valores de v. if(ind == -1)
for(i=0; i < n; i++) printf(“ Chave nao encontrada !\n”);
printf(“%3d ”,v[i]);
// Cabeçalho. else
printf(“\n”); printf(“Chave no indice: %d \n”,ind);
for(i=0; i < n; i++) } // fim programa
printf(“----”);
57
printf(“\n”);

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]


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

59

7.1 Vetor – Problemas Problema 11 – Pesquisa Binária


Idéia da Pesquisa Binária (supõe vetor ordenado !)
a=0;
EX: Seja chave = 10 b=4
k = (a+b)/2 = 2
Se (chave>v[k])
v[0] então o novo intervalo é a=k+1=3 e b=4;
a=0 2 senão o novo intervalo é b=k-1=1 e a=0
v[1] 4 Se (chave= v[k])
k=2 v[2] 8 então encontrou o valor. A chave está na
posição k
v[3] 10 a=3
v[4] Novo k = (a+b)/2 = 3.
b=4 12 b=4
intervalo chave = v[3], então a
chave está na posição 3
do vetor
60
7.1 Vetor – Problemas: Problema 11 – Pesquisa Binária
Quadro resumo dos casos para Pesquisa Binária

Caso Condição Ações Imagem

b = k – 1;
1 chave < v[k]
k = (a+b)/2;

2 chave = v[k] Retornar k

a = k + 1;
3 chave > v[k]
k = (a+b)/2;

4 b<a Retornar -1
61

7.1 Vetor – Problemas Problema 11 – Pesquisa Binária

Problema 11 – Pesquisa Binária Problema 11 – Pesquisa Binária


#include <stdio.h> // Laços encadeados: Pesquisa Binária.
const int n = 14; while(a <= b) {// Enquanto!= Caso4
main() k = (a+b)/2;
{ for (j=0;j < n;j++) // Imprime vetor
int i, j, a, b, k, chave, ind, v[n]; if (j < a || j > b) printf(“ ”);
// Digitando da chave de pesquisa. else if (j == k) printf(“%3d*”,v[j]);
printf(“Entre com a chave: ”); else printf(“%3d ”,v[j]);
scanf(“%d”, &chave); printf(“\n”);
// Preenchendo o vetor ordenado v. // Tratando os 3 casos existentes.
for(i=0; i < n; i++) v[i] = 2*i; if (chave == v[k]) // Caso 2.
for(i=0; i < n; i++) //Imprime vetor { ind = k; break; }
printf(“%3d ”,v[i]); else if (chave < v[k]) // Caso 1.
printf(“\n”); // Imprime cabeçalho b = k – 1;
for(i=0; i < n; i++) printf(“-----”); else // Caso 3.
printf(“\n”); a = k + 1; } // Fim do while.
// Inicializando limites da Pesquisa if (ind == -1) printf(“Sem Chave\n”);
// Binária e valor do inicial do índice. else printf(“Chave - indice:%d\n”,ind);
a = 0; b = n-1; ind = -1; } // fim programa
62
7.1 Vetor – Problemas Problema 11 – Pesquisa Binária

63

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()
continua ...
{
int PC[150], CN[220], matrisimult[150];
int NCN,NPC,i, j, k;
64
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;
65
}

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");
}
66
7.1 Vetor – Problemas
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.

67

7.1 Vetor – Problemas


#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]; 68
7.1 Vetor – Problemas

//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");
}

69

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 original v e n i v i d i v i c i

Texto cifrado W F O J W J E J W J D J
70
7.1 Vetor - Problemas
Problema 14– Tabela ASCII
#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));
}
E se imprimir usando
(i+1) % 256? e (i+2)%256?
O que ocorre ? 71

7.1 Vetor - Problemas

(i+1) % 256

Deslocamento
do alfabeto

(i+2) % 256

72
7.1 Vetor - Problemas
// Inicialização. •••
char tmp, texto[1000];
texto[0] texto[1] ••• texto[100]
// Ler até encontrar ‘.’ .
i = 0;
while (i < 1000) { Mensagem Secreta.
tmp = getche();
if (tmp == '.')
break;
else M e ••• a
{
texto[i] = tmp; i++; texto[0] texto[1] ••• texto[16]
}
// Guardar tamanho da msg.
n = i; n=17 73

7.1 Vetor - Problemas


// Inicialização Corresponde ao caractere
backspace na Tabela ASCII.
char tmp, texto[1000];
// Ler até ‘.’. Não ler backspace.
i = 0;
←ensagem Secreta.
Mr←
while (i < 1000) {
tmp = getche();
if (tmp == '.')
Mensagem Secreta
break;
if (int(tmp) != 8) {
texto[i] = tmp; i++; } M e ••• a
else i--; }
texto[0] texto[1] ••• texto[16]

// Guardar tamanho da msg.


n = i; 74
7.1 Vetor - Problemas
Problema 14 – Criptografia
Problema14– Criptografia
#include <stdio.h>
#include <conio.h> n = i; // Tamanho do vetor em n.
main() // Codificando a mensagem.
{ int i, n; for(i=0; i < n; i++)
char tmp, texto[1000]; texto[i] = (texto[i]+1)%256;
// Armazenando a mensagem. // Mostrando a mensagem
printf(“Entre com a mensagem: ”); //codificada.
i=0; printf(“\n Mensagem Codificada:\n”);
while (i < 1000) { for (i=0; i < n; i++)
tmp = getche(); {
// Termina o laço. printf(“%c”,texto[i]);
if (tmp == ‘.’) }
break; printf(“\n”);
// Se não for backspace, guarde. } // fim programa
if (int(tmp) != 8) {
texto[i] = tmp;
i = i + 1; } 75
else i--; //Backspace: elimina ant.}

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
76
7.1 Vetor - Problemas
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.

77

7.1 Vetor - Problemas


// Inicialização.
char texto[100], tmp; " Lê o caractere do teclado,
mas o que foi digitado não
char senha[100] = “Secreta”; aparece na tela.
// Ler até encontrar o enter (‘↵’’).
i = 0;
while( i < 100 ) {
tmp = getch();
// Se digitou ↵, pare leitura.
if (int(tmp) == 13)
break;
else Verifica se foi digitado o enter.
{texto[i]=tmp;
printf(“*”); i++;} É preciso ter cuidado com
} // Fim while. backspace !
// Guardar tamanho da msg.
78
n = i;
7.1 Vetor - Problemas
// Ler até encontrar ‘↵’’.
Tratamento do Backspace
i = 0;
while( i < 100 ) {
tmp = getch();
Palavra Digitada
// Se digitou ↵, pare leitura.
if (int(tmp) == 13)
break;
else S x ← e c r e t
if (int(tmp) != 8) // ≠←.
≠←
{printf(“*”); texto[i]=tmp;
i++; }
else i--; // =← ←. } // Fim for. texto S e c r e t
// Guardar tamanho da msg.
n = i; 79

7.1 Vetor - Problemas


Caso 1:
verif = 1; // Supõe que senha = texto.
// Tamanho senha igual tamanho texto? texto S e c r e t a
if (ns == nt) //nt= tamanho digitado
{ // Ler até achar letra ≠ ou fim palavras. senha S e c r e t a
for (i=0; i < nt; i++)
if (texto[i] != senha[i])
i 0 1 2 3 4 5 6
{
verif = 0;
break; Caso 2:
} texto S e g r e d o
}
else // Tamanhos ≠.
senha S e c r e t a
verif = 0;
80
texto[2] != senha[2]
7.1 Vetor - Problemas
Problema 15 – Senha
#include <stdio.h>
Problema 15 – Senha
#include <conio.h> nt = i; // Tamanho digitada em nt.
main() verif = 1; // Supõe texto == senha.
{ int i, verif, nt, ns = 7; // Ver se texto e senha tem tam?==.
char tmp, texto[100]; if (nt == ns)
char senha[100]="secreta";
// Armazenando a senha digitada. {
printf("Digite a senha "); for (i=0; i < nt; i++)
i=0; if (texto[i] != senha[i])
while (i < 100) { verif = 0; break; }
{ tmp = getch(); }
// Termina o laço se for ?. else
if (int(tmp) == 13) verif = 0;
break; // Mostrando mensagem.
else if (verif)
if (int(tmp) != 8) // ??.
{ printf("*");
printf("\nSenha Correta ! \n");
texto[i] = tmp; else
i++; } printf("\nSenha incorreta ! \n");
else getchar();
{ putchar('*'); putchar(' '); } // fim programa
putchar(char(8)); i--; } //? 81
} //fim laço

7.1 Vetor - Problemas

82
7.2 Dados Estruturados: Matrizes

7.2 Matrizes

83

7.2 Dados Estruturados: Matrizes

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;

84
7.2 Dados Estruturados: Matrizes

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 Mat[2][3]
4
...
m-1
85

7.2 Dados Estruturados: Matrizes

Matrizes ou Array bidimesionais são estruturas


de dados que organizam informações; de mesmo
tipo e mesmo nome; em tabelas.

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


correspondem a linhas e colunas.

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. 86
7.2 Dados Estruturados: Matrizes

Declaração e Atribuição de Matrizes


Declaração int a[ 3 ][ 2 ];
" 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]

87

7.2 Dados Estruturados: Matrizes

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

Coluna 0 Coluna 1

Linha 0 mat[0][0] mat[0][1]


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

88
7.2 Dados Estruturados: Matrizes - Atribuição Inicial
" 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: a[0][0]=1 a[0][1]]=1
a[1][0]=2 a[1][1]=2
a[2][0]=3 a[2][1]=3

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

7.2 Dados Estruturados: Matrizes - Atribuição Inicial


A atribuição inicial também pode ser feita da seguinte maneira
Ex: int a[ 3 ][ 2 ] = { {1, 1}, {2, 2}, {3, 3} };
Vetor de tamanho 2x1
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.

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 90
7.2 Dados Estruturados: Matrizes

Acesso e Modificação de valores de uma Matriz

Matriz Inicial Operações Matriz Final

1 1 a[0][1]=a[0][1]+2 1 3
2 2 a[1][0]=a[0][1]+1 4 2
3 3 12 3
a[2][0]=a[2][0]*a[1][0]

91

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> a [ i ] [ j ] = i + j + 1;
main()
{ int i, j; 1 2 3
int a[3][3];
a[0][0] a[0][1] a[0][2]
// Colocando valores em a.
for (i=0; i < 3; i++) 2 3 4
for (j=0; j < 3; j++)
a[i][j] = i + j + 1; a[1][0] a[1][1] a[1][2]
// Mostra elementos de a-> a[i][j].
for (i=0; i < 3; i++) 3 4 5
{ for (j=0; j < 3; j++) a[2][0] a[2][1] a[2][2]
printf(“ %d ", a[i][j]);
puts(“”);
}
92
} // fim programa
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 " O Triângulo de Pascal pode ser
calculado usando uma matriz tal
0 1 que cada elemento é dado por :
a[i][j] = a[ i-1 ][ j-1 ]+a[ i-1 ][ j ]
1 1 1
2 1 2 1 a[0][0]

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

4 1 4 6 4 1 0 1 0 0 a[1][1]
5 1 5 10 10 5 1 1 1 1 0
6 1 6 15 20 15 6 1 2 1 2 1 93

7.2 Matrizes - Problemas

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

Passo 1: 0 1 2 Passo 2: 0 1 2

Construir uma
0 0 0 0 Preencher
0 1 0 0
matriz nxn 1 0 0 0 a primeira 1 1 0 0
de zeros 2 0 0 0 coluna com 1 2 1 0 0

Passo 3: 0 1 2

Obter os demais
0 1 0 0
elementos utilizando: 1 1 1 0
a[i][j] = a[ i-1 ][ j-1 ]+a[ i-1 ][ j ] 2 1 2 1 94
7.2 Matrizes – Problemas : Problema 2 – Pascal
Problema 2 – Pascal
Problema 2 – Continuação
#include <stdio.h>
const int n = 10; // Mostrando os elementos de a.
main() for (i=0; i < n; i++)
{ {
int i, j, a[n][n];
// Inicializando os elementos de a. for (j=0; j < n; j++)
// Passos 1 e 2. printf(“ %4d ”,a[i][j]);
for (i=0; i < n; i++) printf(“\n”);
for (j=0; j < n; j++) }
if (j == 0) } // fim programa
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++) 95
a[i][j] = a[i-1][j-1]+a[i-1][j];

7.2 Matrizes - Problemas


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.

Idéia do Programa Matriz alunos x notas Vetor pesos

B1 B2 B3 B4 Vetor médias
P1 1
Aluno 1 7.0 3.5 4.0 8.5 P2 2 M1 5.8
••• ••••
•• * P3 1 = •••
Aluno m 2.0 5.5 7.0 9.5 P4 2 Mm 6.5
96
7.2 Matrizes - Problemas

Como multiplicar uma matriz por um vetor ?

a11 a12 ••• a1n • v11 = r11

a21 a22 ••• a2n v21 r21

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

am1 am2 ••• amn vn1 rm1

Vetor m x 1
Matriz m x n
Vetor n x 1 97

7.2 Matrizes - Problemas

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

ri1 = ai1 ai2 ••• ain • v11

v21

Primeiro laço •••

Segundo laço vn1


n
ri1 = ∑ aik vk1 i = 1, ..., m
k =1 98
7.2 Matrizes - Problemas
Problema 3 – Notas Problema 3 – Notas
#include <stdio.h> // Calculo da media e resultado em r.
// Supondo uma classe com 10 alunos. for (i=0; i < m; i++)
const int m = 10; {
main()
{ soma = 0.0;
int i, j, k; // Media do aluno i: armazenar a
float soma; // soma das k notas vezes k pesos.
float a[m][4], r[m], p[4] = {1,2,1,2}; for (k=0; k < 4; k++)
// Armazenando as notas.
soma = soma + a[i][k]*p[k];
for (i=0; i < m; i++)
{ // Calculo da media do aluno i.
printf(“Aluno %d: ”, i+1); r[i] = soma/6;
for (j=0; j < 4; j++) }
{ // Mostrando a media de cada aluno.
printf(“\n Nota %d: ”,j+1); printf(“ Aluno Media \n“);
scanf(“%f”, &a[i][j]); for (i=0; i < m; i++)
} printf(“ %4d %4.2f \n”,i+1,r[i]);
} } // fim programa
99

7.2 Matrizes - Problemas


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.
100
7.2 Matrizes – Problemas Resolvidos
Idéia do Programa
Milho Soja Feijão Arroz
Região 1 3.0 4.0 2.0 3.0
Uma matriz
Região 2 1.0 5.0 4.0 2.0
3x4 para
os dados Região 3 2.0 6.0 3.0 5.0

Milho Soja Feijão Arroz Total região


Região 1 3.0 4.0 2.0 3.0 12.0
Região 2 1.0 5.0 4.0 2.0 12.0
Região 3 2.0 6.0 3.0 5.0 16.0
Total cultura 6.0 15.0 9.0 10.0 101

7.2 Matrizes – Problemas Resolvidos


Problema 4 – Fazenda Problema 4 – Fazenda
#include <stdio.h> // Calculo do total para cada cultura.
const int m = 3; const int n = 4; for (j=0; j < n; j++)
main() {
{ int i, j, k;
float a[m][n], r[m], c[n]; c[j] = 0.0; // Valor inicial.
// Armazenando a produção em a. // Soma da regiões da cultura i.
for (i=0; i < m; i++) { for (k=0; k < m; k++)
printf(“Regiao %d: ”, i+1); c[j] = c[j] + a[k][j];
for (j=0; j < n; j++) {
printf(“Cultura %d: %4f\n”,j+1,c[j]);
printf(“\n Cultura %d: ”,j+1);
scanf(“%f”, &a[i][j]); } } }
// Calculo do total para cada região. } // fim programa
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];
102
printf(“Regiao %d: %4f\n”,i+1,r[i]); }
7.2 Matrizes – Problemas Resolvidos

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

Cobertura Vegetal Valor


Entre 80% e 100% 5
Entre 60% e 80% 4
Entre 40% e 60% 3
Entre 20% e 40% 2
Entre 0% e 20% 1 103

7.2 Matrizes – Problemas Resolvidos

Ou seja, associa-se uma imagem a uma matriz de valores:

5 5 5 5
5 5 4 5
5 4 3 3
4 4 2 1

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.
104
7.2 Matrizes – Problemas Resolvidos

Ano de 2007 Ano de 2006 Matriz de


variação da
cobertura
vegetal

5 5 5 5 5 5 5 5 0 0 0 0
5 5 4 4 5 5 4 5 0 0 0 -1
5 4 2 2 - 5 4 3 3 = 0 0 -1 -1
4 3 2 1 4 4 2 1 0 -1 0 0
No caso acima pode-se dizer que o
desmatamento entre 2006 e 2007 - 4 unidades
foi da ordem de 4 unidades. 105

7.2 Matrizes – Problemas Resolvidos


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:

5 5 5 5 5 5 5 5 0 0 0 0
5 5 4 4 5 5 4 5 0 0 0 -1
5 4 2 2 - 5 4 3 3 = 0 0 -1 -1
4 3 2 1 4 4 2 1 0 -1 0 0

Matriz A Matriz B
- 4 unidades
106
7.2 Matrizes – Problemas Resolvidos
Problema 5 – Desmatamento
Problema 5 – Desmatamento
#include <stdio.h>
const int m = 4; const int n = 4; // Totalizando n. unidades
main() //desmatadas.
{int i, j, soma, c[m][n]; soma = 0;
int a[m][n] = {{5,5,5,5}, {5,5,4,4}, for (i=0; i < m; i++)
{5,4,2,2}, {4,3,2,1}};
for (j=0; j < n; j++)
int b[m][n] = {{5,5,5,5}, {5,5,4,5},
{5,4,3,3}, {4,4,2,1}}; soma = soma + c[i][j];
// Contabilizando desmatamento em c. // Exibindo n. unidades desmatadas.
for (i=0; i < m; i++) printf(“Cobertura Veg. = %d\n”,soma);
for (j=0; j < n; j++) } // fim programa
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]);
107
printf(“\n”); }

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.

Jogada de A Espaço livre


x
o
Jogada de B
108
7.2 Matrizes – Problemas Resolvidos

Requisito (i): Movimentos alternados de A e B.

Requisito (iii): Identificar empate.

Variável contadora de jogadas válidas: cont.

0 2 3 if (cont%2 == 0)
x x o // Movimento de A
5 1 6 else
o o x // Movimento de B
4 8 7 if (cont == 9)
x x o // Empate !
109

7.2 Matrizes – Problemas Resolvidos


Requisito (iv): Representação das jogadas.
Requisito (ii): Se a jogada pode ser realizada.
Matriz de caracteres

0 Coordenadas: 0 1 Coluna 0 Coluna 1 Coluna 2

0
1 Coordenadas: 1 0
Linha 0 . x .
1
Caractere ‘.’
Linha 1 o . .
if (m[i][j] == ‘.’) Linha 2 . . .
Pode fazer jogada 110
7.2 Matrizes – Problemas Resolvidos

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’) 111

7.2 Matrizes – Problemas Resolvidos

Problema 6 – Jogo da Velha – Algoritmo Simples


// 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. 112
7.2 Matrizes – Problemas Resolvidos
Problema 6 – Jogo da Velha Problema 6 – Jogo da Velha
#include <stdio.h> // Verificando se o jogador A ganhou.
#include <stdlib.h> if ((m[1][1]==X && m[1][2]==X && m[1][3]==X) ||
main() (m[2][1]==X && m[2][2]==X && m[2][3]==X) ||
{char m[3][3]; (m[1][1]==X && m[2][1]==X && m[3][1]==X) ||
int i, j, cont =0; (m[1][2]==X && m[2][2]==X && m[3][2]==X) ||
const int TRUE = 1; (m[1][3]==X && m[2][3]==X && m[3][3]==X) ||
const char O = 'o', X = 'x'; (m[3][1]==X && m[2][2]==X && m[1][3]==X) ||
printf("Digite lin col \n"); (m[1][1]==X && m[2][2]==X && m[3][3]==X) )
// Inicializando a matriz m com ‘.’.
for (i=1; i <= 3; i++) {printf("Jogador A ganhou !!! \n"); break;}
for (j=1; j <=3; j++) // Verificando se o jogador B ganhou.
m[i][j] = '.'; if ((m[1][1]==O && m[1][2]==O && m[1][3]==O) ||
while (TRUE) // Laço infinito. (m[2][1]==O && m[2][2]==O && m[2][3]==O) ||
{ (m[3][1]==O && m[3][2]==O && m[3][3]==O) ||
// Mostrando a matriz m. (m[1][1]==O && m[2][1]==O && m[3][1]==O) ||
for (i=1; i <= 3; i++) (m[1][2]==O && m[2][2]==O && m[3][2]==O) ||
{ (m[1][3]==O && m[2][3]==O && m[3][3]==O) ||
for (j=1; j <= 3; j++) (m[1][1]==O && m[2][2]==O && m[3][3]==O) ||
printf(" %c ",m[i][j]); (m[1][3]==O && m[2][2]==O && m[3][1]==O) )
printf("\n"); {printf("Jogador B ganhou !!! \n\n"); break;} 113
}

7.2 Matrizes – Problemas Resolvidos


Problema 6 – Jogo da Velha (Cont.)
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.

114
7.2 Matrizes – Problemas Resolvidos
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 115

7.2 Matrizes – Problemas Resolvidos


Requisito (iv): Representação das jogadas.
Requisito (ii): Se a jogada pode ser realizada.
Matriz de caracteres

0 Coordenadas: 0 1 Coluna 0 Coluna 1 Coluna 2

0
1 Coordenadas: 1 0
Linha 0 . x x
1
Caractere ‘.’
Linha 1 . x x
if (m[i][j] == ‘.’) Linha 2 . x x
Pode fazer jogada 116
7.2 Matrizes – Problemas Resolvidos
Problema 7 – Yucky Choccy Problema 7 – Yucky Choccy
#include <stdio.h> // Capturando nova jogada.
main() if (cont%2 == 0) printf(“Jogada de A: ”);
{const int m = 4; else printf(“Jogada de B: ”);
char A[m][m]; scanf(“%d %d”,&lin,&col);
int i, j, lin, col, cont =0; // Casa livre ?
const char O = ‘o’, X = ‘x’; if (A[lin][col] == ‘.’ &&(lin == 0||col == 0) )
printf(“Digite linha e coluna \n”); {
// Inicializando a matriz m com ‘.’. // É a vez do jogador A.
for (i=0; i < m; i++) if (cont % 2 == 0)
for (j=0; j < m; j++) { // Verificando se A perdeu e B ganhou.
A[i][j] = ‘.’; if (lin == 0 && col == 0)
while (1) // Laço infinito. {printf(“ B ganhou ! \n”); break;} }
{ else
// Mostrando a matriz m. { // Verificando se B perdeu e A ganhou.
for (i=0; i < m; i++)
if (lin == 0 && col == 0)
{
for (j=0; j < m; j++) {printf(“ A ganhou ! \n”); break;} }
printf(“ %c ”, A[i][j]); // Contado o n. de jogadas.
printf(“\n”); cont++;
} // Modificar elementos da matriz A para117
‘x’.

7.2 Matrizes – Problemas Resolvidos


Problema 7 – Yucky Choccy (Cont.)
// 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.

118
7.2 Matrizes – Problemas Resolvidos
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.

Tabela 1 Tabela 2
Figura 1
Solo G QAV Nafta Insumo Valor
17.4 4.3 2.1 G 4.12
7.1 12.3 8.2 QAV 8.74
2.1 0.3 35.6 Nafta 3.78
119

7.2 Matrizes – Problemas Resolvidos

Passo 1:

1 1 2 2
1 2 3 2
1 3 3 3

Passo 2: Se área = 1:
1 1 2 2 17.4 4.3 2.1 * 4.12
1 2 3 2 8.74
1 3 3 3 6.1 12.3 8.2
3.78
2.1 0.3 35.6
Indíce da linha: 0 120
7.2 Matrizes – Problemas Resolvidos
Problema 8 – Petróleo Problema 8 – Petróleo
#include <stdio.h> // Mostrando a matriz C com os lucros.
const int m = 3; const int n = 4; printf(“Matriz de lucros \n”);
main() for (i=0; i < m; i++)
{ int i, j, k;
float s, C[m][n], v[m] = {4.12, 8.74, {
3.78}; for (j=0; j < n; j++)
int A[m][n] = {{1,1,2,2}, {1,2,3,2}, printf(“ [%7.2f] ”,C[i][j]);
{1,3,3,3}};
printf(“\n”);
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 } // fim programa
// 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; } 121

7.2 Matrizes – Problemas Resolvidos


Resultado da Execução

1 1 2 2
1 2 3 2
1 3 3 3

122
7.3 Dados Estruturados: Strings

7.3 Strings

123

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.
124
7.3 Strings - 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 125

7.3 Strings - Definições

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

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.
0 12
aluno
str: \0

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.
126
7.3 Strings - Definições

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
nome: P i n d a m o n h a n g a b a \0

" Os caracteres podem ser individualmente acessados por


indexação:

" Exemplo 3: nome[0] = ‘P’;


nome[10] = ‘n’ 127

7.3 Strings – Leitura e Impressão de Strings


" 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.
Exemplo 4 – Usando n Exemplo 5 – Usando ‘\0’
#include <stdio.h> #include <stdio.h>
const int n = 100; const int n = 100;
main() main()
{ {
int i; int i;
char s[n] = “Uma string tipica.”; char s[n] = “Uma string tipica.”;
// Varrendo cada componente do // Varrendo cada componente do
//vetor e imprimindo até que i < // vetor e imprimindo até
n. // que s[i] == ‘\0’.
for (i=0; i < 18; i++) for (i=0; s[i] != ‘\0’; i++)
printf(“%c”,s[i]); printf(“%c”,s[i]);
} } 128
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.
Exemplo 6 – Printf + %s Exemplo 7 – Puts
#include <stdio.h> #include <stdio.h>
const int n = 100; const int n = 100;
main() main()
{ {
int i; int i;
char s[n] = “Uma string tipica.”; char s[n] = “Uma string tipica.”;
// Usando a tag %s e printf. // Impressão usando puts.
printf(“%s”, s); puts(s);
} }

printf(“%s”,s); puts(s); 129

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.
Exemplo 8 – Scanf
#include <stdio.h>
const int n = 100;
main()
{
Só armazenou:
int i;
char s[n]; “a”
printf(“Entre com uma string:”);
scanf(“%s”,s); Palavra Digitada é:
printf(“\n String digitada: %s”,s); “a vida eh bela !”
}
OBS: Na leitura das variáveis string com a função scanf não se utiliza o &
130
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.

Exemplo 9 – gets
#include <stdio.h>
const int n = 100;
main()
{
int i;
char s[n]; Armazenou:
printf(“Entre com uma string:”);
gets(s); “a vida eh bela !”
printf(“\n String digitada: %s”,s);
} Palavra Digitada:
“a vida eh bela !”
131

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

Exemplo de Execução:

Digite uma string: A vida eh bela!


Tamanho da string: 15

A V i d a e h b e l a ! ‘\0’

Os espaços também são contabilizados !

Não contabilizar e indica final da contagem ! 132


7.3 Strings – Problemas
Problema 1 – Tamanho String
#include <stdio.h>
const int m = 100; Exemplo de Execução
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);
}
for (i=0; s[i] != ‘\0’; i++) 133

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:
Exemplo de Execução:
Digite uma string: A vida eh bela !
Digite um caractere: a
Número de ocorrências: 2

String A V i d a e h b e l a !

Caractere a

Número de ocorrências: 2 134


7.3 Strings – Problemas
Problema 2 – Ocorrências
Exemplo de Execução
#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++; for (i=0; s[i] != ‘\0’; i++)
// Impressão do número de carac if (s[i] == ch)
//teres ou seja o tamanho da string.
printf(“Ocorrencias: %d \n”,soma); 135
}

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:

Exemplo de Execução:
Digite uma string: A vida eh bela !
Digite um caractere: a
Número de ocorrências: 3

String A V i d a e h b e l a !

Caractere a

Número de ocorrências: 3 136


7.3 Strings – Problemas
Problema 3 – Ocorrências Mod Exemplo de Execução
#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’. if (toupper(s[i]) == toupper(ch))
for (i=0; s[i] != ‘\0’; i++)
if (toupper(s[i]) == toupper(ch))
soma++; Lembrando que o comando toupper(c)
// Impressão do número de caracteres
// ou seja o tamanho da string. transforma as letras minúsculas
printf(“Ocorrencias: %d \n”,soma); contidas em C, em maiúsculas
} 137

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 :

Exemplo de Execução:
Digite uma string: RED Code!
Digite ch1 e ch2: e *
Nova string: R*d Cod*

String R E D C o d e
Caractere ch1 e
Caractere ch2 *
String R * D C o d * 138
7.3 Strings – Problemas
Problema 4 – Substituição Exemplo de Execução
#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’. if (toupper(s[i]) == toupper(ch))
for (i=0; s[i] != ‘\0’; i++) s[i] = ch2;
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); 139
}

7.3 Strings – Problemas


Problema 5: Construir um programa que contabiliza todas as
ocorrências de uma sub-string s1 em uma string s2.

Exemplo de Execução:
Digite a string: tres pratos de trigo para tres tigres tristes
Digite a sub-string: tr
Frequencia:4

String s2 t r e s p r a t o s •••

Sub-string s1 t r

140
7.3 Strings – Problemas
Problema 5 – Substring Exemplo de Execução
#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;
{ j= 0; k = i;
// Procura s2 em s1 a partir de i. while (s2[j] == s1[k])
while (s2[j] == s1[k]) {j++; k++;}
{ j++; k++; }
if (s2[j] == '\0')
soma++; } // fim for if (s2[j] == ‘\0’)
printf("Ocorrencias: %d \n",soma);
getchar(); // para parar a tela soma++; 141
}

7.3 Strings – Algumas funções


"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 */

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

142
7.3 Strings – Algumas funções

1. Função strcpy() → Sintaxe


strcpy(destino,origem);

Copia o conteúdo da string origem, na string destino

Ex:
Neste exemplo a função strcpy vai
main(){ copiar a string “alo” na variável
char str[80]; str[ ].
strcpy(str,"alo"); A seguir o puts vai imprimir a string
puts(str); que está armazenada em str[ ].
}

143

7.3 Strings – Algumas funções

2. Função strcat() → Sintaxe


strcat(string1,string2);

Concatena a string2 no final da string1. Não verifica tamanho

Ex: Neste exemplo a função


main() strcpy vai copiar a string
“bom” na variável um[ ], e a
{ string “dia” na variável
char um[20],dois[10]; dois[ ].
strcpy(um,"bom"); A seguir a função strcat ()
strcpy(dois," dia"); vai concatenar as duas
strcat(um,dois); strings colocando-as na
variável um[ ]. O printf vai
printf("%s\n",um); então, imprimir a frase
} ”bom dia”. 144
7.3 Strings – Algumas funções
3. Função strcmp() → Sintaxe:
strcmp(s1,s2);
Compara a string s2 com s1. Se elas forem iguais, devolve o valor 0.

Ex:
Neste exemplo o gets(s) vai
main()
armazenar a palavra digitada
{ na variável s. A função
char s[80]; strcmp vai comparar a palavra
printf("Digite a senha:"); digitada com a string
“laranja”. Se elas forem
gets(s); diferentes, vai ser impresso a
if (strcmp(s,"laranja")) frase “senha invalida”. Se
printf("senha inválida\n"); elas forem iguais vai ser
impresso a frase ”senha ok! ”.
else
printf("senha ok!\n") ;
145
}

7.3 Strings – Algumas funções

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

Ex:#include <stdio.h>
stdio.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);
146
return(0);}
7.3 Strings – Mais funções
Função Descrição

stricmp 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.
strchr Procura um caractere numa string.

strstr Procura uma string dentro da outra.

strlwr Converte todos os caracteres de uma string para


minúsculas.
strupr Converte todos os caracteres de uma string para
maiúsculas.

147

7.3 Strings – 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]
148
7.3 Strings – Matrizes de strings
Exemplo1: Usando uma Matriz de strings, faça um
programa que leia 5 strings e as exiba na tela.
#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();
149
}

7.3 Strings – 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

150
7.3 Strings – Matrizes de strings - Exemplo 2:
#include <stdio.h>
#include <conio.h> // biblioteca para usar o comando getche
main ()
{
char strings [3][100]; Utilizando o getche para ler
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(); 151
}

7.3 Strings – Matrizes de strings - Exemplo 2:


#include <stdio.h>
main ()
{ char strings [3][100]; Utilizando scanf para ler
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();
} 152
7.3 Strings – Matrizes de strings - Exemplo 3
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. 153

7.3 Strings – Matrizes de strings - Exemplo 3


#include <stdlib.h> printf("Digite o numero de paginas deste
#include <stdio.h> livro: ");
main() scanf("%d", &npage[i]);
{ printf("Digite o custo fixo: ");
int i, j, k,ntitulo; scanf("%f",&c_fixo[i]);
char titulo[100][150]; printf(“Qual a previsao de vendas ");
int vendas_previ[150],npage[150]; scanf("%d", &vendas_previ[i]);
printf("Digite o custo de cada pagina: ");
float Preco_Venda[150], scanf("%f",&c_page[i]);
custo_prod[150],c_fixo[150]; printf("\n\n\n");
float c_page[150]; }
printf(" Digite o numero de titulos: "); for (i=0; i< ntitulo; i++)
scanf("%d", &ntitulo); {//Calcular custos de produção
printf("\n\n"); custo_prod[i]=c_fixo[i]+vendas_previ[i] *
//Ler os dados de cada livro npage[i] * c_page[i];
for(i=0; i<ntitulo; i++) //Calcular o preço de venda]
{ fflush(stdin); Preco_Venda[i]=(custo_prod[i]/
printf("Digite o titulo do %d livro:",i+1); vendas_previ[i])*1.2;
gets(titulo[i]); } 154
7.3 Strings – Matrizes de strings - Exemplo 3

// Imprimir relatório
printf("Título Previsao de Venda Preco Unitario No.pag\n");
for(i=0; i < ntitulo; i++)
{
printf("%s\t\t%d\t\t%.2f\t\t%d\n", titulo[i], vendas_previ[i],Preco_Venda[i],npage[i]);
}
system("pause");
}

155

7.3 Strings – Problemas

Fim
Strings
156

Você também pode gostar