PROFª. ANGELINA V.S. MELARÉ [email protected] Linguagem C 10101 INFORMÁTICA II 2009 SUMÁRIO Linguagem C ................................................................................................................................................................. 3 Processo de Compilação ............................................................................................................................................... 4 Ciclo de Vida do Programa ........................................................................................................................................... 4 Estrutura do Programa na Linguagem C ....................................................................................................................... 8 Variável ....................................................................................................................................................................... 11 Operadores Aritméticos .............................................................................................................................................. 14 Funções de Entrada e Saída Formatada ....................................................................................................................... 16 Exercício Resolvido .................................................................................................................................................... 18 Expressão Relacional e Lógica ................................................................................................................................... 19 Estruturas de Decisão (condicional) ............................................................................................................................ 21 Tipos de Estruturas de Condição................................................................................................................................. 24 Exercícios Resolvidos – .............................................................................................................................................. 27 Estrutura de Decisão ................................................................................................................................................... 27 Bibliografia Consultada .............................................................................................................................................. 54 LINGUAGEM C AULA 1 A linguagem C foi desenvolvida por programadores, para programadores. Ela se popularizou rapidamente devido sua portabilidade, velocidade, segurança e eficiência. Com ela é possível desenvolver desde um simples sistema tradicional (sistema de recursos humanos) até mesmo um programa de sistema (sistema operacional, aplicativos , entre outros). Origens da linguagem C A linguagem C foi criada por Dennis Ritchie em 1972. Sua origem foi através da linguagem BCPL, desenvolvida por Martin Richards, que influenciou Ken Thompson a criar o B, que levou a linguagem C. Com a popularização dos microcomputadores houve um aumento no desenvolvimento de compiladores C, criando discrepâncias entre eles. Para resolver essa situação, o órgão americano de padronização (American National Standards Institute), em 1983, criou C padrão ANSI, estabelecendo uma definição padronizada da linguagem C. A maioria dos compiladores são compatíveis com esse padrão. A linguagem C++ foi construída sobre os fundamentos da linguagem C e dá suporte para a programação orientada a objetos. Existem vários ambientes de desenvolvimento para a linguagem C, como: DEV-C++, Visual C++, Turbo C, C#. Resumo histórico • 1966 – BCPL (Martin Richards) • 1970 - B (Ken Thompson) • 1972 – C (Dennis Ritchie e Ken Thompson) • 1978 - C K&R (Kernigham e Ritchie) • 1983 - C padrão ANSI - órgão americano de padronização (American National Standards Institute) – O padrão ANSI definiu o conteúdo e a forma da biblioteca padrão C. • 1985 - C++ (é o C projetado para suportar Programação Orientada a Objetos). Características e Vantagens: • Facilidade de aprendizagem de outras linguagens de programação, inclusive as orientadas a objetos; • É constituído por funções (divisão de rotinas); • Linguagem estruturada • Ferramenta poderosa de desenvolvimento– pode usada para desenvolver um editor de texto ou mesmo uma calculadora • Portabilidade • Linguagem compiladora PROCESSO DE COMPILAÇÃO E CICLO DE VIDA DO PROGRAMA AULA 2 Linguagem C Compiladora ou Interpretadora? A linguagem de programação pode ser compiladora ou interpretadora. O que as distingue é a forma com que elas executam o programa . O interpretador lê o código fonte linha a linha, executando-as em seguida; já o compilador, lê o código fonte inteiro, e se este não tiver erros de sintaxe, será convertido em um código de máquina, fazendo com que o processador consiga entendê-lo e executá-lo. Se forem feitas alterações no programa, este terá que ser compilado novamente, gerando um novo código de máquina. Um computador só pode executar programas em linguagem de máquina. Cada programa executável é uma seqüência de instruções que o processador interpreta e executa as operações correspondentes. O código fonte é a tradução dos comandos do pseudocódigo para as respectivas instruções da linguagem de programação C. Essas instruções em C depois são traduzidas para a linguagem da máquina. O arquivo objeto somente é gerado quando o arquivo fonte não possui erro de sintaxe. Ciclo de Vida do Programa Criação do programa Depois de solucionado o problema e escrito o algoritmo em pseudocódigo, este deve ser passado para uma linguagem de programação, ou seja, codificado. Na nossa disciplina será usada a linguagem de programação C. O programa digitado se chama arquivo fonte, e deve ser salvo com a extensão .CPP (c plus plus) ou .C. Se não for digitada a extensão, será assumirá a extensão padrão do compilador ( .cpp). Para executar esse programa é necessário compila-lo e linka-lo. Na compilação as instruções (linhas) são verificadas e interpretadas pela máquina (CPU), se não houver erros de sintaxe, será gerado o arquivo executável (extensão .exe). O linkeditor (linker), junta os arquivos das bibliotecas usados pela linguagem C com os arquivos fontes criados pelo programador. Para ver o programa funcionando basta digitar seu nome ou dar um duplo clique no ícone do programa, de acordo com o ambiente que você estiver (texto ou gráfico). Os erros de lógica só podem ser detectados pelo programador e depois de gerado o arquivo executável. O ciclo de criação de um programa em C pode ser analisado abaixo, na seqüência de figuras abaixo. arquivo fonte arquivo biblioteca arquivo fonte ... arquivo objeto arquivo objeto Linkedição arquivo executável Exemplo: AMBIENTE DE DESENVOLVIMENTO DEV-C++ AULA 3 Ambiente integrado O DEV-C++ é um ambiente integrado e visual de desenvolvimento para a linguagem de programação C e C++, que inclui um local para digitação do programa (editor de texto), um compilador (gcc - Gnu C Compiler) e o linkeeditor. Pode-se digitar o programa em outro editor de texto, como por exemplo, o Word, devendo ter o cuidado de salvá-lo como um arquivo texto, sem qualquer tipo de formatação. O DEV-C++ pode ser adquirido gratuitamente pelo site http://www.bloodshed.net/devcpp.html. A versão mencionada nesta apostila é a versão 4.9.8.0, em português. Digitação do programa Para a digitação do programa no DEV-C++ é necessário seguir os seguintes passos: 1. No menu escolha a opção Arquivo (File); 2. Escolha a opção Novo (New) e depois Arquivo Fonte (Source File) ou se preferir a tecla de atalho <CTRL> e <N> simultaneamente; 3. Aparecerá uma nova janela, com o título: (*) Sem Título 1, onde deve ser feita a digitação do programa fonte. 4. Dependendo da versão, ou mesmo da configuração pré-definida no editor, aparece um programa inicial. Pode-se apagá-lo ou deixá-lo, aproveitando as linhas de código já digitadas. Gravação do programa Após a digitação do programa, ele deverá ser salvo antes de ser executado, de acordo com as etapas abaixo: 1. No menu Arquivo escolha a opção Salvar ou use a tecla de atalho <CTRL> e <S> simultaneamente. 2. Escolha o diretório de trabalho, digite o nome do arquivo fonte e pressione o botão Salvar. Observe que a extensão padrão do DEV-C++ é o .cpp. Ao salvar o arquivo fonte, cuidado para não salva-lo com nome inválido ou com o mesmo do Compilação e execução do programa Existem diversas maneiras de ver se o programa está sem erros e funcionando, entre elas: 1. Escolhendo a opção Executar (Execute) do menu e dentro dela a opção Compilar e Executar (Compile and Run); ou 2. Pressionando a tecla de função <F9> ou <F10>, dependendo da versão ou 3. Procurando na barra de ferramentas a opção Compilar e Executar. Se você quiser apenas verificar se existem erros no programa, poderá inicialmente compila-lo (através do menu Executar, opção Compilar) e futuramente executa-lo (através do menu Executar, opção Executar). Ao ser executado o programa, o compilador abrirá uma janela como na figura abaixo: Configurando o ambiente e o editor As configurações padrões do compilador, do ambiente e do editor de texto podem ser alteradas indo no menu Ferramentas e escolhendo a opção a ser modificada, conforme a figura ao lado. Procure personalizar o seu ambiente de trabalho, criando atalhos e facilidades no processo de digitação e compilação. Uma boa forma de configurar o editor é criar um modelo inicial de programa fonte, ou seja, toda vez que for iniciado um novo arquivo irá aparecer o modelo que você definiu. As linhas de comandos e bibliotecas mais comuns ficam digitadas neste modelo. Para criar o modelo de código padrão escolha a opção Ferramentas, depois Opções do Editor e a guia Código. Na parte inferior clique no Código Fonte Padrão e digite seu código fonte. ESTRUTURA DO PROGRAMA NA LINGUAGEM C AULA 4 Um programa escrito na linguagem C tem uma estrutura um pouco diferente de um programa escrito em outra linguagem, como Pascal. Em C, se trabalha com funções e bibliotecas. Um programa precisa ter necessariamente uma função principal (main), que define onde é iniciada a execução do programa. Veja o exemplo abaixo: Estrutura básica Um programa feito na linguagem C é constituído basicamente de: Cabeçalho: • Diretivas de pré-processamento, onde podem ser definidas constantes e incluídos arquivos de cabeçalho. • Declaração e inicialização de variáveis globais. Bloco de instruções: um bloco principal (função main) e outros blocos de rotinas. Documentação do programa: comentários. Diretivas As diretivas do pré-processador iniciam com o símbolo # e cada diretiva deve ser escrita em linha distinta. As diretivas instruem o compilador dentro do código-fonte do programa em C. As diretivas do padrão C ANSI a serem usadas são: #include, #define. O pré-processador do C é um programa que examina o arquivo fonte e executa as devidas modificações com base nas diretivas. O compilador antes de tudo localiza a função na biblioteca e adiciona seu código ao código do arquivo fonte. #include Essa diretiva quando lida faz a inclusão de um arquivo de cabeçalho ao arquivo-fonte. Exemplo: #include <stdio.h> arquivo de cabeçalho: stdio.h – Std standard padrão – – – – I input O output Funções padrões de entrada e saída Funções associadas: scanf(), printf() #define Essa diretiva define um identificador (constante simbólica) e uma string que o substituirá toda vez que for encontrado no código-fonte. Estrutura: #define identificador string Exemplo: #include <stdio.h> #define ESCREVA printf #define TEXTO “\nProgramação de Computadores” main() { ESCREVA(TEXTO); } Ao ser executada a diretiva #define, o compilador associa a palavra escreva a palavra printf e toda vez que aparecer a palavra escreva ele a substituída por printf e a palavra texto será substituída por “\nProgramação de Computadores”. Arquivos de Cabeçalho (header) Cada função definida na biblioteca C tem seu respectivo arquivo de cabeçalho, ou seja, se você utilizar uma função de entrada -scanf()- terá que incluir seu respectivo arquivo de cabeçalho (stdio.h) no início do programa. Esse arquivo possui a definição de tipo e o protótipo da função. Os arquivos com a extensão .h, são chamados de arquivos de cabeçalho, ou header files. Arquivo de cabeçalho stdio.h conio.h math.h stdlib.h time.h string.h Finalidade Suporta entrada e saída com arquivos Suporta E/S pelo console Possui diversas funções matemáticas Declarações miscelâneas Funções de horário do sistema Funções de string Dica: O arquivo de cabeçalho feito pelo programador é colocados entre “ ”. Exemplo: #include “funccondicao.h” Exemplo: # include <stdio.h> Essa diretiva faz com que o compilador insira o conteúdo do arquivo stdio.h dentro do programa fonte antes de compila-lo. Esse arquivo possue declarações de funções úteis para entrada e saída de dados padronizados. A biblioteca stdio significa: std=standard= padrão; io = input/output = entrada/ saída. Explicação de execução e incorporação das funções Uma biblioteca é uma coleção de funções. Um arquivo de biblioteca armazena o nome de cada função, o código-objeto da função, mais as informações necessárias para o processo de linkagem. Quando o programa se referencia a uma função, o linkeditor procura a função na biblioteca (que possui várias) e adiciona apenas o seu código ao programa. As funções padrões existentes na biblioteca do compilador C foram definidas pela ANSI. Algumas empresas criaram funções novas e acrescentaram ao compilador, como por exemplo, a Borland, acrescentou ao Turbo C a biblioteca CONIO (Console Input/Output). Bloco de Execução Todos os programas na linguagem C começam executando o conteúdo descrito na função principal (main). Essa função determina a execução e ordem de execução das demais funções que existirem. As funções possuem um conjunto de instruções com uma tarefa específica, como por exemplo, uma função para calcular o salário dos funcionários. Essa função pode ter uma instrução que calcula o desconto alimentação, outra que calcula o desconto de transporte, entre outras instruções. Também existem as funções de bibliotecas já mencionadas anteriormente, que podem ter a função de mostrar de forma formatada uma mensagem na tela, ou mesmo buscar a data atual do computador. O conteúdo da função é delimitado por chaves { }. O código que estiver dentro das chaves será executado seqüencialmente quando a função for chamada. Regras de Digitação e Dicas da Estrutura em C • Espaços em branco são desconsiderados Dê preferência para um código limpo, fácil de entender, com alinhamento e identação. Como no exemplo que segue: Com espaços Sem espaços (correto e incompreensível) (correto e compreensível) #include <stdio.h> #include <stdio.h> main() { ….} main() { …. } • Coloque comentários explicativos Para facilitar a compreensão coloque comentários ao decorrer do código. Como no exemplo abaixo: /* Autor: Lorena Melaré Data: 20/01/2008 Sistema: Cadastro de Fornecedores */ • Cuidado com as palavras reservadas, exemplo: include, printf, main • Há diferenciação de letras maiúsculas e minúsculas (case sensitive) A linguagem C é case sensitive, ou seja, diferencia letra maiúscula da minúscula. Exemplo: NOME é diferente de Nome que é diferente de nome. As palavras-chaves de C são minúsculas. (else é palavra-chave, mas ELSE ou Else não são). • Os parênteses após o nome de uma função, como a função main() é obrigatório. • As chaves { } servem para delimitar um bloco de instruções. As variáveis devem ser declaradas no início. • No C para indicar o final de uma instrução deve ser usado o ;(ponto-e-vírgula). Se for necessário podem ser digitadas várias instruções numa mesma linha. Como por exemplo: printf “Exemplo da Estrutura “; printf “de um Programa em C”; VARIÁVEL AULA 5 O que são variáveis? Os dados armazenados no computador podem ser apresentados de duas formas diferentes: como constantes ou variáveis. Os dados fornecidos pelos meios de entrada ou mesmo os processados são transferidos e armazenados numa área da memória do computador chamada de Variável. A variável é uma posição de memória que é usada para armazenar um valor (tipo de dado). Esse valor pode ser alterado a qualquer momento no programa. Essas variáveis são utilizadas como áreas de trabalho, ou seja, como uma lousa, onde podemos escrever, modificar e apagar quantas vezes for necessário. Memória Existem regras para a formação dos nomes das variáveis, de acordo com a linguagem de programação a ser usada. As regras relacionadas abaixo são do C: _ o primeira caracter tem que ser obrigatoriamente uma letra ou um sublinhado; _ o nome pode ser formado por números, só que estes não podem ser colocados na primeira posição. _ o nome da variável não pode ter caracteres especiais ou espaço, com exceção do caracter _ (underline); _ as letras maiúsculas e minúsculas são tratadas diferentemente (case sensitive). _ o nome da variável não pode ser igual a uma palavra reservada da linguagem. Declaração da variável A declaração da variável deve ser feita obrigatoriamente antes da sua utilização, podendo ser declaradas em 3 lugares diferentes: dentro da função (variável local), fora da função (variável global), ou como parâmetro formal. Variáveis Mas em que parte da memória vão os dados? Cada dado será armazenado em uma posição da memória (variável) diferente. Essas posições precisam ser identificadas, ou seja, ter um nome definido. O nome da variável torna-se o seu endereço. Imaginem como você encontraria uma pessoa sem ter seu endereço ou telefone? Não se esqueça que ao definir o tipo de variável está se determinado a quantidade de espaço (bytes) que será alocado na memória e o intervalo de valores que ela poderá armazenar. Nome da variável (Identificador) A melhor forma de nomear uma variável é verificar qual será seu conteúdo e definir o nome de acordo com ele. Por exemplo, se for armazenar o sexo do paciente, o melhor nome para a variável é SEXO e não SS. Variáveis Locais: São variáveis declaradas dentro de uma função e são visíveis apenas na função em que foram criadas. Funções distintas podem ter variáveis locais com o mesmo nome. Observação: Variáveis Globais: São variáveis definidas fora de qualquer função e que estarão disponíveis para serem utilizadas em todo o programa. No pseudocódigo o símbolo significa atribuição. Na linguagem C ela é representada com o símbolo =. Exemplos de Declaração de Variável: tipo_de_variável nome_variável, nome_variável; Pseudocódigo real salario; inteiro num_filho; caracter sexo; real porc_aum 5.5; inteiro qtd_leite; C float salario; int num_filho; char sexo; float porc_aum =5.5; Dicas Pode ser atribuído um conteúdo a variável quando ela for declarada. qtd_pao, int qtd_pao, qtd_leite; Podem ser declaradas diversas variáveis do mesmo tipo ao mesmo tempo. TIPOS DE DADOS Defina de forma correta o tipo de dado, para que não ocorra falta de memória durante a execução do programa ou lentidão de processamento. Quando você define o tipo de variável o computador reserva um espaço de acordo com o tipo definido. Mesmo que o valor recebido e armazenado seja menor que o espaço reservado o computador conserva o mesmo tamanho. Na linguagem C os tipos básicos de dados são: caracter (char), inteiro (int), ponto flutuante (float) e sem valor (void). Caracter Esse tipo de dado é usado para armazenar uma letra (a..z, A..Z), um número (0..9) ou um caracter especial (º, ^, &, =, #, :). Na linguagem C, não existe um tipo de variável para armazenar uma cadeia de caracteres (string), como em muitas outras linguagens de programação. Para armazenar um conjunto de caracteres usaremos a estrutura de vetor que será explicada depois. Quando for um único caracter colocamos seu conteúdo obrigatoriamente entre apostrofe (‘). Quando for uma cadeia de caracteres, colocamos entre aspas (“). Exemplos: char sexo; char estado_civil = ‘c’; Numéricas As variáveis numéricas armazenam apenas números. Esses números podem ser: inteiros ou reais (ponto flutuante). Numéricas Inteiras Contém números que não possuem a parte decimal, podendo ser positivos, negativos ou nulos. Os numéricos inteiros (2 bytes) ocupam menos memória que os numéricos reais (4 bytes). Exemplos: int idade; int num_filho; Numéricas Reais: Esse tipo contém tanto números inteiros quanto números reais. Todos os números não importando o tamanho, sinal ou mesmo o número de casas decimais podem ser definidos como tipo real. Exemplos: float salario; float porc_aumento = 15.50; float salário, aumento; Lógicas As variáveis definidas como lógicas (booleanas) podem guardar apenas um dos dois estados: Verdadeiro ou Falso, sempre armazenando apenas um dígito. Na linguagem C não existe um tipo específico para a representação de valores lógicos. O dígito 0 representa o valor lógico falso e 1 representa o valor lógico verdade. Espaço Alocado de Memória Tipo de Variável char int float void Tamanho (bytes) 1 2 4 0 Exemplo de Conteúdo ‘f’ 14 15.655 Curiosidade: ao se atribuir um caracter a uma variável, internamente o conteúdo a ser armazenado é um código ASCII (na tabela padrão o valor varia de 0 a 127). Recordando: O nome da variável serve de referência ao dado armazenado em um espaço de memória e o tipo da variável determina a natureza do dado que será armazenado. CONSTANTES Quando nos referimos a um dado que não pode ser alterado temos uma constante, que significa constantemente com o mesmo valor (valor fixo). Dentro de um programa podem existir várias constantes, como por exemplo, o ano atual, o valor de PI. Exemplos: const int ANO_ATUAL = 1990; const float PI = 3.1415; O programa irá criar uma variável chamada PI, com o valor 3.1415, que não poderá ser modificada pelo programa. AULA 6 OPERADORES ARITMÉTICOS Os operadores aritméticos da linguagem C são: +, -, *, / e %. O ponto (.) representa separador decimal e a vírgula (,) separador de milhar. Operado r + * / % -++ Ação Exemplo Adição Subtração Multiplicação Divisão Módulo Decremento Incremento 1+1 =2 1–1 =0 2*2 =4 2/2 =1 2%2=0 --x é x=x-1 ++x é x = x + 1 **Cuidado, ao ser usado o operador de divisão a um tipo inteiro, será retornado um valor inteiro. Por exemplo, 5/2 será igual a 2. A precedência (maior prioridade) de operadores segue a ordem: *, /, %, +, -. Os operadores com a mesma precedência são executados da esquerda para a direita. Módulo: O operador resto da divisão (módulo) somente deve ser usado com números inteiros. Exemplo: 5%2=1 Resto da Divisão 5 2 1 2 Parte Inteira da Divisão (Quociente) Forma de usar os operadores de Incremento e Decremento Esses operadores podem ser usados como prefixo ou sufixo, como, ++n1 ou n1++. Quando o operador precede a variável ((++n1), ele executa a operação (incremento ou decremento) antes de usar o conteúdo da variável. Se o operador estiver depois da variável (n1++), o computador primeiro usa o valor armazenado na variável para depois executar a operação. Exemplos: n1 = 10 n1 = 10 n2 = ++ n1 n2 = n1++ resultado n2 = 11 resultado n2 = 10 somente a próxima vez o x vale 11 Operadores Aritméticos de Atribuição ou C Reduzido Na linguagem C pode ser feito usado de um operador aritmético com o comando de atribuição, dessa forma simplificando a programação. Exemplo: num = num + 2 pode ser escrito da seguinte maneira: num+=2; num2 = num1 = 10 o valor 10 é atribuído a num1 e, em seguida o valor de num1 é atribuído da num2 (da direita para a esquerda). No exemplo acima o operador += acrescenta 2 ao valor da variável num e o armazena a variável num. Podendo ser usado qualquer operador aritmético, como: num-=2, num*=2, num/=2, num%=2. Conversão de Tipo A linguagem C oferece o recuso de conversão automática de valores. A conversão pode ser feita usando o operador cast (operador de molde de tipo). Esse operador é colocado entre parênteses antes do valor a ser convertido. Exemplo: a) float x = 5; o valor de x é convertido para 5.0; b) 5 / 2.0 o valor de 5 é convertido para 5.0, porque o segundo operando é 2.0. O resultado da expressão é 2.5 c) int a, b; a = (int) 3.5; -- é atribuído o valor 3 para a variável a b = (int) 3.5 % 2; -- é convertido o valor 3.5 para 3 para depois fazer a operação módulo, que só pode ser feita com valores do tipo inteiro. Curiosidade: Na linguagem C é usada a função pow() para fazer exponenciação. pow(2,3) ---- O resultado é 8, ou seja, o 2³ FUNÇÕES DE ENTRADA E SAÍDA FORMATADA AULA 7 Função de Saída - printf() A função printf() realiza a saída de dados em vários formatos, de acordo com a configuração feita pelo programador. O protótipo da função está no arquivo de cabeçalho STDIO.H. Com essa função é possível exibir mensagens, resultados de cálculos, endereços de memória. O protótipo do printf() é: printf(“string_de_controle”, lista_de_argumentos); • Na string de controle é definido tudo que será exibido na tela: cadeia de caracteres, o formato das variáveis (usando-se o comando de formato - %) e os caracteres de controle (usando o símbolo \). • Na lista de argumentos definem os formatos que serão exibidos os valores. • Deve haver o mesmo número de argumentos e de comandos de controle. Comandos de Formato mais usados Código Formato %c caracter %d inteiros decimais com sinal %i inteiros decimais com sinal %f ponto flutuante decimal %s string de caracteres %x hexadecimal sem sinal %u inteiros decimais sem sinal %p apresenta um ponteiro %% escreve o símbolo % Código \a \b \n \r \t \” Caracteres de Controle mais usados Formato soa o alarme do microcomputador o cursor retrocede uma coluna o cursor avança para uma nova linha o cursor retrocede para a primeira coluna da linha o cursor avança para próxima marca de tabulação exibe uma aspas É possível especificar o tamanho dos campos que serão exibidos. Como nos exemplos abaixo: %4d _ _ 3 3 %7.2f _ _ _ 5.3 0 7 possíveis no total, sendo fixadas 2 para o número de casas decimais Dicas: Comando printf("%8i", 10); Exibição ( 10) printf("%-8i", 10); (10 printf("%08i", 10); (0000010) printf(“%.1f”,1910.10) 1910.1 ) Explicação As posições definidas a mais são preenchidas com espaço em branco e o valor é alinhado à direita do campo. Se o tamanho do campo for precedido por um (menos), então, o valor será alinhado à esquerda do campo. Se o tamanho do campo for precedido com o 0 (zero), então as posições excedentes são preenchidas com zeros. Deve ser colocada a quantidade de casas decimais a serem exibidas junto com o comando de formato, como no exemplo %.1f printf(“O resultado da soma é:”); soma =4.51; printf(“O resultado da soma é: %6.2f”, soma); printf (“Mostra o símbolo %% %%") printf ("Um tipo caractere é %c e um tipo inteiro é %i",‘A',20) printf ("%s é um exemplo de string","Este") printf ("%s%d%%","Juros de ",10) O resultado da soma é O resultado da soma é 4.51 %% Um tipo caractere é A e um tipo inteiro é 20 Este é um exemplo string Juros de 10% Função de Entrada – scanf() A função scanf() é usada para fazer entrada de dados. Essa função captura o valor digitado no teclado e armazená-o em uma variável . Os valores capturados são convertidos para o formato interno apropriado. O protótipo dessa função está no arquivo de cabeçalho STDIO.H. Sua estrutura e: scanf(“string_de_controle”, &lista_de_argumentos); • Primeiro se define o tipo de variável a ser recebido • Deve ser colocado o operador & (endereço de memória) antes de cada uma das variáveis da lista de argumentos (exceto para strings). • Deve ser colocado o mesmo número de argumentos e de string de controle. • Num tipo string, o espaço em branco finaliza a entrada. Podem ser recebidos vários valores ao mesmo tempo, usando como separador de entrada um espaço em branco ou o caracter dois pontos ( : ) . Os especificadores %d, %f, %e pulam automaticamente os brancos que precedem os valores numéricos. Comandos de Formato mais usados Código Formato %c caracter %d , %i inteiros decimais com sinal %f , %e, %g ponto flutuante decimal %s string de caracteres Exemplo: float nota1, nota2; scanf(“%f”, ¬a1); scanf(“%f”, ¬a2); ou float nota1, nota2; scanf(“%f %f ”, ¬a1, ¬a2); EXERCÍCIO RESOLVIDO AULA 8 Uma loja de telefone celular paga aos seus vendedores um salário fixo mais uma comissão de R$ 50,00 por cada aparelho vendido. Faça um programa que receba o número de aparelhos vendidos e calcule o salário total do vendedor. Entrada: • nome do vendedor • número de aparelhos vendidos • valor do salário fixo (mesmo não sendo pedido no enunciado, o valor do salário fixo deve ser recebido para o cálculo do salário total) Processamento: • calcular o valor da comissão _ quantidade de aparelhos vendidos * 50 • calcular o salário total _ o valor da comissão + o valor do salário fixo Saída: • mostrar o salário total do vendedor Pseudocódigo INÍCIO Inteiro quant; real sal_bruto, comis, sal_total; escreva (“Quant de aparelhos vendidos?”); leia (quant); escreva (“Qual o valor do salário fixo?”); leia (sal_bruto); comis quant * 50; sal_total sal_bruto + comis; escreva (“O salário final é:”, sal_total); FIM Linguagem C #include <stdio.h> #include <stdlib.h> main() { int quant; float sal_bruto, comis, sal_total; printf(“\Quant de aparelhos vendidos?”); scanf(“%i”,&quant); printf(“\nQual o valor do salário fixo?”); scanf(“%f”,&sal_bruto); comis = quant * 50; sal_total = sal_bruto + comis; printf(“O salário final é %.2f”, sal_total); system(“pause”); } EXPRESSÃO RELACIONAL E LÓGICA AULA 9 Operadores Relacionais Os operadores relacionais são utilizados em expressões de comparação (de valores, de conteúdo de variáveis) e podem ser usados juntamente com os operadores aritméticos. Esses operadores relacionais geram um resultado lógico (Verdadeiro ou Falso) quando aplicados nas operações. Operador (pseudocódigo) = > < <= >= <> Expressão em pseudocódigo 3=5 15 > 5 5+ 6 = 11 7 < 4-5 ‘s’ = ‘n’ Significado Igual Maior Menor Menor ou igual Maior ou igual Diferente Expressão Em C 3==5 15 > 5 5 + 6 = = 11 7 < 4-5 ‘s’ = = ‘n’ C == > < <= >= != Resultado 0 - Falso 1- Verdadeiro 1- Verdadeiro 0 - Falso 0 - Falso Na linguagem C não existe o tipo lógico (booleano) com os valores true e false (verdadeiro ou falso). Ao verificar uma expressão, o compilador compara e retorna o valor zero ou um. O valor zero representa o falso e, qualquer valor diferente de zero, no caso o valor um, representa o verdadeiro. Expressão Lógica As expressões lógicas são aquelas que operam com valores lógicos e resultam também num valor lógico. Elas podem ser utilizadas em testes de variáveis, tomada de decisão e expressões matemáticas. A função do operador lógico “NÃO” pode modificar valores e expressões, pois, ele serve para negar a expressão. Operador Operação Prioridade C Negação 1 NÃO ! Conjunção 2 E && Disjunção 3 OU || E OU NÃO V e V = V V ou V = Não F = V VeF=F V Não V =F F e V = F V ou F = V F e F = F F ou V = V F ou F = F Exemplos: Pseudocódigo Não ( Idade = 5 ) Número1 5 Número2 6 Número1 > 7 E Número2 > 5 C ! ( Idade = = 5 ) Explicação Nessa expressão temos o resultado “Falso”, pois o operador lógico “NÃO” negou a expressão contida dentro do parênteses. Número1 = 5; O resultado dessa expressão é Número2 = 6; “Falso”, pois o operador “E” exige que as duas condições Número1 > 7 && Número2 > sejam verdadeiras para o resultado ser “Verdadeiro”. 5 Veja que a primeira condição está indicando que o Número1 é maior que 7, mas isso não é verdadeiro, pois o valor do Número1 é 5, e 5 é menor que 7. A segunda condição é verdadeira, pois 6 é maior que 5. Número1 5 Número2 6 Número1 = 5; Número2 = 6; Número1 > 7 OU Número2 > 5 Número1 > 7 || Número2 > 5 O resultado dessa expressão é “Verdadeiro”, pois o operador “OU” indica que apenas uma das condições precisa ser verdadeira para o resultado ser “Verdadeiro”. Observem a diferença do operador “OU” com o operador anterior “E”. ESTRUTURAS DE DECISÃO (CONDICIONAL) Os programas são desenvolvidos com a única função de facilitar a vida do homem, resolvendo problemas mais rapidamente e com mínimas chances de existência de erros. Todas as complexidades de um problema não podem ser passadas no computador baseadas apenas numa estrutura linear, pois esta estrutura - formada por entradas, processamentos e saídas - não prevê a possibilidade de desvios de instruções. Para o desenvolvimento de programas mais completos estudaremos a partir de agora uma nova estrutura, a de decisão. Muitas vezes em nossa vida temos que fazer uma escolha, que pode ser de diferentes níveis, desde as mais importantes até as mais simples como: a escolha da profissão ou a cor do carro. Com essas decisões podemos ter vários caminhos diferentes a tomar. AULA 10 Os testes estão presentes em quase todos os programas, devido a grande flexibilidade e poder de ação que tais estruturas proporcionam. As decisões possuem somente dois caminhos conforme resultado obtido, a do verdadeiro ou a do falso. Conforme o resultado final do teste, um dos caminhos deve ser seguido, sendo obrigatório existir o verdadeiro e não sendo obrigatório a existência do caminho falso. Na verdade a decisão é uma condição ou expressão lógica que é testada e verificada, podendo ser verdadeira ou falsa. Se depois de avaliada a condição o resultado for verdadeiro então ela seguirá um caminho diferente daquele seguido se fosse falsa. Existem diversas estruturas condicionais: simples, encadeada, múltipla escolha. Algoritmos (Descrição Narrativa) Estrutura Linear Estrutura Condicional INÍCIO Pegar o doce Tirar da embalagem Comer o doce FIM INÍCIO Pegar o doce Tirar da embalagem SE o doce estiver estragado então Jogar fora o doce SENÃO Comer o doce FIM NÚMERO > 100 SENHA <> “AJUM” IDADE > 60 Fluxograma Estrutura Linear Fluxograma com Estrutura de Condição INÍCIO INÍCIO PEGAR O DOCE PEGAR O DOCE TIRAR DA EMBALAGEM TIRAR DA EMBALAGEM COMER O DOCE F ESTÁ ESTRAGADO? V FIM JOGAR FORA O DOCE COMER O DOCE FIM No exemplo acima podemos ver facilmente a importância da estrutura de decisão. Na primeira estrutura, a linear, existe apenas três procedimentos e não há verificação das informações. Na segunda estrutura foi possível fazer a verificação de possíveis falhas na seqüência de processos, onde, foi constatada a falta do procedimento que verificasse se o doce estava ou não estragado. Exercício Resolvido Elabore um programa que receba dois números e no final mostre o número maior. Entrada: Receber dois números Processamento: Verificar qual o número maior Saída: Mostrar o número maior Pseudocódigo Inicio Declare Real num1, num2; Escreva (“Digite o primeiro número”); Leia num1; Escreva (“Digite o segundo número”); Leia num2; SE (num1 > num2) então Escreva (“O maior número é: ”, num1); Senão Escreva (“O maior número é: ”, num2); Fim Teste de Mesa MEMÓRIA VALORES SIMULADOS 100 5 PROCESSAMENTO NUM1 NUM2 100 5 SAÍDA ENTRADA 100 Linguagem C #include <stdio.h> #include <stdlib.h> main() { float num1, num2; printf(“\nDigite o primeiro número”); scanf(“%f”,&num1); printf(“\nDigite o segundo número”); scanf(“%f”,&num2); if (num1 > num2) printf(“O maior número é %f”, num1); else printf(“O maior número é %f”, num2); } TIPOS DE ESTRUTURAS DE CONDIÇÃO AULA 11 Existem várias estruturas de decisão, abaixo serão destacas e explicadas algumas. Não esqueça que quando colocamos o termo condição estamos nos referindo a uma comparação, que pode resultar em um dos dois valores: Verdadeira ou Falsa. Estrutura Condicional Simples: A instrução somente será executada se a condição testada for Verdadeira. Quando for mais de uma instrução a ser executada deve ser delimitado o bloco de instruções com o seu início e fim. SE condição ENTÃO instrução; SE condição ENTÃO Início instrução 1; instrução 2; instrução n; Fim Estrutura Condicional Composta: A condição será testada e de acordo com o seu resultado (verdadeiro ou falso) será executado um caminho (instrução) diferente. SE condição ENTÃO instrução; SENÃO instrução; SE condição ENTÃO Início instrução 1; instrução n; Fim SENÃO Início Instrução 1; Instrução n; Fim Estrutura Encadeada: Pode ser executada uma condição simples ou composta dentro de outra condição. instrução; SE condição ENTÃO SENÃO Início Início instrução; SE condição ENTÃO SE condição ENTÃO Início instrução; Instrução 1; Fim Instrução n; SENÃO Fim Início Fim Instrução 1; Instrução n; Fim Fim SE condição ENTÃO Exemplos de Estrutura Condicional em C Condição Simples: if (condição) instrução; Condição Composta: if (condição) instrução; else instrução; Estrutura Encadeada: if (condição) instrução; else if (condição) { instrução 1; instrução n; } else if (condição) instrução; if (condição) { instrução 1; instrução n; } if (condição) { instrução 1; instrução n; } else { Instrução 1; Instrução n; } if (condição) { instrução 1; instrução n; } else if (condição) Instrução; Operador ? (ternário) Em C existe o operador ? (operador condicional) que facilita a verificação de sentenças simples. Estrutura: condição ? expressão1 : expressão2; A condição é avaliada; Se ela for verdadeira o resultado é o valor da expressão1; Se a condição for falsa o resultado é o valor da expressão2. Exemplo: sal = 1000; salnovo = sal>1000 ? 1000 : 1000; Seleção Múltipla As linguagens de programação possuem um comando exclusivo para seleção múltipla (escolha...caso). Nessa estrutura o computador fará um teste sucessivo, verificando o valor da expressão numa lista seqüencial de constantes, ao encontrá-lo ele executará o bloco de comandos associados a ela. Essa estrutura é usada para verificação de menu de opções Pseudocódigo: verifique <valor da expressão> início caso <lista de valores 1> então <instruções> caso <lista de valores 2> então <instruções > .... senão < instruções> fim-verifique Estrutura em C: switch( expressão ) { case <lista de valores1>: instruções; break; case <lista de valores 2>: instruções; break; ... default: instruções; } O comando default é executado se nenhuma coincidência for encontrada, ou seja, se o computador não encontrar o valor da expressão na lista de constantes. O uso do default é opcional. O comando break serve como um desvio de execução. Ao ser executado dentro do switch ele finaliza a seqüência de instruções do case e sai do switch. Se não for usado o break o computador continuará dentro do switch executando as demais instruções dos outros case. Exemplo: case ‘/’ : if( n2 = = 0 ) printf(“Não existe divisão por zero”); else r= n1 / n2; break; Curiosidade: Pode existir case sem instrução associada. Caso isso ocorra o computador executará as instruções do próximo case. EXERCÍCIOS RESOLVIDOS – ESTRUTURA DE DECISÃO AULA 12 PARTE I Receba uma idade qualquer e mostre uma mensagem de acordo com ela. Se a idade for igual ou menos de 5 anos a criança deve ser vacinada. Pseudocódigo Inicio Inteiro idade; Escreva (“Digite idade”); Leia idade; SE idade <= 5 então Escreva (“Deve ser vacinada”); Fim Linguagem C #include <stdio.h> #include <stdlib.h> main() { Int idade; printf(“\nDigite idade”); scanf(“%i”,&idade); if (idade <=5) printf(“Deve ser vacinada”); } Receba a idade de uma pessoa e mostre uma mensagem de acordo com ela. As pessoas que tem mais de 11 anos e menos de 18 são consideradas adolescentes. Pseudocódigo Inicio Inteiro idade; Escreva (“Digite sua idade”); Leia idade; SE idade >= 11 então SE idade =< 18 então Escreva (“Adolescente”); Fim Linguagem C #include <stdio.h> #include <stdlib.h> main() { Int idade; printf(“\nDigite idade”); scanf(“%i”,&idade); if (idade >= 11) if (idade =<18) printf(“Adolescente”); } Receba a idade de uma pessoa e mostre uma mensagem de acordo com ela. As pessoas que tiverem menos de 18 anos e mais de 85 não estão aptas a dirigir e devem ser alertadas com uma mensagem. Forma 1: Pseudocódigo Inicio Inteiro idade; Escreva (“Digite sua idade”); Leia idade; SE idade < 18 então Escreva (“Não pode dirigir”); SE idade > 85 então Escreva (“Não pode dirigir”); Fim Linguagem C #include <stdio.h> #include <stdlib.h> main() { Int idade; printf(“\nDigite idade”); scanf(“%i”,&idade); if (idade < 18) printf(“Não pode dirigir”); if (idade > 85) printf(“Não pode dirigir”); } Forma 2: Pseudocódigo Inicio Inteiro idade; Escreva (“Digite sua idade”); Leia idade; SE idade < 18 ou idade > 85 então Escreva (“Não pode dirigir”); Fim Linguagem C #include <stdio.h> #include <stdlib.h> main() { Int idade; printf(“\nDigite idade”); scanf(“%i”,&idade); if (idade < 18 || idade > 85) printf(“Não pode dirigir”); } CUIDADO: NÃO SE ESQUEÇA DE IDENTIFICAR A VARIÁVEL EM CADA EXPRESSÃO LÓGICA! NÃO EXISTE A EXPRESSÃO: SE IDADE < 18 OU > 85 ENTÃO PARTE II 01) Faça um programa que classifique as máquinas conforme a produção de cabo para telefones. Veja a tabela abaixo: Produção Classificação maior ou igual a 60.000 “Boa” menor que 60.000 e maior que 40.000 “Regular” menor ou igual a 40.000 “Ruim” Pseudocódigo Início Real quantpro; Leia quantpro; SE quantpro >= 60000 então Escreva (“Produção Boa”); SENÃO SE quantpro > 40000 então Escreva (“Produção Regular”); SENÃO Escreva (“Produção Ruim”); Fim Linguagem C #include <stdio.h> #include <stdlib.h> main() { Float quantpro; printf(“\nDigite a quantidade produzida”); scanf(“%f”,&quantpro); if (quantpro >= 60000) printf (“Produção Boa”); else if (quantpro > 40000) printf(“Produção Regular”); else printf(“Produção Ruim”); } 02) A companhia de gás entrega a conta para seus consumidores no primeiro dia do mês. Se a conta for paga até o 5º dia haverá um desconto de 5%. Se for paga entre o 6º e o 15º dia não haverá desconto. E para contas pagas após o 15º será cobrada uma multa de 10%. Faça um programa que calcule o valor pago pelo consumidor. Receba como dados de entrada o número de identificação do consumidor, o valor da conta e o dia em que ela foi paga. Pseudocódigo Linguagem C #include <stdio.h> Início Int numiden, datapag; #include <stdlib.h> Real valorcon; totalpag; main() Escreva (“Digite o número de identificação { do consumidor”); Int numiden, datapag; Leia (numiden); Float valorcon; totalpag; Escreva (“Digite o valor da conta:”); printf (“Digite o número de identificação do Leia (valorcon); consumidor”); Escreva (“Digite a data de pagamento”); scanf (“%i”, &numiden); Leia (datapag); printf (“Digite o valor da conta:”); scanf (“%f”, &valorcon); SE datapag <= 5 então printf (“Digite a data que pagou”); Totalpag = valorcont – (valorcont* 0.05 scanf (“%i”, &datapag); ); if (datapag <= 5) SENÃO Totalpag = valorcont – (valorcont* 0.05 SE datapag < = 15 então ); Totalpag = valorcont; else SENÃO Totalpag = valorcont + if (datapag < = 15) (valorcont* 0.10 ); Totalpag = valorcont; Escreva (“O total a pagar é “, totalpag); else Totalpag = valorcont + Fim (valorcont* 0.10 ); printf (“O total a pagar é %.2f“, totalpag);} 03) Receba um número inteiro e classifique-o como negativo, positivo ou nulo. Essa classificação deverá ser exibida por uma mensagem. … { Início Int numero; Int numero; Leia num; scanf(“%i”, &numero); SE numero = 0 então if (numero = = 0) Escreva (“Número Nulo”); printf(“Número Nulo”); SENÃO else SE numero > 0 então if (numero > 0) Escreva (“Número Positivo”); printf (“Número Positivo”); SENÃO else Escreva (“Número Negativo”); printf(“Número Negativo”); Fim } OU Início Int numero; leia numero; SE numero = 0 então Escreva (“Número Nulo”); SE numero > 0 então Escreva (“Número Positivo”); SE numero < 0 então Escreva (“Número Negativo”); Fim { Int numero; scanf(“%i”, &numero); if (numero = = 0) printf(“Número Nulo”); if (numero > 0) printf (“Número Positivo”); if (numero < 0) printf(“Número Negativo”); } ESTRUTURA DE REPETIÇÃO AULA 20 Laço (Loop) Toda vez que você ler ou ouvir a palavra loop saiba que ela significa volta, igual o loop de uma montanha russa, onde você gira, e gira e repete essa volta várias vezes. Então, loop na programação significa repetição, iteração, volta a executar um procedimento já executado. Pode ser feita a repetição de apenas uma instrução ou de um conjunto de instruções, podendo ser ou não definida a quantidade de vezes que irá repetir. Tome cuidado na hora da definição dos processos a serem repetidos. Se você quiser que a tela seja limpa toda vez que for exibida uma mensagem; então a instrução para limpar a tela deve estar dentro do corpo do loop, senão, a tela será limpa apenas uma vez. A estrutura que aprenderemos a partir de agora é usada para tornar automática a repetição de um programa inteiro ou apenas uma parte dele. Com a repetição automática os programas tornam-se mais rápidos e ágeis, não existindo linhas de comandos idênticas repetidas. A estrutura de repetição pode ser pré-definida com contador ou condicional. Quando for repetido um trecho do programa e já se souber a quantidade de vezes que ele será executado, então, você usará a estrutura de repetição pré-definida com contador. Um exemplo onde podemos usar esta estrutura é num programa que faz o cadastramento dos trezentos funcionários de uma empresa. Mas, quando não é conhecido de antemão o número de vezes a ser repetido um conjunto de instruções, então você usará a estrutura com condição. Essa estrutura consiste em executar as instruções enquanto uma condição pré-definida for verdadeira. Símbolo de repetição no fluxograma Esse símbolo é usado para representar estruturas de repetição, sejam elas pré-definidas ou não. Estrutura de Repetição Condicional Estrutura de Repetição com Contador Repita C = de 1 a 300 Faça Enquanto X > = 30 REPETIÇÃO PRÉ-DEFINIDA (PARA..FAÇA) AULA 21 Essa estrutura de repetição é usada quando é conhecida a quantidade de vezes em que um determinado trecho (bloco) do programa será repetido. Um trecho pode ser formado por uma ou várias instruções. C CONDIÇÂO PARA <variável_controlevalor inicial> ATÉ <variável_controlevalor final> INC <incremento> FAÇA Instrução; Variável de repetição ou Variável de controle ou Variável Contadora É através dessa variável que se controla a repetição. Essa variável pode ser iniciada tanto com valores negativos como positivos, dependendo da forma a ser feita a contagem, regressiva ou progressiva. Na linguagem C podem existir diversas variáveis de controle e possui uma flexibilidade muito grande para definir valores, condições e formas de incrementar essa estrutura de repetição. Valor inicial: O valor inicial indica qual o primeiro valor a ser armazenado dentro da variável de controle. Valor final: É através desse valor que é determinado quando deve ser finalizada a repetição. Na linguagem C o que existe no lugar do valor final é uma condição que é testada e quando se torna falsa determina que o laço deva ser finalizado. Incremento: O incremento define um valor que irá alterar o conteúdo da variável de controle toda vez que for executado um laço. Variável de repetição Valor inicial Valor final Valor de Incremento REPITA N = 1, 20, 1 INSTRUÇÕES PRÓXIMO N INSTRUÇÕES Exemplo: Cadastre o número de identificação e salário dos dez novos funcionários contratados. Início Int numiden, cont; Real valorsal; PARA contl ATÉ cont=10 INC contcont +1 FAÇA Início Escreva (“Número de identificação do funcionário:”); Leia (numiden); Escreva (“Valor do salário:”); Leia (valorsal); Fim Fim Explicação: • No exemplo acima, é inicializada a variável de controle com o valor 1. • A seguir é executado o bloco de instruções, que contém a entrada do número de identificação e valor do salário, pela primeira vez. No final da execução é automaticamente adicionado ao conteúdo da variável de controle o valor 1 (anteriormente valia 1 mais 1 de agora, a variável passa a ter o valor 2). • Depois é verificado o valor da variável com o valor final. Assim que o valor da variável de controle atingir um valor fora do intervalo definido como valor final a repetição pára e será iniciada uma nova seqüência de comandos definidos fora da repetição. Obs.: Se forem definidos de início, o valor inicial e final iguais não haverá repetição. O valor de incremento pode ser positivo ou negativo. Linguagem C #include <stdio.h> #include <stdlib.h> Condição de término da repetição: main() Repete até que o valor de cont fique maior que 10 { int numiden, cont; float valorsal; for (cont=1;cont <=10;cont++) { printf (“Número de identificação do funcionário”); scanf (“%i”, &numiden); printf (“Valor do salário:”); scanf (“%f”, &valorsal); } } Estrutura em C for (variável de controle = valor inicial; condição que define o fim do laço; valor do incremento ou decremento) instrução; ou, for (variável de controle = valor inicial; condição que define o fim do laço; valor do incremento ou decremento) { instrução; instrução; } Exemplos: a) for (cont =1; cont <=10; cont ++) printf(“Ordem crescente: %i”, cont); b) for (cont =10; cont >=1; cont --) { printf(“Ordem decrescente: %i ”, cont); system(“cls”); } Dicas: • O uso de mais de uma variável dentro do for deve ser feito com o uso da vírgula (,). for (n1=1, n2=1; n1+n2 < 10; n1++, n2++) • Não é obrigatória a definição dos três parâmetros, podendo ser feito um laço infinito. for ( ; ; ) printf(“Oi!”); ESTRUTURA DE REPETIÇÃO CONDICIONAL (ENQUANTO..FAÇA / FAÇA..ENQUANTO) AULA 22 Essa estrutura de repetição é usada quando a quantidade de vezes um determinado trecho do programa é desconhecida. Existe a repetição com pré-condição e pós-condição. Repetição com Pré-condição Neste tipo de estrutura de repetição, o bloco de instruções será repetido enquanto a condição testada no laço for verdadeira. Quando ela se tornar falsa pára a repetição e o fluxo de execução passa para a linha depois do laço. Cuidado ao usar o Enquanto: Se na primeira vez a condição testada já for falsa, então, não ocorrerá nenhuma vez a execução das instruções dentro do laço. Se faz necessária a validação da condição, ou seja, torna-la verdadeira. o da daçã Vali ição cond Condição N=3 ENQUANTO N < =20 INSTRUÇÕES Receber N INSTRUÇÕES Enquanto .. Faça Início ... Instrução; validação da condição; ENQUANTO condição FAÇA Instrução; Fim Obs:Estrutura que repete apenas uma instrução Estrutura em C while (condição) instrução; Início ... Instrução; validação da condição; ENQUANTO condição FAÇA Início Instrução; Instrução; Fim Fim Obs: Serão repetidas várias instruções, por isso há a necessidade de haver um delimitador para o início e fim do bloco de repetição. Estrutura em C while (condição) { Instrução1; Instrução2; ... Instrução n; } Repetição com Pós-condição Na linguagem C existe o teste da condição no final da repetição: Faça .. Enquanto Nesta estrutura a repetição ocorrerá pelo menos uma vez e não é preciso validar a condição. Em algumas linguagens existe o teste da condição no final da repetição: Repita..Até Obs.: Essa estrutura é diferente da Faça..Enquanto, pois, a repetição será feita até que seja satisfeita a condição. Não existe a validação da condição. Exemplos de Pseudocódigo a) num 1; enquanto (num >0) faça início ... fim b) c) faça início .... fim enquanto (num >0); d) repita início .... até (num <0); a) num = 1; while (num >0) { .... resp ‘s’; enquanto (resp = ‘s’) faça Exemplos em C b) resp = ‘s’; while (resp = ‘s’) { ... c) do { …. .... }while(num >0); } } Comandos Break e Continue Esses comandos são usados para se fazer um desvio na execução. O break e o continue são usados dentro de laços. Break: pode ser usado para terminar um case(switch) ou para forçar o término de um laço. Depois de encerrado o laço ele retorna para o comando seguinte fora do laço. No pseudocódigo é ABANDONE Continue: ele encerra apenas a iteração atual do laço, voltando ao início da repetição. Faça um programa que receba as notas e faltas de 2 alunos. Faça a consistência da nota, alertando quando for digitada uma nota inválida (menor que 0 ou maior que 10). #include <stdio.h> #include <stdlib.h> main() { float cont=1, nota=0, falta; while (cont <= 2) { printf("\nDigite a nota do aluno:"); scanf("%f", ¬a); if ((nota < 0) || (nota > 10)) { printf("\nA nota digitada deve estar entre 0 e 10"); continue; } printf("\nDigite a frequencia do aluno:"); scanf("%f", &falta); cont++; } system("pause"); } VARIÁVEIS CONTADORAS E ACUMULADORAS AULA 23 Variáveis Contadoras: Variáveis Acumuladoras: É o nome dado a uma variável numérica que tem a função de "contar" valores, ocorrências, ou mesmo, um determinado fenômeno. Esse recurso de programação é usado em programas de cadastro e pesquisa. Através dessas variáveis é possível contar: o número de pessoas cadastradas, o número de pessoas obesas, o número de pessoas com Aids, o número de mortes, o número de pessoas alfabetizadas, o número de votos dos candidatos. Para cada situação deve-se usar uma regra, um procedimento. Quando se faz a contagem de algum dado usa-se a variável contadora, incrementando o seu conteúdo com o valor 1. Mas, se houver a necessidade de acumular o valor de uma variável, então, usa-se a variável acumuladora, onde elas são incrementadas não pelo valor 1 e sim pelo valor de outra variável. Cuidados: Cuidados: • • • todas as variáveis contadoras devem ser zeradas no início; o conteúdo da variável contadora deve ser incrementado com o valor 1; para a variável contadora ser incrementada várias vezes ela deve ser colocada dentro do laço. Exemplos: ContPessoas ContPessoas + 1; ContDoentes ContDoentes + 1; TotalMulheres TotalMulheres + 1; Variável Contadora = Variável contadora + • • • todas as variáveis acumuladoras devem ser zeradas no início do processo; o conteúdo de uma variável acumuladora deve ser incrementado com o valor de outra variável; para a variável acumuladora ser incrementada várias vezes ela deve ser colocada dentro do laço. Exemplos: TotalPeso TotalPeso + Peso; TotalAltura TotalAltura + Altura; Somanota Somanota + Nota; 1 Variável Acumuladora = Variável acumuladora + valor de outra variável FUNÇÕES AULA 24 Sub-Rotinas (Módulos) As sub-rotinas, também chamadas de módulos ou subprogramas, são trechos de instruções que realizam tarefas específicas e que podem ser realizadas diversas vezes. Ao ser decomposto um programa em subprogramas ou sub-rotinas este tem sua complexidade também dividida. Desta forma é possível focalizar a atenção em um problema de cada vez, fazer os programas ficarem mais organizados e menores. As linguagens sem uso de sub-rotinas executam uma linha de código, ou uma instrução por vez, até o final do programa. Dessa forma não é possível fazer desvios de execução. Na linguagem C possibilita o uso de sub-rotinas por meio das funções. Na linguagem C existe a função principal main(), que é sempre a primeira rotina executada, executando a partir desta as outras rotinas. A linguagem C é formada por funções, como printf(), scanf(), system(), que são incluídas através da diretiva #include (já explicada anteriormente). Declaração da Função tipo_de_retorno nome_da_função (tipo_de_parâmetro nome_do_parâmetro, ....) { declaração das variáveis locais; corpo da função; retorno; } O tipo_retorno especifica o tipo de valor (int, float) que a função retornará através do return. Os tipos podem ser inteiros (int), reais (float), char (caracter) ou mesmo void (não retorna nada). Se não especificado o tipo o compilador assume um retorno inteiro. O nome_da_função é o identificador da função. Através dele é possível saber o que a função executará, por exemplo, se a função for criada para fazer uma adição ela pode ser chamada de soma(). O compilador procura pelo nome da função para fazer o desvio de execução. A lista de parâmetros é separada por vírgula. O tipo_de_parâmetro e o seu nome são respectivamente o tipo e o nome da variável que serão passados para a função. Uma função pode não ter parâmetros. O corpo da função contém todas as instruções que deverão ser executadas pela função. Ele deve estar entre chaves { }. A chaves de abertura { marca o início da função e a chaves fechada } marca o final da função. As variáveis locais são variáveis declaradas dentro (internamente) da função onde serão usadas e somente são conhecidas (visíveis) pela função que as criou. Uma variável local vem a existir quando ocorre a entrada na função e ela é destruída ao sair da função. Exemplo: float media_notas (float nota1, float nota2) { float media; media = (nota1+nota2)/2; return media; } Protótipos de Funções O protótipo da função foi acrescido com o padrão C ANSI. O protótipo da função deve ser usado quando a função for definida após a função principal main(). Ele é um cabeçalho que indica ao compilador a existência de uma função dentro do programa, podendo estar no meio ou no final. Definição do Protótipo tipo_de_retorno nome_da_função (tipo_de_parâmetro nome_do_parâmetro, ....) Exemplo: float media_notas (float nota1, float nota2); main() { } ** Se a função for descrita no início do programa, antes da função principal main(), não precisa ser feito o seu protótipo. Chamada (ativação) da Função A chamada de função existe quando há uma referência de uma função dentro do programa. Durante o acionamento da função, o fluxo de execução é desviado para ele, e logo após sua conclusão, o fluxo de execução retorna a linha de origem (a que o desviou). Na linha de chamada da função pode haver o envio ou não de argumentos para outra função. Esses argumentos são valores de variáveis, que podem ser usadas na outra função. Não são definidos os tipos de dados dos argumentos, pois os mesmos são definidos no início da função. Exemplo: float media_notas (float nota1, float nota2); main() { float n1,n2,media; media= media_notas (n1, n2); … } n1 e n2 nota1 e nota2 são argumentos (enviam) são parâmetros (recebem) float media_notas (float nota1, float nota2) { .... } Os argumentos enviados para a função devem ser compatíveis com os parâmetros, ou seja, se foram enviadas duas variáveis (argumentos) – exemplo nota1 e nota2 – devem ser definidos na função a ser executada duas variáveis (parâmetros) para estar recebendo os conteúdos das variáveis. Os tipos de variáveis devem ser iguais, ou seja, se os dados enviados são inteiros, então a variáveis definidas para recebê-los também devem ser inteiros. Exemplo Completo de Função #include <stdio.h> #include <stdlib.h> float media_notas (float nota1, float nota2); //protótipo da função main( ) { float n1, n2, media; printf("\n Este programa calcula a média de duas notas"); printf("\n\n Primeiro nota"); scanf("%f", &n1); printf("\n\n Segunda nota"); scanf("%f", &n2); media= media_notas (n1, n2); printf("\n\n A média das notas é %.2f \n", media); system("pause"); } // início da função principal float media_notas (float nota1, float nota2) { float media; media = (nota1+nota2)/2; return media; } // definição das variáveis locais // chamada da função media_notas() // fim da função principal // declaração da função media_notas // definição das variáveis locais //retorna o resultado da média para a função principal // fim da função media_notas() ** A função media_notas() é do tipo float porque o retorno dela será uma variável do tipo float (media). ** Os parâmetros (nota1 e nota2) são do tipo float porque seus respectivos argumentos (n1,n2) são do tipo float. Tipos de Variáveis • • • Variáveis Globais: São variáveis definidas fora de qualquer função específica, no início do programa. Elas poderão ser manipuladas por qualquer função do programa. Variáveis Locais: São variáveis declaradas dentro de uma função específica e são visíveis apenas na função em que foram criadas. Funções distintas podem ter variáveis locais com o mesmo nome. Então, a variável local será visível apenas na função que a cria e a variável global será visível por todas as funções existentes no programa. Comando Return Tem duas formas de uso: • ele provoca uma saída imediata das função que o contém, retornando ao código chamador. • devolve um valor Tipo Void • • • Todas as funções que não devolvem valores devem ser declaradas como tipo void. Quando uma função não tem parâmetros, deve ser colocado o void entre parênteses. Quando não existe um retorno o tipo de função é void. As funções podem ser usadas como rotinas de entrada, rotinas de criação de ela ou rotinas de exibição de dados. Muitas rotinas são específicas e independem dos valores de variáveis de outras rotinas, por isso o uso do tipo void na especificação das funções. Exemplo: void entrada(void); main() { entrada(); .... system(“pause); } void entrada(void) { system(“cls”); printf(“\n\n\n”); printf(“<1> - Adição \n”); printf(“<2> - Subtração \n”); printf(“<3> - Multiplicação \n”); printf(“<4> - Divisão \n”); printf(“<5> - Sair \n”); return; } O void no parâmetro é opcional. O void na definição do tipo de função é obrigatório Função com Passagem de Parâmetro por Valor Quando uma função é chamada, os parâmetros dessa função copiam os valores dos argumentos que são passados pela função que a chama. Essa passagem de parâmetro é denominada Passagem de Parâmetros por Valor. Isto ocorre porque são passados para a função apenas os valores dos parâmetros e não os próprios parâmetros. Os valores dos argumentos não são alterados fora da função que os criou. No exemplo abaixo vemos que o valor mostrado da variável num a primeira vez (na função main()) é diferente do valor mostrado na função quadrado(), pois, são duas variáveis diferentes. O valor da variável num é alterado na função quadrado(), mas permanece inalterada na função main(). Exemplo: Programa que calcula o quadrado de um número qualquer, usando função. #include <stdio.h> #include <stdlib.h> float quadrado (float num); //protótipo da função quadrado() main() { float num, qd; //declaração das variáveis locais printf ("Entre com um numero: "); scanf ("%f",&num); printf ("Na função MAIN a variável num vale %.2f \n", num); qd= quadrado(num); //chama a função quadrado() e envia o argumento num printf ("O quadrado do %.2f é = %.2f\n",num, qd); system(“pause”); } float quadrado(float num) //declaração da função quadrado() e do { parâmetro num num = num*num; printf ("Na função QUADRADO a variável num vale %.2f \n", num); return num; //retorna a função que a chamou retornando um valor (num) que será } atribuído a variável qd. ** A função quadrado() é do tipo float porque o retorno dela será uma variável do tipo float (num). ** O parâmetro (num) é do tipo float porque o argumento (num) é do tipo float. Exercícios Resolvidos 1) Faça uma função que calcule a soma de dois números recebidos na função principal. #include <stdio.h> #include <stdlib.h> float soma (float a, float b); // protótipo da função soma main( ) // início da função principal { float n1, n2, total; // definição das variáveis locais printf("\n Este programa calcula a soma de dois números"); printf("\n\n Digite o valor do primeiro número"); scanf("%f", &n1); printf("\n\n Digite o valor do segundo número"); scanf("%f", &n2); total=soma(n1, n2); // chamada da função soma() printf("\n\n A soma de %.2f com %.2f é %.2f \n", n1, n2,total); system("pause"); } // fim da função principal float soma (float a, float b) { float res; res= a+b; return(res); } // definição da função soma // definição das variáveis locais // retorna o resultado da soma dos números enviados // fim da função soma() 2) Elabore um programa que tenha as seguintes funções: _ na função principal deve ser recebidas pedidas duas notas e feitas às chamadas de funções. _ uma função que receba a nota do aluno e faça a consistência; _ uma função que calcule a média; _ uma função que exiba o resultado, se o aluno está aprovado, reprovado ou em exame. #include <stdio.h> #include <stdlib.h> float ler_nota(void); /* protótipos das funções*/ float calcula_media(float p1, float p2); void exibe_resultado(float med); void pausa(void); main() { float n1, n2, med; printf("Primeira prova: "); n1=ler_nota(); printf("Segunda prova : "); n2=ler_nota(); med=calcula_media(n1, n2); exibe_resultado(med); pausa(); } float ler_nota(void) { float n; do { scanf("%f", &n); if (n<0.0 || n>10.0) printf("Número Inválido! Redigite..:"); }while (n<0.0 || n>10.0); return(n); } float calcula_media(float p1, float p2) { float res; res = (p1 + p2) / 2; /* Calcula a média*/ return(res); } void exibe_resultado(float med) { printf("Media %.1f: ", med); if (med < 3.0) printf("Aluno reprovado\n"); else if (med >= 3.0 && med < 7.0) printf("Aluno em exame\n"); else if(med >= 7.0) printf("Aluno aprovado\n"); } void pausa(void) { system(“pause”); system(“cls”); } VETORES Conceito • Os vetores são matrizes unidirecionais homogêneas e podem ser chamadas de: arranjos unidimensionais, variáveis indexadas, variáveis compostas homogêneas unidimensionais ou arrays. • O vetor é um mecanismo de estruturação de dados usado para representar variáveis do mesmo tipo de dado, que são referenciados pelo mesmo nome. • Um elemento específico é acessado por meio de um índice. • O índice 0 contém o primeiro elemento armazenado. • Consiste em locações contíguas de memória. O endereço mais baixo corresponde ao primeiro elemento e o mais alto ao último. • O vetor mais utilizado é o de caracteres (string). • Os vetores são variáveis indexadas por apenas um índice (uma dimensão, unidimensional). Exemplos: float media[10]; 2.5 4.5 6.5 3.5 char nome[4]; A N A \0 int notas[4]; 6 3 10 5 // vetor com 10 elementos do tipo real 10 8 7 5.5 6 8.5 // vetor com 4 elementos do tipo caracter (string) //vetor com 4 elementos do tipo inteiro Declaração: A declaração de um vetor pode ser feita da seguinte maneira: tipo_da_variável nome_da_variável [tamanho]; Onde: • tipo_da_variável é o tipo base do vetor (int, float, char, etc), ou seja, qual tipo de conteúdo será armazenado na variável; • tamanho_da_variável é a quantidade de elementos que o vetor armazenará. Exemplo: float medias[45]; - A linguagem C reservará 180 bytes (45 x 4), ou seja, são 45 variáveis do tipo float, onde cada float ocupa 4 bytes. Estes bytes são reservados de maneira contígua. Acessando os elementos Cada elemento do vetor é um elemento individual, ou seja, seu conteúdo não está vinculado com os outros. Para acessá-lo eu preciso de uma referência a mais do que somente seu nome, é preciso saber onde se localiza o elemento dentro do vetor. Para isso acessamos os elementos do vetor, individualmente, através de um índice. Na linguagem C os índices iniciam no 0 e finalizam valendo o tamanho do vetor -1, devendo ser colocados entre colchetes. Exemplo: float media[10]; A primeira média será armazenada na posição 0 do vetor e a última será na posição 9; 0 2.5 1 4.5 2 6.5 3 3.5 4 10 5 8 6 7 7 5.5 8 6 9 8.5 media[0] acessa o primeiro elemento do vetor; media[9] acessa o último elemento do vetor; media[2] acessa o terceiro elemento do vetor; Armazenando os elementos Para ser feito o armazenamento no vetor é necessário de definir seu nome e em qual posição deverá ser armazenada (qual índice). O armazenamento pode ser feito separadamente ou em conjunto, de uma vez só. Veja os exemplos abaixo: a) b) media[0] = 2.5; ou media[10]= {2.5,4.5,6.5,3.5,10,8,7,5.5,6,8.5} media[1] = 4.5; ** Cuidado: Não se esqueça que o índice sempre inicia no 0. Ao declarar um vetor você coloca o tamanho total. Exemplos de Código de Programação a) Recebendo elementos de um vetor do tipo inteiro digitados via teclado for ( i=0; i<100; i++ ) { printf(“Digite %i elemento do vetor”, i++); scanf( “%i”, &vet[i] ); } b) Mostrando os elementos de um vetor na tela: for ( i=0; i<100; i++ ) printf( “%i”, vet[i] ); c) Inicializando um vetor com zeros for ( i=0; i<100; i++ ) valores[i] = 0; Exercícios Resolvidos: 1) Crie um vetor com 10 elementos do tipo inteiro e depois armazene automaticamente os valores de 0 a 9. # include <stdio.h> #include <stdlib.h> main() { int x[10]; int i; for (i = 0; i < 10; i ++) x [i] = i; system(“pause”); } //definição do vetor //definição da variável para controlar o índice //definição do laço para gerar o vetor //atribuição do valor da variável i ao vetor x 2) Crie um vetor com 10 elementos do tipo inteiro e depois armazene automaticamente os resultados da tabuada do número 2. #include <stdio.h> #include <stdlib.h> main() { int r[10]; int t; for(t=0;t<10;t++) { r[t]=t*2; printf("%i\n",r[t]); } system("pause"); } 3) O professor de Programação de Computadores precisa de um programa que calcule a média geral da sala, verificando dessa forma o desempenho dos alunos. O programa deve receber e armazenar as notas dos 35 alunos e calcular a média geral da sala. #include <stdio.h> #include <stdlib.h> main() { int notas[35],i,soma =0; for(i=0;i<5;i++) { printf("Digite a nota do aluno %d: ",i); scanf("%i",¬as[i]); soma=soma+notas[i]; } printf("Media das notas: %i.",soma/5); system("pause"); } VETOR STRING (CADEIAS DE CARACTERES) AULA 22 Na linguagem C não existe o tipo de dado string, dessa forma é necessário criar um vetor de caracteres para armazenar uma cadeia de caracteres (string). Ao usar esse tipo de vetor deve-se tomar cuidado para o fato de que as strings têm o seu último elemento como caracter null (\0). Para declarar a string, devemos declarar sempre um elemento a mais para o terminador. Cada caracter é um elemento independente e pode ser acessado de um índice. Existem bibliotecas e funções especiais para o tratamento e manipulação de strings. O cabeçalho padrão é string.h. Exemplos de declaração e atribuição: a) char nome[7]; b) nome = {‘b’,’i’,’a’,’n’,’c’,’a’}; d) char mensagem[10] = “Exemplo”; Exemplo de Função de String Função strlen() Retorna o tamanho da string #include <stdio.h> #include <stdlib.h> #include <string.h> main() { char nome[40]; printf(“Digite seu nome: ”); gets(nome); printf(“O tamanho do nome é: %i\n”, strlen(str)); } Função strcat() União de variáveis string #include <string.h> #include <stdio.h> #include <stdlib.h> main() { char c, nome[40], sobrenome[15]; int i; printf ("\nEntre com um nome: "); scanf ("%s", nome); printf ("\nEntre com um sobrenome: "); scanf ("%s", sobrenome); strcat(nome, " "); strcat(nome, sobrenome); printf ("\nO seu nome é %s \n", nome); system ("pause"); } Exemplos de Programas usando String: 1) Faça um programa que receba um texto e depois mostre quantas vogais foram digitadas. #include <stdio.h> #include <stdlib.h> main() { char texto[10]; int vogais=0,t; printf ("Digite um texto\n"); scanf("%s", texto); for (t=0;t<10;t++) { if (texto[t] == 'a' || texto[t] == 'e' || texto[t] == 'i' || texto[t] == 'o' || texto[t] == 'u') vogais++; } printf ("Total de vogais: %i\n", vogais); system ("pause"); } MATRIZ AULA 23 Matriz Bidimensional A linguagem C permite que seja declarada uma matriz bidimensional (variável composta homogênea bidirecional) ou mesmo multidimensional. Na matriz bidimensional o primeiro índice indica a linha e o segundo a coluna. Os índices iniciam no zero(0). Para calcular o espaço de memória necessário para armazenar a matriz é necessário fazer o seguinte calculo: int pontos_jogos [2] [4]; qtd de linhas * qtd de colunas * qtd do tipo (inteiro) tamanho = 2 * 4 * 2 tamanho = 16 Declaração: A declaração de uma matriz bidimensional pode ser feita da seguinte maneira: tipo nome [dimensão1] [dimensão2]; ou tipo nome [linha] [coluna]; Exemplos: 1) char tabela[5][5]; 2) int pontos_jogos [2] [4]; 0 1 2 3 0 1 pontos_jogos [0,1] pontos_jogos [1,3] Armazenando os elementos A inicialização e armazenamento de uma matriz pode ser individual ou coletivo. Como nos exemplos abaixo: • • • • • pontos_jogos [0] [1] = 5; pontos_jogos [1] [3] = 60 int i[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int quadrados[5][2] = {1, 1, 2, 4, 3, 9, 4, 16, 5, 25}; float nota[2][3] = {{9, 8, 7} , {6.5, 4, 2}}; Armazenamento feito via teclado A leitura e armazenamento dos elementos de uma matriz via teclado deve ser usando uma estrutura de repetição (laço). O for é o mais usado. Supondo que a matriz foi declarada como: int mat [2] [3]; O laço da linha (1ª dimensão) inicia no 0 e finaliza no 1 e o laço da coluna (2ª dimensão) inicia no 0 e finaliza no 2. for (l=0; l<2; l++) { for (c=0; c<3; c++) scanf (“%i”, &mat[ l ] [c ]); } Mostrando os elementos for. Para mostrar os valores armazenados dentro de uma matriz também é usada a estrutura do Para exibir a matriz mat declarada acima. for (l=0; l<2; l++) { for (c=0; c<3; c++) printf (“%i”, mat [ l ] [c ] ); } BIBLIOGRAFIA CONSULTADA ASCENCIO, Ana F. G. e CAMPOS, Edilene A. V. Fundamentos da Programação de Computadores. Ed. Pearson, 2002 CELES, Waldemar; CERQUEIRA, Renato e RANGEL, José L. Introdução a Estrutura de Dados. Ed. Campus, 2004 FORBELLONE, A. L. V.; et.al. Lógica de Programação - A Construção de Algoritmos e Estruturas de Dados. 2ª ed. Makron Books. 2000. SCHILDT, Herbert. C Completo e Total. 3ª ed. Ed. Makron Books. 1996. SENAI-SP. MDI. Tecnologia de Elaboração de Material Didático Impresso. São Paulo, 1996 VILLAS, Marcos Vianna e VILLASBOAS, Luiz Felipe P. Programação: conceitos, técnicas e linguagens. Rio de Janeiro, Ed. Campus, 1988