Baixe o app para aproveitar ainda mais
Prévia do material em texto
APOSTILA : LINGUAGENS DE PROGRAMAÇÃO C E C++ Prof. Angelo Passaro página 1/1 I. ALGORITMOS E LÓGICA DE PROGRAMAÇÃO I.1. Algoritmos O conceito central da programação e da ciência da computação é o conceito de algoritmo. Programar é, basicamente, construir algoritmos. Um algoritmo é um texto (do tipo receita de bolo) onde cada linha contém uma ação primitiva (ação passível de execução por um ser humano ou por uma máquina). A função do algoritmo é agir sobre dados, transformando-os em informações. Algoritmo Entrada de Dados Saída de Informação Portanto, um algoritmo apresenta dois aspectos: ��Caráter Estático: Descrição das etapas de resolução de um problema ou a indicação ordenada de uma seqüência de ações bem definidas (receita). ��Caráter Dinâmico: efeito que sua execução gera no decorrer do tempo (ação sobre os dados). Uma dificuldade básica na concepção e entendimento de algoritmos é a falta do estabelecimento de uma relação entre esses dois aspectos, ou seja, como visualizar as estruturas dinâmicas a partir da estrutura estática (ou ainda, como dados vão sendo transformados durante a execução do algoritmo). Este tipo de relação é compreendida conforme o aluno vai construindo algoritmos e testando sua validade, procedendo, desta forma, como o próprio computador. O desenvolvimento de um algoritmo exige do programador as capacidades de abstração e a de organizar um processo utilizando lógica. Uma vez realizada a abstração e determinada a lógica do algoritmo, o programador deve ser capaz de descrever o processo lógico em termos de uma linguagem de programação. Note-se, no entanto, que um algoritmo é independente da linguagem de programação na qual será implementada. A inclusão da linguagem de programação, neste ponto, tem a função apenas de interligar as idéias que estamos apresentando. Antes de continuarmos, vamos definir um pouco melhor estes conceitos do ponto de vista da programação de computadores. APOSTILA : LINGUAGENS DE PROGRAMAÇÃO C E C++ Prof. Angelo Passaro página 2/2 I.1.1. Abstração Para automatizar um processo manual é necessário reproduzir o seu comportamento por meio de instruções que serão executadas em um computador. Desta forma, o que fazemos é, antes de tudo, gerar um modelo do processo que se deseja automatizar. Um modelo é uma abstração da realidade. As propriedades relevantes (note-se que não dissemos todas as propriedades) do fenômeno que está sendo modelado são identificadas, enquanto outras, que não são importantes para o processo de automatização, são ignoradas. Este processo de modelar o fenômeno, identificando propriedades e procedimentos relevantes para a solução do problema e ignorando outros é denominado Abstração. Note-se que, a identificação de quais propriedades são relevantes depende do processo que se deseja automatizar. Um mesmo problema pode ser modelado de diferentes maneiras, dependendo do fenômeno físico que se deseja estudar. I.1.2. Lógica Lógica, no seu sentido mais amplo, está presente em todos os passos de nossas vidas, servindo de base para resolução de nossos problemas diários. Podemos tomar qualquer situação, tal como, sacar dinheiro do banco fora do horário normal de expediente. Nestas condições a solução é passar num caixa automático. Esta decisão lógica, pode ser detalhada nos seguintes passos: a) Localizar um caixa automático; b) Passar o cartão magnético pela tranca eletrônica; c) Verificar se o caixa automático está funcionando; NÃO: Voltar ao passo a); SIM: continua (próximo passo); d) Passar o cartão magnético pela leitora do caixa; e) Digitar a senha eletrônica; f) Senha aceita? NÃO: voltar ao passo d); SIM: continua ( próximo passo); g) Acionar a opção de saque; h) Preencher e confirmar o valor do saque; i) Digitar novamente a senha eletrônica; j) Senha aceita? NÃO: voltar ao passo d) SIM: continua ( próximo passo); k) Máquina tem dinheiro suficiente? NÃO: volta ao passo a); SIM: continua; l) Retirar o dinheiro e guarda-lo; APOSTILA : LINGUAGENS DE PROGRAMAÇÃO C E C++ Prof. Angelo Passaro página 3/3 m) Sair do caixa eletrônico; n) FIM. O grau de detalhamento da solução pode ser tão grande quanto se necessite. Este conjunto de instruções, que parece uma receita de bolo, é um algoritmo. Do ponto de vista deste curso, lógica é um conjunto de princípios e de métodos que dão base a raciocínios coerentes, induzindo a soluções eficazes para problemas que devem ser resolvidos utilizando recursos computacionais. Existem vários tipos de lógica. Algumas das utilizadas em processamento de dados por computador são: ��Lógica Linear; ��Lógica Modular; ��Lógica Estruturada, e ��Lógica por objetos. O tipo de lógica a ser utilizada depende do problema que se pretende resolver e da experiência do programador. I.1.1.1 Lógica linear Neste tipo de lógica, procura-se resolver os problemas linearmente, tratando cada ação na ordem em que sua necessidade aparece (ver figura ). . . . Rotina 1 Rotina 2 Rotina 3 Rotina N I.1.1.2 Lógica modular Caracteriza-se pela subdivisão do problema proposto em diversos módulos (subproblemas), para poder analisar melhor cada rotina (separadamente). APOSTILA : LINGUAGENS DE PROGRAMAÇÃO C E C++ Prof. Angelo Passaro página 4/4 Rotina 1 Rotina 2 Rotina 3 Rotina N Bloco Principal I.1.1.3 Lógica estruturada Esta lógica é muito utilizada. Nela evita-se, cuidadosamente, o uso de desvios incondicionais. Esta lógica caracteriza-se por resoluções de laços, de dentro para fora. Dentro de uma rotina existem outras rotinas, numa espécie de aninhamento. A representação gráfica desta lógica não ajuda a esclarecer a frase anterior. Por esse motivo, preferimos apresentar o exemplo a seguir, comparando um algoritmo criado com a adoção de lógica linear e outro com a lógica estruturada. Nos dois casos utiliza-se uma linguagem natural. Exemplo de algoritmo usando lógica linear e estruturada Linear Estruturada 1. Definir X = 0; 2. Mostrar o valor de X; 3. X é igual a 10? SIM: Finalizar (interrupção do programa) Não: Continuar 4. Adicionar 1 à variável X; 5. Voltar para o item 2 (desvio incondicional!) 1. Definir X = 0; 2. Fazer enquanto X for menor que 10; Mostrar o valor de X; Adicionar 1 à variável X; 3. Mostrar o valor de X; Note-se que no caso do uso de lógica estruturada não ocorre uma instrução de desvio incondicional. O processamento ocorre no interior de um laço, representado pelo conjunto de instruções “aninhadas”na instrução 2. Terminado processamento do laço da instrução 2, o processamento continua com a execução do passo 3 e, em seguida, o algoritmo termina. I.1.1.4 Lógica por objetos Neste tipo de lógica, a maior atenção é direcionada para a identificação de objetos que representam entidades no domínio do problema. Os objetos apresentam como característica a combinação de atributos e comportamento, o que, numa linguagem de programação correspondem a dados e funções. O assunto é suficientemente abrangente para ser tratado como um tópico à parte. APOSTILA : LINGUAGENS DE PROGRAMAÇÃO C E C++ Prof. Angelo Passaro página 5/5 I.1.1.5 Instrumentos da Lógica de programação Vários instrumentos estão a disposição do programador para desenvolver um algoritmo e para sua posterior implementação. Entre estes instrumentos cita-se: ��Pictóricos ou gráficos:• Fluxogramas e Diagramas de blocos; • Diagramas hierárquicos de fluxo ou diagramas hierárquicos estruturados; • Gráficos de estrutura; ��Narrativos • Linguagem natural estruturada; • Pseudocódigo. ��De detalhes: • Árvore de decisão; • Tabela de Decisão. a) Fluxogramas e Diagramas de Blocos Utilizados para descrever o método e a seqüência de execução do processo. Podem ser desenvolvidos em qualquer nível de detalhe que se deseje, podendo chegar até o nível de implementação na linguagem de alto nível escolhida. Esses diagramas utilizam vários símbolos geométricos, os quais estabelecem as seqüências de operação a serem efetuados no processamento computacional. Principais símbolos utilizados em um Diagrama de Blocos: Terminal: indica o início e/ou fim do fluxo de um programa. Não é codificado em forma de comando. Seta de Fluxo de dados: indica o sentido do fluxo de dados. Serve para conectar os símbolos ou blocos existentes. Processamento: indica a existência de cálculos (algoritmos) a efetuar, atribuições de valores, ou qualquer manipulação de dados que tenha um bloco específico para sua descrição. Entrada de dados ou operação manual: utilizado para ler os dados necessários a programa fora de linha sem intervenção de dispositivos mecânicos. Entrada e saída de dados: indica dispositivo qualquer de entrada ou saída de dados, como fornecedor de informações para processamento, gravação e outros. APOSTILA : LINGUAGENS DE PROGRAMAÇÃO C E C++ Prof. Angelo Passaro página 6/6 Teclado: informações recebidas ou fornecidas de ou por um computador. ou Saída de dados em vídeo: símbolos utilizados quando se deseja exibir informações dados na tela do vídeo. Saída de dados em impressora: utilizado quando se deseja que os dados sejam impressos. Disco magnético: memória de massa para armazenamento de dados (disco rígido). Decisão: indica a decisão que deve ser tomada. Este símbolo indica a possibilidade de desvios para diversos outros pontos do fluxo, dependendo do resultado de comparação e de acordo com situações variáveis. Preparação: refere-se a um determinado grupo de operações não inclídas na diagramação, bem como na elaboração de uma chave que modificará aexecução de um determinado programa (na prática está associado a laços). Conector: utilizado quando é preciso particionar o diagrama.Quando ocorre mais de uma partição, é colocado uma letra, ou um número, dentro do símbolo de conexão para identificar os pares de ligação. Conector: específico para indicar conexão do fluxo em outra página. Exemplo 1: Achar o valor da expressão D = B2 – 4AC Início Ler A, B e C D = B2 – 4 * A* C Escrever D Fim APOSTILA : LINGUAGENS DE PROGRAMAÇÃO C E C++ Prof. Angelo Passaro página 7/7 Exemplo 2: Achar o maior de dois números A e B Início Ler A e B Fim Comparar A com B Escrever: A é maior Escrever : A e B iguais A = B A > B A < B Escrever: B é maior I.1.3. Linguagem de programação Uma linguagem de programação é uma notação formal para descrição de algoritmos que serão executados por um computador. Como todas as linguagens formais, uma linguagem de programação apresenta dois componentes: Sintaxe e Semântica. ��Sintaxe: consiste de um conjunto de regras formais que especificam a composição do programa a partir de letras, dígitos e outros símbolos. Como exemplo, regras de sintaxe podem exigir que para cada parêntese aberto em uma expressão aritmética corresponda um parêntese fechado. Outro exemplo: dois comandos quaisquer devem ser separados por um ponto e vírgula. ��Semântica: Especifica o significado de qualquer programa, sintaticamente válido. Os computadores de uso geral, encontrados atualmente no mercado, são capazes de executar somente programas em linguagens de nível baixo, a linguagem de máquina. Linguagens de máquina são projetadas em função da rapidez de execução de programas, do custo de sua implementação e da flexibilidade com que permite a construção de programas de nível mais alto. Por outro lado, linguagens de programação de alto nível são projetadas, em geral, em função da facilidade na construção e da confiabilidade de programas. Para que um computador, que só compreende linguagem de máquina, se comporte como se entendesse linguagens de alto nível, são utilizados programas “tradutores” capazes de traduzir uma programa escrito numa linguagem de alto nível para a linguagem de máquina. Os principais tipos de programas tradutores são: ��Interpretador: Nesta solução, as ações indicadas pelos comandos da linguagem são interpretadas e executadas diretamente, uma a uma, num processo interativo. Desta forma, traduz-se uma instrução; executa-se esta instrução; traduz-se nova instrução; executa-se esta nova instrução; e assim sucessivamente. Instruções erradas são identificadas no momento de sua tradução. As instruções anteriores são executadas normalmente. Nenhum arquivo adicional é criado. Exemplos de APOSTILA : LINGUAGENS DE PROGRAMAÇÃO C E C++ Prof. Angelo Passaro página 8/8 linguagens que utilizam um processo interpretativo são o Basic, o MATLAB, e antigas versões do Pascal. ��Tradutor: Nesta solução, o conjunto de instruções escritas em uma linguagem de alto nível é primeiramente traduzido para versões da linguagem de máquina e somente então executadas. A tradução é feita em vários passos. Por exemplo, subprogramas podem ser traduzidos, primeiramente, para código de montagem (assembly code). Em seguida este código de montagem é traduzido para código relocável em linguagem de máquina. Num próximo passo, unidades de código relocável podem ser ligadas em uma única unidade relocável. Finalmente, o programa ineiro é carregado na memória principal, como código executável de máquina. Os tradutores utilizados em cada um desses passos recebe nomes especiais: compilador, montador, ligador (ou editor de ligações – “linker”) e carregador devem ser confeccionados para cada linguagem de alto nível e computador utilizados. A figura a seguir ilustra o processo: Editor de texto (ASCII) Nomearq.c ou Nomearq.cpp ou nomearq.pas, ou ...... Gera arquivos fonte compilador Sucesso? Não Gera arquivos objeto nomearq.obj ou nomearq.o. ligador Sucesso? Gera arquivo executável nomearq.exe Sim Não Sim Carregar e executar O processo de compilar, ligar e executar um programa. Programas interpretados apresentam tempo de execução maior que os traduzidos, uma vez que cada instrução deve ser, primeiramente, traduzida e, somente então, executada. No segundo caso, todas as instruções já estão em condições de serem executadas pelo computador. APOSTILA : LINGUAGENS DE PROGRAMAÇÃO C E C++ Prof. Angelo Passaro página 9/9 A função do programador é criar um algoritmo, traduzir o algoritmo para uma linguagem de programação, de preferência de alto nível, obedecendo as regras de sintaxe dessa linguagem e preocupando-se com a semântica, de forma a que o programa executado gere a solução do problema. Neste pronto tem-se um programa escrito em linguagem de programação de alto nível. A função do programa tradutor (seja um interpretador ou tradutor) é a de converter o programa escrito na linguagem de alto nível adotada em um programa executável (em linguagem de máquina). O compilador auxilia o programador com a identificação de não conformidadescom as regras de sintaxe, mas pouco pode fazer com erros semânticos. O ligador, além de criar o código relocável unificado, realiza verificações de consistência. Essas verificações de consistência permitem identificar a falta de definição funções ou outros componentes no conjunto do programa, componentes esses que podem ser encontrados em outros arquivos fonte ou em bibliotecas. I.2. Lógica na programação de sistemas I.2.1. Princípios e resolução de problemas Problema, no contexto deste curso, é uma questão que foge a uma determinada regra, um desvio de percurso que impede que se alcance com sucesso um objetivo predefinido, com eficácia e eficiência. Em geral, diagramas de blocos são excelentes instrumentos para a avaliação do problema do fluxo de informação d um dado sistema. Logo, o que se precisa é resolver um problema de lógica, usando, preferencialmente, um procedimento de desenvolvimento. Para desenvolver um diagrama, deve-se considerar como procedimentos prioritários os seguintes itens: ��Os diagramas devem ser desenvolvidos e quebrados em vários níveis. Os primeiros devem conter apenas as idéias básicas, deixando para as etapas posteriores o detalhamento que se fizer necessário (desenvolvimento Top-Down); ��Um fluxograma ou diagrama de blocos deve, sempre que possível, ser desenvolvido de cima para baixo e da esquerda para a direita; ��É incorreto e proibido ocorrer cruzamento das linhas de fluxo de dados. Exemplo 3: Calculo da média de dois números e determinação de aprovação, num processo Top-Down. Primeiro nível Início Calcular média e determinar aprovação Fim APOSTILA : LINGUAGENS DE PROGRAMAÇÃO C E C++ Prof. Angelo Passaro página 10/10 Segundo nível Início Ler notas Pi Calcular média e determinar aprovação Fim Apresentar se houve ou não reprovação Início Ler notas Pi Calcular média e determinar aprovação Fim Apresentar se houve ou não reprovação ou Terceiro nível Início Ler notas Pi Calcular média Fim Início Ler notas Pi Fim ou Apresentar no vídeo REPROVADO Calcular média Média >=6 Média >=6 Apresentar no vídeo REPROVADO Não Apresentar no vídeo APROVADO Fim Apresentar no vídeo APROVADO Não Sim Sim APOSTILA : LINGUAGENS DE PROGRAMAÇÃO C E C++ Prof. Angelo Passaro página 11/11 I.3. Ambientes de desenvolvimento para as linguagens C e C++ Os ambientes de desenvolvimento de programas modernos, para todas as linguagens, incluem os seguintes componentes, que podem ou não estar integrados: ��editor de texto: permite a edição de arquivos fonte, gravando-os em formato ASCII. Além disso costumam apresentar um conjunto de recursos avançados de edição, que podem incluir as conhecidas ferramentas de cortar e colar e mover texto, além de recursos visuais que permitem identificar comandos da linguagem, constantes, comentários, dentre outros, utilizando diferentes cores. ��Compilador (compiler): cuja função foi apresentada em seção anterior. ��Ligador (linker): cuja função também foi apresentada em seção anterior. ��Execução monitorada (debbuger): permite acompanhar a execução de um programa sendo executado na memória do computador. Esta ferramenta é muito útil para identificar erros semânticos, desde o ligador tenha sido capaz de criar o código executável e se o programador for capaz de acompanhar o desenvolvimento dinâmico do algoritmo.
Compartilhar