Vetores, Strings e Matrizes

Documentos relacionados
O vetor é provavelmente um dos mais simples e importantes tipos agregados. Através do seu uso, podemos

Caracteres. Caracteres são representados através de códigos numéricos. Tabela de códigos: Define correspondência entre caracteres e códigos numéricos

Introdução a Programação de Jogos

Ponteiros e Tabelas. K&R: Capítulo 5

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

ESTRUTURAS COMPOSTAS

Introdução a Computação

3. Linguagem de Programação C

Caracteres e Cadeias de Caracteres

Linguagem C Controle do Fluxo de Execução. Lógica de Programação

ESTRUTURAS COMPOSTAS VETOR

Disciplina de Algoritmos e Programação

Computação 2. Aula 2. Profª. Fabiany Vetores e Matrizes

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Strings. Introdução. Definição de strings. Criação/Declaração de strings. Inicialização de strings. Manipulação de strings. Exemplos.

Escreva a função e_caracter que verifica se um determinado caracter é um numero ou não. Escreva um Programa de teste da função.

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Apêndice B. Cadeias de Caracteres (Strings)

ESTRUTURAS COMPOSTAS. Variáveis Compostas Unidimensionais VETOR. Baseado nos slides de Rosely Sanches e Simone Senger de Souza

Linguagem C. Prof.ª Márcia Jani Cícero

Aula 8 Oficina de Programação Vetores. Profa. Elaine Faria UFU

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

Aula 06 Introdução à Programação Matrizes

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Universidade Estadual de Mato Grosso do Sul Ciência da Computação Algoritmos e Estruturas de Dados I (AED-I) Prof. Nilton

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica

Linguagem C Variáveis Indexadas ( vetores e Matrizes) Lógica de Programação

Universidade Federal de Goiás Instituto de Informática Introdução à Computação Professor: Julliano Rosa Nascimento

Curso de Programação Computadores Prof. Aníbal Tavares Profa. Cassilda Ribeiro Ministrado por: Prof. André Amarante

Métodos Computacionais. Strings (Vetor de Caracteres)

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Capítulo 1: Introdução à Linguagem C. Pontifícia Universidade Católica Departamento de Informática

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Programação de Computadores II. Cap. 7 Cadeias de Caracteres 1/2

Programação I Matrizes e Strings. Prof. Carlos Alberto

Aula 16: Laços aninhados e desvios

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

Alocação Dinâmica em C

PROGRAMAÇÃO DE COMPUTADORES V - TCC Modulo 6 : Funções Escopo de Variáveis: Globais x Locais Aura - Erick

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

imprimir seus quadrados.

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO

Introdução à Ciência da Computação

Computação Informática

Legibilidade do código fonte

Vetores e Matrizes. Conceito. Conceito. Conceito. Conceito. Conceito. Variáveis Compostas Homogêneas. Matriz

Matrizes. DCC 119 Algoritmos

Estruturas de Dados Aula 6: Cadeias de 28/03/2010

Aula 15: Vetores e Matrizes em C

INF 1620 P1-11/04/03 Questão 1 Nome:

Entender o problema Encontrar um algoritmo para resolvê-lo. Implementar o algoritmo numa linguagem de programação

Aula 8 - Matrizes e Strings

Capacitação em Linguagem C Parte 1

Linguagem C (estruturas condicionais)

Transcrição:

Vetores, Strings e Matrizes Prof. Dr. Silvio do Lago Pereira Departamento de Tecnologia da Informação Faculdade de Tecnologia de São Paulo

Vetores Um vetor é um tipo de dados agregado homogêneo, cujos itens são identificados por índices. Vetores são declarados com um sufixo [n], indicando que o vetor tem capacidade para n itens; A indexação inicia-se sempre em zero. nome do vetor v: 0 1 2 n 1 índices elementos Prof. Dr. Silvio do Lago Pereira 2

Uso de índices inadequados #include <stdio.h> void main(void) { int x[3], y[4]; x[2] = y[0] = 1; 1; x[3] = 2; 2; y[-1] = 3; 3; printf("%d %d", x[2], y[0]); Prof. Dr. Silvio do Lago Pereira 3

Exercício Codifique um programa para ler 5 números e, depois, exibi-los na ordem inversa. #include <stdio.h> void main(void) { int i, i, v[5]; for(i=0; i<5; i++) { printf("%do. valor? ",i+1); scanf("%d",&v[i]); printf("\nordem inversa: "); for(i=4; i>=0; i--) printf("%d ", ", v[i]); Prof. Dr. Silvio do Lago Pereira 4

