122
Algoritmo e Programação para Engenharia Caderno Didático 2019.2 Brauliro Gonçalves Leal Ricardo Argenton Ramos Fábio Nelson de Sousa Pereira Primeira Edição

Algoritmo e Programação para Engenharia Caderno …brauliro.leal/ensino/AP/CDAP.pdfAlgoritmo e Programação para Engenharia Caderno Didático 2019.2 Brauliro Gonçalves Leal Ricardo

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Algoritmo e Programação para Engenharia

Caderno Didático 2019.2

Brauliro Gonçalves LealRicardo Argenton Ramos

Fábio Nelson de Sousa Pereira

Primeira Edição

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

O conteúdo deste livro eletrônico é totalmente livre para uso de qualquer natureza desde quecitado a fonte. Toda e qualquer parte desta publicação pode ser reproduzida, distribuída outransmitida de qualquer forma ou por qualquer meio, ou armazenada de qualquer forma ou emqualquer 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, desdeque lhe atribuam o devido crédito e que licenciem as novas criações sobtermos 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 2019ISBN: a ser feito#

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

Algoritmo e Programação para Engenharia 1

lgoritmo e Programação para EngenhariaA

Algoritmo e Programação para Engenharia 2

Sumário1. Buscando Padrões para fins de Algoritmo.......................................................................10

1.1. Soma: Humanos x Computador................................................................................141.2. Sim e Não: Humanos x Computador.........................................................................151.3. Comparação: Humanos x Computador.....................................................................151.4. Humanos x Computador...........................................................................................15

2. Expressões Aritméticas....................................................................................................172.1. Exercícios..................................................................................................................212.2. Exercícios.................................................................................................................22

3. Expressões Lógicas...........................................................................................................233.1. Conceito de Verdadeiro e Falso em C........................................................................23

4. Comandos de Seleção......................................................................................................264.1. Exercícios.................................................................................................................33

5. Estruturas de repetição....................................................................................................355.1. Laço for......................................................................................................................38

5.1.1. Contando ocorrências, somando valores, obtendo máximos e mínimos e calculando médias.......................................................................................................395.1.2. Exercícios...........................................................................................................445.1.3. Conceito de Vetores...........................................................................................465.1.4. Algumas operações com vetores......................................................................475.1.5. Aplicações com Vetores.....................................................................................475.1.6. Obtendo máximos e mínimos de elementos de vetores...................................515.1.7. Exercícios...........................................................................................................535.1.8. Conceito de Matriz............................................................................................565.1.9. Algumas operações com matrizes.....................................................................575.1.10. Tipos de matriz................................................................................................595.1.11. Aplicações com Matrizes..................................................................................595.1.12. Operações com linhas, colunas e diagonais de matrizes................................635.1.13. Exercícios.........................................................................................................67

5.2. Laço while..................................................................................................................695.2.1. Condições de parada calculadas e lidas pelo teclado.......................................725.2.2. Exercícios...........................................................................................................74

5.3. Laço do-while............................................................................................................755.4. Comando break e continue.......................................................................................77

6. Funções.............................................................................................................................796.1. Variáveis globais e variáveis locais...........................................................................806.2. Exercícios.................................................................................................................82

7. Anatomia de um Programa escrito em C..........................................................................867.1. Inclusões de bibliotecas...........................................................................................877.2. Função main.............................................................................................................877.3. Bloco de comandos..................................................................................................887.4. Comando return.......................................................................................................887.5. Funções Criadas pelo Programador..........................................................................89

8. Compilando e Executando Programas C..........................................................................929. Conceitos da Linguagem C...............................................................................................9710. Aplicações com Séries..................................................................................................106

10.1.1. Exercícios.......................................................................................................11010.1.2. Exercícios.......................................................................................................113

11. Anexo............................................................................................................................11511.1. Compilando um programa C.................................................................................11511.2. Fluxograma...........................................................................................................11611.3. Dados estruturados..............................................................................................11711.4. Ponteiros..............................................................................................................11911.5. Terminologias Úteis..............................................................................................120

12. Referências..................................................................................................................122

Algoritmo e Programação para Engenharia 3

Índice Figuras

Figura 5.1 – Estrutura de uma matriz Am,n.............................................................................57Figura 5.2 – Efeito do comando break nos laços de repetição for, while e do-while.............77Figura 5.3 – Efeito do comando continue nos laços de repetição for, while e do-while........77Figura 8.1 - IDE Dev-Cpp versão 5.11 com o GNU GCC 4.9.2 32-bit.....................................92Figura 8.2 - Indicação de erro de programação pela IDE Dev-Cpp.......................................93Figura 8.3 - Janela de saída do executável gerado pela IDE DevCpp....................................94Figura 11.1 – Visão geral do processo que o compilador C executa para gerar programas executáveis a partir de códigos-fontes...............................................................................115Figura 11.2 – Elementos básicos para a criação de fluxogramas.......................................116Figura 11.3 – Fluxograma para exibir se um número inteiro é par ou ímpar......................117

Algoritmo e Programação para Engenharia 4

Í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..................................................................................................23Tabela 3.2 - Tabela verdade &&, || e suas negações............................................................24Tabela 5.1 - Esquema dos comandos for, while e do-while da Linguagem C........................37Tabela 5.2 - Caracterização dos comandos for, while e do-while da Linguagem C...............37Tabela 5.3 - Operações de contar, somar, média, mínimo e máximo e seus algoritmos......40Tabela 5.4 - Operações para obtenção dos valores mínimo e máximo de vetores e seus algoritmos.............................................................................................................................51Tabela 5.5 - Tipos de matrizes e suas propriedades matemáticas.......................................59Tabela 5.6 - Propriedades matemáticas das diagonais principal e secundária de uma matrizquadrada..............................................................................................................................59Tabela 5.7 - Operações com linhas, colunas e diagonais de matrizes e seus algoritmos.....63Tabela 5.8 - Condições de parada calculadas e lidas pelo teclado e seus algoritmos..........72Tabela 7.1 - Descrição de funções, seu tipos, parâmetros e uso do return..........................90Tabela 8.1 - Comandos para compilar, recompilar e executar códigos-fonte C usando a IDE Dev-Cpp................................................................................................................................93Tabela 9.1 - Representações de uma string C incluindo seu texto e a marca de seu fim de texto................................................................................................................................... 100Tabela 9.2 - Resumo da formação dos comandos de leitura e escrita dos tipos char, char[], int, float e double................................................................................................................104

Algoritmo e Programação para Engenharia 5

Sobre os autoresBrauliro Gonçalves Leal

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

e-mail: [email protected]

site: www.univasf.edu.br/~brauliro.leal

telefone: 74 2102 7636

Ricardo Argenton Ramos

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

Fábio Nelson de Sousa Pereira

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

Algoritmo e Programação para Engenharia 6

PrefácioEste livro tem como principal objetivo o de servir de texto para a disciplinade Algoritmo e Programação dos cursos de Engenharia da UniversidadeFederal 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 paraa 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 piore preparar-se para lidar com ele, criar tecnologia e transmiti-la através dacultura” (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 é escrevercó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 serexecutado, mas que o programador deve antecipá-la em detalhe no ato daescrita de cada comando.

Os autores esperam que tenha contribuído com o ensino destes conteúdosde 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 boaspráticas e técnicas de programação, sendo um complemento dos livrostextos da disciplina, a saber:

Algoritmo e Programação para Engenharia 7

Ascenio, A. F. G.; Campos, E. A. V. Fundamentos da Programação deComputadores. 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.

Algoritmo e Programação para Engenharia 8

arte I – Algoritmo e ProgramaçãoP

Algoritmo e Programação para Engenharia 9

1. Buscando Padrões para fins de Algoritmo

Os conceitos abaixo buscam definir os termos mas não orienta comoconstruir 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 deresolvê-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 dedegraus, que são a escada propriamente dita, o resultado de subir escadas é deslocar-seatravé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 daescada. Em seguida subir o primeiro degrau. Se a escada tiver um único degrau entãochegou ao seu final. Caso contrário deve-se subir mais um degrau. Se a escada tiver doisdegraus então chegou ao seu final. E assim sucessivamente.

Generalizando:

1. posicionar no início da escada2. subir um degrau3. verificar se é o fim da escada4. 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 possuiinício e fim. Também foi necessário estabelecer a ação de subir um degrau. Por fim, foicriado um método para identificar o fim da escada. Dois processos também sãoidentificáveis, a ação de subir escada e o teste de fim último degrau ou fim de escada.

Embora estas “coisas” não estejam na pergunta, elas tiveram que ser criadas: são osmeios para se atingir o fim proposto.

Algoritmo e Programação para Engenharia 10

É de suma importância identificar e criar os meios necessários para se elaboraralgoritmos. 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 decoisas permanece fixa durante o processo e um outro conjunto de coisas muda nestemesmo processo. No exemplo acima, as coisas são a escada, seus degraus, as posições inicial e final daescada, e a posição da pessoa que sobe a escada. O processo é o ato humano de subiruma 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, suasposiçõ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 aposição da pessoa – fazê-la subir a escada do início até o fim, subindo a escadasequencialmente, degrau a degrau desde o início e verificando quando se deve subir opróximo degrau ou encerrar.

Para decidir entre mais um degrau ou encerrar é feita a pergunta: chegou no fim daescada? Se a resposta for FALSA a opção é subir mais um degrau. Se a resposta forVERDADEIRA 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 foicolocado torna impossível definir o início e o fim do conjunto de números, pois requercontar 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. Ocomputador entra em loop quando executa uma tarefa sem fim.

Exemplo 1.3 - Pode-se criar um algoritmo para contar todos os números inteiroscompreendidos 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 204. Contar o número5. Ir para o próximo número inteiro6. Executar o passo 3

Algoritmo e Programação para Engenharia 11

Note que a solução deste problema é estranha para o pensamento humano: Como eucomeç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 2são executados uma única vez. Ao executar o bloco 3-6 pela segunda vez, pela terceiravez 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áquinasfuncionam a partir de rotinas repetitivas, seres humanos não.

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

Normalmente, começa-se com um algoritmo que resolve o problema e vai melhorando-oaté 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 sereshumanos envolve ética e moral, onde resultados requer o uso de meios aceitos pelogrupo.

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

Sim, uma possibilidade é o algoritmo:

1. Iniciar a soma com 02. Iniciar com o número inteiro a3. Encerrar se o número for igual a b4. Somar o número5. Ir para o próximo número inteiro6. 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 reaiscompreendidos entre 10 e 20?

No problema colocado, embora seja possível definir o início e o fim do conjunto denúmeros reais, existem infinitos números reais entre 10 e 20. Desta forma não tem comodefinir 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 intervaloindicado (ou para qualquer outro intervalo finito).

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

Algoritmo e Programação para Engenharia 12

Exemplo 1.6 - Pode-se criar um algoritmo para fazer o produto de todos os númerosinteiros 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 a3. Encerrar se número for igual a b4. Fazer o produto do número5. Ir para o próximo número inteiro6. Executar o passo 3

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

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

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

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

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

Os algoritmos estão mais próximos da capacidade de representação humana. Osprogramas 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 naforma de algoritmos que, por sua vez, são transformados em programas de computador.

Algoritmo e Programação para Engenharia 13

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 dosnú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 ototal de 23.

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

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

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. Computadoresmodernos têm vários bancos de memória à sua disposição.

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

Seja S o nome da região da memória de um Computador selecionada paraser utilizada no processo de soma. Inicialmente o Computador atribui a S ovalor zero (elemento neutro da soma). Dando início à soma, ele soma S com3, logo S agora é igual a 3. Em seguida, soma S com 5, assim S muda seuvalor 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, aofinal, tem o valor da soma que é igual a 23.

Observe que o Computador soma os números dois a dois, porém um dosnúmeros é sempre sua memória de trabalho. Ele reserva a memória S. Faz Sigual 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 somamde modo similar. Nós, seres humanos, possuímos um algoritmo nem sempreexplícito. Já os Computadores requerem um detalhamento muito maior e demodo explícito, passo a passo.

Nas máquinas, sua memória pode ser organizada de várias formas, seusvalores são alterados continuamente. A memória é entendida como algovariável.

A reserva de memória nas máquinas é chamando de declaração de

Algoritmo e Programação para Engenharia 14

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 comotexto, números inteiros e números fracionários. Por uma questão deorganizaçã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 doque as máquinas. Entre o preto e o branco, somos capazes de identificarvárias nuances de cores cinzas.

O Computador não é versátil como os seres humanos. Ele reconhece apenasdois 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ósdevemos transformar nossas ideias em conformidade com estas duaspossibilidades 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 decomparações. O computador está restrito às de cunho matemáticos, comomaior, 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 sereshumanos, eles são capazes de processar algoritmos, que são tarefasprecisamente definidas, com velocidade e exatidão. Eles estão aptos pararesolver situações previstas pelo programador, foras destes casos sãoineficazes.

Algoritmo e Programação para Engenharia 15

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

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

Algoritmo e Programação para Engenharia 16

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ãodenominados operadores aritméticos.

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

Na linguagem C, a precedência é primeiro para os parênteses, seguido damultiplicaçã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=ab×c

d = (a/b)*c;

e=ab+cd

e = a/b + c/d;

e=

ab−c

d

e = (a/b - c)/d;

e=amod b−c

de = (a % b – c)/d;

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

Algoritmo e Programação para Engenharia 17

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 codificadascorretamente.

O comando de atribuição da linguagem C é o símbolo de igual. A expressãoabaixo, em linguagem C, significa de que lado direito do igual é valiado eatribuído ao lado esquerdo, ou seja, a variável x é somada com a variável ye 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 serló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;

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

return 0;}

Algoritmo e Programação para Engenharia 18

O comando de atribuição C determina dois lados, o direito e o esquerdo. De modo geral, olado 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ãopossui um valor inicial válido. Ao avaliar a expressão x + y, o programa vai operar sobre ycujo 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 sejamvá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 – BibliotecaC Padrão.Estude as funções exp, log, cos, pow, sqrt e sin.Procure identificar outras funções matemáticas úteis.

Algoritmo e Programação para Engenharia 19

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 = S + i S += i

S = S - i S -= i

S = S * i S *= i

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 codificadascorretamente.

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 foiconvertida 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;}

Algoritmo e Programação para Engenharia 20

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

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 Ctruncam os resultados. Para obter os resultados corretos é necessário transformar ou onumerador ou o denominador em float ou double, um deles basta. Transformar um tipo emoutro é 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+ba+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 ac2a

.

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

f=1

√2π s ²e−

12

(x−ms

)2

.

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

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

Algoritmo e Programação para Engenharia 21

7. Faça os fluxogramas dos exercícios 1 a 6.8. Na lenda da criação do jogo de xadrez1, o rei Iadava presenteou o jovem Lahur

Sessa com trigo da seguinte forma: 1 grão de trigo pela 1ª casa do tabuleiro; 2grã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 cadacasa subsequente, começando com 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 capazde conter todo o trigo presenteado pelo rei?

2.2. Exercícios

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

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

C=M (1+ i)n

x=−b−√b2

−4 ac2a

m=a1+a2+a3+a4

4

Ec=mv2

2

s=√(x1−m)2+(x2−m)

2+(x3−m)

2+(x 4−m)

2

3

f=1

√2π s ²e−

12

(x−ms

)2

x=−b ²3a

+

3√−q2

+√ q

2

4+ p3

2a ⁴

1 http://estamate.blogspot.com/2011/11/lenda-do-jogo-de-xadrez.html

Algoritmo e Programação para Engenharia 22

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 deexpressões lógicas em matemática, em C e seus correspondes valores econdições lógicas.

Tabela 3.1 - Exemplos de expressões lógicas em matemática, em C e seus correspondes valores econdições lógicasExpressãoLógica

Expressão Lógica emC

Valores de x, y, z Valor Lógico CondiçãoLó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 sejamcuidadosos, normalmente os compiladores dão uma mensagem de aviso(warning em inglês).

Algoritmo e Programação para Engenharia 23

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

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

Tabela 3.2 - Tabela verdade &&, || e suas negaçõesA 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

Pesquise na web: tabela verdade para programação

Algoritmo e Programação para Engenharia 24

4.Comandos de Seleção

Os comandos de seleção permitem fazer uma seleção, ou seja, tomar umadecisão dentre uma ou mais alternativas. A decisão é baseada no valor deuma expressão lógica de controle. Em C, um valor pode ser testado atravésdo 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 ifou o bloco do eles, nunca os dois – ou um ou outro. É uma escolha entreduas opções.

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

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

