Você está na página 1de 78

7.

Dados Estruturados
Vetores , Matrizes e Strings
Unesp Campus de Guaratinguet

Curso: Programao de Computadores


Prof. Anbal Tavares
Profa. Cassilda Ribeiro

7.1 Dados Estruturados: Array

Array - Definio

! 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 relao de 5


estudantes, imprimir o
numero de matricula de cada
estudante, cuja nota maior
do que a mdia da classe.

7.1 Array - Problema

1o. Algoritmo

Incio algoritmo
Leia(num1,nota1,num2,nota2,num3,nota3,num4,
nota4,num5,nota5)

media (nota1+nota2+nota3+nota4+nota5) / 5.0


Se nota1 > media ento escreva (num1)
Se nota2 > media ento escreva (num2)
Se nota3 > media ento escreva (num3)
Se nota4 > media ento escreva (num4)
Se nota5 > media ento escreva (num5)
Fim algoritmo 4
7.1 Array - Soluo 1

1. Uma varivel para cada


nmero de matricula 100 variveis

2. Uma varivel para cada nota + 100 variveis

3. 100 testes

7.1 Array - Definio

" Como estes dados tm uma relao entre si, podemos


declar-los com um nome NICO para todos os 100
elementos.
" Seja, por ex, um conjunto de 100 nmeros = Lista

1 2 3 4 100

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

6
7.1 Array - Definio

" O elemento do vetor tem todas as caractersticas


de uma varivel e pode aparecer em expresses e
atribuies.
Lista[2] Lista[3] + Lista[20]

" Para somar todos os elementos da Lista:


soma 0
para i 0 at 99 faa
soma soma + Lista[i]
7

7.1Array - Caractersticas

" As caractersticas bsicas de um Array so:

! uma estrutura homognea, isto , formada de


elementos do mesmo tipo
! todos os elementos da estrutura so igualmente
acessveis, isto , o tempo e o tipo de
procedimento para acessar qualquer um dos
elementos do Array so iguais
! cada elemento componente desta estrutura tem
um nome prprio segundo sua posio no
conjunto
8
Array - Soluo 2
2o. Algoritmo
Incio algoritmo
Para i 0 at 4 faa
Leia(num[i],nota[i])
soma 0,0
Para i 0 at 4 faa
soma soma + nota[i]
media soma/5
Para i 0 at 4 faa
Se (nota[i] > media)
ento escrever (num[i])
Fim algoritmo 9

7.1 Dados Estruturados: Declarao de Vetores


" Na linguagem C a declarao do array feita
juntamente com as demais variveis, e preciso dizer
qual o tipo de dado que ser armazenado no array.

" A declarao de um vetor com uma nica dimenso


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 so val[3]
do tipo int. val[4] 10
7.1 Dados Estruturados: Declarao de Vetores

! Observaes:
1) O acesso a cada elemento do vetor feito atravs de
uma indexao da varivel val.
2) Em C, a indexao de um vetor varia de zero a n-1,
onde n representa a dimenso 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 (invaso de memria)
11

7.1 Dados Estruturados: Declarao de Vetores


Exemplo 2: Para declarar um vetor com 50 nmeros 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 posio ndice i do vetor custo
Exemplo 3: Coloque o valor 34.6 na primeira posio do vetor
custo e o valor 56.7 na ltima posio:
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: Declarao de Vetores
" A Linguagem C permite que se faa a declarao do vetor ao
mesmo tempo que atribuio 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 atribudo a ele os val[0] val[1]val[2] val[3] val[4]
valores entre chaves

" O acesso e a modificao dos elementos do vetor feito


diretamente sobre a varivel.
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: Declarao de Vetores


OBS:Se um vetor for declarado com n elementos e forem
atribudos inicialmente ao vetor, apenas k valores (k<n), ento
os primeiros k elementos do vetor sero iniciados com os
respectivos valores e os restantes sero inicializados com ZERO.

Exemplo 7: Suponha a seguinte declarao:


