Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Dados Estruturados
Vetores , Matrizes e Strings
Unesp Campus de Guaratinguet
Array - Definio
1o. Algoritmo
Incio algoritmo
Leia(num1,nota1,num2,nota2,num3,nota3,num4,
nota4,num5,nota5)
3. 100 testes
1 2 3 4 100
Lista[0] Lista[99]
Lista[3]
6
7.1 Array - Definio
7.1Array - Caractersticas
! 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
17
20
7.1 Vetor: Definio de Constantes
31
33
+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
S0 a semente
41
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
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
46
7.1 Vetor - Problemas
49
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
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
55
Chave = v[0]
Chave [0,26]
mas
Chave = v[13]
59
b = k 1;
1 chave < v[k]
k = (a+b)/2;
a = k + 1;
3 chave > v[k]
k = (a+b)/2;
4 b<a Retornar -1
61
63
//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
}
67
69
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
(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
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
82
7.2 Dados Estruturados: Matrizes
7.2 Matrizes
83
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
87
Coluna 0 Coluna 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
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
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
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];
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
Vetor m x 1
Matriz m x n
Vetor n x 1 97
v21
Primeiro lao
5 5 5 5
5 5 4 5
5 4 3 3
4 4 2 1
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
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); }
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
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
x x x x
x x x x
x x x x
x x x x
x x x x
x x x x
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
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.
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
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
1 1 2 2
1 2 3 2
1 3 3 3
122
7.3 Dados Estruturados: Strings
7.3 Strings
123
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
Exemplo de Execuo:
A V i d a e h b e l a ! \0
String A V i d a e h b e l a !
Caractere a
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
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
}
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
}
142
7.3 Strings Algumas funes
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
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
}
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
147
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
}
// 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
Fim
Strings
156