Exemplo 4.1 - Classificar brasileiros em maior ou menor de idade.

Na legislação, por padrão quem define se um brasileiro é de maior ou de menor é a suaidade e o critério é que ela seja maior ou igual à 18 anos.

Logo é necessário saber a idade da pessoa em anos e compará-la com o valor 18. Se aidade for maior ou igual a 18, a pessoa é de maior pois a comparação resulta em um valor

Algoritmo e Programação para Engenharia 25

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 ecompará-lo com o valor padrão que é igual a 18, para isso utiliza-se o comando if, comoabaixo 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, permitindotomar 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 seguintescrité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 faixacorrespondente.

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" ); } else{

Algoritmo e Programação para Engenharia 26

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 quecomando pertence a cada bloco.

Exemplo 4.3 - Classificar brasileiros em voto obrigatório, voto facultativo e não vota, semedentaçã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 maucostume que pode gerar retrabalho depois.

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

switch( seletor ){ case valo1: comando; … comando; break; case valo2: comando;

Algoritmo e Programação para Engenharia 27

… 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, semedentaçã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 davariável dia corresponde ao de alguma constante do case, o comando break encerra oswitch. Caso contrário será executado o comando default que é o printf("dia invalido") eencerra o switch.

Cada comando case do switch deve ser encerrado pelo break. O comando default nãopossui 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.

Segue abaixo, o programa correspondente usando vários if aninhados.

Algoritmo e Programação para Engenharia 28

#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 melhorlegibilidade comparado a dos if’s aninhados.

Algoritmo e Programação para Engenharia 29

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 valorabsoluto do denominador é maior do zero.

Como o denominador é do tipo float, a expressão if( b == 0.0 ) pode ser usada mas aif( 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 comocaractere e qualquer ENTER deve ser ignorado.

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

Algoritmo e Programação para Engenharia 30

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 humanostanto 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.

Algoritmo e Programação para Engenharia 31

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

4.1. Exercícios

1. Faça um programa que receba o ano e imprima se se ele é bissexto ou não. Um anoé bissexto se ele divisível por 4 e por 100 mas não por 400.

2. Uma empresa emprega programadores e designers a R$ 60,00 e R$ 80,00 por hora,respectivamente. Faça um programa que receba as horas trabalhadas e a profissão,calcule e mostre os salários brutos e líquido, sabendo que o órgão de classe dosprogramadores e dos designers descontam 1,5 e 2,0% dos salários brutos dos seusassociados, respectivamente.

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 quatro notas de um aluno, calcule e mostre a média

aritmética das notas e a mensagem de aprovado ou reprovado, considerando paraaprovação média 7.

7. Faça um programa que receba duas notas, calcule e mostre a média aritmética e amensagem conforme descrição abaixo:a) média de 0,0 a 4,9: reprovadob) média de 5,0 a 6,9: examec) média de 7,0 a 10: aprovado

8. Faça um programa que receba dois números e execute as operações listadas aseguir, de acordo com a escolha do usuário. Se a opção digitada for inválida, mostreuma mensagem de erro e termine a execução do programa. Lembre-se de que nãohá divisão por zero.a) escolha a: média dos númerosb) escolha b: diferença do maior pelo menorc) escolha c: produto dos númerosd) escolha d: divisão do primeiro pelo segundo.

9. Faça um programa que receba dois números e execute uma das operações listadasa 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úmerob) raiz quadrada de cada um dos númerosc) raiz cúbica de cada um dos números.

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

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

12. Faça um programa que receba os valores a, b e c e imprima as raízes reais daequação ax2 + bx + c = 0, caso de não exista raízes reais imprimir uma mensageminformando.

13. 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:

Algoritmo e Programação para Engenharia 32

a) IMC menor do que 18,4 indica Magrezab) IMC entre 18,5 e 24,9 indica Normalidadec) IMC entre 25,0 e 29,9 indica Sobrepeso Id) IMC entre 30,0 e 39,9 indica Obesidade IIe) IMC maior do que 40,0 indica Obesidade Grave

14. Faça um programa que receba o valor do salário bruto e calcule e imprima o saláriolíquido sabendo que o imposto é cobrado por faixas, a saber:a) até R$ 1.903,98 não paga impostob) 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%

15. Faça um programa que receba o número de acertadores com 15, 14, 13, 12 e 11pontos 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 acertadorb) 14 acertos paga R$ 20.000,00 por acertadorc) 13 acertos paga R$ 2.000,00 por acertadord) 12 acertos paga R$ 200,00 por acertadore) 11 acertos paga R$ 20,00 por acertador

16. Faça os fluxogramas dos exercícios 1 a 15.

Algoritmo e Programação para Engenharia 33

5. Estruturas de repetição

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

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 maislinhas.

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++;

Algoritmo e Programação para Engenharia 34

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 umcomando que faça a variável i varia de 0 a 9, teríamos um algoritmo tecnicamenteaceitável.

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

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 derepetição.

Esta solução é genérica, serve para qualquer quantidade a ser impressa. Basta trocarapenas 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 derepetição, executará o bloco de comandos enquanto a condição forVERDADE.

A linguagem C possui três estruturas de repetição: for, while e do-while.

Algoritmo e Programação para Engenharia 35

Cada uma delas possui características específicas, conforme descritas nasTabela 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 condicaowhile( 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 bemdefinidos

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

while Não é definido Não depende do número de repetições, é umvalor lido do teclado ou calculado no seubloco. A condição precisa ter valor inicialantes do laço. O programador precisacontrolar o valor da condição para que o laçose encerre.

do-while Não é definido Não depende do número de repetições, é umvalor lido do teclado ou calculado no seubloco. A condição não precisa ter valor inicialantes do laço. O programador precisacontrolar o valor da condição para que o laçose encerre.

O laço while pode não ser executado se no início sua condição de parada forFALSO, 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çãode 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 problemaimpõ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 umlimite para a soma, mas não para o número de repetições.

Algoritmo e Programação para Engenharia 36

Para saber mais sobre laços de repetição leia o Capítulo 3 – Comando eControle 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 blocode 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 éexecutado2. uma condição para finalizar o laço3. um comando para incrementar o contador4. um bloco de comandos

O próprio laço define o valor inicial do contador, avalia condição de parada eincrementa 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 previamentedeclarada2. uma condição que verifica se o contador atingiu o limite superior estabelecido 3. um comando para incrementar o contador de uma unidade

Algoritmo e Programação para Engenharia 37

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, paraser usado como contador do laço (não há necessidade de atribuir um valor inicial paraesta 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çofor 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, oincremento é 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, acondiçã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çoexecuta o bloco – imprime 3 na tela.

O laço for incrementa o contador, contador = 4. A condição 4 < 5 é VERDADE. O laçoexecuta 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 docomputador.

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.3estabelece o procedimento computacionais para as operações de contar,somar, média, mínimo e máximo.

Algoritmo e Programação para Engenharia 38

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

Contar cria-se uma variável inteira, por exemplo de nome n, com valor inicialzero (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 acontagem total.

Somar cria-se uma variável float, por exemplo de nome S, com valor inicialzero (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 dosvalores de interesse.

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

Mínimo cria-se uma variável do tipo int ou float, por exemplo de nome Xmin. Ovalor inicial de Xmin deve ser o maior possível, por exemplo umnúmero positivo muito grande, Xmax=1000000. Dentro do laço derepetição coloque o comando if( Xmin > X ){ Xmin = X; }. Ao sai dolaço o valor de Xmin é o valor mínimo dentre as ocorrências da variávelX.

Máximo cria-se uma variável do tipo int ou float, por exemplo de nome Xmax. Ovalor inicial de Xmax deve ser o menor possível, por exemplo umnúmero negativo muito pequeno, Xmax=-1000000. Dentro do laço derepetição coloque o comando if( Xmax < X ){ Xmax = X; }. Ao sai dolaço o valor de Xmax é o valor máximo dentre as ocorrências davariável X.

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

Exemplo 5.6 - Foram obtidas as idades de 7 crianças. Faça um programa em C para ler ecalcular e imprimir o valor da média destas idades. Imprima os valores calculados.

Os dados de entrada são 7 valores de idade de crianças – seja idade o nome destavariável, o tipo int é suficiente para armazenar seus valores.

O dado de saída é média das idades.

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

Será necessário declarar o int c para contador do laço for e também a constante MAX comvalor 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á impresso o valor de S/n, média das idades.

Algoritmo e Programação para Engenharia 39

#include <stdio.h>

#define MAX 7

int main( void ){ int idade, n, c; float S;

n = 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; } printf( "\n idade media: %f ", S/n ); return 0;}

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

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

É conveniente que valores de média sejam do tipo float pois são obtidos por meio daoperaçã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 evalores iniciais. E, o mais importante, a finalidade de cada uma delas, as operações arealizar com cada uma delas e onde colocar cada comando a elas referentes. Isso tudoantes 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.

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

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

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

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

O duplo %% imprime o símbolo de percentagem uma única vez.

Algoritmo e Programação para Engenharia 40

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

Dos dados de entrada são 7 valores de idade de crianças – seja idade o nome destavariável, o tipo int é suficiente para armazenar seus valores.

Dos dados de saída são os valores das idades mínima e máxima.

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

Para obter a idade máxima, será usada a variável Imax, do tipo int – mesmo de idade – eterá 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 comvalor 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 e Imax.

#include <stdio.h>

#define MAX 7

int main( void ){ int idade, Imin, Imax, c;

Imin = 1000; Imax = 0; for( c = 0; c < MAX; c++ ){ printf(" De o valor da idade: " ); scanf("%d", &idade );

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

} printf( "\n menor idade: %d ", Imin ); printf( "\n maior idade: %d ", Imax ); return 0;}

Algoritmo e Programação para Engenharia 41

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

Algoritmo alternativo, não faz uso dos comandos conforme a Tabela 5.3, mas produz osmesmos resultados.

Como as variáveis Imin e Imax precisam ter valores válidos para serem comparadas comidade, após a leitura da idade atribui-se a Imax e Imin o valor primeira idade lida.

#include <stdio.h>#define MAX 7int main( void ){ int idade, Imin, Imax, c; for( c = 0; c < MAX; c++ ){ printf(" De o valor da idade: " ); scanf("%d", &idade ); if( c == 0 ){ Imin = idade; Imax = idade; } if( Imin > idade ) Imin = idade; if( Imax < idade ) Imax = idade;

} printf( "\n menor idade: %d ", Imin ); printf( "\n maior idade: %d ", Imax ); return 0;}

Exemplo 5.9 - Foram obtidas as idades de 7 crianças. Faça um programa em C para ler ecalcular e imprimir a percentagem de crianças com idade menor do 3 anos. Imprima osvalores calculados.

Dos dados de entrada são 7 valores de idade de crianças – seja idade o nome destavariável, o tipo int é suficiente para armazenar seus valores.

Dos dados de saída e percentagem de crianças cujas idades são menores do 3 anos;

Para obter a percentagem de crianças cujas idades são menores do 3 anos é fazer duascontagens:

1. contar as crianças cujas idades são menores do 3 anos

2. contar todas crianças

3. a percentagem é a divisão o resultado da contagem 1 pelo resultado da contagem 2

Seja p3 a contagem de crianças cujas idades são menores do 3 anos.

Seja p a contagem de todas crianças.

Inicialmente p3 e p são iguais a zero (0). Dentro do laço de for comando p = p + 1; contatodas as crianças. O incremento de p3 deve ser feito dentro de um if com a condiçãoidade < 3 (Tabela 5.3).

Ao sair do laço for, será impresso a razão 100*p3/p.

#include <stdio.h>

Algoritmo e Programação para Engenharia 42

#define MAX 7

int main( void ){ int idade, p, p3;

p = p3 = 0;

for( c = 0; c < MAX; c++ ){ printf(" De o valor da idade: " ); scanf("%d", &idade ); p = p +1; if( idade < 3 ){ p3 = p3 + 1; } } printf( "\n percentagem idade < 3: %f ", 100*(float)p3/p ); return 0;}

Utiliza-se o comando (float)p3 para que o resultado seja do tipo float. Como p e p3 são dotipo int, o comando p3/p dá como resultado tipo int.

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

5.1.2.Exercícios

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

a) código da cidade (cc);b) número de veículos de passeio (nvp);c) número de acidentes de trânsito com vítimas (nav).

Deseja-se saber:

a) número de cidades com nav maior do que 100;b) qual é a média de veículos nas 10 cidades juntas;c) qual é a média de nav nas cidades com menos de 2.000 nvp.d) qual é o maior nav e a que cidade pertence;

Algoritmo e Programação para Engenharia 43

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

a) a média aritmética das duas notas de cada aluno;b) o total de alunos aprovados;c) o total de alunos de exame;d) o total de alunos reprovados;e) a média da classe.

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

a) leia o número de crianças nascidas no período;b) identifique o sexo ( 0 - M ou 1 - 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 tabuadadesse 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) dispostaslado 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 sabendoque:

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

(inclusive), os aumentos salariais sempre corresponderam ao dobro do percentual doano anterior.

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

7. Um time futebol possui onze jogadores. Faça um programa que receba aidade, 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) o jogador mais alto;c) a média das idades dos jogadores do time;d) a média das alturas dos jogadores do time; ee) a porcentagem de jogadores com mais de 80 kg dentre todos os jogadores.

Algoritmo e Programação para Engenharia 44

8. Em uma fábrica trabalham 15 operários, homens e mulheres divididos emtrê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.

A classe 1 recebe o salário-mínimo. A classe 2 recebe o salário-mínimo mais3% deste salário por peça, acima das 30 peças iniciais. A classe 3 recebe osalá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çasfabricadas 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;f) o número do operário ou operária de maior salário; eg) a percentagem de operárias da fábrica.

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 muitoutilizadas para a resolução de problemas que envolvem dados de um grupohomogêneo, como notas de uma classe, nomes de uma turma, idade deuma amostra. Tem grande aplicação em Engenharia.

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

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

As colunas são ordenadas horizontalmente, são numeradas da esquerdapara 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 variade 0 até n-1. Pode-se reescrever V, de modo econômico, como V = [vc], 0 ≤ c< n.

Algoritmo e Programação para Engenharia 45

5.1.4. Algumas operações com vetores

Dentre as operações com vetores, destacam-se a soma, subtração, amultiplicação por número real e o produto escalar.

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.10 - 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 daforma:

float V[n];

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

int M[m];

A linguagem C exige que o tamanho do vetor seja um valor constanteinteiro, 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 20float 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

Algoritmo e Programação para Engenharia 46

vetor e indicar o índice desejado, lembre-se que o índice varia de 0 a n-1. Nadeclaração anterior, V[0] é o primeiro elemento de V, V[1] é o seu segundoelemento, e assim por diante, até V[19], que é seu último elemento. Nãoexiste 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. Vetorespodem ser manipulados na linguagem C por meio de laços for, eles foramfeitos um para o outro, da seguinte forma:

#define n 20int 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. Amedida que vai variando, o bloco é executado assim pode-se os elementosde V um a um, do início ao fim.

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

#include <stdio.h>#define n 10int 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, paraser usada para controle do laço for como sua condição de parada, logo é necessárioatribuir um valor inicial para esta variável, no caso este valor é zero (0).

Algoritmo e Programação para Engenharia 47

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

#include <stdio.h>#define n 10int main( void ){ int c; int V[n];

printf("\n\n Leitura de V" );

for( c = 0; c < n; c++ ){ printf(" De o valor de V[%d]: ", c ); scanf("%d", &V[c] ); }

printf("\n\n Impressao de V" ); for( c = 0; c < n; c++ ){ printf("\n V[%d] = %d", c, V[c] ); }

return 0;}

O programa que lê V float é muito similar ao programa que lê V int. Muda apenas osformatos de entrada e saída de V[i], %f para float e %d para int. Não tem como errar, mas,mesmo assim, é muito comum errar o uso de tipos de entrada e saída em C.

Uma maneira de verificar se houve erro na entrada de dados é imprimir os dados lidos ecertificar se as entradas são iguais às saídas.

Sejam os vetores A = [ac] e B = [bc], para 0 ≤ c < n. Sejam C = A + B, S = A– B e P = k A, para k real, logo, pode-se escrever C = [ac+bc], S = [ac-bc] e P= [kac], para 0 ≤ c < n.

Estas operações com vetores podem ser escritas em C usando o laço for,como se segue.

Exemplo 5.13 - Leitura de A e B vetores de tamanho n, cálculo e impressão de C = A + B,S = A – B e P = k A, k número float. Teste este algoritmo com A =[ 2.5 -3.3 4.0 1.2 ], B =[ 0.5 -1.5 2.2 -2.0] e k = 4.0.

