• Nenhum resultado encontrado

Algoritmo e Programação para Engenharia. Caderno Didático

N/A
N/A
Protected

Academic year: 2021

Share "Algoritmo e Programação para Engenharia. Caderno Didático"

Copied!
120
0
0

Texto

(1)

Algoritmo e Programação para Engenharia

Caderno Didático 2019.2

Brauliro Gonçalves Leal

Ricardo Argenton Ramos

Fábio Nelson de Sousa Pereira

(2)

Copyright© 2019 by Brauliro Gonçalves Leal, Ricardo Argenton Ramos, Fábio Nelson de Sousa

Pereira

O conteúdo deste livro eletrônico é totalmente livre para uso de qualquer natureza desde que citado a fonte. Toda e qualquer parte desta publicação pode ser reproduzida, distribuída ou transmitida de qualquer forma ou por qualquer meio, ou armazenada de qualquer forma ou em qualquer sistema desde que reconhecida a autoria.

Atribuição-CompartilhaIgual - esta licença permite que outros remixem, adaptem e criem a partir deste trabalho, mesmo para fins comerciais, desde que lhe atribuam o devido crédito e que licenciem as novas criações sob termos idênticos (creativecommons.org/licenses).

Imagem da capa: http://programaacao.net.br/mod/forum/discuss.php?d=4 Primeira Edição Eletrônica: Outubro de 2019

ISBN: a ser feito#

A graduação é uma construção diária, requer tempo e dedicação, e o tempo só favorece aqueles que trabalham a seu favor.

(3)

lgoritmo e Programação

para Engenharia

(4)

Sumário

1. Buscando Padrões para fins de Algoritmo...10

1.1. Soma: Humanos x Computador...14

1.2. Sim e Não: Humanos x Computador...15

1.3. Comparação: Humanos x Computador...15

1.4. Humanos x Computador...15

2. Expressões Aritméticas...17

2.1. Exercícios... 21

2.2. Exercícios... 21

3. Expressões Lógicas... 23

3.1. Conceito de Verdadeiro e Falso em C...23

4. Comandos de Seleção...25

4.1. Exercícios... 32

5. Estruturas de repetição...34

5.1. Laço for... 37

5.1.1. Contando ocorrências, somando valores, obtendo máximos e mínimos e calculando médias...38

5.1.2. Exercícios... 41

5.1.3. Conceito de Vetores...43

5.1.4. Algumas operações com vetores...43

5.1.5. Aplicações com Vetores...44

5.1.6. Obtendo máximos e mínimos de elementos de vetores...47

5.1.7. Exercícios... 49

5.1.8. Conceito de Matriz...52

5.1.9. Algumas operações com matrizes...53

5.1.10. Tipos de matriz...55

5.1.11. Aplicações com Matrizes...55

5.1.12. Operações com linhas, colunas e diagonais de matrizes...59

5.1.13. Exercícios... 63

5.2. Laço while... 65

5.2.1. Condições de parada calculadas e lidas pelo teclado...68

5.2.2. Exercícios... 70

5.3. Laço do-while... 71

5.4. Comando break e continue...73

6. Funções... 75

6.1. Variáveis globais e variáveis locais...76

6.2. Exercícios... 78

7. Anatomia de um Programa escrito em C...82

7.1. Inclusões de bibliotecas...83

7.2. Função main... 83

7.3. Bloco de comandos...84

7.4. Comando return...84

7.5. Funções Criadas pelo Programador...85

8. Compilando e Executando Programas C...88

9. Conceitos da Linguagem C...93

10. Aplicações com Séries...102

10.1.1. Exercícios...106 10.1.2. Exercícios...109 11. Anexo... 111 11.1. Compilando um programa C...111 11.2. Fluxograma... 112 11.3. Dados estruturados...113 11.4. Ponteiros... 115 11.5. Terminologias Úteis...116 12. Referências... 118

(5)

Índice Figuras

Figura 5.1 – Estrutura de uma matriz Am,n...53

Figura 5.2 – Efeito do comando break nos laços de repetição for, while e do-while...73

Figura 5.3 – Efeito do comando continue nos laços de repetição for, while e do-while...73

Figura 8.1 - IDE Dev-Cpp versão 5.11 com o GNU GCC 4.9.2 32-bit...88

Figura 8.2 - Indicação de erro de programação pela IDE Dev-Cpp...89

Figura 8.3 - Janela de saída do executável gerado pela IDE DevCpp...90

Figura 11.1 – Visão geral do processo que o compilador C executa para gerar programas executáveis a partir de códigos-fontes...111

Figura 11.2 – Elementos básicos para a criação de fluxogramas...112

(6)

Índice de Tabelas

Tabela 3.1 - Exemplos de expressões lógicas em matemática, em C e seus correspondes

valores e condições lógicas...23

Tabela 3.2 - Tabela verdade &&, || e suas negações...24

Tabela 5.1 - Esquema dos comandos for, while e do-while da Linguagem C...36

Tabela 5.2 - Caracterização dos comandos for, while e do-while da Linguagem C...36

Tabela 5.3 - Operações de contar, somar, média, mínimo e máximo e seus algoritmos...39

Tabela 5.4 - Operações para obtenção dos valores mínimo e máximo de vetores e seus algoritmos... 48

Tabela 5.5 - Tipos de matrizes e suas propriedades matemáticas...55

Tabela 5.6 - Propriedades matemáticas das diagonais principal e secundária de uma matriz quadrada... 55

Tabela 5.7 - Operações com linhas, colunas e diagonais de matrizes e seus algoritmos...59

Tabela 5.8 - Condições de parada calculadas e lidas pelo teclado e seus algoritmos...68

Tabela 7.1 - Descrição de funções, seu tipos, parâmetros e uso do return...86

Tabela 8.1 - Comandos para compilar, recompilar e executar códigos-fonte C usando a IDE Dev-Cpp... 89

Tabela 9.1 - Representações de uma string C incluindo seu texto e a marca de seu fim de texto... 96

Tabela 9.2 - Resumo da formação dos comandos de leitura e escrita dos tipos char, char[], int, float e double... 100

(7)

Sobre os autores

Brauliro Gonçalves Leal

Professor do Colegiado de Engenharia da Computação Universidade Federal do Vale do São Francisco Avenida Antônio Carlos Magalhães, 510 Santo Antônio 48.902-300 Juazeiro - BA - Brasil

e-mail: brauliro.leal@univasf.edu.br site: www.univasf.edu.br/~brauliro.leal telefone: 74 2102 7636

Ricardo Argenton Ramos

Professor do Colegiado de Engenharia da Computação Universidade Federal do Vale do São Francisco Avenida Antônio Carlos Magalhães, 510 Santo Antônio 48.902-300 Juazeiro - BA - Brasil

Fábio Nelson de Sousa Pereira

Professor do Colegiado de Engenharia da Computação Universidade Federal do Vale do São Francisco Avenida Antônio Carlos Magalhães, 510 Santo Antônio 48.902-300 Juazeiro - BA – Brasil

(8)

Prefácio

Este livro tem como principal objetivo o de servir de texto para a disciplina de Algoritmo e Programação dos cursos de Engenharia da Universidade Federal do Vale do São Francisco.

Considerando que um programa de computador tem fundamento na lógica, é impessoal, seus critérios são abstratos, generalizados e são dirigidos para a resolução de problemas com vista a resultados objetivos.

Considerando que nosso cérebro, em especial o córtex cerebral, é “responsável por descobrir padrões, raciocinar de modo lógico, prever o pior e preparar-se para lidar com ele, criar tecnologia e transmiti-la através da cultura” (Suzana Herculano-Houzel).

Este texto busca responder, para fins de aprendizagem, as questões:

• O que é algoritmo?

• O que é programa de computador?

• Como e quando usar os conceitos da linguagem de programação C.

• Como criar programas de computador para resolver problemas de engenharia.

Tendo em vista que fazer bons programas de computador é escrever códigos fontes corretos. Embora sejam apenas letras, o código fonte é portador de uma dinâmica que lhe é própria, que se tornará presente ao ser executado, mas que o programador deve antecipá-la em detalhe no ato da escrita de cada comando.