Inicialização de vetores O vetor deve ser global ou estático. Os valores iniciais devem ser constantes. #include <stdio.h> void main(void) { static float moeda[5] = { 1.00, 0.50, 0.25, 0.10, 0.05 ; ;... Prof. Dr. Silvio do Lago Pereira 5

Valores iniciais insuficientes #include <stdio.h> #define max 5 void main(void) { static int A[max] = {9, 3, 3, 2, 2, 7; auto int i; i; for(i=0; i<max; i++) printf("%d", A[i]); Prof. Dr. Silvio do Lago Pereira 6

Tamanho implícito #include <stdio.h> void main(void) { static char ds[] = { 'D', 'S', 'T', 'Q', 'Q', 'S', 'S ; ;... Prof. Dr. Silvio do Lago Pereira 7

Parâmetros do tipo vetor O nome do vetor representa seu endereço; Em geral, parâmetros são passados por valor; Exceto vetores, que são passados por referência. #include <stdio.h> void main(void) { int x[3], y[4]; printf("\n n x = %p %p e y = %p", x, x, y); Prof. Dr. Silvio do Lago Pereira 8

Exemplo: temperatura média Problema: Dadas as temperaturas registradas diariamente, durante uma semana, determine em quantos dias a temperatura esteve acima da média. Solução: 1 obter os valores das temperaturas; 2 calcular a média entre esses valores; 3 contabilizar os valores acima da média. Prof. Dr. Silvio do Lago Pereira 9

Exemplo: programa principal #include <stdio.h> #define max 7 void main(void) { float t[max], m; m; obtem(t); m = media(t); printf("estatística: %d", conta(t,m)); Prof. Dr. Silvio do Lago Pereira 10

