Baixe o app para aproveitar ainda mais
Prévia do material em texto
Fisiologia 1 Algoritmos Alessandra Alves Fonseca Vargas 1ª e di çã o DIREÇÃO SUPERIOR Chanceler Joaquim de Oliveira Reitora Marlene Salgado de Oliveira Presidente da Mantenedora Wellington Salgado de Oliveira Pró-Reitor de Planejamento e Finanças Wellington Salgado de Oliveira Pró-Reitor de Organização e Desenvolvimento Jefferson Salgado de Oliveira Pró-Reitor Administrativo Wallace Salgado de Oliveira Pró-Reitora Acadêmica Jaina dos Santos Mello Ferreira Pró-Reitor de Extensão Manuel de Souza Esteves DEPARTAMENTO DE ENSINO A DISTÂNCIA Gerência Nacional do EAD Bruno Mello Ferreira Gestor Acadêmico Diogo Pereira da Silva FICHA TÉCNICA Direção Editorial: Diogo Pereira da Silva e Patrícia Figueiredo Pereira Salgado Texto: Alessandra Alves Fonseca Vargas Revisão Ortográfica: Rafael Dias de Carvalho Moraes Projeto Gráfico e Editoração: Antonia Machado, Eduardo Bordoni, Fabrício Ramos e Victor Narciso Supervisão de Materiais Instrucionais: Antonia Machado Ilustração: Eduardo Bordoni e Fabrício Ramos Capa: Eduardo Bordoni e Fabrício Ramos COORDENAÇÃO GERAL: Departamento de Ensino a Distância Rua Marechal Deodoro 217, Centro, Niterói, RJ, CEP 24020-420 www.universo.edu.br Informamos que é de única e exclusiva responsabilidade do autor a originalidade desta obra, não se r esponsabilizando a ASOEC pelo conteúdo do texto formulado. © Departamento de Ensi no a Dist ância - Universidade Salgado de Oliveira Todos os direitos reservados. Nenhuma parte desta publicação pode ser reproduzida, arquivada ou transmitida de nenhuma forma ou por nenhum meio sem permissão expressa e por escrito da Associação Salgado de Oliveira de Educação e Cultura, mantenedor a da Univer sidade Salgado de Oliveira (UNIVERSO). Algoritmos Palavra da Reitora Acompanhando as necessidades de um mundo cada vez mais complexo, exigente e necessitado de aprendizagem contínua, a Universidade Salgado de Oliveira (UNIVERSO) apresenta a UNIVERSO EAD, que reúne os diferentes segmentos do ensino a distância na universidade. Nosso programa foi desenvolvido segundo as diretrizes do MEC e baseado em experiências do gênero bem-sucedidas mundialmente. São inúmeras as vantagens de se estudar a distância e somente por meio dessa modalidade de ensino são sanadas as dificuldades de tempo e espaço presentes nos dias de hoje. O aluno tem a possibilidade de administrar seu próprio tempo e gerenciar seu estudo de acordo com sua disponibilidade, tornando-se responsável pela própria aprendizagem. O ensino a distância complementa os estudos presenciais à medida que permite que alunos e professores, fisicamente distanciados, possam estar a todo momento ligados por ferramentas de interação presentes na Internet através de nossa plataforma. Além disso, nosso material didático foi desenvolvido por professores especializados nessa modalidade de ensino, em que a clareza e objetividade são fundamentais para a perfeita compreensão dos conteúdos. A UNIVERSO tem uma história de sucesso no que diz respeito à educação a distância. Nossa experiência nos remete ao final da década de 80, com o bem- sucedido projeto Novo Saber. Hoje, oferece uma estrutura em constante processo de atualização, ampliando as possibilidades de acesso a cursos de atualização, graduação ou pós-graduação. Reafirmando seu compromisso com a excelência no ensino e compartilhando as novas tendências em educação, a UNIVERSO convida seu alunado a conhecer o programa e usufruir das vantagens que o estudar a distância proporciona. Seja bem-vindo à UNIVERSO EAD! Professora Marlene Salgado de Oliveira Reitora. Algoritmos 4 Algoritmos 5 Sumário Apresentação da disciplina ...................................................................................................... 7 Plano da Disciplina ..................................................................................................................... 9 Unidade 1 - Lógica de Programação ................................................................................... 13 Unidade 2 - Introdução aos Algoritmos.............................................................................. 27 Unidade 3 - Estruturas de Implementação dos Algoritmos ........................................... 41 Unidade 4 - Variáveis e Tipos de Dados .............................................................................. 67 Unidade 5 - Estrutura de Decisão e Repetição .................................................................. 79 Unidade 6 - Estrutura de Dados Homogêneas................................................................101 Considerações finais ..............................................................................................................119 Conhecendo o autor ..............................................................................................................120 Anexos.......................................................................................................................................123 Algoritmos 6 Algoritmos 7 Apresentação da disciplina Caro aluno, Seja bem-vindo à disciplina Algoritmo. A programação de computadores é a base da profissão de quem trabalha com Tecnologia da Informação, ou seja, programar é criar, no computador, modelos (mundo virtual) da realidade (mundo real). Onde os modelos respeitam regras parecidas com o mundo real, permitindo que a informação seja processada gerando soluções. A finalidade de um computador é receber, manipular e armazenar dados. Se visto somente como um equipamento composto de circuitos eletrônicos, cabos e fontes de alimentação, certamente ele não tem utilidade alguma. O computador só consegue armazenar dados, imprimir relatórios, gerar gráficos, realizar cálculos, entre outras funções, por meio de programas. Sendo assim, quando queremos escrever (desenvolver) um software para realizar um determinado tipo de processamento de dados, devemos desenvolver um programa ou vários programas interligados. No entanto, para que o computador compreenda e execute esse programa, devemos escrevê-lo usando uma linguagem que tanto o computador quanto o desenvolver de software entendam. Essa linguagem é chamada de linguagem de programação. Sendo assim, vamos aprender sobre a lógica da programação e a aplicação dessa lógica na linguagem de programação C, ou seja, vamos buscar um raciocínio lógico, gerando uma lógica (resultado) em português estruturado (algoritmo) e aplicando em uma linguagem estruturada. A aplicação do algoritmo será na linguagem de programação C. Vale ressaltar que existem no mercado vários compiladores para o código da linguagem C. Sucesso! Algoritmos 8 Algoritmos 9 Plano da Disciplina Caro aluno, Esta disciplina tem por objetivo principal apresentar uma visão geral e introdutória de lógica de programação, essencial para alicerçar os conhecimentos nas atividades futuras, tanto acadêmicas como profissionais. A disciplina Algoritmo tem como objetivo de trabalhar a lógica da programação com os principais conceitos e do português estruturado e a programação C, visando a sua produtividade pessoal e profissional. Ao início de cada unidade de estudo, você encontrará uma apresentação dos temas que serão desenvolvidos, os aspectos mais relevantes, além dos objetivos a serem alcançados. Além disso, há também uma série de referências bibliográficas sobre os assuntos abordados. As unidades foram redigidas de forma a facilitar o entendimento do seu conteúdo, que compreende uma parte conceitual, sempre com aplicações dos conceitos, seguida de exercícios práticos. Estamos certos de que a leitura dos conteúdos será uma atividade prazerosa. Utilize o seu tempo e faça o seu próprio ritmo de aprendizagem. Lembre-se,você tem total autonomia na condução do seu processo de estudo, mas sempre que possível procure seguir o cronograma da disciplina. É importante que você faça todas as atividades e reflita sobre os respectivos padrões de respostas. Além disso, você poderá complementar o conteúdo de cada unidade através da leitura complementar e, por sua própria iniciativa, buscar nos jornais e revistas casos práticos que envolvam empresas, objeto da aplicação das teorias e modelos analisados nas aulas. O conteúdo foi dividido em sete unidades para maior compreensão dos assuntos abordados. Com a finalidade de facilitar a compreensão segue uma síntese de cada unidade, ressaltando seus objetivos específicos para que você possa ter uma visão ampla do conteúdo que irá estudar. Algoritmos 10 UNIDADE 1 - Lógica de Programação Nesta unidade, veremos o conceito de algoritmo, como trabalhar os tipos de informações e os conceitos de variáveis. E iniciaremos a linguagem de programação. Objetivos da unidade: Apresentar os conceitos teóricos fundamentais de computação; Mostrar as diferenças entre as diversas formas de criação e execução de programas. UNIDADE 2 - Introdução aos Algoritmos Nesta segunda unidade, apresentaremos uma visão geral de algoritmo computacional e não computacional, apresentando as regras para escrever um algoritmo. Descrevemos a passagem do algoritmo computacional para linguagem de programação. Objetivos da unidade: Apresentar as formas de representações de algoritmos computacionais e não computacionais; Proporcionar as regras para escrever um algoritmo; Verificar a linguagem de programação. UNIDADE 3 - Estruturas de Implementação dos Algoritmos Nesta terceira unidade, vamos estudar comando de entrada e saída de dados e os operadores utilizados para gerar um resultado matemático ou lógico. Objetivos da unidade: Definir quais serão as entradas possíveis para os procedimentos; Verificar os operadores utilizados na programação e algoritmo. Algoritmos 11 UNIDADE 4 - Variáveis e Tipos de Dados Nesta quarta unidade, vamos estudar os conceitos de variáveis, tipos de dados, atribuição de valores, manipulação de strings e caracteres. Objetivo da unidade: Mostrar e definir os comandos básicos presentes nas linguagens de programação C e em pseudolinguagem, bem como representações gráficas dos mesmos, permitindo a criação e manutenção de algoritmos. UNIDADE 5 - Estruturas de Decisão e Repetição Nesta quinta unidade, veremos o comando de estrutura de decisão, podendo assim com um teste lógico ter várias respostas, os comandos são IF e CASE. Vamos estudar também como podemos repetir a mesma tarefa várias vezes, usando uma variável para armazenar em memória várias informações. Comandos a serem vistos são FOR, WHILE e DO - WHILE. Objetivo da unidade: Realizar um programa ser capaz de tomar decisões e escolher uma entre várias possibilidades e permitir a construção de uma estrutura que comanda os processos de repetição, usando as seguintes estruturas, FOR, WHILE e DO – WHILE. UNIDADE 6 - Estruturas de Dados Homogêneas Nesta sexta unidade, vamos ver variáveis Compostas Homogêneas - Vetores e Matrizes. Um vetor (array em inglês) é um agregado de variáveis do mesmo tipo (homogêneas). MATRIZES – vetores com mais de 1 dimensão Os elementos de um vetor guardam uma relação de posicionamento entre si apenas em uma dimensão. Essas variáveis estão dispostas como que em uma linha, e cada elemento é identificado pela sua posição relativa na linha. Quando há mais de uma dimensão, damos o nome de matriz a esse arranjo de variáveis. Algoritmos 12 Objetivos da unidade: Estudar as estruturas de dados estáticas e homogêneas (vetores e matrizes); Estudar as operações que estas suportam e algumas aplicações básicas. Introduzir as estruturas de dados; Conceituar vetores; Conceituar matrizes. Bons estudos! Algoritmos 13 1 Lógica de Programação Algoritmos 14 Caro aluno, Nesta unidade, estudaremos os conceitos inicias para a programação, veremos como funciona a lógica de programação que deveremos ter para qualquer desenvolvimento de um software, aprenderemos como resolver problemas simples apenas por meio de lógica, as instruções necessárias para seguir um padrão lógico na programação. Objetivos da unidade: Entender o que é lógica de programação; Aprender com resolver problemas usando a sequência lógica; Entender com aplicar as instruções no software. Plano da unidade: O que é Lógica de Programação Sequência Lógica Instruções Bons estudos! Algoritmos 15 O que é Lógica de Programação Introdução Muitas definições podem ser dadas à palavra algoritmo. Atualmente, tem-se associado algoritmo à computação, mas este não é um termo restrito à computação ou que tenha nascido com ela. O termo algoritmo também é utilizado em outras áreas, como engenharia, administração entre outras. Vejamos algumas definições de algoritmo: Um procedimento passo a passo para a solução de um problema. Uma sequência detalhada de ações a serem executadas para realizar alguma tarefa. Um exemplo clássico de algoritmo é a receita culinária. A receita tem todas as características de um algoritmo. Ela tem uma sequência detalhada de passos, descrita no modo de preparo, apresenta a tarefa a ser realizada e, além disso, podemos identificar na receita entradas (no caso os ingredientes) e uma saída, que pode ser, por exemplo, um bolo. Programas de Computador - O que é um programa Os computadores das mais variadas arquiteturas têm funcionamento similar. A Figura 1 apresenta a arquitetura simplificada de um computador. Algoritmos 16 Figura: 1 – Arquitetura simplificada de um computador A parte física do computador é chamada de hardware, que é formado basicamente por uma Unidade Central de Processamento (CPU), pela memória e pelos dispositivos de entrada e saída. O barramento faz a ligação desses componentes. A CPU (ou processador) contém um conjunto relativamente pequeno de instruções que é capaz de executar. Cada processador contém um conjunto diferente de instruções, apesar de similares entre si. As instruções que o processador executa são buscadas da memória. Essas instruções podem ser desde operações matemáticas a interações com os dispositivos de entrada e saída. Chamamos de programa de computador um conjunto de instruções que será executado pelo processador em uma determinada sequência. Esse programa leva o computador a executar alguma tarefa. Como podemos perceber, um programa nada mais é que um tipo de algoritmo. Sua particularidade é que suas operações são específicas para o computador e restritas ao conjunto de instruções que o processador pode executar. Podemos considerar esse conjunto de instruções como a primeira linguagem de programação do computador, também chamada de linguagem de máquina. Classificamos as linguagens de programação segundo a sua proximidade com a linguagem de máquina - quanto maior a semelhança com a linguagem de máquina, mais baixo é o nível da linguagem. Algoritmos 17 As linguagens de programação mais semelhantes à linguagem de máquina são conhecidas como linguagens de baixo nível. Analogamente, linguagens de programação “distantes” da linguagem de máquina São conhecidas como linguagens de programação de alto nível. Linguagens de programação de alto nível são mais próximas da linguagem natural e guardam pouca similaridade com a linguagem da máquina em que serão executadas. A linguagem de programação que um computador é capaz de compreender é composta apenas de números. Assim, fazer algoritmos na linguagem de programação do computador ou em sua linguagem de máquina é um processo extremamente complicado paranós, seres humanos, acostumados com a nossa própria linguagem. Por isso, para facilitar a programação de computadores, foi necessária a criação de um código que relacionasse a linguagem de máquina a uma linguagem mais fácil de ser compreendida. A linguagem de montagem (ou assembly) é um código que tem uma instrução alfanumérica (ou mnemônica) para cada instrução numérica em linguagem de máquina. Para que um programa escrito em linguagem de montagem possa ser executado pelo computador, é necessário que seu código seja traduzido para o código de máquina. Isto é feito por meio de um programa chamado assembler. A Figura 2 apresenta o esquema de tradução feita por um assembler. Figura 2 - Tradução para a linguagem de máquina. A linguagem de montagem é muito próxima da linguagem de máquina e, por isso, é uma linguagem de programação de baixo nível. Para cada processador, há uma linguagem de montagem já que há uma relação direta entre as instruções em linguagem de montagem e em linguagem de máquina. Isto faz com que o código tenha que ser refeito se quisermos executar um programa em um processador não compatível com o qual ele foi escrito inicialmente. Neste caso, dizemos que o código não é portável. Algoritmos 18 A implementação de programas nesse tipo de linguagem ainda é muito complexa e dependente do conhecimento das instruções do processador. Para aumentar a produtividade dos programadores e a portabilidade dos programas, foram criadas as linguagens de programação de alto nível. Essas linguagens são independentes do processador em que serão executadas. Suas características principais são que seu código é mais elaborado, contemplando operações mais complexas e mais próximas da “lógica humana”. Para que possam ser processadas por um computador, os comandos da linguagem precisarão ser traduzidos para a linguagem de máquina. Essa tradução é feita por meio de um compilador ou de um interpretador, dependendo do caso, como veremos a seguir. O compilador, a partir do código em linguagem de alto nível, chamado de código-fonte, gera um arquivo com o código em linguagem de máquina, conhecido como código objeto. Esse código-objeto fica em disco e só é carregado em memória no momento da execução. O interpretador faz o mesmo trabalho, porém não gera o arquivo em código-objeto. As instruções são traduzidas para linguagem de máquina em tempo de execução, instrução a instrução. A Figura 3 mostra os passos para a execução de um código em linguagem de alto nível por meio da compilação. A Figura 4 apresenta o esquema similar para a interpretação. Figura 3 – Compilação de um programa Podemos notar que programar um computador tornou-se muito mais fácil do que anteriormente. A introdução de linguagens de alto nível como Pascal, C, Cobol, Java, entre outras, aumentou a produtividade dos programadores, permitindo que programas mais elaborados fossem feitos, atendendo a demandas mais complexas. Além disso, os códigos são portáveis, ou seja, independentes da plataforma mediante nova compilação do código-fonte. Lógica de programação é o fundamento básico que precisamos para começar nossos estudos em programação. O conceito é muito simples: é a técnica na qual Algoritmos 19 aprendemos a escrever um programa, baseada em regras matemáticas; o programador define sequências lógicas para prosseguir com o desenvolvimento. Essa lógica de programação leva o programador a organizar suas ideias antes de iniciar a codificação de um sistema. Essa fase do desenvolvimento é muito importante e, se o desenvolvedor não tiver os conceitos de lógica, certamente esse software irá apresentar vários problemas de execução. Valorize o estudo da lógica de programação, pois ela é muito importante para o avanço na disciplina. Sequência Lógica Sequências lógicas são o segundo passo que o programador segue antes de começar a codificação. Após pensar em como resolver determinado problema, o programador define sequências lógicas para a programação desse sistema. Esses passos são executados um após o outro, com o objetivo final de atingir o resultado esperado pelo desenvolvedor e as sequências são acompanhadas pelas instruções que iremos explicar abaixo. Instruções Se formos pensar em instrução com seu significado normal seria um conjunto de regras ou normas estabelecidas para realizar ou empregar algo. Porém, em informática, dizemos que instrução é a própria informação que vai indicar para o computador uma ação que ele deve executar. Pensamos em instrução como códigos que iremos escrever para o computador entender e realizar a ação que o desenvolvedor pensou para o programa; a cada instrução, temos uma nova ação sendo feita. Softwares são um conjunto de instruções predefinidas que juntas formam um sistema. Algoritmos 20 Estamos encerrando a unidade. Sempre que tiver uma dúvida entre em contato com seu tutor virtual através do ambiente virtual de aprendizagem e consulte sempre a biblioteca do seu polo. Leitura Complementar ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi de. Fundamentos da Programação de Computadores. São Paulo: Prentice Hall, 2004. CORMEN, THOMAS H.; RIVEST, RONALD L.; STEIN, CLIFFORD; LEISERSON, CHARLES E. Algoritmos – Teoria e Prática – 3ª ed. Rio de Janeiro: Elsevier – Campus, 2012 FORBELLONE, A. L.; EBERSPACHER, H. Lógica de Programação: a construção de algoritmos e estrutura de dados. São Paulo: Makron Books, 2000. GUIMARÃES, A. L.; LAGES, N. A. C. Algoritmos e Estruturas de Dados. Rio de Janeiro: LTC, 1994. LEITE, Mario. Técnicas de programação. São Paulo: Brasport, 2006. OLIVEIRA, Jayr Figueiredo de; MANZANO, Jose Augusto N. G. Algoritmos e lógica para desenvolvimento de programação. 22ª ed. São Paulo: Érica, 2009. É hora de se avaliar Lembre-se de realizar as atividades desta unidade de estudo. Elas irão ajudá-lo a fixar o conteúdo, além de proporcionar sua autonomia no processo de ensino-aprendizagem. Algoritmos 21 Exercícios – Unidade 1 1. Assinale a técnica referente ao Algoritmo computacional: a) Fluxograma b) Diagrama de Chapin c) Mapa de Karnaugh d) Português estruturado e) Programação estruturada 2. De acordo com os fundamentos da aritmética computacional e com o pseudocódigo acima, a) A conversão de números decimais negativos para binários também é realizada de forma correta pelo algoritmo. b) O número de dígitos em hexadecimal necessários para representar o binário resultante corresponde ao número de vezes que o comando enquanto é executado. c) Mod indica o quociente e div indica o resto da divisão de número por 2. d) Ao ser transcrito para uma linguagem de programação sem alteração na lógica do algoritmo, poderão ocorrer erros na conversão de números decimais para binários. e) Para fazer a conversão do binário resultante para seu correspondente negativo basta utilizar o comando binário ← binário * -1. Algoritmos 22 3. Considere o algoritmo a seguir: Algoritmo “provacosanpa” Var A,v,tr,i: inteiro; Inicio a:= 1; b: = 2; para i de 1 ate 10 passo 1 faca a: = a+1; b: = b-1; tr:= a; a: = b; b: = tr fimpara Fimalgoritmo Os valores das variáveis a e b são: a) 2 e 1. b) 1 e 1. c) 1 e 2. d) 2 e 2. e) 3 e 3. 4. Assinale a alternativa que apresenta corretamente a sequência de passos computacionais que transforma a entrada na saída, ou seja, procedimentos necessários para resolver um determinado problema. a) Algoritmos b) Arquivos c) Cases d) Polinômio e) Sequência Algoritmos 23 5. Analise o algoritmo genérico abaixo, em Portugol, e determine o valor final da variável C: algoritmo declare A, B, C numérico A ← 1 B ← A + 2 C ← B * 3 C ← A + B - C / B + A fim algoritmo a) 1,25 b) 3 c) 2 d) 0,6 e) 4 6. Na resolução de problemas relacionadoscom a construção de algoritmos, são usadas diversas estratégias. Uma delas consiste em dividir o problema em problemas menores até que cada parte seja pequena o bastante para que a solução seja encontrada. Tal estratégia denomina-se: a) Acomutação b) Decomposição c) Diversificação d) Qualificação e) Variação Algoritmos 24 7. Considere: zero é um número natural. O sucessor de um número natural é um número natural. Assim, em termos de algoritmo, o enunciado trata da possibilidade de aplicação de uma técnica denominada: a) Matriciação. b) Integração. c) Agregação. d) Interação. e) Recursão. 8. É a descrição de um padrão de comportamento, expressado em termos de um repertório bem definido e finito de ações " primitivas" , das quais damos por certo que elas podem ser executadas. A descrição refere-se a: a) Sequenciamento. b) Algoritmo. c) Compilador. d) Modularização. e) Repetição 9. Relacionado à programação de computadores, um algoritmo, seja qual for a sua complexidade e a linguagem de programação na qual será codificado, pode ser descrito por meio da: a) Reografia. b) Criptografia. c) Linguagem de marcação. d) Engenharia estruturada. e) Pseudolinguagem. Algoritmos 25 10. Objeto que se constitui parcialmente ou é definido em termos de si próprio. Nesse contexto, um tipo especial de procedimento (algoritmo) será utilizado, algumas vezes, para a solução de alguns problemas. Esse procedimento é denominado: a) Repetição. b) Interligação. c) Condicionalidade. d) Recursividade. e) Rotatividade. a). Elabore um algoritmo não computacional IR PARA ESCOLA. b). Desenvolva um algoritmo que receba 3 números inteiros, calcule e mostre a soma dos mesmos. Algoritmos 26 Algoritmos 27 2 Introdução aos Algoritmos Algoritmos 28 Caro aluno, Nesta unidade, estudaremos os conceitos inicias para a criação de um algoritmo que é o passo fundamental para criação de qualquer sistema, abordaremos nesta unidade a sua estrutura, como devemos escrever um algoritmo as suas fases de criação, desse modo iremos mostrar a importância que tem o algoritmo na vida do desenvolvedor. Objetivos da unidade: Entender o que é algoritmo. Como criar um algoritmo. Como o algoritmo é importante para a programação. Plano da unidade: Definição Características Formas de Representação Fases de um algoritmo Regras para se escrever um algoritmo Bons estudos Algoritmos 29 Definição Algoritmo é uma “receita” que escrevemos para executar tarefas ou resolver algum problema específico com mais qualidade e rapidez. Na programação, utilizamos bastante os algoritmos, pois eles facilitam a nossa vida na hora que estamos desenvolvendo um software, como uma receita na qual seguimos passos predefinidos pelo desenvolvedor para agilizar o trabalho e no fim chegar ao resultado esperado e com eficácia. Os próximos conceitos que iremos tratar merecem sua atenção ao máximo, pois os algoritmos serão usados pelo resto da sua vida como programador. O uso de algoritmos é quase tão antigo quanto a matemática. Com o passar do tempo, entretanto, ele foi bastante esquecido pela matemática. Com o advento das máquinas de calcular e mais tarde os computadores, o uso de algoritmos ressurgiu com grande vigor, como uma forma de indicar o caminho para a solução dos mais variados problemas. Algoritmo não é a solução do problema, pois, se assim fosse, cada problema teria um único algoritmo. Algoritmo é o caminho para a solução de um problema, e em geral, os caminhos que levam a uma solução são muitos. Ao longo dos anos surgiram muitas formas de representar os algoritmos, alguns utilizando linguagens semelhantes às linguagens de programação. O aprendizado de algoritmos não se consegue a não ser através de muitos exercícios. Características Suas principais características são: O Algoritmo precisa ter um final: essa afirmação vem pelo fato de que, quando criamos um algoritmo, o objetivo é gerar um resultado final. Quando atingimos esse resultado, aquele algoritmo cumpriu seu trabalho com êxito. Algoritmos 30 Não pode oferecer margem para mais de uma interpretação: sim, um algoritmo só pode ter uma interpretação pelo simples fato de que, se a pessoas entenderem de várias formas um algoritmo, ele acabará apresentando um resultado diferente do desejado, gerando uma perda de tempo desnecessária. Tem que produzir uma saída para o mundo externo: a finalidade máxima do algoritmo é oferecer um resultado para o mundo externo. Se construímos um algoritmo e ele não oferece uma saída para o mundo, ele será um algoritmo sem uso. Não faz sentindo criarmos uma “receita” e não gerar um resultado. Tem que ser efetivo na sua execução, economizando tempo em todas as etapas: sim, precisamos tornar nosso algoritmo uma estrutura que gere resultados rapidamente. Desse modo iremos atingir o que o cliente deseja e com agilidade no tempo. Quando nosso algoritmo está mal definindo perdemos tempo e, consequentemente, geramos um mal estar com o cliente. Formas de Representação Temos várias formas de representação de algoritmo, não existe uma decisão de qual é melhor, tudo vai variar de acordo com o que você deseja realizar. Existem algumas formas de representação que irão tratar os problemas em um nível lógico, retirando os detalhes da implementação que normalmente são relacionados à linguagem de programação. Também existem outras formas que possuem uma riqueza de detalhes que acabam tirando as ideias principais do algoritmo, atrapalhando o entendimento. Importante! O algoritmo pode ser implementado em qualquer linguagem de programação, desse modo sempre iremos criar um algoritmo antes de iniciar a programação em si. Com o algoritmo somado a qualquer linguagem de programação, iremos ter como resultado final um programa. Algoritmos 31 Abaixo, iremos mostrar as representações mais conhecidas e utilizadas: Descrição Narrativa: Utilizamos essa descrição para descrever um processo de forma simples para que, mesmo uma pessoa que não entenda sobre esse assunto, possa entender esse algoritmo. Nesse tipo de descrição temos uma margem de erro grande e falta o entendimento de que, às vezes, o algoritmo se torna muito complexo, atrapalhando as pessoas que irão utilizar. Essa descrição também tem muita informação para, no fim, realizar poucas coisas. Fluxograma Convencional: É a representação que usa as formas geométricas. Ela facilita o entendimento das ideias que temos no algoritmo e é muito mais eficiente que a descrição narrativa, pelo fato de ser muito mais precisa. Entretanto ainda não se preocupa como será feita a implementação. Eles também vão indicar ao programador a entrada, o processamento e a saída dos dados, que deverá selecionar o problema que a ele foi apresentado. Abaixo um exemplo. Exemplificando Receita de bolo: Misture os ingredientes Unte a forma com manteiga Despeje a mistura na forma Se houver coco ralado então despeje sobre a mistura Leve a forma ao forno Enquanto não corar deixe a forma no forno Retire do forno Deixe esfriar Algoritmos 32 Exemplo: Fluxograma para escolha do maior número de dois números distintos. Pseudocódigo: Essa é a forma que mais usamos na informática, pois ela é rica em detalhes e define os tipos das variáveis que deverão ser usadas no programa. Os passos e detalhes seguidos tem que ter uma sequência lógica para o funcionamento adequado do programa. Esse algoritmo terá que ser convertido para uma linguagem de programação para seu funcionamento adequado. Essa forma traz muita facilidade ao programador, ajudando na implementação, por se parecer muito com as linguagensde programação. Abaixo, um exemplo. Algoritmos 33 Exemplo: Fases de um Algoritmo Quando vamos escrever um algoritmo, temos a sua divisão em três fases fundamentais que são a entrada de dados, o processamento de dados e a saída de dados. A entrada de dados é a parte onde iremos escrever o algoritmo para receber dados digitados pelo usuário; existem vários tipos de entrada de dados: o tipo inteiro, o tipo real, e o tipo caractere. A partir da entrada de dados vamos para o processamento de dados que tem como objetivo realizar procedimentos que o usuário deseja dentro de um programa. Essa é a segunda parte do nosso programa e, sem dúvidas, uma das partes mais importantes, já que qualquer erro nessa fase poderá gerar um resultado final indesejado pelo cliente. A saída de dados é a parte final de qualquer algoritmo; ela é o resultado alcançando após a entrada de dados de um cliente e o seu processamento. Todas as fases do algoritmo têm a sua importância e uma falha na criação de qualquer uma dessas fases faz o algoritmo apresentar problemas futuros, atrapalhando a operação do cliente. Algoritmos 34 Exemplo: Digite duas notas e mostre sua média: Início //começo do algoritmo real n1,n2, med; //declaração de variável leia (n1,n2); //entrada de dados med (n1+n2)/2; //processamento de dados escreva(med); /saída de dados Fim //fim do algortimo Regras para se escrever um algoritmo Para que possamos escrever um algoritmo de forma correta e adequada, devemos seguir algumas regras básicas, pois só dessa forma nosso algoritmo ficara legível e de fácil entendimento. Vamos a essas regras: Usar apenas um verbo por frase. Pense sempre que você está escrevendo um algoritmo para pessoas que não entendem de programação. Use frases bem curtas e simples. Seja curto e objetivo. Procure empregar frases que não tenham sentidos parecidos. Importante! Lembre-se sempre dessas regras, pois, utilizando delas, teremos nosso algoritmo escrito com perfeição e de fácil entendimento. Algoritmos 35 Ficamos por aqui. Estamos encerrando a unidade. Sempre que tiver uma dúvida entre em contato com seu tutor virtual através do ambiente virtual de aprendizagem e consulte sempre a biblioteca do seu polo. Leitura complementar: ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi de. Fundamentos da Programação de Computadores. São Paulo: Prentice Hall, 2004. CORMEN, THOMAS H.; RIVEST, RONALD L.; STEIN, CLIFFORD; LEISERSON, CHARLES E. Algoritmos – Teoria e Prática – 3ª ed. Rio de Janeiro: Elsevier – Campus, 2012 FORBELLONE, A. L.; EBERSPACHER, H. Lógica de Programação: a construção de algoritmos e estrutura de dados. São Paulo: Makron Books, 2000. GUIMARÃES, A. L.; LAGES, N. A. C. Algoritmos e Estruturas de Dados. Rio de Janeiro: LTC, 1994. LEITE, Mario. Técnicas de programação. São Paulo: Brasport, 2006. OLIVEIRA, Jayr Figueiredo de; MANZANO, Jose Augusto N. G. Algoritmos e lógica para desenvolvimento de programação. 22ª ed. São Paulo: Érica, 2009. É hora de se avaliar! Lembre-se de realizar as atividades desta unidade de estudo. Elas irão ajudá-lo a fixar o conteúdo, além de proporcionar sua autonomia no processo de ensino-aprendizagem. Algoritmos 36 Exercícios – Unidade 2 1. Considere que, durante a execução do algoritmo a seguir, os valores 2 e 3 serão lidos pelo comando da linha 1 e o valor 10 será lido pelo comando da linha 3. 1 2 3 4 5 6 leia A, B; C = 2 * A; leia A; C = C + B; imprima A, B, C; pare; Considerando o exposto acima, marque com um X a alternativa com afirmativa INCORRETA: a) Após a leitura da linha 1, a variável A possui o valor 2 e a variável B o valor 3. b) Na linha 2, o valor de C passa a ser 20. c) A variável A tem seu valor alterado ao longo do programa. d) Após a leitura da linha 3, o valor de A passa a ser 10, substituindo o valor anterior de A. e) A linha 4 modifica o valor de C para 7 Algoritmos 37 2. No contexto de subprogramação, é correto afirmar sobre a recursividade e a passagem de parâmetros: a) Na subprogramação, para se criar um procedimento é necessário um identificador, uma lista de parâmetros e as ações que nele serão executadas. b) Um procedimento pode ser ativado em qualquer parte do programa e sua ativação se dá por meio do uso de sua lista de parâmetros. c) Dentro de um procedimento ou de uma função, quando ocorre a passagem de parâmetro por valor, as alterações que a função ou procedimento efetuar afetarão diretamente a variável original. d) Para processar todos os “nós” de uma árvore, um procedimento chama a si mesmo recursivamente para todos os “nós” filhos, exceto o caso base, que é o nó usualmente chamado “folha”. e) Uma característica típica da recursão é que um conjunto, desde que finito, de sentenças ou outros dados pode ser definido, analisado ou produzido por um programa de computador. 3. Marque a extensão correta da Linguagem de programação C. a) doc b) c c) bas d) c++ e) xls Algoritmos 38 4. Analise o fluxograma do cálculo de média, e marque a resposta correta para completar o fluxograma, seguindo a ordem correta. a) "reprovado","aprovado", "fim", b) "fim", "aprovado","reprovado" c) "fim", "reprovado", "aprovado" d) "aprovado","fim","reprovado" e) "aprovado","reprovado","fim" Algoritmos 39 5. marque a resposta correta que indique o tipo de informação com os valores 150, -50, -150,50. a) Caracter b) Real c) Inteiro d) Lógico e) Caracter duplo 6. De acordo com a definição a seguir, marque a resposta correta ." é o meio pelo qual as informações (geralmente os resultados da execução de um programa) são transferidos pelo computador ao usuário ou aos níveis secundários de memória. Os exemplos mais comuns são o monitor de vídeo, impressora, tas e discos magnéticos" a) Dispositivo de entrada b) Dispositivo de saída c) Dispositivo saída e entrada d) Semântica e) Sintaxe 7. Defina Algoritmo. ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ Algoritmos 40 8. O que é necessário para se ter um algoritmo? ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ 9. Qual o método para Construir um Algoritmo ? ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ______________________________________________________________________________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ Algoritmos 41 3 Estruturas de Implementação dos Algoritmos Algoritmos 42 Caro aluno, Nesta unidade, estudaremos como poderemos aperfeiçoar a criação de um algoritmo sem erros e com qualidade na hora de executar o programa, também veremos os operadores de entrada e saída que tem objetivo de inserir dados no sistema processar e apresentar um resultado, por fim veremos os operadores que tem função de realizar cálculos matemáticos no nosso algoritmo apresentando um resultado com rapidez e precisão. Através dessa unidade iremos aprender a melhor forma de estruturação de um algoritmo, desse modo iremos agilizar qualquer problema que tenhamos de resolver melhorando assim o desempenho do usuário que poderá fazer suas tarefas com mais fluidezes e qualidade. Objetivos da unidade: Como implementar um algoritmo de forma rápida e com qualidade. Aprender a utilizar as operações de entrada e saída de dados de um algoritmo. Usar os operadores matemáticos para realização de processamento de dados. Plano da unidade: Características de implementação dos algoritmos Operações de Entrada e Saída Operadores Matemáticos Bons estudos Algoritmos 43 Características de Implementação dos Algoritmos Refinamentos Sucessivos Quando temos um programa muito complexo, dentro dele, certamente, teremos muitos problemas que não devemos tratar diretamente. Isso toma muito mais tempo e, na maioria dos casos, acabamos deixando nosso código poluído e com muitos erros de execução. Desse modo, tratamos os problemas complexos utilizando o método conhecido como Refinamento Sucessivo que tem como objetivo pegar um problema grande e dividi-lo em subproblemas menores. Com essa subdivisão dos problemas maiores temos muitas vantagens para o desenvolvimento do algoritmo: 1) cada parte do código fica muita mais simples; 2) conseguimos entender com muito mais facilidade o programa, pelo fato dele estar dividido em subprogramas; 3) esses subprogramas tem pouca codificação, tornando muito mais fácil a sua manutenção futura; 4) conseguimos simplificar toda a documentação do programa; 5) conseguimos dividir o desenvolvimento do software com a equipe através dos arquivos de cabeçalhos (.h). Exemplo: Dadas n sequências de números inteiros, cada qual terminada por 0, calcular a média dos números pares de cada sequência. Algoritmos 44 1. Sem Refinamento Sucessivo: Algoritmos 45 2. Com Refinamento Sucessivo. Podemos observar que no segundo exemplo, temos o conceito de Refinamento Sucessivo e o entendimento do código fica bem mais simplificado. Nesse exemplo o código é simples, mas imagine um programa com duas mil linhas de código. Certamente se você não utilizar o conceito de Refinamento Sucessivo irá ter muitos problemas para encontrar as funções do software e futuros erros que possam aparecer ou, até mesmo, se o cliente solicitar uma nova função no programa, haverá uma enorme dificuldade para realizar essa atualização pelo fato do código estar muito complexo e de difícil entendimento. Por isso o uso do Refinamento Sucessivo é essencial para a estruturação do algoritmo, facilitando em muita a vida do programador no entendimento do código. Algoritmos 46 Linearização de Expressões Para que possamos realizar cálculos matemáticos em programação precisamos realizar uma conversão da forma tradicional para a forma computacional. Realizamos esse processo através da Linearização de Expressões, que tem como objetivo transformar as operações matemáticas tradicionais em forma computacional em linha. Se não realizarmos esse processo não conseguiremos realizar cálculos matemáticos no software. O computador interpreta os cálculos iguais à matemática normal, porém tem que estar seguindo as regras de Linearização: Alterar as chaves “{ }” e os colchetes “[]” pelo operador parênteses “()”, dessa forma o programa ira entender que você deseja realizar uma operação especifica dentro dos parênteses antes de realizar a expressão toda. Alterar as barras de fração “__” pelo operador matemático “/ ” que significa divisão. Exemplo: Acima temos um exemplo da conversão que precisamos realizar de uma expressão matemática convencional para a forma computacional. Lembrando que sempre iremos precisar realizar essa conversão se não o compilador não reconhecerá a expressão. Algoritmos 47 Lembrando que o programa segue a mesma lógica de uma operação matemática convencional que você aprendeu na escola, a ordem das operações é: 1) potenciação e radiciação; 2)multiplicação e divisão; 3)adição e subtração; se você quiser realizar um calculo antes precisará pôr o operador parênteses “()” para que seja realizada a operação dentro dos parênteses antes, e depois será realizado o restante da expressão matemática, caso contrário ele irá seguir a ordem das operações normais da matemática. Exemplo: Faça um programa que receba 3 notas de um aluno e mostre a média ponderada desse aluno: Forma Correta: Nesse exemplo, observamos que temos a entrada de três notas de um aluno e no final será apresentado à média dele, o programa realizará primeiro a expressão que está dentro dos parênteses e depois realizará a divisão. Algoritmos 48 Forma Incorreta: Já nesse exemplo, temos as mesmas três entradas de dados, porém, na hora do processamento, o compilador primeiro a divisão entre n3 / 3 e depois irá realizar a soma entre n1 + n2 + o resultado da divisão, dessa forma o resultado não e será o desejado, o compilador não apresentar erros nesse código porem esse código está incorreto e um erro de logica não de código. Agora tentem reescrever os dois códigos na ambiente de desenvolvimento e realize os testes para verificar que a primeira forma está realizando a expressão de forma correta e a segunda mesmo sem apresentar erro de compilação está com um erro de logica. Modularização Um conceito que iremos utilizar bastante em algoritmos de alto nível será o da Modularização que consiste em atribuir funções específicas para cada operação realizada no programa, mais conhecidas como Sub-Rotinas. Essas Sub- Algoritmos 49 Rotinas são criadas separadas da função main e acionadas por ela quando necessário. Em todo programa existe a função main, ela é o gatilho principal para o programa, sendo responsável por chamar as Sub-Rotinas para serem executadas. Quando essas são executadas, retornam à main para ser realizada outra operação dentro do programa. Podemos pensar que escrevendo mais de uma função o nosso código ficará maior, porém ele ajuda na organização do código, deixando muito mais claro para o desenvolvedor quando for necessário realizar alguma alteração ou consertar algum bug. Lembra que acima explicamos o conceito de Refinamento Sucessivo? A Modularização está diretamente ligada a esse conceito, porque ela é responsável pela divisão do problema em Sub-Rotinas. Observe que cada elemento estudado nessa unidade é um passo importante para criação de algoritmo. Vejamos um exemplo de modularização de um sistema: Algoritmos 50 Acima temos um exemplo de Modularização. Esse exemplo é bem simples, porém em softwares de grande nível usaremos esse conceito com muito mais eficácia. Podemos observar que, separando a função, teremos uma facilidade para execução da main, pois ela ficará muito mais rápida e evitamos deixar o código muito poluído, o que atrapalha na hora de procurar erros ou fazer atualização. Se aprofunde nesses conceitos de Modularização e tente fazer todos os programas utilizando-os para melhoraro estruturamento do código e facilitar seu entendimento. Reescreva o código acima e observe o funcionamento da Modularização e sua facilidade em separar o código por Sub-Rotinas. Operadores de Entrada e Saída Em toda linguagem de programação temos os operadores de entrada (Input) e saída (output) de dados. Eles são necessários para realizar a inserção de dados e o resultado da função. Entrada de Dados Vamos explicar primeiro o Operador de Entrada (Input) que tem com função principal realizar a leitura dos dados digitados pelo usuário para executar alguma função específica criada no programa. O comando mais utilizado para receber a entrada de dados se chama scanf e normalmente vem acompanhado pelo printf que é um comando utilizado para exibir mensagens, e os valores da saída de dados que iremos explicar abaixo. Vamos a sintaxe do scanf (“tipo da variável”, & nome da variável), essa é a estrutura básica da função scanf. Vamos explicar um pouco esse comando: ele serve para receber os dados digitados via teclado, armazenando esses valores na variável, conceito que iremos explicar na próxima unidade, esse dado ficará guardado em memória, em arquivos ou em base de dados, porém nesse início vamos trabalhar com os dados em memória. Vamos a um exemplo do scanf. Algoritmos 51 Podemos observar no exemplo acima como é simples a entrada de dados pelo método scanf, o “%d” está reafirmando a declaração que foi feita da variável como tipo inteiro. Após essa declaração temos a vírgula que serve para separar a declaração do endereçamento da memória. O operador “&” é responsável por reservar um espaço de memória para variável n1, só assim o valor digitado ficará salvo na memória principal do computador. Esse valor será solicitado para realização de alguma operação dentro do programa, lembrando que quando o programa for encerrado todos os valores que foram armazenados serão perdidos. Esse é o principal comando de entrada de dados em C, mas existem outros comandos que você pode pesquisar para aprofundar seu conhecimento. Saída de Dados Na saída de dados temos como principal função o printf (“Mensagem Digita pelo desenvolvedor %d: reafirmando a declaração da variável”, nome da variável). O printf é usado para saída de dados pelo fato de ser um comando responsável por exibir mensagens e valores na tela. Explicando um pouco a sintaxe, na primeira parte, onde começam as aspas, temos uma mensagem de saída que o desenvolvedor criou; seguindo isso temos o tipo da variável, novamente afirmando que esse tipo de variável é inteira; fechando essas aspas, colocamos uma vírgula separando a parte que será impressa na tela e a variável. No lugar daquele "%d" irá aparecer o valor que a variável está recebendo no momento. Vejamos um exemplo: Esse é o comando com sua sintaxe pronta; temos a parte da mensagem que será impressa na tela, o "%d" irá receber o valor salvo na memória da variável n1, e será impresso na tela. Algoritmos 52 Exemplo do código funcionando: O entendimento da entrada e saída de dados é fundamental para o avanço na disciplina. Operadores Matemáticos Abordaremos agora os operadores, os quais servem para realizar qualquer tipo de cálculo matemático, manipulações de caracteres dentro do software existem quatro tipos de operadores o aritmético, lógico, relacional e especial, iremos explicar cada um abaixo. Operadores Aritméticos Sãos os operadores responsáveis por realizar cálculos matemáticos, abaixo temos uma tabela com cada um deles: Esses operadores seguem a forma normal de cálculos matemáticos, uma atenção especial quando desejar obter o resto da divisão usaremos o operado “%” dessa forma obteremos o resultado do resto não da divisão. O incremento e o decremento tem o mesma a explicação a única diferença é que o incremento adiciona uma unidade a variável e o decremento adiciona meu uma unidade a variável. Exemplo: Algoritmos 53 Operadores Lógicos Sãos os operadores que iremos usar para testar uma condição dentro do programa, esses operadores normalmente são encontrados dentro If, comando responsável por realizar condições estabelecidas pelo usuário. Operadores Aritméticos Operador: Nome: Utilização Explicação: && E if((10<20) &&(20>10)) O operador “E” exige que todas as operações sejam verdadeiras. Parao IF ser verdadeiro II OU If ((10<20) l l (20>10)) O operador “OU exige que apenas uma das operações sejam verdadeiras. Para o IF ser verdadeiro. ! Diferente 20! =10 O Operador “E” verifica se o primeiro número é diferente do segundo. Muita atenção na hora de construir as condições utilizando os operadores lógicos fique atento na hora de usar os “()” parênteses eles são fundamentais para a condição ser executada como desejada. Exemplo: Queremos testar um número “num” é positivo e par: if (num >= 0) if (num % 2 == 0) printf("Número par não negativo.\n"); Algoritmos 54 Com os operadores lógicos isso pode ser simplificado: if ((num>=0) && (num%2 == 0)) printf("Número par nao negativo.\n"); Podemos utilizar o operador de negação lógica: if (num>0 && !(num%2)) printf("Número par nao negativo.\n"); Operadores Relacionais São os operadores responsáveis pela comparação de variáveis dentro de uma estrutura condicional conhecida como “IF”. Esses operadores são de grande importância para um software tendo em vista que sempre iremos realizar comparações. Os operadores relacionais retornam valor 1 para uma sentença verdadeira e 0 para uma sentença falsa. Abaixo uma tabela dos operadores: Símbolo Nome do Operador Exemplo Significado > Maior que x>y x é maior que y? > = Maior ou igual x > =y x é maior ou igual a y? < Menor que x<y x é menor que y? <= Menor ou igual x<=y x é menor ou igual a y? == Igualdade x==y x é igual y ! = Diferente de X! = y X é diferente de y? Obs: Um erro que vemos bastante é no operador de igualdade “==” que é confundindo com o “=” (operador de atribuição em uma variável) fique atento a esses detalhes. Operadores Especiais São os operadores responsáveis por testar, atribuir ou descolar os bits em um byte ou uma palavra, que são os tipos de dados conhecidos como “int” e “char”. Esses operadores não podem ser usados em variáveis de tipo complexo de dados Algoritmos 55 como o “float”. Abaixo uma tabela que explica melhor a utilização dos operadores especial: Operador Ação & AND l OR ^ XOR (OR exclusivo) ~ NOT >> Deslocamento de bits a direita << Deslocamento d ebits a esquerda Obs: Muita atenção na utilização dos operadores especiais, eles são muito parecidos com os outros operadores que estudamos. Uma aplicação errada desses operadores irá prejudicar o funcionamento do sistema. Estrutura de um programa em C Uma particularidade interessante no programa C é seu aspecto modular e funcional, em que o próprio programa principal é uma função. Esta forma de apresentação da linguagem facilita o desenvolvimento de programas, pois permite o emprego de formas estruturadas e modulares encontradas em outras linguagens. A estrutura de um programa em C possui os seguintes elementos, sendo que aqueles delimitados por colchetes são opcionais: Algoritmos 56 [ definições de pré-processamento ] [ definições de tipo ] [ declarações de variáveis globais ] [ protótipos de funções ] [ funções ] main ( ) { /* definições de variáveis */ /* corpo da função principal, com declarações de suas variáveis, seus comandos e funções */ } Definições de pré-processamento são comandos interpretados pelo compilador, em tempo de compilação, que dizem respeito a operações realizadas pelo compilador para geração de código. Geralmente iniciam com uma cerquilha (#) e não são comandos da linguagem C, por isso não serãotratados aqui com maiores detalhes. Ex: #include <stdio.h> /* comando de pré-processador, utilizado para indicar ao compilador que ele deve ´colar´ as definições do arquivo stdio.h neste arquivo antes de compilá-lo */ Definições de tipos são definições de estruturas ou tipos de dados especiais, introduzidos pelo usuário para facilitar a manipulação de dados pelo programa. Também não serão tratados aqui em maiores detalhes. Declarações de variáveis globais são feitas quando é necessário utilizar variáveis globais no programa. O conceito de variável global e as vantagens e desvantagens do seu uso dizem respeito à modularização de um programa em C (consultar o material sobre modularização e funções). Algoritmos 57 Protótipos de funções e funções também dizem respeito a questões de modularização. main() é a função principal de um programa em C, contendo o código que será inicialmente executado quando o programa em si for executado. Todo programa em C deve conter a função main(), do contrário será gerado um erro durante o processo de geração do programa (mais especificamente, na etapa de ligação). Funções básicas de E/S Esta seção descreve algumas das funções básicas de E/S, que serão utilizadas inicialmente para prover o programador de um canal de entrada de dados via teclado e um canal de saída de dados via monitor. Função printf( ) (biblioteca stdio.h) A função printf( ) é basicamente utilizada para enviar informações ao monitor, ou seja, imprimir informações. O seu protótipo é o seguinte: printf( string de dados e formato, var1, var2,..., varN); onde string de dados e formato é formada por dados literais a serem exibidos no monitor (por exemplo, um texto qualquer) mais um conjunto opcional de especificadores de formato (indicados pelo símbolo % e um conjunto de caracteres). Estes especificadores determinarão de que forma o conteúdo dos argumentos var1 a varN será exibido. var1 a varN indicam, por sua vez, os argumentos (variáveis ou constantes) cujos valores serão exibidos no local e no formato determinado pelos especificadores de formato, dentro da string de dados e formato. O número N deve ser igual ao número de especificadores de formato fornecidos. Algoritmos 58 Especificadores de formato mais utilizados: %c caracteres simples (tipo char) %d inteiro (tipo int ) %e notação científica %f ponto flutuante (tipo float) %g %e ou %f (mais curto) %o octal %s string %u inteiro sem sinal %x hexadecimal %lf tipo double %u inteiro não sinalizado (tipo unsigned int) %ld tipo long int Exemplos: 1) int n = 15; printf(“O valor de n eh %d”, n); /* exibe ´O valor de n eh 15´. Note-se que todo o conteúdo da string de dados e formato é exibido literalmente, com exceção do especificador %d, que é substituído pelo valor em formato inteiro da variável n */ 2) char carac = ´A´; float num = 3.16; printf(“A letra eh %c e o numero eh %f”, carac, num); /* exibe ´A letra eh A e o numero eh 3.16´. Neste caso, oespecificador %c (primeiro da string) é substituído pelo valor da variável carac e o especificador %f é substituído pelo valor da variável num. Note-se que os tipos dos especificadores e das variáveis são compatíveis */ Algoritmos 59 Função scanf() (biblioteca stdio.h) A função scanf é utilizada para receber dados de uma entrada de dados padrão. Consideraremos, para fins de simplificação, que essa entrada padrão é sempre o teclado. O protótipo de scanf é o seguinte: scanf (string de formato, &var1, &var2, …, &varN); onde a string de formato contém os especificadores de formato na sequência e relativos a cada um dos dados que se pretende receber. Para uma lista dos especificadores de formato mais utilizados, ver seção 3.1. var1 a varN identificam as variáveis nas quais serão armazenados os valores recebidos por scanf, na mesma ordem determinada pelos especificadores de formato. O número N deve ser igual ao número de especificadores de formato fornecidos. Exemplos: 1) int t; printf(“Digite um inteiro: “); scanf(“%d”, &t); /* aguarda a digitação de um número do tipo int. O número digitado é armazenado na variável t quando o usuário digita ENTER */ 2) char carac1; int i; printf(“Digite um caracter e um int, separados por vírgula: “); scanf(“%c, %d”, &carac1, &i); Importante O operador de endereço (&) DEVE obrigatoriamente ser utilizado diante dos identificadores das variáveis, do contrário ocorre um erro. Para maiores detalhes, consultar a teoria sobre ponteiros. Algoritmos 60 /* neste caso, os especificadores de formato %c e %d estão separados por vírgula, o que significa que o usuário deve digitar os valores também separados por vírgula e na ordem correta */ Função getch() (biblioteca conio.h) A função getch é utilizada, basicamente, para esperar o pressionamento de uma tecla pelo usuário. A tecla pressionada pode ser capturada através do valor de retorno da função (para maiores detalhes sobre valor de retorno, consultar a teoria sobre funções). Pelo fato de interromper a execução até o pressionamento de uma tecla, a função getch pode ser utilizada no final de um programa de console para permitir que o usuário visualize o resultado do programa antes que a sua janela se feche. Exemplo: Printf(“Estou mostrando uma frase\n”); Printf(“Digite qualquer tecla para sair do programa”); Getch(); /* aguarda aqui até uma tecla ser pressionada */ /* fim do programa */ Observação: a função getche funciona de forma semelhante, porém exibe na tela o caracter digitado (o nome significa “get char with echo”). Função clrscr() (biblioteca conio.h) A função clrscr é utilizada para limpar a tela (o nome significa “clear screen”). Algoritmos 61 Ficamos por aqui. Estamos encerrando a unidade. Sempre que tiver uma dúvida entre em contato com seu tutor virtual através do ambiente virtual de aprendizagem e consulte sempre a biblioteca do seu polo. Leitura complementar ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi de. Fundamentos da Programação de Computadores. São Paulo: Prentice Hall, 2004. CORMEN, THOMAS H.; RIVEST, RONALD L.; STEIN, CLIFFORD; LEISERSON, CHARLES E. Algoritmos – Teoria e Prática – 3ª ed. Rio de Janeiro: Elsevier – Campus, 2012 FORBELLONE, A. L.; EBERSPACHER, H. Lógica de Programação: a construção de algoritmos e estrutura de dados. São Paulo: Makron Books, 2000. GUIMARÃES, A. L.; LAGES, N. A. C. Algoritmos e Estruturas de Dados. Rio de Janeiro: LTC, 1994. LEITE, Mario. Técnicas de programação. São Paulo: Brasport, 2006. OLIVEIRA, Jayr Figueiredo de; MANZANO, Jose Augusto N. G. Algoritmos e lógica para desenvolvimento de programação. 22ª ed. São Paulo: Érica, 2009. É hora de se avaliar Lembre-se de realizar as atividades desta unidade de estudo. Elas irão ajudá-lo a fixar o conteúdo, além de proporcionar sua autonomia no processo de ensino-aprendizagem. Algoritmos 62 Exercícios – Unidade 3 1. Considerando a linguagem de programação "C", para uma variável armazenar "números de ponto flutuante", deve ser declarada como: a) Real. b) Int. c) Numeric. d) Point. e) Float. 2. São palavras-chave da linguagem C no padrão ANSI e, portanto, não podem ser utilizadas como nomes para variáveis a) Typedef, master, core, newline. b) Union, extern, main, core. c) Int, long, static, void. d) Float, long, core, continue e) Signed, unsigned, master, main 3. Em linguagem de programação, uma variável é: a) O resultado de uma expressão aritmética. b) o nome dado às informações salvas no disco. c) Um número, uma letra ou um ponto-flutuante. d) Uma posição de memória identificada. e) Uma palavra especial utilizada pela linguagem para identificar suas instruções de controle Algoritmos 63 4. Em relação ao processo de geração de códigoexecutável, assinale a opção correta a) Em um programa implementado na linguagem C, a linha “#include ”, que faça parte do código fonte, é analisada diretamente pelo compilador, de forma que o conteúdo do arquivo stdio.h passa a ser considerado parte integrante do programa. b) Todo compilador de linguagem de programação de alto nível tem a responsabilidade de analisar o código fonte até a geração de código executável. c) Carregadores são programas usados exclusivamente por linguagens de programação de alto nível, com o objetivo de transferir um módulo de carga para a memória. d) A declaração de variável “int 7g;” em um programa escrito na linguagem Java, leva a um erro de compilação detectado durante a análise sintática. e) Em programas que usam funções disponíveis em bibliotecas, as referências a estas funções serão resolvidas pelo ligador. No caso de bibliotecas estáticas, o código objeto das funções é integrado ao módulo executável durante o processo de ligação. 5. Na linguagem de programa C , marque a função de saída : a) Printf b) Scanf c) Main d) Void e) Int Algoritmos 64 6. Na linguagem de programa C , marque a função de entrada : a) Printf b) Scanf c) Main d) Void e) Int 7. Analise e identifique os operadores especiais na linguagem C: a) %, &, |, > b) ~, >>, <<, ||, && c) &&, ~, %%, + d) ||, -, +, % e) -, +, *,/ 8. Marque os operadores relacionais usados na linguagem C: a) +,-,*,% b) >=,+,<=,< c) =>,=<,<,> d) >=,<=,<,!= e) =, ==, !=,< Algoritmos 65 9. Defina operadores relacionais. ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ 10. Fale sobre modularização. ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ Algoritmos 66 Algoritmos 67 4 Variáveis e Tipos de Dados Algoritmos 68 Caro aluno, Nesta unidade, iremos estudar as variáveis e seus tipos de dados, iremos ver a importância que tem a definição correta das variáveis para o desenvolvimento do sistema, de que modo podemos atribuir valores e manipular essas variáveis. Objetivos da unidade: Entender os conceitos básico de variáveis. Aprender de que modo podemos manipular esses dados armazenados nas variáveis. Como declarar corretamente os identificadores da variável. Entender todos os tipos de dados existente para as variáveis e com realizar essa declaração. Plano da unidade: Conceitos de Variáveis. Operação de Atribuição. Identificadores. Tipo de dados. Bons estudos. Algoritmos 69 Conceito de Variáveis Bom, chegamos numa das partes mais importantes da fase inicial de um algoritmo: as variáveis. Variável é um local que será reservado na memória principal do programa para guardar vários tipos de dados. Toda variável irá necessitar de um nome, nome esse que na programação iremos chamar de identificador. O identificador será responsável pelo nome dado a certa variável que será utilizado em todo o programa. Além do identificador, precisamos também definir o seu tipo de dado, ou seja, o valor que essa variável poderá receber. Iremos aprender abaixo como declarar a variável de forma correta e atribuir valores a ela. Operação de Atribuição Essa operação tem como seu objetivo definir ou redefinir valores na variável. Utilizamos essa operação quando queremos iniciar uma variável com valor específico, pulando a etapa de entrada de dados, e estabelecemos no próprio código o valor que essa variável irá receber. Porém podemos também redefinir o valor preestabelecido pelo programador por outro desejado pelo usuário; para isso, basta realizar outra entrada de dados. Desse modo o novo dado inserido irá sobrescrever o dado estabelecido antes. Exemplos: Uma variável recebendo um valor predefinido. Algoritmos 70 Uma variável recebendo um valor predefinido e sendo alterado por outra entrada de dados: Outra forma de atribuir valor a uma variável: Essas sãos as formas mais utilizadas para atribuir um valor a uma variável. Identificadores São os nomes que irão fazer referências aos dados que serão armazenados nas variáveis. Esses identificadores têm regras únicas que devem ser seguidas corretamente senão o programa não será executado. Abaixo, iremos mostrar as regras para criar um identificador: Só podem ser utilizados dígitos, letras maiúsculas e minúsculas, e apenas o caractere de sublinha ( __ ), esses sãos os caracteres aceitos pelas variáveis. Algoritmos 71 Na linguagem C, existe diferença entre letra maiúscula e minúscula. Exemplo: Escola ≠ escola ≠ ESCOLA. Fique atento a essa regra, acima temos três variáveis com o mesmo nome, porém caracteres maiúsculos e minúsculos são considerados diferentes pelo compilador. É proibido usar as palavradas reservadas pela linguagem C, isso irá dar erro no programa. Segue a lista de palavras proibidas de serem usadas: auto, break, case, char, const, continue, default, do, double, else, enum, extern, float, for, goto, if, int, long, register, return, short, signed, sizeof, static, struct, switch, typeof, union, unsigned, void, volatile, while. Os identificadores não podem conter no primeiro caractere valor numeral: Exemplo: 1nome. Exemplos Corretos: Exemplos Incorretos: Tipo de dados Os tipos de dados irão definir quais valores poderão ser assumidos pelas variáveis e as operações que poderão ser realizadas por ela, desse modo, iremos saber qual a natureza da informação. Os tipos de dados são: Variáveis do tipo “int” são conhecidas com inteiras elas recebem apenas valores do tipo inteiro que vão de -2147483648 a 2147483647. Algoritmos 72 Variáveis do tipo “char” são conhecidas como caracteres elas recebem todos os caracteres contidos no padrão ASCII de forma individual. Variáveis do tipo “float” são conhecidas como reais elas recebem valores do tipo real que vão de 10-38 a 1038. Variáveis do tipo “double” são conhecidas também como reais porém ela recebem uma maior quantidade de valores reais que vão de 10-4932 a 104932 Variáveis do tipo “bool” são conhecidas como variáveis de verdadeiro (true), ou falso(false), elas recebem apenas dois valores (true e false) normalmente usada para uma condição. Leitura complementar ASCENCIO, Ana Fernanda Gomes; CAMPOS, Edilene Aparecida Veneruchi de. Fundamentos da Programação de Computadores. São Paulo: Prentice Hall, 2004. CORMEN, THOMAS H.; RIVEST, RONALD L.; STEIN, CLIFFORD; LEISERSON, CHARLES E. Algoritmos – Teoria e Prática – 3ª ed. Rio de Janeiro: Elsevier – Campus,2012 FORBELLONE, A. L.; EBERSPACHER, H. Lógica de Programação: a construção de algoritmos e estrutura de dados. São Paulo: Makron Books, 2000. GUIMARÃES, A. L.; LAGES, N. A. C. Algoritmos e Estruturas de Dados. Rio de Janeiro: LTC, 1994. LEITE, Mario. Técnicas de programação. São Paulo: Brasport, 2006. OLIVEIRA, Jayr Figueiredo de; MANZANO, Jose Augusto N. G. Algoritmos e lógica para desenvolvimento de programação. 22ª ed. São Paulo: Érica, 2009. Algoritmos 73 Estamos encerrando a unidade. Sempre que tiver uma dúvida entre em contato com seu tutor virtual através do ambiente virtual de aprendizagem e consulte sempre a biblioteca do seu polo. É hora de se avaliar Lembre-se de realizar as atividades desta unidade de estudo. Elas irão ajudá-lo a fixar o conteúdo, além de proporcionar sua autonomia no processo de ensino-aprendizagem. Algoritmos 74 Exercícios – Unidade 4 1. Indique qual a alternativa correta para declarar uma variável que representa o salário de um colaborador. a)var caractere SALÁRIO; b)var logico SALÁRIO; c)var string SALÁRIO; d)var float SALÁRIO; e)var int SALÁRIO; 2. Faz parte do desenvolvimento de uma algoritmo declarar as variáveis que armazenarão dados a ser manipulados pelo algoritmo. De acordo com as regras para criação dos nomes para as variáveis, assinale a alternativa que possui um exemplo de nome INCORRETO: a) Nota2 b) Nome_aluno c) Num1 d) Cad1- id e) Salariofinal Algoritmos 75 3. O que será apresentado na linha 9 do seguinte programa? 1- #include <stdio.h> 2- int main(void) 3- { 4- int x = 4; 5- scanf("%d", &x); 6- printf("%d", 2*x); 7- return 0; 8- } a) Exibirá o dobro do valor lido. b) Exibirá o valor lido. c) Exibirá a divisão do valor lido. d) Exibirá a porcentagem do valor lido. e) Exibirá ZERO. 4. Para os recursos presentes na linguagem de programação C, são feitas as afirmativas abaixo. I – Permite acesso de baixo nível através da introdução de código Assembly no programa C; II - A passagem de parâmetros por referência para funções pode ser simulada através da utilização de ponteiros; III - O tipo de dados typedef são estruturas variáveis que permitem que dados relacionados sejam combinados e manipulados como um todo. Está(ão) correta(s) a(s) afirmativa(s) a) I, apenas. b) II, apenas. c) III, apenas. d) I e II, apenas. e) I, II e III. Algoritmos 76 5. Qual o tipo de dado que recebe uma maior quantidade de valores reais que vão de 10-4932 a 104932: a) Int b) Float c) Bool d) Double e) Char 6. Qual tipo de software tradutor deve ser utilizado para programas em geral, quando a velocidade de execução é uma exigência de alta prioridade? a) Compiladores b) Interpretadores c) Tradutores híbridos d) Macroprocessadores e) Interpretadores de macroinstruções 7. Com as declarações: Float soma, x Char nome, cor Bool cod, teste, tudo Assinale com um X os comandos de atribuição válidos. a) Teste = cod OU ((x)*2 <> soma) b) Tudo = soma c) X = nome >= cor d) Cod = cor = 'verde' e) Tudo = NÃO teste OU cod E (soma < x) Algoritmos 77 8. Se X possui o valor 15 e foram executadas as seguintes instruções: X = X + 3 X = X - 6 X = X / 2 X = 3 * X Qual será o valor armazenado em X? a) 9 b) 6 c) 15 d) 12 e) 18 9. Quais palavras são reservadas pela linguagem C? ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ 10. O que é variável? ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ ___________________________________________________________________ Algoritmos 78 Algoritmos 79 5 Estrutura de Decisão e Repetição Algoritmos 80 Caro aluno, Nesta unidade descreveremos as várias formas de tecnologias da informação disponíveis para as empresas e seus usuários, como os diversos tipos de computadores, servidores e sistemas de gerenciamento de banco de dados. Apresentaremos ainda um panorama dos serviços e da tecnologia de aplicativos de entrada e saída de hardwares e softwares. Esta unidade responde perguntas do tipo: o que você precisa saber sobre essas tecnologias para garantir que elas vão melhorar o desempenho da sua empresa? Objetivos da unidade: Identificar e descrever os componentes da infraestrutura de TI, os principais tipos de tecnologia de hardware e de armazenamento. Descreve e os principais tipos de softwares usados pelas empresas. Enumerar as tendências atuais de hardware e softwares usadas em sistemas operacionais de computadores. Avaliar as principais questões envolvidas na administração destes recursos. Plano da unidade: Estruturas de Decisão Estrutura de Repetição Comando continue Bons estudos! Algoritmos 81 Estrutura de Decisão Como vimos na unidade anterior em “Operações Lógicas”, verificamos que na maioria das vezes necessitamos tomar decisões no andamento do algoritmo. Essas decisões interferem diretamente no andamento do programa. Trabalharemos com dois tipos de estrutura. Estrutura if-else Formato: if ( condição ) { bloco de comandos 1 } else { bloco de comandos 2 } condição é qualquer expressão que possa ser avaliada com o valor verdadeiro (“true”) ou falso (“false”). No caso de expressões que possuam um valor numérico ao invés de um valor lógico, se o valor é diferente de zero a expressão é avaliada com valor lógico “true”, do contrário é avaliada com o valor lógico “false”. Caso a condição possua um valor lógico “true”, bloco de comandos 1 é executado. Se o valor lógico da condição for “false”, bloco de comandos 2 é executado. Para qualquer um dos blocos, se este for formado por um único comando as chaves são opcionais. A estrutura if-else é semelhante a uma estrutura condicional composta, em que um ou outro bloco de comandos é executado; a cláusula else, no entanto, é opcional, e se for omitida a estrutura passa a funcionar como uma estrutura condicional simples, em que um bloco de comandos (no caso, o bloco 1) somente é executado se a condição for verdadeira. Algoritmos 82 Exemplos: 1) int num; printf(“Digite um número: “); scanf(“%d”, &num); if (num < 0) /*testa se num é menor que zero */ { /* bloco de comandos executado se a condição é verdadeira. Neste caso, como printf é um único comando as chaves poderiam ser omitidas */ printf(“\nO número é menor que zero”); } else { /* bloco de comandos executado se a condição é falsa. Neste caso, como printf é um único comando as chaves poderiam ser omitidas */ printf(“\nO número é maior que zero”); } 2) if ((a == 2) && (b == 5)) /* condição com operação lógica */ printf(“\nCondição satisfeita”); /* bloco de comandos */ getch(); /* esta instrução não faz parte da estrutura condicional, logo é sempre executada */ 3) if (m == 3) { if ((a >=1) && (a <= 31)) /* este if faz parte do bloco de comandos do if anterior */ { printf(“Data OK”); } else /* este else é do if mais proximo (que faz parte do bloco de comandos) */ { printf(“Data inválida”); } } Algoritmos 83 Estrutura switch Formato: switch (expressão) { case valor1: seq. de comandos 1 break;
Compartilhar