#include <stdio.h>#define n 4int main( void ){ int c; float A[n], B[n], C[n], S[n], P[n], k;

printf("\n\n Leitura de A" ); for( c = 0; c < n; c++ ){ printf(" De o valor de A[%d]: ", c ); scanf("%f", &A[c] ); }

Algoritmo e Programação para Engenharia 48

printf("\n\n Leitura de B" ); for( c = 0; c < n; c++ ){ printf(" De o valor de B[%d]: ", c ); scanf("%f", &B[c] ); } printf("\n\n De o valor de k: " ); scanf("%f", &k );

printf("\n\n Calculo de C, S e P" ); for( c = 0; c < n; c++ ){ C[c] = A[c] + B[c]; S[c] = A[c] – B[c]; P[c] = k*A[c]; }

printf("\n\n Impressao de C: " ); for( c = 0; c < n; c++ ){ printf(" %f ", C[c] ); }

printf("\n\n Impressao de S: " ); for( c = 0; c < n; c++ ){ printf(" %f ", S[c] ); }

printf("\n\n Impressao de P: " ); for( c = 0; c < n; c++ ){ printf(" %f ", P[c] ); }

return 0;}

Altere o valor de n para adequar o tamanho dos vetores.

Exemplo 5.14 - Atribuindo valores iniciais para vetores.

#include <stdio.h>

#define n 4

int main( void ){ int c; float V[n] = { 1.0, -2.0, 3.1, 4.2 };

printf("\n\n Impressao formatada de V: " ); for( c = 0; c < n; c++ ){ printf(" %f ", V[c] ); }

return 0;}

Para atribuir valores para um vetor basta organizá-los separados por vírgula e entrecolchetes.

Algoritmo e Programação para Engenharia 49

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

A Tabela 5.4 estabelece os procedimentos computacionais para asoperações de mínimo e máximo, no caso de vetor,

Tabela 5.4 - Operações para obtenção dos valores mínimo e máximo de vetores e seusalgoritmosOperação Procedimento

Mínimo cria-se uma variável do tipo int ou float, por exemplo de nome Xmin. Ovalor inicial de Xmin deve ser o valor do primeiro elemento do vetor,por exemplo Xmin = V[0]. Dentro do laço de repetição, que percorre ovetor, coloque o comando if( Xmin > V[i] ) { Xmin = V[i]; }. Ao sai dolaço o valor de Xmin é o valor mínimo dentre os elementos do vetor.

Máximo cria-se uma variável do tipo int ou float, por exemplo de nome Xmax. Ovalor inicial de Xmax deve ser o valor do primeiro elemento do vetor,por exemplo Xmax = V[0]. Dentro do laço de repetição, que percorre ovetor, coloque o comando if( Xmax < V[i] ) { Xmax = V[i]; }. Ao sai dolaço o valor de Xmax é o valor máximo dentre os elementos do vetor.

Observe que, no caso de vetores, tanto seu valor máximo quanto seu valormínimo podem ser inicialmente iguais ao primeiro elemento do vetor. E, senão forem, serão trocados dentro do laço for.

Exemplo 5.15 - Obtenha os valores mínimo e máximo do vetor A de 200 elementos lidosto teclado.

Os dados de entrada são os valores do vetor A – sejam ele do tipo float.

Os dados de saída são os valores mínimo e máximo do vetor A, sejam eles Vmin e Vmax,ambos float – mesmo tipo de A.

Inicialmente, devem ser lidos os valores do vetor.

Para obter o valor mínimo de A, que é Vmin, ele terá valor inicial igual a A[0].

Para obter o valor máximo de A, que é Vmax, ele terá valor inicial igual a A[0] também.

Onde colocar os comandos Vmin = A[0] e Vmax = A[0], é muito importante. Eles devemser colocados após a leitura dos valores de A, e não antes.

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

Ao sair do laço for, serão impressos os valores Vmin e Vmax.

#include <stdio.h>#define N 200int main( void ){ int c; float A[n], Vmin, Vmax;

printf("\n\n Leitura de A" );

Algoritmo e Programação para Engenharia 50

for( c = 0; c < N; c++ ){ printf(" De o valor de A[%d]: ", c ); scanf("%f", &A[c] ); }

Vmin = A[0]; Vmax = A[0];

printf("\n\n Atualizando Vmin e Vmax: " );

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

if( Vmin > A[c] ) Vmin = A[c]; if( Vmax < A[c] ) Vmax = A[c]; }

printf( "\n menor valor: %f ", Vmin ); printf( "\n maior valor: %f ", Vmax );

return 0;}

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 Vetores leia o Capítulo 4 – Matrizes e Strings.

5.1.7.Exercícios

1. Faça um programa que preencha um vetor com seis elementosnuméricos inteiros. Calcule e mostre:

a) todos os números pares;b) a quantidade de números pares;c) todos os números ímpares;d) a quantidade de números ímpares.

2. Faça um programa que preencha um vetor com sete números inteiros,calcule e mostre:

Algoritmo e Programação para Engenharia 51

a) os números múltiplos de 2;b) os números múltiplos de 3;c) os números múltiplos de 2 e de 3.

3. Faça um programa que preencha um vetor com quinze elementos inteirose verifique a existência de elementos iguais a 30, mostrando as posições emque apareceram.

4. Faça um programa que preencha um vetor com dez números reais,calcule e mostre a quantidade de números negativos e a soma dos númerospositivos desse vetor.

5. Faça um programa que preencha um vetor com os códigos de setealunos e carregue outro vetor com a média final desses alunos. Calcule emostre:

a) o código do aluno com maior média (desconsiderar empates);b) para cada aluno não aprovado, isto é, com média menor que 7, mostrar quanto esse

aluno precisa tirar na prova de exame final para ser aprovado. Considerar que a médiapara aprovação no exame é 5.

6. Faça um programa que receba dez números inteiros e armazene-os emum vetor. Calcule e mostre dois vetores resultantes: o primeiro com osnúmeros pares e o segundo, com os números ímpares.

7. Faça um programa que receba o código de cinco produtos e seusrespectivos preços. Calcule e mostre:

a) a quantidade de produtos com preço inferior a R$ 50,00;b) o código dos produtos com preço entre R$ 50,00 e R$ 100,00;c) a média dos preços dos produtos com preço superior a R$ 100,00.

8. Faça um programa que preencha dois vetores de dez posições cada,determine e mostre um terceiro contendo os elementos dos dois vetoresanteriores ordenados de maneira decrescente.

9. Faça um programa que preencha um vetor com quinze números,determine e mostre:

a) o maior número e a posição por ele ocupada no vetor;b) o menor número e a posição por ele ocupada no vetor.

10. Faça um programa que leia dois vetores de dez posições e faça amultiplicação dos elementos de mesmo índice, colocando o resultado emum terceiro vetor. Mostre o vetor resultante.

Algoritmo e Programação para Engenharia 52

11. Faça um programa que leia um vetor com dez posições para númerosinteiros e mostre somente os números positivos.

12. Faça um programa que leia um vetor com dez posições para númerosinteiros. Crie um segundo vetor, substituindo os valores nulos por 1. Mostreos dois vetores.

13. Faça um programa que leia um vetor A de dez posições. Em seguida,compacte o vetor, retirando os valores nulos e negativos. Armazene esseresultado no vetor B. Mostre o vetor B (o vetor B pode não ser preenchido).

14. Faça um programa que leia dois vetores (A e B) com cinco posiçõespara números inteiros. O programa deve, então, subtrair o primeiroelemento de A do último de B, acumulando o valor, subtrair o segundoelemento de A do penúltimo de B, acumulando o valor e assim por diante.Ao final, mostre o resultado de todas as subtrações realizadas.

15. Faça um programa que leia um vetor com quinze posições paranúmeros inteiros. Depois da leitura, divida todos os seus elementos pelomaior valor do vetor. Mostre o vetor após os cálculos.

16. Faça um programa que receba o código de oito clientes e armazene-osem um vetor. Em um segundo vetor, armazene a quantidade de livroscomprados em 2017 por cada um dos oito clientes. Sabe-se que, para cadadez livros comprados, o cliente tem direito a um livro grátis. Faça umprograma que mostre o código de todos os clientes, com a quantidade delivros grátis a que ele tem direito.

17. Uma escola deseja saber se existem alunos cursando,simultaneamente, as disciplinas Lógica e Linguagem de Programação.Coloque os números das matrículas dos alunos que cursam Lógica em umvetor, quinze alunos. Coloque os números das matrículas dos alunos quecursam Linguagem de Programação em outro vetor, dez alunos. Mostre onúmero das matrículas que aparecem nos dois vetores.

18. Faça um programa que receba o total das vendas de cada vendedor deuma loja e armazene-as em um vetor. Receba também o percentual decomissão a que cada vendedor tem direito e armazene-os em outro vetor.Receba os códigos desses vendedores e armazene-os em um terceiro vetor.Existem apenas dez vendedores na loja. Calcule e mostre:

a) um relatório com os códigos dos vendedores e os valores a receber referentes àcomissão;

b) o total das vendas de todos os vendedores;

Algoritmo e Programação para Engenharia 53

c) o maior valor a receber e o código de quem o receberá;d) o menor valor a receber e o código de quem o receberá.

19. Faça um programa para controlar o estoque de mercadorias de umaempresa. Inicialmente, o programa deverá preencher dois vetores com dezposições cada, onde o primeiro corresponde ao código do produto e osegundo, ao total desse produto em estoque. Logo após, o programa deveráler um conjunto indeterminado de dados contendo o código de um cliente eo código do produto que ele deseja comprar, juntamente com a quantidade.Código do cliente igual a zero indica fim do programa. O programa deveráverificar:

a) se o código do produto solicitado existe. Se existir, tentar atender ao pedido; casocontrário, exibir mensagem Código inexistente;

b) cada pedido feito por um cliente só pode ser atendido integralmente. Caso isso não sejapossível, escrever a mensagem Não temos estoque suficiente dessa mercadoria. Sepuder atendê-lo, escrever a mensagem Pedido atendido. Obrigado e volte sempre;

c) efetuar a atualização do estoque somente se o pedido for atendido integralmente;d) no final do programa, escrever os códigos dos produtos com seus respectivos estoques

já atualizados.

5.1.8. Conceito de Matriz

Matriz é uma tabela de linhas e colunas de valores de mesmo tipo,normalmente do tipo float. As matrizes são muito utilizadas para a resoluçãode problemas de Engenharia.

Seja uma matriz A de m linhas e n colunas. Esta matriz é representada emtermos da linguagem C como:

A=[a0,0 a0,1 a0,2 ⋯ a0 , n−1

a1,0 a1,1 a1,2 ⋯ a1 ,n−1

⋮ ⋮ ⋮ ⋱ ⋮am−1,0 am−1,1 am−1,2 ⋯ am−1 ,n−1

]As linhas são ordenadas verticalmente e numeradas de cima para baixo, sãoindicadas pelo primeiro índice. A matriz A possui m linhas.

As colunas são ordenadas horizontalmente e numeradas da esquerda paradireita, são indicadas pelo segundo índice. A matriz A possui n colunas.

Algoritmo e Programação para Engenharia 54

Exemplo 5.16 - Exemplo de matriz 3x4.

A=[−2 1 0 35 3 0 −1

−1 2 1 −2]A Figura 5.1 é uma representação estrutura de uma matriz Am,n, com suaslinhas, colunas e suas posições, nomenclatura dos seus índices e suavariação dentro da tabela de dados.

Figura 5.1 – Estrutura de uma matriz Am,n.

Pode-se observar os seguintes padrões em matrizes na linguagem C:

4. numa linha, os primeiros índices são fixos e os segundo variam5. numa coluna, os segundos índices são fixos e os primeiros variam

Por exemplo:

1. a linha 0 possui os elementos: a0,0 a0,1 a0,2 … a0,c … a0,n-1.2. a linha 1 possui os elementos: a1,0 a1,1 a1,2 … a1,c … a1,n-1.3. a linha l possui os elementos: al,0 al,1 al,2 … al,c … al,n-1, generalizando.4. a coluna 0 possui os elementos: a0,0 a1,0 a2,0 … al,0 … am-1,0.5. a coluna 1 possui os elementos: a0,1 a2,1 a2,1 … al,1 … am-1,1.6. a coluna c possui os elementos: a0,c a1,c a2,c … al,c … am-1,c,, generalizando.

Estes padrões podem ser vistos na equação da matriz Am,n, abaixo:

A=[a0,0 a0,1 a0,2 ⋯ a0 , c ⋯ a0 , n−1

a1,0 a1,1 a1,2 ⋯ a1 ,c ⋯ a1 , n−1

⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋮al ,0 al ,1 al ,2 ⋯ al , c ⋯ al , n−1

⋮ ⋮ ⋮ ⋮ ⋮ ⋮ ⋯am−1,0 am−1,1 am−1,2 ⋯ am−1 ,c ⋯ am−1 ,n−1

]

Algoritmo e Programação para Engenharia 55

5.1.9.Algumas operações com matrizes

Dentre as operações com matrizes, destacam-se a soma, subtração emultiplicação por número real.

Dadas as matrizes A e B:

A=[a0,0 a0,1 a0,2 ⋯ a0 , n−1

a1,0 a1,1 a1,2 ⋯ a1 ,n−1

⋮ ⋮ ⋮ ⋱ ⋮am−1,0 am−1,1 am−1,2 ⋯ am−1 ,n−1

] e B=[b0,0 b0,1 b0,2 ⋯ b0 ,n−1

b1,0 b1,1 b1,2 ⋯ b1, n−1

⋮ ⋮ ⋮ ⋱ ⋮bm−1,0 bm−1,1 bm−1,2 ⋯ bm−1 ,n−1

]A soma de A e B é uma outra matriz C, dada por:

C=[a0,0+b0,0 a0,1+b0,1 a0,2+b0,2 ⋯ a0 ,n−1+b0 , n−1

a1,0+b1,0 a1,1+b1,1 a1,2+b1,2 ⋯ a1 ,n−1+b1 , n−1

⋮ ⋮ ⋮ ⋱ ⋮am−1,0+bm−1,0 am−1,1+bm−1,1 am−1,2+bm−1,2 ⋯ am−1 ,n−1+bm−1 , n−1

]A subtração de A e B é uma outra matriz S, dada por:

S=[a0,0−b0,0 a0,1−b0,1 a0,2−b0,2 ⋯ a0 , n−1−b0 ,n−1

a1,0−b1,0 a1,1−b1,1 a1,2−b1,2 ⋯ a1, n−1−b1 , n−1

⋮ ⋮ ⋮ ⋱ ⋮am−1,0−bm−1,0 am−1,1−bm−1,1 am−1,2−bm−1,2 ⋯ am−1, n−1−bm−1, n−1

]O produto de um número real k pela matriz A é uma outra matriz P, dadapor:

P=kA=[k×a0,0 k×a0,1 k×a0,2 ⋯ k×a0 ,n−1

k×a1,0 k×a1,1 k×a1,2 ⋯ k×a1 ,n−1

⋮ ⋮ ⋮ ⋱ ⋮k×am−1,0 k×am−1,1 k×am−1,2 ⋯ k×am−1 , n−1

]

Exemplo 5.17 - Sejam A=[2 1 05 3 01 2 1] e B=[

0 1 31 2 22 0 2] , calcule C = A+B, S = A-B, P =

5A-3B.

Algoritmo e Programação para Engenharia 56

C=[2+0 1+1 0+35+1 3+2 0+21+1 2+0 1+2]=[

2 2 36 5 22 2 3 ]

S=[2−0 1−1 0−35−1 3−2 0−21−1 2−0 1−2]=[

2 0 −34 1 −20 2 −1]

P=[5×2−3×0 5×1−3×1 5×0−3×35×5−3×1 5×3−3×2 5×0−3×25×1−3×1 5×2−3×0 5×1−3×2]=[

10 2 −92 9 −62 10 −1]

Sejam as matrizes A = [al,c] e B = [bl,c], para 0 ≤ l < n e 0 ≤ c < m. Sejam C =A + B, S = A – B e P = k A, para k real, logo, pode-se escrever C = [a l,c+bl,c],S = [al,c-bl,c] e P = [kal,c], para 0 ≤ l < n e 0 ≤ c < m.

5.1.10.Tipos de matriz

A Tabela 5.5 classifica e descreve os principais tipos de matrizes e suaspropriedades matemáticas.