int v3[10] = {10,33,45};
Neste caso os trs 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 declarao 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 so 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
numricos,a partir do teclado, armazene-os na varivel 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 Execuo

17

7.1 Dados Estruturados: Vetor - Problemas


Programa 3: Criar um programa que armazene em um vetor os
10 primeiros termos da seqncia 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 relao de 5 estudantes, imprimir a a nota
do estudante cuja nota maior que a mdia da classe.

Etapas de Resoluo //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 mdia. for(i=0; i < 5; i++) {
3. Exibir notas > mdia. 1 printf( Insira Nota %d: ,i+1);
scanf(%f,&v[i]); }
for(i=0; i < 5; i++) // Clculo mdia.
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 Execuo

20
7.1 Vetor: Definio de Constantes

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


uma pequena alterao nos dados no provoque grandes
transformaes no cdigo.
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
ocorrncias do nmero 5 pelo nmero 40.

" A soluo para esse problema a utilizao de constantes,


que uma vez alteradas, propagam o novo valor por todas as
ocorrncias.
" Uma constante nada mais que um nome correspondendo a
um valor fixo, isto que no pode ser alterado ao longo da
execuo do programa. 21

7.1 Vetor: Definio de Constantes


A definio de constantes pode ser feita de duas maneiras distintas:
" Atravs da palavra reservada const
const tipo simbolo =valor;
" Atravs da diretiva de pr processamento #define
#define simbolo valor

OBS: As constantes declaradas com o #define devem ser feitas


imediatamente aps as linhas dos #includes.
As constantes declaradas com o const podem ser feitas aps
os #includes ou aps o main().

Pode-se ento, 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() ocorrncias do
{ smbolo pelo valor
int i; definido.
float v[n], media = 0.0; " s constantes definidas
// Colocar valores em v. com o smbolo #define
for(i=0; i < n; i++) { chamam-se constantes
printf( Insira Nota %d: ,i+1);
scanf(%f,&v[i]); }
simblicas.
for(i=0; i < n; i++)// Clculo mdia. Com a declarao:
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 varivel 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()
{
varivel particular no 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 posio de printf( Insira Nota %d: ,i+1);
memria. scanf(%f,&v[i]); }
for(i=0; i < n; i++)// Clculo mdia.
media=media+v[i];
Exemplo de declarao: 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 salrios 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 salrio do ms %d:",i); }
scanf("%f",&sal[i]);
} //fim for OBS: Neste exemplo, desconsiderou-
25
se a posio zero do vetor

7.1 Vetor Relembrando...

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


valor inicial contm valores aleatrios.

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 posio do vetor vet pode ser


obtido atravs do ndice em que essa posio est
armazenada vet[indice].
26
7.1 Vetor Relembrando...

5. O compilador no verifica se os ndices utilizados em um


vetor esto corretos ou no, por exemplo se num vetor de
dimenso n, for utilizada a posio vet[n], vai gerar um
erro grave, pois no existe esta posio na memria.

6. No se pode declarar um vetor sem dimenso, ou usar


uma varivel como dimenso. Se no sabemos qual o
espao de memria que deve ser reservado para o vetor,
como o compilador vai saber qual esse espao.

7. Quando no se sabe a dimenso exata do vetor a ser


declarado, deve-se utilizar um valor de dimenso maior que
o valor que pensamos ser necessrio.
27

7.1 Vetor - Problemas


Problema 5: Uma companhia de energia eltrica dispem
dos dados de consumo mensal de energia eltrica em kWh
de uma pequena empresa e deseja determinar algumas
estatsticas. Para efeito de planejamento da manuteno
e expanso da rede eltrica ela deseja determinar os valores
e os meses de maior e menor consumo, bem como o
consumo mdio.
Ms kWh Ms kWh Ms 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

Idia do Programa Posio Elemento


Ms kWh
1) Criar um vetor v de 12
1 v[0] 824
elementos e associar o
consumo em KWh do 2 v[1] 1152
ms (i) com a posio 3 v[2] 1236
(i-1). Ou seja:

v[ i -1 ] consumo
12 v[11] 1304
em kWh no ms i.
Associar posio i
com o (i+1) ms
29

