





















































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
LÓGICA DE PROGRAMAÇÃO
Tipologia: Notas de estudo
1 / 61
Esta página não é visível na pré-visualização
Não perca as partes importantes!






















































Objetivos
I.1 – O que é um Algoritmo Os computadores vêm sendo cada vez mais utilizados nas mais diversas áreas, desde a medicina até a engenharia, desde a administração de empresas até o controle de máquinas industriais, desde a edição de textos pessoais até a produção de efeitos especiais em filmes. Em todas as situações, o computador age como uma máquina capaz de coletar, manipular e devolver dados em grande quantidade e alta e alta velocidade. Estas atividades são executadas por uma gama de circuitos e componentes eletrônicos (Hardware). Ao longo das últimas décadas, estes componentes têm se tornado cada vez mais eficientes e baratos, devido aos avanços tecnológicos. “Embora os computadores modernos sejam capazes de executar operações difíceis e complexas, eles são máquinas dóceis e de uma inteligência restrita. Eles devem ser ensinados exatamente o que fazer, e as instruções devem ser feitas em uma linguagem simples, precisa e limitada que eles possam compreender. Estas instruções são mais conhecidas como software” (Darmell,l988). Uma das etapas fundamentais no desenvolvimento do software é a Construção de Algoritmo. Algoritmo é uma seqüência de operações que devem ser executadas em uma ordem definida e não-ambígua, com o propósito de solucionar um determinado problema. Esta definição pode caracterizar tanto um receita de bolo com o conjunto de instruções para montagem de um automóvel. No nosso caso, serviria para definir o conjunto de atividades que o computador deve desempenhar para solucionar um problema. O algoritmo é geralmente representado através de modelos de fácil compreensão pelos humanos, mas incompreensíveis para o computador. Para que o computador possa executar um algoritmo, é necessário que este algoritmo seja traduzido para uma linguagem que seja entendida pelo computador -
programação obtém-se um Programa. Este curso tem por objetivo desenvolver a capacidade de construir algoritmos de uma forma organizada (estruturada) na linguagem de programação C.
I.2 – Exemplo de Algoritmo Boa parte das atividades do dia-a-dia pode ser descrita através de algoritmos. Por exemplo, o ato de trocar um pneu furado em um carro consiste em:
A seqüência descrita acima pode ser completada com várias observações. Por exemplo: − O que fazer se o macaco não estiver no porta-malas? − O que fazer se o estepe também estiver vazio? − Deve-se sempre puxar o freio de mão antes de executar estas operações. Por outro lado, algumas ações devem ser levadas a cabo após executar a troca do pneu. Por exemplo: − Limpar as mãos; − Consertar o pneu furado; Se o responsável pela construção do algoritmo tiver que se preocupar com todas as possibilidades do ambiente de execução do mesmo, e além disso, com todas as necessidades de tratamento pós- execução , nenhum algoritmo será completo. Sempre alguma condição poderá ser esquecida. Assim, antes de se construir um algoritmo, deve-se especificar as condições de inicio (dados de entrada) e as de término (dados de saída). No caso acima, teremos: − Condição de entrada: um carro com todos os equipamentos de segurança em condições, parado e freado, com um pneu furado. − Condição de saída: um carro parado, freado, com todos os equipamentos de segurança em condições, exceto pelo pneu estepe vazio, com todos os pneus OK. Além disso, alguém pode argumentar que as ações não estão suficientemente detalhadas para compreensão. Para uma pessoa acostumada a trocar pneus furados as explicações são suficientes, mas será que um selvagem do deserto Kalahari, que nuca viu um carro antes, saberá utilizar corretamente um macaco para elevá-lo? Assim, a função “levantar o carro” seria melhor descrita como: − Empunhe o cabo da manivela do macaco; comece a girar a manivela no sentido horário, mantendo este movimento até que o pneu do carro esteja suspenso a pelo menos 10 cm do chão; solte a manivela. Boa parte dos problemas tratados no computados é resolvida por seqüência de instruções (algoritmos) compostas por um agrupamento de atividades por si só complexas. Da mesma forma que foi necessário detalhar o uso do macaco para o selvagem, também estas atividades complexas devem ser detalhadas até a um nível em que o computador seja capaz de reconhecê-las e executá- las. Devido à velocidade com que o computador processa cada uma destas instruções simplificadas, não há problema em descrever e tratar uma atividade complexa através de milhares de outras atividades básicas. Para os seres humanos, contudo, é difícil memorizar e detalhar milhares de instruções, associando-as à atividade original. Para facilitar esta tarefa, utilizam-se duas ferramentas: − Técnica de Refinamentos Sucessivos; − Representação de Algoritmos.
Processamento-componente “Coma uma fruta” − Se houver algum tipo de fruta disponível na mesa, escolha um tipo; − Pegue uma fruta do tipo escolhido; − Coma a fruta.
Exercícios
Termine o detalhamento de todos os procedimentos necessários à sua “Manhã de Segunda-Feira”. Depois compare com pelo menos dois de seus colegas.
Use a técnica de refinamentos sucessivos para detalhar as seguintes atividades:
I.4 – Representação de Algoritmos Devido à pequena capacidade de memorização humana, os procedimentos-componentes devem ser armazenados em algum lugar, para permitir o acesso rápido e o fácil entendimento. Para isto, podem ser utilizadas desde folhas de papel até o auxilio de computadores. Qualquer que seja o tipo de armazenamento, estes procedimentos/algoritmos devem ser descritos por algum modelo. Nos exemplos anteriores utilizamo-nos da própria língua portuguesa, que é um modelo de representação com que estamos acostumados a trabalhar. A língua portuguesa traz, contudo, uma série de inconvenientes: − Certas palavras têm dupla interpretação; − Exigem-se regras de concordância bastante definidas; − A pontuação pode alterar completamente o significado de uma frase. Além disso, a língua falada costuma apresentar construções complexas, bastantes distintas da simplicidade das linguagens entendidas pelos computadores. Os modelos de representação de algoritmos devem ser mais restritos, diminuindo a liberdade de expressão do “construtor de algoritmos”, mas com isso eliminando os problemas de interpretação, concordância e pontuação. Estes modelos devem ainda utilizar-se da apresentação gráfica para tornar os algoritmos mais fáceis de serem compreendidos. A linguagem de programação C proporciona estas características para a representação de algoritmos.
I.5 – Partes de um Programa em C Um exemplo bastante conhecido de representação de programas é o de receitas culinárias. Estas têm a seguinte estrutura:
Além disso, toda receita vem com muitos comentários relativos a detalhes que poderiam passar despercebidos e estragar o resultado final. Os comentários servem para chamar a atenção do cozinheiro e explicar melhor o porque de cada passo.
Da mesma forma um bom programa terá 4 partes:
conjunto;
Elaboração do programa usando dentro de cada módulo um numero limitado de “estruturas básicas de fluxo de controle”, isto é, instruções. Os módulos são construídos por programas. No programa, cada um de seus passos pertence a uma das três estruturas básicas:
Os programas devem ser lidos e entendidos por quem os confeccionou e por outras em toda a sua vida útil, uma vez que podem necessitar correção, manutenção e modificação. Para que isto ocorra, eles precisam ser muito bem documentados. Um programa bem documentado possui as seguintes características:
ser alinhados de acordo com o nível a que pertencem, ou seja, a estrutura na qual eles estão contidos deve estar destacada;
por sua elaboração;
especifica formalmente o conteúdo de cada dado utilizado no corpo do programa e indica os valores que cada um deles pode assumir.
Objetivos
III.1 – Introdução Nos capítulos anteriores mostraram-se diversos algoritmos, com suas operações mais simples sendo executadas por seres humanos (algoritmo “Troca de Pneu”). Também se discutiram as vantagens e objetivos das Técnicas de Programação Estruturada (Refinamentos Sucessivos, Modularização, Documentação, etc). Nesse capítulo serão descritas as operações básicas que o computador pode executar. Estas operações serão utilizadas para construir algoritmos progressivamente mais complexos. Um fator a observar é que os computadores reais, na verdade, executam um conjunto ainda mais
linguagem de alto nível para linguagem de máquina utilizam-se outros programas denominados de compiladores. Uma vez construído um algoritmo, o mesmo pode ser traduzido para uma linguagem de programação de alto nível (PACAL, COBOL, FORTRAN, C, MODULA, etc). Este último programa é então traduzido pelo compilados para linguagem de máquina, que pode ser executada pelo computador.
Constantes são valores que parecem em meio ao programa e que não têm seu valor alterado durante a execução do mesmo. Um exemplo típico é o do número π (PI). Variáveis são elementos (posição de memória da máquina) que recebem o valor de uma variável ou de uma expressão, podendo este valor ser alterado durante a execução do programa. Uma variável pode ser imaginada como uma posição da máquina, identificada pelo “nome da variável”. Exemplo: Soma = 0; significa que uma posição de memória da máquina, identificada pelo nome Soma , recebe o valor 0.
III.3.1 – Tipo Básicos de Dados No C, são adotados quatro tipos básicos de dados, isto é, são quatro os tipos primitivos de dados que podem ser usados. Esses tipos podem criar outros tipos chamados de “tipos construídos”, que serão vistos posteriormente.
1. TIPO INTEIRO (int) Designa um intervalo (dependente do compilador e da máquina) dos números inteiros (negativo, positivo ou nulo). Possui como operações associadas:
III.4 – Definição das Variáveis de um Programa Quando se escreve um programa, é necessário definir o tipo de todas as variáveis que serão usadas. Essa definição de tipo é feita através de uma “Declaração de Variáveis”, onde são especificados os valores que podem ser atribuídos a cada uma das variáveis (se valores inteiros, reais, etc). Em C, quando um computador está executando um programa e encontra uma variável qualquer, se esta não tiver tido o seu nome e tipo declarado anteriormente, será emitida uma mensagem de erro, abortando a execução. Assim, toda variável deve ser declarada antes de ser utilizada. A declaração de variáveis e constantes segue a seguinte estrutura:
#define
Exemplo: #define pi 3, 1415926 #define NotaMaxima 10 int soma, cont1, cont2, matriculaAluno; float mediaAluno, notaProva1, notaProva2;
Assinale os identificadores válidos: ( )Valor ( )Salário-Liquido ( )SalarioLiquido ( )X ( )NotaAluno ( )3X ( )AH!! ( )xy ( )X
III.5 – Operações Elementares As operações elementares são os comandos de atribuições, cálculos de expressões, e operações de entrada e saída. Essas operações são chamadas de elementares por na alterarem o fluxo normal da execução do programa, ou seja, após a execução de uma operação elementar, a próxima instrução a ser executada é a seguinte do programa. Toda instrução possui uma parte sintática (diz respeito à forma como a instrução é escrita) e uma parte semântica (diz respeito ao que a instrução faz).
III.5.1 – Comando de Atribuição O comando de atribuição é a maneira de se especificar que a uma determinada variável será atribuído (fornecido) um certo valor. Este comando. Em C, é indicado pelo símbolo de atribuição “=”. Forma geral do comando de atribuição: <variável> =
III.5.2 – Cálculo de Expressão As variáveis e constantes podem ser combinadas com os operadores associados a cada tipo de dados, gerando expressões. È o valor calculado das expressões que é atribuído à variável ao lado esquerdo do comando de atribuição.
III.5.3 – Expressão Aritmética A expressão aritmética é aquela cujos operadores e/ou variáveis de tipo numérico. A notação é a mesma das operações matemáticas, com as seguintes exceções: − Não é permitido omitir o operador de multiplicação: A*C é diferente de AC
Exercício Calcule o valor das seguintes expressões aritméticas, considerando os seguintes valores: A = 10 B = 3 X = 2.5 Y = 1. a)X/ b)ceil(X-Y) c)EXP(Y(B+2)-6) d)floor(2.9+ceil(0.3+Y)2+A)
III.5.2.2 – Expressão Relacional Trabalha com operadores relacionais e é formada por três partes: uma expressão (da esquerda), um operador relacional e outra expressão (da direita). Note-se que uma variável ou constante isolada pode ser entendida como uma expressão. São exemplos de operadores relacionais:
maior que;
= maior ou igual a;
III.5.2.3 – Expressão Lógica É comum nos programas surgirem situações em que a execução de uma ação, ou seqüência de subações, está sujeita a uma certa condição. Esta é representada no texto do programa por meio de uma expressão lógica. Denomina-se de Expressão Lógica à expressão cujos operadores são lógicos e cujos operandos são expressões relacionais e/ou variáveis do tipo inteiro. Os operadores lógicos são: && (AND) || (OR)! (NOT) Os resultados obtidos das expressões lógicas também são valores do tipo inteiro (0 para falso e 1 para verdadeiro). Exemplos: Se P e Q são operandos inteiras então: P Q P && Q P || Q !P !(P && Q) 1 1 1 1 0 0 1 0 0 1 0 1 0 1 0 1 1 1 0 0 0 0 1 1
Exercícios Dadas as variáveis e seus valores: A = 10 B = 3 X = 3.5 Y = 0. L1 = 1 L2 = 0
Calcule o valor das seguintes expressões: a)(A < B) b)(X < A) c)((X + A) < (B * Y)) d)((X < A) || (B > Y)) e)L1 && L f)L1 || L g)(L1 && (X < Y)) h)((! L2) || (! (X < (Y + 2))))
III.5.3 – Operações de Entrada de Dados O computador armazena os valores das variáveis (e o próprio programa!) em sua memória. O computador alcança estes valores do ambiente externo através de operações de entrada de dados. A operação de entrada de dados transfere um ou mais dados do ambiente externo (teclado, disquete) para uma ou mais variáveis na memória, funcionando como um comando de atribuições. Os dados lidos devem ser do mesmo tipo das variáveis especificadas no comando de leitura. A forma geral de descrição desta operação é: scanf(“
A tabela a seguir nos mostra alguns dos possíveis formatos a serem usados: Código Significado %c Lê um único caracter %d Lê um inteiro decimal %i Lê um inteiro decimal %e Lê um número em ponto flutuante %f Lê um número em ponto flutuante %g Lê um número em ponto flutuante %o Lê um número octal %s Lê uma string %x Lê um número hexadecimal %p Lê um ponteiro %n Recebe um valor inteiro igual ao número de caracteres lidos até então %u Lê um número sem sinal %[] Busca por um conjunto de caracteres
scanf(“%d %d”, &num1, &num2); printf(“%d ”, num1); printf(“%d\n”, num2); //o ‘\n’ faz com que ele pule para a próxima linha printf(“Soma: %d”, num1+num2); printf(“\n”); printf(“Fim Programa”);
Simulação da execução: TELA
III.6 – Um Primeiro Programa Um aluno do curso de Construção de Programas deseja calcular a sua média final, conhecidas as suas três notas parciais. Escreva um programa computacional que executa esta operação. OBS.: As notas parciais podem ser fracionárias; a média final é a média aritmética das três notas parciais.
main(){
float nota1, nota2, nota3, media_final;
scanf(“%f %f %f”, ¬a1, ¬a2, ¬a3);
media_final = (nota1 + nota2 + nota3) / 3; //aqui é feito o cálculo da média
printf(“A Media Final eh: %d”, media_final);
}
Esse exemplo já permite identificar as partes de um programa. São elas: cabeçalho, dicionário de dados, corpo e comentários. III.6.1 – Dicionário de Dados No dicionário de dados se definem todas as variáveis e constantes utilizadas no programa. Também os nomes das variáveis devem ser auto-explicativos. No caso de não ficar explicito a função da variável com o nome, deve-se utilizar comentários explicativos. A forma de declaração de dados já foi definida anteriormente.
III.6.2 – Corpo
Entre com dois números inteiros:1 2 1 2 Soma: 3
Fim Programa
È onde se descrevem as operações que se devem efetuar sobre os dados (entradas, atribuições, cálculo de expressões e saídas) de forma a obter informações desejadas. No caso de algum trecho do programa não ter uma leitura imediata e fácil, mesmo por quem não o construiu, também dev-se utilizar comentários explicativos.
III.6.3 – Corpo Os comentários são a última parte do programa, mas não a menos importante. Como se explicou, os comentários se localizam em todas as partes do programa (cabeçalho, dicionário de dados e corpo). Sua função é explicar a função de cada operação cuja utilidade não esteja clara a uma leitura imediata. Também o programa como um todo merece um conjunto de comentários que descrevem sua utilidade, o que se faz com um grupo de comentários associados ao cabeçalho do programa. E qualquer parte do programa, pode se identificar os comentários por estarem escritos entre /* e */ ou à frente de //. Aquelas funcionam como delimitadores dos comentários. Em exemplos pequenos como o acima, a utilização de nomes mnemônicos nas variáveis é suficiente para garantir a legibilidade do programa. Em programas maiores, contudo, isto pode não ocorrer: neste caso a utilização de comentários é essencial. O critério para o uso ou não de comentários é subjetivo, mas pode ser bem traduzido pelo seguinte questionamento: ‘Será que um programador médio, não tão capaz e inteligente quanto eu mesmo, será capaz de ler e entender cada linha de código escrito com a sma facilidade? Será que eu serei capaz de entender a função de cada variável e cada linha de código daqui a um ano, as 21:00 horas de uma sexta-feira de carnaval, quando este programa der um defeito e eu for o responsável pela sua correção?’ Muitos programadores acostumados a restrições de linguagens antigas têm o mau costuma de definir nomes de variáveis muito pequenos e pouco explicativos (uma ou duas letras), também só incluem comentários quando são diretamente obrigados pela sua chefia,e isto após a escrita do seu programa, quando já esqueceram boa parte das funções do programa e suas variáveis. A experiência demonstra que o tempo gasto em escrever nomes maiores e mais explicativos é bem menor que aquele gasto tentando lembrar a função e o tipo de uma variável de nome XY2 na milésima primeira linha de código, ou procurando a definição desta variável na folha de número 257 em um bloco de listagem com 500 páginas. Na mesma linha de raciocínio, os comentários podem e devem ser definidos durante a construção do programa. Ao utilizar as técnicas de programação estruturada, o programador terá todos os comentários apropriados a cada parte do programa antes de iniciar seu detalhamento final.
Um grupo de comentários são aqueles relativos ao conjunto do programa. Antes de algumas informações sobre o autor e a data de construção do programa, existem 5 comentários fundamentais em qualquer programa: − Função: deve-se descrever o objetivo do programa com um texto conciso; − Entradas: descrevem-se todos os dados cuja leitura é necessária durante a execução do programa; − Saídas: descrevem-se todas as saídas de resultados obtidos ao longo do programa; − Condição de parada: muitas vezes os programas executam tarefas repetitivas. A não ser que haja uma condição de arada estipulada, o programa continuaria indefinidamente. Esta condição deve ser explicitada nos comentários do cabeçalho;
III.7.2 – Estrutura de Seleção Quando uma ação ou conjunto de ações dentro do programa depender de uma teste, que decide pela sua execução ou não, deve-se utilizar o comando (estrutura) de seleção.
Comando if / else Sua forma geral é: if ( expressão ) Comando e lse Comando
O comando1 só será executado se a expressão for verdadeira. Caso contrário será executado o comando. Jamais ambas expressões de comandos serão executadas, e também nunca teremos nenhuma expressão sem ser executada.
Exemplo: Calcular a média final de um aluno do curso de programação a partir de suas três notas parciais. Caso sua nota final seja inferior (superior) a 6.0, imprima uma aviso de que o aluno foi reprovado (aprovado). Algoritmo em português: − Leitura das notas − Cálculo das médias − Se média inferior a 6.0: aluno reprovado − Senão: aluno aprovado
Algoritmo traduzido para C.
main(){
int matricula; float n1, n2, n3, mediaFinal;
printf(“Entre com as notas parciais: ”);
scanf(“%d %f %f %f”, &matricula, &n1, &n2, &n3);
mediaFinal = (n1 + n2 + n3) / 3.0;
if(mediaFinal < 6.0){ printf(“O aluno %d foi reprovado.”); } else{ printf(“O aluno %d foi aprovado.”); }
Observe que os delimitadores ‘{‘ e ‘}’ foram omitidos nas cláusulas if / else, isto porque sempre que uma seqüência for composta por apenas um comando os delimitadores são opcionais, porém é sempre bom colocá-los. O ‘;’ nunca é colocado antes da cláusula else, visto que o ‘;’ representa o fim do comando if e o else nada mais é que a continuação do comando if / else. A cláusula else é opcional, podendo a estrutura reduzir-se a: if ( expressão ) Comando Neste caso, se a condição for falsa o comando seguinte ao comando if será executado. Exemplo: Ler dois números e ordená-los.
main(){
int num1, num2, aux;
printf(“Entre com os números: ”);
scanf(“%d %d”, &num1, &num2);
printf(“Valores desordenados: %d %d.\n”, num1, num2);
if(num1 > num2){ aux = num1; num1 = num2; num2 = aux; }
printf(“Valores ordenados: %d %d.\n”, num1, num2);
}
O programa lê dois números e faz a troca, ordenando-os, caso num1 seja maior que num2. Caso contrário à troca não é executada e o comando seguinte ao if é executado. OBS.: Para que uma variável participe de uma operação de comparação é necessário que inicialmente à ela seja atribuído algum valor, através de leitura ou atribuição.
Programa MaiorDeTres:
main(){ /* Funcao: le tres números e identificar o maior. Entrada: tres numeros inteiros. Saida: o maior dos tres numeros inteiros. */
int n1, n2, n3;