Tabela 5.5 - Tipos de matrizes e suas propriedades matemáticas Tipo de matriz Definição

Quadrada m = n, A=[al,c], 0 ≤ l < m e 0 ≤ c < n

Transposta se A=[al,c], 0 ≤ l < n e 0 ≤ c < m, então T=[ac,l] é sua matriz transposta, eé representada pot T = AT.

Simétrica se A=[al,c] é matriz quadrada com al,c = ac,l, então A dita simétrica.

A Tabela 5.6 caracteriza as diagonais principal e secundária de uma matrizquadrada.

Tabela 5.6 - Propriedades matemáticas das diagonais principal e secundária de uma matrizquadradaTipo de matriz Definição

Diagonal principal se A=[al,c] é uma matriz quadrada, então os elementos a l,c em que l= c são elementos de sua diagonal principal

Diagonal secundária se A=[al,c] é uma matriz quadrada de tamanho n, então oselementos al,c em que c = n-1-l são elementos de sua diagonalsecundária

Algoritmo e Programação para Engenharia 57

5.1.11.Aplicações com Matrizes

A matriz de nome A, com m linhas e n colunas, do tipo float, é declarada nalinguagem C da forma:

float A[m][n];

Se for uma matriz de nome M, com n linhas e m colunas, do tipo int, édeclarada na linguagem C da forma:

int M[m][n];

A linguagem C exige que o tamanho da matriz sejam valores constantesinteiras, isto é, um valor inteiro que não varia – não pode ser uma variável.É comum a seguinte declaração na linguagem C para uma matriz:

#define m 6#define n 4float V[m][n]; // n e m são constantes

Para fazer referência a um dos valores da matriz em C, basta usar o seunome e indicar os índices desejados da linha e da coluna.

Lembre-se que o índice da linha varia de 0 a m-1 e da coluna varia de 0 a n-1.

Nos laços abaixo, o primeiro for é o laço das linhas da matriz, e o segundofor é o laço das colunas da matriz.

O for das linhas, faz variar seu contador de repetição de 0 a m-1, estecontador é usado como índice para os elementos das linhas da matriz A. Amedida que vai variando, o bloco é executado assim pode-se percorrer aslinhas de A, uma a uma, do início ao fim.

O for das colunas, faz variar seu contador de repetição de 0 a n-1, estecontador é usado como índice para os elementos das colunas da matriz A. Amedida que vai variando, o bloco é executado assim pode-se percorrer ascolunas de A, uma a uma, do início ao fim.

Os dois laços for em conjunto, ao variar seus contadores de repetição,percorre as linhas da matriz A de cima para baixo e, as colunas de cadalinha é percorrida da esquerda para a direita, permitindo operar cadaelemento A[l][c], um por um.

Algoritmo e Programação para Engenharia 58

#define m 20#define n 20

int l, c;float A[m][n];

for( l = 0; l < m; l++ ){ for( c = 0; c < n; c++ ){ comandos para manipular o elemento da matriz A // A[l][c] – elemento da linha l e da coluna c }}

Exemplo 5.18 - Leitura e impressão dos valores de uma matriz float.

#include <stdio.h>

#define m 4#define n 3

int main( void ){ int l, c; float M[m][n];

printf("\n\n Leitura de M" ); for( l = 0; l < m; l++ ){ for( c = 0; c < n; c++ ){ printf(" De o valor de M[%d][%d]: ", l, c ); scanf("%f", &M[l][c] ); } }

printf("\n\n Impressao formatada de M" ); for( l = 0; l < m; l++ ){ printf("\n"); for( c = 0; c < n; c++ ){ printf(" %f ”, M[l][c] ); } }

return 0;}

Sejam as matrizes A, B, C=A+B, S=A-B e P=kA, k real. Estas operações commatrizes podem escritas em C usando laços for, como se segue.

Algoritmo e Programação para Engenharia 59

Exemplo 5.19 - Leitura de A e B matrizes de tamanho nxm, cálculo e impressão de C = A+ B, S = A – B e P = k A, k número float.

#include <stdio.h>

#define m 3#define n 4

int main( void ){ int l, c; float A[m][n], B[m][n], C[m][n], S[m][n], P[m][n], k;

printf("\n\n Leitura de A" ); for( l = 0; l < m; l++ ){ for( c = 0; c < n; c++ ){ printf(" De o valor de A[%d][%d]: ", l, c ); scanf("%f", &A[l][c] ); } }

printf("\n\n Leitura de B" ); for( l = 0; l < m; l++ ){ for( c = 0; c < n; c++ ){ printf(" De o valor de B[%d][%d]: ", l, c ); scanf("%f", &B[l][c] ); } }

printf("\n\n De o valor de k: " ); scanf("%f", &k );

printf("\n\n Calculo de C, S e P" ); for( l = 0; l < m; l++ ){ for( c = 0; c < n; c++ ){ C[l][c] = A[l][c] + B[l][c]; S[l][c] = A[l][c] – B[l][c]; P[l][c] = k*A[l][c]; } }

printf("\n\n Impressao formatada de C: " ); for( l = 0; l < m; l++ ){ printf( "\n" ); for( c = 0; c < n; c++ ){ printf(" %f ", C[l][c] ); } }

printf("\n\n Impressao formatada de S: " ); for( l = 0; l < n; l++ ){ printf( "\n" ); for( c = 0; c < m; c++ ){ printf(" %f ", S[l][c] ); } }

printf("\n\n Impressao formatada de P: " ); for( l = 0; l < m; l++ ){

Algoritmo e Programação para Engenharia 60

printf( "\n" ); for( c = 0; c < n; c++ ){ printf(" %f ", P[l][c] ); } }

return 0;}

Altere o valor de n e m para adequar o tamanho das matrizes.

Exemplo 5.20 - Atribuindo valores iniciais para matrizes.

#include <stdio.h>

#define m 3#define n 4

int main( void ){ int l, c; float A[m][n] = { { 1.0, -2.0, 3.1, 4.2 }, { 2.0, 3.1, 2.2, 1.1 }, { 1.0, 7.0, 3.3, 8.9 } };

printf("\n\n Impressao formatada de A: " ); for( l = 0; l < m; l++ ){ printf( "\n" ); for( c = 0; c < n; c++ ){ printf(" %f ", A[l][c] ); } }

return 0;}

Para atribuir valores para uma matriz basta organizá-los linha a linha, os elementos dalinha separados por vírgula, as linhas entre colchetes separadas por vírgula, tudo issoentre colchetes.

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

Algoritmo e Programação para Engenharia 61

A Tabela 5.7 estabelece os procedimentos computacionais para asoperações com linhas, colunas e diagonais de matrizes e seus algoritmos.

Tabela 5.7 - Operações com linhas, colunas e diagonais de matrizes e seus algoritmosOperação Procedimento

Linhas os elementos da linha l de uma matriz Am,n são al,0 al,1 al,2 … al,c … al,n-1, para0 ≤ c < n. Para operar sobre todos os elementos da linha l é suficiente um forque varie o índice da coluna e que faça a operação desejada sobre cadaelemento da linha l e coluna c.

Colunas os elementos da coluna c de uma matriz Am,n são a0,c a1,c a2,c … al,c … am-1,c,para 0 ≤ l < m. Para operar sobre todos os elementos de uma coluna c ésuficiente um for que varie o índice da linha e que faça a operação desejadasobre cada elemento da linha l e coluna c.

Diagonalprincipal

os elementos da diagonal principal de uma matriz quadrada Am,m são a0,0 a1,1

a2,2 … al,l … am-1,m-1, para 0 ≤ l < m. Para operar sobre todos os elementos dadiagonal principal é suficiente um for que varie o índice da linha e que faça aoperação desejada sobre cada elemento da linha l e coluna l.

Diagonalsecundária

s elementos da diagonal secundária de uma matriz quadrada Am,m são a0,m-1

a1,m-1 a2,m-3 … al,m-1-l … am-1,0, para 0 ≤ l < m. Para operar sobre todos oselementos da diagonal principal é suficiente um for que varie o índice dalinha e que faça a operação desejada sobre cada elemento da linha l ecoluna m-1-l.

Exemplo 5.21 - Obtenha a soma das linhas e das colunas da matriz A de dimensão 20 x30.

Os dados de entrada são os valores do vetor A – sejam ele do tipo float.

Os dados de saída são as somas de cada linha e cada coluna da matriz A.

São necessário declara a matriz A[M][N], e seus contadores l e c, ambos do tipo int. Asconstantes M e NM serão declaradas como #define.

Para obter a soma das linhas de A, será usada um laço for para percorrer as linhas de A,nomeado for linha. Dentro do for linha será declarada a variável S para a soma das linhas,ela será to tipo for e valor inicial zero (0.0). Ainda dentro for linha, será usada um laço forpara percorrer as colunas de A, nomeado for coluna. Dentro do for coluna será adicionadoo comando para soma S com o valor de cada elemento A[l][c]. Ao encerrar o for coluna,imprime-se S que corresponde a soma da linha l.

Os dois for em conjunto permite somar linha a linha de A. Inicialmente, o for linha tem l =0. A variável S é declarada e tem valor S = 0.0. O for coluna percorre a linha l = 0 e somatodos os valores A[0][c]. Encerrado o for coluna o valor de S é impresso e corresponde asoma da linha 0.

O for linha avança para a próxima linha, l = 1. A variável S é declarada e tem valor S =0.0. O for coluna percorre a linha l = 1 e soma todos os valores A[1][c]. Encerrado o forcoluna o valor de S é impresso e corresponde a soma da linha 1. E assim por diante até alinha n-1.

No algoritmo abaixo o for linha está destacado com fundo vermelho e o for coluna comfundo azul.

O algoritmo para calcular as somas das colunas é similar ao das linhas, exceto que devemser trocadas as posições dos for linha e for coluna.

No algoritmo abaixo o for linha está destacado com fundo verde e o for coluna com fundoazul.

Algoritmo e Programação para Engenharia 62

#include <stdio.h>

#define M 3#define N 4

int main( void ){ int l, c; float A[M][N];

printf("\n\n Leitura de A" ); for( l = 0; l < M; l++ ){ for( c = 0; c < N; c++ ){ printf(" De o valor de A[%d][%d]: ", l,c ); scanf("%f", &A[l][c] ); } }

printf("\n\n Soma das linhas de A" );

for( l = 0; l < M; l++ ){ float S = 0.0; for( c = 0; c < N; c++ ){ S = S + A[l][c]; } printf("\n Soma da linha %d: = %f”, l, S ); }

printf("\n\n Soma das colunas de A" );

for( c = 0; c < N; c++ ){ float S = 0.0; for( l = 0; l < M; l++ ){ S = S + A[l][c]; } printf("\n Soma da coluna %d: = %f”, c, S ); } return 0;}

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.

Exemplo 5.22 - Obtenha e imprima a soma das diagonais principal e secundária da matrizA de dimensão 30 x 30. Faça o mesmo para seus valores máximos e mínimos.

Os dados de entrada são os valores do vetor A – sejam ele do tipo float.

Os dados de saída são as somas e os valores máximo e mínimo das diagonais da matrizA.

São necessário declara a matriz A[M][M], e seus contadores l e c, ambos do tipo int. Aconstante M será declarada como #define.

Algoritmo e Programação para Engenharia 63

Para a diagonal principal serão declaradas:

• a variável Sdp do tipo float para sua soma, com valor inicial zero (0.0)• a variável DPmin do tipo float para seu mínimo, com valor inicial A[0][0]• a variável DPmax do tipo float para seu máximo, com valor inicial A[0][0]

Para a diagonal secundá serão declaradas:

• a variável Sds do tipo float para sua soma, com valor inicial zero (0.0)• a variável DSmin do tipo float para seu mínimo, com valor inicial A[0][N-1]• a variável DSmax do tipo float para seu máximo, com valor inicial A[0][N-1]

Serão usados apenas um laço for para os cálculos com os comandos descritos na Tabela5.7 . A final deste do for serão impressos os valores solicitados.

Os comandos para os valores iniciais para DPmin, DPmax, DSmin e DSmax devem sercolocados após a leitura dos valores de A e não antes.

#include <stdio.h>#define M 30int main( void ){ int l; float A[M][M], Sds, Sdp, DPmin, DPmax, DSmin, DSmax;

Sdp = 0.0; Sds = 0.0;

printf("\n\n Leitura de A" );

for( l = 0; l < M; l++ ){ for( c = 0; c < M; c++ ){ printf(" De o valor de A[%d][%d]: ", l, l ); scanf("%f", &A[l][l] ); } }

DPmin = A[0][0]; DPmax = A[0][0]; DSmin = A[0][M-1]; DSmax = A[0][M-1];

printf("\n\n Calculando … " );

for( l = 0; l < M; l++ ){

Sdp = Sdp + A[l][l]; Sds = Sds + A[l][M-1-l];

if( DPmin > A[l][l] ) DPmin = A[l][l]; if( DPmax < A[l][l] ) DPmax = A[l][l];

if( DSmin > A[l][N-1-l] ) DSmin = A[l][M-1-l]; if( DSmax < A[l][N-1-l] ) DSmax = A[l][M-1-l];

}

Algoritmo e Programação para Engenharia 64

printf( "\n Diagonal Principal " ); printf( "\n Soma : %f ", Sdp ); printf( "\n menor valor: %f ", DPmin ); printf( "\n maior valor: %f ", DPmax );

printf( "\n Diagonal Secundaria " ); printf( "\n Soma : %f ", Sds ); printf( "\n menor valor: %f ", DSmin ); printf( "\n maior valor: %f ", DSmax );

return 0;}

E uma boa prática de programação criar o dicionário com as varáveis do programa, seustipos e valores iniciais. E, o mais importante, a finalidade de cada uma delas, asoperaçõ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 Matrizes leia o Capítulo 4 – Matrizes e Strings.

5.1.13.Exercícios

1. Faça um programa que preencha uma matriz 3 x 5 com números inteiros,calcule e mostre a quantidade de elementos entre 15 e 20.

2. Crie um programa que preencha uma matriz 2 x 4 com númerosinteiros, calcule e mostre:

a) a quantidade de elementos entre 12 e 20 em cada linha;b) a média dos elementos pares da matriz.

3. Elabore um programa que preencha uma matriz 6 x 3, calcule e mostre:

a) o maior elemento da matriz e sua respectiva posição, ou seja, linha e coluna;b) o menor elemento da matriz e sua respectiva posição, ou seja, linha e coluna.

Algoritmo e Programação para Engenharia 65

4. Faça um programa que receba:

a) as notas de 15 alunos em cinco provas diferentes e armazene-as em uma matriz 15 x 5;b) os nomes dos 15 alunos e armazene-os em um vetor de 15 posições.

O programa deverá calcular e mostrar:

a) para cada aluno, o nome, a média aritmética das cinco provas e a situação (aprovado,reprovado ou exame);

b) a média da classe.

5. Elabore um programa que preencha uma matriz 12 x 4 com os valoresdas vendas de uma loja, em que cada linha representa um mês do ano ecada coluna representa uma semana do mês. O programa deverá calcular emostrar:

a) o total vendido em cada mês do ano, mostrando o nome do mês por extenso;b) o total vendido em cada semana durante todo o ano;c) o total vendido pela loja no ano.

6. Faça um programa que preencha uma matriz 20 x 10 com númerosinteiros, e some cada uma das colunas, armazenando o resultado da somaem um vetor. A seguir, o programa deverá multiplicar cada elemento damatriz pela soma da coluna e mostrar a matriz resultante.

7. Elabore um programa que preencha uma matriz M de ordem 4 x 6 euma segunda matriz N de ordem 6 x 4, calcule e imprima a soma das linhasde M com as colunas de N.

8. Crie um programa que preencha duas matrizes 3 x 8 com númerosinteiros, calcule e mostre:

a) a soma das duas matrizes, resultando em uma terceira matriz também de ordem 3 x 8;b) a diferença das duas matrizes, resultando em uma quarta matriz também de ordem 3 x

8.

9. Faça um programa que preencha uma matriz 3 x 3 com números reais eoutro valor numérico digitado pelo usuário. O programa deverá calcular emostrar a matriz resultante da multiplicação do número digitado por cadaelemento da matriz.

10. Crie um programa que preencha uma matriz 5 x 5 com númerosinteiros, calcule e mostre a soma:

a) dos elementos da linha 4;b) dos elementos da coluna 2;c) dos elementos da diagonal principal;d) dos elementos da diagonal secundária;e) de todos os elementos da matriz.

Algoritmo e Programação para Engenharia 66

