Baixe o app para aproveitar ainda mais
Prévia do material em texto
237 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Unidade V Até aqui, vimos os comandos que permitem desenvolver a lógica da programação. Essa lógica só é desenvolvida pela experiência de resolver desafios cada vez mais complexos. As ferramentas foram apresentadas. A partir desta unidade, passaremos a estudar o uso dessa lógica de forma que otimize a programação e manipule os dados. Será praticamente um processo de estudo de casos. Gradualmente, deixaremos de utilizar o pseudocódigo para nos aprofundarmos na linguagem C, pois será necessário o entendimento técnico das situações que serão apresentadas. 5 ESTRUTURA DE DADOS Como as informações estão organizadas dentro do computador, dentro das pastas, dentro dos arquivos? Os dados, de alguma forma, deverão estar dispostos para que seja possível realizar a escrita e a sua posterior recuperação de forma íntegra. Assim, as estruturas de dados são formas otimizadas de armazenamento e tratamento das informações eletronicamente. 5.1 Dados homogêneos Uma estrutura de dados que utiliza somente um tipo de dado é conhecida como de dados homogêneos. Variáveis compostas homogêneas são aquelas em que as posições de memória são identificadas por um mesmo nome e individualizadas por índices, e todos os conteúdos são compostos pelo mesmo tipo. Assim como vimos anteriormente os vetores (também conhecidos como estruturas de dados unidimensionais) e as matrizes (estruturas de dados bidimensionais), segue a estrutura dos dados homogêneos. 5.1.1 Vetores, strings e matrizes A forma mais simples de estruturar um conjunto de dados é por meio de vetores. Utilizamos os vetores quando temos muitas variáveis do mesmo tipo em um programa. Podemos imaginar o vetor como uma “fila” de variáveis do mesmo tipo e do mesmo nome que são identificadas por um número sequencial. Assim, podemos definir um vetor como um conjunto de variáveis exatamente do mesmo tipo que armazena, cada um associado a um número, que se refere à posição de armazenamento e é conhecido como índice. Cada posição do vetor pode ser acessada individualmente de forma direta, podendo ser lida ou escrita diretamente, como uma variável, conforme vimos aprendendo, e sem obedecer a nenhuma regra ou ordem preestabelecida. Assim, os vetores podem ter acesso aleatório. Segundo Laureano (2008): O vetor é uma estrutura de dados linear que necessita de somente um índice para que seus elementos sejam endereçados. É utilizado para armazenar uma 238 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V lista de valores do mesmo tipo, ou seja, o tipo vetor permite armazenar mais de um valor em uma mesma variável. Um dado vetor é definido como tendo um número fixo de células idênticas (seu conteúdo é dividido em posições). Cada célula armazena um e somente um dos valores de dados do vetor. Cada uma das células de um vetor possui seu próprio endereço, ou índice, através do qual pode ser referenciada. Nessa estrutura todos os elementos são do mesmo tipo, e cada um pode receber um valor diferente. Algumas características do tipo vetor: • alocação estática (devem-se conhecer as dimensões da estrutura no momento da declaração) — estrutura homogênea; • alocação sequencial (bytes contíguos) — inserção/exclusão; — realocação dos elementos; — posição de memória não liberada (LAUREANO, 2008, p. 2). 5,5 6,0 7,0 2,5 10,0 9,5 8,0 1 2 3 4 5 6 7 elementos índices Vetor: notas Figura 236 – Vetor contendo notas Nessa figura, temos um vetor de sete posições preenchido com notas. Assim, por exemplo, no elemento de índice 4, temos como conteúdo a nota 2,5; num outro caso, o elemento de índice 6, temos a nota 9,5. Assim, no pseudocódigo, declaramos o vetor conforme segue. Sintaxe: <nome>:vetor[inicio..fim] de tipo A declaração do vetor ilustrado anteriormente fica: algoritmo “classe” var notas:vetor[1..7] de real inicio . . fimalgoritmo 239 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Para fazermos uma atribuição de um elemento do vetor a uma variável, utilizamos a seguinte sintaxe: <variável> <- <nome>[índice] Assim, se fizermos a atribuição NotaPedro<-notas[3], a variável NotaPedro passará a armazenar o valor 7,0. Para fazermos a atribuição de um valor a um elemento do vetor, utilizamos a seguinte sintaxe: <nome>[índice]<-valor Se fizermos a atribuição notas[4]<-8,0, o vetor será: 5,5 6,0 7,0 8,0 10,0 9,5 8,0 1 2 3 4 5 6 7 elementos índices Vetor: notas Figura 237 – Nova situação do vetor Exemplo de aplicação Faça um programa que leia três temperaturas. Em seguida, calcule a temperatura média e a diferença de temperatura de cada uma delas em relação à média. Resolução: Caso fosse pedido um programa para calcular somente a temperatura média, teríamos apenas de fazer uma soma simples e dividir por 3. soma<-0 para i de 1 até 3 faça leia(t) soma<-soma+t fimpara media<-soma/3 O problema, contudo, pede para mostrar a diferença de cada temperatura em relação à média. Não temos como fazer a diferença em apenas um laço, pois a média somente será calculada após a digitação da última temperatura. Assim, já na primeira entrada, é impossível saber a temperatura média, e, se calcularmos a diferença após a última entrada, a informação da primeira temperatura já terá sido apagada. Para solucionarmos esse problema, precisamos usar o vetor, pois dessa forma temos como armazenar e recuperar cada uma das temperaturas dadas como entrada. 240 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V var t: vetor[1..3] de real inicio soma<-0 para i de 1 até 3 faça leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 . . . Uma vez calculada a média, poderemos calcular a diferença de cada temperatura com relação à média. para i de 1 até 3 faça escreva(“diferença “,i,” e “,media-t[i]) fimpara O pseudocódigo inteiro será: algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo 241 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Fazendo o teste de mesa para as temperaturas 9° C, 18° C e 21° C: algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura Figura 238 – A memória do programa Temperatura é inicializada algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca 242 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura t i soma media tela 1 2 3 Figura 239 – Colocação das variáveis na memória As variáveis são colocadas na memória. A variável t tem três posições, pois é um vetor. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteirosoma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura t i soma media tela 1 2 3 0 Figura 240 – Iniciando a variável soma Ao iniciar o programa, a variável soma é inicializada com zero, pois ele irá totalizar as temperaturas digitadas. 243 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura t i soma media tela 1 2 3 1 0 Figura 241 – Início do laço O laço se inicia atribuindo o valor inicial à variável de controle i. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo V 244 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Memoria:Temperatura t i soma media tela 1 2 3 1 0 Figura 242 – Execução do laço Como i<=3, o laço é executado. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura t i soma media tela 1 2 3 1 0 digite a temperatura 1 Figura 243 – Nova execução do laço Como i <=3, o laço é executado novamente. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real 245 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura t i soma media tela 1 2 3 9 1 0 digite a temperatura 1 9 Figura 244 – Realização da primeira leitura A primeira leitura é feita. O valor digitado será atribuído à variável t[i]. Como o conteúdo de i é 1, será armazenado na posição t[1]. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo 246 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Memoria:Temperatura t i soma media tela 1 2 3 9 1 9 digite a temperatura 1 9 Figura 245 – Exibição do valor da soma A soma acumula o valor de t[i]. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura t i soma media tela 1 2 3 9 1 2 9 digite a temperatura 1 9 Figura 246 – Atualização da variável de controle Ao encontrar o fimpara, o programa atualiza a variável de controle, e o fluxo retorna para o controle do laço. 247 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo V Memoria:Temperatura t i soma media tela 1 2 3 9 1 2 9 digite a temperatura 1 9 Figura 247 – Continuação do fluxo no laço Como i vale 2, então o fluxo prossegue dentro do laço. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo 248 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Memoria:Temperatura t i soma media tela 1 2 3 9 18 1 2 0 digite a temperatura 9 digite a temperatura 2 18 Figura 248 – Leitura da segunda temperatura A leitura da segunda temperatura é feita e armazenada na posição t[2], pois a variável i vale 2. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura t i soma media tela 1 2 3 9 18 1 2 9 27 digite a temperatura 1 9 digite a temperatura 2 18 Figura 249 – A variável soma acumula o segundo dado 249 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura t i soma media tela 1 2 3 9 18 1 2 3 9 27 digite a temperatura 1 9 digite a temperatura 2 18 Figura 250 – Atualização da variável de controle Ao encontrar o fimpara, o programa atualiza a variável de controle, e o fluxo retorna para o controle do laço. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo V 250 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Memoria:Temperatura t i soma media tela 1 2 3 9 181 2 3 9 27 digite a temperatura 1 9 digite a temperatura 2 18 Figura 251 – Mais uma iteração é realizada Como 3<=3, é feita mais uma iteração. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 9 27 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Figura 252 – Armazenamento do valor digitado O valor digitado é armazenado na posição t [3]. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro 251 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 9 27 48 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Figura 253 – Acumulação do valor digitado O valor digitado é acumulado na variável soma. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo 252 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 4 9 27 48 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Figura 254 – Atualização da variável de controle Ao encontrar o fimpara, o programa atualiza a variável de controle, e o fluxo retorna para o controle do laço. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo F Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 4 9 27 48 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Figura 255 – O fluxo sai do laço. 253 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Como 4>3, o fluxo do programa sairá do laço. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 4 9 27 48 16 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Figura 256 – O programa executa o próximo comando Ao sair do laço, o programa prossegue executando o comando seguinte, no caso, o cálculo da média (48/3). algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 254 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 4 9 27 48 16 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Media das temperaturas 16 Figura 257 – Atualização da variável de controle Ao encontrar o fimpara, o programa atualiza a variável de controle, e o fluxo retorna para o controle do laço. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo 255 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 4 1 9 27 48 16 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Media das temperaturas 16 Figura 258 – Abertura de um novo laço Uma vez calculada a média, temos condição de calcular as diferenças de temperatura uma a uma. Para isso, novo laço é aberto, utilizando a mesma variável de controle (i). algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara Fimalgoritmo V Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 4 1 9 27 48 16 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Media das temperaturas 16 Figura 259 – Como i é menor ou igual a 3, o laço é executado 256 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 4 1 9 27 48 16 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Media das temperaturas 16 Diferença 1 eh 7 Figura 260 – A primeira diferença é mostrada algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo 257 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 4 1 2 9 27 48 16 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Media das temperaturas 16 Diferença 1 eh 7 Figura 261 – Atualização da variável de controle Ao encontrar o fimpara, o programa atualiza a variável de controle, e o fluxoretorna para o controle do laço. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara Fimalgoritmo V Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 4 1 2 9 27 48 16 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Media das temperaturas 16 Diferença 1 eh 7 Figura 262 – Nova execução do laço 258 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Como 2<3, o laço é novamente executado. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 4 1 2 9 27 48 16 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Media das temperaturas 16 Diferença 1 eh 7 Diferença 2 eh -2 Figura 263 – Apresentação do resultado O programa apresenta o resultado de media – t[2], ou seja, 16 - 18. 259 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 4 1 2 3 9 27 48 16 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Media das temperaturas 16 Diferença 1 eh 7 Diferença 2 eh -2 Figura 264 – Atualização da variável de controle Ao encontrar o fimpara, o programa atualiza a variável de controle, e o fluxo retorna para o controle do laço. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 260 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo V Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 4 1 2 3 9 27 48 16 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Media das temperaturas 16 Diferença 1 eh 7 Diferença 2 eh -2 Figura 265 – Como a condição é Verdadeira, o laço será executado novamente algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo 261 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 4 1 2 3 9 27 48 16 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Media das temperaturas 16 Diferença 1 eh 7 Diferença 2 eh -2 Diferença 3 eh -5 Figura 266 – A terceira diferença de temperatura é exibida algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 4 1 2 3 4 9 27 48 16 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Media das temperaturas 16 Diferença 1 eh 7 Diferença 2 eh -2 Diferença 3 eh -5 Figura 267 – Atualização da variável de controle 262 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Ao encontrar o fimpara, o programa atualiza a variável de controle, e o fluxo retorna para o controle do laço. algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo F Memoria:Temperatura t i soma media tela 1 2 3 9 18 21 1 2 3 4 1 2 3 4 9 27 48 16 digite a temperatura 1 9 digite a temperatura 2 18 digite a temperatura 3 21 Media das temperaturas 16 Diferença 1 eh 7 Diferença 2 eh -2 Diferença 3 eh -5 Figura 268 – Encerramento do laço e passagem para a próxima instrução Como o conteúdo da variável de controle é maior que o limite, o laço é encerrado, e o fluxo do programa executa a instrução seguinte, no caso, a informação do final de programa. 5.1.2 Vetores em C Definimos um vetor em C da seguinte forma: int v[10]; 263 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Observação Devemos tomar cuidado, pois o índice do vetor na linguagem C sempre se inicia em zero. Assim, na declaração anterior, os elementos vão de v[0] até v[9]. Outra característica é que os vetores também podem ser inicializados na declaração: int v[8] = { 15, 1,0,3, 5, 7, 8, 59 }; Ou simplesmente: int v[] = { 15, 1,0, 3, 5, 7,8, 59 }; Assim, o programa aloca, automaticamente, cinco espaços de inteiros na memória. Traduzindo o programa que lê três temperaturas e mostra a diferença de cada uma delas em relação à média: algoritmo “Temperatura” var t:vetor[1..3] de real i:inteiro soma,media:real inicio soma<-0 para i de 1 ate 3 faca escreva(“digite a temperatura “,i) leia(t[i]) soma<-soma+t[i] fimpara media<-soma/3 escreva(“Media das temperaturas”, media) para i de 1 ate 3 faca escreva(“diferença “,i,” eh “,media-t[i]) fimpara fimalgoritmo #include<stdio.h> void main(){ float t[3]; int i; float soma, media; soma=0; for(i=0;i<=2;i++){ printf(“digite a temperatura %d “,i); scanf(“%f”,&t[i]); soma=soma+t[i]; } media=soma/3; printf(“\nMedia das temperaturas %10.2f \n”, media); for(i=0;i<=2;i++) printf(“diferença %d eh %10.2f \n”, i, media-t[i],i); } 264 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Executando o programa, temos: Figura 269 – Saída do programa de cálculo da diferença de temperatura com relação à média 5.1.3 Matrizes Matrizes são vetores multidimensionais; os mais comuns são os bidimensionais. Assim, a matriz bidimensional é uma estrutura de dados que necessita de um índice para referenciar a linha e o outro para referenciar a coluna e localizar o elemento da informação. Sintaxe: <nome>:matriz[inicio..fim][inicio..fim] de tipo 1 2 3 4 1 8,5 7,0 8,5 10 2 3,0 4,0 6,0 5,5 3 7,0 7,5 6,0 5,0 índices elementos Figura 270 – Representação de uma matriz bidimensional A declaração da matriz ilustrada é: algoritmo “classe” var classe:matriz[1..3] [1..4] de real inicio . . . 265 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Para fazermos uma atribuição de um elemento da matriz a uma variável, utilizamos a seguinte sintaxe: <variável> <- <nome>[indice] [indice] Assim, se fizermos a atribuição Aluno1<-notas[1][2], a variável Aluno1 passará a armazenar o valor 7,0. Para fazermos a atribuição de um valor a um elemento da matriz, utilizamos a seguinte sintaxe: <nome>[indice] [indice]<-valor Se fizermos a atribuição notas[3] [4]<-8,0: 1 2 3 4 1 8,5 7,0 8,5 10 2 3,0 4,0 6,0 5,5 3 7,0 7,5 6,0 8,0 índices elementos Figura 271 – Matriz com o elemento alterado 5.1.4 Matrizes em C Na linguagem C, podem ser criadas matrizes bidimensionais. Assim, para declararmos uma matriz de valores reais com três linhas e quatro colunas, fazemos: float classe[3][4]; Ao declararmos a matriz, o C reserva um espaço de memória para armazenar os 12 elementos da matriz, de maneira contínua, organizados linha a linha. Podemos então preencher a matriz na declaração: float classe[3][4] = {{ 8.5, 7.0,8.5,10.0},{ 3.0, 4.0, 6.0, 5.5},{ 7.0, 7.5, 6.0, 5.0}}; Como a linguagem C ignora os caracteres de quebra de linha, para ficar mais fácil de visualizar durante a programação, podemos escrever da seguinte forma: float classe[3][4] = {{ 8.5, 7.0, 8.5,10.0} ,{ 3.0, 4.0, 6.0, 5.5} ,{ 7.0, 7.5, 6.0, 5.0}}; 266 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Outra maneira que a linguagem C permite é declararmos sequencialmente: float classe[3][4] = { 8.5, 7.0, 8.5, 10.0, 3.0, 4.0, 6.0, 5.5, 7.0, 7.5, 6.0, 5.0}; Em razão da particularidade da administração da memória, também podemos escrever da seguinte forma: float classe[][4] = { 8.5, 7.0, 8.5, 10.0, 3.0, 4.0, 6.0, 5.5, 7.0, 7.5, 6.0, 5.0}; Lembrete Como as matrizes são um caso particular de vetores, os índices também se iniciam em zero. Saiba mais O uso típico de matrizes é o jogo da Batalha Naval. No site C Progressivo, é apresentado um exemplo simples do jogo numa matriz 5 x 5. Acesse: JOGO: Batalha Naval em C. C Progressivo, 2012. Disponível em: <http:// www.cprogressivo.net/2012/09/batalha-naval-em-c.html>. Acesso em: 28 maio 2014. 5.1.5 Cadeias de caracteres em C As cadeias de caracteres em C (strings) são representadas por vetores do tipo char terminadas, obrigatoriamente, pelo caractere nulo (‘\0’). Sempre que ocorrer o armazenamento de uma cadeia, será necessário reservar um elemento adicional para o caractere de fim da cadeia. Todas as funções que manipulam strings (dos quais veremos alguns) recebem como parâmetro um vetor de char e processam caractere por caractere, até encontrarem o caractere nulo, que sinaliza o final da cadeia. Para imprimirmos uma cadeia pela função printf, é necessário o especificador de formato %s. A função, na verdade, recebe um vetor de char e imprime elemento por elemento, até encontrar o caractere nulo (‘\0’). 267 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO O exemplo a seguir ilustra a representação de uma string. Como queremos representar a palavra Unip, composta por quatro caracteres, declaramos um vetor com dimensão 5 (um elemento adicional para armazenarmos o caractere nulo no final da cadeia). O código preenche os elementos do vetor, incluindo o caractere ‘\0’, e imprime a palavra na tela. #include<stdio.h> void main () { char faculdade[5]; faculdade [0] = ‘U’; faculdade [1] = ‘n’; faculdade [2] = ‘i’; faculdade [3] = ‘p’; faculdade [4] = ‘\0’; printf(“%s \n”, faculdade); } Ao executarmos, obtemos o seguinte resultado: Figura 272 – Saída do programa com uma string montada em um vetor Se o ‘\0’ não fosse colocado, a função printf não encontraria o fim da cadeia, e o programa mostraria os caracteres que eventualmente restam na memória até encontrar um ‘\0’. Figura 273 – A função de impressão não reconhece o fim de caractere 5.1.6 Caracteres em C A linguagem C não oferece especialmente um tipo caractere. Os caracteres são representados por números inteiros que são convertidos em caracteres no momento da exibição. O tipo char armazena valores inteiros do tamanho de 1 byte, 8 bits, podendo então representar valores que variam de -128 a 127. 268 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Lembrete A correspondência entre os caracteres e seus códigos numéricos é feita por uma tabela de códigos, a tabela ASCII, vista anteriormente (Tabela 6). A diferença entre caracteres e inteiros, em C, acontece apenas no tratamentos destes. Assim, podemos imprimir um mesmo valor de duas formas diferentes, desde que os formatos sejam diferentes. Por exemplo: #include<stdio.h> void main () { char c = 97; printf(“%d %c\n”,c,c); } Resulta em: Figura 274 – Diferença entre %c e %d na saída Como o número 97 corresponde ao caractere a, o printf, ao mostrar na tela a variável c no formato %d, exibe o conteúdo numérico, pois o formato é de número inteiro, e, para a letra a, quando encontra o formato %c, exibe o caractere correspondente ao número 97. 5.1.7 Manipulação de strings A linguagem C, para manipular strings e caracteres, fornece algumas bibliotecas. Essas bibliotecas dão algumas funções extras, além do scanf e do printf, para entrada e saída de caracteres e cadeias. • Função putchar(): a função putchar() (put character) da biblioteca stdio.h imprime um caractere na saída-padrão (em geral, o monitor de vídeo). • Função getchar(): a função getchar() (get character) da biblioteca stdio.h lê um caractere do teclado, ou arquivo. Se ocorrer um erro ou uma condição de “fim de arquivo” durante a leitura, a função retornará o valor da constante simbólica end of file (EOF) definida na biblioteca stdio.h, permitindo facilmente a detecção de finais de arquivos. Essa função não retorna valores até que o caractere de controle enter (\n) seja lido. Exemplo: o programa a seguir mostra o uso das funções 269 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO getchar() e putchar() em um programa que lê caracteres do teclado e os reimprime convertidos para maiúsculos. #include <stdio.h> void main(){ char c; printf(“\nDigite uma frase:\n”); do{ c = getchar(); // leitura do ‘buffer’ if(c >= 97 && c <= 122){ // se c e’ minusculo... c -= 32; // ...transforma em maiusculo } putchar(c); // impressao dos caracteres maiusculos }while (c != ‘\n’); } Figura 275 – Uso do getchar e do putchar • Funções getch() e getche(): A função getch() (get character) da biblioteca stdio.h lê os códigos de teclado. Isso envolve não só os caracteres ASCII, mas também as teclas de comandos ([enter], [delete], [Page Up], [F1] etc.) ou combinações de teclas ([Alt] + [A], [Shift] + [F1], [Ctrl] + [Page Down] etc.). A função getch() aguarda que uma tecla, ou combinação de teclas, seja pressionada, recebe do teclado o código correspondente e retorna esse valor. A função getche() (get character and echoes), além de receber o código, ecoa, no dispositivo de saída, o caractere correspondente. Quando nos códigos especiais são pressionadas certas teclas, ou combinações destas, que não são caracteres ASCII, o teclado envia ao buffer de entrada do computador dois códigos, sendo o primeiro sempre 0, seguido do código correspondente. Por exemplo, sea tecla F1 for pressionada, os valores 0 e 59 serão armazenados, e a função deverá ser chamada duas vezes para ler os dois códigos. Exemplo: um programa para a leitura de teclado que usa a função getch() para reconhecer teclas e combinações de teclas. #include <conio.h> #include <stdio.h> void main(){ int c,d; printf(“\n Pressione uma tecla ou combinacao de teclas:”); printf(“\n Pressione [esc] para terminar! \n”); 270 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V do{ // faz... c = getch(); // leitura do primeiro codigo. if(c == 0){ // se for codigo extendido... d = getch(); // le segundo codigo. printf(“%3d %3d codigo extendido\n”,c,d); } else{ printf(“%3d codigo normal\n”,c); }; }while (c != 27); // ...enquanto nao for [esc] } Ao digitarmos Ctrl-Alt-x e depois o caractere u e a tecla Esc, teremos o seguinte resultado: Figura 276 – Uso do getch • Função puts (): a função puts () (put string) da biblioteca stdio.h mostra uma string na tela acrescentando um enter (\n) ao final. • Função gets(): a função gets()(get string) da biblioteca stdio.h lê uma string do teclado até o operador digitar o enter. Exemplo: #include <stdio.h> void main() { char cadeia[256]; printf (“Escreva o seu nome: “); gets(cadeia); puts(cadeia); }. Testando com o exemplo Joaquim Santos, temos: 271 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Figura 277 – Saída usando gets e puts • Função strlen(): a função strlen() (string length), da biblioteca string.h, retorna o tamanho de uma cadeia. Conta a quantidade de caracteres até encontrar um nulo (\0) e não o conta. Exemplo: o programa retorna o tamanho da cadeia digitada. #include <stdio.h> #include <string.h> void main(){ int tam; char str[100]; printf(“Digite string:”); gets(str); tam=strlen(str); printf(“Tamanho da string eh: %d\n”, tam); } A biblioteca usada é a string.h. O resultado é: Figura 278 – Contando a quantidade de caracteres • Função strcat(): a função strcat() (string concatenate), da biblioteca string.h, tem duas cadeias concatenadas (unidas uma após a outra). A função recebe duas strings como argumento e copia a segunda string no final da primeira. Exemplo: fazer um programa que junte duas cadeias. #include <string.h> #include <stdio.h> void main(){ char cadeia1[100], cadeia2[50]; puts (“Digite String1: “); gets(cadeia1); puts(“Digite String2”); 272 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V gets(cadeia2); strcat(cadeia1, cadeia2); puts(cadeia1); } Figura 279 – Fazendo a concatenação de caracteres • Função strcpy(): O strcpy (string copy) é uma função da biblioteca string.h que copia uma string em uma variável. Ao contrário da função strcat, que faz a concatenação, essa função sobrescreve a cadeia caso esta já tenha um valor armazenado. Exemplo: #include <string.h> #include <stdio.h> void main(){ char str1[100], str2[100], str3[100]; puts (“Digite string: “); gets(str1); strcpy(str2, str1); strcpy(str3, “Você digitou string:”); printf(“%s %s\n”, str3, str2); } Nesse programa, a saída é dada por duas variáveis, e nenhuma delas foi a variável em que foi dada a entrada. O resultado do programa é: Figura 280 – Saída da função strcpy • Função strcmp(): na função strcmp() (string compare), da biblioteca string.h, duas cadeias são comparadas. A comparação é feita caractere a caractere, até encontrar a primeira diferença entre eles; conforme a diferença, a função devolve um valor diferente, usando o seguinte critério: 273 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO — < 0, se cadeia1 < cadeia2; — = 0, se cadeia1 = cadeia2; — >0, se cadeia1 > cadeia2. Exemplo de aplicação Executar o programa a seguir: #include <stdio.h> #include <string.h> void main(){ printf(“%d \n”, strcmp (“A”, “A”)); printf(“%d \n”, strcmp (“A”, “B”)); printf(“%d \n”, strcmp (“B”, “A”)); printf(“%d \n”, strcmp (“C”, “A”)); } Resultado: Figura 281 – Comparações entre caracteres 5.2 Dados heterogêneos Uma estrutura de dados é chamada de heterogênea quando envolve a utilização de mais de um tipo básico de dado, que é chamado de registro, em certos casos. Segundo Laureano (2008), um registro é uma estrutura de dados que agrupa dados de tipos distintos. Um registro de dados é composto por certo número de campos de dados, que são itens de dados individuais. Registros são conjuntos de dados logicamente relacionados, mas de tipos diferentes (numéricos, lógicos, caractere etc.) [, 1, 4] (LAUREANO, 2008, p. 16). 274 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Assim como existem tipos predefinidos, como inteiro, real, cadeia e lógico, podemos dizer que, ao usarmos registros, estamos criando um novo tipo de dado. Assim, antes da declaração das variáveis, temos de definir os novos tipos que estão sendo criados para depois serem declarados como variáveis. Sintaxe: Tipo IDENTIFICADOR = registro campo1 : tipo; campo2 : tipo; campoN : tipo; fimregistro; var variável : IDENTIFICADOR; Onde: • IDENTIFICADOR: representa o nome associado ao tipo registro construído; • campo1, campo2, campoN: são os nomes associados a cada campo do registro. Da mesma forma que na declaração de vetores e matrizes, primeiro, devemos criar um tipo, para então declararmos as variáveis desse tipo. Para atribuirmos ou recebermos valores, referimo-nos às variáveis na forma: variável.campo Por exemplo: Algoritmo ”classe” Tipo ficha = registro Nome : cadeia; sexo : Caracter; Idade : inteiro; fimregistro; var Aluno, Professor : Ficha; inicio Aluno.nome<-”Elomar”; Professor.Nome<-”Olavo”; escreva(professor.nome,aluno.nome); fimalgoritmo. 275 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO 5.2.1 Estrutura em C Em C, o tipo registro é conhecido como estrutura. Uma estrutura em C serve basicamente para agrupar diversas variáveis em um único contexto. A sintaxe para a definição de uma estrutura é mostrada a seguir: struct <nome> { tipo <nome1>; tipo <nome2>; tipo <nome3>; tipo <nome4>; }; Exemplo de aplicação Definir um tipo que represente um ponto no plano cartesiano: struct ponto { float x; float y; }; A estrutura, uma vez criada, passa a ser utilizável dentro do programa, atuando como variáveis. typedef struct <nome da estrutura> <var1>, <var2> ... ; Utilizando a estrutura do ponto, fazer um triângulo com os pontos p1 = (0,0), p2 = (1,1) e p3 = (1,0) no plano cartesiano. #include <stdio.h> struct ponto { float x; float y; }; void main(){ typedef struct ponto p1,p2,p3; p1.x=0; p1.y=0; p2.x=1; p2.y=1; p3.x=1; p3.y=0; } 276 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Observação Em razão da forma pela qual a linguagem C processa o programa, a criação e a declaração de um registro e de suas variáveis podem ser feitas da seguinte maneira: typedef truct ponto { float x; float y; }p1, p2, p3; 5.2.2 Tipo união As uniões são usadas quando armazenamos valores de tipos diferentes compartilhando um mesmo espaço de memória. union exemplo { int i; char c; } Assim como na declaração da estrutura, a declaração da união não declara nenhuma variável, apenas define o tipo união. Assim, uma vez definida a união, é necessário declaramos variáveis do tipo união: union exemplo v; Na variável v, os campos i e c usam o mesmo espaço de memória.O operador ponto (.) é usado para acessar diretamente a variável, e o operador seta (->), para acessá- los por meio de um ponteiro (que veremos mais adiante). v.i = 10; ou v.c = ‘x’; 5.3 Modularização Quando temos um programa muito grande, muitas vezes, torna-se difícil acompanharmos a lógica ali empregada. Com o uso das funções, podemos dividir grandes tarefas de computação em tarefas menores. A criação de funções evita a repetição de código. Quando um procedimento é repetido 277 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO diversas vezes, deve ser transformado numa função, que será chamada diversas vezes. Um programa bem-estruturado deve ser pensado no que se refere a funções fora do corpo principal do programa. Tal processo se chama modularização. 5.3.1 Teoria Imaginemos um programa que repete várias vezes uma sequência que limpa a tela, desenha um logotipo nessa tela e apresenta o nome do usuário em um canto da mesma tela durante a execução de um programa. Programa principal . . Limpa a tela Desenha imagens Mostra o nome do Usuario . . Limpa a tela Desenha imagens Mostra o nome do Usuario . . Limpa a tela Desenha imagens Mostra o nome do Usuario. . . Como existe constante repetição, podemos fazer o processo de modularização, criando um pequeno programa com a sequência de limpar a tela, desenhar as imagens e mostrar o nome do usuário, e chamá-lo do programa principal. 278 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Procedimento MontaTela Limpa a tela Desenha as margens Mostra o nome do usuario Programa principal . . . Montatela . . . Montatela . . . Montatela Dessa forma, o programa principal fica mais limpo, pois as instruções repetitivas e desnecessárias estão no procedimento. 5.3.2 Funções e procedimentos A diferença entre uma função e um procedimento é o fato de a função retornar um valor, e o procedimento, não. No pseudocódigo o procedimento é declarado antes do início do programa principal. Algoritmo “<nome do algoritmo>” Var <declaração de variáveis do algoritmo> procedimento <nome> (<lista de parâmetros>:<tipos dos parâmetros>) inicio comandos fimprocedimento Inicio comandos fimalgoritmo Veja o algoritmo a seguir, que utiliza um procedimento que calcula a área de um triângulo: 279 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO algoritmo “Procedimentos” var procedimento areatri (h,b : real) //declaração do procedimento var area:real inicio area <- (b*h)/2 escreva(area) fimprocedimento inicio areatri(2,6) //chamada ao procedimento areatri(4,6) //chamada ao procedimento fimalgoritmo Assim, para fazermos o teste de mesa: procedimento areatri (h,b : real) //declaração do procedimento var area:real inicio area <- (b*h)/2 escreva(area) fimprocedimento algoritmo “Procedimentos” var inicio areatri(2,6) //chamada ao procedimento areatri(4,6) //chamada ao procedimento fimalgoritmo Pilha Tela Memoria Procedimentos Pilha Figura 282 – Início do fluxo do programa 280 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V O fluxo do programa se inicia no algoritmo principal. Existe uma nova coluna chamada pilha. Nesse programa, ela não terá tanta importância, mas será muito importante em programas futuros, mais complexos. procedimento areatri (h,b : real) //declaração do procedimento var area:real inicio area <- (b*h)/2 escreva(area) fimprocedimento algoritmo “Procedimentos” var inicio areatri(2,6) //chamada ao procedimento areatri(4,6) //chamada ao procedimento fimalgoritmo Pilha Tela Memoria Procedimentos Pilha Figura 283 – Execução da primeira instrução procedimento areatri (h,b : real) //declaração do procedimento var area:real inicio area <- (b*h)/2 escreva(area) fimprocedimento algoritmo “Procedimentos” var inicio areatri(2,6) //chamada ao procedimento areatri(4,6) //chamada ao procedimento fimalgoritmo 281 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Pilha Tela Memoria Procedimentos Pilha areatri (2,6) Figura 284 – Estabelecimento dos parâmetros O programa chama o procedimento, passando 2 como primeiro parâmetro e 6 como segundo parâmetro. procedimento areatri (h,b : real) //declaração do procedimento var area:real inicio area <- (b*h)/2 escreva(area) fimprocedimento algoritmo “Procedimentos” var inicio areatri(2,6) //chamada ao procedimento areatri(4,6) //chamada ao procedimento fimalgoritmo Memoria areatri h b 2 6 Pilha Tela Memoria Procedimentos Pilha areatri (2,6) Figura 285 – Abertura da área de memória 282 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V O programa abre uma área de memória criando as variáveis que recebe como parâmetros do programa que o chama e passa a executar o procedimento. procedimento areatri (h,b : real) //declaração do procedimento var area:real inicio area <- (b*h)/2 escreva(area) fimprocedimento algoritmo “Procedimentos” var inicio areatri(2,6) //chamada ao procedimento areatri(4,6) //chamada ao procedimento fimalgoritmo Memoria areatri h b area 2 6 Pilha Tela Memoria Procedimentos Pilha areatri (2,6) Figura 286 – Criação das variáveis na memória Como em qualquer programa, as variáveis declaradas no procedimento são criadas na memória. procedimento areatri (h,b : real) //declaração do procedimento var area:real inicio area <- (b*h)/2 escreva(area) fimprocedimento algoritmo “Procedimentos” var inicio areatri(2,6) //chamada ao procedimento areatri(4,6) //chamada ao procedimento fimalgoritmo 283 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Memoria areatri h b area 2 6 6 Pilha Tela Memoria Procedimentos Pilha areatri (2,6) Figura 287 – O procedimento executa o primeiro comando procedimento areatri (h,b : real) //declaração do procedimento var area:real inicio area <- (b*h)/2 escreva(area) fimprocedimento algoritmo “Procedimentos” var inicio areatri(2,6) //chamada ao procedimento areatri(4,6) //chamada ao procedimento fimalgoritmo Memoria areatri h b area 2 6 6 Pilha Tela 6 Memoria Procedimentos Pilha areatri (2,6) Figura 288 – Escrita do resultado O fluxo segue para o segundo comando, escrevendo o resultado na tela. 284 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V procedimento areatri (h,b : real) //declaração do procedimento var area:real inicio area <- (b*h)/2 escreva(area) fimprocedimento algoritmo “Procedimentos” var inicio areatri(2,6) //chamada ao procedimento areatri(4,6) //chamada ao procedimento fimalgoritmo Memoria areatri Pilha Tela 6 Memoria Procedimentos Pilha areatri (2,6) Figura 289 – Liberação da memória e eliminação da chamada do programa principal Com o fim do procedimento, a memória é liberada, e a chamada do programa principal é eliminada da pilha. procedimento areatri (h,b : real) //declaração do procedimento var area:real inicio area <- (b*h)/2 escreva(area) fimprocedimento algoritmo “Procedimentos” var inicio areatri(2,6) //chamada ao procedimento areatri(4,6) //chamada ao procedimento fimalgoritmo 285 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃOMemoria areatri Pilha Tela 6 Memoria Procedimentos Pilha areatri (2,6) areatri (4,6) Figura 290 – Chamada do procedimento e mudança dos parâmetros No comando seguinte do programa principal, novamente, o procedimento areatri é chamado, passando como parâmetros 4 e 6. procedimento areatri (h,b : real) //declaração do procedimento var area:real inicio area <- (b*h)/2 escreva(area) fimprocedimento algoritmo “Procedimentos” var inicio areatri(2,6) //chamada ao procedimento areatri(4,6) //chamada ao procedimento fimalgoritmo Memoria areatri h b 4 6 Pilha Tela 6 Memoria Procedimentos Pilha areatri (2,6) areatri (4,6) Figura 291 – Criação da memória e estabelecimento de parâmetros 286 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V O programa cria a memória areatri e as suas variáveis, que vieram como parâmetros. procedimento areatri (h,b : real) //declaração do procedimento var area:real inicio area <- (b*h)/2 escreva(area) fimprocedimento algoritmo “Procedimentos” var inicio areatri(2,6) //chamada ao procedimento areatri(4,6) //chamada ao procedimento fimalgoritmo Memoria areatri h b area 4 6 Pilha Tela 6 Memoria Procedimentos Pilha areatri (2,6) areatri (4,6) Figura 292 – A variável área é criada no procedimento areatri procedimento areatri (h,b : real) //declaração do procedimento var area:real inicio area <- (b*h)/2 escreva(area) fimprocedimento algoritmo “Procedimentos” var inicio areatri(2,6) //chamada ao procedimento areatri(4,6) //chamada ao procedimento fimalgoritmo 287 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Memoria areatri h b area 4 6 12 Pilha Tela 6 Memoria Procedimentos Pilha areatri (2,6) areatri (4,6) Figura 293 – O cálculo é executado procedimento areatri (h,b : real) //declaração do procedimento var area:real inicio area <- (b*h)/2 escreva(area) fimprocedimento algoritmo “Procedimentos” var inicio areatri(2,6) //chamada ao procedimento areatri(4,6) //chamada ao procedimento fimalgoritmo Memoria areatri h b area 4 6 12 Pilha Tela 6 12 Memoria Procedimentos Pilha areatri (2,6) areatri (4,6) Figura 294 – O resultado é exibido na tela 288 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V procedimento areatri (h,b : real) //declaração do procedimento var area:real inicio area <- (b*h)/2 escreva(area) fimprocedimento algoritmo “Procedimentos” var inicio areatri(2,6) //chamada ao procedimento areatri(4,6) //chamada ao procedimento fimalgoritmo Pilha Tela 6 12 Memoria Procedimentos Pilha areatri (2,6) areatri (4,6) Figura 295 – O programa é encerrado Observação Muitas vezes, já tínhamos usado funções e procedimentos sem nomeá- los. Assim, comandos como leia() e escreva() são, na verdade, procedimentos em que a programação já vem feita na biblioteca básica de uma linguagem. Lembrete A diferença entre função e procedimento é o fato de a função retornar um valor. É importante a declaração do tipo de valor que uma função retorna. Uma função não pode ora retorna um número, ora retornar uma cadeia. Em virtude desse fato, é obrigatório declarar no cabeçalho da função qual o tipo que esta retorna. 289 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Sintaxe: Algoritmo “<nome do algoritmo>” Var <declaração de variáveis do algoritmo> Função <nome> (<parâm1>:<tipo>,<parâm2>:<tipo>): <tipo de retorno> Var <declaração das variáveis locais da função> Inicio <comandos> retorne <valor de retorno> fimfuncao Inicio <corpo do algoritmo> fimalgoritmo No fim do cabeçalho da função, é feita a declaração do tipo de retorno. Esse tipo de retorno deve corresponder ao tipo do valor de retorno. O uso da função a partir desse ponto passará a ser crucial no curso, pois esta passará a fazer parte da estrutura de quase todos os programas. Exemplo de aplicação Fazer um programa para calcular a quantidade de combinações simples. A fórmula matemática da combinação é: Ca,b = a! b!(a – b)! Assim, tomando a combinação de três elementos dois a dois, temos: C3,2 = 3! = 3 2!(3 – 2)! Se considerarmos o conjunto de combinações de três letras (a, b, c) tomando-as duas a duas, independentemente da ordem, teremos (a, b), (a, c) e (b, c), ou seja, três. 290 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Para montarmos o programa, como já vimos em laços, podemos montar os três fatoriais (a!, b! e (a-b)!) e fazer as operações entre eles. O programa montado da forma tradicional ficará: algoritmo “Combinacao” var a,b,fat,fata,fatb,fatab,i:inteiro combinacao:real inicio leia(a) leia(b) fat<-1 para i de 1 ate a faca fat<-fat*i fimpara fata<-fat fat<-1 para i de 1 ate b faca fat<-fat*i fimpara fatb<-fat fat<-1 para i de 1 ate a-b faca fat<-fat*i fimpara fatab<-fat combinacao<-fata/(fatb*fatab) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Em caso de dúvida, a proposta é fazer um teste de mesa. Supondo que o programa esteja certo, podemos observar que o seguinte trecho se repete durante esse programa: fat<-1 para i de 1 ate ? faca fat<-fat*i fimpara fata<-fat É interessante, portanto, transformá-lo em uma função. Como o retorna será fat, um número inteiro, e onde está a interrogação, um número que será o fatorial a ser calculado, podemos montar a seguinte função: 291 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao Tipo de saida Parâmetro de entrada De agora em diante, sempre que necessitarmos calcular o fatorial, poderemos utilizar a função criada. x<-fatorial(6) x receberá o valor 720. ou: Escreva(fatorial(5)) O número 120 será exibido na tela. Dessa forma, podemos utilizar a função para resolver de uma maneira elegante o programa proposto. algoritmo “Combinacao” funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo 292 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V O programa principal é apenas: inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Isso deixa claro que o cálculo é fatorial(a)/(fatorial(b)*fatorial(a-b)), ou seja, a linearização de: a! b!(a – b)! Fazendo o teste de mesa para 3 e 2, temos: funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo 293 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / Már ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Pilha Tela Memoria: Combinação Pilha Figura 296 – O programa principal se inicia separando a memória para ele funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Pilha Tela Memoria: Combinação a b combinação Pilha Figura 297 – As variáveis do programa principal são criadas 294 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha Figura 298 – Os valores de entrada são lidos do dispositivo de entrada funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var 295 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a) Figura 299 – A função fatorial é chamada com o parâmetro 3 funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo 296 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Memoria fatorial n 3 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a) Figura 300 – A função fatorial reserva o seu espaço na memória e recebe o parâmetro de entrada funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Memoria fatorial n i fat 3 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a) Figura 301 – A função fatorial cria as suas variáveis internas 297 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Memoria: fatorial n i fat 3 1 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a) Figura 302 – Na função fatorial, a variável fat é inicializada funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var 298 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Memoria: fatorial n i fat 3 1 1 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a) Figura 303 – A variável de controle é inicializada e, como é menor que n, o laço será executado funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo 299 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Memoria: fatorial n i fat 3 1 1 1 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a) Figura 304 – Fat recebe o seu próprio conteúdo multiplicado por 1 funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Memoria: fatorial n i fat 3 1 2 1 1 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a) Figura 305 – A variável de controle é incrementada 300 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Memoria: fatorial n i fat 3 1 2 1 1 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a) Figura 306 – Como i<=n, o laço é executado funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro 301 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Memoria: fatorial n i fat 3 1 2 1 1 2 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a) Figura 307 – Fat recebe o seu próprio conteúdo multiplicado por i funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo 302 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Memoria:fatorial n i fat 3 1 2 3 1 1 2 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a) Figura 308 – A variável de controle é incrementada funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Memoria: fatorial n i fat 3 1 2 3 1 1 2 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a) Figura 309 – Como i<=n, ou seja, 3<=3, o laço é executado 303 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Memoria: fatorial n i fat 3 1 2 3 1 1 2 6 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a) Figura 310 – Novo cálculo de fat é efetuado funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro 304 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Memoria: fatorial n i fat 3 1 2 3 4 1 1 2 6 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a) Figura 311 – Incremento da variável de controle A variável de controle é incrementada, e, como i<=n é Falso, o programa prossegue após o laço. funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo 305 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO Memoria: fatorial n i fat 3 1 2 3 4 1 1 2 6 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a)6 Figura 312 – A função retorna o conteúdo da variável fat para o programa principal funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a)6 fatorial(b) Figura 313 – O programa principal chama a função fatorial, passando o valor 2 306 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Memoria: fatorial n 2 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a)6 fatorial(b) Figura 314 – Reserva de espaço na memória e recebimento do parâmetro de entrada A função fatorial reserva o seu espaço na memória e recebe o parâmetro de entrada 2. funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao 307 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Memoria: fatorial n i fat 2 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a)6 fatorial(b) Figura 315 – A função fatorial cria as suas variáveis internas funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo 308 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V Memoria: fatorial n i fat 2 1 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a)6 fatorial(b) Figura 316 – A variável fat é inicializada funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Memoria: fatorial n i fat 2 1 1 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a)6 fatorial(b) Figura 317 – A variável i de controle é inicializada e, como é menor que n, entra no laço 309 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 LINGUAGEM E TÉCNICAS DE PROGRAMAÇÃO funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Memoria: fatorial n i fat 2 1 1 1 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a)6 fatorial(b) Figura 318 – A variável fat é atualizada funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo “Combinacao” var a,b:inteiro 310 Re vi sã o: Ju lia na - D ia gr am aç ão : J ef er so s / M ár ci o - 02 /0 6/ 20 14 Unidade V combinacao:real inicio leia(a) leia(b) combinacao<-fatorial(a)/(fatorial(b)*fatorial(a-b)) escreva(“combinação e “,a, “ e “,b, “ eh “, combinacao) fimalgoritmo Memoria: fatorial n i fat 2 1 2 1 1 Pilha Tela 3 2 Memoria: Combinação a b combinação 3 2 Pilha fatorial(a)6 fatorial(b) Figura 319 – A variável de controle é incrementada funcao fatorial(n:inteiro):inteiro var i,fat:inteiro inicio fat<-1 para i de 1 ate n faca fat<-fat*i fimpara retorne fat fimfuncao algoritmo
Compartilhar