Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 FACULDADE ÚNICA DE IPATINGA ALGORITMOS E PROGRAMAÇÃO DE COMPUTADORES FILIPE COSTA FERNANDES 2 Menu de Ícones Com o intuito de facilitar o seu estudo e uma melhor compreensão do conteúdo aplicado ao longo do livro, você irá encontrar ícones ao lado dos textos. Elas são para chamar a sua atenção para determinado trecho do conteúdo, cada um com uma função específica, mostradas a seguir: 3 UNIDADE 01 Sumário UNIDADE 02 UNIDADE 03 UNIDADE 04 ESTRUTURAS DE CONTROLE 4.1. Comandos de seleção 62 4.2. Seleção com IF 62 4.2.1 IF encadeado 63 4.3. Os comandos IF-ELSE 64 4.4. Operadores lógicos 66 4.5. O comando SWITCH-CASE 67 4.5.1 O comando BREAK 69 4.6. Operador condicional ternário (?:) 69 4.7. Laços de repetição 70 4.7.1 Estrutura de repetição FOR 72 4.7.2 Laços aninhados 74 4.7.3 O laço WHILE 76 4.7.4 O laço DO- WHILE 77 4.7.5 O comando continue 79 -Fixando o Conteúdo 80 LINGUAGEM DE PROGRAMAÇÃO C 3.1 Introdução 41 3.2. Estrutura básica da linguagem C 41 3.21.Blocos de comando 44 3.3. A função main () 44 3.4. Biblioteca e funções complementares 45 3.5. Constantes variáveis 46 3.6. Entrada e saída de dados 49 3.6.1 A função printf() 50 3.6.2 A função scanf() 52 3.6.3 Entrada e saída com getchar, getch e putchar getchar() 53 3.7. Operadores aritméticos 54 3.8. Operadores relacionais 57 -Fixando o Conteúdo 59 LÓGICA DE PROGRAMAÇÃO 2.1 Estruturas condicionais 22 2.2 Estruturas condicionais composta 24 2.3. Operadores lógicos 30 2.4 Laços de repetição 32 2.4.1 Laço “para” 33 2.4.2 Laço “enquanto” 35 -Fixando o Conteúdo 38 INTRODUÇÃO 1.1 Introdução 06 1.2. Compiladores 06 1.2.1. Os níveis da linguagem 07 1.3. Algoritmos 07 1.3.1 Algoritmo x programa 08 1.4. Linguagem de programação 08 1.4.1. Portugol 09 1.5. Constantes 12 1.5.1.Palavras reservadas 13 1.6 Operadores aritméticos 14 1.7. Operadores relacionais 15 1.8. Operador de atribuição 16 -Fixando o Conteúdo 19 4 UNIDADE 05 UNIDADE 06 FUNÇÕES 5.1 Funções 82 5.2. Variáveis locais 83 5.3. Variáveis globais 84 5.4. O comando return 84 -Fixando o Conteúdo 85 ESTRUTURA DE DADOS 6.1 Arranjos (array) 88 6.2. Array multidimensional 89 6.3. Estruturas 89 6.4. Ordenação 91 6.4.1 Ordenação por seleção 92 6.5. Pesquisa em conjuntos (busca) 93 -Fixando o Conteúdo 95 REFERÊNCIAS BILIOGRÁFICAS 99 5 Na unidade 02 veremos alguns conceitos avançados sobre a lógica de programação e a construção de algoritmos estruturados e bem definidos. Nesta unidade exercitamos a lógica sobre as estruturas de controle e sua importância para o tratamento do fluxo das informações dentro de um algoritmo. CONFIRA NO LIVRO UNIDADE Na unidade 01 vamos conhecer a lógica de programação e todas as definições e teorias que nos auxiliam para uma boa prática de programação. Nesta unidade discutiremos sobre Computação, computadores, sistemas e fluxo de dados. Você será convidado a imergir no mundo da lógica de programação e exercitar o raciocínio lógico e estruturado, de forma a construir rotinas de tarefas que se assemelham aos algoritmos reais de programação. Olá mundo! Na unidade 03 faremos uma introdução à programação de computadores utilizando uma linguagem real. Ainda nesta unidade vamos conhecer os conceitos básicos das linguagens de programação e como iniciar a programação de computadores utilizando esta linguagem. Aqui são apresentados os principais conceitos e comandos básicos da linguagem de programação C. Controlando o fluxo de execução dos códigos. Na unidade 4 veremos como controlar o fluxo de execução e tomadas de decisão em um programa. Nesta unidade trataremos as estruturas de seleção para tomada de decisão e as estruturas de repetição para melhores resultados e controle do fluxo e quantidade de informações tratadas em nosso programa. Modularização e reutilização, o princípio básico da eficiência na programação. Nesta unidade trataremos de funções (blocos de códigos que executam quando solicitados). Veremos todas as técnicas para construção de funções e todas as suas variações, com recebimento de parâmetros e retorno ou não de valores. Em nossa unidade final, trataremos dos conjuntos de dados e suas formas de agrupamento e tratamento. Iremos abordar o uso de coleções de dados com a definição de Vetores e Matrizes (Arrays). Também iremos tratar sobre pesquisa e ordenação utilizando estes elementos em nossos programas. 6 INTRODUÇÃO 1.1 INTRODUÇÃO Para que as pessoas se entendam e possam se comunicar, é necessário que ambas falem uma linguagem em comum. Esta observação também é válida quando estamos analisando a relação homem-máquina. Se nos posicionarmos em frente a um computador e começarmos a lhe ditar ordens em uma linguagem diferente a qual o mesmo conhece (foi programado), o equipamento não irá identificar as instruções e consequentemente não conseguirá produzir o resultado esperado. Isto acontece porque os computadores são programados para entender e executar nossos comandos de acordo com um vocabulário pré-determinado e por eles conhecido. Quando surgiram os primeiros computadores, no final dos anos 40, tornou-se necessário programa-los. Tudo que um equipamento pode fazer baseia-se no conhecimento, pela máquina, de dois estados de corrente elétrica: ligado ou desligado. 1.2 COMPILADORES Quando duas pessoas, que falam idiomas diferentes precisam se comunicar, existem duas saídas: ou uma delas aprende e procura se expressar no outro idioma, ou ambas, continuam falando suas línguas com o auxílio de um tradutor para intermediá-las. Um compilador é uma ferramenta computacional que faz esta tarefa de intermediar a comunicação entre o homem e máquina. O compilador recebe um código fonte (escrito em alguma linguagem de programação) e transforma este código em um programa executável, um programa real que irá rodar no computador e executar as tarefas predefinidas para o mesmo. UNIDADE 7 1.2.1 Os níveis das linguagens Assim como os computadores, as linguagens de programação também têm evoluído. Costuma-se dizer que uma linguagem de computação se encontra em um determinado nível em relação à linguagem humana. As linguagens em que sua sintaxe está mais próxima da linguagem humana, são chamadas de linguagens de alto nível, já a linguagem mais próxima da linguagem das máquinas (ligado ou desligado) são chamadas de linguagem de baixo nível. 1.3 ALGORITMOS Um algoritmo é uma sequência lógica de instruções para realizar uma determinada tarefa. Os algoritmos não representam necessariamente programas de computador, e sim os passos necessários para se realizar uma tarefa. Diferentes algoritmos podem realizar a mesma tarefa usando um conjunto diferenciado de instruções em mais ou menos tempo, espaço ou esforço do que outros. Por exemplo, um algoritmo para se vestir pode especificar que você vista primeiro as meias e os sapatos antes de vestir a calça enquanto outro algoritmo especifica que você deve primeiro vestir a calça e depois as meias e os sapatos. Fica claro que o primeiro algoritmo é mais difícil de executar que o segundo. Estas instruções definidas por algoritmos, podem ser uma receita de bolo, manual de instruçõesde um aparelho qualquer, uma sequência para somar dois números, etc. Desde que estas intruções sigam uma sequência lógica e tenham início e fim. Vamos pensar no caso de uma receita de bolo. Não podemos colocar o bolo para assar sem antes misturar (de forma correta) todos os ingredientes, que por sua vez não podem ser misturados, se eles não existem. Então, neste caso, devemos primeiro adquirir os ingredientes, depois misturá-los e por fim, levar tudo ao forno, que por sua vez deve estar ligado ou poderá ser ligado futuramente. Então, esta sequência lógica (que deve ser um pouco mais refinada) pode ser definida como um algoritmo para se fazer um bolo (é claro que este algoritmo deve ser muito mais detalhado do que está em nosso exemplo, como por exemplo, devemos definir quais são os ingredientes). A sequência lógica também pode ser chamada de “Roteiro” ou “Algoritmo”. Sarah Henrique Highlight Sarah Henrique Highlight Sarah Henrique Highlight 8 Um roteiro para chupar uma bala pode ser escrito da seguinte forma: “Pegar a Bala” “Retirar o Papel” “Chupar a Bala” “Jogar o Papel no lixo” Um roteiro para somar dois números pode ser escrito da seguinte forma: “Obter o primeiro número” “Obter o segundo número” “Somar os dois números obtidos” “Apresentar o resultado da soma” 1.3.1 Algoritmo x programa Como vimos antes, um algoritmo é uma sequência lógica e bem estruturada de ações a serem executadas para se realizar uma determinada tarefa. Um programa é a conversão de um algoritmo em uma determinada linguagem de programação, segundo suas regras de sintaxe e semântica, de forma a permitir que o compilador possa entender a sequência de ações para transformar este programa (fonte) em um programa executável e realizar a tarefa. 1.4 LINGUAGEM DE PROGRAMAÇÃO É um conjunto de símbolos e regras de sintaxe que permitem a construção de sentenças que descrevem de forma precisa ações compreensíveis e executáveis para o computador. Sintaxe é o termo utilizado para descrever a forma como um comando ou instrução é definida. A sintaxe demonstra a título de exemplo o comportamento de uma determinada escrita de código. 9 1.4.1 Portugol (lê-se portugól) O portugol é um algoritmo (escrito em português estruturado) utilizando as sintaxes e semânticas parecidas com uma linguagem de programação, geralmente (foi proposto para ser baseado no pascal) o portugol é baseado na extinta linguagem Pascal, mas como todo tipo de algoritmo ele deve ter portabilidade para outras linguagens de programação e podemos adaptá-lo para fica mais parecido com linguagem que iremos utilizar. Como vimos antes, todo algoritmo deve obrigatoriamente ter um início e um fim, e entre eles algumas instruções a serem realizadas. Então um exemplo de um algoritmo pode ser escrito da seguinte forma: Início Instruções a serem realizadas Fim Tomando como exemplo a receita de bolo citada anteriormente, concluímos que antes de fazer qualquer coisa, temos que adquirir os ingredientes necessários para o nosso bolo (esta é a sequência lógica correta). Com os algoritmos também funciona desta forma devemos primeiro definir quais serão os ingredientes (que em algoritmos chamamos de definições, ou declarações) utilizado para a instrução em questão. O processo de criação e execução de programas (no nosso caso algoritmos) se divide em três partes básicas: entrada, processamento e saída. A entrada é toda a informação que o algoritmo recebe. Esta entrada sempre deverá ser armazenada em algum lugar, como por exemplo, em variáveis. O processamento é todo tipo de processamento que o algoritmo realiza, como atribuir um valor a alguma variável, realizar alguns tipos de tomada de decisão e algum tipo de repetição (falaremos sobre tomadas de decisão e sobre estruturas de repetição mais adiante). E a saída é a exibição dos resultados em tela, ou escrita em arquivos, ou em impressora. Sarah Henrique Highlight 10 EXEMPLOS Um algoritmo para somar dois números: Início Variáveis Numero1 : inteiro Numero2 : inteiro Soma: inteiro Leia numero1 Leia numero2 Soma = numero1 + numero2 Escreve soma Fim Neste exemplo temos na quarta e na quinta linha elementos de entrada (leia numero1 e leia numero2), na sexta linha temos um processamento (soma=numero1+numero2) e na penúltima linha temos uma saída (escreve soma). As demais linhas representam declarações em nosso algoritmo. Estes elementos de entrada e saída são chamados de comandos. Os comandos são palavras reservadas das linguagens de programação que realizam alguma tarefa. Como por exemplo, a palavra reservada (comando) leia que vai capturar o número que o usuário digitar e armazenar em algum local para futuro processamento e/ou saída. Este local de armazenamento é chamado de variável. As variáveis são porções de memória predefinidas para receber algum tipo de informação. Estas predefinições de variáveis podem ser definidas como o tipo de informação que a variável vai receber, e o tamanho da informação que a variável vai suportar. Os tipos de variáveis são chamados de tipos ou tipos de dados e o tamanho é chamado de tamanho mesmo. Sarah Henrique Highlight Sarah Henrique Highlight 11 Os tipos de dados mais conhecidos e comumente utilizados são definidos na tabela abaixo: TABELA 1 - Tipos de Dados mais comuns NOME DO TIPO DESCRIÇÃO Inteiro Recebe números inteiros positivos ou negativos. Ex. 1; 2; 3; -4; -50; +100; etc. Real Recebe números fracionários positivos ou negativos. Ex. 1.0; 2.0; 1.3; -5.4; etc. Char Recebe caracteres únicos, ou seja, suporta somente uma letra ou um número. Ex. ‘A’; ‘a’; ‘1’; etc. String Recebe cadeias de caracteres. Devemos definir o tamanho máximo de cada variável string declarada, e esta variável poderá receber um único caractere ou uma cadeia de caracteres de no máximo o tamanho definido para ela. Ex. “UNIPAC”; “Computação”; “1”; “1.3” Logico Recebe um dos dois valores lógicos: Verdadeiro ou Falso. Uma variável do tipo lógico, poderá receber somente um dos valores lógicos por vez. Sarah Henrique Highlight Sarah Henrique Highlight 12 Para declararmos uma variável devemos usar a palavra reservada variáveis e depois definimos as variáveis que necessitamos, separando o nome da variável do seu tipo por dois pontos (:). Sintaxe: Variáveis <nome_da_variavel> : <tipo_da_variavel> Exemplo: Variáveis X : inteiro Nome : String Sexo : Char Nota : Real Controle : Logico 1.5 CONSTANTES As constantes são tipos de dados predefinidos e que não podem ter seus valores alterados em tempo de execução de um programa. Por exemplo, podemos usar uma variável do tipo inteiro para ler um número qualquer, esta variável pode ter o seu valor alterado quantas vezes forem necessárias no decorrer do programa. Por Perceba que para tipos de dados CHAR usamos aspas simples (‘A’) e para tipos de dados STRING usamos aspas duplas (“A”). Assim quando tivermos um caractere somente, saberemos identificar o tipo de dados da variável em questão. Sintaxe é um termo utilizado em algoritmos e programação para descrever a forma básica de uma instrução ou comando, ou seja, a sua forma geral. 13 outro lado podemos definir uma constante para definir o valor de PI, que é um valor que não será alterado no decorrer do programa, então criamos uma constante chamada de PI que recebe o valor de 3,14159265 e toda vez que precisarmos de PI, basta chamar esta constante. Valores numéricos e strings também são chamados de Constantes. Os valores: 1; 10; -10; “Programação”; ‘C’, são exemplos de constantes. Para declarar uma constante, usamos a palavra reservada Constantes e depois declaramos todas as constantes necessárias. Sintaxe: Constantes <nome_da_constante>= <valor_da_constante> Exemplos: Constantes PI = 3,14159265 ValorMaximo = 1000 Instituição = “UNICA” No exemplo acima, foram definidas três constantes, PI, Valor Máximo e Instituição. Assim, no decorrer do programa, toda vez que precisar do valor de pi, não precisa informar o valor 3,1416 e sim utilizar a constante PI. O mesmo se aplica para as outras constantes. Lembre-se que estes valores não podem ser alterados em tempo de execução do programa, portanto, se no meio do programa você tentar atribuir um outro valor qualquer para uma constante, isso vai ocasionar um erro na execução do programa. 1.5.1 Palavras reservadas As palavras reservadas são todas as palavras reservadas para alguma funcionalidade em uma determinada linguagem de programação, estas funcionalidades são: ler, escrever, estrutura condicional, estrutura de repetição, 14 definição de início de bloco de código, definição de final de bloco de código, nomes de tipos de dados, etc. 1.6 OPERADORES ARITMÉTICOS Os operadores aritméticos são: +, -, *, /. Com eles podemos realizar cálculos matemáticos com variáveis numéricas, inteiras ou reais. Na matemática para realizar um cálculo de uma expressão, devemos montar toda a expressão, separando os blocos de prioridade por parêntesis “()”, colchetes “[]”, ou chaves “{}”, em programação usamos somente parêntesis “()” e a ordem de precedência dos operadores. A ordem de precedência dos operadores, é como se fossem parêntesis invisíveis que o compilador coloca na expressão quando não indicamos onde queremos ter parêntesis. O operador de Divisão tem a maior precedência, ou seja, em uma expressão sem separação por parêntesis a divisão será executada primeiro. Depois vem o operador de Multiplicação e por fim Adição e Subtração, nesta ordem. TABELA 2 - Operadores Aritméticos OPERADOR SIGNIFICADO / Operador de Divisão * Operador de Multiplicação + Operador de Adição - Operador de Subtração A sintaxe dos operadores aritméticos é a seguinte: <valor_A> <operador aritmético> <valor_B> Exemplos: 10 + 10 2 – 1 15 / 3 250 * 24 15 1.7 OPERADORES RELACIONAIS Em certo ponto de nosso programa, teremos a necessidade de tomar algum tipo de decisão, como por exemplo definir se um certo aluno foi aprovado ou reprovado em uma determinada disciplina, ou até mesmo descobrir de um número é par ou ímpar. Para isso devemos usar uma estrutura condicional (ou estrutura de tomada de decisão) e nesta estrutura deveremos utilizar os operadores relacionais, que irão determinar o valor exato do item em questão. Os operadores relacionais são: ==, !=, <, >, <=, >=. A tabela a seguir mostra os operadores relacionais e seus respectivos significados. TABELA 3 - Operadores Relacionais OPERADOR RELACIONAL SIGNIFICADO == Igual != Diferente < Menor que > Maior que <= Menor ou igual >= Maior ou igual A sintaxe dos operadores relacionais é a seguinte: <valor_A> <operador relacional> <valor_B> Também podemos substituir os valores numéricos por variáveis. 16 Exemplos: 10 == 10 12 > 10 5 < 6 X <= 50 1.8 OPERADOR DE ATRIBUIÇÃO ( = ) Para atribuirmos um valor a uma variável, devemos utilizar o operador de atribuição. Este operador é o = (igual) e ele serve para pegar o valor que está a sua direita e atribuir à variável que está a sua esquerda. Este operador também é chamado de recebe, uma vez que a variável que está à esquerda recebe o valor que está à direita. Sintaxe: <Variável_Destino> = <valor_original> Exemplos:(Dada uma variável do tipo inteiro X) X = 10; (a variável X recebe o valor 10) EXEMPLO PRÁTICO 1 Elaborar um algoritmo para escrever na tela a seguinte mensagem: Olá Mundo! Início Escreva “Olá Mundo!” Fim Algumas linguagens de programação, geralmente baseadas em object pascal, utilizam atribuição com: = (dois pontos igual). A maioria das linguagens reais utiliza somente o = (igual). Mas é sempre importante consultar a lista de palavras reservadas e comandos de uma linguagem antes de iniciar algum tipo de programação. 17 Perceba que neste algoritmo não declaramos variáveis, nem utilizamos alguma outra técnica que vimos até aqui, porque o algoritmo deveria simplesmente escrever uma string (constante) na tela. EXEMPLO PRÁTICO 2 Elaborar um algoritmo para ler o nome do usuário e escrever este nome na tela; Variáveis Nome : String Início Leia Nome Escreva Nome Fim Note que neste algoritmo já utilizamos o comando para ler algo do teclado, isso se dá pelo fato de que surgiu a necessidade de interagir com o usuário, o algoritmo necessitou do nome do usuário, então este nome foi lido do teclado. Mas note que nada informou ao usuário que ele deveria digitar o seu nome, então é sempre importante informarmos o usuário o que desejamos que ela faça. Portanto uma correção para o algoritmo do exemplo anterior fica da seguinte forma: Variáveis Nome : String Início Escreva “Digite o seu Nome:” Leia Nome Escreva Nome Fim Você percebeu que a palavra Nome apareceu algumas vezes distintas no corpo do algoritmo? Bom, na primeira vez que a palavra Nome aparece, ela está entre aspas duplas e é um texto a ser exibido na tela. Na segunda vez que a palavra Nome aparece, ela está sem aspas e é uma variável que irá armazenar a informação que o usuário digitar no teclado. 18 EXEMPLO PRÁTICO 3 Elaborar um algoritmo para ler DOIS números e escrever a soma dos números. Variáveis Numero1 : inteiro Numero2 : inteiro Resultado : inteiro Início Escreva “Digite um número para somar” Leia Numero1 Escreva “Digite outro número para somar” Leia Numero2 Resultado = Numero1 + Numero2 Escreva Resultado Fim Portanto, sempre que estiver usando VARIÁVEIS não utilize aspas, pois com aspas a sua variável deixará de ser uma variável e será um TEXTO SIMPLES. Os algoritmos e programas servem para definir estruturas computacionais que automatizam parte ou o todo de tarefas do nosso dia a dia. Com programação de computadores podemos facilitar e agilizar muito diversas tarefas repetitivas e cruciais nas nossas atividades. Podemos informatizar tudo o que fazemos, todas as tarefas de nossa profissão podem receber alguma ajuda da programação de computadores para se tornar mais eficiente e rápida. Pense em uma atividade que você realiza em seu dia a dia, agora imagine esta atividade automatizada. Proponha um algoritmo para resolver isto para você. MANZANO, José Augusto N. G. Algoritmos: lógica para desenvolvimento de programação de computadores / José Augusto N. G. Manzano, Jayr Figuei- redo de Oliveira. - 28. ed. - São Paulo: Érica, 2016 https://integrada.minhabiblioteca.com.br/books/9788536518657 RIBEIRO, João Araujo Introdução à programação e aos algoritmos / João Araujo Ribeiro. - 1. ed. - Rio de Janeiro : LTC, 2019. https://integrada.minhabiblioteca.com.br/books/9788521636410 19 1. Sobre Compiladores de Linguagens de Programação, marque a alternativa correta. a) Um Compilador é um programa de computador que realiza tarefas do nosso dia a dia. b) O compilador recebe um código executável e transforma este código em um código fonte, um algoritmo que será lido por um programador. c) Compiladores são máquinas de transformação que conseguem transformar qualquer algoritmo em programas de computador. d) O compilador recebe um código fonte e transforma este código em um programa executável, um programa real que irá rodar no computador e executar as tarefas predefinidas para o mesmo. e) Para compilar um programa de computador é preciso fazer isso no mesmo computador que o programa irá rodar, se a compilação for outro computador o programa não irá rodar. 2. Sobre as definições de níveis das linguagens,marque a alternativa correta. a) O nível de uma linguagem determina a quantidade de código que ela tem. b) Uma linguagem de alto nível é mais eficiente que uma linguagem de baixo nível. c) Os níveis servem para classificar as linguagens de programação em eficientes ou ineficientes, enquanto maior o nível de uma linguagem, mais eficiente ela é. d) Uma linguagem de baixo nível não deveria ser utilizada para programas que realizam boas tarefas. e) As linguagens de programação que estão mais próximas da linguagem humana são chamadas de linguagens de alto nível. 3. Leia as afirmativas abaixo e marque a alternativa CORRETA. I – Um algoritmo é uma sequência lógica de instruções para realizar uma determinada tarefa. II – Um algoritmo não necessita ter um conjunto muito claro de instruções, uma vez que algumas dicas sobre a realização das tarefas sejam informadas, já é o suficiente para sua execução. III – As instruções definidas por um algoritmo podem ser uma receita de bolo, um manual de instruções de um aparelho qualquer, uma sequência para somar dois números, dentre outros. Sarah Henrique Highlight 20 a) Apenas I está correta. b) Apenas I e II estão corretas. c) Apenas II está correta. d) Apenas I e III estão corretas. e) Todas as alternativas estão corretas. 4. Como vimos no texto, um algoritmo é uma sequência lógica e bem estruturada de ações a serem executadas para se realizar uma determinada a) conversa. b) tarefa. c) corrida. d) leitura. e) escrita. 5. Leia as afirmativas abaixo e marque a alternativa CORRETA. I – Sintaxe é o termo utilizado para descrever a forma como um comando ou instrução é definida. II – Uma linguagem de programação é um conjunto de símbolos e regras de sintaxe que permitem a construção de sentenças que descrevem de forma precisa ações compreensíveis e executáveis para o computador. III – O portugol é um algoritmo (escrito em português estruturado) utilizando as sintaxes e semânticas parecidas com uma linguagem de programação. a) Apenas I está correta. b) Apenas I e II estão corretas. c) Apenas II está correta. d) Apenas I e III estão corretas. e) Todas as alternativas estão corretas. 6. Leia as afirmativas abaixo e marque a alternativa CORRETA. I – Uma variável é um espaço reservado na memória para armazenar os valores utilizados em tempo de execução dentro de um programa de computador. II – Independente do tipo de linguagem de programação utilizada, não temos a obrigação de definir tipos de dados para as variáveis, já que os tipos de dados são definidos pelos valores assumidos por cada variável. III – As constantes são variáveis que recebem valores predefinidos, como textos e números e armazenam estes valores até que os mesmos precisam ser modificados. Sarah Henrique Highlight 21 a) Apenas I está correta. b) Apenas I e II estão corretas. c) Apenas II está correta. d) Apenas I e III estão corretas. e) Todas as alternativas estão corretas. 7. Leia as afirmativas abaixo e marque a alternativa CORRETA. I – Entrada é toda a informação que o algoritmo recebe. Esta entrada sempre deverá ser armazenada em algum lugar, como por exemplo, em variáveis. II – Processamento é todo tipo de processamento que o algoritmo realiza como atribuir um valor a alguma variável, realizar alguns tipos de tomada de decisão e algum tipo de repetição. III – Saída é a exibição dos resultados em tela, ou escrita em arquivos, ou em impressora. a) Apenas I está correta. b) Apenas I e II estão corretas. c) Apenas II está correta. d) Apenas I e III estão corretas. e) Todas as alternativas estão corretas. 8. Marque a alternativa correta. a) As palavras reservadas são algumas palavras de uma linguagem de programação que precisamos reservar antes de sua utilização. b) As tarefas de entrada e saída em um algoritmo são tarefas complementares de devem sempre ser realizadas em conjunto. c) Sintaxe é um termo utilizado em algoritmos e programação para descrever a forma básica de uma instrução ou comando. d) A ordem de precedência dos operadores determina a ordem que devemos utilizar os mesmos, não podendo utilizar um antes do outro que tenha maior precedência. e) Para atribuirmos um valor a uma variável, devemos utilizar o operador de lógica relacional atribuída. Sarah Henrique Highlight Sarah Henrique Highlight 22 LÓGICA DE PROGRAMAÇÃO 2.1 ESTRUTURA CONDICIONAL – (Tomada de decisões) Quando temos que tomar algum tipo de decisão ou verificar o conteúdo de alguma variável, devemos utilizar uma Estrutura Condicional ou tomada de decisão. Esta é uma estrutura binária (verificar dois operadores por vez) e que retorna um valor lógico (verdadeiro ou falso). A estrutura condicional verifica uma dada condição e retorna uma resposta de verdadeiro se a condição for verdadeira ou uma resposta de falso se a condição for falsa. SINTAXE: Se (condição) então Início <executa se condição for verdadeira> Fim Onde: Se ... então, são palavras reservadas que representam a estrutura condicional. (Condição) é uma condição lógica. Geralmente esta condição lógica é utilizada com operadores relacionais (como: ==, !>, <, >, <=, >=). Ex.: (A == 10), verifica se a variável A é igual a 10, ou seja, se o conteúdo da variável A é o número 10. Início e fim são as palavras reservadas que determinam um bloco de comandos para a estrutura em questão. UNIDADE 23 Em programação estruturada de computadores, mais especificamente em linguagens que limitam os seus blocos de comandos com palavras reservadas (no nosso caso início e fim), quando temos a definição de uma estrutura qualquer (por exemplo, o se ... então) esta estrutura executa somente a PROXIMA LINHA. Por isso quando temos mais de uma linha de código em nossa estrutura devemos usar as palavras reservadas para limitação de bloco de códigos início e fim. Então, quando temos mais de uma linha de código para executar com uma determinada tarefa, temos obrigatoriamente que usar início e fim, mas quando temos somente uma linha de código para executar, podemos escolher entre usar ou não as palavras reservadas início e fim. Entre as linhas que contém as palavras reservadas início e fim, devemos escrever as linhas que desejamos executar se a (condição) for estabelecida como verdadeira. Já vimos os princípios básicos de entrada e saída, como por exemplo, como ler um valor referente a nota final de um determinado aluno e como exibir esta informação. Mas, agora, se desejarmos verificar se este aluno foi aprovado e escrever na tela uma mensagem informando esta situação, o que devemos fazer? A resposta é simples: utilizar uma estrutura de tomada de decisão, Se ... então. Vamos ver como isso funciona... Variáveis Resultado : Real Início Escreva “Digite a nota final do aluno : “ Leia Resultado 24 Se (Resultado >= 70) então Escreva “O aluno está APROVADO”; Fim Note que no exemplo acima foi omitido as palavras reservas início e fim dentro do se.…então. Mas, se desejar colocar o seu código ficará assim: Variáveis Resultado : Real Início Escreva “Digite a nota final do aluno : “ Leia Resultado Se (Resultado >= 70) então início Escreva “O aluno está APROVADO”; fim Fim 2.2 ESTRUTURA CONDICIONAL COMPOSTA – (Se... então aninhados) Note que no exemplo do tópico anterior verificamos somente se o aluno foi aprovado. Para verificarmos se o aluno foi reprovado, teríamos que fazer outro se... então para verificar tal situação. Veja: Variáveis Resultado : Real Início Escreva “Digite a nota final do aluno : “ Leia Resultado Se (Resultado >= 70) então 25 Escreva “O aluno está APROVADO” Se (Resultado <70) então Escreva “O aluno está REPROVADO” Fim Vamos pegara primeira estrutura condicional (se (resultado >=70) então) como sendo o teste1 e a segunda estrutura condicional (se (resultado <70) então ) como sendo o teste2. No trecho de código escrito no exemplo acima, será executado a teste1 e depois, independente do resultado do teste1, será executado o teste2. Isso, por que as estruturas condicionais estão separadas; elas não têm nenhuma relação uma com a outra, e isso faz com o código fique mais lendo de se executar, por que faz mais testes lógicos e fique mais complicado entender, por que as estruturas estão separadas. Para resolver este problema, e outros que ainda não citamos, devemos utilizar a estrutura condicional composta que é o uso da palavra reservada senão para determinar a segunda opção de uma estrutura condicional sem ter que realizar outro teste, evitando com isso testes desnecessários, que tornam o programa mais lento e pesado. SINTAXE: Se (condição) então <executa se condição for verdadeira> Senão <executa se condição for falsa> Neste caso podemos usar ou não início e fim para determinar blocos de códigos conforme já definimos antes. Sarah Henrique Highlight 26 Veja: Se (condição) então início <executa se condição for verdadeira> fim Senão inicio <executa se condição for falsa> fim Note que, se aplicarmos este tipo de estrutura no nosso exemplo de aprovado ou reprovado, vamos eliminar o teste2. Assim, nosso exemplo fica da seguinte forma: Variáveis Resultado : Real Início Escreva “Digite a nota final do aluno : “ Leia Resultado Se (Resultado >= 70) então Escreva “O aluno está APROVADO” Senão Escreva “O aluno está REPROVADO” Fim 27 Em um modo geral, podemos dizer que a palavra reservada senão abrange tudo aquilo que o se... então deixou passar. Ela se comporta como o caso contrário da condição estipulada. Vamos analisar o exemplo acima: Na estrutura condicional perguntamos se o conteúdo da variável Resultado é maior ou igual a 70, por que se for, o aluno está aprovado. Depois usamos a palavra reservada senão, que quer dizer o seguinte: TUDO QUE NÃO FOR MAIOR OU IGUAL A 70. Ou seja, todos os valores que são menores que 70. Vejamos outro exemplo... Um algoritmo verificador de SENHAS, verifica se uma determinada senha é igual a senha do sistema, suponhamos que a senha seja a seguinte string “senha123”. Variáveis Senha : string Início Escreva “Digite a Senha : “ Leia Senha Se (Senha = “senha123”) então Escreva “Senha CORRETA” Senão Escreva “Senha ERRADA” Fim Vamos analisar este algoritmo: se o usuário digitar a senha “senha123” o algoritmo informa que a senha é correta, se não o algoritmo informa que a senha é errada. Ou seja, para qualquer valor diferente de “senha123” é informado que a senha é errada. Portanto, o senão será 28 executado quando a condição assumir qualquer valor que não seja o definido no se.…então. EXEMPLOS Algoritmo para ler o nome de uma pessoa e escrever na tela uma mensagem de boas-vindas se esta pessoa se chamar Lucca. Variáveis Nome : string Início Escreva “Digite o seu nome : “ Leia nome Se (nome == “Lucca”) então Inicio Escreva “Seja bem-vindo!” Fim Fim Algoritmo para ler um número e escrever uma mensagem na tela informando se este número é maior ou menor que 10. Variáveis Num: inteiro Início Escreva “Digite um número inteiro : “ Leia num Se (num > 10) então Início 29 Escreva “Número é maior que 10” Fim Senão Início Escreva “Número não é maior que 10” Fim Fim Algoritmo para ler um número e escrever na tela o nome da cidade correspondente a este número, sendo, número 1 = Caratinga, número 2 = Ipatinga e número 3 = Cel. Fabriciano. E para qualquer outro número escreva Belo Horizonte. Variáveis Num: inteiro Início Escreva “Digite um número : “ Leia num Se (num == 1) então Início Escreva “Caratinga” Fim Senão Se (num == 2) então Início Escreva “Ipatinga” Fim Senão 30 Se (num == 3) entao Início Escreva “Cel. Fabriciano” Fim Senão Início Escreva “Belo Horizonte” Fim Fim 2.3 OPERADORES LÓGICOS Os operadores lógicos são palavras reservadas que iremos utilizar para juntar duas ou mais condições lógicas. OPERADOR FUNÇÃO E Este operador verifica o valor lógico de duas expressões e retorna um valor lógico VERDADEIRO somente se o valor das duas expressões for VERDADEIRO. Se o valor lógico de pelo uma expressão for falso, o resultado será FALSO. OU Este operador verifica o valor lógico de duas expressões e retorna um valor lógico VERDADEIRO se pelo menos uma das duas expressões for VERDADEIRO. Este operador retornará FALSO somente quando as duas expressões forem FALSAS. NÃO Este operador troca o valor lógico de uma expressão. Se a expressão tem o valor lógico VERDADEIRO, este operador retorna um valor FALSO. Se a expressão tem o valor lógico FALSO, este operador retorna um valor VERDADEIRO. 31 Para utilizar os operadores lógicos “e” e “ou” devemos simplesmente colocá- los entre duas expressões lógicas. Para utilizar o operador lógico “não” devemos colocá-lo à esquerda da expressão lógica em questão. SINTAXE: <expressão lógica> e <expressão lógica> <expressão lógica> ou <expressão lógica> Não <expressão lógica> EXEMPLO: em um determinado concurso público, foi determinado que os candidatos poderiam ter somente entre 30 a 40 anos de idade. Candidatos mais novos que 30 anos e candidatos mais velhos que 40 anos, devem ser eliminados. Elabore um algoritmo para LER a idade de um candidato e ESCREVER na tela uma mensagem informando se ele foi eliminado ou não. Variáveis Idade : inteiro Início Escreva “Informe a sua Idade : “ Leia Idade Se (Idade >=30) e (idade <=40) então Inicio Escreva “Candidato passou para próxima etapa” Fim Senão Início Escreva “Candidato NÃO passou para próxima etapa” Fim fim 32 Todo LAÇO DE REPETIÇÃO independente da Linguagem de programação (estruturada) ou do Tipo de Laço utilizado, tem as seguintes características: Uma variável de controle. Um teste para determinar o momento de parar. Uma estrutura que irá modificar os valores testados. Em um modo geral, todo e qualquer laço de repetição deve ter, uma variável de controle, um valor inicial para esta variável, um teste lógico geralmente realizado nesta variável de controle, e um incremento, decremento ou outra ação que irá modificar o valor desta variável de controle. 2.4 LAÇOS DE REPETIÇÃO Muitas vezes no desenvolvimento de programas temos a necessidade de repetir algum trecho várias vezes, para isso temos duas alternativas, reescrever este trecho de código quantas vezes forem necessárias ou utilizar uma estrutura de repetição que irá pegar um trecho de código e repeti-lo quantas vezes forem necessárias. Com certeza a segunda alternativa é bem melhor que a primeira, você não acha? Imagine que você tem que fazer um algoritmo para ler 5 números. É tranquilo, não é? Basta pedir para o usuário digitar o primeiro número e depois armazená-lo em uma variável, agora vamos pedir o segundo número e depois armazená-lo em outra variável, e assim por diante até chegar no quinto número. Está bem, é tudo muito “bonitinho” e tranquilo de fazer, mas agora imagine você tendo que fazer um algoritmo para a Faculdade Única, que deve ler o nome de todos os seus alunos, que devem ser mais de 200000 (duzentos mil). Faça isso individualmente, pedindo e armazenando nome por nome… Fica complicado não é mesmo? Para isso utilizamos os laços de repetição que são estruturas que repetem o seu conteúdo quantas vezes forem estabelecidas por uma condição. Veremos agora os DOIStipos de laços de repetição mais conhecidos e usados, que são os laços PARA e ENQUANTO. 33 2.4.1 Laço “para” No laço de repetição PARA a estrutura definida dentro do laço irá repetir uma quantidade finita de vezes. Essa quantidade finita de vezes será parametrizada na definição do laço, por uma variável de controle. Vejamos: SINTAXE DO LAÇO “PARA”: Para <variável> = <valor inicial> ate <valor final> Faça Início <o que desejar repetir> Fim; Na estrutura definida acima temos o seguinte: PARA é uma palavra reservada que indica o início da definição do laço de repetição. <VARIÁVEL> é uma variável do tipo inteiro, que será utilizada para controlar a quantidade de vezes que o nosso laço irá repetir (chamamos esta variável de variável de controle, porque é ela que controla o laço). = é o operador de ATRIBUIÇÃO, pois a variável de controle vai receber o valor inicial. <VALOR INICIAL> é o valor inicial que a variável de controle vai receber para iniciar a contagem de LOOP (voltas) do laço. ATE é uma palavra reservada que faz o papel de CHEFE no laço, é ele que verifica se a variável de controle já alcançou o valor final, e é ele que incrementa o valor da variável de controle. <VALOR FINAL> é a condição de parada do laço. Quando a variável de controle atingir este valor, o laço será interrompido. FAÇA é uma palavra reservada que diz ao compilador para executar a próxima linha de comando a cada vez que o laço der um loop (volta). 34 EXEMPLOS: um laço que roda 10 vezes: Primeiro devemos declarar uma variável para este laço. Vamos pensar numa variável X do tipo inteiro. O nosso laço fica da seguinte forma: Para X = 1 até 10 faça O laço acima vai repetir 10 vezes porque na sua declaração foi definido que a variável de controle começa com 1 e vai até 10 contando de 1 em 1. Esta contagem é feita pela palavra reservada ate. Portanto, X começa com o valor 1, quando o laço der um loop (volta) X será incrementado para 2, quando o laço der outro loop (volta) X será incrementado para 3, e assim por diante até que X receba o valor 10. Para lermos o nome e a idade de 10 pessoas, podemos pedir para ler estes dados 10 vezes em nosso programa, ou pedir somente uma vez dentro de um laço, que irá repetir este pedido as 10 vezes que desejamos. Variáveis i,idade : inteiro; nome : string; Início para i = 1 até 10 faça https://www.apoioinformatica.inf.br/produtos/item/14-comandos-de-repeticao http://eletrica.ufpr.br/~rogerio/visualg/Help/linguagem3.htm http://docente.ifsc.edu.br/vilson.junior/ip/IP_03_VisuALG_Repeticao.pdf EDELWEISS,Nina. Algoritmos e programação com exemplos em Pascal e C [recurso eletrônico] / Nina Edelweiss, Maria Aparecida Castro Livi. – Dados eletrônicos. – Porto Alegre: Bookman, 2014. https://integrada.minhabiblioteca.com.br/books/9788582601907 35 Início Escreva “Digite o seu nome: ” Leia nome; Escreva “Digite a sua idade: ” Leia idade; Fim; Fim. O código acima está lendo o nome e a idade de 10 pessoas, usando laço de repetição PARA. 2.4.2 Laço “enquanto” Vimos que no Laço PARA todas as ações estão embutidas na declaração do mesmo, no laço ENQUANTO devemos especificar cada uma das ações executadas pelo laço de repetição. No laço PARA temos a inicialização da variável de controle, o incremento, e a condição de parada em uma só linha, a linha da declaração do laço. No laço ENQUANTO, devemos especificar cada uma destas etapas separadamente. SINTAXE DO LAÇO ENQUANTO enquanto (condição) faça início <comando a executar> fim Onde: ENQUANTO é a palavra reservada que determina o início do laço. 36 Devemos sempre lembrar que o laço enquanto não tem uma área para determinar o valor inicial e o tipo de incremento da variável de controle. Portanto devemos sempre fazer estas duas operações junto com o laço. (condição) é uma condição de parada do laço, o laço ENQUANTO será executado até que a condição seja falsa, ou, enquanto a condição for verdadeira. FAÇA é uma palavra reservada que diz ao compilador para executar a próxima linha de comando a cada vez que o laço der um loop (volta). EXEMPLO: i = 1; Enquanto (i<10) faça Início Escreve “Olá Mundo!” i = i + 1 fim. Reescrevendo o exemplo do laço PARA com o laço ENQUANTO, temos: Variáveis i,idade : inteiro; nome : string; Início i = 1 enquanto (i<10) faça Início Escreva “Digite o seu nome:” Leia nome Escreva “Digite a sua idade:” Leia idade i = i + 1 Fim; Fim. 37 1. Quando temos que tomar algum tipo de decisão ou verificar o conteúdo de alguma variável, devemos utilizar uma Estrutura Condicional ou tomada de decisão PORQUE As tomadas de decisão são realizadas por estruturas condicionais, que avaliam a condição em questão e retornam verdadeiro ou falso de acordo com o resultado da condição. Sobre essas duas afirmativas, é CORRETO afirmar que a) as duas são verdadeiras, e a segunda é uma justificativa correta da primeira. b) as duas são verdadeiras, mas não estabelecem relação entre si. c) a primeira é uma afirmativa falsa; e a segunda, verdadeira. d) a primeira é uma afirmativa verdadeira; e a segunda, falsa. e) as duas são verdadeiras, e a primeira é uma justificativa correta da segunda. 2. Sobre as estruturas condicionais, é correto afirmar que: a) a estrutura condicional verifica uma dada condição e retorna uma resposta de falso se a condição for verdadeira ou uma resposta de verdadeira se a condição for falsa. b) a estrutura condicional verifica uma dada condição e retorna uma resposta de verdadeiro se a condição for verdadeira ou uma resposta de falso se a condição for falsa. c) a estrutura condicional verifica se um bloco de código de condições de roda corretamente ou não no algoritmo. d) uma estrutura condicional é utilizada para repetir determinada parte do algoritmo. e) as estruturas condicionais podem ser utilizadas em diversos pontos dentro dos algoritmos, mas não podem estar uma dentro da outra. 3. Quando temos que tomar algum tipo de decisão ou verificar o conteúdo de alguma variável a) devemos utilizar estrutura de repetição para encontrar o resultado. b) podemos utilizar uma estrutura tipo array. c) devemos utilizar a área de declaração de variáveis. d) vamos encontrar uma situação difícil de resolver. e) devemos utilizar uma Estrutura Condicional ou tomada de decisão. 38 4. Analise a afirmativa abaixo e marque a alternativa que preencha corretamente os espaços em branco na ordem que aparecem no texto. A estrutura condicional verifica uma dada ________ e retorna uma resposta de verdadeiro se a condição for ________ ou uma resposta de ________ se a condição for falsa. a) Verdadeira; condição; falso. b) Estrutura; verdadeira; nula. c) Condição; verdadeira; falso. d) Variável; determinada; falso. e) Informação; analisada; retorno. 5. Avalie a seguintes afirmativas e marque a alternativa correta. I - Os operadores lógicos são palavras reservadas que iremos utilizar para juntar duas ou mais condições lógicas. II - Para utilizar os operadores lógicos “e” e “ou” devemos simplesmente colocá-los entre duas expressões lógicas. III – O operador lógico “não” troca o valor lógico de uma expressão. a) Apenas I está correta. b) Apenas I e II estão corretas. c) Apenas I e III estão corretas. d) Apenas II está correta. e) Todas as alternativas estão corretas. 6. Sobre o trecho de código abaixo, avalie a seguintes afirmativas e marque a alternativa correta. Se (Resultado >= 70) então início Escreva “O aluno está APROVADO”; Fim I – Esta é uma estrutura que pode escrever mais de uma mensagem na tela. II – A mensagem de que o aluno está aprovado será apresentadapara qualquer resultado acima de 70, mesmo sendo um valor muito alto. III – Se o resultado for menor que 70 irá apresentar que o aluno está reprovado. 39 a) Apenas I está correta. b) Apenas II está correta. c) Apenas III está correta. d) Apenas I e II estão corretas. e) Apenas I e III estão corretas. 7. Muitas vezes no desenvolvimento de programas temos a necessidade de repetir algum trecho várias vezes, para isso temos duas alternativas, reescrever este trecho de código quantas vezes forem necessárias ou utilizar uma: a) estrutura condicional. b) forma alternativa. c) variável de controle. d) estrutura de repetição. e) lógica mais elaborada. 8. Todo LAÇO DE REPETIÇÃO independente da Linguagem de programação (estruturada) ou do Tipo de Laço utilizado, tem as seguintes características: a) um corpo que inicia obrigatoriamente com início; uma terminação obrigatória com fim. b) uma tomada de decisão sobre a validade dos valores; uma estrutura complexa que reduz a sua utilização. c) pode declarar diversas variáveis para utilização no programa; pode ter nomes próprios em seu escopo. d) uma variável de controle; um teste para determinar o momento de parar; uma estrutura que irá modificar os valores testados. e) possui uma redefinição de tipos de dados; é utilizado para tomada de decisão; pode aparecer em qualquer lugar do programa. 40 LINGUAGEM DE PROGRAMAÇÃO – C 3.1 INTRODUÇÃO Como vimos nos capítulos anteriores, um algoritmo pode ser definido como uma sequência lógica, bem definida e sem ambiguidade para descrever os passos necessários para se realizar uma tarefa. Estes algoritmos são rotinas computacionais que seguem o conceito básico de sistemas de computador, respeitando o fluxo de Entrada-Processamento-Saída. Estas rotinas, recebem valores de entrada e após o processamento destes, emite uma saída com informações processadas. Os tipos de dados são representações das classes de valores que podemos utilizar em nossos algoritmos (programas). Agora vamos utilizar o termo Programa para representar a codificação de um algoritmo em uma linguagem de programação, e é essa a definição de programa de computador, um algoritmo escrito em uma determinada linguagem de programação e traduzido para a linguagem de máquina. Programação de computadores é uma técnica de estruturar dados, abstrair os modelos reais, transformar as rotinas em fluxo estruturados, bem definidos e sem ambiguidade em uma linguagem de programação, ou seja, construir algoritmos em uma linguagem de programação e depois transformá-lo em um programa executável. Uma linguagem de programação é um conjunto de regras para criação de algoritmos que serão traduzidos em linguagem de máquina que define instruções a serem realizadas por um computador (Cebesta, 2003). UNIDADE 41 3.2 ESTRUTURA BÁSICA DE UM PROGRAMA C A linguagem de programação C é uma linguagem de programação que há muito tempo está consolidada no mercado e é extensamente utilizada como meio didático para o ensino de Linguagens de Programação e Programação de Computadores. Apesar da baixa produtividade em função de não ter componentes já prontos, o uso da linguagem C se justifica pela sua sintaxe e poder de processamento e execução. Basicamente quase todas as linguagens de programação existente hoje em dia são baseadas na linguagem C, então, um profissional que conhece de lógica de programação e conhece a estrutura de comandos e sintaxe da linguagem C, consegue programar em qualquer outra linguagem com o mínimo de esforço e dedicação. Basicamente tudo na linguagem C é função. Vamos falar mais à frente sobre funções, mas basicamente, uma função consiste em um bloco de códigos que recebe um nome e é executado sempre que seu nome é chamado. Todo programa, escrito em qualquer linguagem de programação, precisa de um ponto inicial de execução, ou seja, de uma definição de qual parte do algoritmo (código) será executada primeiro. Na linguagem C, devemos criar uma função chamada de “main” (principal). Esta é a definição do ponto de início de execução do seu algoritmo (programa). A sintaxe de um código é a forma geral de escrita deste código, geralmente de forma explicativa e ilustrativa. Toda função na linguagem C tem um nome seguido de parêntesis e um corpo de execução limitado por chaves, Veja: main() { } Na definição acima, temos a declaração de uma função principal. Main é o nome da função, os parêntesis são utilizados para representar que este nome é definitivamente uma função (nos capítulos seguintes trataremos um pouco mais sobre funções e conheceremos algumas formas de utilizar estes parêntesis). As chaves são utilizadas para limitar blocos de código, sempre utilizamos { (abre chaves) para iniciar um bloco de código e } (fecha chaves) para finalizar um bloco de código. 42 Veja mais sobre identação em: https://pt.stackoverflow.com/questions/190450/qual-%C3%A9-a- import%C3%A2ncia-de-indentar-o-c%C3%B3digo https://compilandotudo.wordpress.com/2009/09/10/a-importancia-da-identacao-do- codigo-na-programacao/ https://pt.wikipedia.org/wiki/Indenta%C3%A7%C3%A3o Podemos escrever nossos programas de diversas formas, inclusive se você quiser, pode escrever um programa inteiro em somente uma linha. Os exemplos abaixo ilustram estas possibilidades de escrita dos códigos. Por questão de organização e melhor legibilidade vamos adotar o ultimo código como estrutura de escrita dos nossos programas. A forma de escrever um programa, sua organização visual, é chamada de identação. Uma boa identação consiste em um código escrito de maneira fácil para a leitura e identificação das instruções contidas no mesmo. main() { } main() { } main() { } É uma boa prática de programação deixar informações nos seus códigos indicando o motivo de alguns comandos ou explicando a necessidade algumas operações. Para isso existe a opção de adicionar comentários junto ao código desenvolvido. Um comentário é um texto no meio do seu código que não será compilado e não será utilizado pelo programa, ele serve somente para informar alguma coisa para a pessoa que estiver lendo o seu programa fonte. Basicamente podemos utilizar dois tipos de comentários, os comentários de linha ( // )e os comentários de bloco (/* */). O comentário de linha ( // ) comenta a linha até o seu fim. Tudo que vier depois das duas barras // não será interpretado pelo compilador e não fará parte do seu programa. 43 O comentário de bloco abre uma área para digitação de texto comentado, e tudo que estiver após /* e antes do */ não será interpretado pelo compilador. Exemplo: int main() //esta é a declaração da função main; { //início do bloco main() int valor; //estou declarando esta variável para ler o valor. /* As variáveis n1 e n2 servem para controlar a quantidade mínima e máxima do valor informado no programa. Estas variáveis forma criadas para testar a funcionalidade do comentário de bloco, ondo eu utilizo mais de uma linha para explicar o motivo de utiliza estas variáveis em meu código. */ floar n1, n2; } //final do bloco main() 3.2.1 Blocos de comandos Os blocos de comandos são uma sequência de linhas de código agrupadas para executarem juntas, uma após a outra. Os blocos servem para limitar o corpo de execução das estruturas, como por exemplo dentro de uma função ou dentro de uma estrutura de repetição. As linhas de código de um bloco de comandos são limitadas pelas palavras reservadas que determinam o início e o fim de estruturas. Na linguagem C as limitações de início e fim são representadas por { (abre chaves) e por } (fecha chaves). 3.3 A FUNÇÃO MAIN() Como citamos anteriormente, a função main(), também conhecida como funçãoprincipal ou função de início, é a função que irá indicar para o compilador onde deverá iniciar a execução do programa (quando este for transformado em um código de máquina). Esta função é obrigatória e deve ser implementada em algum lugar do programa para marcar o ponto de início da execução do mesmo. 44 Nem todas a linhas de código são finalizadas com o ponto e vírgula ( ; ), somente as linhas de comandos de instrução que possuem esta definição de encerramento. As linhas de Declarações de funções, Estruturas Condicionais, Estruturas de Repetição, abertura e fechamento de bloco, dentre outras, não possuem ponto e vírgula ( ; ). No decorrer desta apostila iremos demonstrar onde tem e onde não tem ponto e vírgula no final das linhas. Veja um pouco mais sobre este assunto nas referências abaixo: http://excript.com/cpp/indentacao-espaco-em-branco-ponto-e-virgula-cpp.html https://www.inf.pucrs.br/~pinho/LaproI/IntroC/IntroC.htm No corpo de execução da função main(), bem como em todas as outras funções que podemos criar, podemos escrever qualquer comando ou instrução pertencente à linguagem. Todos os comandos de instrução devem ser encerrados com um ponto e vírgula ( ; ) para indicar ao compilador que a instrução se encerra naquele ponto e tudo que vier posterior faz parte de uma nova instrução. No decorrer de nosso estudo vamos identificar e assimilar o que é uma instrução e o que não é uma instrução (comando). 3.4 BIBLIOTECAS E FUNÇÕES COMPLEMENTARES A estrutura básica da linguagem C é muito enxuta e robusta e não possui todas as definições de comandos e estruturas que precisamos para trabalham adequadamente. Por isso, a linguagem C trabalho com o conceito de declaração de bibliotecas. As bibliotecas são coleções de funções/comandos complementares para proporcionar todo o poder de desenvolvimento na linguagem C. Todo compilador C vem com um conjunto de bibliotecas mais comuns para uso geral, no decorrer de nosso estudo iremos conhecer algumas bibliotecas deste conjunto, sempre que forem necessárias. A primeira coisa que devemos fazer em nossos programas escritos na linguagem C é definir as bibliotecas que iremos utilizar, antes mesmo de declarar a função main(). 45 http://linguagemc.com.br/a-biblioteca-padrao-da-linguagem-c/ http://linguagemc.com.br/bibliotecas/ Para declarar uma biblioteca (ou cabeçalho) usamos a diretiva de declaração #include. Sintaxe: #include<nome_biblioteca.extensao_biblioteca> Ex.: #include<stdio.h> #include<string.h> 3.5 CONSTANTES E VARIÁVEIS Constantes e Variáveis são as principais formas de utilização de tipos de dados e memória nas linguagens de programação. As constantes, como o nome sugere, são definições fixas. Elas representam valores predefinidos que podem ser utilizados no decorrer de um programa. Sempre utilizamos nomes para identificar estes valores. No decorrer de um programa que realiza operações matemáticas, onde precisarem utilizar o valor de PI ( 𝜋 ) em diversos locais dentro deste programa, podemos utilizar a notação numérica de pi (3.14159265359) ou, uma vez que este valor nunca muda, podemos utiliza uma constante de ntro de nosso programa para representar este item. Para declarar uma constante utilizamos a palavra reservada #define, seguida do nome da constante, seguindo do seu valor. Ex. #define pi 3.14159265359 Uma vez declarada uma constante, podemos utilizar o seu nome em substituição ao seu valor. No caso do exemplo acima, toda vez que precisar utilizar o valor de PI, basta usar o nome da constante declarada para ele, pi. 46 O valor de uma constante não pode ser alterado no decorrer do programa, somente em sua declaração. Uma variável é uma definição de memória que utilizamos para armazenar alguma informação de entrada ou de processamento do nosso programa. As variáveis são utilizadas para armazenar valores. Quando estamos trabalhando com computadores, estamos na verdade manipulando informações que estão em sua memória. Em um programa de computador, para realizar a soma de dois números, por exemplo, estes números devem estar armazenados na memória, e o resultado também deve ser armazenado na memória. Portanto, todo dado que for trabalhado no seu programa deve estar na memória. Para utilizar um dado valor em nosso programa, precisamos colocar este valor na memória do computador para ser tratado. Uma variável é um pedaço da memória que é reservada para utilização no seu programa. Na linguagem C, toda variável deve ser declarada, ou seja, sempre é necessário informar para o compilador que precisamos de um espaço na memória. No exemplo citado acima, onde temos dois números para serem somados e o resultado guardado na memória, devemos declarar (reservar espaço na memória) três variáveis, uma para cada número da soma e outra para o resultado. A linguagem C é uma linguagem tipada, ou seja, deve-se conhecer o tipo de dados de cada informação a ser tratada previamente. O tipo de dados define a classe de valores que contem na informação, por exemplo, números inteiros, letras, números com casas decimais, textos, etc. Para declarar uma variável devemos indicar o tipo de dados e o nome da variável, finalizando com ponto e vírgula. Se uma variável é uma parte da memória do computador que é reservada para a utilização no meu programa, então a quantidade de variáveis que posso ter está limitada à quantidade de memória disponível que temos no computador que o programa está executando. 47 Veja o exemplo abaixo que declara uma variável inteira chamada número e atribui o valor 20 a esta variável: main(){ int número; idade = 20; } A sintaxe da declaração de variáveis é dada pelo tipo de dados predominante desta variável seguido do nome que daremos a esta porção de memória para conseguirmos acessá-lo posteriormente. As declarações de variáveis sempre terminam com ponto e vírgula. Podemos declara somente uma variável, informando o seu tipo, o seu nome e ponto e vírgula, ou declarar mais de uma variável do mesmo tipo, informando o tipo e os nomes das variáveis desejadas separadas com vírgula, mas no final da linha sempre devemos digitar o ponto e vírgula. - tipo_de_dados nome_da_variável; - tipo_de_dados nome1, nome2, nome3, ...; Tipos de dados básicos Os tipos de dados são definições da linguagem para representar conjuntos (classes) de valores, eles servem para informar ao compilador que tipo de valor desejamos colocar em nossas variáveis, isso é importante para o programa conseguir determinar o tamanho de memória que deverá ser alocado para cada variável declarada. Cada tipo de dado tem um nome e é capaz de armazenar uma certa quantidade de memória determinada em bytes. A tabela abaixo relaciona os principais tipos de dados da linguagem C com seus respectivos tamanhos e faixa de valores que podem assumir. Tipo Bytes Escala char 1 -128 a 127 int 2 -32.768 a 32.767 float 4 3.4e-38 a 3.4e+38 double 8 1.7e-308 a 1.7e+308 void 0 Sem valor (vazio) 48 A linguagem de programação C é sensível à caixa (case sensitive), ou seja, ela faz distinção entre letras maiúsculas e minúsculas. Portanto única é diferente. Também podemos utilizar alguns modificadores de tipos para aumentar a capacidade de armazenamento das variáveis ou mesmo para limitar a utilização de algum tipo de valor. O modificador long associado ao tipo de dado, dobra o tamanho de armazenamento do mesmo. O modificado unsigned não permite valores negativos, deixando a faixa de valores que o tipo de dados pertence sempre iniciando de 0 (zero). long int (4 bytes) unsigned char (0 a 255) unsigned int (0 a 65.535) Declarando algumas variáveis a título de exemplo: int idade; float nota1, nota2, nota3; long int código; char letra;int número, valor, escolha, op01; Existem algumas regras para definição dos nomes das variáveis, segui-las é muito importante para evitar que erros aconteçam no seu programa: - Não podemos utilizar caracteres especiais e nem acentuação (exceto underline); - Deve sempre iniciar com uma letra (maiúscula ou minúscula) ou com o símbolo de _ (underline), não podendo iniciar com número; - Não pode ser igual às palavras reservada da língua. Ex. int, main, printf, dentre outros. - Não pode ter espaço em branco, ou seja, valor total não é um nome válido. Devemos utilizar valor total ou valor_total; 49 3.6 ENTRADA E SAÍDA DE DADOS Entrada e Saída consistem nas operações de inserir e retirar informações de sistemas de computador. Estamos sempre pensando no sistema, então, entrada é a tarefa de “entrar” com informações no sistema, é o momento que iremos enviar alguma coisa para a memória utilizada pelo sistema. Saída é a tarefa de “retirar” informações do sistema, é a saída de dados do mesmo, é quando uma mensagem é exibida na tela, uma informação é gravada no banco de dados ou enviada para a impressora. 3.6.1 A Função printf() A função printf() é uma função utilizada para saída de dados, ou seja, para enviar informações do sistema para a tela do computador. Ela pertence à biblioteca básica de I/O (input/output ou entrada/saída) que é usada em C. Ela não faz parte da definição da linguagem e necessita ser importada com a declaração de uma biblioteca. Algumas bibliotecas já implementam a função printf em seu escopo, a principal é stdio.h. Geralmente as biblioteca tem um nome reduzido de suas funcionalidade, stdio.h por exemplo, é a redução de Standard Input/Output, ou seja, entrada e Saída padrão. O .h é a extensão do arquivo de biblioteca da linguagem, h de Header, ou Cabeçalho. Sintaxe da função printf() printf(“texto a exibir”, lista de argumentos); Exemplo: main(){ printf(“Amo física”); //escreve Amo física na tela. } A função printf sempre exibe um texto na tela. O primeiro parâmetro desta função, o “texto a exibir” é obrigatório para o seu funcionamento e deve conter o que se deseja que apareça. Utilizamos a “lista de argumentos” quando desejamos exibir na tela o valor de variáveis ou constantes no nosso programa. Para isso a função printf utiliza de alguns caracteres de controle para auxiliar na junção de texto com variáveis. Sarah Henrique Highlight Sarah Henrique Highlight 50 Para exibir alguma variável, é preciso inserir o código de formatação do tipo de dados desta variável junto ao texto da função printf e colocar o nome da variável na lista de argumentos. Se tivermos mais de uma variável, estas devem ser separadas por vírgula. Vejamos alguns exemplos de utilização da função printf: printf(“Olá mundo, meu primeiro programa em C”); printf(“Posso escrever o número 1, assim.”); printf(“Ou posso escrever o número %d, assim”,1); printf(“O valor de X é igual a %f”, x); O primeiro printf simplesmente exibe um texto. O segundo printf também somente exibe um texto, veja que o número 1 neste exemplo faz parte do texto. O terceiro printf utiliza lista de argumentos, onde no texto é inserido um código de formatação (%d) no lugar onde desejamos que o número apareça e na lista de argumento colocamos o número desejado. Neste caso o resultado é mesmo que colocar o número diretamente no texto. O quarto printf também utiliza uma lista de argumentos, mas dessa vez ela é obrigatória, pois estamos inserindo uma variável junto ao texto. O valor da variável irá aparecer no texto no lugar do código de formatação, que neste caso é o %f. Caracteres de controle Código Descrição \n Nova linha \r Retorno do cursor \t Tabulação \b Retrocesso (backspace) \” Aspas \\ Barra \0 Nulo Código de formatação Código Descrição %c Caractere (char) %x Hexadecimal %d Decimal (int) 51 Sempre que o valor de uma variável for modificado por uma função, como no caso do scanf, o nome desta variável deve ser precedido por um sinal de &. Isso é a característica de tratamento de memória, também chamado de ponteiros, da linguagem C. https://pt.stackoverflow.com/questions/125793/qual-o-significado-do-operador-e- comercial-na-linguagem-c http://linguagemc.com.br/operacoes-de-entrada-e-saida-de-dados-em-linguagem-c/ http://linguagemc.com.br/ponteiros-em-c/ https://www.inf.pucrs.br/~pinho/LaproI/Funcoes/AulaDeFuncoes.htm %e Notação científica %f Ponto flutuante (float) %o Octal %s Cadeia de caracteres (string) %u Decimal sem sinal 3.6.2 A função scanf() A função scanf () é uma função utilizada para entrada de dados, ou seja, para enviar informações para o sistema, geralmente em uma variável declarada na memória. Ela pertence à biblioteca básica de I/O (input/output ou entrada/saída) que é usada em C. Ela não faz parte da definição da linguagem e necessita ser importada com a declaração de uma biblioteca. Algumas bibliotecas já implementam a função scanf em seu escopo, a principal é stdio.h. Sintaxe: scanf(“código de formatação”, lista de argumentos); O principal objetivo da função scanf é obter um valor (geralmente via teclado) e armazenar o mesmo em uma variável. Em sua sintaxe, o “código de formatação” é o código referente ao tipo de dados que será tratado e a lista de argumentos são os nomes das variáveis que se deseja inserir os valores lidos. Na função scanf sempre devemos utilizar o sinal de & (‘e’ comercial) antes do nome da variável que receberá o valor. Sarah Henrique Highlight 52 Exemplos: main(){ int num; printf(“Digite um número: “); scanf(“%d”,&num); printf(“O número digitado foi %d”,num); } main(){ char letra; printf(“Digite uma letra: “); scanf(“%c”,&letra); printf(“A letra digitada foi %c”,letra); } 3.6.3 – Entrada e saída com getchar, getch e putchar getchar() A função getchar() tem como objetivo ler um caractere (uma letra) do teclado com a obrigatoriedade de pressionar enter após a digitação do caractere, ou seja, deve-se digitar a letra desejada e teclar entre em seguida para confirmar a leitura da letra e passar o valor da mesmas para a variável que receberá este valor. Sintaxe: getchar(); Exemplo: char letra; letra = gechar(); No exemplo acima, após digitar uma letra e teclar entre, o valor digitado será armazenado na variável letra. Getch() A função getch() tem o seu funcionamento muito parecido com a função getchar(), porém, esta não requer a digitação de enter após digitar a letra desejada, ou seja, a leitura do valor digitado é imediatamente após a digitação do mesmo, não sendo necessário teclar enter para confirmar a leitura. Sintaxe: getch(); 53 Exemplo: char letra; letra = gech(); No exemplo acima, após digitar uma letra, o valor digitado será imediatamente armazenado na variável letra. Putchar() A função putchar() exibe um caractere na tela. Ela recebe como parâmetro uma letra (constante) ou uma variável do tipo char e exibe este valor na tela. #include<stdio.h> main() { char letra; printf(“Digite um caractere: “); letra = getchar(); putchar(letra); putchar(‘a’); } O exemplo acima solicita a digitação de um caractere e em seguida escreve o caractere digitado e logo depois a letra a. 3.7 OPERADORES ARITMÉTICOS Assim como vimos nos algoritmos e lógica de programação no Capitulo 1, os operadores aritméticos nos permitem realizar operações aritméticas básicas em linguagens de programação. Estes operadores fazem parte do pacote de operações elementares da linguagem e podem ser utilizados para as operações de adição, subtração, multiplicação, divisão e o que chamamos em linguagens de programação de módulo (informar o resto da divisão entre dois números). Os operadores não +, -, *, / e %, que realizamas operações de adição, subtração, multiplicação, divisão e módulo, respectivamente. Estes operadores sempre recebem dois valores, um a sua esquerda e outro à sua direita e retornam o resultado da operação sobre estes valores. Vejamos um programa com exemplos destas operações: #include<stdio.h> main() { int valor1, valor2; 54 printf("Digite um número: "); scanf("%d",&valor1); printf("Digite outro número: "); scanf("%d",&valor2); printf("A soma dos números é = %d",(valor1+valor2)); printf("A diferença dos números é = %d",(valor1-valor2)); printf("A multiplicação dos números é = %d",(valor*valor2)); printf("A divisão do primeiro pelo segundo número é = %f",(valor1/valor2)); printf("O resto da divisão do primeiro número pelo segundo é %d",(valor1%valor2)); } No exemplo acima foi solicitado ao usuário a digitação de dois números. Após informar os números e teclar entre o programa apresenta o resultado das operações aritméticas sobre estes números digitados. Existem dois operadores aritméticos especiais, são os operadores aritméticos de incremento e decremento, que somam uma unidade à variável aplicada ou subtraem uma unidade, respectivamente, ++, --. Estes operadores são utilizados diretamente ligados às variáveis que desejamos incrementar ou decrementar. Sintaxe: Variável operador especial Note que para exibir o resultado das operações de adição, subtração e multiplicação foi utilizado o caractere de formatação %d, pois o resultado destas operações é sempre igual ao tipo de dados dos valores utilizados. Note que para exibir o resultado da divisão foi utilizado o caractere de formatação %f, pois o resultado da divisão sempre é obtido com casas decimais (mesmo que sejam de valor zero) e o tipo de dados padrão para casas decimais é o float. 55 Exemplo: x++; y-- No exemplo acima, temos que a variável x será somada uma unidade e a variável y será subtraída uma unidade. main() { int numero = 2; printf(“%d”,numero); numero++; printf(“%d”,numero); } Neste código temos a declaração de uma variável chamada número e a atribuição do valor 2 a esta variável. No primeiro printf ao escrever o valor da variável número, o sistema apresenta o número 2 na tela. Na linha seguinte, o operador de incremento adiciona uma unidade à variável número, ou seja, é a mesma coisa que utilizar numero = numero + 1, passando o seu valor para 3. O último printf, ao escrever o conteúdo da variável número na tela, apresenta o valor 3. Temos ainda outros tipos de operadores aritméticos que são muito úteis no dia- a-dia de programação. Estes operadores simplificam algumas ações. Os operadores aritméticos de atribuição fazem a operação aritmética correspondente e ao mesmo tempo atribuem o resultado a uma variável. Estes operadores são +=, -=, *=, /=, %=. Vamos tratar o primeiro como exemplo, sabendo que o mesmo se aplica a todos eles. O operador += soma dois valores e ao mesmo tempo atribui o resultado e uma variável. Este operador recebe uma variável à sua esquerda e um valor (constante ou variável) à sua direita. Sintaxe: variável += expressão Exemplo: x += 2; No exemplo acima estamos pegando o valor de x, somando 2 com este valor e atribuindo o resultado à própria variável x. 56 main() { int x,y; x = 3; y = 2; x += 2; y += x; } Neste código acima, temos duas variáveis, x e y. Inicialmente estamos atribuindo o valor 3 à variável x e o valor 2 à variável y. A operação x += 2 pega o valor de x, soma com dois e atribui o resultado ao próprio x. No final desta operação do nosso exemplo, a variável x contém o valor 5. A operação y += x faz a mesma coisa com a variável y, mas dessa vez não soma com valor constante e sim com o valor de uma variável. Uma vez que já aplicamos uma operação à variável x e seu valor foi alterado para 5, esse será o valor utilizado na atribuição de y, com isso, a operação y += x, pega o valor de y (2) e soma com o novo valor de x (5) e atribui o resultado à variável y, que receberá 7. 3.8 OPERADORES RELACIONAIS Os operadores relacionais, como o nome sugere estabelecem uma relação entre os operandos a qual são associados. Estes operadores servem para estabelecer uma relação de comparação entre os operando, retornando um valor de Verdadeiro ou Falso de acordo com o resultado de seus valores. A tabela abaixo apresenta os operadores relacionais e sua funcionalidade OPERADOR DESCRIÇÃO > Maior que >= Maior ou igual a < Menor que <= Menor ou igual a == Igual a (igualdade) != Diferente de 57 Estes operadores comparam dos valores e informam a relação entre eles, retornando verdadeiro ou falso. Em C não existe um tipo de dados específico para representar valores booleanos (verdadeiro ou falso), então ele utiliza valores numéricos para auxiliar nesta situação, tomando como padrão a definição de que o número 0 (zero) representa o valor falso e qualquer coisa diferente de 0 (zero) representa um valor verdadeiro. 58 1. Analise a afirmativa abaixo e marque a alternativa que preencha corretamente os espaços em branco na ordem que aparecem no texto. Uma linguagem de _____ é um conjunto de _____ para criação de algoritmos que serão traduzidos em linguagem de máquina que define instruções a serem realizadas por um _____. a) computador; programação; software. b) conversa; palavras; ser humano. c) máquina; ações definidas; software. d) programação; regras; computador. e) conversação; gramáticas; computador. 2. Avalie a seguintes afirmativas e marque a alternativa correta. I – Um algoritmo pode ser definido como uma sequência lógica, bem definida e sem ambiguidade para descrever os passos necessários para se realizar uma tarefa. II – Os tipos de dados são representações das classes de valores que podemos utilizar em nossos algoritmos. III – Programação de computadores é uma técnica de concerta computadores, transformando suas características físicas e tornando mais eficiente. a) Apenas I está correta. b) Apenas I e II estão corretas. c) Apenas I e III estão corretas. d) Apenas II está correta. e) Todas as alternativas estão corretas. 3. Avalie a seguintes afirmativas e marque a alternativa correta. I – A linguagem de programação C é uma linguagem de programação mais recente no mercado e por isso é extensamente utilizada como meio didático para o ensino de Linguagens de Programação e Programação de Computadores. II – Todas as linguagens de programação existente hoje em dia são baseadas na linguagem C, então, um profissional só precisa estudar a linguagem C para conseguir programar em todas as outras. III – Apesar da baixa produtividade em função de não ter componentes já prontos, o uso da linguagem C se justifica pela sua sintaxe e poder de processamento e execução. 59 a) Apenas I está correta. b) Apenas I e II estão corretas. c) Apenas I e III estão corretas. d) Apenas III está correta. e) Todas as alternativas estão corretas. 4. Analise o trecho de código abaixo e marque a alternativa correta. main() { } a) Este trecho de código representa a sintaxe básica de uma função qualquer na linguagem C. b) Este trecho de código representa a sintaxe básica de uma função principal na linguagem C. c) Este trecho de código representa a sintaxe básica de uma função recursiva na linguagem C. d) Este trecho de código representa a sintaxe básica da única função admitida na linguagem C. e) Este trecho de código representa a sintaxe básica de uma função secundária na linguagem C. 5. Avalie a seguintes afirmativas e marque a alternativa correta. I – Um comentário é um comando no meio do seu código que serve, além de uma função a ser compilada do sistema, para informar
Compartilhar