Os autores esperam que tenha contribuído com o ensino destes conteúdos de modo a torná-los mais atraentes e aplicados nas diversas engenharias, quando cabível.

Este texto busca explicar melhor os conceitos da linguagem C e das boas práticas e técnicas de programação, sendo um complemento dos livros textos da disciplina, a saber:

(9)

Ascenio, A. F. G.; Campos, E. A. V. Fundamentos da Programação de Computadores. 2ª ed. Editora Pearson Education, 2003.

Schildt, Herbert. C Completo e Total. Editora Pearson Makron Books, 2006.

Oliveira, A. B.; Boratii, I. C. Introdução à Programação - Algoritmos. 3 ª ed. Visual Books, 1999.

(10)

arte I – Algoritmo e

Programação

(11)

1. Buscando Padrões para fins de Algoritmo

Os conceitos abaixo buscam definir os termos mas não orienta como construir algoritmos ou mesmo programa de computador.

• Algoritmo é uma sequência finita de instruções.

• Programa de computador é um conjunto de instruções que descrevem uma tarefa a ser realizada por um computador.

Dada uma tarefa, como construir a sequência de instruções capaz de resolvê-la por computador?

A resposta é: analisar a tarefa e buscar um padrão e, a partir dele, identificar a sequência de instruções capaz de resolvê-la por computador.

Exemplo 1.1 - Pode-se criar um algoritmo para subir escadas?

Para responder esta pergunta é necessário responder se há um padrão em subir escada. É necessário identificar o que toda e qualquer escada possui. Escadas são constituídas de degraus, que são a escada propriamente dita, o resultado de subir escadas é deslocar-se através destes degraus passo a passo, um de cada vez, desde um ponto de partida até um ponto de chegada.

Vamos considerar uma solução para humanos, logo é necessário se posicionar no início da escada. Em seguida subir o primeiro degrau. Se a escada tiver um único degrau então chegou ao seu final. Caso contrário deve-se subir mais um degrau. Se a escada tiver dois degraus então chegou ao seu final. E assim sucessivamente.

Generalizando:

1. posicionar no início da escada 2. subir um degrau

3. verificar se é o fim da escada

4. se não for o fim da escada, executar as tarefas 2, 3 e 4 nesta ordem 5. encerrar

Verifique que foi necessário definir escada como um conjunto de degraus, que possui início e fim. Também foi necessário estabelecer a ação de subir um degrau. Por fim, foi criado um método para identificar o fim da escada. Dois processos também são

(12)

É de suma importância identificar e criar os meios necessários para se elaborar algoritmos. Estes meios são identificados e criados a partir do problema proposto.

O que é um padrão para fins de algoritmo?

Um padrão para fins de algoritmo é uma sequência que se repete, onde um conjunto de coisas permanece fixa durante o processo e um outro conjunto de coisas muda neste mesmo processo.

No exemplo acima, as coisas são a escada, seus degraus, as posições inicial e final da escada, e a posição da pessoa que sobe a escada. O processo é o ato humano de subir uma escada e de verificar se já alcançou o último degrau.

As coisas que permanecem fixas são a escada, a sua quantidade de degraus, suas posições inicial e final.

A coisa que varia é a posição da pessoa na escada.

O algoritmo consiste em, utilizando os recursos – as coisas que não mudam, variar a posição da pessoa – fazê-la subir a escada do início até o fim, subindo a escada sequencialmente, degrau a degrau desde o início e verificando quando se deve subir o próximo degrau ou encerrar.

Para decidir entre mais um degrau ou encerrar é feita a pergunta: chegou no fim da escada? Se a resposta for FALSA a opção é subir mais um degrau. Se a resposta for VERDADEIRA a opção é encerrar pois chegou ao final da escada – o último degrau.

Exemplo 1.2 - Pode-se criar um algoritmo contar todos os números existentes?

Para responder esta pergunta é necessário responder se há um padrão de contagem. No caso de números, é possível contá-los por meio de algoritmos. O problema que foi colocado torna impossível definir o início e o fim do conjunto de números, pois requer contar todos, o conjunto dos números tem elementos em número ilimitado, infinito.

Logo, um algoritmo para contar todos os números existentes não pode ser criado. O computador entra em loop quando executa uma tarefa sem fim.

Exemplo 1.3 - Pode-se criar um algoritmo para contar todos os números inteiros compreendidos entre 10 e 20?

Sim, uma possibilidade é o algoritmo:

1. Iniciar o contador com 0 (elemento neutro da operação adição) 2. Iniciar com 11 (entre não inclui os extremos)

3. Encerrar se o número for igual a 20 4. Contar o número

5. Ir para o próximo número inteiro 6. Executar o passo 3

(13)

Note que a solução deste problema é estranha para o pensamento humano: Como eu começo com 11 e testo se é igual a 20 logo em seguida? Não é esquisito?

Observe que os passos 3 a 6 formam um bloco que se repete várias vezes. Os itens 1 e 2 são executados uma única vez. Ao executar o bloco 3-6 pela segunda vez, pela terceira vez e assim por diante, é que fica claro o algoritmo.

Este é o padrão para qualquer contagem de inteiros que tenha início e fim bem definidos. Note a diferença entre solução para seres humanos e para máquinas: máquinas funcionam a partir de rotinas repetitivas, seres humanos não.

Verifique que pode existir mais de um algoritmo para resolver um problema, o melhor dentre eles é chamado algoritmo otimizado.

Normalmente, começa-se com um algoritmo que resolve o problema e vai melhorando-o até que ele fique otimizado.

Vale a Regra de Ouro: o que conta é o resultado.

Não confunda a Regra de Ouro com a vida em sociedade, pois a relação entre seres humanos envolve ética e moral, onde resultados requer o uso de meios aceitos pelo grupo.

Exemplo 1.4 - Pode-se criar um algoritmo para somar todos os números inteiros compreendidos entre a e b?

Sim, uma possibilidade é o algoritmo:

1. Iniciar a soma com 0

2. Iniciar com o número inteiro a 3. Encerrar se o número for igual a b 4. Somar o número

5. Ir para o próximo número inteiro 6. Retornar ao passo 3

Veja que foi generalizado o padrão do exemplo anterior, para qualquer intervalo inteiro (a,b).

Exemplo 1.5 - Pode-se criar um algoritmo para contar todos os números reais compreendidos entre 10 e 20?

No problema colocado, embora seja possível definir o início e o fim do conjunto de números reais, existem infinitos números reais entre 10 e 20. Desta forma não tem como definir o número de repetições para o padrão de contagem. O algoritmo não teria fim. Não, não há algoritmo para contar todos os números reais por computador no intervalo indicado (ou para qualquer outro intervalo finito).

Pode-se afirmar, por outro lado, que há algoritmo para contagem aproximada de números reais por computador de dado intervalo finito.

(14)

Exemplo 1.6 - Pode-se criar um algoritmo para fazer o produto de todos os números inteiros compreendidos entre a e b?

Sim, uma possibilidade é o algoritmo:

1. Iniciar o produto com 1 (elemento neutro da operação de multiplicação) 2. Iniciar com o número inteiro a

3. Encerrar se número for igual a b 4. Fazer o produto do número 5. Ir para o próximo número inteiro 6. Executar o passo 3

Como pode-se observar nos exemplos anteriores, estes algoritmos possuem valores iniciais, inicio e fim bem definidos, um bloco que se repete um número finito de vezes e que se encerra ao atender uma condição de parada.

De modo geral, tarefas que podem ser resolvidas por computador possuem padrões que envolvem repetição, que podem ser reutilizável e que podem ser generalizados. Normalmente, estas tarefas possuem padrões matemáticos.

Uma observação importante, para ajudar a construir algoritmos, é que uma tarefa grande devem ser subdividida em tarefas menores, a assim por diante. Esta regra é denominada “dividir para resolver”.

Transformar algoritmo em programa de computador envolver usar as regras sintáticas e semânticas da linguagem de programação. As linguagens de programação podem ser usadas para expressar algoritmos com precisão.

Algoritmo não são programas de computador. A partir de algoritmos pode-se fazer programas de computador. Pode-se dizer que programas de computador são algoritmos mais elaborados e muito mais detalhados.