7.1 Vetor Problemas: Problema 5


Idia do programa
2) Achar o ms de maior consumo = Achar o Maior Elemento do
Vetor. Para isso preciso:
" Criar uma varivel maior e guardar nela o primeiro
elemento do vetor v. Isto : maior v[0].
" Comparar a varivel maior com os demais elementos do
vetor v[i]. Se maior < v[i], colocar v[i] na varivel maior.

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


v[0] v[1] v[2] v[11] maior > v[1] ? no, ento:
maior = v[1] = 1152
maior > v[2]? no, ento:
maior = v[2] = 1236
E assim por diante. 30
7.1 Vetor Problemas: Problema 5
Idia do programa
3. Achar o ms de Menor consumo = Achar o Menor
Elemento do Vetor.
" Idem maior valor
" Criar uma varivel menor e guardar nela o primeiro
elemento do vetor v. Isto : menor v[0].
" Comparar a varivel menor com os demais elementos do
vetor v[i]. Se menor > v[i], colocar v[i] na varivel menor.

31

7.1 Vetor - Problemas

Problema 5 Consumo Energia Problema 5 Continuao


#include <stdio.h> // Lao 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; // Lao 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++) // Clculo mdia. 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 Execuo

33

7.1 Vetor Problemas : Problema 6


Problema 6: Criar um programa que simule 60 lanamentos de
um dado de 6 faces e armazena o nmero 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
Idia do programa
Posio Elemento
Criar um vetor v de 6 posies
que vai armazenar o no. de Face # Sorteio
vezes que uma face i 1 v[0]
sorteada. 2 v[1]
3 v[2]
Ento: 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.
Ento: v[ i -1 ] no.de vezes Associa a posio i com a face
que a face i foi sorteada. (i+1). 35

7.1 Vetor Problemas Problema 6


Idia do programa
1 2 3 60
60 lanamentos
2 4 3 6

+1 +1 +1 +1

Vetor do nmero de
0 0 0 0 0 0
ocorrncias de uma
fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] face para 60
lanamentos.

36
7.1 Vetor Problemas Problema 6

Gerar uma seqncia de Idia do programa


nmeros pseudo- aleatria,
ou seja, uma seqncia S que
Gerador linear congruencial
utilize uma frmula para
obter seus termos Sn dentro Sn+1 = (Sn *a + b) mod m
de um intervalo [a, b], os
onde: uma boa estratgia usar
mesmos no se repetem para
m, a e b nmeros primos.
um valor suficientemente
grande de n.

S0 a semente

Sn+1 ser o nmero Uma boa escolha para m, a e b


aleatrio 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
aleatrios em C? Os nmeros gerados por rand( ) esto
no intervalo [0, RAND_MAX], onde:
RAND_MAX = 327679719.

Ento para gerar Para gerar nmeros inteiros no


valores aleatrios intervalo [a, b-1] usa-se o operador
% (resto inteiro da diviso):
entre [0 e 5], tem-se
s = (rand() % b) + a.
38
7.1 Vetor Problemas Problema 6
O operador % funciona de Ou seja, operaes com
acordo com o exemplo abaixo: % funcionam como se
tivssemos um relgio: 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 operaes com o


operador % so chamadas de aritmtica 4 2
modular ou ainda aritmtica do relgio. 3
39

7.1 Vetor Problemas Problema 6

Problema 6 60 lanamentos Problema 6 - Continuao


#include <stdio.h> // Lao 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; // Impresso fr[i] vezes do
// Inicializa gerador aleatrio. //caractere [] para formar a
srand(time(0)); //freqncia de ocorrncia de uma
// Lao 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 Execuo

41

7.1 Vetor - Problemas


Problema 7: Escreva um programa que solicite ao usurio
o nmero de alunos de uma sala. Depois, de acordo com o
valor da nota de cada aluno, dever ser atribudo 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
Idia do programa
1) Criar um vetor notas de dimenso 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 dimenso 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


Idia 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 Continuao
#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 nmero 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 Execuo