11. Elabore um programa que: receba a idade de oito alunos e armazene-asem um vetor; armazene o código de cinco disciplinas em outro vetor;armazene em uma matriz a quantidade de provas que cada aluno fez emcada disciplina.

O programa deverá calcular e mostrar:

a)a quantidade de alunos com idade entre 18 e 25 anos que fizeram mais de duas provasem determinada disciplina cujo código é digitado pelo usuário. O usuário poderá digitarum código não cadastrado; nesse caso, o programa deverá mostrar uma mensagem deerro;

b)uma listagem contendo o código dos alunos que fizeram menos que três provas emdeterminada disciplina, seguido do código da disciplina;

c) a média de idade dos alunos que não fizeram nenhuma prova em alguma disciplina.Cuidado para não contar duas vezes o mesmo aluno.

12. Elabore um programa que: preencha uma matriz 6 x 4; recalcule amatriz digitada, onde cada linha deverá ser multiplicada pelo maiorelemento da linha em questão; mostre a matriz resultante.

13. Faça um programa que preencha uma matriz 2 x 3, calcule e mostre aquantidade de elementos da matriz que não pertencem ao intervalo [5,15].

14. Crie um programa que preencha uma matriz 12 x 13 e divida todos oselementos de cada linha pelo maior elemento em módulo daquela linha. Oprograma deverá escrever a matriz lida e a modificada.

15. Elabore um programa que preencha uma matriz 5 x 5 e crie dois vetoresde cinco posições cada um, que contenham, respectivamente, as somas daslinhas e das colunas da matriz. O programa deverá escrever a matriz e osvetores criados.

16. Faça um programa que preencha e mostre a média dos elementos dadiagonal principal de uma matriz 10 x 10.

17. Crie um programa que preencha uma matriz 5 x 5 de números reais,calcule e mostre a soma dos elementos da diagonal secundária.

18. Faça um programa que preencha uma matriz 8 x 6 de inteiros, calcule emostre a média dos elementos das linhas pares da matriz.

19. Elabore um programa que preencha uma matriz 5 x 5 com númerosreais e encontre o maior valor da matriz. A seguir, o programa deverá

Algoritmo e Programação para Engenharia 67

multiplicar cada elemento da diagonal principal pelo maior valor encontradoe mostrar a matriz resultante após as multiplicações.

20. Faça um programa que preencha uma matriz 5 x 5 de números reais. Aseguir, o programa deverá multiplicar cada linha pelo elemento da diagonalprincipal daquela linha e mostrar a matriz após as multiplicações.

21. Crie um programa que preencha uma matriz 6 x 10, some as colunasindividualmente e acumule as somas na linha 7 da matriz. O programadeverá mostrar o resultado de cada coluna.

5.2.Laço while

O laço while é uma estrutura de repetição muito utilizada nos programas C.Ele deve se usado sempre que não se souber de antemão quantas vezes obloco de comandos deverá ser executado. O laço while repetirá seu bloco decomando enquanto uma condição for verdadeira.

Este laço possui:

1. uma condição para finalizar o laço2. um bloco de comandos

Inicialmente, o laço avalia condição de parada, se a condição for VERDADEele executa o bloco de comandos, caso contrário encerra o laço – o bloco éignorado. Sua sintaxe é:

while( condição ){ comando; ... comando;}

onde:

1. uma condição que pode ser VERDADE ou FALSA 2. um bloco de comando

Observe que, para que seja possível fazer o teste, a variável de controledeve ter sido inicializada previamente pois o teste da condição ocorre noinício do laço.

Algoritmo e Programação para Engenharia 68

Enquanto a condição permanecer VERDADE o laço while executará seu laço.De alguma forma, o bloco deve mudar a condição de VERDADE para FALSOpara que o laço while seja encerrado.

Exemplo 5.23 - Exemplo de laço while.

#include <stdio.h>int main( void ){ int contador = 1; while( contador < 5 ){ printf(" %d ", contador ); contador++ } return 0;}

O programa é inciado pela função main. Nela é declarada uma variável int contador, paraser usada como condição de parada, logo é necessário de atribuir um valor inicial paraesta variável, no caso este valor é 1.

O programa executa o laço while em seguida.

O laço while testa sua condição de parada, ou seja, contador < 5? O valor inicial dacondição de parada 1 < 5 é VERDADE, logo o bloco é executado. O bloco possui doiscomandos, imprimir o valor do contador na tela e incrementar o contador (para que emalguma repetição sua condição se torne FALSO.

O laço executa o bloco – imprime 1 na tela e incrementa o contador, o novo valor davariável contador é 2.

O laço while testa a condição de parada. A condição 2 < 5 é VERDADE. O laço executa obloco – imprime 2 na tela e incrementa o contador, contador = 3.

O laço while testa a condição de parada. A condição 3 < 5 é VERDADE. O laço executa obloco – imprime 3 na tela e incrementa o contador, contador = 4.

O laço while testa a condição de parada. A condição 4 < 5 é VERDADE. O laço executa obloco – imprime 4 na tela e incrementa o contador, contador = 5.

O laço while testa a condição de parada. 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 while foi executado 4 vezes, imprimindo os números inteiros de 1 a 4 na tela docomputador.

Exemplo 5.24 - Exemplo de laço while com condição lida do teclado – ler e imprimirnúmeros inteiros positivos lidos do teclado, o valor 0 (zero) encerra as leituras.

Números inteiros devem ser lidos do teclado e impressos na tela enquanto seus valoresforem diferentes de zero.

O programa é resolvido com o laço while pois não se sabe o número de repetições aserem feitas.

A condição de parada é dada pelo usuário.

O algoritmo é simples, inicialmente o primeiro número deve ser lido do teclado, antes deentrar no laço.

O algoritmo entra no laço e verifica se o valor do número é igual a 0. Se for encerra e

Algoritmo e Programação para Engenharia 69

nada é impresso. O programa é encerrado.

Se o primeiro valor lido é diferente de 0, o programa entra no laço, imprime o valor donúmero na tela. Lê um novo valor do teclado e testa a condição. O laço while serárepetido indefinidamente até que o valor lido seja 0.

Observe que a condição de parada do while utiliza o valor lido do teclado e, por isso, sãonecessário dois comandos de leitura. O primeiro, antes do laço while, para que ele tenhacom o que testar sua condição de parada. O segundo, dentro do laço while, para que eleatualize o valor lido porque senão ele entra em loop – laço eterno.

#include <stdio.h>int main( void ){ int numero; printf("\n Digite um número inteiro positivo – 0 encerra " ); scanf("%d", &numero ); while( contador == 0 ){ printf("\n O numero digitado foi %d ", numero );

printf("\n Digite um número inteiro positivo " ); scanf("%d", &numero ); } return 0;}

Algoritmo e Programação para Engenharia 70

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

A Tabela 5.8 contém as condições de parada calculadas e lidas pelo tecladoe seus algoritmos.

Tabela 5.8 - Condições de parada calculadas e lidas pelo teclado e seus algoritmosCondição deparada

Procedimento

Calculadas cria-se uma variável para controlar o laço while antes dele. Atribui-se aela um valor tal que, ao ser testado no laço while, seja VERDADE, casocontrário o laço não será executado. Dentro do laço while, o valor davariável deve, em alguma repetição, ser alterado de modo que, ao seravaliada pela condição do laço ela seja FALSO, encerrando o ciclo derepetição. Leia atentamente os Exemplo 5.25 e Exemplo 5.26.

Lidas peloteclado

cria-se uma variável para controlar o laço while antes dele. Antes deentrar no laço while o valor da variável deve ser lida do teclado. Apósesta primeira leitura já se pode entrar no laço while. Ao ser testado nolaço while, se a condição for VERDADE o laço será executado, casocontrário o laço não será executado. Dentro do laço while o valor davariável deve ser lida do teclado e seu valor, em alguma repetição, sertal que, ao ser avaliada pela condição do laço ela seja FALSO,encerrando o ciclo de repetição. Leia atentamente o Exemplo 5.27.

Exemplo 5.25 - Somar os números naturais, sequencialmente, de 1 até que o totalultrapasse 100.

#include <stdio.h>int main( void ){ int numero, conta, Soma;

numero = 0; conta = 0; Soma = 0;

while( Soma <= 100 ){ numero = numero + 1; conta = conta + 1; Soma = Soma + numero; } printf("\n Soma dos números = %d ", Soma ); printf("\n Quantidade de numeros = %d ", conta ); printf("\n Ultimo numero somado = %d ", numero );

return 0;}

Algoritmo e Programação para Engenharia 71

Exemplo 5.26 - Somar números inteiros e positivos lidos pelo teclado enquanto o total formenor do que 100.

#include <stdio.h>int main( void ){ int numero, conta, Soma;

conta = 0; Soma = 0;

while( Soma < 100 ){ printf("\n Digite um numero inteiro positivo " ); scanf("%d", &numero ); conta = conta + 1; Soma = Soma + numero; } printf("\n Soma dos números = %d ", Soma ); printf("\n Quantidade de numeros = %d ", conta ); printf("\n Ultimo numero lido = %d ", numero );

return 0;}

Exemplo 5.27 - Calcule a soma de números inteiros e positivos lidos pelo teclado.

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

int numero, conta, Soma;

conta = 0; Soma = 0; printf("Digite um número inteiro positivo – 0 encerra " ); scanf("%d", &numero ); while( numero != 0 ){ conta = conta + 1; Soma = Soma + numero;

printf("\n Digite um número inteiro positivo " ); scanf("%d", &numero ); }

printf("\n Soma dos números = %d ", Soma ); printf("\n Quantidade de numeros = %d ", conta );

return 0;}

Algoritmo e Programação para Engenharia 72

Para saber mais sobre laço while leia o Capítulo 3 – Comando e Controle doPrograma.

5.2.2.Exercícios

1. Faça um programa que leia um conjunto não determinado de valores emostre o valor lido, seu quadrado, seu cubo e sua raiz quadrada. Finalize aentrada de dados com um valor negativo ou zero.

2. Somar os números naturais de 1 até que o total seja menor do que 100.

3. Faça um programa que receba o salário de um funcionário chamadoCarlos. Sabe-se que outro funcionário, João, tem salário equivalente a umterço do salário de Carlos. Carlos aplicará seu salário integralmente nacaderneta de poupança, que rende 2% ao mês, e João aplicará seu saláriointegralmente no fundo de renda fixa, que rende 5% ao mês. O programadeverá calcular e mostrar a quantidade de meses necessários para que ovalor pertencente a João iguale ou ultrapasse o valor pertencente a Carlos.

4. Faça um programa que leia um número não determinado de pares devalores [m,n], todos inteiros e positivos, um par de cada vez, e que calcule emostre a soma de todos os números inteiros entre m e n (inclusive). Adigitação de pares terminará quando m for maior ou igual a n.

5. Faça um programa para ler o código, o sexo (0 — masculino; 1 —feminino) e o número de horas/aula dadas mensalmente pelos professoresde uma universidade, sabendo-se que cada hora/aula vale R$ 50,00. Emitauma listagem contendo o código, o salário bruto e o salário líquido (levandoem consideração os descontos de 10% para homens e de 5% paramulheres) de todos os professores. Mostre também a média dos salárioslíquidos dos professores do sexo masculino e a média dos salários líquidosdos professores do sexo feminino. As informações terminarão quando forlido o código = 99999.

6. Faça um programa que receba vários números inteiros, calcule e mostre:

Algoritmo e Programação para Engenharia 73

a) a soma dos números digitados;b) a quantidade de números digitados;c) a média dos números digitados;d) o maior número digitado;e) o menor número digitado;f) a média dos números pares;g) a porcentagem dos números ímpares entre todos os números digitados.

Finalize a entrada de dados com a digitação do número 30000.

7. Uma empresa decidiu fazer um levantamento em relação aos candidatosque se apresentarem para preenchimento de vagas em seu quadro defuncionários. Supondo que você seja o programador dessa empresa, façaum programa que leia, para cada candidato, a idade, o sexo (0 - M ou 1 - F)e a experiência no serviço (1 - S ou 0 - N). Para encerrar a entrada de dados,digite zero para a idade. O programa também deve calcular e mostrar:

a) o número de candidatos do sexo feminino;b) o número de candidatos do sexo masculino;c) a idade média dos homens que já têm experiência no serviço;d) a porcentagem dos homens com mais de 45 anos entre o total dos homens;e) o número de mulheres com idade inferior a 21 anos e com experiência no serviço;f) a menor idade entre as mulheres que já têm experiência no serviço.

5.3.Laço do-while

O laço do-while é também uma estrutura de repetição da linguagem C, seudiferencial é o teste da condição de parada ao seu final.

O bloco é executado a primeira vez e laço do-while repetirá seu bloco decomando enquanto a condição for verdadeira.

No algoritmo abaixo, o laço do-while é repetido indefinidamente até queseja lido 0 do teclado.

#include <stdio.h>int main( void ){ char op; do{ printf("\n escolha sua opcao: " ); scanf( " %c", &op ); }while( op != '0' ); return 0;}

Observe que o laço do-while é executado ao menos uma vez, como a

Algoritmo e Programação para Engenharia 74

variável op é lida dentro do laço é desnecessário dar um valor inicial ela.

Exemplo 5.28 - Calculadora de quatro operações com do-while.

#include <stdio.h>

int main( void ){ char op; do{ float a, b;

printf("\n\n\n\n" ); printf("\n Calculadora "); printf("\n --------------- "); printf("\n + Somar "); printf("\n - Subtrair "); printf("\n * Multiplicar "); printf("\n / Dividir "); printf("\n --------------- "); printf("\n 0 Encerrar "); printf("\n l limpar "); printf("\n --------------- ");

// o espaço antes de %c é para evitar ler ENTER printf("\n escolha sua opcao: " ); scanf( " %c", &op );

if( (op == 'l') || (op == '0') ){ system("cls || clear"); continue; }

printf("\n digite o primeiro número: " ); scanf( "%f" , &a ); printf("\n digite o segundo número: " ); scanf( "%f" , &b );

switch( op ){ case '+': printf("\n %f + %f = %f", a, b, a+b ); break; case '-': printf("\n %f - %f = %f", a, b, a-b ); break; case '*': printf("\n %f * %f = %f", a, b, a*b ); break; case '/': printf("\n %f / %f = %f", a, b, a/b ); break; default : printf("\n :: opcao invalida :: \n"); } }while( op != '0' ); return 0;}

Algoritmo e Programação para Engenharia 75

5.4.Comando break e continue

Os comandos break e continue alteram o fluxo de operações do laço. Umlaço pode conter nenhum, um ou mais comandos break. Um laço podeconter também nenhum, um ou mais comandos continue.

O comando break encerra o laço em que está contido, como ilustrado naFigura 5.2.

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

O comando continue ignora todos os comandos abaixo dele e volta ao for,while ou do-while, como ilustrado na Figura 5.3.

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

O comando break do comando switch, comporta-se do mesmo modo que o break dos laçosde repetição (for, while e do-while). Em qualquer um destas estruturas de comandos, ao serexecutado, o break força a saída do bloco em que se encontra, quer seja do switch, querseja de um laço de repetição.

Se o comando break ele estiver dentro de um laço interno, a execução do break encerraráo laço interno e o programa executará o próximo comando do laço externo.

Algoritmo e Programação para Engenharia 76

Para saber mais sobre laço do-while leia o Capítulo 3 – Comando e Controledo Programa.

Algoritmo e Programação para Engenharia 77

6.Funções

Na linguagem C, denominamos função a um conjunto de comandos querealiza uma tarefa específica em um módulo dependente de código.

tipo_de_retorno NomeDaFuncao ( lista de parametros ){ comando; comando; … retorno_da_função;}

Para os propósitos deste texto, o tipo de retorno das funções podem servoid (a função não tem return), char, int e float.

A lista de parâmetros da função vai depender do que ela faz, mas pode servoid (não recebe parâmetro), ter um ou mais parâmetros dos tipos char, inte float. Uma função pode receber parâmetros de diversos tipos.

Exemplo 6.1 - Implementação da função SomaInt em C.

#include <stdio.h>

int SomaInt( int x, int y ){ int soma; soma = x + y; return soma;}

int main( void ){ int s, a = 5, b = 7;

s = SomaInt(a,b); printf(“\n soma = %d ”, s );

return 0;}

Algoritmo e Programação para Engenharia 78

O tipo de SomaInt é int, observe que ela retorna o valor da variável soma que é do tipoint, esta função recebe dois parâmetros, ambos do tipo int. No seu bloco, tem doiscomandos e o return obrigatório.

