Baixe o app para aproveitar ainda mais
Prévia do material em texto
1. INTRODUÇÃO Na disciplina Lógica de Programação I, ministrada no ano letivo anterior, tu apren- deste a construir algoritmos capazes de resolver problemas diversos. Esses algoritmos, basica- mente, podem ser divididos em três tipos: (i) sequenciais, (ii) de seleção e (iii) iteração. Um algoritmo sequencial é aquele em que sua sua execução ocorre na sequência que ele é escrito. Em outras palavras, nesse tipo de algoritmo, todos os passos (instruções) são executados na sequência em que eles aparecem, do primeiro até o último, um após o outro, durante um tempo finito. Por exemplo, um algoritmo que mostre que faça a adição de dois números reais e mostre o resultado é do tipo sequencial. Já nos algoritmos do tipo seleção, uma ou mais instruções podem não ser executadas, dependendo do resultado de uma avaliação prévia de condições (condição, lembras?). Um algoritmo que calcula uma equação do segundo grau, verificando a condição de existência da equação, se enquadra nesta classe de algoritmos. Por último, tem-se os algoritmos do tipo iteração, isto é, é baseado em uma estrutura de repetição. O princípio desse tipo de estrutura é a execução de um trecho do algoritmo uma vez, várias vezes ou nenhuma vez, a depender de uma condição (executa se for verdade; não executa, caso contrário). Dizemos que esse tipo de algoritmo possui laço de repetição ou loop. 12 Capítulo 1. INTRODUÇÃO Imaginemos o seguinte: tu precisas escrever um algoritmo que calcule a média de notas de alunos de uma escola: ele precisa receber quatro notas, calcular e apresentar a média. Esse processo precisa ser reiniciado enquanto uma determinada condição for satisfeita. Importante salientar que a quantidade de vezes em que um loop se repete precisa ser necessariamente finito (lembre-se, todo algoritmo tem um fim). Ainda, tu aprendeste a fazer esses algoritmos utilizando três notações básicas: (i) descrição narrativa, em que os passos para resolver um problema são escritos em língua portu- guesa, como estruturas de tópicos; (ii) fluxograma, a utilizar uma notação gráfica (retângulos, losangos etc.) para mostrar o fluxo de ações para resolver o problema e; (iii) pseudocódigo – também chamado de Português Estruturado ou Portugol –, em que uma notação estruturada em português e matemática é utilizada. Certamente é nessa notação que tu estás mais adaptado. Notadamente, Visualg e Portugol Studio são duas ferramentas que utilizam variações do português estruturado (isto é, tem suas notações próprias) e auxiliam no aprendizado de programação para quem está acostumado com a língua portuguesa, permitindo "rodar" seus códigos em um computador. Entretanto, essas duas ferramentas apenas "interpretam" códigos escritos em uma notação expecífica. Não são, portanto, linguagens de programação. Não é possível desenvolver um software profissional/comercial numa dessas ferramentas. Para transformar um algoritmo qualquer em um programa e, então, poder executá- lo em um computador, é necessário escrevê-lo em uma linguagem de programação. Neste material, vamos aprender a programar na linguagem C. 1.1 A linguagem de programação C A linguagem C foi desenvolvida 1970 por Dennis Ritchie nos Laboratórios Bell e implementada pela primeira vez num computador DEC PDP-11, tendo como sua predecessora a linguagem BCPL. Ela foi padronizada pela American National Standards Institute (ANSI) 1.1 A linguagem de programação C 13 em 1984. As linguagens C++, C# e Java, dentre outras, podem ser vistas como derivações de C. C é um linguagem de programação compilada. Quando programamos em uma linguagem como C ou Java, escrevemos códigos legíveis ao ser humano, isto é, mesmo sem muitos conhecimentos técnicos é possível saber o que um trecho daquele código faz, uma vez que usamos palavras (da língua inglesa) e notações matemáticas bem conhecidas. Não obstante, um computador não é capaz de entender essa linguagem, essa notação. Como é bem trivial, um computador só é capaz de entender o que é escrito em linguagem de máquina, isto é, binário. Em outras palavras, sequências de 0s e 1s. Há basicamente dois métodos para fazer um programa executar em um computador: interpretação ou compilação. Um interpretador é um software específico e sofisticado que lê o código-fonte de um programa, uma linha por vez, e executa a instrução específica contida nessa linha. Assim, é necessário que ele esteja instalado no computador que irá executar o programa. Por outro lado, um compilador ler um programa inteiro de uma única vez e converte-o em um código-objeto, isto é, uma tradução do código-fonte para uma linhagem que a máquina pode entender, ou seja, em código binário. A Figura 1.1 ilustra o processo de compilação, de uma forma bem abstrata. Figura 1.1: O processo de compilação 14 Capítulo 1. INTRODUÇÃO Como a linguagem C é compilada, é possível criar um código-fonte em uma máquina, transformá-lo em código objeto (compilação) e distribuí-lo para ser usado em qualquer outro computador que utiliza o mesmo sistema operacional. Ademais, C possui as seguintes características: Portabilidade: é possível cirar um programa na linguagem C e, com poucas ou ne- nhuma adaptação, compilar em outra plataforma (por exemplo, Windows, Linux e Mac). Observe que esta portabilidade se refere ao código-fonte, não ao código-objeto. O resultado de uma compilação numa máquina com sistema operacional Windows não executará numa máquina com Linux. Modularidade: C permite usar apenas os recursos que serão necessários para o programa e também programar de maneira que facilita o reúso de código através da utilização de funções. Confiabilidade: C possui diversos compiladores e bibliotecas consolidadas que permi- tem agregar confiabilidade à plataforma de programação. Linguagem de nível médio: apesar de comumente a programação em C ser feita em alto nível, isto é, legível ao ser humano, ela permite fazer uso de recursos de hardware. Entretanto, neste material, nos concentraremos apenas em programação de alto nível. Case sensitive: a linguagem C diferencia letras maiúsculas de minúsculas. Por exemplo, ao declarar uma variável com o nome numero, fazer referência posterior como Numero resultará em um erro. Código-objeto: um programa executável (código-objeto) é o resultado da compilação de um ou mais arquivos com a extensão .c. Função main(): um programa escrito em C posui uma ou mais funções. Uma dessas é necessariamente a função main(), que é por onde o programa começa a ser executado. Uso de ponto e vírgula: cada comando em C é finalizado por um ; (ponto e vírgula). Uso de chaves: para agrupar um bloco de código, seja uma estrutura de decisão, laço 1.2 Ambiente de programação 15 de repetição ou função, usa-se {}, em que { delimita o início do bloco e } o fim. 1.2 Ambiente de programação Antes que possamos escrever o nosso primeiro programa em C é necessário con- figurar o ambiente de programação para esta linguagem. Minimalisticamente, o ambiente de programação necessita de apenas duas coisas: um editor de texto simples e um compila- dor C. Na internet, é possível encontrar diversas ferramentas que, após a instalação, já está com o ambiente configurado, por exemplo Code::Blocks (http://www.codeblocks.org) e Dev-C++ (https://sourceforge.net/projects/orwelldevcpp). Não obstante, neste material vamos usar o compilador GCC, presente na ferramenta MinGW, que pode ser baixado no link https://sourceforge.net/projects/mingw. Para instalar essa ferramenta, é necessário escolher Download no link acima e, após o processo de descarga do arquivo ser concluído, clicar sobre o arquivo. Ao fazê-lo, será dado início à instalação da ferramenta, como ilustrado na Figura 1.2. Nela, deve-se clicar em Install, posteriormente em Continue e, após baixar todas as dependências, Continue novamente. Uma nova interface será aberta, onde pode-se escolher os recursos que serão insta- lados. O usuário deve selecionar, minimamente, mingw32-base e mingw32-gcc-g++,como mostrado na Figura 1.3. Posteriormente, basta clicar no menu Instalation e Apply Changes. Uma tela de confirmação será aberta. Nela é suficiente pressionar Apply. Feitos esses passos, o compilador GCC já estará instalado no computador. Entretanto, ainda não é possível acessá-lo a partir de quaisquer diretórios do computador. Para fazê-lo, é necessário configurar as variáveis de ambiente. Acesse o Explorador de arquivos, em seguida clique com o botão auxiliar sobre Este Computador e escolher Propriedades. Uma interface será aberta, tu precisas clicar em Configurações avançadas do sistema. Uma nova tela surgirá; escolha Variáveis de ambiente. Essas duas telas são mostradas conjuntamente na Figura 1.4. http://www.codeblocks.org https://sourceforge.net/projects/orwelldevcpp https://sourceforge.net/projects/mingw 16 Capítulo 1. INTRODUÇÃO Figura 1.2: Passos iniciais da instalação do MinGW Figura 1.3: Recursos a serem instalados Na interface aberta, na área Variáveis do sistema, há uma variável chamada Path. Ao clicar sobre ela, há caminhos já estabelecidos para esta variável. Inclua uma nova, com o 1.2 Ambiente de programação 17 Figura 1.4: Variáveis de ambiente endereço "C:\MinGW\bin" (sem as aspas) assumindo que o MinGW foi instalado diretamente na partição C. A Figura 1.5 apresenta esse processo. Feito isso, é necessário clicar em OK em todas as janelas que estão abertas. Figura 1.5: Configuração da variável Path 18 Capítulo 1. INTRODUÇÃO Para testar se a configuração do ambiente está correto, abra o prompt de comando e digite gcc e tecle em enter. Se o resultado for gcc: fatal error: no input files está tudo configurado corretamente. Para a criação do código em C é suficiente qualquer editor de texto. Como sugestão, temos o Sublime Text, que pode ser baixado a partir do link https://www.sublimetext. com/3. 1.3 Primeiro programa em C Sempre que vamos aprender programação ou até mesmo uma nova linguagem, é comum escrevermos um programa que apenas mostra na tela uma mensagem: Hello world. A mitologia do desenvolvimento de sistemas diz que se começarmos por qualquer outro programa, seremos amaldiçoados de tal modo que não aprederemos aquela linguagem. Obviamente não existe mitologia do desenvolvimento de sistemas, bem como tal afirmação não faz o menor sentido. Entretanto, é uma tradição começarmos a aprender uma nova tecnologia (entenda linguagem) dessa forma, até porque é o exemplo mais trivial. Provavelmente foi também desta forma que tu fizeste em pseudocódigo. O Hello World em C é escrito da seguinte forma: 1 #include <stdio.h> 2 int main(){ 3 printf("Hello world"); 4 return 0; 5 } Listing 1.1: Hello world em C Para compilar o teu programa em C, abra ao prompt de comando (pode-se usar o combinação de teclas Windows + R, digitar cmd e precionar enter para isso), navegar até o diretório onde está o arquivo e escrever o seguinte comando: https://www.sublimetext.com/3 https://www.sublimetext.com/3 1.3 Primeiro programa em C 19 gcc nomeArquivo.c -o nomePrograma, sendo nomeArquivo.c o nome do arquivo que contém o código-fonte e nomePrograma o nome que tu desejas dar ao arquivo executável. Se nenhuma mensagem aparecer na tela significa que a compilação ocorreu de forma satistória. Basta agora executar o programa. Para isso, digite apenas o nome do arquivo executável, por exemplo, nomePrograma.exe. A mensagem Hello world aparecerá na tela. Se houver algum erro de sintaxe, o compilador retornará uma mensagem para tal propósito, a informar de forma bem clara o tipo de erro e indicando a linha em que ele ocorreu. Suponhamos que no programa apresentado na Listagem 1.1 não ouvesse o ponto e vírgula da linha 3. Ao tentar compilá-lo, a seguinte mensagem seria apresentada: Teste.c: In function ’main’: Teste.c:6:2: error: expected ’;’ before ’return’ No exemplo apresentado na Listagem 1.1, o programa começa (linha 1) com a inclusão de um biblioteca chamada stdio.h. Apesar dessa biblioteca não ser obritagório em programas escritos em C, na prática todos aqueles feitos por nós precisará dela. Isso porque, pelo que o próprio nome sugere, ela é o padrão para a entrada e saída. Em outras palavras, qualquer programa que precise receber algum dado do teclado ou enviar alguma mensagem para a tela precisa usá-la. Na linha 2 temos a declaração da função principal do programa. Como falado anteriormente, um programa em C é formado por um conjunto de funções, das quais a main() é a única obrigatória. A palavra int indica que esta função é do tipo inteiro (em outras palavras, retorna um número inteiro após sua execução, mas não se preocupe com essa informação ainda). Os parênteses sem nenhuma informação dentro indica que esta função não possui parâmetros (mais um vez, não se preocupe ainda com esta informação) e a abertura de chave indica o início do bloco de código que de fato realizará alguma ação na função. Na linha 3, a função printf() é usada para apresentar dados na saída padrão (tela). O print significa imprimir/mostrar e o f indica uma saída formatada. Na linha 4, a função retorna 20 Capítulo 1. INTRODUÇÃO a quem a invocou o resultado 0 e a linha 5 contém apenas o fechamento de chave, a indicar o fim da função. 1.4 Tipos de dados em C Dados são elementos quantificáveis (numéricos) ou qualificáveis (textuais) e são essenciais para o estudo e construção de algoritmos. Vejamos, um algoritmo é construído para resolver um problema e, para tal resolução, é necessário que seu projetista escolha uma forma de representação da realidade, que geralmente são definidos em termos de dados e suas representações. De fato, em um algorimo, as entradas são feitas com dados, o processamento manipula esses dados e a saída é também um conjunto de dados. Geralmente, um programa envolve interação com o operador, isto é, dados são enviados para o programa, são processados e, por último, gera uma saída. Para que isso seja possível, dados são armazenados em variáveis que, em C, estão associadas a tipos. Em C, há cinco tipos de dados primitivos: char, que representa caractere ou dígito, isto é, é capaz de armazenar apenas um caractere por vez; int (inteiro); float, que são números de ponto flutuante (real); double, que também armazena números de ponto ponto flutuante, mas de precisão dupla e; void, isto é, sem valor. Todos os outros tipos de dados de dados em C são baseados em um desses tipos. A escolha por um ou outro tipo, bem como suas derivações, pode está associada ao tamanho ocupado na memória e a faixa de valores aceitáveis para cada tipo. As derivações dos tipos básicos são feitas a partir dos modificadores insigned, short e long. A Tabela 1.1 apresenta os tipos de dados, incluindo as modificações, tamanho e limites. 1.5 Variáveis Sempre que escrevemos um programa, precisamos prepará-lo para receber, manipular e exibir dados. Para isso, eles precisam ser armazenados – tarefa feita na memória do 1.5 Variáveis 21 Tabela 1.1: Tipos básicos da linguagem C Tipo Tamanho (bytes) Limites int 4 -2.147.483.648 a -2.147.483.647 unsigned int 4 0 a 4.294.967.295 short int 2 -32.768 a 32.767 unsigned short int 2 0 a 65.535 float 4 Seis dígitos de precisão double 8 Dez dígitos de precisão long double 12 Dez dígitos de precisão char 1 -127 a 127 unsigned char 1 0 a 255 computador – e cada parte da memória tem um endereço interno. Agora imagine você, como programador, precisar manipular os endereços da memória onde um determinado dado será armazenado! Certmente esta seria uma tarefa muito dispendiosa e pouco produtiva para um programador de alto nível1. Para atenuar essa dificuldade, foi criado o conceito de variável. Tecnicamente, declarar uma variável pode ser entendida como o processo de reservar um pedaço da memória para o armazenamento de algum dado. Este, por sua vez, pode sofrer alterações de valores durante a execução do programa (por isso o nome variável). Na escrita de programas, variáveis são usadas para representar valoresdesconhecidos, podendo ser atribuído qualquer valor do conjunto de dados que ele suporta, de acordo com a Tabela 1.1. Assim, uma variável armazena dados de forma temporária. Exemplificando, tu foste desafiado a escrever um programa que calcule áreas de retângulos. Como bem sabemos, a área dessa figura geométrica é calculada como segue: a = b ∗ h, em que a é a área, o que se deseja calcular; b é a base e; h é a altura. É fácil perceber que trata-se de dados numéricos e a escolha se serão do tipo real ou inteiro depende da especificação do problema. No exemplo, vamos admitir apenas dados inteiros. 1Programação de alto nível não é referente a qualidade, mas sim ao fato de utilizar linguagem de programação de alto nível. Uma linguagem de programação de alto nível usa comandos relativamente próximos da linguagem natural, como palavras, como por exemplo, for, if, else, break. Por outro lado, programação de baixo nível usa linguagem de máquina. 22 Capítulo 1. INTRODUÇÃO Para resolver tal problema, no programa tu precisarás declarar variáveis. Uma declaração de variável é feita da seguinte forma: tipo_de_dado nome_da_variavel; O tipo de dado já foi visto e o nome da variável é uma sequência de caracteres, começando obrigatoriamente com uma letra minúscula ou maiúscula, seguida ou não de letras, números ou o caractere especial underscore (_). Nenhum outro caractere especial é admitido. Do exemplo, podemos ter o seguinte bloco de declaração de variáveis: int area; int base; int altura; Como há mais de uma variável do mesmo tipo, podemos declará-las na mesma linha: int area, base, altura; Observação: é altamente recomendado utilizar palavras significativas na declaração de variáveis, como feito no exemplo acima. Apesar do fato de que neste exemplo a declaração de variáveis com nomes a, b e h fosse suficente para representar a área, a base e a altura, em algoritmos menos triviais, com mais variáveis, eses tipo de nomenclatura causaria bastante confusão no código. Por uma questão de organização de código, costuma-se declarar variáveis com letras minúsculas, se elas representam apenas uma palavra, por exemplo, idade, nome. Caso a variável contenha duas ou mais palavras, é comum utilizarmos a inicial, a partir da segunda palavra, maiúscula. Por exemplo, se em um programa de uma loja desejamos criar uma variável para armazenar a idade de um cliente, seu nome poderia ser idadeCliente. Salienta-se que seguir este padrão não é obrigatório do ponto de vista das linguagens de programação, mas sim um padrão de escrita. A declaração de variáveis pode ser feita em qualquer linha do programa. Não há um bloco expecífico para fazê-la. 1.6 Constantes 23 1.6 Constantes Similarmente a uma variável, uma constante é uma representação simbólica que permite ao programador reservar espaço na memória para armazenar valores. Em contrapartida, como é bem intuitivo, armazena valores que não sofrem alteração. Por exemplo, na expressão abaixo o valor 3.1415 é atribuído à constante do tipo real PI e permanecerá fixo até o final da execução: #define PI 3.1415; A declaração de uma constante deve ser feita no iníco do programa e é constituída pelo caractere #, pela palavra reservada define, pelo nome da constante, pelo valor e pelo ponto e vírgula, nesta sequência. Para melhor diferenciação de constantes das variável, costumamos escrevê-las em letras maiúsculas. 1.7 Operadores Operadores são utilizados para representar expressões de cálculo, comparação, condi- ção e atribuição. Veremos os tipos de operadores nas subseções abaixo. 1.7.1 Operadores aritméticas Durante a resolução dos nossos algoritmos muitas vezes é necessário fazermos uso das operações aritméticas, que são as operações que utilizamos ao se realizar cálculos matemáticos. Em C, assim como na matemática, as operações são representadas por símbolos e possuem uma ordem de precedência, conforme a Tabela 1.2. Em C, precisamos ter cuidado em usar alguns operadores aritméticos. Por exemplo, supomos que em algum local do nosso código temos quo = num1/num2, em que quo é um número real e num1 e num2 são números inteiros. Imaginemos também que num1 tem valor 9 e num2 tem valor 2. O resultado desta divisão é, sabidamente, 4.5. 24 Capítulo 1. INTRODUÇÃO Tabela 1.2: Ordem de precedência das operações aritméticas Ordem Símbolo Operação 0 % Retorna o resto da divisão entre dois número inteiros 1 * Multiplicação 2 / Divisão 3 + Soma 4 - Subtração Entretanto, ao fazer isso o resultado é apenas 4 (a impressão mostará 4.000000). Em C, a divisão entre dois números inteiros resulta em um valor inteiro. Se quisermos dividir esses dois valores e gerar um resultado do tipo real, primeiramente temos que "converter" um deles, divisor ou dividento, para real. Esse processo, chamado cast de fato não converte a variável para outro tipo (isso não é permitido em C, uma variável nasce de um tipo e permanece desse tipo para sempre), ele apenas faz a operação considerar o valor da varíavel de outra forma. Por exemplo, ao fazer quo = ( f loat)num1/num2, o resultado armazenado em quo será 4.500000. A palavra float entre parênteses fez a operação considerar o valor contido em num1 como real. Se essa mesma interpretação precisar ser feita em outra operação, o processo precisa ser repetido. Existe também um conjunto de funções que são disponibilizadas através da biblioteca math.h, que possibilita o uso de um conjunto de funções matemáticas que não são fornecidas de forma nativa pelo C. A Tabela 1.3 apresenta algumas funções disponibilizadas pela biblioteca supracitada. As funções possuem precedência de execução sobre as operações matemáticas. Ainda sobre a precedência, pode-se fazer uso de parênteses e assim alterar a ordem de execução das operações. Vale ressaltar que é uma boa prática utilizar-se de parênteses durante a escrita do código, pois facilita a leitura e interpretação. 1.7 Operadores 25 Tabela 1.3: Exemplo de funções disponibilizadas pela biblioteca math.h Nome Funcionalidade floor() Arredonda para baixo ceil( ) Arredonda para cima sqrt( ) Calcula raiz quadrada pow(v, exp) Potenciação sin( ) Seno cos( ) Cosseno tan( ) Tangente log( ) Logaritmo natural log10( ) logaritmo base 10 1.7.2 Operador de atribuição Em C, a atribuição de um valor a uma variável é feita pelo operador representado pelo símbolo =. Observe que = é usado para representar atrirbuição, não a comparação de igualdade. Esta, por sua vez, é feita utilizando ==. Em programação, muitos operadores sao sempre usados em conjunto com o operador de atribuicão. Para tornar essa tarefa mais simples, a linguagem C permite simplificar algumas expressoes, como mostra a Tabela 1.4. Tabela 1.4: Operadores de atribuição simplificada Operador Significado Exemplo += Soma e atribui x += y igual a x = x+y -= Subtrai e atribui x -= y igual a x = x-y *= Multiplica e atribui x *= y igual a x = x*y /= Subtrai e atribui o quociente x /= igual a x = x/y %= Divide e atribui o resto x = % y igual a x = x%y 1.7.3 Operadores relacionais Os operadores relacionais, presentes na Tabela 1.5, servem para estabelecer uma relação de comparação entre valores ou expressões. O resultado dessas comparações são sempre um valor lógico (isto é, verdade ou falsidade). 26 Capítulo 1. INTRODUÇÃO Tabela 1.5: Operações relacionais Operador Símbolo Operação Maior que > Retorna verdade caso o operando da esquerda seja maior que o da direita. Falsidade caso contrário Maior ou igual a >= Retorna verdade caso o operando da esquerda seja maior ou igual ao da direita. Falsidade caso contrário Menor que < Retorna verdade caso o operando da esquerda seja menor que o da direita. Falsidade caso contrário Menor ou igual <= Retorna verdade caso o operando da esquerda seja menor ou igual ao da direita. Falsidade caso contrário Igual a == Retorna verdade caso ambos os operandos tenham o mesmo valor. Falsidade caso contrário Diferente de != Retorna verdade caso os dois valores sejam distintos.1.7.4 Operadores lógicos Os operadores lógicos são utilizados para associar expressões que estabelecem uma relação de comparação de valores. Igualmente aos operadores relacionais, tem como resultado sempre um valor lógico. A Tabela 1.6 apresenta a lista de operadores, bem como os símbolos utilizados em C. Tabela 1.6: Operações lógicas Operador Símbolo Operação E && Retorna verdade somente se os dois operandos forem verdades OU || Retorna verdade se ao menos um operando for verdade NÃO ! Inverte o valor lógico do operando 1.8 Entrada e saída Em C, as entradas e as saídas de dados são feitas não a partir de comandos, mas sim de funções. Como já vimos, utilizamos a biblioteca stdio.h para isso. Por padrão, a leitura é feita via teclado e a saída através do monitor e as funções são, repectivamente, scanf() e printf(). 1.8 Entrada e saída 27 1.8.1 A função de escrita printf() A função printf() permite realizar a escrita de dados na tela do computdor, conforme vimos no primeiro exemplo programa, em que a mensagem Hello world foi apresentada. Porém, esta função apresenta saída formatada, que pode ser feita de várias formas. De maneira geral, essa função apresenta uma cadeia de caracteres. Dentro desta cadeia, entretanto, podemos incluir nenhum ou vários códigos de controle, tais como %d, %f, %c, \n etc. Imaginemos a seguinte linha: printf("A razão de %d sobre %d é %f\n", 10, 4, 2.5). Ela mostrará na tela a seguinte mensagem: A razão de 10 sobre 4 é 2.5, seguido de um salto de linha (\n). Na saída, os códigos de controle são substituídos por valores após a cadeia de caracteres. No exemplo acima, o primeiro %d (que indica número inteiro) é substituído pelo primeiro valor após a cadeia, que é 10. O segundo %d é substituído pelo segundo valor após a cadeira, que é 4. O terceiro código, %f (que indica número de ponto flutuante) é substituído pelo terceiro valor após a cadeia, que é 2.5. A Tabela 1.7 apresenta os principais códigos de controle da função printf(). Tabela 1.7: Principais códigos de controle da função printf() Código Descrição %d Indica a posição do valor inteiro na notação decimal %o Indica a posição de um valor inteiro na notação octal %x Indica a posição de um valor inteiro na notação hexadecimal %c Indica a posição de um caractere. Apenas um único caractere %s Indica a posição de uma cadeia de caracteres (string) %f Indica a posição de um valor real (float) na notação decimal %lf Indica a posição de um valor real de precisão dupla (double) na notação decimal %% Insere um sinal de percentagem (%) \n Insere uma nova linha \t Insere uma tabulação \" Insere asplas duplas " \\ Insere contrabarra 28 Capítulo 1. INTRODUÇÃO 1.8.2 A função de leitura scanf() A função scanf() permite fazer a leitura de dados digitados pelo usuário através do teclado. Para explicá-la, vamos partir do seguinte exemplo: scanf("%d", idade), em que idade é uma variável do tipo int previamente declarada. Observe que a função scanf() possui ao menos duas partes, seperada por vírgula. A primeira, entre aspas, contém o código de controle que indica à função o deve ser lido. No exemplo, %d indica que a função receberá um valor inteiro. A segunda é inciada pelo símbolo &, seguido de uma variável. O & indica que o valor lido será armazenado no local de memória indicado pela variável. Os códigos de controle da função scanf() são os mesmos referentes aos tipos de dados visto na função print(), isto é, %d, %o, %x, %c, %s, %f, %lf. Ademais, uma única função printf() pode fazer múltiplas leituras. Por exemplo, em scanf("%d%f%c", a, b, c) ler um inteiro, um real e um caractere, nesta ordem. 1.9 Prática de C A partir dos conceitos apresentados, já podemos criar um programa em capaz de realizar a leitura de dois números inteiros e em seguida apresentar valor da soma dos mesmos, conforme a Listagem 1.2. O código pode ser explicado da seguinte maneira: (1) Realizado a reserva de 3 espaços da memória para armazenar os valores das variáveis inteiras n1,n2 e resultado (linha 4); (2) Apresenta, no monitor, a mensagem Informe o primeiro número inteiro (linha 5); (3) Lê o valor informado pelo usuário via teclado e o guarda no espaço de memória (linha 8); (4) Apresenta, no monitor, a mensagem Informe o segundo número inteiro: (linha 7); (5) Lê o valor informado pelo usuário via teclado e o guarda no espaço de memória (linha 1.9 Prática de C 29 8); (6) Realiza a operaçã matemática de soma das variáveis n1 e n2 e em seguida o resultado é armazenado. (linha 9); (7) Apresenta a mensagem O valor da soma é: , seguido do valor da variável resultado. 1 #include <stdio.h> 2 int main() 3 { 4 int n1, n2,resultado; 5 printf("Informe o primeiro número inteiro: "); 6 scanf("%d", &n1); 7 printf("Informe o primeiro número inteiro: "); 8 scanf("%d", &n2); 9 resultado = n1 +n2; 10 printf("O valor da soma é: %d\n",resultado); 11 return 0; 12 } Listing 1.2: Soma de dois numeros Outro exemplo de programa que podemos criar é um programa para resolver uma equação de primeiro grau com uma incôgnita. Uma equação desse tipo tem a forma a.x+b= 0, em que x é a variável, a é o coeficiente e b é o termo independente. Observa-se ainda que necessariamente a 6= 0. Para resolvê-la, devemos isolar a variável x, assim: x = −ba . Então, teremos o valor de x. Na Listagem 1.2 é apresentado a codificação da solução. 1 #include <stdio.h> 2 int main() 3 { 4 float a, b, x; 5 printf("Informe o coeficiente ’a’ e o termo independente ’b’ da equaçã o\n"); 6 scanf("%f %f", &a, &b); 30 Capítulo 1. INTRODUÇÃO 7 x = -b/a; 8 printf("O valor de x é: %f",x); 9 return 0; 10 } Listing 1.3: Resolução de equação do primeiro grau em C Segue uma explicação do código anterior: (1) Realizado a reserva de 3 espaços da memória para armazenar os valores das variáveis do tipo float a, b e x (linha 4); (2) Apresenta no monitor uma mensagem para o usuário solicitando que informe os valo- res(linha 5); (3) Lê os valores informados pelo usuário (linha 6); (4) Realiza a operação matemática −ba e armazenar o resultado na variável x (linha 7); (5) Apresenta a mensagem O valor de x é: , seguido do valor da variável x (linha 8). 1.9 Prática de C 31 HANDS ON 1 1. Escreva um programa em C que leia uma medida dada em jardas e converta para metros. Fórmula de conversão: 1 jarda = 0,9144 metro. 2. Escreva um programa em C que leia uma temperatura em Fahrenheit e converta- a para o equivalente em graus Celsius. Fórmula de conversão: c = 5 9 ∗ ( f −32) (1.1) 3. Escreva um programa em C que transforme o valor conrrespondente a um intervalo temporal, expresso em horas, minutos e segundos, no valor correspondente em segundos. 4. Leia o texto a seguir: Uma pessoa foi ao mercado e comprou 3,5 kg de fraldinha para fazer um churrasco, sabendo-se que o preço do quilograma da carne é 23,79 rais. Entendendo que a pessoa poderia optar por escolher qualquer outra carne, de preços diferentes,bem como escolher outra quantidade, escreva um programa que tenha como entradas a quantidade de carne comprada e o valor do quilograma e como saída o valor total a pagar pela compra. 5. A velocidade média de um veículo é dada pela expressão Vm = δ sδ t , em que δ s é a variação de espaço, em quilômetros, e δ t é a variação do tempo, em horas. Escreva um algoritmo que receba a variação do espaço e a variação do tempo e apresente a velocidade média do veículo no percurso. 6. Escreva um programa que leia, como número real, as coordenadas de dois pontos no plano cartesiano e imprima a distância entre esses dois pontos. A fórmula da 32 Capítulo 1. INTRODUÇÃO distância entre dois pontos (x1,y1) e (x2,y2) é: √ (x2− x1)2 +(y2− y1)2 (1.2) 7. Dados três valores reais aramazenados nas variáveis a, b e c, calcule as médias aritmética, geométrica e harmônica desses valores. Escreva um programa que calcule também a média ponderada, considerando peso 1 para o primeiro valor, peso 2 para os segundo valor e peso 3 para o terceiro.Fórmulas: Média aritmética: a+b+ c 3 (1.3) Média geométrica: 3√a∗b∗ c (1.4) Média harmônica: 3 1 a + 1 b + 1 c (1.5) Média ponderada: 1∗a+2∗b+3∗ c 1+2+3 (1.6)
Compartilhar