Os algoritmos estão mais próximos da capacidade de representação humana. Os programas de computador estão mais próximos da capacidade operacional das máquinas. Pode-se propor a sequência: problemas formulados por seres humano são elaborados na forma de algoritmos que, por sua vez, são transformados em programas de computador.

(15)

1.1. Soma: Humanos x Computador

Como nós, seres humanos, somamos números?

Para analisar o processo de soma feita por humanos, considere a soma dos números: 3, 5, 2, 9 e 4.

A maioria de nós, primeiramente soma 3 com 5 que é igual a 8. Em seguida, 8 com 2 que é 10. Depois 10 com 9 que dá 19 e, por fim, 19 com 4 dando o total de 23.

Onde são guardados os valores 8, 10, 19 e 23? Seres humanos fazem o uso de memórias biológicas, temos muita memória. Estes valores são guardados na memória.

Observe que, em geral, somamos os números dois a dois. Não somamos todos de uma vez, deve ter alguém capaz disso mas são exceções e não a regra.

O Computador, para efetuar a soma indicada também faz uso de memória, ele usa sua própria memória, que é do tipo eletrônica. Computadores modernos têm vários bancos de memória à sua disposição.

Os Computadores precisam reservar memória para realizar seus processos e, para isso ele seleciona uma região de sua memória e dá-lhe um nome para que ela possa ser referenciada durante processamento.

Seja S o nome da região da memória de um Computador selecionada para ser utilizada no processo de soma. Inicialmente o Computador atribui a S o valor zero (elemento neutro da soma). Dando início à soma, ele soma S com 3, logo S agora é igual a 3. Em seguida, soma S com 5, assim S muda seu valor para 8. Depois soma S com 2, S agora é 10. Ainda, soma S com 9, ficando S igual a 19 e, por fim, S é somando com 4, com S igual a 23. S, ao final, tem o valor da soma que é igual a 23.

Observe que o Computador soma os números dois a dois, porém um dos números é sempre sua memória de trabalho. Ele reserva a memória S. Faz S igual a zero. Soma cada número a S, um a um, do começo ao fim.

Pode-se afirma que, de modo geral, seres Humanos e Computadores somam de modo similar. Nós, seres humanos, possuímos um algoritmo nem sempre explícito. Já os Computadores requerem um detalhamento muito maior e de modo explícito, passo a passo.

(16)

variáveis, é preciso dar um nome para a região da memória, este nome é denominado variável.

A memória das máquinas podem receber vários tipos de valores como texto, números inteiros e números fracionários. Por uma questão de organização, as variáveis são declaradas com tipos bem definidos, permitindo as operações específicas para aquele tipo.

1.2. Sim e Não: Humanos x Computador

Como nós, seres humanos, diferenciamos algo falso de algo verdadeiro? Nós, seres humanos, somos capazes de lidar com as diferenças melhor do que as máquinas. Entre o preto e o branco, somos capazes de identificar várias nuances de cores cinzas.

O Computador não é versátil como os seres humanos. Ele reconhece apenas dois estados lógicos: verdadeiro ou falso, sim ou não, ligado ou desligado, alto ou baixo, preto ou branco e assim por diante. Ele é binário e nós devemos transformar nossas ideias em conformidade com estas duas possibilidades quando necessário.

1.3. Comparação: Humanos x Computador

Como nós, seres humanos, comparamos duas mais coisas?

Nós, seres humanos, somos capazes de lidar com vários tipos de comparações. O computador está restrito às de cunho matemáticos, como maior, menor, igual; e também as lógicas, como falso ou verdadeiro.

1.4. Humanos x Computador

Os Computadores são máquinas projetadas e construídas por seres humanos, eles são capazes de processar algoritmos, que são tarefas precisamente definidas, com velocidade e exatidão. Eles estão aptos para resolver situações previstas pelo programador, foras destes casos são ineficazes.

(17)

A mente humana, em geral, não é rápida como as máquinas, mas temos bom senso, criatividade e emoções. Somos capazes de lidar com situações inimagináveis ou imprevisíveis, temos consciência de nós mesmos e do mundo. Vivemos, convivemos e interagimos.

Muitos especialistas entendem que estamos numa época de transição, a nova era que anuncia é da inteligência artificial. Quando então o Computador causará grandes impactos e transformações tecnológicas, com reflexos na sociedade e seus modos de produção, desenvolvimento, ciência, tecnologia e transformação do mundo.

(18)

2. Expressões Aritméticas

As expressões aritméticas envolvem operadores de adição (+), subtração (-) , multiplicação (*), divisão (/) e módulo (%). Estes símbolos (+ - * / %) são denominados operadores aritméticos.

Como na matemática, há uma ordem de prioridade na avaliação dos operadores numa expressão aritmética, chamada de precedência de operadores para a avaliação de expressões aritméticas nos programas de computador.

Na linguagem C, a precedência é primeiro para os parênteses, seguido da multiplicação, divisão, %, adição e subtração.

Exemplo 2.1 - Expressões aritméticas em C:

Expressão Matemática Correspondência em Linguagem C

c=a+b c = a + b; d=c×(a+b) d = c*(a+b); d=a b×c d = (a/b)*c; e=a b+ c d e = a/b + c/d; e= a bc d e = (a/b - c)/d; e=a mod b−c d e = (a % b – c)/d;

É uma boa prática testar expressões aritméticas para verificar se foram codificadas corretamente.

(19)

Exemplo 2.2 - Expressões aritméticas em C:

Expressão Matemática Correspondência em Linguagem C

c=ab c = pow(a,b);

d=

(a+b) d = sqrt(a+b);

b=cos(a)2

+sen (a)2 b = pow(cos(a),2.0)+pow(sin(a),2.0);

f =

cos (a)+sen(b)

ec−ln(d ) f = sqrt( cos(a) + sin(b) ) / ( exp(c) – log(d) );

b=|a| b = abs(a); // b, a intb = fabs(a); // b, a float

É necessário #include <math.h> para usar abs, exp, fabs, log, cos, pow, sqrt e sin.

É uma boa prática testar expressões aritméticas para verificar se foram codificadas corretamente.

O comando de atribuição da linguagem C é o símbolo de igual. A expressão abaixo, em linguagem C, significa de que lado direito do igual é valiado e atribuído ao lado esquerdo, ou seja, a variável x é somada com a variável y e o resultado é atribuído à variável z.

z = x + y;

O comando de atribuição da linguagem C geral é:

variavel = expressao;

A variável pode ser char, int, float ou outro tipo válido. A expressão pode ser lógica ou aritmética.

Na linguagem C tudo vira número ao final.

Exemplo 2.3 - Operador de atribuição em C.

#include <stdio.h> int main ( void ){

float x = 10.0, y = 20.0, z; z = x + y;

(20)

O comando de atribuição C determina dois lados, o direito e o esquerdo. De modo geral, o lado direito é denominado rvalue (right value – valor à direita) e o lado esquerdo é denominado lvalue (left value – valor à esquerda).

Exemplo 2.4 - O programa abaixo contém erros.

#include <stdio.h> int main ( void ){

float x = 10.0, y, z; z = x + y;

printf(" z = %f", z ); return 0;

}

A variável x é um rvalue e possui valor inicial válido. A variável y é um rvalue mas não possui um valor inicial válido. Ao avaliar a expressão x + y, o programa vai operar sobre y cujo valor é indefinido, produzindo valores indefinidos.

Teste este programa é veja o resultado. Talvez o compilador de um aviso (warning) indicado a falta de valor inicial para y.

Os rvalues devem possuir valores válidos para que os lvalues correspondentes sejam válidos.

Na programação tem uma regra: entra lixo, sai lixo.

Acostumem-se a verificar se os valores iniciais dos rvalues foram atribuídos ou lidos.

Faça uma leitura da Capítulo 14 – Funções matemáticas, Parte II – Biblioteca C Padrão.

Estude as funções exp, log, cos, pow, sqrt e sin. Procure identificar outras funções matemáticas úteis.

Exemplo 2.5 - Abreviações em C:

Expressão Matemática Abreviação em Linguagem C

i = i + 1 i++

i = i - 1

i--S = i--S + i S += i

S = S - i S -= i

(21)

S = S / i S /= i