A função é chamada em no programa principal, a função main, com dois parâmetros, asvariáveis a e b, ambas do tipo int.

Ao ser executado, main encontrará SomaInt, neste ponto do programa, ela executará afunção, passando os parâmetros devidos. A função SomaInt, executará seu bloco decomando, executará o return. Neste ponto, a função main recebe o valor retornado eatribui a s, e segue o processamento do bloco do main.

Os parâmetros da função SomaInt e seu return realiza a comunicação entre a funçãoSomaInt e a função main.

A utilização de funções permite dividir um programa em várias partes, cadaparte sendo uma função que realiza uma tarefa bem definida.

6.1.Variáveis globais e variáveis locais

Os parâmetros das funções e as variáveis declaradas no seu bloco decomando são chamadas variáveis locais. As variáveis locais são conhecidasapenas nas funções que as declaram.

As variáveis globais são declaradas fora das funções, normalmente abaixodas inclusões de bibliotecas e das constantes.

Exemplo 6.2 - Implementação da função SomaInt em C.

#include <stdio.h>

float a = 5, b = 7, R[10], S[10][10];

int Soma( int x, int y ){ int s; s = x + y; return s;}

int main( void ){ printf(“\n soma = %d ”, Soma(a,b) ); return 0;}

As variáveis a, b, o vetor R e a matriz S são globais, são acessíveis em qualquer lugar doprograma. A função main faz uso de a e b como parâmetros para a função Soma.

A função Soma possui três variáveis locais, a saber, x, y e s.

Algoritmo e Programação para Engenharia 79

A função Soma pode fazer operações com as variáveis a, b, R e S, que são globais.

Exemplo 6.3 - Leitura de vetores, cálculo e impressão de C = A + B usando funções.

#include <stdio.h>

#define n 4

float A[n], B[n], C[n];

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

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

void SomaAB( void ){ int c; printf("\n\n Calculo de C = A + B" ); for( c = 0; c < n; c++ ){ C[c] = A[c] + B[c]; }}

void ImprimeC( void ){ int c; printf("\n\n Impressao de C: " ); for( c = 0; c < n; c++ ){ printf(" %f ", C[c] ); }}

int main( void ){ LeiaA(); LeiaB(); SomaAB(); ImprimeC(); return 0;}

Este código, organizado em funções, permitiu a modularização com a criação de funções

Algoritmo e Programação para Engenharia 80

especializadas em leitura, soma e impressão de resultados. Estas funções são void, semparâmetros e sem return.

As matrizes foram declaradas fora dos blocos das funções, sendo globais a todas elas.

A função main apenas chama as demais funções de modo ordenado e se encerra.

Para saber mais sobre funções leia o Capítulo 6 – Funções.

6.2. Exercícios

1. Faça uma função que receba um número inteiro e positivo N comoparâmetro e retorne a soma dos números inteiros existentes entre onúmero 1 e N (inclusive).

2. Crie uma função que receba três números inteiros como parâmetros,representando horas (h), minutos (min) e segundos (s), e os converta emsegundos. Exemplo: 2 h, 40 min e 10 s correspondem a 9.610 s.

3. Faça uma função que receba um valor inteiro e verifique se ele é positivoou negativo.

4. Crie uma função que receba como parâmetro a altura (alt) e o sexo deuma pessoa e retorne seu peso ideal. Para homens, deverá calcular o pesoideal usando a fórmula: peso ideal = 72.7 * alt − 58; para mulheres: pesoideal = 62.1 * alt − 44.7.

5. Elabore uma função que leia um número não determinado de valorespositivos e retorne a média aritmética desses valores. Terminar a entradade dados com o valor zero.

6. Faça uma função que receba um valor inteiro e positivo, calcule e mostreseu fatorial.

Algoritmo e Programação para Engenharia 81

7. Elabore uma função que receba como parâmetro um valor n (inteiro emaior ou igual a 1) e determine o valor da soma S = 1 +1/2 + 1/3 + … + 1/n.

8. Faça uma função que receba como parâmetro um valor inteiro e positivon, indicando a quantidade de parcelas de uma soma S, calculada pelafórmula: S = 1/3 + 2/4 + 5/5 + 10/6 + 17/7 + 26/8 + … + (n2+ 1)/(n+3).

9. Foi realizada uma pesquisa entre 15 habitantes de uma região. Os dadoscoletados de cada habitante foram: idade, sexo, salário e número de filhos.Faça uma função que leia esses dados armazenando-os em vetores. Depois,crie funções que recebam esses vetores como parâmetro e retornem amédia de salário entre os habitantes, a menor e a maior idade do grupo e aquantidade de mulheres com três filhos que recebem até R$ 500,00 (utilizeuma função para cada cálculo).

10. A prefeitura de uma cidade fez uma pesquisa entre seus habitantes,coletando dados sobre o salário e o número de filhos. Faça uma únicafunção que leia esses dados para um número não determinado de pessoas eimprima a média de salário da população, a média do número de filhos, omaior salário e o percentual de pessoas com salário inferior a R$ 1.200,00.

11. Crie um programa que receba três valores (obrigatoriamente maioresque zero), representando as medidas dos três lados de um triângulo.Elabore funções para:

a) determinar se esses lados formam um triângulo (sabe-se que, para ser triângulo, amedida de um lado qualquer deve ser inferior ou igual à soma das medidas dos outrosdois).

b) determinar e mostrar o tipo de triângulo (equilátero, isósceles ou escaleno), caso asmedidas formem um triângulo.

Todas as mensagens deverão ser mostradas no programa principal.

12. Faça um programa que receba a temperatura média de cada mês doano e armazene-as em um vetor. O programa deverá calcular e mostrar amaior e a menor temperatura do ano, junto com o mês em que elasocorreram (o mês deverá ser mostrado por extenso: 1 = janeiro; 2 =fevereiro; …). Observação: não se preocupe com empates. Cada cálculodeve ser realizado e mostrado em uma função.

13. Crie um programa que receba o número dos 10 alunos de uma sala,armazenando-os em um vetor, junto com as notas obtidas ao longo dosemestre (foram realizadas quatro avaliações). Elabore funções para:

Algoritmo e Programação para Engenharia 82

a) determinar e mostrar a média aritmética de todos os alunos;b) indicar os números dos alunos que deverão fazer recuperação, ou seja, aqueles com

média inferior a 6.

Todas as mensagens deverão ser mostradas no programa principal.

Algoritmo e Programação para Engenharia 83

arte II – Linguagem C para EngenhariasP

Algoritmo e Programação para Engenharia 84

7.Anatomia de um Programa escrito em C

Transformar algoritmo em programa de computador requer aprender umalinguagem e dominar seus princípios e suas técnicas.

Escrever programas de computador envolve software e hardware. Estesdois itens são tão numerosos que não é possível ter uma técnica padrãopara todos os casos.

Dentre todas as linguagens de programação, a Linguagem C é muitoutilizada em engenharia. A Linguagem C é um subconjunto da LinguagemC++.

O programa abaixo é o programa mais simples da Linguagem C. Ele nãotem nem entrada e nem saída para o programador. É muito simples etambém sem utilidade prática.

#include <stdio.h>int main( void ){ return 0;}

A Linguagem C possuem alguns delimitadores (pontuação) próprios, como:# <> () {} , ; . e outros que serão vistos adiante.

Os caracteres reconhecidos pela Linguagem C são da língua inglesa, ela nãoreconhece os acentos da língua portuguesa.

Os nomes reconhecidos pela Linguagem C seguem regras muitos rigorosase, as vezes, geram erros que julgamos absurdos.

Devemos nos lembrar que a construção de programas de computador

Algoritmo e Programação para Engenharia 85

requer seguir regras muito rígidas, sem exceção – o sucesso depende deconhecê-las e aplicá-las, o que requer fazer programas e corrigi-los até quefuncionem corretamente.

Faça uma leitura do Capítulo 1 – Uma Visão Geral do C, páginas 3 a 15.Este capítulo vai ajudar a entender o processo de compilação e execuçãode programas C.

7.1. Inclusões de bibliotecas

A Linguagem C possui muitos recursos internos. Estes recursos estãoorganizados em bibliotecas padronizadas. Uma delas é a stdio – standardinput/output em inglês. Para incorporá-la ao programa utiliza-se a marca deinclusão #include <stdio.h>.

Na biblioteca padrão stdio.h estão incluídas diversas funções como printf –para escreve no monitor (tela) do computador e scanf – para ler do tecladodo computador.

#include <stdio.h>int main( void ){ printf("\n Ola mundo!"); return 0;}

Este programa permite escrever no monitor do computador a mensagem:

Ola mundo!

Observe a anatomia da função printf. Mais adiante será visto o uso do scanf.

printf( "formato", lista de variáveis );

Faça uma leitura do Capítulo 8 –E/S pelo console, páginas 198 a 218.Este capítulo vai ajudar a entender o uso de printf e scanf.

7.2. Função main

Algoritmo e Programação para Engenharia 86

A função main é principal de um programa em C. É a partir dela que oprograma é iniciado. Ela tem que existir no programa.

A forma mais geral da função main é:

#include <stdio.h>int main( int argc, char *argv[] ){ return 0;}

Esta forma não será usada neste texto.

7.3. Bloco de comandos

Blocos de comando servem para organizar o código fonte (o texto queescrevemos) do programa de computador. São usados para agrupar um oumais comandos. São como os cômodos de uma casa.

Um bloco de comando começa com { e termina com }, são os delimitadoresde bloco de comando. Os comandos de um bloco são executados em grupo,quantas vezes forem necessárias.

O fim de um comando dentro de um bloco é indicado pelo ponto e vírgula(;), o delimitador de comando.

Pode haver um ou mais comandos dentro de um bloco, cada um destescomandos devem ser encerrados por um ponto e vírgula. Pode-se criarblocos vazios mas não uso prático.

Pode haver blocos dentro de blocos, e assim por diante. Nestes casos, alémde agrupar eles também pode isolar os comandos dentro de um bloco. Seususo requer prática e senso de organização.

7.4. Comando return

O comando return encerra uma função, normalmente é o último comandodo bloco da função, mas pode figurar em qualquer lugar do bloco. Pode

Algoritmo e Programação para Engenharia 87

haver mais de um comando return em uma função.

Ao executar o return a função é encerrada. Dado continuidade ao fluxocodificado.

A forma geral do comando return é:

return resultado;

ou

return ;

Ele retorna um resultado ou nenhum. Não tem como retornar mais de umvalor.

O return é um elemento de comunicação entre uma função e seu ponto dechamada, normalmente em uma outra função.

7.5. Funções Criadas pelo Programador

O uso de funções na Linguagem C permite dar estrutura e organização aocódigo fonte do programa de computador. São as unidades básicas eespecializadas, são recursos valiosos e devem ser usados sempre quenecessário.

Uma função em C tem a forma geral:

tipo nome( [parametros] ){ [return var;] }

Os colchetes indicam, neste caso, coisas opcionais, no caso os parâmetros eo return de uma função.

Uma função precisa ter um tipo (como char, int, float, double, void). Estetipo refere-se ao que ela retorna. Se ela for void então não requer return,caso contrário a função requer ao menos um return.

Uma função precisa ter nome e um conjunto de parâmetros opcionais. Vejaque após o nome é necessário abrir e fechar parêntesis, o delimitador de

Algoritmo e Programação para Engenharia 88

parâmetros da função. Se a função não possuir parâmetros usa-se indicá-lopor void.

Uma função precisa ter seu bloco de comandos, ele delimita a função edefine seus uso. A Tabela 7.1 mostra alguns exemplos de funções, seustipos, parâmetros e uso do return.

Tabela 7.1 - Descrição de funções, seu tipos, parâmetros e uso do returnvoid escreva( void ){ printf("\n Ola mundo!");}

Função do tipo void, não recebeparâmetros e sem retorno.

int soma( int a, int b ){ return a+b;}

Função do tipo int, recebe doisparâmetros e possui retorno.

void saida( int a, int b ){ printf(“\n a+b = %d”, a+b );}

Função do tipo void, recebe doisparâmetros e não possui retorno.

void divide( float x, float y ){ printf(“\n x/y = %f”, x/y ); return;}

Função do tipo void, recebe doisparâmetros e possui retorno porémvazio.

Na linguagem C há o protótipo de uma função que serve para indicarapenas seu cabeçalho, que é constituído pelo seu tipo, nome e parâmetros.O protótipo das funções acima são:

void escreva( void );int soma ( int, int );void saida ( int, int );void divide ( float, int );

Os protótipos indicam os tipo da função, seu nome e os tipos e quantidadesde parâmetros entre parêntesis e o delimitador ponto e vírgula.

Sabendo o protótipo de uma função é o suficiente para usá-la. Neste caso, ocorpo da função é, ou está feito, em outro lugar.

A Bibliotecas Padrão da Linguagem C é muito rica e sua documentação éfeita por meio de protótipos.

Faça uma leitura das páginas 270, 276 a 278. Estes textos referem-se àParte II – Biblioteca C Padrão.

Os demais capítulos da Parte II descrevem as funções C padrão comexemplos.

Algoritmo e Programação para Engenharia 89

Pesquise na web: Biblioteca Padrão C

Algoritmo e Programação para Engenharia 90

8. Compilando e Executando Programas C

Para compilar e executar programas C recomenda-se o uso de uma IDE -Integrated Development Environment ou Ambiente de DesenvolvimentoIntegrado. Uma IDE é um software que combina recursos, como editor decódigo-fonte; o compilador de código-fonte em linguagem de máquina – ocódigo binário; o linker que gera o programa executável a partir do códigobinário e da biblioteca padrão.

A IDE Dev-Cpp é uma das mais utilizadas para compilar programas para osistema operacional Microsoft Windows, Figura 8.1. Os recursos a seremutilizados são do Menu Arquivo (Novo, Abrir, Salvar Como e Salvar) e doExecutar (Compilar, Executar, Compilar & Executar e Recompilar Tudo).

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

Para criar um arquivo-fonte basta clicar em Arquivo→Novo→Arquivo Fonteou pressionar as duas teclas Ctrl+N. Pode-se usar o primeiro botão da barrade menu para isso.

Algoritmo e Programação para Engenharia 91

Tem duas opções salvar um arquivo aberto: Salvar e Salvar Como. Esteúltimo permite renomear o arquivo.

O menu Executar, possui as opções descritas na Tabela 8.1.

Tabela 8.1 - Comandos para compilar, recompilar e executar códigos-fonte C usando a IDEDev-CppComando Atalho Descrição

Executar→Compilar F9 compila o arquivo-fonte em foco e, se não houver erros,gera o executável

Executar→Executar F10 executa o programa previamente compilado

Executar→Compilar &Executar

F11 compila o arquivo-fonte em foco e, se não houver erros,gera o executável e o executa

Executar→RecompilarTudo

F12 compila novamente todos os arquivo-fonte abertos e, senão houver erros, gera o executável

Pode-se ver o resultado do processo de compilação na parte de baixo daIDE, como pode ser visto na Figura 8.1.

No caso de haver erro no programa-fonte, este é indicado no texto edescrito na parte de baixo da IDE. Na Figura 8.2 pode-se observar um errona linha 9 e sua descrição. Veja que não é tão simples, o erro refere-se àfalta de ponto e vírgula deve ser corrigido na linha 7.

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

Os compiladores são programados para dar mensagens de aviso (warningem inglês) quando há suspeita de mal uso da linguagem, mas o programasegue e é compilado. As mensagens de erro (error em inglês) indicam maluso da linguagem, neste caso o programa não é compilado.

Algoritmo e Programação para Engenharia 92

Quando o programa é executado, aparece a janela de fundo de cor preta,Figura 8.3. É necessário fechar esta janela para recompilar o programa.

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

Exemplo 8.1 - Digite o programa abaixo na IDE Dev-Cpp e salve-o como Exemplo31.c, emseguida compile-o, corrija os erros se houver e execute-o.

#include <stdio.h>

int main( void ){ printf(“Olá mundo”);

return 0;}

Vale destacar alguns problemas que podem ocorrer. Erro devido ao nome do arquivo:nome de arquivos podem ter letras e números porém do alfabeto inglês e não deve conterespaços. Exemplos de nomes adequados: Programa02.c, MeuPrograma.c, Exemplo-31.c.

Pode ocorrer erros devido ao nome inadequado da pasta onde foi salvo o arquivo.

Erros de digitação são extremamente comuns e requer a paciência do programador paracorrigi-los.

