Baixe o app para aproveitar ainda mais
Prévia do material em texto
- 2 - ++++++++++++++++++++++++++++++++++++++++++++ ÍNDICEÍNDICEÍNDICEÍNDICE ++++++++++++++++++++++++++++++++++++++++++++ ���� Módulo I – Lógica de Programação Capítulo 1 Histórico 3 Capítulo 2 Objetivos 3 Capítulo 3 Ambiente 4 Capítulo 4 Bibliotecas 5 Capítulo 5 Tipos de Dados 6 Capítulo 6 Documentação 7 Capítulo 7 A Função Principal - main() 8 Capítulo 8 Delimitadores de Bloco 8 Capítulo 9 Variáveis 9 Capítulo 10 Funções de Saída 10 Capítulo 11 Funções de Entrada 11 Capítulo 12 Estruturas de Decisões 16 12.1 - Seqüências Simples 16 12.2 - Seqüências Alternativas 17 12.2.1 - Seqüências Alternativas Simples - if 17 12.2.2 - Seqüências Alternativas Compostas - if...else 18 12.2.3 - Seqüências Alternativas com Múltiplas Condições 19 12.2.4 - Estrutura Caso - case 20 Capítulo 13 Laços de Repetição - Iterações 23 13.1 - Iteração Enquanto - while 24 13.2 - Iteração Repita – do while 28 13.3 - Iteração Para - for 31 Capítulo 14 Estruturas Homogêneas 34 14.1 - Matrizes com Uma Dimensão (Vetores) 34 14.2 - Matrizes com Duas dimensões 37 Capítulo 15 Estruturas Heterogêneas 42 15.1 – Registros - struct 42 Capítulo 16 Procedimentos e Funções 48 ���� Módulo II – Estruturas de Dados Capítulo 1 Cadeia de Caracteres 51 Capítulo 2 Listas Lineares 53 Capítulo 3 Filas 57 Capítulo 4 Pilhas 62 Capítulo 5 Deques 68 Capítulo 6 Recursividade 74 Capítulo 7 Árvores 77 ���� Módulo III – Arquivos Capítulo 1 Arquivo Texto 83 Capítulo 2 Arquivo Binário 86 ���� Anexo I – Projetos Capítulo 1 Criptografia Simétrica 90 Capítulo 2 Criptografia Assimétrica 97 Capítulo 3 Agenda 115 Capítulo 4 Locadora 123 Capítulo 5 Controle de Estoque 130 ���� Anexo II – Exercícios Resolvidos - 3 - ++++++++++++++++++++++++++++++++++++++++++++ MÓDULO IMÓDULO IMÓDULO IMÓDULO I ++++++++++++++++++++++++++++++++++++++++++++ LÓGICA DE PROGRAMAÇÃOLÓGICA DE PROGRAMAÇÃOLÓGICA DE PROGRAMAÇÃOLÓGICA DE PROGRAMAÇÃO I I I I ���� HISTÓRICO HISTÓRICO HISTÓRICO HISTÓRICO A Linguagem C foi desenvolvida no início dos anos 70, em 1972, por Dennis M. Ritchie. Sua primeira implementação foi feita num PDP-11 com sistema UNIX, tendo sido, em seguida, utilizada para rescrever o UNIX. O desenvolvimento da linguagem C foi fortemente influenciado pela linguagem B, desenvolvida por Ken Tompson que, por sua vez, teve suas origens em uma linguagem relativamente antiga, BCPL, desenvolvida por Martin Richards. Embora muitas características de "C" sejam comuns com BCPL, "C" não é um dialeto desta última linguagem. II II II II ���� OBJETIVOS OBJETIVOS OBJETIVOS OBJETIVOS C é uma linguagem de propósito geral. Mesmo tendo sido criada com o objetivo de ser uma linguagem de programação de sistemas operacionais e utilitários, pelas suas facilidades de acesso a nível de máquina e eficiência do código gerado, "C" também é bastante útil para escrever um grande número de aplicações numéricas, de processamento de texto e de programas para banco de dados. Este livro aborda os conceitos básicos da Linguagem, tratando o programa em C++ em módulos, desde uma aplicação simples como uma soma de dois números até uma aplicação complexa na realização de um sistema de criptografia assimétrica. O foco principal deste documento são alunos universitários, e para isso o livro aborda a ementa de duas (ou três) disciplinas básicas do curso de Ciência da Computação: Algoritmos, Linguagem de Programação e ainda Estrutura de Dados. Em Estrutura de Dados são apresentadas as principais estruturas como: Cadeia de Caracteres, Listas, Filas, Pilhas, Deques e ainda Árvores, com o intuito de preparar o aluno para uma outra disciplina da grade de Ciência da Computação: grafos. O livro fecha com quatro projetos práticos: criptografia simétrica - criação e editão de arquivos texto com técnica criptográfica sem senha privada, criptografia assimétrica - incluindo senha privada além da senha pública já presente no projeto anterior), agenda - com as principais funções de uma agenda telefônica básica e locadora - com variações para Cd, VHS e DVD permitindo inclusão, alteração, exclusão, consulta, listagem, relatório, etc. - 4 - III III III III ���� O AMBIENTE O AMBIENTE O AMBIENTE O AMBIENTE DevDevDevDev C C C C++++++++ O ambiente Dev C++ integra os recursos de um compilador com um editor de textos, através da seleção de opções em um ambiente windows com menus e ferramentas específicas para a linguagem. Figura 1 – Ambiente Dev C++ À medida que os recursos da linguagem forem utilizados, e os recursos da plataforma DEV C++ forem necessários, estes serão citados e explicados paulatinamente. Boa parte das funções e comandos usados neste livro, com foco na plataforma DEV C++, também são compatíveis com outros compiladores da linguagem C, como o Turbo C++ da Borland, que até pouco tempo atrás ainda era o compilador mais usado nas universidades com o foco acadêmico e introdutório nas linguagens de programação. - 5 - IIIIV V V V ���� BIBLIOTECAS BIBLIOTECAS BIBLIOTECAS BIBLIOTECAS A linguagem C é por natureza própria uma linguagem estruturada. A maior parte de seus recursos é conseguida via utilização de funções. Assim sendo, a linguagem possui uma coleção de bibliotecas que podem ser usadas a qualquer momento. Uma biblioteca é o conjunto de rotinas prontas para serem usadas pelo programador. Abaixo, são apresentadas algumas das bibliotecas existentes na Linguagem C e sua rápida descrição: stdio.h Esta biblioteca é a mais utilizada na programação em C, pois é a biblioteca padrão (std) de entrada (i) e saída (o) de dados. É nela que estão todas as funções de entrada e saída de dados da linguagem, como: scanf(), printf(), getchar(), puts(), gets() entre outras que serão apresentadas nos próximos capítulos. conio.h Esta biblioteca possui as rotinas de console de entrada e saída no Ms-DOS, e ainda as funções de ambiente clrscr(), gotoxy(), getche() entre outras. No DEV C++ algumas destas funções estão alocadas em uma variação da biblioteca conio, chamada conio.c math.h Esta biblioteca possui as rotinas do pacote matemático. dos.h Esta biblioteca possui as rotinas de tratamento do Ms-DOS e dos processadores da família Intel: x86. Alguns compiladores tem dificuldade em trabalhar com recursos do DOS, impossibilitando o uso desta biblioteca. graphic.h Esta biblioteca possui as rotinas do pacote gráfico string.h Esta biblioteca possui as rotinas de tratamento de memória e strings. Etc... Para poder fazer uso deste recurso é necessário o uso de uma diretiva (#include), que deve ser colocada antes da declaração da função main(). Desta forma, sua sintaxe corresponde a: #instrução <biblioteca> Onde instrução é uma palavra reservada (include entre outras) e biblioteca é uma ou mais das bibliotecas citadas acima. Uma diretiva caracteriza-se na linguagem C, por ser uma instrução precedida do caractere tralha "#", que deverá ser sempre escrito na primeira coluna. A instrução, após o símbolo tralha, é uma palavra reserva do pré-processador. O pré-processador é um programa que checa o programa-fonte escrito em linguagem C e efetua no programa-fonte, modificações. O pré-processador recebe este nome pelo fato de ser o primeiro programa a ser executado em um processo de compilação, fazendo com que o programa-fonte seja alterado, na forma de texto, antes deser propriamente compilado. Uma biblioteca poderá ser escrita como: #include <stdio.h> ou #include “stdio.h” substituindo os sinais de menor (<) e maior (>) por aspas (“) e vice-versa. - 6 - V V V V ����TIPOTIPOTIPOTIPOS DE DADOSS DE DADOSS DE DADOSS DE DADOS Para se desenvolver um programa que seja executável dentro de um computador, é necessário ter em mente que o trabalho de gerenciamento de dados ocorre em três níveis: 1. A entrada dos dados; 2. O processamento dos dados; 3. A saída de dados. O objetivo principal de qualquer computador é a manipulação de dados, que são representados por elementos em estado primário. Ao agregar valores à esses dados, são criadas as informações, que ao serem estruturadas de forma organizada e com algum significado, tem por objetivo gerar algum conhecimento. � Os computadores servem para armazenar informações e programas para sua manipulação. Sendo assim, um programador consciente não pode ignorar a importância dos dados e como eles devem ser estruturados. � Como exemplo padrão da estruturação de dados e informações pode ser citada a lista telefônica , que por ser ordenada alfabeticamente, torna razoavelmente simples e rápido o acesso a um determinado número de telefone de um assinante. Os dados então são representados pelas informações a serem processadas por um computador. A linguagem C fornece ao programador um conjunto de tipos de dados predefinidos, podendo ser dos tipos: numéricos, caracteres e lógicos (“camuflados” por 0 e 1). 5.1. Tipos de dados inteiros São caracterizados tipos inteiros os dados numéricos positivos ou negativos, excluindo-se destes qualquer número fracionário. Em C, este tipo de dado pode ser referenciado por um dos seguintes identificadores: int de -32.768 a 32.767 long de -2.147.483.648 até 2.147.483.647 unsigned int de 0 até 65.535 5.2 Tipos de dados reais São caracterizados tipos reais os dados numéricos positivos, negativos e números fracionários e também os inteiros. Em C, este tipo de dado pode ser referenciado por um dos seguintes identificadores: float de 3.4 E -38 até 3.4 E+38 double de 1.7 E -308 até 1.7 E+308 Este tipo de dado real permite trabalhar com uma representação de valores em ponto flutuante que consiste em uma mantissa (parte fracionária). 5.3 Tipos de dados caracteres São caracterizadas tipos caracteres as seqüências contendo letras, números e símbolos especiais. Uma seqüência de caracteres deve ser representada na linguagem C entre aspas ( " " ). Este tipo de dado é referenciado pelo identificador char, podendo armazenar de 0 até 255 caracteres. 5.4 Tipos de dados lógicos Na linguagem C, não existe um tipo de dado lógico ou booleano propriamente dito, ou seja, não existirão os valores lógicos Falso ou Verdadeiro para um determinado tipo de dado. Nesta linguagem, qualquer valor igual a zero 0, é considerado um valor lógico falso, e qualquer valor diferente de zero (que será representado pelo número 1 inteiro) será considerado um valor lógico verdadeiro. - 7 - VI VI VI VI ����DOCUMENTAÇÃODOCUMENTAÇÃODOCUMENTAÇÃODOCUMENTAÇÃO Desenvolvendo CDesenvolvendo CDesenvolvendo CDesenvolvendo Comentáriosomentáriosomentáriosomentários O uso de comentários é de extrema importância para o programador, pois tem a finalidade de documentar o programa, deixando-o mais claro e fácil de ser compreendido, alterado ou corrigido. Existem dois tipos de comentários: � comentário do prólogo e � comentários intercalares 6.1 Comentário do Prólogo É colocado antes da lógica de programação e é constituído por quatro etapas: 1ª- Definição do programa Ex: // Programa Soma entre 2 números 2ª- Nome do autor e datas de criação e última alteração do programa Ex: // Fulano de Tal em: 04/04/1989; Ultima Alteração: 12/03/2008 3ª- Declarações das variáveis novas ou desconhecidas usadas no programa Ex: // N1 e N2 = Números digitados pelo usuário; S = Soma encontrada 4ª- Funcionalidade do Programa Ex: // O usuário digita 2 números e tem como resposta a soma entre eles. 6.2 Comentários Intercalares Servem para comentar, de maneira breve, funções ou comandos novos ou desconhecidos para o programador. Obs. 1: A especificação de comentários em Linguagem C++ é identificada pelo uso de duas barras em seqüência: // Obs. 2: Quando em um comentário são utilizadas mais de uma linha, também é possível delimitá-lo com o uso de /* no inicio da primeira linha e */ no final da última linha. /* Programa Soma entre 2 números Fulano de Tal em: 04/04/1989; Ultima Alteração: 03/03/2008 N1 e N2 = Números digitados pelo usuário; S = Soma encontrada O usuário digita 2 números e tem como resposta a soma entre eles. */ - 8 - VII VII VII VII ����A FUNÇÃO PRINCIPAL A FUNÇÃO PRINCIPAL A FUNÇÃO PRINCIPAL A FUNÇÃO PRINCIPAL Todo e qualquer programa em C é constituído de no mínimo uma função, tendo assim a possibilidade de se construir programas modulares ou estruturados. main( ) Primeira, e principal função do C. A função main( ) é a principal instrução a ser considerada em um programa escrito na linguagem C, ou seja, esta função deverá estar presente em algum lugar do programa, pois é ela que marca o ponto de inicialização do processo de execução do programa. É apresentado a seguir, o modelo da forma geral de escrita de um programa em C, com a definição e comentário de cada um dos elementos básicos do programa. [<definições de pré-processamento>] [<declaração das variáveis globais>] main() { /* Este trecho é reservado para o corpo da função, com a declaração de suas variáveis locais, seus comandos e funções de trabalho. * / } Toda informação situada entre [ ] indica informações que poderão ou não estar presentes em um programa. Já qualquer informação entre < > caracteriza-se por ser obrigatória. Os símbolos ( ) indicam início e fim da rotina. Todas as informações escritas entre os delimitadores /* e */ são comentários para documentação do programa e não são compiladas quando da execução do programa pelo compilador. Normalmente, um programa em C é iniciado com as definições de pré-processamento e com a declaração das variáveis globais, lembrando que estas variáveis poderão ser usadas em qualquer parte do programa, seguidas da declaração de todas as funções a serem utilizadas no programa. As funções em C são formadas inicialmente pela declaração de seu tipo, informação esta opcional, e de seu nome seguida da lista de parâmetros entre parênteses a ser utilizada pela mesma. A lista de parâmetro poderá estar vazia, sendo que a finalidade de um parâmetro é servir como um ponto de comunicação bidirecional entre as várias funções de um programa. VIVIVIVIIIIII I I I ����DELIMITADORES DE BLOCODELIMITADORES DE BLOCODELIMITADORES DE BLOCODELIMITADORES DE BLOCO Delimitam toda a lógica de programação escrita pelo programador. São representados (em C++) por { e } conforme observado na sintaxe abaixo: /* ...Comentário do Prólogo... */ Bibliotecas; main() { - - - - - - - - - - - - - - - - - - - - - - - - - - - } - 9 - IIIIXXXX ����VARIÁVEIS VARIÁVEIS VARIÁVEIS VARIÁVEIS Variável, no sentido de programação, é uma região previamente identificada e que tem por finalidade armazenar as informações (dados) de um programa temporariamente. Uma variável armazena apenas um valor por vez. Sendo considerado como valor o conteúdo de uma variável, desta forma, um valor está relacionado ao tipo de dado de uma variável, podendo ser numérico, lógico ou caractere. O nome de uma variável é utilizado para sua identificação e posterior uso dentro de um programa, sendo assim é necessário se estabelecer algumas regras de utilização das mesmas: � Nomes de uma variávelpoderão ser atribuídos com um ou mais caracteres; � O primeiro caractere do nome de uma variável não poderá ser em hipótese alguma um número, sempre deverá ser uma letra; � O nome de uma variável não poderá possuir espaços em branco; � Não poderá ser nome de uma variável uma palavra reservada a uma instrução ou identificador de uma linguagem de programação; � Não poderão ser utilizados outros caracteres a não ser letras e números, com exceção do caractere underscore "_", que poderá ser utilizado para simular a separação entre duas palavras, como: MEDIA_ESCOLAR. Na linguagem C, os 32 primeiros caracteres de um nome de variável são significativos, porém, se o sistema operacional em uso é o MS-DOS, somente serão considerados os primeiros 8 caracteres. Este fator limita um pouco o uso das variáveis. � Outro detalhe a ser considerado na linguagem C é o fato de haver diferença entre caracteres maiúsculos e minúsculos. Sendo assim as variáveis: NOME, nome e Nome, são diferentes. Todo dado a ser armazenado na memória de um computador através de uma variável utilizando-se a linguagem C deve ser previamente declarado, ou seja, primeiro é necessário saber qual o seu tipo para depois fazer o seu armazenamento. Estando armazenado o dado, este poderá ser utilizado e manipulado a qualquer momento, durante a execução do programa. Pelo fato de a linguagem C obrigar o programador a trabalhar de forma estruturada e ser baseada no uso de funções, as variáveis podem assumir dois estados de comportamento (global e local). Uma variável é considerada Global quando é declarada no inicio de um programa escrito em C, precisamente antes da função main ( ), que será estuda a seguir, podendo este tipo de variável ser utilizado por qualquer parte do programa. Uma variável é considerada Local quando é declarada apenas dentro de uma função e é somente válida dentro do limite de abrangência da referida função. Desta forma, as demais rotinas não poderão fazer uso daquelas variáveis como Global, pois não visualizam a existência das mesmas. Todo programa tem a obrigatoriedade de declarar (antes da lógica) todas as variáveis que serão utilizadas, pois estas só poderão receber valores após tal declaração, que ocorre de acordo com a seguinte sintaxe: tipo_de_dado NOME_DA_VARIAVEL ; Ex: int IDADE; float N1 , N2 , S ; - 10 - 9.1 Constantes Tem-se como definição de constante tudo aquilo que é fixo ou estável, e existirão vários momentos em que este conceito deverá estar em uso. Ao operar com variáveis correspondentes a valores constantes ou fórmulas, deve-se utilizar o símbolo “=“ que significa uma atribuição. Por exemplo, o valor 4.12 da fórmula a seguir é uma constante e está sendo atribuído à variável INSS: INSS = SAL * 4.12. 9.2 Operadores Aritméticos Tanto variáveis como constantes poderão ser utilizadas na elaboração de cálculos matemáticos com a utilização de operadores aritméticos. Os operadores aritméticos são classificados em duas categorias, sendo binários ou unários. São binários quando atuam em operações de: exponenciação, multiplicação, divisão, adição e subtração. São unários quando atuam na inversão de um valor atribuindo a este o sinal positivo ou negativo. X X X X ����FUNÇÕES DE SAÍDAFUNÇÕES DE SAÍDAFUNÇÕES DE SAÍDAFUNÇÕES DE SAÍDA São responsáveis pela saída de dados, ou seja: apresentação destes valores em qualquer programa, sendo obrigatório o uso dos parênteses para delimitar os dados apresentados. A primeira função de saída apresentada é a printf( ) que possibilita efetuar a saída de informações no vídeo, de acordo com a sintaxe: printf ("expressão de controle", lista de argumentos); A expressão de controle se caracteriza por conter códigos de formatação para o tipo de dado a ser processado, precedidos pelo sinal de percentagem %. Veja a seguir, a tabela com os códigos de formatação para a função printf( ). %c Permite que seja efetuada a escrita de apenas um caractere %d Permite que seja efetuada a escrita de números inteiros decimais %e Permite que seja efetuada a escrita de números em notação científica %f Permite que seja efetuada a escrita de números reais (ponto flutuante) %g Permite que seja efetuada a escrita de %e ou %f no formato mais curto %o Permite que seja efetuada a escrita de números octais %s Permite que seja efetuada a escrita de uma série de caracteres %u Permite que seja efetuada a escrita de um número decimal sem sinal %x Permite que seja efetuada a escrita de um número hexadecimal - 11 - A função printf ( ) pode usar além da expressão de controle e da lista de argumentos um conjunto de códigos especiais através do símbolo “\” com finalidade de efeito visual conforme apresentado abaixo: printf (“Clube do Remo \n Campeão Brasileiro Série C 2005”); O resultado desta operação na tela do computador seria: Clube do Remo Campeão Brasileiro Série C 2005 A utilização destes códigos especiais tem a finalidade de auxiliar o programador na utilização de recursos não disponíveis no teclado. Estes códigos são apresentados a seguir: \n Cria uma linha nova a partir do ponto que é indicado \t Cria um espaço de tabulação do ponto que é indicado \b Executa um retrocesso de espaço do ponto que é indicado \” Apresenta o símbolo de aspas no ponto que é indicado \\ Apresenta o símbolo de barra no ponto que é indicado \f Adiciona um salto de página de formulário (impressora) \0 Gera um nulo XI XI XI XI ����FUNÇÕES DE ENTRADA FUNÇÕES DE ENTRADA FUNÇÕES DE ENTRADA FUNÇÕES DE ENTRADA São responsáveis pela inserção de dados em um programa, ou seja, tudo que tiver de ser digitado pelo usuário deverá usar uma função de entrada. Também é obrigatório o uso dos parênteses para delimitar os dados digitados e obedece a seguinte sintaxe: A primeira função de saída apresentada é a função scanf( ) , que possibilita efetuar entrada de dados via teclado. A sintaxe desta função se caracteriza por ser uma expressão de controle seguida de uma lista de argumentos separados por virgula, sendo que seus argumentos são endereços de variáveis. scanf ("expressão de controle", lista de argumentos); A expressão de controle se caracteriza por conter códigos de formatação para o tipo de dado a ser processado, precedidos pelo sinal de percentagem %. Veja a seguir, a tabela com os códigos de formatação para a função scanf( ). %c Permite que seja efetuada a leitura de apenas um caractere %d Permite que seja efetuada a leitura de números inteiros decimais %e Permite que seja efetuada a leitura de números em notação científica %f Permite que seja efetuada a leitura de números reais (ponto flutuante) %l Permite que seja efetuada a leitura de um número inteiro longo %o Permite que seja efetuada a leitura de números octais %s Permite que seja efetuada a leitura de uma série de caracteres %u Permite que seja efetuada a leitura de um número decimal sem sinal %x Permite que seja efetuada a leitura de um número hexadecimal - 12 - A lista de argumentos se caracteriza por ser a indicação dos endereços das variáveis em uso, através do operador de endereço &, que possibilita retomar o conteúdo da variável. Caso não seja usado o operador de endereço &, será retornado o endereço de memória em que se encontra a variável. O Primeiro Programa em C Para colocar em prática o que foi explicado até este momento, considere o seguinte exemplo: /* Programa Nome Autor: Fulano de Tal Dt_Cri: 22/08/1986 Dt_Ult_Alt: 12/03/2008 Sem Variáveis O usuário simplesmente é apresentado ao autor do programa */ #include <stdio.h> #include <conio.h> main ( ) // Primeira função do programa em C { // Corresponde ao "Inicio" do Algoritmo printf ( "Programa desenvolvidopor \n Fulano de Tal" ); // Corresponde ao "escreva" do algoritmo getch ( ); // Espera ser pressionada qualquer tecla p/ continuar } // Corresponde ao "fim" do algoritmo Edite o programa acima, compile-o e verifique a funcionalidade de seu arquivo executável. Considere agora o seguinte exemplo de algoritmo: "Deverá ser desenvolvido um programa que efetue a leitura de dois valores numéricos. Faça a operação de adição entre os dois valores e apresente o resultado obtido". Com relação ao problema da leitura dos dois valores (que não conhecemos e também não precisamos conhecer, pois utilizaremos duas variáveis para trabalhar estas incógnitas N1 e N2) e a sua respectiva adição (conseqüência dos valores informados, a qual também é uma incógnita e dependendo dos valores fornecidos, utilizaremos para esta a variável S). Assim sendo, o programa em questão deverá obedecer a seguinte ordenação: Algoritmo Literal: 1. Ler um valor para a variável N1; 2. Ler outro valor para a variável N2; 3. Efetuar a adição das variáveis N1 e N2, implicando o seu resultado na variável S; 4. Apresentar o valor da variável S após a operação de soma dos dois valores fornecidos. Observe que temos neste exemplo, as três fases de trabalho de um programa: a fase de entrada retratada nos passos 1 e 2, o processamento retratado no passo 3 e por fim a saída retratada no passo 4. Completada a fase de interpretação do problema e da definição das variáveis a serem utilizadas, através de um algoritmo, passa-se para a fase de diagramação. Tendo estabelecido os passos anteriores, será efetuada a codificação do programa. Desta forma, são utilizadas no exemplo, três variáveis: N1, N2 e S (que neste caso estão no estado de variáveis locais), sendo que estas deverão ser declaradas segundo o seu tipo, no caso como inteiras. /* Programa Soma entre 2 números Fulano de Tal em: 04/04/1989; Ultima Alteração: 03/03/2008 N1 e N2 = Números digitados pelo usuário; S = Soma encontrada O usuário digita 2 números e tem como resposta a soma entre eles. */ - 13 - main( ) { int N1; int N2; int S; Tendo relacionado as variáveis que serão utilizadas no programa, bem como os seus respectivos tipos, passa-se para a fase de montagem do programa propriamente dito. As variáveis poderiam ser também relacionadas em uma única linha: int N1, N2, S; Observe que o bloco de instruções entre “{“ e “}” está deslocado um pouco para a direita. Este estilo de escrita deve ser obedecido, para facilitar a leitura de um bloco de programa, recebendo o nome de identação. Apesar de a informação escrita entre os delimitadores /* e */ não ser processada, é adequado sempre identificar um programa com um nome que deve vir no comentário de prólogo. scanf ("%d", &N1); scanf ("%d", &N2); S = N1 + N2; printf ("%d", S); } Após a leitura dos valores para as variáveis N1 e N2 com a função scanf ( ), estes serão adicionados e implicados na variável S, a qual será apresentada com o valor da adição processada através da função printf ( ). Note que as instruções utilizadas dentro da função main( ) são precedidas de ponto e virgula, indicando desta forma o fim da instrução naquela linha. A seguir, é apresentado o programa completo: /* Programa Soma entre 2 números Fulano de Tal em: 04/04/1989; Ultima Alteração: 03/03/2008 N1 e N2 = Números digitados pelo usuário; S = Soma encontrada O usuário digita 2 números e tem como resposta a soma entre eles. */ #include <stdio.h> #include <conio.h> main ( ) // Primeira função do programa em C { // Corresponde ao "Inicio" do Algoritmo int N1,N2,S; // Declaração das variáveis como inteiras printf ("Informe 1º numero: "); // Corresponde ao "escreva" do Algoritmo scanf ("%d", &N1); // Corresponde ao "leia" do Algoritmo printf ("Informe 2º numero: "); scanf ("%d", &N2); S = N1 + N2; printf ("\n A Soma é igual a %d", S); getch ( ); // Espera ser press. qq tecla p/ prosseguir } - 14 - Edite o programa acima, compile-o e verifique a funcionalidade de seu arquivo executável. Como terceiro exemplo, desenvolva um programa que efetue o cálculo do salário liquido de um profissional que trabalhe por hora. Para fazer este programa você deverá possuir alguns dados, tais como: valor da hora de trabalho, número de horas trabalhadas no mês e o percentual de desconto do INSS. O programa em questão deverá apresentar o valor do salário bruto, o valor descontado e o valor do salário liquido. Algoritmo Literal 1. Estabelecer a leitura da variável HT (horas trabalhadas no mês); 2. Estabelecer a leitura da variável VH (valor hora trabalhada); 3. Estabelecer a leitura da variável PD (percentual de desconto); 4. Calcular o salário bruto (SB), sendo este a multiplicação das variáveis HT e VH; 5. Calcular o total de desconto (TD) com base no valor de PD dividido por 100; 6. Calcular o salário liquido (SL), subtraindo o desconto do salário bruto; 7. Apresentar os valores dos salários bruto e liquido: SB, TD e SL. A seguir, é apresentado o programa completo: /* Programa Calculo de Salário Fulano de Tal em: 05/04/1989; Ultima Alteração: 03/03/2008 HT horas trabalhadas no mês, VH valor da hora trabalhada , PD percentual de desconto , SB Salário Bruto, D Desconto e SL Salário liquido O usuário digita HT, VH e PD e tem SB, TD e SL. */ include <stdio.h> include <conio.h> main( ) { float HT, VH, PD, D, SB, SL; printf ("Informe numero de horas trabalhadas no mês: "); scanf ("%f", &HT); printf ("Informe valor da hora trabalhada: "); scanf ("%f", &VH); printf ("Informe percentual de desconto: "); scanf ("%f", &PD); SB = HT * VH; D = (PD/100) * SB; SL = SB - D; printf ("Salário Bruto............: %7.2f \ n ”, SB); printf ("Desconto..................: %7.2f \ n ”, D); printf ("Salário liquido..........: %7.2f \ n ”, SL); getch( ); } Note que no exemplo de cálculo de salários estão sendo colocados junto ao código da expressão de controle dois valores separados por ponto: %7.2f. O valor numérico 7 indica que será estabelecido um campo para a parte do valor inteiro com a capacidade de apresentar tabulados valores até 9999, pois o valor 2 depois do ponto indica que serão utilizadas apenas duas casas decimais para valores com ponto flutuante, utilizando três espaços dos sete espaços separados. - 15 - ExercícioExercícioExercícioExercícioSSSS 1) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para encontrar a média escolar de uma disciplina que trabalha com a seguinte fórmula: duas provas valendo 10 pontos sendo que a primeira tem peso 4 e a segunda tem peso 6. O usuário deverá digitar somente as 2 notas e deverá ser apresentada à ele a média encontrada. 2) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para encontrar o delta de uma equação do 2º grau. A fórmula geral de equações do 2º grau é a seguinte: Ax2 + Bx + C = 0 e a do Delta é: B2 - 4AC . O usuário deverá digitar os coeficientes A, B e C respectivamente e lhe será apresentado o valor do delta. 3) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para que um usuário, informando a distância entre dois pontos e o tempo gasto no percurso, tenha como resposta a velocidade obtida no trajeto. Lembre-se que V = S/T. Adotar as unidades: km para a distância e hora para o tempo. 4) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para efetuar o cálculo da quantidade de litros de combustível gastas em uma viagem, utilizando-se um automóvel que faz 12 Km por litro. Para obter o cálculo, o usuário deverá fornecer o tempo gasto na viagem e a velocidade média durantea mesma. Desta forma, será possível obter a distância percorrida com a fórmula DISTANCIA = TEMPO * VELOCIDADE. Tendo o valor da distância, basta calcular a quantidade de litros de combustível utilizada na viagem com a fórmula: LITROS_USADOS = DISTANCIA / 12. O programa deverá apresentar os valores da velocidade média, tempo gasto, a distância percorrida e a quantidade de litros utilizada na viagem. 5) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para ler uma temperatura em graus Centígrados e apresentá-la convertida em graus Fahrenheit. A fórmula de conversão é: F = (9 * C + 160) / 5, onde F é a temperatura em Fahrenheit e C é a temperatura em Centígrados. 6) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para ler uma temperatura em graus Fahrenheit e apresentá-la convertida em graus Centígrados. A fórmula de conversão é: C = (F - 32) * 5/9, onde F é a temperatura em Fahrenheit e C é a temperatura em Centígrados. 7) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para calcular e apresentar o valor do volume de uma lata de óleo, utilizando a fórmula: VOLUME = 3.14159 * R2 * ALTURA. - 16 - XIIXIIXIIXII ���� ESTRUTURASESTRUTURASESTRUTURASESTRUTURAS DE DECISÕESDE DECISÕESDE DECISÕESDE DECISÕES 12.1 - Seqüência Simples: É considerada linguagem em Seqüência Simples, todo programa que contém comandos escritos e executados de forma linear, ou seja: de cima para baixo, sem desvios, de acordo com a seguinte sintaxe: /* ...Comentário do Prólogo... */ bibliotecas; main() { Ação 1; Ação 2; Ação N; } Ex.: /* Programa Soma entre 2 números reais Fulano de Tal em: 04/04/1989; Ultima Alteração: 02/04/2008 N1 e N2 = Números digitados pelo usuário; S = Soma encontrada O usuário digita 2 números e tem como resposta a soma entre eles. */ #include <stdio.h> #include <conio.h> main ( ) { float N1,N2,S; printf ("Informe 1º numero: "); scanf ("%f", &N1); printf ("Informe 2º numero: "); scanf ("%f", &N2); S = N1 + N2; printf ("\n A Soma é igual a %f", S); getch ( ); } 12.2 - Seqüências Alternativas 12.2.1 - Seqüências Alternativas Simples: if São estruturas compostas por desvios em sua formação, ou seja: não são executadas necessariamente de maneira linear, pois existem blocos de instruções que podem ser saltados (ignorados) dentro do corpo do programa. Neste tipo de estrutura uma condição é analisada e caso o valor lógico desta condição seja verdadeiro, um determinado bloco de ações (B) é executado. Caso o valor lógico da condição seja falso, este bloco de ações (B) é ignorado, podendo ocorrer então um desvio na seqüência de comandos. A sintaxe das estruturas com alternativa simples é a seguinte: /* ...Comentário do Prólogo... */ bibliotecas; main() { Ações A; if (CONDIÇÃO) { Ações B; } Ações C; } - 17 - Obs.1: Utiliza-se { e } para delimitar blocos internos de um desvio com mais de um comando em sua formação. Obs.2: O uso dos parênteses ( ) é obrigatório para delimitar as condições. Obs.2: Ao utilizar estruturas alternativas, é aconselhável o uso da identação. Entende-se por identação, como sendo a organização estética dos blocos de comandos ou ações existentes no programa. Para exemplificar a estrutura, considere o seguinte problema: "Ler dois valores numéricos, e mostra- los em ordem crescente”. Ou seja, poderá haver uma troca entre variáveis. Algoritmo 1. Conhecer dois valores inteiros e incógnitos ( estabelecer variáveis A e B ); 2. Verificar se o valor de A é maior que de B; a. Se for verdadeiro, efetuar a troca (*) de valores entre as variáveis; b. Se for falso, pedir para executar o que esta estabelecido no passo 3; 3. Apresentar os valores das duas variáveis (*) Para efetuar a troca, foi necessário usar uma terceira variável, no caso, X (por exemplo), de forma que X seja igual ao valor de A, liberando A para receber o valor de B deixando B livre para receber o valor que está em X, que anteriormente constava o conteúdo de A. Programa /* Programa Ordenação entre 2 números inteiros Fulano de Tal em: 04/04/1989; Ultima Alteração: 02/04/2008 A e B = Números digitados pelo usuário; X = Variável auxiliar O usuário digita 2 números e tem como resposta ambos ordenados. */ #include <stdio.h> #include <conio.h> main( ) { int A, B, X; printf ("Informe um valor para a variável A:”); scanf (“%d”, &A); printf ("Informe um valor para a variável B:”); scanf (“%d”, &B); if (A > B) { X = A; A = B; B = X; } printf("\n Os valores ordenados são: %d e %d", A, B); getch( ); } Note a utilização das chaves { e } após a utilização da instrução if. Isto se fez necessário, pois a troca de valores é conseguida com a execução de três operações, sendo que estas três operações devem acontecer quando a condição for Verdadeira. Sendo a condição Falsa, serão apresentados os valores como entrados, uma vez que já estão em ordem. Observe a linha: printf ("\n Os valores ordenados são: %d e %d", A, B); note que a colocação do código %d dentro da mensagem indica o local de posicionamento do valor da variável. - 18 - Operadores Relacionais No exemplo anterior, foi utilizado o sinal de > (maior que) para verificar o estado da variável quanto ao seu valor, ou seja, a sua condição. Sendo assim, uma condição também poderá ser verificada como: diferente, igual, menor que, maior ou igual a que e menor ou igual a que. Estas verificações são efetuadas com a utilização dos chamados operadores relacionais, conforme tabela abaixo: == Igual != Diferente > Maior < Menor >= Maior ou Igual <= Menor ou Igual Obs. Ao fazer uso do operador relacional "= =" que representa o valor de igualdade de uma comparação entre dois elementos, deve-se tomar o cuidado para não confundi-lo com o sinal "=", que na linguagem C é utilizado como símbolo de atribuição. Este erro é comum para quem utiliza outras linguagens de programação como Pascal, Visual Basic, Delphi, Quick Basic, pois a segunda forma é usada tanto para atribuição como para comparação. 12.2.2 - Seqüências Alternativas Compostas: if ... else São estruturas compostas por desvios múltiplos em sua formação, onde um bloco de ações B é executado em caso de condição verdadeira e um bloco de ações C é executado em caso de condição falsa. A estrutura de formação para as seqüências alternativas compostas utiliza a seguinte sintaxe: /* ...Comentário do Prólogo... */ bibliotecas; main() { Ações A; if (CONDIÇÃO) { Ações B; } else { Ações C; } Ações D; } Para um exemplo da utilização desta estrutura considere o seguinte problema: "Ler dois valores numéricos, efetuar a adição. Caso o valor somado seja maior ou igual a 10, este deverá ser apresentado somando-se a ele mais 5. Caso o valor somado não seja maior ou igual a 10, este deverá ser apresentado subtraindo-se 7". Algoritmo 1. Conhecer dois valores ( variáveis A e B ); 2. Efetuar a soma dos valores A e B e implicar o valor da soma em X; 3. Verificar se X é maior ou igual 10, caso sim mostre X+5, senão mostre X-7. - 19 - Programa /* Adiciona Números */ #include <stdio.h> #include <conio.h> main( ) { int A, B, X; printf ("Informe um valor para a variável A: "); scanf ("%d", &A); printf ("Informe um valor para a variável B: "); scanf ("%d", &B); X = A + B; printf ("\n O resultado eqüivale a: "); if (X >= 10) printf ("%d", X+5); else printf ("%d", X-7); getch( ); } Observe que após a definição dos tipos de variáveis, é solicitada a leitura dos valores para as variáveis A e B, depois estes valores são implicados na variável X, que possui o resultadoda adição dos dois valores. É apresentada então a mensagem O resultado eqüivale a:, que não posicionará o cursor na próxima linha, desta forma qualquer que seja o resultado avaliado pela condição, será apresentado ao lado direito da mensagem. Em seguida a esta linha é verificado no programa, a condição que permitirá escrever o resultado da soma adicionado de 5, caso esta seja maior ou igual a 10. Não sendo, o programa apresentará o resultado subtraindo 7. Operadores ou Conectivos Lógicos Existem ocasiões onde é necessário trabalhar com o relacionamento de duas ou mais condições ao mesmo tempo na mesma instrução if, efetuando desta forma testes múltiplos. Para estes casos é necessário trabalhar com a utilização dos operadores lógicos, também conhecidos como operadores booleanos. Já foi comentado anteriormente que a linguagem C não faz uso de valores lógicos, tais como: Verdadeiro ou Falso, pelo fato de estes dois valores não existirem. Em uma expressão condicional ou no uso de operadores lógicos, será considerado como valor Verdadeiro o resultado da expressão que for não- zero (que será considerado para efeito de avaliação lógica o valor numérico um: 1). Sendo o resultado da expressão zero, esta será considerada como valor Falso. Os 3 operadores lógicos utilizados comumente na Linguagem C são: E, OU e NÃO. Em alguns casos, o uso de operadores lógicos evita a utilização de muitas instruções if encadeadas. Operador Lógico E: && O operador do tipo && é utilizado quando dois ou mais relacionamentos lógicos de uma determinada condição necessitam ser verdadeiros. Abaixo é apresentada a tabela verdade para este tipo de operador: Condição 1 Condição 2 Resultado . 0 (Falsa) 0 (Falsa) 0 (Falso) 1 (Verdadeira) 0 (Falsa) 0 (Falso) 0 (Falsa) 1 (Verdadeira) 0 (Falso) 1 (Verdadeira) 1 (Verdadeira) 1 (Verdadeiro) O operador && faz com que somente seja executada uma determinada operação se todas as condições mencionadas forem simultaneamente verdadeiras, gerando assim um resultado lógico verdadeiro. - 20 - Operador Lógico OU: || O operador do tipo || é utilizado quando pelo menos um dos relacionamentos lógicos (quando houver mais de um relacionamento) de uma condição necessita ser verdadeiro. Abaixo é apresentada a tabela verdade para este tipo de operador: Condição 1 Condição 2 Resultado . 0 (Falsa) 0 (Falsa) 0 (Falso) 1 (Verdadeira) 0 (Falsa) 1 (Verdadeiro) 0 (Falsa) 1 (Verdadeira) 1 (Verdadeiro) 1 (Verdadeira) 1 (Verdadeira) 1 (Verdadeiro) O operador | | faz com que seja executada uma determinada operação, se pelo menos uma das condições mencionadas gerar um resultado lógico verdadeiro. Operador Lógico NÃO: ! O operador do tipo ! é utilizado quando se necessita estabelecer que uma determinada condição deve não ser verdadeira ou deve não ser falsa. O operador ! se caracteriza por inverter o estado lógico de uma condição. Abaixo é apresentada a tabela verdade para este tipo de operador: Condição Resultado . 1 (Verdadeira) 0 (Falso) 0 (Falso) 1 (Verdadeira) O operador ! faz com que seja executada uma determinada operação, invertendo o resultado lógico da condição. 12.2.3 - Seqüências Alternativas com Múltiplas Condições Esta estrutura é composta por múltiplas condições, onde cada uma pode conter um valor lógico diferente. Tais condições são analisadas individualmente e a elas são atribuídos valores lógicos individuais, que passam a ser operados com as tabelas verdade, encontrando assim um único valor lógico correspondente ao conjunto de condições citadas na operação. A estrutura de seqüências alternativas com múltiplas condições deve respeitar a seguinte sintaxe: /* ...Comentário do Prólogo... */ bibliotecas; main() { Ações A; if (CONDIÇÃO1 conectivológico CONDIÇÃO2 conectivológico CONDIÇÃON) { Ações B; } else { Ações C; } Ações D; } Para demonstrar a utilização de operadores lógicos, considere o seguinte problema (clássico): "Ler três valores para os lados de um triângulo, considerando lados como: A, B e C. Verificar se os lados fornecidos formam realmente um triângulo. Se for esta condição verdadeira, deverá ser indicado qual tipo de triângulo foi formado: isósceles, escaleno ou equilátero". - 21 - Algoritmo Forma-se um triângulo quando A<B+C, quando B<A+C e quando C<A+B. Tendo certeza de que os valores informados para os três lados formam um triângulo, serão então analisados os valores para se estabelecer qual tipo de triângulo será formado: isósceles, escaleno ou equilátero. Um triângulo é equilátero quando possui todos os lados iguais, sendo A==B e B==C; é isósceles quando possui dois lados iguais, sendo A==B ou A==C ou B==C; é escaleno quando possui todos os lados diferentes, sendo A!=B e B!=C e A!=C 1. Ler três valores para os lados de um triângulo: A, B e Q 2. Verificar se cada lado é menor que a soma dos outros dois lados a. Se sim, saber se A= =B e se B= =C, sendo verdade o triângulo é equilátero b. Se não, verificar A= =B ou se A= =C ou se B= =C, sendo verdade o triângulo é isósceles, caso contrário o triângulo será escaleno; 3. Caso os lados fornecidos não caracterizem um triângulo, avisar a ocorrência. Programa /* Programa Tipo de Triângulo */ #include<stdio.h> #include<conio.h> main( ) { float A, B, C; printf("\t Programa Tipo de Triangulo \n\n"); printf("\n Informe o lado A: "); scanf("%f", &A); printf("\n Informe o lado B: "); scanf("%f", &B); printf("\n Informe o lado C: "); scanf("%f", &C); printf("\n"); if (A<B+C && B<A+C && C<A+B) { if (A==B && B== C) printf("Triangulo Equilatero \n"); else { if (A==B || A==C || C==B) printf("Triangulo Isosceles \n"); else printf("Triangulo Escaleno \n"); } } else printf("Os valores fornecidos nao formam um triangulo \n”); getch( ); } O exemplo demonstra através da utilização dos operadores lógicos, a capacidade de um programa definir se determinados valores fornecidos formam realmente um triângulo, e se a condição for verdadeira, este programa indica o tipo de triângulo formado. Se forem fornecidos respectivamente os valores 8, 2 e 3 para os lados A, B e C, será apresentada a mensagem: "Os valores fornecidos não formam um triângulo", pois a primeira condição da instrução if (A<B+C && B<A+C && C<A+B) resulta o valor lógico falso, uma vez que 8 é maior que a soma de 2 com 3. Caso sejam fornecidos os valores 8, 8 e 2, a primeira instrução if será verdadeira, indicando que os lados fornecidos formam um triângulo. Apesar de o lado A ser igual ao lado B, mas este não ser igual ao lado C, o triângulo formado não é do tipo equilátero, desta forma a segunda instrução if tem seu resultado lógico como falso, sobrando a verificação da condição para a terceira instrução if que indica o triângulo como sendo do tipo isósceles, pois o lado A é igual ao lado B. - 22 - COMANDOS ESPECIAIS DE REFINAMENTO A seguir são apresentados alguns comandos de controle de ambiente de tela que a linguagem C oferece ao seu programador. Para usá-los deve-se acrescentar a biblioteca conio.h no início do programa. No Dev C++, além da biblioteca conio.h ainda podem ser necessárias as bibliotecas conio.c e/ou conio2.h, caso estas estejam instaladas no pacote do compilador. textcolor (); � Usado para adotar cores em fontes no C ou para fazê-las piscar. Ex.: textcolor (RED); // A cor do texto fica vermelha. textbackground(); � Usado para adotar cor de fundo nas fontes do C. Ex.: textbackground (BLUE); // A cor do texto fica azul. getche(); � Tem a finalidade de interromper momentaneamente a execução de um programa em C. clrscr(); � Tem a função de limpar a tela, posicionando o cursor no canto superior esquerdoda tela. gotoxy(col,lin); � Tem a finalidade de direcionar uma instrução para uma determinada coluna e linha da tela. Ex.: gotoxy (30,10); // Posiciona a próxima instrução na coluna 30 e na linha 10 da tela. Obs. Para utilizar alguns destes comandos deve-se acrescentar a letra c no início da função que se deseja usar. Por exemplo: textcolor (RED); cprintf (“Esta mensagem aparecerá com a cor vermelha na tela”); O compilador C também utiliza um vasto conjunto de funções aritméticas que facilitam o acesso aos cálculos matemáticos mais complexos. Para utilizar essas funções, deve-se declarar um outro arquivo cabeçalho com a biblioteca math.h. A seguir são apresentadas algumas destas funções: cos (x) � retorna o co-seno da variável x. sin (x) � retorna o seno da variável x. exp (x) � retorna o valor de e elevado a x. log (x) � calcula o logaritmo natural de x. sqrt(x) � calcula a raiz quadrada do valor x. Etc... - 23 - ExercícioExercícioExercícioExercíciossss 1) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para que um usuário, informando a distância entre dois pontos e o tempo gasto no percurso, tenha como resposta a velocidade obtida no trajeto. Lembre-se que V = S/T. Adotar as unidades: km para a distância e hora para o tempo. O diferencial deste exercício, é que deverá ser retornando um aviso de multa caso a velocidade tenha ultrapassado o limite de 110km/h e uma mensagem de boa conduta em caso contrário. 2) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para ler um número inteiro positivo e saber se este número é par ou ímpar. O resultado deve ser apresentado ao usuário do programa. 3) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para Efetuar a leitura de três valores (variáveis A, B e C) e efetuar o cálculo da equação de segundo grau, apresentando as duas raízes, se para os valores informados for possível efetuar o referido cálculo. 4) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para ler duas notas escolares de um aluno e imprimir uma mensagem dizendo que o aluno foi aprovado se o valor da média escolar (média simples) for maior ou igual a 7. Se o valor da média for menor que 7, solicitar que seja informada uma nota de exame. Some então esta nota de exame com o valor da média anterior e encontre a nova média. Se esta nova média for maior ou igual a 5, apresentar uma mensagem dizendo que o aluno foi aprovado, caso contrário: reprovado. Apresentar junto com as mensagens o valor da média do aluno para qualquer condição. 5) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para efetuar o controle de entrada de um cinema a partir da informação do valor do ingresso e ainda a idade do cliente. Se a idade for >= 65 ou a idade for < 12 o cliente paga apenas meia entrada, caso contrário paga inteira. 6) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para que a partir da leitura de 3 valores, A, B e C, saber se estes valores formam ou não um triângulo. O resultado da pesquisa deve ser informado ao usuário do programa e caso os valores formem um triângulo, deverá ser mostrado ao usuário o tipo do triângulo formado. 7) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para que a partir da informação da base e altura de um triângulo, seja encontrada e apresentada a área do mesmo, ( A = ( B * H ) / 2 ). Refine o seu algoritmo, dando respostas específicas caso a base ou a altura sejam informadas como negativas ou zero. - 24 - XIXIXIXIIIIII I I I ���� LaçosLaçosLaçosLaços DE RepetiçõesDE RepetiçõesDE RepetiçõesDE Repetições ((((ITERAÇÕES ITERAÇÕES ITERAÇÕES ITERAÇÕES –––– L L L Loopingsoopingsoopingsoopings ) ) ) ) Existem sistemas que tem necessidade de repetir um determinado trecho do programa algumas vezes. Isto pode ser conseguido de duas formas: a primeira, de forma “braçal”, com muito Crtl+C Ctrl+V, é escrito o mesmo trecho tantas vezes quanto necessário, um tanto trabalhoso e “sem classe” e a segunda forma, muito mais inteligente, utilizando o conceito de looping, que são conhecidos também por: laços, iterações ou repetições. Supondo um programa que deveria executar um determinado trecho de instruções por quatro vezes. Com o conhecimento adquirido até este momento você só poderia optar pela primeira forma, escrevendo o mesmo tantas vezes quanto for necessário, no caso quatro vezes. Por exemplo, imagine um programa que peça a leitura de dois valores para as variáveis A e B respectivamente. Efetue a adição de um com o outro, implicando o resultado na variável de resposta R e em seguida apresente o valor do resultado obtido, repetindo esta seqüência por quatro vezes. /* Programa soma de dois números 4 vezes sem looping Autor: Fulano de tal Data: 04/04/1974 Var: A e B para os números somados e R para o resultado a soma. Funcionalidade: o usuário informa 2 números e tem a soma entre eles por 4 vezes consecutivas */ #include <stdio.h> #include <conio.h> main ( ) { int A, B, R; printf (" \n\n Programa soma de 2 números por 4 vezes \n\n "); printf (" Entre com um valor para A: "); scanf("%d", &A); printf (" Entre com um valor para B: "); scanf("%d", &B); R = A + B; printf (" O resultado da soma é: %d \n\n\n ", R); printf (" Entre com um valor para A: "); scanf("%d", &A); printf (" Entre com um valor para B: "); scanf("%d", &B); R = A + B; printf (" O resultado da soma é: %d \n\n\n ", R); printf (" Entre com um valor para A: "); scanf("%d", &A); printf (" Entre com um valor para B: "); scanf("%d", &B); R = A + B; printf (" O resultado da soma é: %d \n\n\n ", R); printf (" Entre com um valor para A: "); scanf("%d", &A); printf (" Entre com um valor para B: "); scanf("%d", &B); R = A + B; printf (" O resultado da soma é: %d \n\n\n ", R); getch(); } A vantagem em se utilizar looping é que o programa passa a ter um tamanho menor, podendo sua amplitude de processamento ser aumentada sem se alterar o tamanho do código de programação. Desta forma, podem-se determinar repetições com números variados de vezes; como veremos a seguir. - 25 - 13.1 Iteração Enquanto - Looping com condição no início: while Esta estrutura caracteriza-se por efetuar um teste lógico no inicio de um looping, verificando se é permitido executar o trecho de instruções subordinado a este. A estrutura while tem o seu funcionamento controlado por condição. Desta forma, poderá executar um determinado conjunto de instruções enquanto a condição verificada permanecer Verdadeira. No momento em que esta condição se torna Falsa, o processamento da rotina é desviado para fora do looping. Sendo a condição Falsa logo no inicio do looping, as instruções contidas no bloco de ações são ignoradas. Caso seja necessário executar mais de uma instrução para uma condição verdadeira dentro de um looping, estas deverão estar mencionadas dentro de um bloco definido com { e }. Desta forma, a instrução while deverá ser escrita respeitando a seguinte sintaxe: while (condição verdadeira) { <Bloco de Ações>; } 1º - Exemplo Como exemplo, considere o problema anterior, onde é necessário executar quatro vezes a solicitação de dois números para o cálculo da adição. Neste caso, será necessário definir um contador para controlar a execução do programa, e a cada vez que for executado o trecho desejado do programa, este contador deverá ser incrementado de mais 1. Observe abaixo os detalhes para a solução deste problema: Algoritmo Literal 1. Criar uma variável para servir como contador com valor inicial 1; 2. Enquanto o valor do contador for menor ou igual a 4, processar os passos 3, 4 e 5; 3. Ler os dois valores; 4. Efetuar o cálculo, implicandoo resultado em R; 5. Apresentar o valor calculado contido na variável R; 6. Acrescentar o contador com mais 1 unidade; 7. Quando o contador for maior que 4, encerrar o processamento. Programa /* Programa soma de dois números 4 vezes com looping while Autor: Fulano de tal Data: 04/04/1974 Var: A e B para os números somados; R para o resultado e CONTADOR para contar os 4 loopings Funcionalidade: o usuário informa 2 números e tem a soma entre eles por 4 vezes consecutivas */ #include <stdio.h> #include<conio.h> main( ) { int A, B, R, CONTADOR; printf ("\n\n Programa soma de 2 números por 4 vezes \n\n "); CONTADOR=1; while (CONTADOR <= 4) { printf (" \n Entre com um valor para A: "); scanf("%d", &A); printf (" \n Entre com um valor para B: "); scanf("%d", &B); R = A + B; printf (" \n O resultado da soma é: %d \n\n ", R); CONTADOR = CONTADOR + 1; } getch( ); } - 26 - Além da utilização das variáveis A, B e R, foi necessário criar uma terceira variável, chamada no caso de CONTADOR para controlar a contagem do número de vezes que o trecho de programa é executado. Assim que o programa é inicializado, a variável contador é atribuída com o valor 1 (CONTADOR =1). Em seguida a instrução while (CONTADOR <= 4) efetua a checagem da condição estabelecida, verificando que a condição é verdadeira, pois o valor da variável CONTADOR que neste momento é 1, é realmente menor que 4 e enquanto for, deverá processar o looping. Desta forma, é iniciada a execução da rotina de instruções contidas no looping delimitado com a instrução while. Depois de efetuar a solicitação dos valores, ter processado a operação de adição e exibido o resultado, o programa encontra a linha com a instrução CONTADOR = CONTADOR + 1, indicando o acréscimo de 1 na variável contador. Observe que a variável CONTADOR possui neste momento o valor 1 e somado a mais 1 esta passa a ter o valor 2, ou seja, CONTADOR = 1 + 1, resultando em CONTADOR =2. Estando a variável CONTADOR com o valor 2, o processamento do programa volta para a instrução while (CONTADOR <= 5), que verifica a condição da variável. Sendo esta condição Verdadeira, será executada novamente a mesma rotina de instruções. Quando o processamento do programa chegar na instrução CONTADOR = CONTADOR + 1, fará com que a variável CONTADOR passe a possuir o valor 3. Desta forma o programa processará novamente a rotina de instruções, passando o valor de CONTADOR para 4, que será verificado, e sendo menor ou igual a 4, será executada mais uma vez a mesma rotina de instruções. Em seguida o valor da variável CONTADOR passa a ser 5, que resultará para a instrução while uma condição falsa e por conseguinte desviará o processamento para a primeira instrução encontrada após o bloco definido entre { e }, no caso para o getch() e em seguida para o fim do programa. O uso de contadores na linguagem C também pode ser escrito de outras formas. No programa anterior, por ex., a linha CONTADOR = CONTADOR + 1 poderia ter sido escrita como: CONTADOR += 1. Imagine agora uma outra situação, onde o usuário deseja executar a rotina do programa várias vezes, mas não sabe quantas vezes ao certo deverá executar o trecho de programa. Neste caso, não seria conveniente manter um contador para controlar o looping, seria melhor que o programa fizesse ao usuário uma pergunta, solicitando se o mesmo deseja ou não continuar executando o programa. Veja o exemplo: /* Programa soma de dois números indeterminadas vezes com looping while Autor: Fulano de tal Data: 04/04/1974 Var: A e B para os números somados; R para o resultado e RESP para determinar o número de loopings Funcionalidade: o usuário informa 2 números e tem a soma entre eles por n vezes consecutivas */ #include <stdio.h> #include <conio.h> main() { int A, B, R; char RESP = 's'; printf ("\n\n Programa soma de 2 números por indeterminadas vezes \n "); while (RESP == 's') { printf (" \n\n Entre com um valor para A: "); scanf("%d", &A); printf (" \n Entre com um valor para B: "); scanf("%d", &B); R = A + B; printf (" \n O resultado da soma é: %d \n\n ", R); printf (" \n Deseja continuar? - Tecle (s) ou (n): ”); RESP = getche(); } } - 27 - No exemplo, o contador foi substituído pela variável RESP, que enquanto tiver o seu valor igual a 's', executará o bloco de instruções subordinado a while. Neste caso, o número de vezes que a rotina se repetirá será controlado pelo usuário e dependerá da informação fornecida para a variável RESP. Observe no programa anterior, o uso de apóstrofos na string da condição ao invés de aspas. Na linguagem C, somente são colocadas strings entre aspas quando são usadas com a função printf(), no caso de uma condição, deve-se fazer uso de apóstrofos. Observe que para a entrada da resposta não foi utilizada a função scanf(), sendo usada a função getche() que permite que seja feita a leitura de um caractere do teclado sem que se pressione a tecla <ENTER>. Outro detalhe a ser observado na sintaxe da linguagem C é o fato de permitir simplificações na forma de escrita. No programa anterior, é iniciada a variável RESP como sendo do tipo string (char) e antes de iniciar o looping esta variável é atribuída com o valor 's' para dar início ao processamento do looping. Perceba que após a inicialização da variável com o seu tipo, está sendo atribuído simultaneamente o valor da variável RESP = 's': char RESP = 's'. ExercícioExercícioExercícioExercíciossss 1) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para escrever na tela de um computador 20 vezes a frase: “Eu serei aprovado”. 2) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para escrever na tela de um computador todos os números inteiros entre 33 e 50. 3) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para escrever na tela de um computador todos os números inteiros e pares entre 44 e 74. 4) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para escrever na tela de um computador indeterminadas vezes a frase: “Remo Campeão” enquanto o usuário do programa assim desejar. Confirme a vontade do usuário com a variável RESP sendo ou não igual a ‘s’. Use o comando: RESP = getche(); 5) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para ler a matrícula (RA) de um aluno e enquanto esta matrícula for diferente de 0 (zero), cadastrar 2 notas e encontrar a média entre elas de acordo com a seguinte fórmula: M = (N1+N2)/2. Apresentar a média encontrada e ainda: se essa média for maior ou igual a 5, comunicar que o aluno está aprovado, senão comunicar que este aluno está reprovado. 6) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para controlar a entrada em uma boate com capacidade para até 300 pessoas. É proibida a entrada de menores de 18 anos e o programa é encerrado quando o usuário informa 0 (zero) para a idade de um cliente. Deve ser solicitada a idade de cada cliente da boate e se esta idade for menor que 18 anos, deve ser apresentada uma mensagem de “entrada proibida” para o cliente, porém, se a idade for maior ou igual a 18, o cliente entra na boate e é apresentado para o usuário do programa o número de clientes que estão naquele momento dentro da boate. 7) Desenvolver um programa no Dev C++, completo e voltado ao usuário final, para efetuar a contagem regressiva de um lançamento de um foguete. O tempo da contagem é de 8 segundos. Utilize o comando _sleep(1000) , que faz parte da biblioteca <stdlib.h> , para que cada laço demore um segundo para ser executado. Informe ao usuário, segundo a segundo, o tempo restante para o lançamento do foguete, Quando o foguete for lançado o usuário deve ser informado que o lançamento foi executado. Tente representar o foguete “decolando”com o uso do comando gotoxy().
Compartilhar