É necessário #include <math.h> para usar abs, exp, fabs, log, cos, pow, sqrt e sin.

É uma boa prática testar expressões aritméticas para verificar se foram codificadas corretamente.

Exemplo 2.6 - Convertendo valores int para float.

#include <stdio.h> int main ( void ){ int n;

printf( "Digite o valor int:" ); scanf( "%d", &n );

printf(" float(n) = %f", float(n) ); return 0;

}

Observe que o formato no scanf é para variável do tipo float pois o valor da variável n foi convertida para o seu correspondente valor float.

A variável n continua sendo do tipo int, apenas o seu valor foi convertida para float.

Exemplo 2.7 - Convertendo valores float para int e char.

#include <stdio.h> int main ( void ){ float x;

printf( "Digite o valor float:" ); scanf( "%f", &x );

printf(" int(x) = %d", int(x) ); printf(" char(x) = %c", char(x) ); return 0;

}

A variável x continua sendo do tipo float, apenas o seu valor foi convertida para int e char, conforme o caso.

(22)

Problemas com divisão entre inteiros. Considere as declarações abaixo:

int a = 1, b = 2; float c;

c = a / b;

O valor de c igual a 0.0.

Considere as declarações abaixo:

int a = 3, b = 2; float c;

c = a / b;

O valor de c igual a 1.0.

Ao dividir inteiros, ou expressões matemáticas que resultem em inteiros, programas em C truncam os resultados. Para obter os resultados corretos é necessário transformar ou o numerador ou o denominador em float ou double, um deles basta. Transformar um tipo em outro é denominado cast, e é feito assim:

c = float(a) / b;

ou

c = a / double(b);

2.1.Exercícios

1. Entrar com valores para a, b, c, imprimir o valor de x, sabendo-se que

x=a+ b

a+b−2×(a−b−c) .

2. Entrar com valores para a, b, c, d, imprimir o valor de f, sabendo-se que

f =

cos (a)+sen(b)

ec−ln(d) .

3. Entrar com valores para a, b, c, imprimir o valor de x, sabendo-se que

x=b−

b2−4 ac

2 a .

4. Entrar com valores para m, s, x, imprimir o valor de f, sabendo-se que

f = 1

s ²e −1 2( x−m s ) 2 .

5. Embora por lei não possa obrigar o cliente a pagar gorjeta. Fazer um algoritmo que leia o valor da despesa realizada em um restaurante e imprima o valor total com a gorjeta.

6. Alguns tributos usa a base de cálculo salário-mínimo. Fazer um algoritmo que leia o valor do salário-mínimo e o valor do salário de uma pessoa. Calcular e imprimir quantos salários-mínimos ela ganha.

7. Faça os fluxogramas dos exercícios 1 a 6.

(23)

1. Preencha o quadro abaixo e faça um programa em C para calcular estas expressões:

Expressão Matemática Correspondência em Linguagem C

C=M (1+i)n x=b−

b 2 −4 ac 2 a m=a1+a2+a3+a4 4 Ec=m v 2 2 s=

(x1−m) 2 +(x2m)2+(x3m)2+(x4m)2 3 f = 1

s ²e −1 2( x−m s ) 2 x=b ² 3 a + 3

q 2 +

q2 4 +p 3 2 a ⁴

(24)

3.Expressões Lógicas

As expressões lógicas dão resultado verdadeiro ou falso.

São compostas por operadores relacionais (> >= < <=), operadores lógicos (&& || == !=). Podem ainda conter expressões aritméticas.

3.1.Conceito de Verdadeiro e Falso em C

A linguagem C expressa suas condições lógicas em falso (0) e verdadeiro (diferente de 0, representado por 1). A Tabela 3.1 mostra exemplos de expressões lógicas em matemática, em C e seus correspondes valores e condições lógicas.

Tabela 3.1 - Exemplos de expressões lógicas em matemática, em C e seus correspondes valores e condições lógicas

Expressão Lógica

Expressão Lógica em C

Valores de x, y, z Valor Lógico Condição Lógica em C x ≥ 10 x >= 10 x = 9 Falso 0 x > 10 e y < 20 (x > 10) && (x < 20) x = 11, y = 15 Verdade 1 x + y = 5 ( x + y ) == 5 x = 1, y = 5 Falso 0 x + y ≠ 5 ( x + y ) != 5 x = 1, y = 5 Verdade 1 x > 10 ou y < 20 (x > 10) || (x < 20) x = 11, y = 15 Verdade 1 10 < x < 20 (10 < x) && (x < 20) x = 9 Falso 0

É muito comum erros envolvendo os operadores == e != portanto sejam cuidadosos, normalmente os compiladores dão uma mensagem de aviso (warning em inglês).

(25)

Pesquise na web: expressões lógicas para programação

Tabela verdade é usado em lógica para determinar o valor lógico de uma expressão, Tabela 3.2 apresenta os resultados das tabelas verdade &&, || e suas negações.

Tabela 3.2 - Tabela verdade &&, || e suas negações

A B A && B A || B !(A &&

B) !(A || B)

V V V V F F

V F F V V F

F V F V V F

F F F F V V

Exemplo 3.1 - Qual expressão lógica para verificar:

a) uma pessoa é de maior: idade > 18 :: no Brasil

b) uma pessoa é obrigada a votar: (idade >= 18) && (idade <= 70) :: no Brasil c) condição de existência de raiz quadrada real: x >= 0, x é float

d) condição de existência de logaritmo: x > 0, x é float e) x é um número par: (x % 2) == 0, x é int

f) x é um número ímpar: (x % 2) != 0, x é int

g) cálculo da média de valores: n > 0, n é int e n é o contador de valores Exemplo 3.2 - Qual expressão lógica para x nos intervalos:

a) [a,b] – a ≤ x ≤ b - fechado tanto à esquerda quanto à direita: (a <= x) && (x <= b) b) (a,b] – a < x ≤ b - aberto à esquerda e fechado à direita: (a < x) && (x <= b) b) [a,b) – a ≤ x < b - fechado à esquerda e aberto à direita: (a <= x) && (x < b) c) (a,b) – a < x < b - aberto tanto à esquerda quanto à direita: (a < x) && (x < b) Exemplo 3.3 - Qual o significado da expressão lógica:

a) (x <= a) || (x >= b) – o valor de x ∊ (a,b) tem valor lógico FALSO b) (x < a ) || (x >= b) – o valor de x ∊ [a,b) tem valor lógico FALSO

(26)
(27)

4.Comandos de Seleção

Os comandos de seleção permitem fazer uma seleção, ou seja, tomar uma decisão dentre uma ou mais alternativas. A decisão é baseada no valor de uma expressão lógica de controle. Em C, um valor pode ser testado através do comando if ou do comando switch.

O comando if mais geral é dado por:

if( ExpressaoLogica ){ // bloco para ExpressaoLogica != 0 comando;

comando; }

else{ // bloco para ExpressaoLogica == 0 comando;

comando; }

Quando o programa encontra o comando if, ele executará ou o bloco do if ou o bloco do eles, nunca os dois – ou um ou outro. É uma escolha entre duas opções.

O bloco do if será executado quando o valor lógico da ExpressaoLogica for VERDADE (ExpressaoLogica != 0).

O bloco do else será executado quando o valor lógico da ExpressaoLogica for FALSO (ExpressaoLogica == 0).

(28)

lógico Verdade.

Basta declarar uma variável para receber o valor da idade da pessoa, o tipo int é suficiente e o mais adequando, não precisa de mais. Ler o valor dado pelo teclado e compará-lo com o valor padrão que é igual a 18, para isso utiliza-se o comando if, como abaixo indicado.

#include <stdio.h> int main( void ){ int idade;

printf( “Digite a idade do cidadao brasileiro em anos: ” ); scanf( “%d”, &idade );

if( idade >= 18 ){

printf(" o cidadao e de maior“ ); }

else{

printf(" o cidadao e de menor“ ); }

return 0; }

O comando if pode ser aninhado. Pode-se ter if dentro de if, permitindo tomar decisões complexas.

Exemplo 4.2 - Classificar brasileiros em voto obrigatório, voto facultativo e não vota. Na legislação, por padrão quem define se um brasileiro vota é a sua idade e os seguintes critérios, com quatro faixas:

a) idade menor do que 16, não vota

b) idade entre 16 e 17, inclusive, voto facultativo c) idade entre 18 e 70, inclusive, voto obrigatório d) idade maior do que 70, voto facultativo