Nos primeiros programas digitados e compilados pelo programador é muito comum terque compilar e recompilar o mesmo programa várias vezes para corrigir erros.

O programador deve ter paciência para superar esta fase inicial. Quanto mais atenção aosdetalhes mais rapidamente aprende-se a programar sem erros.

Ninguém gosta de corrigir erros de programa de computador mas eles são inevitáveis, nósseres humanos pensamos em alto nível e a máquina é de baixo nível, funciona passo apasso, detalhe a detalhe.

Algoritmo e Programação para Engenharia 93

Os compiladores são extremamente22 exigentes, muito mais que nossas queridas mães.

:: extremamente22 = extremamente, extremamente, …, extremamente; 22 vezes.

Exemplo 8.2 - Digite o programa abaixo na IDE Dev-Cpp e salve-o como SaindoDados.c,em seguida compile-o, corrija os erros se houver e execute-o.

#include <stdio.h>

int main( void ){ printf( “Meu nome é: … ” );

return 0;}

Exemplo 8.3 - Digite o programa abaixo na IDE Dev-Cpp e salve-o como ESDados.c, emseguida compile-o, corrija os erros se houver e execute-o.

#include <stdio.h>

int main( void ){

int idade; printf( “Digite sua idade em anos:” );

scanf( “%d”, &idade );

printf( “Minha idade é %d anos”, idade );

return 0;}

Observe a organização do código-fonte, os comandos foram digitados alinhados com apalavra main. Isto se chama edentação e ajuda na legibilidade do programa.

Uma boa prática de programação é a edentação, acostume-se a usá-la.

Exemplo 8.4 - Digite o programa abaixo na IDE Dev-Cpp e salve-o como Soma.c, emseguida compile-o, corrija os erros se houver e execute-o.

#include <stdio.h>int main( void ){ int a, b, soma; a = 3; b = 4; soma = a + b;

Algoritmo e Programação para Engenharia 94

printf( “A soma é %d”, soma ); return 0;}

Faça o download do Dev-Cpp de http://orwelldevcpp.blogspot.com.br,Escolha a opção que inclui o TDM-GCC 4.9.2 e instale-o no seu

computador.

No Linux pode-se utilizar o Code::Blocks de www.codeblocks.org.

No Android pode-se usar o CppDroid C/C++ IDE, disponível na Play Store.

Algoritmo e Programação para Engenharia 95

9.Conceitos da Linguagem C

Inicialmente temos os comentários, o de várias linhas são delimitados por /**/. E o de uma única linha começa com // e vai a até o fim da linha.

Constantes em C são valores que não mudam no programa, são definidascomo se segue:

#define NomeDaConstante ValorDaConstante

Não tem ponto e vírgula no final. Exemplos:

#define PI 3.1415926535 // constante PI = 3.1415926535#define DUZIA 12#define AUTOR “Brauliro Gonçalves Leal”#define LETRA ‘a’

É uma tradição dos programadores C usar nomes de constantes emmaiúsculo, dessa forma elas se destacam no programa-fonte e sãorapidamente identificadas como tal.

Os programadores são livres para criar e dar nomes às suas constantes. ABiblioteca Padrão da linguagem C possuem muitas constantes, algumasdelas serão vistas neste curso.

Variáveis são nomes que os programadores criam para guardar valores,elas podem mudar durante o programa, daí ter esse nome, meio óbvio.

O nome de uma variável segue algumas regras que são: possuem letras enúmeros, as letras devem ser do alfabeto inglês, iniciar com letra, possuiruma ou mais letras, não pode conter espaços.

Algoritmo e Programação para Engenharia 96

A Linguagem C distingue entre letras maiúsculas e minúsculas. O comando abaixodeclaram duas varáveis diferentes:

int x, X;

A variável X é diferente da variável x.

Por convenção, as palavras reservados de C são grafados em letras minúsculas, comomain, printf, include, exceto as constantes, que costumam ser grafadas em maiúsculas.

Saiba mais no site da wikipedia ou faça um busca na web.

Pode ter vários tipos de valores, como letras, texto e números. Os númerospodem ser inteiros ou fracionários, reais ou complexos.

Pesquise na web: como dar nomes a constantes, variáveis e nomes emprogramas escritos em C

Para dar conta desta variedade de possibilidades, a linguagem C possuivários tipos para se adequarem à realidade.

Para representar letras tem o tipo char, declarado assim:

char letra;letra = ‘a’;

ou

char letra = ‘a’;

A variável letra pode receber valores que significam letras, que sãodelimitados por aspas simples.

Pode-se declarar e atribuir valores iniciais para várias variáveis do tipo char,como abaixo:

char c, ch = ‘l’, x = ‘x’, sexo = ‘F’;

Exemplo 9.1 - Lendo char do teclado e escrevendo-a na tela

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

char c;

printf("Digite a latra : " ); scanf("%c", &c );

Algoritmo e Programação para Engenharia 97

printf("Letra digitada: %c", c );

return 0;}

Ao executar este programa, digite o caractere e tecle ENTER.

Se for digitado mais de uma letra será lida apenas a primeira pois a Linguagem Cdesprezando os caracteres restantes.

A leitura de uma string pode ser feita pela função scanf utilizando %c para indicar que c éuma variável do tipo char.

scanf( “%c”, &c );

É necessário o caractere de controle & para leitura de char.

O tipo char é o menor tipo de Linguagem C, ocupa um byte (1 B) na memória, usado pararepresentar caracteres em geral. O código ASCII é usado para representar números, letras,símbolos e caracteres de controle.

ASCII em inglês é American Standard Code for Information Interchange, em português éCódigo Padrão Americano para o Intercâmbio de Informação. É um código binário (cadeiasde bits: 0s e 1s) que codifica um conjunto de 128 sinais: 95 sinais gráficos (letras doalfabeto latino, sinais de pontuação e sinais matemáticos) e 33 sinais de controle.

O código C a seguir gerar os caracteres ASCII, de 32 a 126 – os mais comuns.

//---------------------------------------------------#include <stdio.h>//---------------------------------------------------int main( void ){ char c;

printf( "\n----------------" ); printf( "\n Decimal ASCII " ); printf( "\n----------------" );

for( c = 32; c < 127; c++ ){ printf( "\n %4d %6c", c, c ); } printf( "\n----------------" ); return 0;}//---------------------------------------------------

Saiba mais no site da wikipedia ou faça um busca na web.

O tipo string é utilizado para manipular textos com mais de um caractere. Ésimilar ao char mas como pode-se textos de diversos tamanhos é necessárioespecificar o tamanho. Para que a máquina identifique o fim do texto naLinguagem C, acrescenta-se 1 ao tamanho para acomodar a marca de fimda string.

char nome[ tamanho máximo + 1 ];

Algoritmo e Programação para Engenharia 98

A marca de fim é 0000 0000, o byte nulo, denominado null, representadopor \0, como indicado na Tabela 9.1, ou seja uma string é um pacoteconstituído pelo seu texto + null.

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

Tamanho máximo do texto 0000 0000

Tamanho máximo do texto null

Tamanho máximo do texto \0

Exemplo 9.2 - Abaixo estão declarados uma string e um caractere.

char nome[35] = “Joao da Silva”, sexo = ‘M’;

A string nome pode possuir cadeias de até 34 caracteres pois o último é reservado para onull, a marca de fim da string. A linguagem C coloca automaticamente o null nasdeclarações de strings com atribuição de valor.

Note que string requer aspas duplas para delimitar início e fim.

A variável sexo possui apenas um caractere e com valor inicial M.

Note que caractere requer aspas simples para delimitar início e fim.

Nem sempre a linguagem C coloca automaticamente o null em strings, há operações emque o programador precisa assumir o controle e acrescentar as maracas de fim de stringvia código.

A leitura de uma string pode ser feita pela função scanf utilizando %s paraindicar que nome é uma variável do tipo string.

scanf( “%s”, nome );

Não é necessário o caractere de controle & para leitura de string.

Exemplo 9.3 - Lendo string do teclado e escrevendo-a na tela

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

char nome[35];

printf("Digite o nome : " ); scanf("%s", nome );

printf("Nome digitado: %s", nome );

return 0;}

Algoritmo e Programação para Engenharia 99

Ao executar este programa, digite a sequência de caractere e tecle ENTER.

Verifique que ao digitar “Joao da Silva” será lido apenas “Joao” pois a Linguagem C leráaté o caractere espaço, desprezando os caracteres restantes.

Verifique que ao digitar mais de 34 caracteres poderá ocorrer erro de entrada. Este erro échamado de overflow, extrapolou um limite, no caso mais caracteres do que a variávelpode conter.

A atribuição valores para string requer o uso da função strcpy. Seja a variável charnome[35], uma string de tamanho 34 + null. Para atribuir o valor “João da Silva” à variávelnome, deve-se usar o comando:

char nome[35];strcpy(nome,“João da Silva”); // é correto

Fazer assim:

char nome[35];nome = “João da Silva”; // é incorreto

Fazer assim:

char nome[35] = “João da Silva”; // é correto pois está declarando e atribuindo valor à variável string

O tipo int é utilizado para manipular números inteiros. As variáveis abaixosão inteiras e z recebe o valor 234.

int x , y, z = 234;

Exemplo 9.4 - Lendo inteiros do teclado e escrevendo-a na tela

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

int x;

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

printf(" x = %d", x );

return 0;}

Ao executar este programa, digite o número inteiro e tecle ENTER.

Algoritmo e Programação para Engenharia 100

Exemplo 9.5 - Lendo inteiros do teclado e escrevendo-a na tela

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

int x, y;

printf("Digite os valores de x e y : " ); scanf("%d %d", &x, &y );

printf(" x = %d", x ); printf(" y = %d", y );

return 0;}

Ao executar este programa, digite dois números inteiros separados por espaço e tecleENTER.

Exemplo 9.6 - Lendo inteiros do teclado e escrevendo-a na tela

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

int x, y;

printf("Digite os valores de x e y : " ); scanf("%d,%d", &x, &y );

printf(" x = %d", x ); printf(" y = %d", y );

return 0;}

Ao executar este programa, digite dois números inteiros separados por vírgula e tecleENTER.

Qual é a diferença entre os dois últimos exemplos?

Quando usar o tipo int?

O tipo int deve ser usado sempre que for necessário o uso de números inteiros como idade,contadores, quantidades, enumeração, índices de vetores e matrizes.

Saiba mais no site da wikipedia ou faça um busca na web.

Algoritmo e Programação para Engenharia 101

O tipo float é utilizado para manipular números fracionários ou reais. Asvariáveis abaixo são números reais do tipo float e z recebe o valor 234.0.

float x , y, z = 234.0;

Exemplo 9.7 - Lendo float do teclado e escrevendo-a na tela

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

float x;

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

printf(" x = %f", x );

return 0;}

Ao executar este programa, digite o número e tecle ENTER.

Quando usar o tipo float?

O tipo float deve ser usado sempre que for necessário o uso de números reais como somas,médias, estatísticas em geral, expressões aritméticas em geral, expressões que envolvedivisão.

Saiba mais no site da wikipedia ou faça um busca na web.

O tipo double é utilizado para manipular números fracionários ou reais, sãoúteis para cálculo de grande precisão. As variáveis abaixo são númerosreais do tipo double e z recebe o valor 234.0.

double x , y, z = 234.0;

Exemplo 9.8 - Lendo double do teclado e escrevendo-a na tela

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

double x;

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

printf(" x = %lf", x );

return 0;}

Algoritmo e Programação para Engenharia 102

Ao executar este programa, digite o número e tecle ENTER.

Valores muito grandes ou muito pequenos, expressos em notação científica, sãorepresentados em C substituindo a potência de 10 por ‘E’ ou ‘e’, por exemplo:

0.000001 = 1.0ˣ10-6 em C é 1.0E-6 ou 1.0e-6

1.000.000 = 1.0ˣ10+6 em C é 1.0E6 ou 1.0e6.

É muito comum errar o uso de tipos de entrada e saída em C. Uma maneira de verificar sehouve erro na entrada de dados é imprimir os dados e certificar se as entradas são iguaisàs saídas.

Tabela 9.2 - Resumo da formação dos comandos de leitura e escrita dos tipos char, char[], int,float e doubleDeclaração Leitura Escrita

char x; scanf( “%c”, &x ); printf( “%c”, x );

char x[35]; scanf( “%s”, x ); printf( “%s”, x );

int x; scanf( “%d”, &x ); printf( “%d”, x );

float x; scanf( “%f”, &x ); printf( “%f”, x );

double x; scanf( “%lf”, &x ); printf( “%lf”, x );

Neste texto será usada os tipos char, int e float, preferencialmente.

Algoritmo e Programação para Engenharia 103

arte III – Aplicações na EngenhariasP

Algoritmo e Programação para Engenharia 104

10.Aplicações com Séries

(Precisa reorganizar

A fórmula geral de uma série é S=∑i=1

u i , ou seja, S=u0+u1+u2+u3+u4+⋯ .

Considere obter a série S=∑i=1

∞ 1

x2 i, ou seja, S=1+

1

x2+

1

x4+

1

x6+

1

x8+⋯ . Esta

soma é infinita e não tem como calcular seu valor exato por meio dealgoritmo. Como foi visto, algoritmos precisam ser finitos.

Como as séries são muito úteis nas engenharias, foram desenvolvidosmétodos e técnicas para aproximação de séries infinitas, que consiste emcalculá-las de modo aproximado. No quadro abaixo, pode-se ver os valoresde, i, ui, 1/x2i e S, para x= 0,5.

i ui 1/x2i S

0 u0 1,0000000 1,0000000

1 u1 0,2500000 1,2500000

2 u2 0,0625000 1,3125000

3 u3 0,0156250 1,3281250

4 u4 0,0039063 1,3320313

5 u5 0,0009766 1,3330078

6 u6 0,0002441 1,3332520

7 u7 0,0000610 1,3333130

8 u8 0,0000153 1,3333282

9 u9 0,0000038 1,3333321

10 u10 0,0000010 1,3333330

11 u11 0,0000002 1,3333333

12 u12 0,0000001 1,3333333

Algoritmo e Programação para Engenharia 105

13 u13 0,0000000 1,3333333

14 u14 0,0000000 1,3333333

15 u15 0,0000000 1,3333333

16 u16 0,0000000 1,3333333

Pode-se verificar que basta somar os primeiros 13 termos desta série parase obter seu valor aproximado com 7 casas decimais.

Observe que a medida que o valor de i aumenta, o valor das parcelascorrespondentes diminuem. A partir de i = 13, as parcelas não maiscontribuem com a soma. Sendo assim, basta obter a série para i de 0 a 12.

Considere obter a série S=∑i=1

(−1)i x

2 i+1

2i+1, ou seja, S=x−

x3

3−x5

5+x7

7+⋯ . No

quadro abaixo, pode-se ver os valores de, i, u i, (-1)ix2i+1/2i+1 e S, para x=0,7.

i ui (-1)ix2i+1/2i+1 S

0 u0 0,7000000 0,7000000

1 u1 -0,1143333 0,5856667

2 u2 0,0336140 0,6192807

3 u3 -0,0117649 0,6075158

4 u4 0,0044837 0,6119995

5 u5 -0,0017976 0,6102019

6 u6 0,0007453 0,6109472

7 u7 -0,0003165 0,6106307

8 u8 0,0001368 0,6107676

9 u9 -0,0000600 0,6107076

10 u10 0,0000266 0,6107342

11 u11 -0,0000119 0,6107223

12 u12 0,0000054 0,6107276

13 u13 -0,0000024 0,6107252

14 u14 0,0000011 0,6107263

15 u15 -0,0000005 0,6107258

16 u16 0,0000002 0,6107260

17 u17 -0,0000001 0,6107259

18 u18 0,0000001 0,6107260

19 u19 0,0000000 0,6107260

20 u20 0,0000000 0,6107260

Pode-se verificar que basta somar os primeiros 19 termos desta série para

Algoritmo e Programação para Engenharia 106

se obter seu valor aproximado com 7 casas decimais.

Observe que a medida que o valor de i aumenta, o valor das parcelascorrespondentes diminuem mas alternam seu sinal, ora positivo oranegativo. A partir de i = 19, as parcelas, positivas ou negativas, não maiscontribuem com a soma. Sendo assim, basta obter a série para i de 0 a 19.

As séries, de modo geral, seguem este padrão. Os matemáticos e cientistasda computação já identificaram as séries que podem ser tradadas pormétodos computacionais. Estes métodos são extensivamente tratados nadisciplina de Cálculo Numérico.

Pode-se utilizar o laço while para obter séries por meio de computador,usado como a condição de parada um valor limite para suas parcelas, apartir da qual não se justifica somá-las. Denominando este valor limite dePRECISAO, segue o algoritmo:

S = 0calcular u inicial // é o valor de u0

while( |u| > PRECISAO ){ S = S + u calcular u // é o valor do termo geral ui

}imprimir S

Os comandos “calcular u inicial” e “calcular u” vão depender de cada série,em geral é necessário criar variáveis auxiliares para calcular os sucessivosvalores de u.

No início, o valor da série é nulo, S = 0. Antes de entra no laço é necessáriocalcular a primeira parcela da série pois ele é utilizado como condição dolaço while. Se o valor da primeira parcela for menor do que o limite imposto( |u| < PRECISAO ) o bloco do while não será executado. Caso contrário seubloco será executado.

O valor de u em módulo, ou seja |u| , é utilizado para o cado de valores de unegativos porém maiores do PRECISAO em módulo.

O bloco do while tem dois comandos. O primeiro adiciona o valor de u aovalor de S. O segundo calcula os sucessivos valores de u. Ao encerrar obloco, o while testa novamente a condição. Se a condição for VERDADEentra no laço, recalcula S e u. Se a condição for FALSE encerra o laço.Imprime o valor da série.

Algoritmo e Programação para Engenharia 107

Exemplo 10.1 - Programa C para calcular S=∑i=1

∞ 1

x2 i, para x = 0.5.

#include <stdio.h>

#define PRECISAO 1.0E-6

int main( void ){ int i; float x, u, S;

i = 0 ; x = 0.5; u = 1.0; S = 0.0;

while( fabs(u) > PRECISAO ){ S = S + u; i = i + 1; u = pow( x, 2*i ); }

printf(“\n S = %f ”, S );

return 0;}

O valor de PRECISAO foi definido como constante e igual a 1.0E-6 (0.000001).

Neste programa foram criadas as variáveis auxiliares i e x para calcular os valores de u.

O valor inicial de u (u0) é obtido teoricamente.

A variável inteira i é o contador para os termos ou parcelas da série. Seu valor inicial é 0(zero).

A variável float x faz parte do termo geral da série. Seu valor é fixo e igual a 0.5.

A variável float u é o termo geral da série. Seu valor inicial e igual a 1.0 (obtido da teoriamatemática).

Os sucessivos valores de u são calculados por dois comandos, incremento de i e elevar x a2i, o termo geral da série, dada pela teoria matemática.

Vale destacar que o valor de PRECISAO depende de cada série. Para os propósitos destecurso, PRECISAO = 1.0E-6 é adequado.

Como a série tem apenas termos positivos, e apenas por este motivo, o comandowhile( fabs(u) > PRECISAO ) pode ser substituído por while( u > PRECISAO ).

Exemplo 10.2 - Programa C para calcular S=∑i=1

(−1)i x

2 i+1

2i+1, para x = 0.7.

#include <stdio.h>

#define PRECISAO 1.0E-6

Algoritmo e Programação para Engenharia 108

int main( void ){ int i; float x, u, S;

i = 0 ; x = 0.7; u = x ; S = 0.0;

while( fabs(u) > PRECISAO ){ S = S + u; i = i + 1; u = pow(-1.0, i)* pow(x, 2*i+1) / (2*i + 1); }

printf(“\n S = %f ”, S );

return 0;}

10.1.1.Exercícios

1. Faça um programa em C para calcular valores aproximados das séries:

a) S=∑i=1