46
7.1 Vetor - Problemas

Problema 8: Acrescentar ao final do programa que resolve o


Problema 7, e depois de mostrar a informao de freqncia
em percentual, um histograma tal como elaborado para
resolver o Problema 6. O programa deve apresentar os
resultados como abaixo.

Conceito 1 20.00%: [][] Nmero de


Conceito 2 20.00%: [][] ocorrncias 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 continuao


#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 nmero 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);
// Lao para o vetor de concei- // Impresso do Histograma !
// tos com o nmero 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 Execuo

49

7.1 Vetor Problemas Ordenao de Vetores


Problema 9: Ordenao 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 possvel algoritmo de ordenao o Bubble


Sort, cujo nome em portugus : 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 Ordenao de Vetores
" Este o mais popular dos mtodo de ordenao. O principio bsico
desta tcnica, est na comparao e troca entre dois elementos
consecutivos do vetor . O exemplo a seguir nos d uma idia de como
funciona o algoritmo.
" O mtodo comea 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
comparao do penltimo com o ltimo elemento.

46 15 15 15 15 15
46 >15 46 < 91
15 46 46 46 46 46
troca no
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 Ordenao de Vetores


" Observe , no nosso exemplo, que agora o maior elemento do vetor
est ocupando a ltima posio.

" A seguir recomea-se a comparar o primeiro elemento do vetor, assim


modificado, com o segundo e assim por diante at a comparao do
ante antepenltimo com o penltimo
15>46? 15>46?
15 15 15 15 15 no 15
15>46? no
no troca troca troca 10
46 46 46 46 46
46>59?
59 59 10 10 46>10? 46
no troca 59 46>59?
59 > 62 no 59>62? troca 59
62 62 10 59 59
no troca troca no
76 10 62 troca 62 62
62>76? 62 46>59
10 no troca 76 59 > 10 76 76 no 76
76
76>10? 76>91? troca 62>76? troca
91 91 91 91 91 91
Troca no no 59>62
93 93 troca 93 93 troca 93 no 93
52
troca
7.1 Vetor Problemas Ordenao de Vetores
" Observe , no nosso exemplo, que os maiores elementos do vetor
esto sendo colocados ocupando nas ltimas posies.

15 15>10? 10
troca 15>46?
10 15 no
46>59? troca
46 46
no troca
59 59 46<59?
59 > 62
no
62 no troca 62 troca
62>76?
76 no 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; }
// Gerao aleatria 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]);
// Impresso de v antes de ordenar. } // fim programa
printf(\n v = );
for(i=0; i < n; i++)
printf( [%2d] ,v[i]);
// Laos encadeados que realizam a
// ordenao segundo o algoritmo do
// Bubble Sort. 54
7.1 Vetor - Problemas
Problema 9 Exemplo de Execuo

55

7.1 Vetor - Problemas


Problema 10: Um problema freqente de programao o de pesquisar
um valor-chave, denominado tambm de chave de pesquisa, em um
dado vetor, indicando se o valor existe e qual posio ocupa no vetor.
Este processo chamado de pesquisa e duas tcnicas podem ser
utilizadas:

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


chave de pesquisa. Encontra-se o ndice da posio onde a chave est,
ou se chegar ao fim do vetor sem encontrar nada, o valor ( -1)
retornado.
(ii) Pesquisa Binria: Supe que o vetor esta ordenado, de forma que a
cada comparao 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> // Laos encadeados: Pesquisa Linear.
const int n = 14; ind = -1;
main() for(i=0; i < n; i++)
{ // Se a chave foi encontrada, ento,
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.
// Impresso dos valores de v. if(ind == -1)
for(i=0; i < n; i++) printf( Chave nao encontrada !\n);
printf(%3d ,v[i]);
// Cabealho. 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 Execuo

Chave < v[0]

Chave = v[0]

Chave [0,26]
mas

Chave = v[13]

Chave > v[13]


58
7.1 Vetor Problemas Problema 11 Pesquisa Binria
Idia da Pesquisa Binria (supe vetor ordenado !)

1) Faa a= primeiro ndice do vetor.