Logo é necessário saber a idade da pessoa em anos e enquadrá-la na faixa correspondente.

Basta declarar uma variável para receber o valor da idade da pessoa, o tipo int é adequando. Ler o valor dado pelo teclado e avaliar a qual faixa pertence, para isso utiliza-se comandos if aninhados, como abaixo indicado.

#include <stdio.h> int main( void ){ int idade;

printf( "Digite a idade do eleitor brasileiro em anos: " ); scanf( "%d", &idade );

if( idade < 16 ){

printf(" o cidadao não vota" ); }

else{

if( idade < 18 ){

printf(" o voto e facultativo" ); }

(29)

if( idade < 71 ){

printf(" o voto e obrigatorio" ); }

else{

printf(" o voto e facultativo" ); }

} }

return 0; }

Observe a edentação do código. Esta técnica é muito útil e serve para verificar que comando pertence a cada bloco.

Exemplo 4.3 - Classificar brasileiros em voto obrigatório, voto facultativo e não vota, sem edentação.

O código abaixo é o mesmo que o anterior, sem edentação.

#include <stdio.h> int main( void ){ int idade;

printf( "Digite a idade do eleitor brasileiro em anos: " ); scanf( "%d", &idade );

if( idade < 16 ){

printf(" o cidadao não vota" ); }

else{

if( idade < 18 ){

printf(" o voto e facultativo" ); }

else{

if( idade < 71 ){

printf(" o voto e obrigatorio" ); }

else{

printf(" o voto e facultativo" ); }

} }

return 0; }

Observe a edentação do código aumenta a legibilidade.

Por vezes, por pressa ou preguiça, o programador não edenta seu código – um mau costume que pode gerar retrabalho depois.

Para mais de uma escolha, pode-se usar o comando switch, sua forma é:

switch( seletor ){

(30)

comando; break; ...

case valon: comando; comando; break; default : comando; comando; }

A linguagem C aceita apenas seletor do tipo char ou do tipo int.

Exemplo 4.4 - Classificar brasileiros em voto obrigatório, voto facultativo e não vota, sem edentação.

#include <stdio.h> int main( void ){ int dia;

printf( "Digite um valor de 1 a 7: " ); scanf( "%d", &dia ); switch( dia ){ case 1 : printf("domingo"); break; case 2 : printf("segunda-feira"); break; case 3 : printf("terca-feira"); break; case 4 : printf("quarta-feira"); break; case 5 : printf("quinta-feira"); break; case 6 : printf("sexta-feira"); break; case 7 : printf("sabado"); break;

default: printf("dia invalido"); }

return 0; }

Ao encontrar o comando switch, o programa executará o comando que for igual a valor da variável dia corresponde ao de alguma constante do case, o comando break encerra o switch. Caso contrário será executado o comando default que é o printf("dia invalido") e encerra o switch.

Cada comando case do switch deve ser encerrado pelo break. O comando default não possui break, e deve ser o último do switch.

Alguma coisa o switch executará, sem opções validas, o default é executado – corresponde ao nosso plano b.

(31)

#include <stdio.h> int main( void ){ int dia;

printf( "Digite um valor de 1 a 7: " ); scanf( "%d", &dia ); if( dia == 1 ){ printf("domingo"); } else{ if( dia == 2 ){ printf("segunda-feira"); } else{ if( dia == 3 ){ printf("terca-feira"); } else{ if( dia == 4 ){ printf("quarta-feira"); } else{ if( dia == 5 ){ printf("quinta-feira"); } else{ if( dia == 6 ){ printf("sexta-feira"); } else{ if( dia == 7 ){ printf("sabado"); } else{ printf("dia invalido"); } } } } } } } return 0; }

Nas implementações acima, o uso do switch é o mais indicado pois apresenta melhor legibilidade comparado a dos if’s aninhados.

(32)

Exemplo 4.5 - Calculadora de quatro operações.

#include <stdio.h> int main( void ){ char op;

float a, b, c;

printf( "Calculadora + - * / \n\n\n" );

printf( "Digite o valor do primeiro operando numerico: " ); scanf ( "%f", &a );

printf( "Digite o valor do segundo operando numerico: " ); scanf ( "%f", &b );

printf( "Digite a operacao + - * / " ); scanf ( " %c", &op );

// o espaco antes do %c evita ler a tecla ENTER switch( op ){

case '+': c = a + b; break; case '-': c = a - b; break; case '*': c = a * b; break; case '/': if( fabs(b) > 0.0 ){ c = a / b;

} else{

printf("\n >>> divisao por zero \b\b\b"); return 1;

}

break;

default: printf("\n ::: operacao invalida \b"); return 2;

}

printf( "\n %f %c %f = %f", a, op, b, c ); return 0;

}

O programador foi cuidadoso ao evitar divisão por zero. O programa testa se o valor absoluto do denominador é maior do zero.

Como o denominador é do tipo float, a expressão if( b == 0.0 ) pode ser usada mas a if( fabs(b) > 0.0 ) é mais segura.

Nas implementações acima, o seletor do switch é do tipo char.

Para ler um valor char corretamente usando scanf é necessário incluir um espaço antes de %c - scanf( " %c", &op ) - isto se deve ao fato de que a tecla ENTER é tratada como caractere e qualquer ENTER deve ser ignorado.

O \b no formato do printf faz o computador emitir um beep (se o alto-falante estiver funcionando e ligado).

(33)

Para verificar se um valor int é nulo (zero) recomenda-se testar se seu valor é igual a zero (0), assim:

#include <stdio.h> int main( void ){ int x;

printf( "Digite o valor int de x: " ); scanf( "%d", &x );

if( x == 0 ){

printf("\n o valor de x não é igual a zero "); }

else{

printf("\n o valor de x é igual a zero "); }

return 0; }

Para verificar se um valor float é nulo (zero) recomenda-se testar se o seu valor absoluto é maior do que zero (0.0), assim:

#include <stdio.h> int main( void ){ float x;

printf( "Digite o valor float de x: " ); scanf( "%f", &x );

if( fabs(x) > 0.0 ){

printf("\n o valor de x não é igual a zero "); }

else{

printf("\n o valor de x é igual a zero "); }

return 0; }

Recomenda-se digitar os valores numéricos para os tipos float com o ponto decimal. Assim, x = 0.0, y = 1.0, z = x/3.0. Apenas para float.

Veja que um float de valor zero é diferente de um int de valor zero. Para nós humanos tanto faz, zero é zero, mas a máquina os representa e os diferencia em seus algoritmos. Resumindo, para a máquina 0 é int e 0.0 é float, sendo 0 ≠ 0.0.

Estude os exemplos de fluxogramas no item 1.4 - Exemplos de algoritmos, nas páginas de 4 a 7.

(34)

Para saber mais sobre if e switch leia o Capítulo 3 – Comando e Controle do Programa.

4.1. Exercícios

1. Faça um programa que receba quatro notas de um aluno, calcule e mostre a média aritmética das notas e a mensagem de aprovado ou reprovado, considerando para aprovação média 7.

2. Faça um programa que receba duas notas, calcule e mostre a média aritmética e a mensagem conforme descrição abaixo:

a) média de 0,0 a 4,9: reprovado b) média de 5,0 a 6,9: exame c) média de 7,0 a 10: aprovado

3. Faça um programa que receba dois números e mostre o menor. 4. Faça um programa que receba três números e mostre o maior. 5. Faça uma calculadora simples para as operações + - * /.

6. Faça um programa que receba dois números e execute as operações listadas a seguir, de acordo com a escolha do usuário. Se a opção digitada for inválida, mostre uma mensagem de erro e termine a execução do programa. Lembre-se de que não há divisão por zero.

a) escolha a: média dos números

b) escolha b: diferença do maior pelo menor c) escolha c: produto dos números

d) escolha d: divisão do primeiro pelo segundo.

7. Faça um programa que receba dois números e execute uma das operações listadas a seguir, de acordo com a escolha do usuário. Se for digitada uma opção inválida, mostre mensagem de erro e termine a execução do programa. As opções são:

a) o primeiro número elevado ao segundo número b) raiz quadrada de cada um dos números

c) raiz cúbica de cada um dos números.

8. Uma empresa decide dar um aumento de 30% aos funcionários com salários inferiores a R$ 1.500,00. Faça um programa que receba o salário do funcionário e mostre o valor do salário reajustado ou uma mensagem, caso ele não tenha direito ao aumento.

9. Faça um programa que receba a altura (h) e o sexo de uma pessoa e calcule e mostre seu peso ideal, utilizando as seguintes fórmulas: a) para homens: 72,7 h – 58; b) para mulheres: 62,1 h – 44,7.

10. Faça um programa que receba os valores a, b e c e imprima as raízes reais da

equação ax2 + bx + c = 0, caso de não exista raízes reais imprimir uma mensagem

informando.

11. Faça um programa que receba os valores da altura A (em m) e massa corporal M (em kg) e calcule o correspondente IMC = M/A². Classifique este resultado em: a) IMC menor do que 18,4 indica Magreza

b) IMC entre 18,5 e 24,9 indica Normalidade c) IMC entre 25,0 e 29,9 indica Sobrepeso I d) IMC entre 30,0 e 39,9 indica Obesidade II e) IMC maior do que 40,0 indica Obesidade Grave

12. Faça um programa que receba o valor do salário bruto e calcule e imprima o salário líquido sabendo que o imposto é cobrado por faixas, a saber:

(35)

a) até R$ 1.903,98 não paga imposto

b) de R$ 1.903,99 até R$ 2.826,65 a alíquota é de 7,5% c) de R$ 2.826,66 até R$ 3.751,05 a alíquota é de 15,0% d) de R$ 3.751,06 até R$ 4.664,68 a alíquota é de 22,5% e) acima de R$ 4.664,68 a alíquota é de 27,5%

13. Faça um programa que receba o número de acertadores com 15, 14, 13, 12 e 11 pontos de uma Loteria. Calcule e mostre o total do prêmio pago no concurso, sabendo que:

a) 15 acertos paga R$ 200.000,00 por acertador b) 14 acertos paga R$ 20.000,00 por acertador c) 13 acertos paga R$ 2.000,00 por acertador d) 12 acertos paga R$ 200,00 por acertador e) 11 acertos paga R$ 20,00 por acertador 14. Faça os fluxogramas dos exercícios 1 a 14.

15. Na lenda da criação do jogo de xadrez

(http://estamate.blogspot.com/2011/11/lenda-do-jogo-de-xadrez.html), o rei Iadava presenteou o jovem Lahur Sessa com trigo da seguinte forma: 1 grão de trigo pela 1ª casa do tabuleiro; 2 grãos de trigo pela 2ª casa; 4 grãos de trigo pela 3ª casa; 8 grãos de trigo pela 4ª casa; … até a 64ª casa do tabuleiro. Ou seja, a quantidade de grãos dobra a cada casa subsequente, começando de 1. Sabendo que a massa de um grão de trigo é igual a 3,325E-5 kg e sua densidade é 780,9 kg/m³, qual é o volume da esfera capaz de conter todo o trigo presenteado pelo rei?

(36)

5. Estruturas de repetição

Considere o problema: Imprimir os números inteiros de 0 a 9 na tela do computador.

Exemplo 5.1 - Solução mecânica.

#include <stdio.h> int main( void ){ printf( " 0 " ); printf( " 1 " ); printf( " 2 " ); printf( " 3 " ); printf( " 4 " ); printf( " 5 " ); printf( " 6 " ); printf( " 7 " ); printf( " 8 " ); printf( " 9 " ); return 0; }

É uma solução mas sem valor técnico algum. Não tem padrão.

Esta solução não é genérica, se for necessário imprimir mais vezes serão necessárias mais linhas.

Exemplo 5.2 - Outra solução mecânica.

#include <stdio.h> int main( void ){ int i = 0; printf( " %d ", i ); i++; printf( " %d ", i ); i++; printf( " %d ", i ); i++; printf( " %d ", i ); i++; printf( " %d ", i ); i++; printf( " %d ", i ); i++;

(37)

printf( " %d ", i ); i++; printf( " %d ", i ); i++; printf( " %d ", i );

return 0; }

É uma outra solução. Observe que há um padrão. O valor inicial de é zero (0) e é incrementado até 9 enquanto o printf é o mesmo em todos os comandos. Se existir um comando que faça a variável i varia de 0 a 9, teríamos um algoritmo tecnicamente aceitável.

Esta solução não é genérica, se for necessário imprimir mais vezes serão necessárias mais linhas.

Para resolver problemas do tipo acima foram criados os laços de repetição.

Exemplo 5.3 - Uma solução de grande valor.

#include <stdio.h> int main( void ){ int i; for( i = 0; i < 10; i++ ){ printf( " %d ", i ); } return 0; }

Esta solução aproveita o padrão repetitivo do problema a partir do chamado laço de repetição.

Esta solução é genérica, serve para qualquer quantidade a ser impressa. Basta trocar apenas o número 10 pelo número desejado e o algoritmo continua o mesmo.

Seguem uma solução genérica do problema.

#include <stdio.h> int main( void ){ int i, n;

printf( “ informe o número de repeticoes: ”); scanf( “%d”, &n ); for( i = 0; i < n; i++ ){ printf( " %d ", i ); } return 0; }

Denomina-se laço (loop em inglês) a uma estrutura de repetição.

Um laço é composto por pela condição e bloco de comandos. A estrutura de repetição, executará o bloco de comandos enquanto a condição for

(38)

Cada uma delas possui características específicas, conforme descritas nas Tabela 5.1 e Tabela 5.2.

Tabela 5.1 - Esquema dos comandos for, while e do-while da Linguagem C.

for while do-while

for( início; condição; incremento ){ comando;

comando; }

valor inicial da condicao while( condição ){ comando; … comando; } do{ comando; … comando; }while( condição );

Tabela 5.2 - Caracterização dos comandos for, while e do-while da Linguagem C.

Laço Número de Repetições Controle para encerrar o laço

for Tem começo e fim bem

definidos

É o número máximo de repetições do laço.

while Não é definido Não depende do número de repetições, é um

valor lido do teclado ou calculado no seu bloco. A condição precisa ter valor inicial antes do laço. O programador precisa controlar o valor da condição para que o laço se encerre.

do-while Não é definido Não depende do número de repetições, é um

valor lido do teclado ou calculado no seu bloco. A condição não precisa ter valor inicial antes do laço. O programador precisa controlar o valor da condição para que o laço se encerre.

O laço while pode não ser executado se no início sua condição de parada for FALSO, pois o laço verifica sua condição logo no início.

O laço do-while é executado pelo menos uma vez, mesmo que sua condição de parada seja FALSO, pois o laço verifica sua condição ao seu final.

Exemplo 5.4 - Considere os dois problemas abaixo: Problema 1 Somar os números naturais de 1 até 9.

Problema 2 Somar os números naturais de 1 até que o total seja menor do que 100. No Problema 1, o número de repetições é bem determinado, são 9 repetições, o problema impõe a quantidade de repetições a serem realizadas.

No Problema 2, o número de repetições não é pré-determinado, o problema impõe um limite para a soma, mas não para o número de repetições.

(39)

Para saber mais sobre laços de repetição leia o Capítulo 3 – Comando e Controle do Programa.

5.1.Laço for

O laço for é uma estrutura de repetição muito utilizada nos programas C. Ele deve se usado sempre que se souber de antemão quantas vezes o bloco de comandos deverá ser executado.

Este laço possui:

1. uma variável inteira para a contagem do número de vezes que o bloco de comandos é

executado

2. uma condição para finalizar o laço

3. um comando para incrementar o contador

4. um bloco de comandos

O próprio laço define o valor inicial do contador, avalia condição de parada e incrementa o contador. Sua sintaxe é:

for( contador; condição; incremento ){ comando;

...

comando; }

onde:

1. atribuição de um valor inicial para contador, uma variável inteira previamente declarada

2. uma condição que verifica se o contador atingiu o limite superior estabelecido