∞ 2i

x2 i, para x = 0.5

b) S=∑i=0

∞ x i

i !, para x = 0.1

c) S=∑i=0

(−1)i x2 i+1

(2 i+1) !, para x = 0.75

d) S=∑i=0

(−1)i x

2 i

(2 i)!, para x = 0.75

e) S=∑i=0

∞ ixi

3i, para x = 0.5

f) S=∑i=0

∞ x i+1

( i+1)2 , para x = 1.5

g) S=∑i=0

i ! x i , para x = 1.5

Define uma série de termos u1, u2, u3, …, da seguinte forma:

∑n=1

un=u1+u2+u3+⋯

Algoritmo e Programação para Engenharia 109

Tomando apenas k termos desta série infinita, temos:

Sk=∑n=1

k

un=u1+u2+u3+⋯+uk

Séries são úteis para aproximação de funções, integração numérica,resolução de problemas de Engenharia de modo geral.

Dentre as diversas séries matemáticas, pode-se destacar as seguintes:

a)1

1−x=1+x+x2

+x3+x4

+x5+⋯=∑

n=0

xn para |x| < 1.

b) π4=∑n=1

∞ (−1)n

2n+1=1−

13+

15−

17+⋯

c) e=∑n=0

∞ 1n !

d) ex=∑n=0

∞ xn

n !

e) sen (x)=∑n=0

∞ (−1)n

(2n+1)!x2n+1

f) cos( x)=∑n=0

∞ (−1)n

(2n)!x2n

Exemplo 10.3 - Padrões em série.

Seja a série S=1+x+x2+ x3

+x4+⋯+x9

=∑i=0

9

xi .

i ui ui ui

0 u0 1 1

1 u1 x U0x = x

2 u2 x2 u1x = x2

3 u3 x3 u2x = x3

4 u4 x4 u3x = x4

... ... ... ...

i uI xi ui = ui-1x

... ... ... ...

9 u9 x9 u8x = x9

Pode-se gerar esta série a partir do seu termo geral xi, para i variando de 1 a 9.

Observe que há um padrão que pode ser usado para gerar esta série. O termo u 0 = 1, osdemais termos são u1 = x, u2 = x2, u3 = x3, u4 = x4, e assim por diante. Observe que pode-se escrever u1 = 1x, u2 = xx, u3 = x2x, u4 = x3x, e assim por diante.

Algoritmo e Programação para Engenharia 110

O padrão desta série é: fazendo u0 = 1, o próximo termo é igual ao termo anteriormultiplicado por x, ou seja, ui = ui-1x, para i variando de 1 a 9.

Este padrão não se aplica ao primeiro termo ( u0 ), que é usado como valor inicial.

Em termos de algoritmo, usando este padrão, pode-se escrever:

1. leia x2. faça S = 13. para i = 1 até i < 10 faça4. u = u*x5. S = S + u6. fim para7. escreva S

Em termos de algoritmo, sem usar este padrão, pode-se escrever:

1. leia x2. faça S = 13. para i = 1 até i < 10 faça4. u = xi

5. S = S + u6. fim para7. escreva Soma

A exemplo abaixo apresenta uma recorrência para resolver séries querequerem fatorial.

Exemplo 10.4 - Padrões em série.

Seja a série S=x−x3

3 !+x5

5 !−x7

7 !+x9

9 !−x11

11!+⋯−

x19

19!=∑i=0

9(−1)i

(2 i+1) !x2 i+1

.

i ui ui ui

0 u0 x x

1 u1 -x3/(2ˣ3) -u0x2/(2ˣ3) = -x3/2/3

2 u2 x5/(2ˣ3ˣ4ˣ5) -u1x2/(4ˣ5) = x5/2/3/4/5

3 u3 -x7/(2ˣ3ˣ4ˣ5ˣ6ˣ7) -u2x2/(6ˣ7) = -x7/2/3/4/5/6/7

4 u4 x9/(2ˣ3ˣ4ˣ5ˣ6ˣ7ˣ8ˣ9) -u2x2/(8ˣ9) = x5/2/3/4/5/6/7/8/9

5 u5 -x11/(2ˣ3ˣ4ˣ5ˣ6ˣ7ˣ8ˣ9ˣ10ˣ11) -u2x2/(10ˣ11) = x5/2/3/4/5/6/7/8/9/10/11

... ... ... ...

i uI xi ui = -ui-1x2/[(2ˣi+1)ˣ(2ˣi+2)] =

Pode-se gerar esta série a partir do seu termo geral -ui-1x2/[(2ˣi+1)ˣ(2ˣi+2)], para ivariando de 1 a 9, sendo o termo u0 = x.

O padrão desta série é: fazendo u0 = x, o próximo termo é igual ao termo anteriormultiplicado por -x2/[(2ˣi+1)ˣ(2ˣi+2)], ou seja, ui = -ui-1x2/[(2ˣi+1)ˣ(2ˣi+2)], para i variandode 1 a 9.

Este padrão não se aplica ao primeiro termo ( u0 ), que é usado como valor inicial.

Algoritmo e Programação para Engenharia 111

Em termos de algoritmo, usando este padrão, pode-se escrever:

1. leia x2. faça S = x3. para i = 1 até i < 10 faça4. u = -u*x*x/((2*i+1)*(2*i+2))5. S = S + u6. fim para7. escreva S

Nem todas as séries possuem padrões tão evidentes. Os matemáticos ecientistas da computação tem identificado os padrões das séries deinteresse nas engenharias. A Matemática Discreta trata deste assuntodentre outros.

Vale destacar que x5/(2ˣ3ˣ4ˣ5) = x5/2/3/4/5 porém a divisão exige mais do computador doque a multiplicação. A expressão do lado direito é mais adequada para programas decomputador. E também mais elegante em termos de estética matemática.

10.1.2.Exercícios

Encontre o padrão das séries abaixo e proponha algoritmos para obter seusvalores aproximados:

a) S=∑i=0

∞ 1i !

a) S=∑i=0

∞ ii

i !

b) S=∑i=1

∞ 2i

x2 i, para x = 0.5

c) S=∑i=0

∞ x i

i !, para x = 0.1

d) S=∑i=0

(−1)i x2 i+1

(2 i+1) !, para x = 0.75

e) S=∑i=0

(−1)i x

2 i

(2 i)!, para x = 0.75

f) S=∑i=0

∞ ixi

3i, para x = 0.5

g) S=∑i=0

∞ x i+1

( i+1)2

, para x = 1.5

h) S=∑i=0

i ! x i , para x = 1.5

Algoritmo e Programação para Engenharia 112

Algoritmo e Programação para Engenharia 113

11.Anexo

11.1.Compilando um programa C

O processo para criar um programa executável escrito e C, passatipicamente por uma sequência de três passos, a saber:

1. editar – é a primeira fase, consiste em escrever o código fonte usando um editor detexto. O nome de arquivos em C frequentemente terminam com a extensão c.2. compilar – nesta fase, o programa-fonte é traduzido para a linguagem de máquina, é ochamado código objeto.3. linker – por fim, as funções da biblioteca padrão C são incluídas no código objeto e éproduzido o código executável.

A Figura 11.1 exibe a sequência geral o compilador C executa para gerarprogramas executáveis a partir de códigos-fontes.

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

Algoritmo e Programação para Engenharia 114

11.2.Fluxograma

Fluxogramas representam gráfica e sequencialmente os comandos quecompõem um algoritmo. Seus principais objetivos:

1. padronizar a representação de algoritmos;2. facilitar a leitura e o entendimento de programas de computador;3. analisar algoritmos.

Como há muitas operações para serem representadas graficamente,existem muitos símbolos para representar fluxogramas. O programadorpode também criar seus próprios símbolos. A Figura 11.2 apresenta osprincipais elementos de um fluxograma, os mais básicos.

início/fim

processamento

decisão

entrada/saída

conexão

direção do fluxo

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

Embora ainda útil, fluxogramas é muitas vezes complementado por outrastécnicas de representação de programas.

O exemplo de fluxograma para a solução do problema “a partir de umnúmero inteiro, obtido via teclado, verificar se ele é ímpar ou par e informaro resultado no vídeo”, é mostrado na Figura 11.3.

Algoritmo e Programação para Engenharia 115

Figura 11.3 – Fluxograma para exibir se um número inteiro é par ou ímpar.

11.3. Dados estruturados

Foi visto que tanto vetores quanto matrizes são estruturas de dadoshomogêneas, não permitem misturas de tipos.

A linguagem C provê o tipo struct que permite agrupar variáveis dediferentes tipos de dados sendo, portanto, dados heterogêneos. As struct deC devem definidas pelo programador, sendo muito versáteis.

Algoritmo e Programação para Engenharia 116

O exemplo abaixo declara uma estrutura de nome pessoa com quatrocampos, nome, idade, peso e altura:

struct pessoa{ char nome[35]; int idade; float peso, altura;} x;

A variável x é do tipo pessoa, uma estrutura criada pelo programador, xtambém é denominada registro.

Para se referir a um campo de um registro, basta escrever o nome doregistro e o nome do campo separados por um ponto: x.nome, x.idade,x.peso, x.altura.

O exemplo abaixo declara x e y do tipo struct pessoa. O vetor P contémcinco registros do tipo pessoa.

struct pessoa y, z, P[5];

Exemplo 11.1 - Leitura e impressão de registros – calculo do IMC – índice de massacorporal.

#include <stdio.h>

#define n 4

struct pessoa{ char nome[12]; int idade; float peso, altura, IMC;};

int main( void ){ int c; struct pessoa P[n];

printf("\n\n Leitura das pessoas P" ); for( c = 0; c < n; c++ ){ printf(" De o valor do nome de P[%d]: ", c ); scanf("%s", &P[c].nome );

printf(" De o valor da idade de P[%d]: ", c ); scanf("%d", &P[c].idade );

printf(" De o valor do peso de P[%d]: ", c ); scanf("%f", &P[c].peso );

printf(" De o valor da altura de P[%d]: ", c ); scanf("%f", &P[c].altura );

Algoritmo e Programação para Engenharia 117

P[c].IMC = 0.0; }

printf("\n\n Calculo do IMC" ); for( c = 0; c < n; c++ ){ P[c].IMC = P[c].peso / ( P[c].altura*P[c].altura ); }

printf("\n Nome IMC " ); printf("\n --------------" ); for( c = 0; c < n; c++ ){ printf(" %12s %3.1f", P[c].nome, P[c].IMC ); } return 0;}

Para saber mais sobre Estruturas leia o Capítulo 7 – Estruturas, Uniões,Enumerações e Tipos Definidos pelo Usuário.

11.4. Ponteiros

A linguagem C provê o tipo ponteiro (também denominado apontador, doinglês pointer) é um tipo especial de variável que armazena endereços.Neste texto são usadas estas variáveis no comando scanf.

O símbolo & antes das variáveis nos comandos scanf referem a endereços esão exemplos de ponteiros.

Variáveis ponteiros são muito úteis e provê grandes recursos para aLinguagem C. Mas não serão tratadas neste texto.

Para saber mais sobre ponteiros leia o Capítulo 5 – Ponteiros.

Algoritmo e Programação para Engenharia 118

11.5. Terminologias Úteis

Arquivo executável - é um arquivo cujo conteúdo pode ser interpretadocomo um programa por um sistema operacional.

ASCII – American Standard Code for Information Interchange, é umacodificação de caracteres de oito bits baseada no alfabeto inglês, utilizadopara representar textos em computadores, equipamentos de comunicação,entre outros dispositivos que trabalham com texto.

Biblioteca padrão – arquivos contendo as funções padrão que programaspodem usar. Estas funções incluir todas as operações de Entrada/Saída,bem como outras rotinas úteis.

Código fonte - é uma versão do software da forma em que ele foi escrito porum humano em texto legível.

Código objeto - é o nome dado ao código resultante da compilação docódigo fonte, que é processado por um linker, resultando num arquivoexecutável ou biblioteca.

Fluxograma - representam gráfica e sequencialmente os comandos quecompõem um algoritmo.

GCC - GNU Compiler Collection é um conjunto de compiladores delinguagens de programação produzido pelo projecto GNU, sendo uma dasferramentas fundamentais para manter softwares livres, pois permitecompilar códigos-fonte em binários executáveis para as várias plataformasde hardware. É distribuído pela Free Software Foundation (FSF) sob ostermos da GNU GPL.

Linguagem de programação – é qualquer linguagem artificial que pode serusada para definir uma sequência de instruções que podem vir a serprocessada e executada por computador.

Linker – programa que une módulos compilados separadamente em umprograma. Ele também combina as funções na biblioteca C padrão com ocódigo escrito. A saída do linker é um programa executável.

Algoritmo e Programação para Engenharia 119

Programa de computador - é uma sequência de instruções que podem serexecutadas por um computador. O termo pode referir-se ao código fonteoriginal ou a linguagem de máquina executável.

Tempo de compilação – tempo durante o qual seu programa está sendocompilado.

Tempo de execução – tempo durante o qual seu programa está sendoexecutado.

Algoritmo e Programação para Engenharia 120

12. Referências

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

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

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

Algoritmo e Programação para Engenharia 121