2) Faa b=ltimo ndice do vetor.
3) Calcule o ndice k do meio do vetor: k=(a+b)/2
4) Verifique se chave < v[k]
Ento a chave se encontra entre os elementos v[0]
e v[k]. Faa b=k-1, e volte ao passo 3.
Seno a chave se encontra entre os elemento v[k]
e v[b]. Faa a=k, e volte ao passo 3.

59

7.1 Vetor Problemas Problema 11 Pesquisa Binria


Idia da Pesquisa Binria (supe vetor ordenado !)
a=0;
EX: Seja chave = 10 b=4
k = (a+b)/2 = 2
Se (chave>v[k])
v[0] ento o novo intervalo a=k+1=3 e b=4;
a=0 2 seno o novo intervalo b=k-1=1 e a=0
v[1] 4 Se (chave= v[k])
k=2 v[2] 8 ento encontrou o valor. A chave est na
posio k
v[3] 10 a=3
v[4] Novo k = (a+b)/2 = 3.
b=4 12 b=4
intervalo chave = v[3], ento a
chave est na posio 3
do vetor
60
7.1 Vetor Problemas: Problema 11 Pesquisa Binria
Quadro resumo dos casos para Pesquisa Binria

Caso Condio Aes 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 Binria

Problema 11 Pesquisa Binria Problema 11 Pesquisa Binria


#include <stdio.h> // Laos encadeados: Pesquisa Binria.
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 cabealho 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);
// Binria 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 Binria

63

7.1 Vetor Problemas


Problema 12: Na FEG existe uma quantidade de alunos matriculados na
disciplina PC e na disciplina de Clculo II. Mas acontece que estas duas
disciplinas esto no mesmo horrio. preciso ento saber quais so os alunos
que esto matriculados nas duas disciplinas ao mesmo tempo. Fazer um
programa que seja capaz de imprimir o numero de matricula desses alunos.
dado o nmero de alunos matriculados em cada disciplina, bem como seus
nmeros 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: Continuao....
//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: continuao . . .

//Verificao dos alunos que esto com matrcula simultnea


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 simultnea
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
dimenso 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

//Continuao ..... 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 mtodo de Criptografia consiste em substituir
as letras de uma mensagem atravs 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;
// Lao 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
// Inicializao.
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


// Inicializao Corresponde ao caractere
backspace na Tabela ASCII.
char tmp, texto[1000];
// Ler at .. No 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 lao. printf(%c,texto[i]);
if (tmp == .) }
break; printf(\n);
// Se no 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 digitao, a senha no deve aparecer. Somente
aps a validao da senha que dever aparecer a palavra
digitada e se a palavra digitada confere com a senha ou no.

77

7.1 Vetor - Problemas


// Inicializao.
char texto[100], tmp; " L o caractere do teclado,
mas o que foi digitado no
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; // Supe 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; // Supe 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 lao 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 lao

7.1 Vetor - Problemas

82
7.2 Dados Estruturados: Matrizes

7.2 Matrizes

83

7.2 Dados Estruturados: Matrizes

Matrizes - Definio
" Tambm chamadas conjuntos bidimensionais,
contm:
um nmero fixo de elementos;
todos so do mesmo tipo;
arranjados na forma de tabela de 2 dimenses;

84
7.2 Dados Estruturados: Matrizes

Matrizes - Definio
" 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 so estruturas


de dados que organizam informaes; de mesmo
tipo e mesmo nome; em tabelas.

Para tanto, so 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
nmeros entre colchetes ([ ]), sendo que o primeiro
corresponde a linha e o segundo corresponde a
coluna relativa a posio que o elemento ocupa na
Tabela. 86
7.2 Dados Estruturados: Matrizes

Declarao e Atribuio de Matrizes


Declarao int a[ 3 ][ 2 ];
" Uma matriz nada mais que um vetor de duas
dimenses, logo a atribuio de valores a uma matriz
feita de modo semelhante atribuio de valores a um
vetor.

A declarao de um vetor com n dimenses feita do