Exemplo: obtendo as temperaturas void obtem(float t[]) { int i; i; puts("informe as as temperaturas: "); for(i=0; i<max; i++) { printf("%d o valor? ",i+1); scanf("%f", &t[i] ); ); Prof. Dr. Silvio do Lago Pereira 11

Exemplo: calculando a média float media(float t[]) { int i; i; float s=0; for(i=0; i<max; i++) s += += t[i]; return s/max; Prof. Dr. Silvio do Lago Pereira 12

Exemplo: contabilizando int conta(float t[], float m) m) { int i, i, c=0; for(i=0; i<max; i++) if( t[i]>m ) c++; return c; c; Prof. Dr. Silvio do Lago Pereira 13

Exercício Codifique a função histograma(t). void histograma(float t[]) { static char d[7]={'d','s','t','q','q','s','s'; int int i, i, j; j; for(i=0; i<max; i++) { printf("\n%c: ",d[i]); for(j=1; j<=t[i]; j++) putch(220); Prof. Dr. Silvio do Lago Pereira 14

Ordenação Bubble Sort Estratégia: Permutar pares de itens consecutivos fora de ordem, enquanto for possível. v[0] v[1] v[2] v[3] v[4] v[5] v[6] v[7] v[8] 71 63 46 80 39 92 55 14 27 63 71 46 80 39 92 55 14 27 63 46 71 80 39 92 55 14 27 63 46 71 80 39 92 55 14 27 63 46 71 39 80 92 55 14 27 63 46 71 39 80 92 55 14 27 63 46 71 39 80 55 92 14 27 63 46 71 39 80 55 14 92 27 63 46 71 39 80 55 14 27 92 Prof. Dr. Silvio do Lago Pereira 15

Observações sobre o método Em cada fase, o maior item é deslocado para sua posição definitiva. Se uma lista tem n itens, após a primeira fase haverá n-1 itens a ordenar. Após, n-1 etapas haverá apenas 1 item a ordenar. Numa fase i são realizadas n-i comparações. Prof. Dr. Silvio do Lago Pereira 16

Ordenação completa f a s e i j v[0] v[1] v[2] v[3] v[4] 0 46 39 55 14 27 1 39 46 55 14 27 1 o 1 2 39 46 55 14 27 3 39 46 14 55 27 39 46 14 27 55 0 39 46 14 27 55 1 39 46 14 27 55 2 o 2 2 39 14 46 27 55 39 14 27 46 55 0 39 14 27 46 55 3 o 3 1 14 39 27 46 55 14 27 39 46 55 4 o 4 0 14 27 39 46 55 14 27 39 46 55 Prof. Dr. Silvio do Lago Pereira 17

Algoritmo Bubble Sort void bsort(int v[], int n) n) { int i, i, j; j; for(i=1; i<n; i++) for(j=0; j<n-i; j++) if( v[j]>v[j+1] ) { int x = v[j]; v[j] = v[j+1]; v[j+1] = x; x; Prof. Dr. Silvio do Lago Pereira 18

Exercício Utilize bsort(), para ordenar um vetor. void main(void) { static int v[5]={46,39,55,27,16; int i; i; bsort(v,5); printf("\nvetor ordenado: "); for(i=0; i<5; i++) printf("%d ",v[i]); Prof. Dr. Silvio do Lago Pereira 19

Busca linear Estratégia: examinar os itens um a um. int blin(int x, x, int v[], int n) n) { int i; i; for(i=0; i<n; i++) if( x == == v[i] ) return 1; 1; return 0; 0; Prof. Dr. Silvio do Lago Pereira 20

Busca binária Estratégia: examinar primeiro o item do meio e, depois, desprezar metade dos itens (ordenados). Passo x i f m L[0] L[1] L[2] L[3] L[4] L[5] L[6] L[7] L[8] 1 o 63 0 8 4 14 27 39 46 55 63 71 80 92 2 o 63 5 8 6 63 71 80 92 3 o 63 5 5 5 63 Prof. Dr. Silvio do Lago Pereira 21

Fracasso da busca Passo x i f m L[0] L[1] L[2] L[3] L[4] L[5] L[6] L[7] L[8] 1 o 40 0 8 4 14 27 39 46 55 63 71 80 92 2 o 40 0 3 1 14 27 39 46 3 o 40 2 3 2 39 46 4 o 40 3 3 3 46 5 o 40 3 2? Prof. Dr. Silvio do Lago Pereira 22

Algoritmo de busca binária int bbin(int x, x, int v[], int n) n) { int i=0, f=n-1, m; m; while( i<=f ) { m = (i+f)/2; if( x == == v[m] ) return 1; 1; if( x < v[m] ) f = m-1; else i = m+1; return 0; 0; Prof. Dr. Silvio do Lago Pereira 23

Strings uma string é uma série de caracteres terminada com um byte nulo, representado por '\0 ; cuidado: n '\0 = ASCII 0 n '0 = ASCII 48 cada posição armazena um caracter o caracter nulo é um "terminador" v e r d e e a m a r e l o \0 Prof. Dr. Silvio do Lago Pereira 24

Importante Não esquecer de reservar espaço para o \0. Para string constante, o espaço para o '\0' é alocado automaticamente pelo compilador. #include <stdio.h> void main(void) { printf("\nespaço alocado = %d %d bytes", sizeof("verde e amarelo") ); ); Prof. Dr. Silvio do Lago Pereira 25

Inicialização de string #include <stdio.h> void main(void) { char x[] = {'u', 'm'; char y[] = "dois"; printf("%s %s", x, x, y); Prof. Dr. Silvio do Lago Pereira 26

Leitura de string via teclado #include <stdio.h> void main(void) { char n[21]; printf("qual o seu nome? "); gets(n); printf("olá, %s!",n); Prof. Dr. Silvio do Lago Pereira 27

Manipulação de string Como string não é um tipo primitivo, operadores de atribuição e comparação não podem ser usados. #include <stdio.h> void main(void) { char x[] = "um"; char y[] = "um"; if( x==y ) printf("iguais"); else printf("diferentes"); Prof. Dr. Silvio do Lago Pereira 28

Exemplo: comparação entre strings int strcmp(char s[], char t[]) { int i=0; while( s[i]==t[i] && && s[i]!='\0' ) i++; return s[i]-t[i]; Prof. Dr. Silvio do Lago Pereira 29

Exemplo: atribuição entre strings void strcpy(char s[], char t[]) { int i=0; while( s[i]=t[i] ) i++; void main(void) { char a[10]="um", b[10] = "dois"; printf("\nantes: %s, %s",a,b); strcpy(a,b); printf("\ndepois: %s, %s",a,b); Prof. Dr. Silvio do Lago Pereira 30

Exercício Codifique strlen(s), que devolve o comprimento de s. int strlen(char s[]) { int i; i; for(i=0; s[i]!='\0'; i++ ); ); return i; i; void main(void) { char a[10]="teste"; printf("\ncomprimento: %d", strlen(a)); Prof. Dr. Silvio do Lago Pereira 31

Matrizes Uma matriz é um vetor cujos itens são vetores. 0 1 2 0 1 2 j n 1 M[i][j] i m 1 Prof. Dr. Silvio do Lago Pereira 32

Inicialização de matriz static int labirinto[8][10] = { {1,1,1,1,1,1,1,1,1,1, {0,0,1,0,1,0,1,0,1,1, {1,0,1,0,1,0,0,0,0,1, {1,0,1,1,1,0,1,1,0,1, {1,0,0,0,0,0,1,0,0,1, {1,0,1,0,0,1,1,0,1,1, {1,0,0,1,0,1,0,0,0,0, {1,1,1,1,1,1,1,1,1,1 ; ; Prof. Dr. Silvio do Lago Pereira 33

Matriz de strings #include <stdio.h> void main(void) { char n[5][11]; int i; i; for(i=0; i<5; i++) { printf("%d o nome: ",i+1); gets(n[i]);... Prof. Dr. Silvio do Lago Pereira 34

Matrizes como parâmetro O nome da matriz representa seu endereço; matrizes são passadas por referência; a segunda dimensão é necessária para calcular os endereços dos itens. Prof. Dr. Silvio do Lago Pereira 35

Exercício Adapte bsort() para ordenar um vetor de strings. void bsort(int v[][20], int n) n) { int i, i, j; j; for(i=1; i<n; i++) for(j=0; j<n-i; j++) if( strcmp(v[j],v[j+1])>0 ) { char x[20]; strcpy(x, v[j]); strcpy(v[j], v[j+1]); strcpy(v[j+1], x); Prof. Dr. Silvio do Lago Pereira 36

Exercício Crie um programa para jogar o jogo-da-velha. #include <stdio.h> #include <stdlib.h> void main(void) { static char t[3][3] = { {' {' ', ', ' ', ', ' ', {' {' ', ', ' ', ', ' ', {' {' ', ', ' ', ', ' ' ' ; ; int j=0, e, e, s; s; char v; v; Prof. Dr. Silvio do Lago Pereira 37

Programa principal clrscr(); printf("\npar (0) ou ou impar (1)?"); scanf("%d",&e); randomize(); s = random(2); do do { mostra(t); if( e==s ) usuario(t); else computador(t); v = vencedor(t); s =!s; while( ++j<9 && && v==' '); Prof. Dr. Silvio do Lago Pereira 38

Programa principal mostra(t); switch( v ) { case ' ': ': puts("\nempate"); break; case 'x': puts("\nvoce venceu"); break; case 'o' : puts("\neu venci"); break; getch(); Prof. Dr. Silvio do Lago Pereira 39

Exibindo o tabuleiro void mostra(char t[3][3]) { int i; i; clrscr(); for(i=0; i<3; i++) { printf("\n %c %c %c %c %c %c ", ", t[i][0], t[i][1], t[i][2] ); ); if( i<2 ) printf("\n---+---+---"); Prof. Dr. Silvio do Lago Pereira 40

Exibindo o tabuleiro void mostra(char t[3][3]) { clrscr(); printf("\n %c %c %c %c %c %c ", ", t[0][0], t[0][1], t[0][2] ); ); printf("\n---+---+---"); printf("\n %c %c %c %c %c %c ", ", t[1][0], t[1][1], t[1][2] ); ); printf("\n---+---+---"); printf("\n %c %c %c %c %c %c ", ", t[2][0], t[2][1], t[2][2] ); ); Prof. Dr. Silvio do Lago Pereira 41

Jogada do usuário void usuario(char t[3][3]) { int L, L, C; C; do do { gotoxy(1,10); printf("posicao? "); scanf("%d,%d",&l,&c); while( L<0 L>2 C<0 C>2 t[l][c]!=' '); t[l][c] = 'x'; Prof. Dr. Silvio do Lago Pereira 42

Jogada do computador void computador(char t[3][3]) { int L, L, C; C; do do { L = random(3); C = random(3); while( t[l][c]!=!= ' ' ); ); t[l][c] = 'o'; Prof. Dr. Silvio do Lago Pereira 43

Vencedor char vencedor(char t[3][3]) { int i; i; for(i=0; i<3; i++) if( t[i][0]==t[i][1] && && t[i][1]==t[i][2] && && t[i][0]!= ' ') ') return t[i][0]; for(i=0; i<3; i++) if( t[0][i]==t[1][i] && && t[1][i]==t[2][i] && && t[i][0]!= ' ') ') return t[0][i]; Prof. Dr. Silvio do Lago Pereira 44

Vencedor if( t[0][0]==t[1][1] && && t[1][1]==t[2][2] && && t[i][0]!= ' ') ') return t[0][0]; if( t[0][2]==t[1][1] && && t[1][1]==t[2][0] && && t[i][0]!= ' ') ') return t[0][2]; return ' '; '; Prof. Dr. Silvio do Lago Pereira 45

Exercício para avaliação (EP2) Modificar a função computador() para implementar a seguinte estratégia: 1o. Computador tenta ganhar o jogo. 2o. Computador tenta impedir adversário de ganhar. 3o. Computador faz uma jogada aleatória. Bônus: em vez de fazer uma jogada aleatória, o computador pode fazer a melhor jogada. Prof. Dr. Silvio do Lago Pereira 46

Fim