7. Dados Estruturados Vetores , Matrizes e Strings Unesp – Campus de Guaratinguetá Curso: Programação de Computadores Prof. Aníbal Tavares Profa. Cassilda Ribeiro 1 7.1 Dados Estruturados: Array Array - Definição ! Vetor ou Array é a forma mais familiar de dados estruturados. ! Um array é um conjunto de componentes do mesmo tipo, que podem ser acessados individualmente a partir de um único nome. 2 7.1 Array - Problema Dada uma relação de 5 estudantes, imprimir o numero de matricula de cada estudante, cuja nota é maior do que a média da classe. 3 7.1 Array - Problema 1o. Algoritmo Início algoritmo Leia(num1,nota1,num2,nota2,num3,nota3,num4, nota4,num5,nota5) media ← (nota1+nota2+nota3+nota4+nota5) / 5.0 Se nota1 > media então escreva (num1) Se nota2 > media então escreva (num2) Se nota3 > media então escreva (num3) Se nota4 > media então escreva (num4) Se nota5 > media então escreva (num5) Fim algoritmo 4 7.1 Array - Solução 1 1. Uma variável para cada número de matricula → 100 variáveis 2. Uma variável para cada nota → + 100 variáveis 3. 100 testes 5 7.1 Array - Definição " Como estes dados têm uma relação entre si, podemos declará-los com um nome ÚNICO para todos os 100 elementos. " Seja, por ex, um conjunto de 100 números = Lista 1 Lista[0] 2 3 4 Lista[3] 100 Lista[99] 6 7.1 Array - Definição " O elemento do vetor tem todas as características de uma variável e pode aparecer em expressões e atribuições. Lista[2] ← Lista[3] + Lista[20] " Para somar todos os elementos da Lista: soma ← 0 para i ← 0 até 99 faça soma ← soma + Lista[i] 7 7.1Array - Características " As características básicas de um Array são: ! é uma estrutura homogênea, isto é, é formada de elementos do mesmo tipo ! todos os elementos da estrutura são igualmente acessíveis, isto é, o tempo e o tipo de procedimento para acessar qualquer um dos elementos do Array são iguais ! cada elemento componente desta estrutura tem um nome próprio segundo sua posição no conjunto 8 Array - Solução 2 2o. Algoritmo Início algoritmo Para i ← 0 até 4 faça Leia(num[i],nota[i]) soma ← 0,0 Para i ← 0 até 4 faça soma ← soma + nota[i] media ← soma/5 Para i ← 0 até 4 faça Se (nota[i] > media) então escrever (num[i]) Fim algoritmo 9 7.1 Dados Estruturados: Declaração de Vetores " Na linguagem C a declaração do array é feita juntamente com as demais variáveis, e é preciso dizer qual é o tipo de dado que será armazenado no array. " A declaração de um vetor com uma única dimensão é feita do seguinte modo: tipo nome_variavel[no. de elementos] Exemplo 1: int val[ 5 ]; Cria um vetor de nome val, de tamanho 5 e cujos elementos são do tipo int. val[0] val[1] val[2] Os índices variam de 0 até 4 val[3] val[4] 10 7.1 Dados Estruturados: Declaração de Vetores ! Observações: 1) O acesso a cada elemento do vetor é feito através de uma indexação da variável val. 2) Em C, a indexação de um vetor varia de zero a n-1, onde n representa a dimensão do vetor. Assim: val [0] # acessa o primeiro elemento de val val [1] # acessa o segundo elemento de val ... val [4] # acessa o último elemento de v Mas: val[5] # está ERRADO (invasão de memória) 11 7.1 Dados Estruturados: Declaração de Vetores Exemplo 2: Para declarar um vetor com 50 números reais float custo[50]; float - Tipo de cada elemento do vetor 50 - No. de elementos do vetor custo - Nome do vetor custo[i] – Aquilo que está na posição índice i do vetor custo Exemplo 3: Coloque o valor 34.6 na primeira posição do vetor custo e o valor 56.7 na última posição: custo[0] = 34.6; custo[49] = 56.7; Exemplo 4:Coloque no quarto elemento do vetor o dobro do valor do segundo elemento: custo[3] = 2* custo[1]; 12 7.1 Dados Estruturados: Declaração de Vetores " A Linguagem C permite que se faça a declaração do vetor ao mesmo tempo que atribuição de valores iniciais. Exemplo 5: int val[5] = {3, 2, 6, 4, 5}; aqui foi declarado um vetor de inteiros com 5 elementos e atribuído a ele os valores entre chaves 3 2 6 4 5 ! ! ! ! ! val[0] val[1]val[2] val[3] val[4] " O acesso e a modificação dos elementos do vetor é feito diretamente sobre a variável. Exemplo 6: val[1] = val[1] + 1; val[3] = val[1]+ val[3]; 3 3 6 7 5 ! ! ! ! ! val[0] val[1] val[2] val[3] val[4]13 7.1 Dados Estruturados: Declaração de Vetores OBS:Se um vetor for declarado com n elementos e forem atribuídos inicialmente ao vetor, apenas k valores (k<n), então os primeiros k elementos do vetor serão iniciados com os respectivos valores e os restantes serão inicializados com ZERO. Exemplo 7: Suponha a seguinte declaração: int v3[10] = {10,33,45}; Neste caso os três primeiros elementos do vetor v3 (índices 0, 1 e 2) recebem os valores 10, 33 e 45 respectivamente. e todos os demais elementos recebem o valor ZERO Assim a declaração acima é equivalentes à: int v3[10] = {10,33,45,0,0,0,0,0,0,0}; 14 7.1 Dados Estruturados: Vetor - Problemas Programa 1: Criar um programa com um vetor de 10 inteiros tal que seus elementos são da forma v[i] = i+1. Imprimir o vetor. Programa 1 – Usando vetores main() // incluir <stdio.h> e <stdlib.h> { int i; int v[10]; // Colocando valores em v. for(i=0; i < 10; i++) v[i] = i + 1; V [ i ] = i + 1; 1 2 ••• 9 10 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); } // fim programa 15 7.1 Dados Estruturados: Vetor - Problemas Programa 2 : Fazer um programa que leia um conjunto de 10 elementos numéricos,a partir do teclado, armazene-os na variável A e depois os imprima. #include <stdlib.h> #include <stdio.h> main() { int A[10]; int I; // inicio printf("Digite os 10 elementos do vetor; sendo um em cada linha\n"); for (I=0; I< 10;I++)// ler o vetor scanf("%d",&A[I]); printf("Vetor lido\n"); for (I=0; I<10;I++) // imprimir vetor printf("A[%d] = %d\n", I, A[I]); system("pause"); } 16 7.1 Dados Estruturados: Vetor - Problemas Programa 2 – Exemplo de Execução 17 7.1 Dados Estruturados: Vetor - Problemas Programa 3: Criar um programa que armazene em um vetor os 10 primeiros termos da seqüência de Fibonacci. Imprimir o vetor. F(n)=F(n-1)+F(n-2) onde: n=0,1,2, 3,... e F(0) = F(1) = 1 Programa 3 – Fibonacci E I main() // incluir <stdio.h> e <stdlib.h> { int i; int v[10]; v[1] = v[0] = 1; I // Colocando valores em v. 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]. Espiral de Fibonacci for(i=0; i < 10; i++) printf(“ v[%d] ", i+1); } // fim programa 18 7.1 Dados Estruturados: Vetor - Problemas Programa 4 : Dada uma relação de 5 estudantes, imprimir a a nota do estudante cuja nota é maior que a média da classe. Etapas de Resolução 1. Ler e armazenar notas. 2. Calcular a média. 1 3. Exibir notas > média. O programa ao lado pode 2 ser melhorado com o uso dos comandos const ou ainda define. 3 //Programa 4 – Notas Maiores main() // incluir <stdio.h> e <stdlib.h> {int i; float v[5], media = 0.0; // Colocar valores em v. for(i=0; i < 5; i++) { printf(“ Insira Nota %d: ”,i+1); scanf(“%f”,&v[i]); } for(i=0; i < 5; i++) // Cálculo média. media=media+v[i]; media=media/5; printf(“Media = %f \n”, media); for(i=0; i < 5; i++) // Ver v[i]>media. if (v[i] > media) printf(“ v[%d] = %f \n", i+1,v[i]);19 } // fim programa 7.1 Dados Estruturados: Vetor - Problemas Programa 4 – Exemplo de Execução 20 7.1 Vetor: Definição de Constantes " Ao se escrever um programa, deve-se fazê-lo de modo que uma pequena alteração nos dados não provoque grandes transformações no código. O programa 3, por exemplo, foi escrito para rodar com um vetor de 5 elementos. Para que ele possa ser executado para um vetor de 40 elementos (40 alunos), é preciso alterar todas as ocorrências do número 5 pelo número 40. " A solução para esse problema é a utilização de constantes, que uma vez alteradas, propagam o novo valor por todas as ocorrências. " Uma constante nada mais é que um nome correspondendo a um valor fixo, isto é que não pode ser alterado ao longo da execução do programa. 21 7.1 Vetor: Definição de Constantes A definição de constantes pode ser feita de duas maneiras distintas: " Através da palavra reservada const const tipo simbolo =valor; " Através da diretiva de pré processamento #define #define simbolo valor OBS: As constantes declaradas com o #define devem ser feitas imediatamente após as linhas dos #includes. As constantes declaradas com o const podem ser feitas após os #includes ou após o main(). Pode-se então, reescrever o programa 3, usando constantes. 22 7.1 Vetor - Constantes - Uso do comando #define //Problema 3 – Notas Maiores #include <stdio.h> #define n 5 //sem ponto e virgula main() { int i; float v[n], media = 0.0; // Colocar valores em v. for(i=0; i < n; i++) { printf(“ Insira Nota %d: ”,i+1); scanf(“%f”,&v[i]); } for(i=0; i < n; i++)// Cálculo média. media=media + v[i]; media=media/n; for(i=0; i < n; i++) // Ver v[i]>media. if (v[i] > media) printf(“ v[%d] = %f \n", i+1,v[i]); } // fim programa Quando o define é utilizado,o compilador substitui todas as ocorrências do símbolo pelo valor definido. " Às constantes definidas com o símbolo #define chamam-se constantes simbólicas. Com a declaração: #define n 5 " Em todo lugar onde aparecer a variável n, ela terá o valor constante 23 igual a 5 7.1 Vetor- Constantes - Uso do comando const O qualificador const permite ao programador informar que o valor de uma variável particular não deve ser modificado. Ou seja, a constante obtida com const existe fisicamente em uma dada posição de memória. Exemplo de declaração: const int n=5; //Problema 3 – Notas Maiores //usando const #include <stdio.h> main() { const int n = 5; int i; float v[n], media = 0.0; // Colocar valores em v. for(i=0; i < n; i++) { printf(“ Insira Nota %d: ”,i+1); scanf(“%f”,&v[i]); } for(i=0; i < n; i++)// Cálculo média. media=media+v[i]; media=media/n; for(i=0; i < n; i++) //Ver v[i]>media. if (v[i] > media) printf(“ v[%d] = %f \n", i+1,v[i]); } // fim programa 24 7.1 Vetor – Constantes - Problemas Problema 4: Escreva um programa que realize a leitura dos salários pagos a um individuo durante um ano. Em seguida, o programa deverá mostrar os valores mensais e o total anual. #include <stdio.h> #include <stdio.h> main() { const int mes = 12; float sal[mes+1]; /* 12 meses */ float total; int i; for (i=1; i<= mes ; i++) { //inicio for printf("Introd. o salário do mês %d:",i); scanf("%f",&sal[i]); } //fim for /* Mostrar valores Mensais e calcular total */ puts(" Mes Valor "); for (i=1, total=0.0 ; i<=mes ; i++) { // inicio for printf(" %3d %9.2f\n",i,sal[i]); total+=sal[i]; } //fim for printf("Total Anual: %9.2f\n",total); system(“pause”); } OBS: Neste exemplo, desconsiderou25 se a posição zero do vetor 7.1 Vetor – Relembrando... 1. Os elementos de um vetor que foi declarado sem qualquer valor inicial contêm valores aleatórios. 2. O índice do primeiro elemento do vetor é sempre zero. 3. Os índices de um vetor com n elementos variam entre 0 e n-1. 4. O valor existente em uma posição do vetor vet pode ser obtido através do índice em que essa posição está armazenada vet[indice]. 26 7.1 Vetor – Relembrando... 5. O compilador não verifica se os índices utilizados em um vetor estão corretos ou não, por exemplo se num vetor de dimensão n, for utilizada a posição vet[n], vai gerar um erro grave, pois não existe esta posição na memória. 6. Não se pode declarar um vetor sem dimensão, ou usar uma variável como dimensão. Se não sabemos qual é o espaço de memória que deve ser reservado para o vetor, como o compilador vai saber qual é esse espaço. 7. Quando não se sabe a dimensão exata do vetor a ser declarado, deve-se utilizar um valor de dimensão maior que o valor que pensamos ser necessário. 27 7.1 Vetor - Problemas Problema 5: Uma companhia de energia elétrica dispõem dos dados de consumo mensal de energia elétrica em kWh de uma pequena empresa e deseja determinar algumas estatísticas. Para efeito de planejamento da manutenção e expansão da rede elétrica ela deseja determinar os valores e os meses de maior e menor consumo, bem como o consumo médio. Mês 1 2 3 4 kWh 824 1152 1236 1313 Mês kWh 5 750 6 700 7 728 8 800 Mês 9 10 11 12 kWh 900 1032 1246 1304 28 7.1 Vetor – Problemas: Problema 5 Idéia do Programa 1) Criar um vetor v de 12 elementos e associar o consumo em KWh do mês (i) com a posição (i-1). Ou seja: v[ i -1 ] ↔ consumo em kWh no mês i. Posição Elemento kWh Mês 1 v[0] 824 2 v[1] 1152 3 v[2] 1236 ••• ••• ••• 12 v[11] 1304 Associar posição i com o (i+1) mês 29 7.1 Vetor – Problemas: Problema 5 Idéia do programa 2) Achar o mês de maior consumo = Achar o Maior Elemento do Vetor. Para isso é preciso: 824 v[0] " Criar uma variável maior e guardar nela o primeiro elemento do vetor v. Isto é: maior ← v[0]. " Comparar a variável maior com os demais elementos do vetor v[i]. Se maior < v[i], colocar v[i] na variável maior. 1152 1236 v[1] v[2] ••• 1304 ••• v[11] maior = v[0] = 824 maior > v[1] ? não, então: maior = v[1] = 1152 maior > v[2]? não, então: maior = v[2] = 1236 E assim por diante. 30 7.1 Vetor – Problemas: Problema 5 Idéia do programa 3. Achar o mês de Menor consumo = Achar o Menor Elemento do Vetor. " Idem maior valor " Criar uma variável menor e guardar nela o primeiro elemento do vetor v. Isto é: menor ← v[0]. " Comparar a variável menor com os demais elementos do vetor v[i]. Se menor > v[i], colocar v[i] na variável menor. 31 7.1 Vetor - Problemas Problema 5 – Consumo Energia #include <stdio.h> main() { const int n = 12; int i, imenor, imaior; float v[n], media, maior, menor; media = 0.0; // Leitura dos valores de energia. for(i=0; i < n; i++) { printf(“ Insira kwh %d: ”,i+1); scanf(“%f”,&v[i]); } for(i=0; i < n; i++) // Cálculo média. media=media+v[i]; media=media/n; // Preparando para encontrar o maior e // e o menor valor. maior = menor = v[0]; imaior = imenor = 0; Problema 5 – Continuação // Laço encontra índice e maior valor. for(i=1; i < n; i++) if (v[i] > maior) { maior = v[i]; imaior = i; } // Laço encontra índice e menor valor. for(i=1; i < n; i++) if (v[i] < menor) { menor = v[i]; imenor = i; } // Mostrando valores encontrados. printf(“ Maior Valor = %f no mes %d \n",maior, imaior+1); printf(“ Menor Valor = %f no mes %d \n", v[imenor], imenor+1); printf(“ Valor medio = %f \n”,media); } // fim programa 32 7.1 Vetor - Problemas Problema 5 – Exemplo de Execução 33 7.1 Vetor – Problemas : Problema 6 Problema 6: Criar um programa que simule 60 lançamentos de um dado de 6 faces e armazena o número de vezes que uma face foi sorteada nos elementos de um vetor. Depois, a partir dos valores contidos nos elementos deste vetor construir um histograma, tal como dado a seguir: Face 1 – 10: [][][][][][][][][][] Face 2 – 12: [][][][][][][][][][][][] Face 3 – 8: [][][][][][][][] Face 4 – 10: [][][][][][][][][][] Face 5 – 11: [][][][][][][][][][][] Face 6 – 9: [][][][][][][][][] 34 7.1 Vetor – Problemas: Problema 6 Idéia do programa Posição Criar um vetor v de 6 posições que vai armazenar o no. de vezes que uma face i é sorteada. Elemento Face Então: v[0] vai guardar o no. de vezes que a face 1 foi sorteada. v[1] vai guardar o no. de vezes que a face 2 foi sorteada e assim por diante. Então: v[ i -1 ] ↔ no.de vezes que a face i foi sorteada. # Sorteio 1 v[0] 2 v[1] 3 v[2] 4 v[3] 5 v[4] 6 v[5] Associa a posição i com a face (i+1). 35 7.1 Vetor – Problemas Problema 6 Idéia do programa 1 2 2 4 +1 0 3 3 +1 0 0 +1 0 ••• 60 ••• 6 60 lançamentos +1 0 0 fr[0] fr[1] fr[2] fr[3] fr[4] fr[5] Vetor do número de ocorrências de uma face para 60 lançamentos. 36 7.1 Vetor – Problemas Problema 6 Idéia do programa Gerar uma seqüência de números pseudo- aleatória, ou seja, uma seqüência S que utilize uma fórmula para obter seus termos Sn dentro de um intervalo [a, b], os mesmos não se repetem para um valor suficientemente grande de n. Gerador linear congruencial Sn+1 = (Sn *a + b) mod m onde: é uma boa estratégia usar m, a e b números primos. S0 é a semente Sn+1 será o número aleatório gerado. Uma boa escolha para m, a e b Sn+1 = (Sn* 32749 + 3) mod m 37 7.1 Vetor – Problemas Problema 6 srand(time(0)) Fornece semente S0 Como gerar valores aleatórios em C? Então para gerar valores aleatórios entre [0 e 5], tem-se s = rand( ) Fornece Sn+1 Os números gerados por rand( ) estão no intervalo [0, RAND_MAX], onde: RAND_MAX = 327679719. Para gerar números inteiros no intervalo [a, b-1] usa-se o operador % (resto inteiro da divisão): s = (rand() % b) + a. 38 7.1 Vetor – Problemas Problema 6 Ou seja, operações com O operador % funciona de acordo com o exemplo abaixo: % funcionam como se tivéssemos um relógio: 0 % 6 = 0 6 % 6 = 0 1 % 6 = 1 7 % 6 = 1 2 % 6 = 2 8 % 6 = 2 3 % 6 = 3 9 % 6 = 3 4 % 6 = 4 10 % 6 = 4 5 % 6 = 5 11 % 6 = 5 0 5 1 4 2 0 1 5 3 4 2 3 Por esse motivo, as operações com o operador % são chamadas de aritmética modular ou ainda aritmética do relógio. 13 7 0 5 1 4 2 3 39 7.1 Vetor – Problemas Problema 6 Problema 6 - Continuação Problema 6 – 60 lançamentos #include <stdio.h> #include <time.h> #include <stdlib.h> const int lanc = 60; main() { int fr[6] = {0, 0, 0, 0, 0, 0}; int i, j, face; // Laço para imprimir o histograma //a partir dos valores armazenados //no vetor fr. printf(“ \n\n“); for(i=0; i < 6; i++) { printf(“\bFace %2d-%2d:”,i+1,fr[i]); // Impressão fr[i] vezes do //caractere [] para formar a //freqüência de ocorrência de uma //dada face. // Inicializa gerador aleatório. srand(time(0)); // Laço gera 60 valores em [0,5]. for(i=0; i < lanc; i++) { face = rand( ) % 6; fr[face]++; } for (j=0; j < fr[i]; j++) printf(“[]”); // Criando uma nova linha. } printf(“ \n “); } // fim programa 40 7.1 Vetor - Problemas Problema 6 – Exemplo de Execução 41 7.1 Vetor - Problemas Problema 7: Escreva um programa que solicite ao usuário o número de alunos de uma sala. Depois, de acordo com o valor da nota de cada aluno, deverá ser atribuído um conceito de acordo com a seguinte tabela: Faixa de Valores 9 ≤ Nota ≤ 10 7 ≤ Nota < 9 5 ≤ Nota < 7 3 ≤ Nota < 5 0 ≤ Nota < 3 Conceito A B C D E Por fim, deverá ser fornecido o percentual de notas da turma para cada conceito. 42 7.1 Vetor - Problemas Idéia do programa 1) Criar um vetor notas de dimensão m, onde vn[0] vai guardar a nota do 1º. aluno; vn[1] a nota do segundo aluno e assim por diante. 10.0 8.5 5.5 ••• 0.0 vn[0] vn[1] vn[2] ••• vn[m] 2) Criar um vetor vc[i] de dimensão 5, para guardar a quantidade de cada conceito. Assim vc[0] vai guardar quantos conceitos A tem na turma, vc[1] vai guardar quantos conceitos B tem na turma e assim por diante. Inicialmente vc[i] = 0. 3) Verificar em qual faixa de valores a nota de cada aluno se encontra. Para cada conceito A encontrado, somar mais 1 no vetor vc[0], para cada conceito B encontrado, somar mais 1 em vc[1] e assim por diante. 43 7.1 Vetor - Problemas Idéia do programa 9 ≤ vn[i] ≤ 10 7 ≤ vn[i] < 9 5 ≤ vn[i] < 7 3 ≤ vn[i] < 5 0 ≤ vn[i] < 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 #include <stdio.h> main() main { const int m = 100; int i, num, vc[5] = {0,0,0,0,0}; float tmp, vn[m]; // Leitura do número de alunos. printf(“Entre com no. alunos: “); scanf(“%d”, &num); // Leitura dos valores das notas. for(i=0; i < num; for num i++) { printf(“ Insira nota %d: ”,i+1); scanf(“%f”,&vn[i]); } //construir vetor de conceitos //de acordo com a Tabela. Problema 7 – Continuação for(i=0; i < num; for num i++) { if (vn[i] >= 9.0) vc[0]++; else if (vn[i] >= 7.0) vc[1]++; else if (vn[i] >= 5.0) vc[2]++; else if (vn[i] >= 3.0) vc[3]++; else vc[4]++; } // Mostrar percentual cada conceito. for(i=0; i<5 5; i++) for { // Mostrando percentuais. tmp = (float float(vc[i])*100)/num; float printf(“Conceito%d=%f \n", i, tmp); } } // fim programa 45 7.1 Vetor - Problemas Problema 7 – Exemplo de Execução 46 7.1 Vetor - Problemas Problema 8: Acrescentar ao final do programa que resolve o Problema 7, e depois de mostrar a informação de freqüência em percentual, um histograma tal como elaborado para resolver o Problema 6. O programa deve apresentar os resultados como abaixo. Conceito 1 – 20.00%: [][] Conceito 2 – 20.00%: [][] Conceito 3 – 20.00%: [][] Conceito 4 – 30.00%: [][][] Conceito 5 – 10.00%: [] Número de ocorrências de notas dentro de cada conceito. 47 7.1 Vetor - Problemas Problema 8 – Histograma #include <stdio.h> main() { const int m = 100; int i, j, num, vc[5] = {0,0,0,0,0}; float tmp, vn[m]; // Leitura do número de alunos. printf(“Entre com no. alunos: ”); scanf(“ %d ”, &num); // Leitura dos valores das notas. for(i=0; i < num; i++) { printf(“ Insira nota %d: ”,i+1); scanf(“%f”,&vn[i]); } // Laço para o vetor de concei// tos com o número de notas em // cada faixa de acordo com as // estabelecidas na Tabela. Problema 8 – continuação for(i=0; i < num; i++) { if (vn[i] >= 9.0) vc[0]++; else if (vn[i] >= 7.0) vc[1]++; else if (vn[i] >= 5.0) vc[2]++; else if (vn[i] >= 3.0) vc[3]++; else vc[4]++; } // Mostrar percentual cada conceito. for(i=0; i < 5; i++) { // Mostrando percentuais. tmp = (float(vc[i])*100)/num; printf(“\n Conceito %d=%f",i+1,tmp); // Impressão do Histograma ! for(j=0; j < vc[i] ;j++) printf(“[]”);} } // fim programa 48 7.1 Vetor - Problemas Problema 5 – Exemplo de Execução 49 7.1 Vetor – Problemas – Ordenação de Vetores Problema 9: Ordenação de dados (em ordem crescente ou decrescente) pode ser utilizada para classificar e mostrar os resultados mais significativos obtidos por um buscador Web (Google ou Altavista, por exemplo) para uma dada palavra-chave. Crie um programa que coloca em ordem crescente um vetor de elementos gerados aleatoriamente Um possível algoritmo de ordenação é o Bubble Sort, cujo nome em português é: algoritmo da bolha. Seu funcionamento consiste em fazer os valores maiores “afundarem“ gradualmente até a base do vetor, ao mesmo tempo que os valores menores sobem gradualmente, como as bolhas de ar sobem na água, enquanto os valores maiores afundam para a parte de baixo do vetor. http://www.cs.oswego.edu/~mohammad/classes/csc241/samples/sort/Sort2-E.html http://olli.informatik.uni-oldenburg.de/fpsort/Animation.html 50 7.1 Vetor – Problemas – Ordenação de Vetores " Este é o mais popular dos método de ordenação. O principio básico desta técnica, está na comparação e troca entre dois elementos consecutivos do vetor . O exemplo a seguir nos dá uma idéia de como funciona o algoritmo. " O método começa comparando o primeiro elemento do vetor com o segundo elemento. Se o primeiro elemento for maior, é feito a troca entre os dois. A seguir compara-se o segundo com o terceiro, e assim por diante, até a comparação do penúltimo com o último elemento. 46 46 >15 15 troca 91 15 46 < 91 46 não 91 troca 59 59 62 62 91 > 59 76 76 10 10 troca 93 93 15 15 15 15 46 46 46 46 59 59 59 59 62 62 91 91 > 62 62 62 troca 91 91 > 76 76 76 10 10 troca 93 93 76 91 10 91 > 10 76 troca 10 91 51 93 93 7.1 Vetor – Problemas – Ordenação de Vetores " Observe , no nosso exemplo, que agora o maior elemento do vetor está ocupando a última posição. " 15 46 59 62 76 10 91 93 A seguir recomeça-se a comparar o primeiro elemento do vetor, assim modificado, com o segundo e assim por diante até a comparação do ante antepenúltimo com o penúltimo 15>46? não troca 46>59? não troca 59 > 62 não troca 62>76? não troca 76>10? Troca 15 15 46 46 59 59 62 10 10 62 76 76 91 93 76>91? não troca 91 93 15>46? não troca 15 15 46 46 46>59? não troca 10 10 59 > 10 troca 76 59 62 91 93 59>62? não troca 62>76? não troca 59 62 76 91 93 15>46? não troca 46>10? troca 46>59 não troca 59>62 não troca 15 10 46 59 62 76 91 93 52 7.1 Vetor – Problemas – Ordenação de Vetores " Observe , no nosso exemplo, que os maiores elementos do vetor estão sendo colocados ocupando nas últimas posições. 15 10 46 59 62 76 91 93 15>10? troca 10 46>59? não troca 59 > 62 não troca 62>76? não troca 76>10? Troca 46 15 59 62 15>46? não troca 46<59? não troca 76 91 93 53 7.1 Vetor - Problemas Problema 9 – Bubble Sort #include <stdio.h> #include <time.h> const int n = 10; main() { int i, j, tmp, v[n]; // Geração aleatória dos elementos de v entre [0,n-1] // srand(time(0)); for(i=0; i < n; i++) v[i] = rand()%n; // Impressão de v antes de ordenar. Problema 9 – Bubble Sort for(i=0; i < n-1; i++) for (j=0; j < n-i-1;j++) if (v[j] > v[j+1]) { tmp = v[j]; v[j] = v[j+1]; v[j+1] = tmp; } // Mostrar vetor ordenado. printf(“\n v = ”); for(i=0; i < n; i++) printf(“ [%2d] ”,v[i]); } // fim programa printf(“\n v = ”); for(i=0; i < n; i++) printf(“ [%2d] ”,v[i]); // Laços encadeados que realizam a // ordenação segundo o algoritmo do // Bubble Sort. 54 7.1 Vetor - Problemas Problema 9 – Exemplo de Execução 55 7.1 Vetor - Problemas Problema 10: Um problema freqüente de programação é o de pesquisar um valor-chave, denominado também de chave de pesquisa, em um dado vetor, indicando se o valor existe e qual posição ocupa no vetor. Este processo é chamado de pesquisa e duas técnicas podem ser utilizadas: Pesquisa Linear: Cada elemento do vetor é analisado até encontrar a chave de pesquisa. Encontra-se o índice da posição onde a chave está, ou se chegar ao fim do vetor sem encontrar nada, o valor ( -1) é retornado. (ii) Pesquisa Binária: Supõe que o vetor esta ordenado, de forma que a cada comparação da chave com um elemento, metade do vetor é eliminado. (i) 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 #include <stdio.h> const int n = 14; main() { int i, chave, ind, v[n]; // Digitando a chave de pesquisa. printf(“Entre com a chave: ”); scanf(“%d”, &chave); // Gerar o vetor ordenado v. for(i=0; i < n; i++) v[i] = 2*i; // Impressão dos valores de v. for(i=0; i < n; i++) printf(“%3d ”,v[i]); // Cabeçalho. printf(“\n”); for(i=0; i < n; i++) printf(“----”); printf(“\n”); Problema 10 – Pesquisa Linear // Laços encadeados: Pesquisa Linear. ind = -1; for(i=0; i < n; i++) // Se a chave foi encontrada, então, // armazenar o índice i de v[i]. if (chave == v[i]) { ind = i; break; } // Mostrar resultado. if(ind == -1) printf(“ Chave nao encontrada !\n”); else printf(“Chave no indice: %d \n”,ind); } // fim programa 57 7.1 Vetor – Problemas Problema 10 – Pesquisa Linear Problema 10 – Exemplos de Execução Chave < v[0] Chave = v[0] Chave ⊂ [0,26] mas ∉ Chave = v[13] Chave > v[13] 58 7.1 Vetor – Problemas Problema 11 – Pesquisa Binária Idéia da Pesquisa Binária (supõe vetor ordenado !) 1) Faça a= primeiro índice do vetor. 2) Faça b=último índice do vetor. 3) Calcule o índice k do meio do vetor: k=(a+b)/2 4) Verifique se chave < v[k] Então a chave se encontra entre os elementos v[0] e v[k]. Faça b=k-1, e volte ao passo 3. Senão a chave se encontra entre os elemento v[k] e v[b]. Faça a=k, e volte ao passo 3. 59 7.1 Vetor – Problemas Problema 11 – Pesquisa Binária Idéia da Pesquisa Binária (supõe vetor ordenado !) EX: Seja chave = 10 a=0 v[0] v[1] k=2 v[2] v[3] b=4 v[4] 2 4 8 10 12 a=3 b=4 a=0; b=4 k = (a+b)/2 = 2 Se (chave>v[k]) então o novo intervalo é a=k+1=3 e b=4; senão o novo intervalo é b=k-1=1 e a=0 Se (chave= v[k]) então encontrou o valor. A chave está na posição k Novo intervalo k = (a+b)/2 = 3. chave = v[3], então a chave está na posição 3 do vetor 60 7.1 Vetor – Problemas: Problema 11 – Pesquisa Binária Quadro resumo dos casos para Pesquisa Binária Caso Condição Ações 1 chave < v[k] b = k – 1; k = (a+b)/2; 2 chave = v[k] Retornar k 3 chave > v[k] a = k + 1; k = (a+b)/2; 4 b<a Retornar -1 Imagem 61 7.1 Vetor – Problemas Problema 11 – Pesquisa Binária Problema 11 – Pesquisa Binária Problema 11 – Pesquisa Binária #include <stdio.h> const int n = 14; main() { int i, j, a, b, k, chave, ind, v[n]; // Digitando da chave de pesquisa. printf(“Entre com a chave: ”); scanf(“%d”, &chave); // Preenchendo o vetor ordenado v. for(i=0; i < n; i++) v[i] = 2*i; for(i=0; i < n; i++) //Imprime vetor printf(“%3d ”,v[i]); printf(“\n”); // Imprime cabeçalho for(i=0; i < n; i++) printf(“-----”); printf(“\n”); // Inicializando limites da Pesquisa // Binária e valor do inicial do índice. a = 0; b = n-1; ind = -1; // Laços encadeados: Pesquisa Binária. while(a <= b) {// Enquanto!= Caso4 k = (a+b)/2; for (j=0;j < n;j++) // Imprime vetor if (j < a || j > b) printf(“ ”); else if (j == k) printf(“%3d*”,v[j]); else printf(“%3d ”,v[j]); printf(“\n”); // Tratando os 3 casos existentes. if (chave == v[k]) // Caso 2. { ind = k; break; } else if (chave < v[k]) // Caso 1. b = k – 1; else // Caso 3. a = k + 1; } // Fim do while. if (ind == -1) printf(“Sem Chave\n”); else printf(“Chave - indice:%d\n”,ind); } // fim programa 62 7.1 Vetor – Problemas Problema 11 – Pesquisa Binária 63 7.1 Vetor – Problemas Problema 12: Na FEG existe uma quantidade de alunos matriculados na disciplina PC e na disciplina de Cálculo II. Mas acontece que estas duas disciplinas estão no mesmo horário. É preciso então saber quais são os alunos que estão matriculados nas duas disciplinas ao mesmo tempo. Fazer um programa que seja capaz de imprimir o numero de matricula desses alunos. É dado o número de alunos matriculados em cada disciplina, bem como seus números de matricula. //Programa Simultaneo #include <stdlib.h> #include <stdio.h> main() { int PC[150], CN[220], matrisimult[150]; int NCN,NPC,i, j, k; continua ... 64 7.1 Vetor – Problemas Problema 12: Continuação.... //leitura de dados printf("Digite o numero de alunos cursando PC "); scanf("%d",&NPC); for(i=1; i <= NPC; i++) { printf("Digite o no. de matric do aluno %d, em PC ", i); scanf("%d",&PC[i]); } printf("Digite o numero de alunos cursando CN "); scanf("%d",&NCN); i=1; while (i <= NCN) { printf("Digite o no. de matric do aluno %d, em CN ", i); scanf("%d",&CN[i]); i= i+1; } 65 7.1 Vetor – Problemas Problema 12: continuação . . . //Verificação dos alunos que estão com matrícula simultânea k= 0; for( i= 1;i<= NPC;i++) for (j=1; j<= NCN; j++) if (PC[i]==CN[j]) { k= k+1; matrisimult[k]= PC[i]; } // Escrever o vetor de matricula simultânea printf ("vetor de matricula simultanea\n"); for (j= 1; j<= k; j++) printf(" aluno no. %d \n",matrisimult[j]); system("pause"); } 66 7.1 Vetor – Problemas Problema 13: Fazer um programa em C para ler um vetor A de dimensão N e calcular um vetor B da seguinte maneira: B [1] $ 1 * A [1] B [2] $ 2 * A [2] B [3] $ 3 * A [3] B [4] $ 4 * A [4] ... B [N] $ N * A [N] Em seguida calcular a soma dos elementos de B e imprimir o vetor B. 67 7.1 Vetor – Problemas #include <stdlib.h> // Problema 13 #include <stdio.h> main() { int a[150], b[150], n, i, soma_b; //ler o vetor A printf("quantos elementos tem o seu vetor?"); scanf("%d",&n); for (i=1; i<=n; i++) { printf("digite o elemento %d do vetor A ", i); scanf("%d", &a[i]); } // Gerar o vetor B e for (i=1; i<=n; i++) b[i]= i*a[i]; 68 7.1 Vetor – Problemas //Continuação ..... Problema 13 // calcular a soma de b soma_b =0; for (i=1; i<=n; i++) soma_b= soma_b + b[i]; // imprimir b printf("\n\tVetor B \n"); for (i=1; i<=n; i++) printf("\tb[%d] = %d\n", i,b[i]); printf("\n\tSoma de B = %d\n\n", soma_b); system("PAUSE"); } 69 7.1 Vetor - Problemas Problema 14: Um método de Criptografia consiste em substituir as letras de uma mensagem através do emparelhamento de alfabetos tal como dado abaixo. Construir um programa que codifica mensagens usando este esquema. Alfabeto original a b c d ... v w x y z Alfabeto cifrado B C D E ... W X Y Z A Texto original v e n i v i d i v i c i Texto cifrado W F O J W J E J W J D J 70 7.1 Vetor - Problemas Problema 14– Tabela ASCII #include <stdio.h> main() { int i; // Laço para construir a Tabela ASCII. printf(“Tabela ASCII: \n”); printf(“ int -> char \n”); // A tabela possui 2^8 valores, pois // char é um tipo de 1 byte (8 bits). } for(i=0; i < 255; i++) printf(“ %4d -> %c \n”, i, char(i)); E se imprimir usando (i+1) % 256? e (i+2)%256? O que ocorre ? 71 7.1 Vetor - Problemas (i+1) % 256 Deslocamento do alfabeto (i+2) % 256 72 7.1 Vetor - Problemas // Inicialização. char tmp, texto[1000]; // Ler até encontrar ‘.’ . i = 0; while (i < 1000) { tmp = getche(); if (tmp == '.') break; else { texto[i] = tmp; i++; } // Guardar tamanho da msg. n = i; ••• texto[0] texto[1] ••• texto[100] Mensagem Secreta. M e texto[0] texto[1] ••• a ••• texto[16] n=17 73 7.1 Vetor - Problemas // Inicialização char tmp, texto[1000]; // Ler até ‘.’. Não ler backspace. i = 0; while (i < 1000) { tmp = getche(); if (tmp == '.') break; if (int(tmp) != 8) { texto[i] = tmp; i++; } else i--; } // Guardar tamanho da msg. n = i; Corresponde ao caractere backspace na Tabela ASCII. Mr← ←ensagem Secreta. Mensagem Secreta M e texto[0] texto[1] ••• a ••• texto[16] 74 7.1 Vetor - Problemas Problema 14 – Criptografia #include <stdio.h> #include <conio.h> main() { int i, n; char tmp, texto[1000]; // Armazenando a mensagem. printf(“Entre com a mensagem: ”); i=0; while (i < 1000) { tmp = getche(); // Termina o laço. if (tmp == ‘.’) break; // Se não for backspace, guarde. if (int(tmp) != 8) { texto[i] = tmp; i = i + 1; } else i--; //Backspace: elimina ant.} Problema14– Criptografia n = i; // Tamanho do vetor em n. // Codificando a mensagem. for(i=0; i < n; i++) texto[i] = (texto[i]+1)%256; // Mostrando a mensagem //codificada. printf(“\n Mensagem Codificada:\n”); for (i=0; i < n; i++) { printf(“%c”,texto[i]); } printf(“\n”); } // fim programa 75 7.1 Vetor - Problemas Observe que: M e n s a g e m S e c r e t a N f o t b h f n ! T f d s f u b 76 7.1 Vetor - Problemas Problema 15: Criar um programa que captura uma senha e compara com uma palavra previamente cadastrada. No momento da digitação, a senha não deve aparecer. Somente após a validação da senha é que deverá aparecer a palavra digitada e se a palavra digitada confere com a senha ou não. 77 7.1 Vetor - Problemas // Inicialização. char texto[100], tmp; char senha[100] = “Secreta”; // Ler até encontrar o enter (‘↵’’). i = 0; while( i < 100 ) { tmp = getch(); // Se digitou ↵, pare leitura. if (int(tmp) == 13) break; else {texto[i]=tmp; printf(“*”); i++;} } // Fim while. // Guardar tamanho da msg. n = i; " Lê o caractere do teclado, mas o que foi digitado não aparece na tela. Verifica se foi digitado o enter. É preciso ter cuidado com backspace ! 78 7.1 Vetor - Problemas // Ler até encontrar ‘↵’’. i = 0; while( i < 100 ) { tmp = getch(); // Se digitou ↵, pare leitura. if (int(tmp) == 13) break; else if (int(tmp) != 8) // ≠←. ≠← {printf(“*”); texto[i]=tmp; i++; } else i--; // =← ←. } // Fim for. // Guardar tamanho da msg. n = i; Tratamento do Backspace Palavra Digitada S x ← e c r e t S e c r e t texto 79 7.1 Vetor - Problemas verif = 1; // Supõe que senha = texto. // Tamanho senha igual tamanho texto? if (ns == nt) //nt= tamanho digitado { // Ler até achar letra ≠ ou fim palavras. for (i=0; i < nt; i++) if (texto[i] != senha[i]) { verif = 0; break; } } else // Tamanhos ≠. verif = 0; Caso 1: texto S e c r e t a senha S e c r e t a i 0 1 2 3 4 5 6 Caso 2: texto S e g r e d o senha S e c r e t a texto[2] != senha[2] 80 7.1 Vetor - Problemas Problema 15 – Senha #include <stdio.h> #include <conio.h> main() { int i, verif, nt, ns = 7; char tmp, texto[100]; char senha[100]="secreta"; // Armazenando a senha digitada. printf("Digite a senha "); i=0; while (i < 100) { tmp = getch(); // Termina o laço se for ?. if (int(tmp) == 13) break; else if (int(tmp) != 8) // ??. { printf("*"); texto[i] = tmp; i++; } else { putchar('*'); putchar(' '); putchar(char(8)); i--; } //? } //fim laço Problema 15 – Senha nt = i; // Tamanho digitada em nt. verif = 1; // Supõe texto == senha. // Ver se texto e senha tem tam?==. if (nt == ns) { for (i=0; i < nt; i++) if (texto[i] != senha[i]) { verif = 0; break; } } else verif = 0; // Mostrando mensagem. if (verif) printf("\nSenha Correta ! \n"); else printf("\nSenha incorreta ! \n"); getchar(); } // fim programa 81 7.1 Vetor - Problemas 82 7.2 Dados Estruturados: Matrizes 7.2 Matrizes 83 7.2 Dados Estruturados: Matrizes Matrizes - Definição " Também chamadas conjuntos bidimensionais, contém: – um número fixo de elementos; – todos são do mesmo tipo; – arranjados na forma de tabela de 2 dimensões; 84 7.2 Dados Estruturados: Matrizes Matrizes - Definição Ex.: Uma matriz chamada MAT que tenha m elementos (horizontal) e n elementos (vertical) " 0 1 2 3 4 0 1 2 3 4 ... n-1 * Mat[2][3] ... m-1 85 7.2 Dados Estruturados: Matrizes Matrizes ou Array bidimesionais são estruturas de dados que organizam informações; de mesmo tipo e mesmo nome; em tabelas. Para tanto, são utilizados dois índices, que correspondem a linhas e colunas. Para se acessar ou modificar um elemento da matriz deve-se especificar o nome da matriz seguido de dois números entre colchetes ([ ]), sendo que o primeiro corresponde a linha e o segundo corresponde a coluna relativa a posição que o elemento ocupa na Tabela. 86 7.2 Dados Estruturados: Matrizes Declaração e Atribuição de Matrizes " Declaração int a[ 3 ][ 2 ]; Uma matriz nada mais é que um vetor de duas dimensões, logo a atribuição de valores a uma matriz é feita de modo semelhante atribuição de valores a um vetor. A declaração de um vetor com n dimensões é feita do seguinte modo: tipo nome_do_vetor [dim1][dim2][dim3] ... [dimn] 87 7.2 Dados Estruturados: Matrizes Ex: Declaração de uma matriz de inteiro de dimensão 3x2. main() int mat[3][2]; //3 linhas, cada uma delas com 2 posições Linha 0 Linha 1 Linha 2 Coluna 0 Coluna 1 mat[0][0] mat[1][0] mat[2][0] mat[0][1] mat[1][1] mat[2][1] 88 7.2 Dados Estruturados: Matrizes - Atribuição Inicial " Atribuição Automática Inicial A atribuição inicial é feita da mesma maneira que para vetores de uma só dimensão. Ex: int a[ 3 ][ 2 ] = {1, 1, 2, 2, 3, 3}; Neste exemplo, o vetor tem 3 linha e duas colunas, logo está sendo feita a seguinte atribuição: a[0][0]=1 a[0][1]]=1 a[1][0]=2 a[1][1]=2 a[2][0]=3 a[2][1]=3 Observe que os dois primeiros números da chave estão sendo atribuídos a 1ª. linha, os dois seguintes são atribuídos à segunda linha e os dois últimos são atribuídos a terceira linha.89 7.2 Dados Estruturados: Matrizes - Atribuição Inicial A atribuição inicial também pode ser feita da seguinte maneira Ex: int a[ 3 ][ 2 ] = { {1, 1}, {2, 2}, {3, 3} }; Vetor de tamanho 2x1 Observe que agora existe uma separação por linhas, sendo: {1,1} relativa a 1ª. linha; {2,2} relativa a 2ª. linha e {3,3} relativa a 3ª. linha. Na realidade em C, uma matriz é considerada um vetor de vetores. Então, no exemplo acima: a – É um vetor com 3 elementos (cada elemento é um vetor de 2 inteiros) a[i] – É um vetor de 2 inteiro a[i][j] – É um inteiro que está colocado na posição i, j do vetor a 90 7.2 Dados Estruturados: Matrizes Acesso e Modificação de valores de uma Matriz Matriz Inicial Operações Matriz Final 1 1 a[0][1]=a[0][1]+2 1 3 2 2 a[1][0]=a[0][1]+1 4 2 3 3 12 3 a[2][0]=a[2][0]*a[1][0] 91 7.2 Dados Estruturados: Matrizes Problema 1: Criar programa com uma matriz 3 x 3 de inteiros cujos elementos são da forma a[i][j] = i + j + 1. Imprimir a matriz. # include <stdio.h> # include <stdio.h> main() { int i, j; int a[3][3]; // Colocando valores em a. for (i=0; i < 3; i++) for (j=0; j < 3; j++) a[i][j] = i + j + 1; // Mostra elementos de a-> a[i][j]. for (i=0; i < 3; i++) { for (j=0; j < 3; j++) printf(“ %d ", a[i][j]); puts(“”); } } // fim programa a [ i ] [ j ] = i + j + 1; 1 2 3 a[0][0] a[0][1] a[0][2] 2 3 4 a[1][0] a[1][1] a[1][2] 3 4 5 a[2][0] a[2][1] a[2][2] 92 7.2 Matrizes - Problemas Problema 2: Criar um programa que dado um valor n construa o triângulo de Pascal correspondente até a n-ésima linha. 0 1 2 3 4 5 " 6 O Triângulo de Pascal pode ser calculado usando uma matriz tal que cada elemento é dado por : a[i][j] = a[ i-1 ][ j-1 ]+a[ i-1 ][ j ] 0 1 1 1 1 2 1 2 1 3 1 3 3 1 4 1 4 6 4 1 0 1 0 0 5 1 5 10 10 5 1 1 1 1 0 6 1 6 15 20 15 6 1 2 1 2 1 a[0][0] 0 1 2 a[0][1] a[1][1] 93 7.2 Matrizes - Problemas Para gerar o triângulo basta seguir os seguintes passos: Passo 1: Construir uma matriz nxn de zeros 0 1 2 0 0 0 0 1 0 0 0 2 0 0 0 Passo 2: Preencher a primeira coluna com 1 Passo 3: Obter os demais elementos utilizando: a[i][j] = a[ i-1 ][ j-1 ]+a[ i-1 ][ j ] 0 0 1 1 2 0 1 0 0 1 1 0 0 2 1 0 0 2 0 1 0 0 1 1 1 0 2 1 2 1 94 7.2 Matrizes – Problemas : Problema 2 – Pascal Problema 2 – Pascal Problema 2 – Continuação #include <stdio.h> const int n = 10; main() { int i, j, a[n][n]; // Mostrando os elementos de a. for (i=0; i < n; i++) { for (j=0; j < n; j++) printf(“ %4d ”,a[i][j]); printf(“\n”); } } // fim programa // Inicializando os elementos de a. // Passos 1 e 2. for (i=0; i < n; i++) for (j=0; j < n; j++) if (j == 0) a[i][j] = 1; else a[i][j] = 0; // Demais elementos de a. Passo 3. for (i=1; i < n; i++) for (j=1; j <= i; j++) a[i][j] = a[i-1][j-1]+a[i-1][j]; 95 7.2 Matrizes - Problemas Problema 3: As notas de uma turma são armazenadas em uma matriz de forma que a i-ésima linha contém todas as 4 notas bimestrais de um aluno. Supondo que o 1, 2, 3 e 4 bimestre possuem pesos 1, 2, 1 e 2, respectivamente, calcular e mostrar a média de cada aluno. Idéia do Programa Matriz alunos x notas B1 B2 B3 B4 P1 1 Aluno 1 7.0 3.5 4.0 8.5 P2 2 ••• •••• •• P3 1 Aluno m 2.0 5.5 7.0 9.5 P4 2 * Vetor pesos Vetor médias M1 = 5.8 ••• 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 = ai2 ••• ain ai1 • v11 v21 Primeiro laço Segundo laço ••• vn1 n ri1 = ∑ aik vk1 k =1 i = 1, ..., m 98 7.2 Matrizes - Problemas Problema 3 – Notas Problema 3 – Notas #include <stdio.h> // Supondo uma classe com 10 alunos. const int m = 10; main() { int i, j, k; float soma; float a[m][4], r[m], p[4] = {1,2,1,2}; // Calculo da media e resultado em r. for (i=0; i < m; i++) { soma = 0.0; // Media do aluno i: armazenar a // soma das k notas vezes k pesos. for (k=0; k < 4; k++) soma = soma + a[i][k]*p[k]; // Armazenando as notas. for (i=0; i < m; i++) { printf(“Aluno %d: ”, i+1); for (j=0; j < 4; j++) { printf(“\n Nota %d: ”,j+1); scanf(“%f”, &a[i][j]); } } // Calculo da media do aluno i. } r[i] = soma/6; // Mostrando a media de cada aluno. printf(“ Aluno Media \n“); for (i=0; i < m; i++) printf(“ %4d %4.2f \n”,i+1,r[i]); } // fim programa 99 7.2 Matrizes - Problemas Problema 4: Uma fazenda foi dividida em 3 regiões e para cada uma delas é armazenada em uma matriz a informação da produção, em toneladas de 4 tipos de culturas: milho, soja, feijão e arroz. Os dados de 1 ano são registrados em uma matriz A. Construir um programa que realize as seguintes tarefas: (1) Ler os dados de produção de cada cultura em cada uma das regiões da fazenda. (2) Calcular a produção de grãos de cada região. (3) Calcular a produção de grãos de cada cultura. (4) Calcular o total de grãos produzidos pela fazenda. 100 7.2 Matrizes – Problemas Resolvidos Idéia do Programa Milho Soja Feijão Arroz Uma matriz 3x4 para os dados Região 1 3.0 4.0 2.0 3.0 Região 2 1.0 5.0 4.0 2.0 Região 3 2.0 6.0 3.0 5.0 Milho Soja Feijão Arroz Total região Região 1 3.0 4.0 2.0 3.0 12.0 Região 2 1.0 5.0 4.0 2.0 12.0 Região 3 2.0 6.0 3.0 5.0 16.0 Total cultura 6.0 15.0 9.0 10.0 101 7.2 Matrizes – Problemas Resolvidos Problema 4 – Fazenda #include <stdio.h> const int m = 3; const int n = 4; main() { int i, j, k; float a[m][n], r[m], c[n]; // Armazenando a produção em a. for (i=0; i < m; i++) { printf(“Regiao %d: ”, i+1); for (j=0; j < n; j++) { printf(“\n Cultura %d: ”,j+1); scanf(“%f”, &a[i][j]); } } // Calculo do total para cada região. Problema 4 – Fazenda // Calculo do total para cada cultura. for (j=0; j < n; j++) { c[j] = 0.0; // Valor inicial. // Soma da regiões da cultura i. for (k=0; k < m; k++) c[j] = c[j] + a[k][j]; printf(“Cultura %d: %4f\n”,j+1,c[j]); } } // fim programa for (i=0; i < m; i++) { r[i] = 0.0; // Valor inicial. // Soma das culturas da região i. for (k=0; k < n; k++) r[i] = r[i] + a[i][k]; printf(“Regiao %d: %4f\n”,i+1,r[i]); } 102 7.2 Matrizes – Problemas Resolvidos Problema 5: Para monitorar o desmatamento de uma determinada área são utilizadas imagens produzidas por um satélite. Para tanto, é necessário dividir a área a ser monitorada em sub-áreas e depois atribuir um valor que indica o grau de cobertura vegetal existente em cada sub-área de acordo com a seguinte tabela Cobertura Vegetal Entre 80% e 100% Entre 60% e 80% Entre 40% e 60% Entre 20% e 40% Entre 0% e 20% Valor 5 4 3 2 1 103 7.2 Matrizes – Problemas Resolvidos Ou seja, associa-se uma imagem a uma matriz de valores: 5 5 5 5 5 5 4 5 5 4 3 3 4 4 2 1 Assim, o cálculo do desmatamento de uma área, que consiste em se comparar as diferenças entre duas imagens da área para anos diferentes, pode ser obtido com a soma das diferenças dos elementos de duas matrizes. 104 7.2 Matrizes – Problemas Resolvidos Ano de 2007 Ano de 2006 5 5 5 4 5 5 5 4 5 5 4 3 5 4 2 2 5 4 2 1 - 5 5 4 4 5 4 3 2 5 5 3 1 Matriz de variação da cobertura vegetal = No caso acima pode-se dizer que o desmatamento entre 2006 e 2007 foi da ordem de 4 unidades. 0 0 0 0 0 0 0 -1 0 0 -1 0 0 -1 -1 0 - 4 unidades 105 7.2 Matrizes – Problemas Resolvidos Problema 5: Utilizando as informações anteriores, construir um programa que, dadas duas matrizes A e B correspondentes aos dados de cobertura vegetal de uma área em dois anos consecutivos, imprime uma matriz C de variação da cobertura vegetal, bem como o total de unidades desmatadas. Supor A e B como dadas no exemplo abaixo: 5 5 5 4 5 5 4 3 5 4 2 2 Matriz A 5 4 2 1 - 5 5 5 4 5 5 4 4 5 4 3 2 Matriz B 5 5 3 1 = 0 0 0 0 0 0 0 -1 0 0 -1 0 0 -1 -1 0 - 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; main() {int i, j, soma, c[m][n]; int a[m][n] = {{5,5,5,5}, {5,5,4,4}, {5,4,2,2}, {4,3,2,1}}; int b[m][n] = {{5,5,5,5}, {5,5,4,5}, {5,4,3,3}, {4,4,2,1}}; // Totalizando n. unidades //desmatadas. soma = 0; for (i=0; i < m; i++) for (j=0; j < n; j++) soma = soma + c[i][j]; // Exibindo n. unidades desmatadas. printf(“Cobertura Veg. = %d\n”,soma); } // fim programa // Contabilizando desmatamento em c. for (i=0; i < m; i++) for (j=0; j < n; j++) c[i][j] = a[i][j] - b[i][j]; // Mostrando a matriz c. for (i=0; i < m; i++) { for (j=0; j < n; j++) printf(“ %4d ”,c[i][j]); printf(“\n”); } 107 7.2 Matrizes – Problemas Resolvidos Problema 6: Construir um programa que simule um jogo da velha. O programa deve cumprir os seguintes requisitos: (i) Permitir movimentos alternados de dois jogadores A e B. (ii) Identificar se um movimento pode ser realizado ou não. (iii) Identificar o término de um jogo, indicando as 3 possíveis situações: (1) A ganhou, (2) B ganhou, (3) Empate. (iv) Construir um tabuleiro que permita a representação das jogadas tal como dado abaixo. Jogada de A Espaço livre x o Jogada de B 108 7.2 Matrizes – Problemas Resolvidos Requisito (i): Movimentos alternados de A e B. Requisito (iii): Identificar empate. Variável contadora de jogadas válidas: cont. 0 2 x 3 5 1 o 6 4 8 7 x o x x o x o if (cont%2 == 0) // Movimento de A else // Movimento de B if (cont == 9) // Empate ! 109 7.2 Matrizes – Problemas Resolvidos Requisito (iv): Representação das jogadas. Requisito (ii): Se a jogada pode ser realizada. Matriz de caracteres 0 1 Coordenadas: 0 1 Coordenadas: 1 0 Caractere ‘.’ if (m[i][j] == ‘.’) Pode fazer jogada Coluna 0 Coluna 1 Coluna 2 Linha 1 Linha 2 1 0 x . o . . . . . . Linha 0 110 7.2 Matrizes – Problemas Resolvidos Requisito (iii): Situações de jogadas vencedoras. x x x x x x x x x x x x x x x x x x x x x x x x if (m[0][0] == ‘X’ && m[1][0] == ‘X’ && m[2][0] == ‘X’) 111 7.2 Matrizes – Problemas Resolvidos Problema 6 – Jogo da Velha – Algoritmo Simples // Algoritmo Simples do Jogo da Velha. Passo 1: Criar matriz m de caracteres 3 x 3 cujos elementos são ‘.’. Passo 2: Mostrar estado atual da matriz. Passo 3: Enquanto (True) faça Passo 3.1: Verificar se jogador A fez jogada vencedora. Se sim, pare. O jogador A venceu. Passo 3.2: Verificar se jogador B fez jogada vencedora. Se sim, pare. O jogador B venceu. Passo 3.3: Verificar se a jogada atual é a décima. Se sim, pare. Ocorreu empate. Passo 3.4: Capturar coordenadas i (linha) e j (coluna) da jogada. Se i e j foram válidos então ( ou seja m[i][j]== ‘.’) Passo 3.4.1: Se (jogada de A) preencher a casa com a marca de ‘x’. Senão preencher a casa com a marca ‘o’. Passo 3.4.2: Incrementar uma variável contadora de jogadas. 112 7.2 Matrizes – Problemas Resolvidos Problema 6 – Jogo da Velha Problema 6 – Jogo da Velha #include <stdio.h> #include <stdlib.h> main() {char m[3][3]; int i, j, cont =0; const int TRUE = 1; const char O = 'o', X = 'x'; printf("Digite lin col \n"); // Inicializando a matriz m com ‘.’. for (i=1; i <= 3; i++) for (j=1; j <=3; j++) m[i][j] = '.'; while (TRUE) // Laço infinito. { // Mostrando a matriz m. for (i=1; i <= 3; i++) { for (j=1; j <= 3; j++) printf(" %c ",m[i][j]); printf("\n"); } // Verificando se o jogador A ganhou. if ((m[1][1]==X && m[1][2]==X && m[1][3]==X) || (m[2][1]==X && m[2][2]==X && m[2][3]==X) || (m[1][1]==X && m[2][1]==X && m[3][1]==X) || (m[1][2]==X && m[2][2]==X && m[3][2]==X) || (m[1][3]==X && m[2][3]==X && m[3][3]==X) || (m[3][1]==X && m[2][2]==X && m[1][3]==X) || (m[1][1]==X && m[2][2]==X && m[3][3]==X) ) {printf("Jogador A ganhou !!! \n"); break;} // Verificando se o jogador B ganhou. if ((m[1][1]==O && m[1][2]==O && m[1][3]==O) || (m[2][1]==O && m[2][2]==O && m[2][3]==O) || (m[3][1]==O && m[3][2]==O && m[3][3]==O) || (m[1][1]==O && m[2][1]==O && m[3][1]==O) || (m[1][2]==O && m[2][2]==O && m[3][2]==O) || (m[1][3]==O && m[2][3]==O && m[3][3]==O) || (m[1][1]==O && m[2][2]==O && m[3][3]==O) || (m[1][3]==O && m[2][2]==O && m[3][1]==O) ) {printf("Jogador B ganhou !!! \n\n"); break;} 113 7.2 Matrizes – Problemas Resolvidos Problema 6 – Jogo da Velha (Cont.) if (cont == 9) // Sem jogadas. { printf("\a Empatou !!! \n\n"); break;} // Capturando nova jogada. printf("Digite as Coordenadas: "); scanf("%d %d",&i,&j); if (m[i][j] == '.') // Verifica se Casa está livre ? { if (cont % 2 == 0) // O jogador A é quem jogou. m[i][j] = X; else // O jogador B é quem jogou. m[i][j] = O; // Contado o n. de jogadas. cont++; } // Fim if que verifica casa livre. } // Fim do while. 114 7.2 Matrizes – Problemas Resolvidos Problema 7: Construir um programa que simule o jogo Yucky Choccy. O programa deve cumprir os seguintes requisitos: (i) Permitir movimentos alternados de dois jogadores A e B. (ii) Identificar se um movimento pode ser realizado ou não. (iii) Identificar o término de um jogo, indicando as 2 possíveis situações: (1) A ganhou, (2) B ganhou. (iv) Construir um tabuleiro que permita a representação das jogadas tal como dado abaixo. Barra de sabão Jogada de A Jogada de B 115 7.2 Matrizes – Problemas Resolvidos Requisito (iv): Representação das jogadas. Requisito (ii): Se a jogada pode ser realizada. Matriz de caracteres 0 1 Coordenadas: 0 1 Coordenadas: 1 0 Caractere ‘.’ if (m[i][j] == ‘.’) Pode fazer jogada Coluna 0 Coluna 1 Coluna 2 Linha 1 Linha 2 1 0 x x . x x . x x . Linha 0 116 7.2 Matrizes – Problemas Resolvidos Problema 7 – Yucky Choccy #include <stdio.h> main() {const int m = 4; char A[m][m]; int i, j, lin, col, cont =0; const char O = ‘o’, X = ‘x’; printf(“Digite linha e coluna \n”); // Inicializando a matriz m com ‘.’. for (i=0; i < m; i++) for (j=0; j < m; j++) A[i][j] = ‘.’; while (1) // Laço infinito. { // Mostrando a matriz m. for (i=0; i < m; i++) { for (j=0; j < m; j++) printf(“ %c ”, A[i][j]); printf(“\n”); } Problema 7 – Yucky Choccy // Capturando nova jogada. if (cont%2 == 0) printf(“Jogada de A: ”); else printf(“Jogada de B: ”); scanf(“%d %d”,&lin,&col); // Casa livre ? if (A[lin][col] == ‘.’ &&(lin == 0||col == 0) ) { // É a vez do jogador A. if (cont % 2 == 0) { // Verificando se A perdeu e B ganhou. if (lin == 0 && col == 0) {printf(“ B ganhou ! \n”); break;} } else { // Verificando se B perdeu e A ganhou. if (lin == 0 && col == 0) {printf(“ A ganhou ! \n”); break;} } // Contado o n. de jogadas. cont++; // Modificar elementos da matriz A para117 ‘x’. 7.2 Matrizes – Problemas Resolvidos Problema 7 – Yucky Choccy (Cont.) // Apenas os seguintes elementos serão // modificados: da linha de i até m e da // coluna de i até m. for (i=lin; i < m; i++) for (j=col; j < m; j++) A[i][j] = ‘x’; } // Fim if que verifica casa livre. } // Fim do while. } // Fim main. 118 7.2 Matrizes – Problemas Resolvidos Problema 8: Um veículo submarino autônomo é utilizado para realizar o mapeamento do leito oceânico de uma certa área e a mesma é dividida nas sub-áreas, dada na Figura 1. Cada sub área pode fornecer uma quantidade de insumos (Tabela 1), e cada insumo tem um valor (Tabela 2). Construir um programa que calcula o lucro que pode ser obtido em cada sub-área. Tabela 1 Figura 1 Solo G Tabela 2 QAV Nafta 17.4 Insumo Valor 4.3 2.1 G 4.12 7.1 12.3 8.2 QAV 8.74 2.1 35.6 Nafta 3.78 0.3 119 7.2 Matrizes – Problemas Resolvidos Passo 1: Passo 2: 1 2 2 1 2 3 2 3 1 2 2 1 2 3 2 1 3 3 3 Se área = 1: 1 1 1 3 3 Indíce da linha: 0 17.4 4.3 2.1 6.1 12.3 8.2 2.1 35.6 0.3 * 4.12 8.74 3.78 120 7.2 Matrizes – Problemas Resolvidos Problema 8 – Petróleo Problema 8 – Petróleo #include <stdio.h> const int m = 3; const int n = 4; main() { int i, j, k; float s, C[m][n], v[m] = {4.12, 8.74, 3.78}; int A[m][n] = {{1,1,2,2}, {1,2,3,2}, {1,3,3,3}}; float B[m][m] = {{17.4, 4.3, 2.1}, {6.1, 12.3, 8.2}, {2.1, 0.3, 35.6}}; // Mostrando a matriz C com os lucros. // Varrendo a matriz A e de acordo // com o valor A[i][j], calcular o valor // com B*v e guardar em C[i][j]. printf(“Matriz de lucros \n”); for (i=0; i < m; i++) { for (j=0; j < n; j++) printf(“ [%7.2f] ”,C[i][j]); printf(“\n”); } } // fim programa for (i=0; i < m; i++) for (j=0; j < n; j++) { s = 0.0; for (k=0; k < m; k++) s = s + B[A[i][j]-1][k]*v[k]; C[i][j] = s; } 121 7.2 Matrizes – Problemas Resolvidos Resultado da Execução 1 1 2 2 1 2 3 2 1 3 3 3 122 7.3 Dados Estruturados: Strings 7.3 Strings 123 7.3 Strings - Definições " A linguagem C apresenta algumas limitações no que diz respeito ao tratamento da string, pois diferentemente das outras linguagem, em C a string não é um tipo básico " Logo, em C não é possível atribuir uma string a uma variável ou concatenar uma string a outra utilizando os sinais de atribuição (=) e soma (+) como é possível nas outras linguagens Definição: Na linguagem C uma string é um conjunto de caracteres armazenados num vetor. 124 7.3 Strings - Definições " Em C, as strings são representadas usando aspas, enquanto que os caracteres são representados entre aspas simples Exemplos de strings Exemplos de caracteres “Luis Carlos” ‘L’ “Pedro Henrique” ‘>’ “Receita de Bolo de Chocolate ” ‘B’ " Em C, declaração de strings obedece à sintaxe de declaração de vetores de caracteres. " Para marcar o fim da string , é colocado na ultima posição do vetor, um marcador de final de string 125 7.3 Strings - Definições " Então, em C, strings são seqüências de caracteres adjacentes na memória. O caractere ‘\0’ (= valor inteiro zero) indica o fim da seqüência. Exemplo 1: char aluno[13]; • define um string de nome “aluno” e reserva para ele um espaço de 13 (12 + ‘\0’) bytes na memória. str: aluno 0 \0 12 OBS: No exemplo acima o caractere de fim de seqüência ‘\0’ ocupa a primeira posição do vetor, porque ainda não foi atribuído nenhum caractere ao mesmo. 126 7.3 Strings - Definições Exemplo 2: char nome[16] = “Pindamonhangaba”; " define uma string de nome “nome”, reserva para ele um espaço de memória de 16 (15 + ‘\0’) bytes e o inicia com o texto indicado nome: 15 0 P i n d a m o n h a n g a b a \0 " Os caracteres podem ser individualmente acessados por indexação: " Exemplo 3: nome[0] = ‘P’; nome[10] = ‘n’ 127 7.3 Strings – Leitura e Impressão de Strings " A função printf pode ser utilizada para imprimir cada caractere da string s, ou verificando se n caracteres foram percorridos, ou verificando se o caractere ‘\0’ foi encontrado. Exemplo 4 – Usando n #include <stdio.h> const int n = 100; main() { int i; char s[n] = “Uma string tipica.”; // Varrendo cada componente do //vetor e imprimindo até que i < n. for (i=0; i < 18; i++) printf(“%c”,s[i]); } Exemplo 5 – Usando ‘\0’ #include <stdio.h> const int n = 100; main() { int i; char s[n] = “Uma string tipica.”; // Varrendo cada componente do // vetor e imprimindo até // que s[i] == ‘\0’. for (i=0; s[i] != ‘\0’; i++) printf(“%c”,s[i]); 128 } 7.3 Strings – Entradas e Saídas de Strings " A função printf pode também utilizar a tag %s que é válida para imprimir strings. A função puts também pode ser utilizada para imprimir o conteúdo de strings. Exemplo 6 – Printf + %s #include <stdio.h> const int n = 100; main() { int i; char s[n] = “Uma string tipica.”; // Usando a tag %s e printf. printf(“%s”, s); } printf(“%s”,s); Exemplo 7 – Puts #include <stdio.h> const int n = 100; main() { int i; char s[n] = “Uma string tipica.”; // Impressão usando puts. puts(s); } puts(s); 129 7.3 Strings – Entradas e Saídas de Strings " A função scanf pode ser usada com a tag %s, mas se ela encontrar <TAB>, <ESPAÇO> ou <ENTER> a leitura será interrompida. Exemplo 8 – Scanf #include <stdio.h> const int n = 100; main() { int i; char s[n]; printf(“Entre com uma string:”); scanf(“%s”,s); printf(“\n String digitada: %s”,s); } Só armazenou: “a” Palavra Digitada é: “a vida eh bela !” OBS: Na leitura das variáveis string com a função scanf não se utiliza o & 130 7.3 Strings – Entradas e Saídas de Strings " A função gets pode ser empregada sem se utilizar a tag %s e só ao encontrar <ENTER> a leitura da string será interrompida. Exemplo 9 – gets #include <stdio.h> const int n = 100; main() { int i; char s[n]; printf(“Entre com uma string:”); gets(s); printf(“\n String digitada: %s”,s); } Armazenou: “a vida eh bela !” Palavra Digitada: “a vida eh bela !” 131 7.3 Strings – Problemas Problema 1: Determinar o tamanho de uma string, ou seja, determinar o número de caracteres que ela possui sem contar o caractere especial que delimita o final da string, ‘\0’. Exemplo de Execução: Digite uma string: A vida eh bela! Tamanho da string: 15 A V i d a e h b e l a ! ‘\0’ Os espaços também são contabilizados ! Não contabilizar e indica final da contagem ! 132 7.3 Strings – Problemas Problema 1 – Tamanho String #include <stdio.h> const int m = 100; Exemplo de Execução main() { int i, soma=0; char s[m]; printf(“Digite uma string: ”); gets(s); // Varrendo string até encontrar ‘\0’. for (i=0; s[i] != ‘\0’; i++) soma++; // Impressão do número de carac//teres ou seja do tamanho da string. printf(“Tamanho: %d \n”,soma); } 133 for (i=0; s[i] != ‘\0’; i++) 7.3 Strings – Problemas Problema 2: Dada uma string e um caractere digitados pelo usuário, mostrar o número de ocorrências do caractere na String. Um exemplo de execução do programa é como dado: Exemplo de Execução: Digite uma string: A vida eh bela ! Digite um caractere: a Número de ocorrências: 2 String A Caractere V i d a e h b e l a ! a Número de ocorrências: 2 134 7.3 Strings – Problemas Problema 2 – Ocorrências #include <stdio.h> const int m = 100; main() { int i, soma=0; char ch, s[m]; printf(“Digite uma string: ”); gets(s); printf(“Digite um caractere:”); scanf(“%c”,&ch); // Varrendo string até encontrar ‘\0’. for (i=0; s[i] != ‘\0’; i++) if (s[i] == ch) soma++; // Impressão do número de carac //teres ou seja o tamanho da string. printf(“Ocorrencias: %d \n”,soma); } Exemplo de Execução for (i=0; s[i] != ‘\0’; i++) if (s[i] == ch) 135 7.3 Strings – Problemas Problema 3: Modificar o Problema 2 de modo que o caractere seja contabilizado independentemente se ele é maiúsculo ou minúsculo. Um exemplo de execução do programa é dado por: Exemplo de Execução: Digite uma string: A vida eh bela ! Digite um caractere: a Número de ocorrências: 3 String A Caractere V i d a e h b e l a ! a Número de ocorrências: 3 136 7.3 Strings – Problemas Exemplo de Execução Problema 3 – Ocorrências Mod #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)) // Impressão do número de caracteres // ou seja o tamanho da string. Lembrando que o comando toupper(c) transforma as letras minúsculas contidas em C, em maiúsculas for (i=0; s[i] != ‘\0’; i++) if (toupper(s[i]) == toupper(ch)) soma++; } printf(“Ocorrencias: %d \n”,soma); 137 7.3 Strings – Problemas Problema 4: Construir um programa que substitui todas as ocorrências de um caractere ch1 em uma string por um caractere ch2 : Exemplo de Execução: Digite uma string: RED Code! Digite ch1 e ch2: e * Nova string: R*d Cod* String R Caractere ch1 e Caractere ch2 * String R E D C o d e * D C o d * 138 7.3 Strings – Problemas Problema 4 – Substituição Exemplo de Execução #include <stdio.h> #include <ctype.h> const int m = 100; main() { int i; char ch1, ch2, s[m]; printf(“Digite uma string: ”); gets(s); printf(“Digite ch1 e ch2:”); scanf(“%c%c”,&ch1,&ch2); //Varrendo string até encontrar ‘\0’. for (i=0; s[i] != ‘\0’; i++) if (toupper(s[i]) == toupper(ch1)) s[i] = ch2; // Impressão do número de carac // teres ou seja o tamanho da string. printf(“Nova string %s \n”,s); } if (toupper(s[i]) == toupper(ch)) s[i] = ch2; 139 7.3 Strings – Problemas Problema 5: Construir um programa que contabiliza todas as ocorrências de uma sub-string s1 em uma string s2. Exemplo de Execução: Digite a string: tres pratos de trigo para tres tigres tristes Digite a sub-string: tr Frequencia:4 String s2 t r Sub-string s1 t r e s p r a t o s ••• 140 7.3 Strings – Problemas Problema 5 – Substring #include <stdio.h> #include <ctype.h> const int m = 100; main() {int i, j, k, soma = 0; char s1[m], s2[m]; printf("Digite a string: "); gets(s1); printf("Digite substring:"); gets(s2); // Varrendo string s1 até achar ‘\0’. for (i=0; s1[i]!='\0'; i++) { j= 0; k = i; // Procura s2 em s1 a partir de i. while (s2[j] == s1[k]) { j++; k++; } if (s2[j] == '\0') soma++; } // fim for printf("Ocorrencias: %d \n",soma); getchar(); // para parar a tela } Exemplo de Execução j=0; k = i; while (s2[j] == s1[k]) {j++; k++;} if (s2[j] == ‘\0’) soma++; 141 7.3 Strings – Algumas funções "A biblioteca padrão do C possui diversas funções que manipulam strings. "Estas funções são úteis, pois não se pode, por exemplo, igualar duas strings: string1 = string2; /* NAO faca isto */ " Igualar duas strings é um desastre. Quando você estudar o capítulo que trata de ponteiros você entenderá por que. As strings devem ser igualadas elemento a elemento. " As funções apresentadas nestas seções estão no arquivo cabeçalho string.h. 142 7.3 Strings – Algumas funções 1. Função strcpy() → Sintaxe strcpy(destino,origem); Copia o conteúdo da string origem, na string destino Ex: main(){ char str[80]; strcpy(str,"alo"); puts(str); } Neste exemplo a função strcpy vai copiar a string “alo” na variável str[ ]. A seguir o puts vai imprimir a string que está armazenada em str[ ]. 143 7.3 Strings – Algumas funções 2. Função strcat() → Sintaxe strcat(string1,string2); Concatena a string2 no final da string1. Não verifica tamanho Ex: main() { char um[20],dois[10]; strcpy(um,"bom"); strcpy(dois," dia"); strcat(um,dois); printf("%s\n",um); } Neste exemplo a função strcpy vai copiar a string “bom” na variável um[ ], e a string “dia” na variável dois[ ]. A seguir a função strcat () vai concatenar as duas strings colocando-as na variável um[ ]. O printf vai então, imprimir a frase ”bom dia”. 144 7.3 Strings – Algumas funções 3. Função strcmp() → Sintaxe: strcmp(s1,s2); Compara a string s2 com s1. Se elas forem iguais, devolve o valor 0. Ex: main() { char s[80]; printf("Digite a senha:"); gets(s); if (strcmp(s,"laranja")) printf("senha inválida\n"); else printf("senha ok!\n") ; } Neste exemplo o gets(s) vai armazenar a palavra digitada na variável s. A função strcmp vai comparar a palavra digitada com a string “laranja”. Se elas forem diferentes, vai ser impresso a frase “senha invalida”. Se elas forem iguais vai ser impresso a frase ”senha ok! ”. 145 7.3 Strings – Algumas funções 4. Função strlen( ) → Sintaxe: strlen (string); A função strlen() retorna o comprimento da string fornecida. O terminador nulo “\0” não é contado. Isto quer dizer que, de fato, o comprimento do vetor da string deve ser um a mais que o inteiro retornado por strlen(). Ex:#include <stdio.h> stdio.h> #include <string.h> int main () {int size; char str[100]; printf ("Entre com uma string: "); gets (str); size=strlen (str); printf ("\n\nA string que voce digitou tem tamanho %d",size); return(0);} 146 7.3 Strings – Mais funções Função stricmp Descrição strchr Faz a mesma coisa que a função strcmp (comparação de strings) mas ignorando se os caracteres estão em maiúsculas ou minúsculas. Procura um caractere numa string. strstr Procura uma string dentro da outra. strlwr Converte todos os caracteres de uma string para minúsculas. strupr Converte todos os caracteres de uma string para maiúsculas. 147 7.3 Strings – Matrizes de strings Matrizes de strings " Matrizes de strings são matrizes bidimensionais. Imagine uma string. Ela é um vetor. Se fizermos um vetor de strings estaremos fazendo uma lista de vetores. Esta estrutura é uma matriz bidimensional de chars. " A forma geral de uma matriz de strings é: char nome_da_variável [num_de_strings][compr_das_strings]; Aí surge a pergunta: como acessar uma string individual? Fácil. É só usar apenas o primeiro índice. Então, para acessar uma determinada string faça: nome_da_variável [índice] 148 7.3 Strings – Matrizes de strings Exemplo1: Usando uma Matriz de strings, faça um programa que leia 5 strings e as exiba na tela. #include <stdio.h> main () { char Mat_strings [5][100]; int count; for (count=0;count<5;count++) { printf ("\n\nDigite uma string: "); gets (Mat_strings[count]); } printf ("\n\n\n As strings que voce digitou foram:\n\n"); for (count=0;count<5;count++) printf("%s\n",Mat_strings[count]); getchar(); } 149 7.3 Strings – Matrizes de strings Exemplo 2: Refazer o Exemplo 1 usando o comando scanf para ler a Matriz de strings, para tanto você precisa ler a matriz elemento a elemento, isto é a matriz será lida como caractere. Solução 150 7.3 Strings – Matrizes de strings - Exemplo 2: #include <stdio.h> #include <conio.h> // biblioteca para usar o comando getche main () { char strings [3][100]; Utilizando o getche para 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(); } ler 151 7.3 Strings – Matrizes de strings - Exemplo 2: #include <stdio.h> main () Utilizando { char strings [3][100]; char pare; int j, count; for (count=0;count<3;count++) { printf ("\n\nDigite uma string com enter no final \n "); j=0; scanf("%c",&strings[count][j]); while ((j < 99 )&&(int(strings[count][j]) != 10)) { j++; scanf("%c",&strings[count][j]); } strings[count][j] = '\0'; } printf ("\n\n\nAs strings que voce digitou foram:\n\n"); for (count=0;count<3;count++) printf ("%s\n",strings[count]); getchar(); } scanf para ler 152 7.3 Strings – Matrizes de strings - Exemplo 3 Uma editora deve produzir vários livros e por esta razão ela deseja fazer um relatório contendo: Titulo do Livro a ser editado, numero de páginas, previsão de quantos livros serão vendidos, e o preço de venda de cada exemplar O preço de venda é calculado com base no custo total de produção acrescido de 20%. O custo total de produção é dado pela formula abaixo: custo_produção = custo_fixo + ( previsão_vendas* no._paginas* custo_pagina) preço_venda = (custo_produção/previsão_vendas) * 1.20 Fazer um Programa em C que leia a quantidade de títulos a serem produzidos e os dados relativos a cada título e imprima o relatório desejado. 153 7.3 Strings – Matrizes de strings - Exemplo 3 #include <stdlib.h> #include <stdio.h> main() { int i, j, k,ntitulo; char titulo[100][150]; int vendas_previ[150],npage[150]; float Preco_Venda[150], custo_prod[150],c_fixo[150]; float c_page[150]; printf(" Digite o numero de titulos: "); scanf("%d", &ntitulo); printf("\n\n"); //Ler os dados de cada livro for(i=0; i<ntitulo; i++) { fflush(stdin); printf("Digite o titulo do %d livro:",i+1); gets(titulo[i]); printf("Digite o numero de paginas deste livro: "); scanf("%d", &npage[i]); printf("Digite o custo fixo: "); scanf("%f",&c_fixo[i]); printf(“Qual a previsao de vendas "); scanf("%d", &vendas_previ[i]); printf("Digite o custo de cada pagina: "); scanf("%f",&c_page[i]); printf("\n\n\n"); } for (i=0; i< ntitulo; i++) {//Calcular custos de produção custo_prod[i]=c_fixo[i]+vendas_previ[i] * npage[i] * c_page[i]; //Calcular o preço de venda] Preco_Venda[i]=(custo_prod[i]/ vendas_previ[i])*1.2; } 154 7.3 Strings – Matrizes de strings - Exemplo 3 // Imprimir relatório printf("Título Previsao de Venda for(i=0; i < ntitulo; i++) { Preco Unitario No.pag\n"); 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