seguinte modo:
tipo nome_do_vetor [dim1][dim2][dim3] ... [dimn]

87

7.2 Dados Estruturados: Matrizes

Ex: Declarao de uma matriz de inteiro de


dimenso 3x2.
main()
int mat[3][2]; //3 linhas, cada uma delas com 2 posies

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 - Atribuio Inicial
" Atribuio Automtica Inicial
A atribuio inicial feita da mesma maneira que para
vetores de uma s dimenso.
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 atribuio: 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 nmeros da chave esto sendo


atribudos a 1. linha, os dois seguintes so atribudos
segunda linha e os dois ltimos so atribudos a terceira linha.89

7.2 Dados Estruturados: Matrizes - Atribuio Inicial


A atribuio inicial tambm 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 separao 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.


Ento, 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 posio i, j do vetor a 90
7.2 Dados Estruturados: Matrizes

Acesso e Modificao de valores de uma Matriz

Matriz Inicial Operaes 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 so 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 tringulo de Pascal correspondente at a n-sima linha.
0 1 2 3 4 5 6 " O Tringulo 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 tringulo 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 Continuao
#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 so armazenadas em
uma matriz de forma que a i-sima linha contm 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 mdia de cada aluno.

Idia do Programa Matriz alunos x notas Vetor pesos

B1 B2 B3 B4 Vetor mdias
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 lao

Segundo lao 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 regies e para
cada uma delas armazenada em uma matriz a informao
da produo, em toneladas de 4 tipos de culturas: milho, soja,
feijo e arroz. Os dados de 1 ano so registrados em uma
matriz A. Construir um programa que realize as seguintes
tarefas:

(1) Ler os dados de produo de cada cultura em cada uma


das regies da fazenda.
(2) Calcular a produo de gros de cada regio.
(3) Calcular a produo de gros de cada cultura.
(4) Calcular o total de gros produzidos pela fazenda.
100
7.2 Matrizes Problemas Resolvidos
Idia do Programa
Milho Soja Feijo Arroz
Regio 1 3.0 4.0 2.0 3.0
Uma matriz
Regio 2 1.0 5.0 4.0 2.0
3x4 para
os dados Regio 3 2.0 6.0 3.0 5.0

Milho Soja Feijo Arroz Total regio


Regio 1 3.0 4.0 2.0 3.0 12.0
Regio 2 1.0 5.0 4.0 2.0 12.0
Regio 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 produo em a. // Soma da regies 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 regio. } // fim programa
for (i=0; i < m; i++) {
r[i] = 0.0; // Valor inicial.
// Soma das culturas da regio 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 so utilizadas imagens produzidas por um satlite. Para
tanto, necessrio 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 clculo do desmatamento de uma rea, que consiste


em se comparar as diferenas entre duas imagens da rea
para anos diferentes, pode ser obtido com a soma das
diferenas dos elementos de duas matrizes.
104
7.2 Matrizes Problemas Resolvidos

Ano de 2007 Ano de 2006 Matriz de


variao 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 informaes 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 variao 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 no.
(iii) Identificar o trmino de um jogo, indicando as 3 possveis
situaes: (1) A ganhou, (2) B ganhou, (3) Empate.
(iv) Construir um tabuleiro que permita a representao das
jogadas tal como dado abaixo.

Jogada de A Espao livre


x
o
Jogada de B
108
7.2 Matrizes Problemas Resolvidos

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

Requisito (iii): Identificar empate.

Varivel contadora de jogadas vlidas: 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): Representao 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): Situaes 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 so ..
Passo 2: Mostrar estado atual da matriz.
Passo 3: Enquanto (True) faa
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 dcima.
Se sim, pare. Ocorreu empate.
Passo 3.4: Capturar coordenadas i (linha) e j (coluna) da jogada.
Se i e j foram vlidos ento ( ou seja m[i][j]== .)
Passo 3.4.1: Se (jogada de A) preencher a casa com a marca de x.
Seno preencher a casa com a marca o.
Passo 3.4.2: Incrementar uma varivel 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) // Lao 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 no.
(iii) Identificar o trmino de um jogo, indicando as 2 possveis
situaes: (1) A ganhou, (2) B ganhou.
(iv) Construir um tabuleiro que permita a representao das
jogadas tal como dado abaixo.