(40)

Exemplo 5.5 - Exemplo de laço for com incremento do contador.

#include <stdio.h> int main( void ){ int contador;

for( contador = 1; contador < 5; contador++ ){ printf(" %d ", contador );

}

return 0; }

O programa é inciado pela função main. Nela é declarada uma variável int contador, para ser usado como contador do laço (não há necessidade de atribuir um valor inicial para esta variável).

O programa executa o laço for em seguida.

No primeiro comando do laço (contador = 1) é atribuído o valor inicial do contador. O laço for executa este comando uma única vez.

O segundo comando do laço é a condição de parada. Neste caso, a condição de parada é contador < 5. Como o valor de contador é 1, a condição é VERDADE. Sendo assim, o bloco é executado. O bloco possui apenas o comando de impressão na tela, o valor do contador (1) é impresso na tela do computador.

Na sequência, é executado o terceiro comando do laço, o incremento. Neste caso, o incremento é de 1 e o novo valor da variável contador é 2.

Após executar o terceiro comando do laço for, ele passa para o seu segundo comando, a condição de parada. Como contador é igual a 2 que é menor do 5, a condição de parada é VERDADE. Sendo assim, o bloco é executado, imprimindo o valor 2 na tela.

O laço for incrementa o contador, contador = 3. A condição 3 < 5 é VERDADE. O laço executa o bloco – imprime 3 na tela.

O laço for incrementa o contador, contador = 4. A condição 4 < 5 é VERDADE. O laço executa o bloco – imprime 4 na tela.

O laço for incrementa o contador, contador = 5. A condição 5 < 5 é FALSA. O laço é encerrado.

Após encerrar o laço, o programa retorna 0 e também encerrado.

O laço for foi executado 4 vezes, imprimindo os números inteiros de 1 a 4 na tela do computador.

5.1.1. Contando ocorrências, somando valores, obtendo máximos e mínimos e calculando médias

Uma das maiores utilidades do computador é sua capacidade de contar, somar, multiplicar calcular estatísticas, mínimos e máximos. A Tabela 5.3 estabelece o procedimento computacionais para as operações de contar, somar, média, mínimo e máximo.

(41)

Tabela 5.3 - Operações de contar, somar, média, mínimo e máximo e seus algoritmos

Operação Procedimento

Contar cria-se uma variável inteira, por exemplo de nome n, com valor inicial zero (0). Dentro do laço de repetição coloque o comando n++ ou n = n +1. Ao sai do laço o valor de n é o número de ocorrências ou a contagem total.

Somar cria-se uma variável float, por exemplo de nome S, com valor inicial zero (0.0). Dentro do laço de repetição coloque o comando S = S + “variável de interesse”. Ao sai do laço o valor de S é a soma dos valores de interesse.

Média ao sai do laço, basta dividir a soma pela contagem para obtenção da

média

Mínimo cria-se uma variável do tipo int ou float, por exemplo de nome Xmin. O valor inicial de Xmin deve ser o maior possível, por exemplo 10000000. Dentro do laço de repetição coloque o comando if( Xmin > X ) { Xmin = X; }. Ao sai do laço o valor de Xmin é o valor mínimo dentre as ocorrências da variável X.

Máximo cria-se uma variável do tipo int ou float, por exemplo de nome Xmax. O valor inicial de Xmax deve ser o menor possível, por exemplo -10000000. Dentro do laço de repetição coloque o comando if( Xmax < X ) { Xmax = X; }. Ao sai do laço o valor de Xmax é o valor máximo dentre as ocorrências da variável X.

Percentagens cria-se variáveis inteiras, por exemplo de nome Nt para contar todas as ocorrências e Ni para contar as ocorrências de interesse, ambas com valor inicial zero (0). Dentro do laço de repetição coloque o comando Nt++ para todos e o comando if para contar as ocorrências de interesse e executar Ni++ caso VERDADE. Ao sai do laço a razão 100*float(Ni)/Nt é a percentagem das ocorrências de interesse.

Observe que, para obter o mínimo, deve-se iniciar com o “maior valor possível” e a comparação é “maior do que”.

Por outro lado, para obter o máximo, deve-se iniciar com o “menor valor possível” e a comparação é “menor do que”.

Observe que o resultado de percentagens deve ser float pois são esperados valores fracionários. Como 100*Ni/Nt é uma razão entre inteiros, o comando float(Ni) evita arredondamentos. Para imprimir 100*float(Ni)/Nt é necessário o formato %f, assim:

printf( “ percentagem %f %%”, 100*float(Ni)/Nt );

(42)

Exemplo 5.6 - Foram obtidas as idades de 7 crianças. Faça um programa em C para ler e calcular os valores mínimo, máximo e média destas idades. Imprima os valores calculados.

Dos dados de entrada são valores de idade – seja idade o nome desta variável, o tipo int é suficiente ela.

Dos dados de saída são a idade média, a idade mínima e a idade máxima.

Para calcular a média é necessário contar as ocorrências de idade e somá-las. De antemão já seu a contagem mas vou contar assim mesmo a título de exemplo. Seja S a variável a ser utilizada para somar, o tipo float é sempre o melhor tipo para soma. Seja n a variável a ser utilizada para contar, o tipo int é sempre o melhor tipo para contador. Tanto S quanto n devem receber zero inicialmente.

Para obter a idade mínima, será usada a variável Imin, do tipo int – mesmo de idade – e terá valor inicial igual a 1000 porque é uma idade que ninguém por ora.

Para obter a idade máxima, será usada a variável Imax, do tipo int – mesmo de idade – e terá valor inicial igual a 0 porque é a menor idade possível.

Será necessário declarar o int c para contador do laço for e também a constante MAX com valor 7, número de idade medidas que deverão ser lidas no laço for.

Dentro do laço for serão colocados os comandos conforme a Tabela 5.3.

Ao sair do laço for, serão impressos os valores Imin, Imax e S/n, a idade média.

#include <stdio.h> #define MAX 7

int main( void ){

int idade, n, Imin, Imax, c; float S; n = 0; Imin = 1000; Imax = 0; S = 0.0; for( c = 0; c < MAX; c++ ){

printf(" De o valor da idade: " ); scanf("%d", &idade );

n = n + 1; S = S + idade;

if( Imin > idade ) Imin = idade; if( Imax < idade ) Imax = idade; }

printf( "\n menor idade: %d ", Imin ); printf( "\n maior idade: %d ", Imax ); printf( "\n idade media: %f ", S/n ); return 0;

(43)

Não foi atribuído um valor inicial para leitura pois seus valores são dados de entrada para o programa.

Pode-se criar a variável float de nome m e, depois do laço for, colocar o comando m = S/n e imprimir o valor de m.

É conveniente que valores de média sejam do tipo float pois são obtidos por meio da operação de divisão, cujo valor esperado são números fracionários.

Observe que foi criado um pequeno dicionário com as varáveis do programa, seus tipos e valores iniciais. E, o mais importante, a finalidade de cada uma delas, as operações a realizar com cada uma delas e onde colocar cada comando a elas referentes. Isso tudo antes de começar a digitar o programa de computador.

No início, o acadêmico fica um pouco confuso com estes procedimentos mas, ao praticá-los, serão abstraídos e se tornarão boas práticas de planejamento de programação.

Para saber mais sobre laço for leia o Capítulo 3 – Comando e Controle do Programa.

5.1.2.Exercícios

1. Foi feita uma estatística em cinco cidades brasileiras para coletar dados sobre acidentes de trânsito. Foram obtidos os seguintes dados:

a) código da cidade;

b) número de veículos de passeio;

c) número de acidentes de trânsito com vítimas.

Deseja-se saber:

a) qual é o maior e qual é o menor índice de acidentes de trânsito e a que cidades pertencem;

b) qual é a média de veículos nas cinco cidades juntas;

c) qual é a média de acidentes de trânsito nas cidades com menos de 2.000 veículos de passeio.

2. Faça um programa que receba duas notas de seis alunos. Calcule e mostre:

(44)

3. Foi feita uma pesquisa para determinar o índice de mortalidade infantil em certo período. Faça um programa que:

a) leia o número de crianças nascidas no período;

b) identifique o sexo (M ou F) e o tempo de vida de cada criança nascida.