Barra de sabo
Jogada de A

Jogada de B 115

7.2 Matrizes Problemas Resolvidos


Requisito (iv): Representao 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) // Lao 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 sero
// 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 veculo submarino autnomo utilizado para
realizar o mapeamento do leito ocenico 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
Indce da linha: 0 120
7.2 Matrizes Problemas Resolvidos
Problema 8 Petrleo Problema 8 Petrleo
#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 Execuo

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

" A linguagem C apresenta algumas limitaes no que


diz respeito ao tratamento da string, pois
diferentemente das outras linguagem, em C a string
no um tipo bsico
" Logo, em C no possvel atribuir uma string a uma
varivel ou concatenar uma string a outra utilizando
os sinais de atribuio (=) e soma (+) como
possvel nas outras linguagens

Definio: Na linguagem C uma string um conjunto


de caracteres armazenados num vetor.
124
7.3 Strings - Definies
" Em C, as strings so representadas usando aspas,
enquanto que os caracteres so representados
entre aspas simples
Exemplos de strings Exemplos de caracteres
Luis Carlos L
Pedro Henrique >
Receita de Bolo de Chocolate B

" Em C, declarao de strings obedece sintaxe de


declarao de vetores de caracteres.

" Para marcar o fim da string , colocado na ultima


posio do vetor, um marcador de final de string 125

7.3 Strings - Definies

" Ento, em C, strings so seqncias de caracteres


adjacentes na memria. O caractere \0 (= valor inteiro
zero) indica o fim da seqncia.

Exemplo 1: char aluno[13];


define um string de nome aluno e reserva para ele um
espao de 13 (12 + \0) bytes na memria.
0 12
aluno
str: \0

OBS: No exemplo acima o caractere de fim de seqncia \0


ocupa a primeira posio do vetor, porque ainda no foi
atribudo nenhum caractere ao mesmo.
126
7.3 Strings - Definies

Exemplo 2: char nome[16] = Pindamonhangaba;

" define uma string de nome nome, reserva para ele um


espao de memria 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


indexao:

" Exemplo 3: nome[0] = P;


nome[10] = n 127

7.3 Strings Leitura e Impresso de Strings


" A funo 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 Sadas de Strings
" A funo printf pode tambm utilizar a tag %s que
vlida para imprimir strings. A funo puts tambm
pode ser utilizada para imprimir o contedo 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. // Impresso usando puts.
printf(%s, s); puts(s);
} }

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

7.3 Strings Entradas e Sadas de Strings


" A funo scanf pode ser usada com a tag %s, mas se ela
encontrar <TAB>, <ESPAO> 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 variveis string com a funo scanf no se utiliza o &
130
7.3 Strings Entradas e Sadas de Strings
" A funo 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 nmero de caracteres que ela possui sem contar
o caractere especial que delimita o final da string, \0.

Exemplo de Execuo:

Digite uma string: A vida eh bela!


Tamanho da string: 15

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

Os espaos tambm so contabilizados !

No contabilizar e indica final da contagem ! 132


7.3 Strings Problemas
Problema 1 Tamanho String
#include <stdio.h>
const int m = 100; Exemplo de Execuo
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++;
// Impresso do nmero 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
usurio, mostrar o nmero de ocorrncias do caractere na
String. Um exemplo de execuo do programa como dado:
Exemplo de Execuo:
Digite uma string: A vida eh bela !
Digite um caractere: a
Nmero de ocorrncias: 2

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

Caractere a

Nmero de ocorrncias: 2 134


7.3 Strings Problemas
Problema 2 Ocorrncias
Exemplo de Execuo
#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++)
// Impresso do nmero 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 maisculo ou
minsculo. Um exemplo de execuo do programa dado por:

Exemplo de Execuo:
Digite uma string: A vida eh bela !
Digite um caractere: a
Nmero de ocorrncias: 3

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

Caractere a

Nmero de ocorrncias: 3 136


7.3 Strings Problemas
Problema 3 Ocorrncias Mod Exemplo de Execuo
#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)
// Impresso do nmero de caracteres
// ou seja o tamanho da string. transforma as letras minsculas
printf(Ocorrencias: %d \n,soma); contidas em C, em maisculas
} 137

7.3 Strings Problemas

Problema 4: Construir um programa que substitui todas as


ocorrncias de um caractere ch1 em uma string por um
caractere ch2 :

Exemplo de Execuo:
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 Substituio Exemplo de Execuo
#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;
// Impresso do nmero 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
ocorrncias de uma sub-string s1 em uma string s2.

Exemplo de Execuo:
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 Execuo
#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 funes


"A biblioteca padro do C possui diversas funes que
manipulam strings.
"Estas funes so teis, pois no se pode, por exemplo,
igualar duas strings:

string1 = string2; /* NAO faca isto */

" Igualar duas strings um desastre. Quando voc estudar o


captulo que trata de ponteiros voc entender por que. As
strings devem ser igualadas elemento a elemento.

" As funes apresentadas nestas sees esto no arquivo


cabealho string.h.

142
7.3 Strings Algumas funes

1. Funo strcpy() Sintaxe


strcpy(destino,origem);

Copia o contedo da string origem, na string destino

Ex:
Neste exemplo a funo strcpy vai
main(){ copiar a string alo na varivel
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 funes

2. Funo strcat() Sintaxe


strcat(string1,string2);

Concatena a string2 no final da string1. No verifica tamanho

Ex: Neste exemplo a funo


main() strcpy vai copiar a string
bom na varivel um[ ], e a
{ string dia na varivel
char um[20],dois[10]; dois[ ].
strcpy(um,"bom"); A seguir a funo strcat ()
strcpy(dois," dia"); vai concatenar as duas
strcat(um,dois); strings colocando-as na
varivel um[ ]. O printf vai
printf("%s\n",um); ento, imprimir a frase
} bom dia. 144
7.3 Strings Algumas funes
3. Funo 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 varivel s. A funo
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 invlida\n"); elas forem iguais vai ser
impresso a frase senha ok! .
else
printf("senha ok!\n") ;
145
}

7.3 Strings Algumas funes

4. Funo strlen( ) Sintaxe:


strlen (string);
A funo strlen() retorna o comprimento da string fornecida. O
terminador nulo \0 no 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 funes
Funo Descrio

stricmp Faz a mesma coisa que a funo strcmp


(comparao de strings) mas ignorando se os
caracteres esto em maisculas ou minsculas.
strchr Procura um caractere numa string.

strstr Procura uma string dentro da outra.

strlwr Converte todos os caracteres de uma string para


minsculas.
strupr Converte todos os caracteres de uma string para
maisculas.

147

7.3 Strings Matrizes de strings


Matrizes de strings
" Matrizes de strings so 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_varivel [num_de_strings][compr_das_strings];

A surge a pergunta: como acessar uma string individual?


Fcil. s usar apenas o primeiro ndice.
Ento, para acessar uma determinada string faa:
nome_da_varivel [ndice]
148
7.3 Strings Matrizes de strings
Exemplo1: Usando uma Matriz de strings, faa 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.

Soluo

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 vrios livros e por esta razo ela
deseja fazer um relatrio contendo: Titulo do Livro a ser
editado, numero de pginas, previso de quantos livros
sero vendidos, e o preo de venda de cada exemplar
O preo de venda calculado com base no custo total de
produo acrescido de 20%. O custo total de produo
dado pela formula abaixo:

custo_produo = custo_fixo + ( previso_vendas*


no._paginas* custo_pagina)
preo_venda = (custo_produo/previso_vendas) * 1.20

Fazer um Programa em C que leia a quantidade de ttulos a


serem produzidos e os dados relativos a cada ttulo e
imprima o relatrio 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 produo
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 preo 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 relatrio
printf("Ttulo 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