O programa deve calcular e mostrar:

a) a percentagem de crianças do sexo feminino mortas no período; b) a percentagem de crianças do sexo masculino mortas no período;

c) a percentagem de crianças que viveram 24 meses ou menos no período.

8. Faça um programa que receba um número, calcule e mostre a tabuada desse número.

4. Faça um programa que mostre as tabuadas dos números de 1 a 10. Com dois tipos de saída: a) impressas uma abaixo da outra e b) dispostas lado a lado.

5. Um funcionário de uma empresa recebe, anualmente, aumento salarial. Faça um programa que determine o salário atual desse funcionário sabendo que:

d) esse funcionário foi contratado em 2005, com salário inicial de R$ 1.000,00. e) em 2006, ele recebeu aumento de 1,5 % sobre seu salário inicial.

a partir de 2007 (inclusive), os aumentos salariais sempre corresponderam ao dobro do percentual do ano anterior.

6. Faça um programa que leia o número de termos, determine e mostre os valores de acordo com a série 2, 7, 3, 4, 21, 12, 8, 63, 48, 16, 189, 192, 32, 567, 768 …

7. Em um campeonato de futebol existem cinco times e cada um possui onze jogadores. Faça um programa que receba a idade, o peso e a altura de cada um dos jogadores, calcule e mostre:

a) a quantidade de jogadores com idade inferior a 18 anos; b) a média das idades dos jogadores de cada time;

c) a média das alturas de todos os jogadores do campeonato; e

d) a porcentagem de jogadores com mais de 80 kg entre todos os jogadores do campeonato.

8. Em uma fábrica trabalham 15 operários, homens e mulheres divididos em três classes:

a) trabalhadores que fazem até 30 peças por mês — classe 1; b) trabalhadores que fazem de 31 a 50 peças por mês — classe 2; c) trabalhadores que fazem mais de 50 peças por mês — classe 3.

(45)

A classe 1 recebe o salário-mínimo. A classe 2 recebe o salário-mínimo mais 3% deste salário por peça, acima das 30 peças iniciais. A classe 3 recebe o salário-mínimo mais 5% desse salário por peça, acima das 30 peças iniciais. Faça um programa que receba o número do operário, o número de peças fabricadas no mês, o sexo do operário, e que também calcule e mostre:

a) o número do operário e seu salário; b) o total da folha de pagamento da fábrica; c) o número total de peças fabricadas no mês; d) a média de peças fabricadas pelos homens; e) a média de peças fabricadas pelas mulheres; e f) o número do operário ou operária de maior salário.

5.1.3.Conceito de Vetores

Vetor é um conjunto de valores de mesmo tipo, normalmente do tipo float, dispostos de modo a formar uma linha ou uma coluna. Os vetores são muito utilizadas para a resolução de problemas que envolvem dados de um grupo homogêneo, como notas de uma classe, nomes de uma turma, idade de uma amostra. Tem grande aplicação em Engenharia.

Para fins práticos, os vetores serão tratados como colunas. Seja um vetor V de n valores. Este vetor é representada na linguagem C é:

V = [v0 v1 v2 … vn-1].

As colunas são ordenadas horizontalmente, são numeradas da esquerda para direita, são indicadas pelo índice que varia de 0 a n-1.

Na linguagem C a contagem começa em zero (0) e o índice do vetor V varia de 0 até n-1. Pode-se reescrever V, de modo econômico, como V = [vc], 0 ≤ c < n.

(46)

Dados os vetores A = [a0 a1 a2 … an-1] e B = [b0 b1 b2 … bn-1], a soma de A e B é um outro vetor C, dado por C = [a0+b0 a1+b1 a2+b2 … an-1+bn-1].

A subtração de A e B é um outro vetor S, dada por S = [a0-b0 a1-b1 a2-b2 … an-1-bn-1]. E o produto de um número real k pelo vetor A é um outro vetor P, dado por P = [ka0 ka1 ka2 … kan-1] .

Exemplo 5.7 - Sejam A = [-1 0 3 1] e B = [1 2 0 -2], calcule C = A+B, S = A - B, P = 5A-3B. C = [-1+1 0+2 3+0 1-2] = [0 2 3 -1]

S = [-1-1 0-2 3-0 1+2] = [-2 -2 3 3]

P = [ 5x(-1)-3x1 5x0-3x2 5x3-3x0 5x1-3x(-2)] = [-8 -6 15 11]

5.1.5.Aplicações com Vetores

O vetor de nome V, com n elementos float, é declarado na linguagem C da forma:

float V[n];

Se for um vetor de nome M, com m elementos int, é declarado na linguagem C da forma:

int M[m];

A linguagem C exige que o tamanho do vetor seja um valor constante inteiro, isto é, um valor inteiro que não varia – não pode ser uma variável. É comum a seguinte declaração na linguagem C para um vetor:

#define n 20

float V[n]; // n é constante e V tem 20 elementos

Para fazer referência a um dos valores do vetor em C, basta usar o nome do vetor e indicar o índice desejado, lembre-se que o índice varia de 0 a n-1. Na declaração anterior, V[0] é o primeiro elemento de V, V[1] é o seu segundo elemento, e assim por diante, até V[19], que é seu último elemento. Não existe o elemento V[20] pois a contagem começa em zero (0).

Observe que o padrão usado para percorrer o vetor V: V[0], V[1], V[2], …, V[19], ou seja, V[c], 0 ≤ c < n, é similar ao padrão do laço for. Vetores podem ser manipulados na linguagem C por meio de laços for, eles foram feitos um para o outro, da seguinte forma:

(47)

#define n 20 int c; float V[n];

for( c = 0; c < n; c ++ ){

comandos para manipular o elemento V[c] do vetor V }

No laço acima, o comando for varia o seu contador de repetição de 0 a n-1. O contador do laço é usado como índice para os elementos do vetor V. A medida que vai variando, o bloco é executado assim pode-se os elementos de V um a um, do início ao fim.

Exemplo 5.8 - Leitura e impressão dos valores de um vetor float.

#include <stdio.h> #define n 10

int main( void ){ int c; float V[n]; printf("\n\n Leitura de V" ); for( c = 0; c < n; c++ ){ printf(" De o valor de V[%d]: ", c ); scanf("%f", &V[c] ); } printf("\n\n Impressao de V" ); for( c = 0; c < n; c++ ){ printf("\n V[%d] = %f", c, V[c] ); } return 0; }

O programa é inciado pela função main. Nela é declarada uma variável int contador, para ser usada para controle do laço for como sua condição de parada, logo é necessário atribuir um valor inicial para esta variável, no caso este valor é zero (0).

Exemplo 5.9 - Leitura e impressão dos valores de um vetor int.

#include <stdio.h> #define n 10

int main( void ){ int c;

int V[n];

Referências

Documentos relacionados

Foi apresentada, pelo Ademar, a documentação encaminhada pelo APL ao INMETRO, o qual argumentar sobre a PORTARIA Nº 398, DE 31 DE JULHO DE 2012 E SEU REGULAMENTO TÉCNICO

Neste trabalho avaliamos as respostas de duas espécies de aranhas errantes do gênero Ctenus às pistas químicas de presas e predadores e ao tipo de solo (arenoso ou

O objetivo do curso foi oportunizar aos participantes, um contato direto com as plantas nativas do Cerrado para identificação de espécies com potencial

4.5.3.1 Comparação da evolução das e iên ias da rede gerada pelo modelo Elite om uma rede aleatória, uma rede livre de es ala e uma rede de mundo pequeno

Water and wastewater treatment produces a signi ficant amount of methane and nitrous oxide, so reducing these emissions is one of the principal challenges for sanitation companies

Portanto, mesmo percebendo a presença da música em diferentes situações no ambiente de educação infantil, percebe-se que as atividades relacionadas ao fazer musical ainda são

da quem praticasse tais assaltos às igrejas e mosteiros ou outros bens da Igreja, 29 medida que foi igualmente ineficaz, como decorre das deliberações tomadas por D. João I, quan-

Atualmente os currículos em ensino de ciências sinalizam que os conteúdos difundidos em sala de aula devem proporcionar ao educando o desenvolvimento de competências e habilidades