Вы находитесь на странице: 1из 19

2.

Introduo Linguagem C
2.1 Variveis simples O que uma varivel
No captulo 1 foi dito que uma das unidades bsicas de um computador a memria, cuja finalidade armazenar dados e informaes que sero manipulados pela unidade central de processamento. Naquele captulo tambm foi dito que os programas para serem executados devem estar armazenados na memria. Ou seja, a memria armazena programas que sero executados e dados que estes programas vo manipular. Naturalmente, os dados que o programa vai manipular podem ser dados de entrada ou dados gerados pela execuo do programa. Para que possa armazenar dados e informaes, a memria dividida em partes, chamadas posies de memria. O sistema operacional que gerencia o sistema de computao pode acessar cada uma destas posies para armazenar tais dados. Para que o acesso s posies de memria seja possvel, a cada uma delas est associada uma sequncia de bits, chamada endereo da posio de memria. Como uma sequncia de bit's corresponde a um nmero inteiro escrito no sistema binrio, cada endereo pode ser visto como um inteiro escrito no sistema decimal. Assim temos posies de memria de endereo 1209 ou 2114, por exemplo. Uma varivel simples (ou simplesmente varivel) uma posio de memria cujo contedo pode ser modificado durante a execuo de um programa. A referncia a uma varivel no programa feita atravs do seu identificador; os valores que podem ser nela armazenados dependem do seu tipo de dado.

O identificador
O identificador uma sequncia de letras, dgitos e caractere para sublinhamento escolhida pelo programador e (como foi dito acima) ser utilizado no programa para se fazer referncia quela varivel (o primeiro caractere do identificador no pode ser um dgito). Como um programa deve ser legvel por outros programadores (e pelo prprio programador), uma boa prtica se escolher um identificador de uma varivel que tenha alguma relao com a sua finalidade. Se uma varivel deve armazenar uma soma, um identificador muito bom para ela ser Soma. Se uma varivel vai receber nmeros, ela poderia ser identificada por Num ou por Numero. Os compiladores da linguagem C fazem distino entre letras maiusculas e minsculas e, portanto, Numero e numero so dois identificadores diferentes. Manteremos, de um modo geral, a seguinte conveno ao longo do texto: quando um identificador possuir mais de um caractere, inici-lo-emos por letra maiuscula e quando o identificador tiver um nico caractere, utilizaremos letra minscula. Como veremos ao longo do livro, a linguagem C fixa alguns identificadores para a sintaxe de suas instrues. Estes identificadores no podem ser utilizados nos programas, sendo conhecidos por palavras reservadas. Algumas das palavras reservadas em C so:
Tabela 2 Palavras reservadas da linguagem C

auto break case char const continue default do

double else enum extern float for goto if

int long register return short Signed sizeof static

struct switch typedef union unsigned void volatile while

O tipo de dado
O tipo de dado associado a uma varivel o conjunto dos valores que podem ser nela armazenados. A linguagem C dispe dos tipos de dados discriminados na tabela a seguir.
Tabela 3 Tipos de dados da Linguagem C

Denominao char int long ou long int float double void

Nmero de Bytes 1 2 4 4 8 0

Conjunto de valores caracteres codificados no cdigo ASCII nmeros inteiros de 32768 a 32767 nmeros inteiros de 65536 a 65535 nmeros reais de 3,4x1038 a 3,4x10-38 e 3,4x10-38 a 3,4x1038 nmeros reais de 1,7x10308 a -1,7x10-308 e 1,7x10-308 a 1,7x10308 conjunto vazio

A utilizao void ser melhor explicada no captulo 5, quando estudarmos funes. Uma observao importante que os tipos float e double, rigorosamente falando, no armazenam nmeros reais e sim nmeros de um sistema de ponto flutuante, que no contm todos os reais entre dois nmeros reais dados. O estudo de sistemas de ponto flutuante foge ao escopo deste livro e feito, normalmente, em disciplinas do tipo Organizao e Arquitetura de Computadores e Clculo Numrico. Vale lembrar que, de um modo geral, um byte contm oito bit's e cabe ressaltar que, em algumas situaes, importante se conhecer a quantidade necessria de bytes para uma varivel de um determinado tipo.

Declarao de variveis
Para que o sistema de computao possa reservar as posies de memria que sero utilizadas pelo programa, associar identificadores aos endereos destas posies de memria e definir a quantidade de bytes de cada posio de acordo com o tipo de dado pretendido, um programa escrito em C deve conter a declarao de variveis, feita atravs da seguinte sintaxe: Tipo de dado Lista de identificadores; Por exemplo, um programa para determinar a mdia de uma relao de nmeros dados pode ter a seguinte declarao: int Quant; float Num, Soma, Media; A ideia que Quant seja utilizada para armazenar a quantidade de nmeros; Num para armazenar os nmeros (um de cada vez); Soma para armazenar a soma dos nmeros; e Media para armazenar a mdia procurada. Nas sees 2.7 e 2.9 veremos as instrues em C para o armazenamento em variveis de dados de entrada e de dados gerados pela execuo do algoritmo. Um valor armazenado em uma varivel comumente referido como sendo o contedo da varivel ou o valor da varivel. Tambm comum se referir ao identificador da varivel como sendo a prpria varivel.

2.2 Constantes
Como uma varivel, uma constante tambm uma posio de memria qual devem ser associados um identificador e um tipo de dado. O que caracteriza uma constante (e da sua denominao, emprestada da matemtica) o fato de que o contedo de uma constante no pode ser modificado durante a execuo do programa. Este contedo fixado quando da declarao da constante o que deve ser feito de acordo com a seguinte sintaxe: const Tipo de Dado Identificador = Valor;

Por exemplo, um programa para processar clculos qumicos poderia ter uma declarao do tipo
const float NumAvogadro = 6.023E+23; onde a expresso 6.023E+23 a forma que os compiladores C utilizam para representar os valores do tipo float na notao cientfica, ou seja 6.023E+23 = 6.023 x 1023. Um programa para clculos de reas de figuras planas, permetros de polgonos inscritos em circunferncias, etc., poderia ter uma declarao do tipo const float Pi = 3.1416; Esta declarao desnecessria quando o sistema utilizado o Turbo C++ 3.0, pois esse sistema disponibiliza uma constante pr-definida, identificada por M_PI, que pode ser utilizada em qualquer parte do programa e cujo valor uma aproximao do nmero irracional .

2.3 Expresses aritmticas


Como era de se esperar, os compiladores da linguagem C so capazes de avaliar expresses aritmticas que envolvam as operaes binrias de multiplicao, diviso, soma e subtrao e a operao unria de troca de sinal. Para isto so usados os seguintes operadores aritmticos binrios:
Tabela 4 Operadores aritmticos

Operador + * /

Operao adio subtrao multiplicao diviso

e o operador aritmtico unrio (-) para a troca de sinal. Esses operadores atuam com operandos do tipo int ou do tipo float. Se um dos operandos for do tipo float o resultado da operao ser do tipo float; se os dois operandos forem do tipo int o resultado tambm do tipo int. No caso do operador de diviso /, se os dois operandos forem do tipo int o resultado da operao do tipo int e igual ao quociente da diviso do primeiro operando pelo segundo. Por exemplo, o resultado de 30/4 7. Se quisermos a diviso decimal teremos de escrever 30.0 / 7.0 ou 30.0 / 7 ou 30 / 7.0. Ou seja cada uma destas divises igual a 7.5 e este valor, tal como ele , pode ser armazenado numa varivel do tipo float. O que acontece que no armazenamento de um valor do tipo float numa varivel do tipo int a parte decimal do valor desprezada, s sendo armazenada a parte inteira do nmero. Uma expresso que envolva diversas operaes avaliada de acordo com as regras de prioridade da matemtica: em primeiro lugar realizada a operao troca de sinal, em seguida so realizadas as multiplicaes e divises e, finalmente, as somas e subtraes. Por exemplo, a expresso 8 + 2*-3 avaliada como 8 + (-6) = 2. Naturalmente, a prioridade pode ser alterada com a utilizao de parnteses: a expresso (8 + 2)*-3 resulta em 10*(-3) = -30. Embora, o sistema no exija, vamos sempre utilizar parnteses para separar o operador unrio para troca de sinal de algum operador binrio. Assim, 8 + 2*-3 ser indicada por 8 + 2*(-3). Uma expresso no parentesada contendo operadores de mesma prioridade avaliada da esquerda para direita. Por exemplo, 10/2*3 igual a (10/2)*3 = 5*3 = 15. Operandos podem ser contedos de variveis. Neste caso, o operando indicado pelo identificador da varivel ( para isto que serve o identificador, para se fazer referncia aos valores que na varivel esto armazenados). Alm dos operadores aritmticos usuais, os compiladores C disponibilizam o operador mdulo, indicado por %, que calcula o resto da diviso do primeiro operando pelo segundo. Por exemplo, 30 % 4 = 2 e 5 % 7 = 5. Este operador atua apenas em operandos do tipo int, resultando um valor deste mesmo tipo. Por exemplo, se S uma varivel do tipo float, a expresso S % 5 gerar um erro de compilao. Uma expresso do tipo 30.0 % 7 tambm gerar erro de compilao, pelo fato de que um dos operandos no inteiro. Este erro indicado pelo sistema pela mensagem Illegal use of floating point in function ... (Uso ilegal de tipo float na funo ...), onde as reticncias esto substituindo o identificador da funo, como ser discutido posteriormente.

2.4 Relaes
Os ambientes que implementam a linguagem C efetuam comparaes entre valores numricos, realizadas no sentido usual da matemtica. Essas comparaes so chamadas relaes e so obtidas atravs dos operadores relacionais > (maior do que), >= (maior do que ou igual a), < (menor do que), <= (menor do que ou igual a), == (igual) e != (diferente). O resultado da avaliao de uma relao 1 (um), se a relao for matematicamente verdadeira, ou 0 (zero), se a relao for matematicamente falsa. Assim, 3 > 5 resulta no valor 0 (zero), enquanto que 7 <= 7 resulta no valor 1 (um). Sendo um valor 1 (um) ou 0 (zero), o resultado da avaliao de uma relao pode ser armazenado numa varivel do tipo int. Os operandos de uma relao podem ser expresses aritmticas. Nestes casos, as expresses aritmticas so avaliadas em primeiro lugar para, em seguida, ser avaliada a relao. Por exemplo, a relao 3*4 - 5 < 2*3 - 4 resulta no valor 0 (zero), pois 3*4 - 5 = 7 e 2*3 - 4 = 2. Isto significa que os operadores relacionais tm prioridade mais baixa que os aritmticos.

2.5 Expresses lgicas


Os compiladores C tambm avaliam expresses lgicas obtidas atravs da aplicao dos operadores lgicos binrios &&, || e ^ a duas relaes ou da aplicao do operador lgico unrio ! a uma relao. Se R1 e R2 so duas relaes, a avaliao da aplicao dos operadores lgicos binrios, de acordo com os valores de R1 e R2, so dados na tabela abaixo.
Tabela 5 Avaliao de expresses lgicas

R1 1 1 0 0

R2 1 0 1 0

(R1)&&(R2) 1 0 0 0

(R1)||(R2) 1 1 1 0

(R1) ^ (R2) 0 1 1 0

Ou seja, uma expresso lgica do tipo (R1)&&(R2) s recebe o valor 1 (um) se os valores de R1 e de R2 forem iguais a 1 (um); uma expresso lgica do tipo (R 1)||(R2) s recebe o valor 0 (zero) se os valores de R 1 e de R2 forem iguais a 0 (zero); uma expresso lgica do tipo (R1) ^ (R2) s recebe o valor 1 (um) se apenas um dos valores de R1 e R2 for igual a 1. O leitor j deve ter percebido que o operador && age como o conectivo e da nossa linguagem; o operador || atua como o nosso e/ou e o operador ^ como o conectivo ou. A aplicao do operador unrio ! simplesmente inverte o valor original da relao:
Tabela 6 Operador unrio !

R1 1 0

!R1 0 1

Considerando que os operadores &&, || e ^ possuem o mesmo grau de prioridade, se uma expresso no parentesada possuir mais de uma relao, ela ser avaliada da esquerda para direita. O operador unrio ! tem prioridade em relao aos operadores binrios. Assim, ! (5 > 3) || (5 < 3) tem valor 0 (zero), pois ! (5 > 3) uma relao falsa e 5 < 3 tambm . Considerando que os operadores lgicos tm prioridade mais baixa que os operadores relacionais, os parnteses nas expresses acima so desnecessrios; porm entendemos que a colocao deles facilita a leitura da expresso. Os sistemas C 2.01 e C++ 3.0 tambm disponibilizam os operadores lgicos & e | cujas aplicaes so idnticas s aplicaes de && e ||, respectivamente. A diferena entre & e &&, por exemplo, a seguinte: se em (R1) && (R2) o valor de R1 for 0 (zero) o valor R2 no mais avaliado, enquanto que em (R1) & (R2) o valor de R2 avaliado, independentemente do valor de R1.

2.6 Estrutura de um programa em C


Estamos tentando aprender a escrever programas na linguagem C. J vimos que se o programa necessitar manipular variveis, estas devem ser declaradas. Veremos no captulo 5 que um programa pode conter funes. Na verdade, veremos que um programa em C um conjunto de funes definidas pelo programador, funes que utilizaro outras funes definidas pelo programador e algumas funes oferecidas pelo sistema (as funes oferecidas pelo sistema so chamadas funes de biblioteca ou funes pr-definidas). Veremos no citado captulo que uma funo deve ser definida com a seguinte estrutura. Tipo de Dado Identificador da funo(Lista de parmetros) { Declarao de variveis Sequncia de instrues } onde o significado de Lista de parmetros ser explicado no captulo j referido e a Sequncia de instrues contm comandos, ativaes de funes pr-definidas e ativaes de funes definidas pelo usurio no prprio programa ou em outros programas. Todo programa em C deve conter uma funo identificada por main (cuja traduo principal), com lista de parmetros vazia e tipo de dado no obrigatrio. Esta ser sempre a primeira funo do programa a ser executada. Desta forma, o menor programa em C main() { } Este programa pode ser executado, mas nada realiza, devido ao fato de que ele no contm nenhuma instruo. Observe que todo o corpo da funo deve estar disposto entre chaves. As chaves so utilizadas em outros pontos de um programa e so chamadas delimitadores. Os delimitadores, o identificador main e os parnteses, dispostos ao lado do identificador main, so os nicos elementos obrigatrios de um programa. Como os compiladores C ignoram espaos em branco, caracteres de tabulao e caracteres de mudana de linha, no existe um estilo obrigatrio de se editar programas em C. Por exemplo, o programa acima poderia ser escrito de uma das seguintes maneiras. main ( ) { } ou main(){} ou main( ){} Evidentemente, um programador em C deve procurar escrever seus programas num estilo que oferea uma boa legibilidade, o que vai facilitar a sua compreenso por outra pessoa e a descoberta de possveis erros de lgica.

2.7 Entrada dos dados de entrada A funo scanf()


A maioria dos programas manipula dados que so fornecidos pelo usurio durante a execuo do

programa. Estes dados constituem a entrada do programa e, naturalmente, devem ser armazenados em variveis. Por exemplo, um programa para determinao das razes de uma equao do segundo grau deve receber como entrada os valores dos trs coeficientes da equao: so estes valores que identificam a equao. De um modo geral, os compiladores C permitem a recepo de dados de entrada (e o consequente armazenamento em variveis) atravs da funo de biblioteca scanf() que possui a seguinte sintaxe: scanf(Expresso de controle, Lista de variveis); A, Expresso de controle deve ser escrita entre aspas e contm os cdigos de converso que indicam como o sistema deve armazenar os dados digitados no teclado e caracteres que o usurio deve digitar separando a digitao destes dados. Na Lista de variveis as variveis so separadas por vrgulas e cada uma delas deve ser precedida do operador de endereo &. Este operador indica o endereo da posio de memria definida para a varivel identificada na lista de variveis. Quando da execuo desta funo, a janela de edio substituda pela janela do usurio e o sistema fica aguardando que o usurio digite um nmero de valores igual ao nmero de variveis da lista de variveis ( medida que so digitados, os valores aparecem na tela do usurio). A concluso da entrada dos dados feita com a digitao da tecla <enter> e quando isto feito, o sistema armazena os dados digitados na varivel respectiva (no sentido da ordem da colocao da varivel na lista e da digitao do valor), de acordo com o cdigo de converso. Por exemplo, #include <stdio.h> main() { int Anos scanf("%d", &Anos) } um programa em C que armazena um valor inteiro digitado no teclado na varivel Anos (ou seja, para nada serve, pois o inteiro armazenado naquela posio de memria esvanece quando a execuo do programa encerrada). Quando se vai dar entrada em mais de um dado atravs de uma mesma ativao da funo scanf(), pode-se fixar caracteres que devero ser digitados quando da entrada dos dados. Por exemplo, se pretendemos dar entrada numa data, podemos ter o seguinte trecho de programa: #include <stdio.h> main() { int Dia, Mes, Ano; scanf("%d/%d/%d", &Dia, &Mes, &Ano); . . . } e a data pretendida deve ser digitada no formato dd/mm/aaaa, devendo o usurio digitar as barras entre as digitaes do dia e do ms e deste e do ano. A concluso se d com a digitao da tecla <enter>, como se estivesse digitando um nico dado. A digitao das barras necessria pelo fato de que elas esto separando os cdigos de formatao na expresso de controle. Se aps a digitao do valor da varivel Dia for acionada a tecla <enter>, a execuo da funo encerrada e os valores de Mes e Ano no podem ser digitados. Se no h nenhum caractere separando os cdigos de formatao, a digitao dos dados pode ser intercalada pela digitao da tecla <enter> ou da <barra de espaos>. o caso, por exemplo, do trecho de programa main() { int i; char c; scanf("%c %d", &c, &i); . . . }

onde as digitaes do caractere que se pretende armazenar na varivel c e do inteiro a ser armazenado em i devem ser separadas pelo acionamento da tecla <enter> ou da <barra de espao>. necessrio notar que a digitao de um valor de um tipo diferente do tipo da varivel no provoca erro de execuo, mas, evidentemente, pode provocar erro de lgica do programa. Por exemplo, se na execuo do comando scanf("%c %d", &c, &i); digitarmos w<enter>5.9<enter>, o caractere w armazenado na varivel c e o inteiro 5 armazenado na varivel i. Portanto, se o dado de entrada fosse realmente 5.9, o resultado do processamento poderia ser fornecido com erros. Se o dado de entrada poderia ser 5.9, a varivel para seu armazenamento deveria ter sido definida com float.

Os cdigos de converso e a instruo #include <stdio.h>


Os cdigos de converso de acordo com o tipo de dado da varivel onde os valores digitados sero armazenados so apresentados na tabela a seguir.
Tabela 7 Cdigos de converso da funo scanf()

Cdigo %c %d ou %i %o %x %ld %e %f %s

Elemento armazenado um nico caractere um inteiro do sistema decimal um inteiro do sistema octal um inteiro do sistema hexadecimal um valor do tipo long um nmero na notao cientfica um nmero em ponto flutuante uma cadeia de caracteres

A instruo #include <stdio.h> que precede a funo main() necessria pelos seguintes fatos. Como dissemos acima, para se definir uma funo necessrio fixar o tipo de dado que ela retorna, o identificador da funo e a lista de parmetros, com seus identificadores e seus tipos de dados; este conjunto de elementos chamado prottipo da funo. Para que a funo main() ative uma outra funo (seja uma funo definida pelo usurio ou uma funo de biblioteca), o seu prottipo deve ser definido antes ou no interior da funo main(). Os prottipos das funes do sistema encontram-se reunidos, de acordo com objetivos semelhantes, em arquivos chamados arquivos de cabealhos (header files) (o cabealho de uma funo inclui o seu prottipo, as variveis declaradas dentro da funo e outras declaraes e definies que no so instrues propriamente ditas). A instruo #include <stdio.h> "anexa" funo main() os prottipos das funes de biblioteca que executam aes padres de entrada e de sada (stdio vem de standard input output, entrada e sada padro e h a extenso padro dos arquivos de cabealhos). A no incluso de um include provoca erro de compilao no sistema C++ 3.01. Isto no acontece no C 2.01, porm, h casos em que esta no incluso gera erros de lgica (a entrada de dados no feita do modo que se esperava).

2.8 Sada de dados A funo printf()


A exibio dos resultados do processamento e de mensagens feita atravs da funo pr-definida printf(), cujo prottipo est contido tambm no arquivo stdio.h. Sua sintaxe a seguinte: printf(Expresso de controle, Lista de argumentos); onde Expresso de controle contm mensagens que se pretende que sejam exibidas, cdigos de formatao (idnticos aos cdigos de converso da funo scanf()) que indicam como o contedo de uma varivel deve ser exibido e cdigos especiais para a exibio de alguns caracteres especiais e realizao de aes que permitam formatar a sada do programa. A Lista de argumentos pode conter identificadores de variveis,

expresses aritmticas ou lgicas e valores constantes. No primeiro caso, o contedo da varivel exibido; no segundo caso, a expresso avaliada e o seu resultado exibido; no terceiro caso o valor constante exibido. A ordem de exibio dos contedos de variveis, dos resultados das expresses e dos valores constantes relacionados na lista de argumentos dada pela ordem em que estes elementos esto listados; a posio dentro da mensagem contida na expresso de controle fixada pela posio do cdigo de formatao respectivo. Quando, na expresso de controle, um cdigo de formatao encontrado o contedo da varivel, o resultado da expresso ou o valor constante respectivo (no sentido da ordem da colocao da varivel na lista e da colocao do cdigo de formatao na expresso de controle) exibido. Por exemplo, a funo printf() no programa abaixo contm uma expresso de controle que no possui cdigos de formatao. Isto significa que apenas a mensagem ser exibida. Assim, o programa #include <stdio.h> main() { printf("Estou aprendendo a programar em C"); } um programa em C que faz com que seja exibida na tela a mensagem Estou aprendendo a programar em C. J o programa abaixo, contm uma funo printf() que possui quatro caracteres de controle #include <stdio.h> main() { float a, b, c; scanf("%f %f %f", &a, &b, &c); printf("%f , %f e %f %f", a, b , c, (a + b + c)/3); } Quando da execuo deste programa, o sistema, para execuo da funo scanf(), aguarda que sejam digitados trs valores numricos. Quando isto feito, o sistema armazena estes trs valores nas variveis a, b e c, respectivamente. Na execuo do ltimo comando, o sistema exibe os valores armazenados nas variveis a, b e c, em seguida avalia a expresso (a + b + c)/3 e exibe o seu valor na tela. Assim, o programa fornece a mdia aritmtica de trs nmeros dados. Como um outro exemplo e considerando que o resultado de uma expresso lgica um inteiro, o programa #include <stdio.h> main() { printf("%d", 5 > 3); } exibe na tela o valor 1, pois a relao 5 > 3 verdadeira. Nos dois exemplos anteriores, utilizamos expresses, uma aritmtica e uma lgica, como argumentos de uma funo printf(). No nosso entendimento, no uma boa prtica de programao se utilizar expresses como argumentos de uma funo printf(). Se o valor de uma expresso til para alguma coisa, ele deve ser armazenado em alguma varivel (veremos isto na prxima seo) e esta deve ser utilizada para o fornecimento de resultados.

Facilitando a execuo de um programa


A possibilidade de que mensagens possam ser exibidas permite que o prprio programa facilite a sua execuo e que torne compreensveis os resultados fornecidos. Da forma em que est escrito acima, a execuo do programa que fornece a mdia de trs nmeros dados dificultada pelo fato de que a execuo da funo scanf() faz com que o sistema aguarde a digitao dos nmeros pretendidos (o cursor fica simplesmente piscando na tela do usurio) e o usurio pode no saber o que est se passando. Alm disto, a

execuo da funo printf() exibe apenas o resultado da expresso, sem indicao a que aquele valor se refere. Sem dvida, o programa referido ficaria muito melhor da seguinte forma. #include <stdio.h> main() { float a, b, c; printf("Digite trs nmeros"); scanf("%f %f %f", &a, &b, &c); printf("A media dos numeros %f , %f e %f igual a %f", a, b, c, (a + b + c)/3); } A exibio de uma mensagem pode ser tambm obtida atravs da funo puts(), cujo prottipo est no arquivo stdio.h. Por exemplo, o comando printf(Digite trs nmeros) pode ser substitudo pelo comando puts(Digite trs nmeros).

Fixando o nmero de casas decimais


O padro utilizado pela maioria dos compiladores C exibir os nmeros de ponto flutuante com seis casas decimais. O nmero de casas decimais com as quais os nmeros de ponto flutuante sero exibidos pode ser alterado pelo programa. Para isso deve-se acrescentar .n ao cdigo de formatao da sada, sendo n o nmero de casas decimais pretendido. Por exemplo, se o programa que determina a mdia de trs nmeros fosse executado para a entrada 6.2, 8.45 e 7 seria exibido na tela o seguinte resultado A media dos numeros 6.200000, 8.550000 e 7.000000 igual a 7.250000 Se o comando de sada do programa fosse printf("A media dos numeros %.2f , %.2f e %.2f igual a %.1f", a, b, c, (a + b + c)/3); a sada seria A media dos numeros 6.20, 8.55 e 7.00 igual a 7.3 Observe que a mdia dos nmeros dados, de fato, igual a 7.26. Como o cdigo da formatao da sada da mdia foi %.1f, ela foi exibida com uma casa decimal e o sistema efetua os arredondamentos necessrios. Observe tambm a utilizao do ponto (e no da vrgula) como separador das partes inteiras e fracionrias. Isto sempre necessrio quando o ambiente de programao que se est utilizando foi desenvolvido nos Estados Unidos, o que o mais frequente.

Alinhando a sada
O programa pode fixar a coluna da tela a partir da qual o contedo de uma varivel, ou o valor de uma constante ou o valor de uma expresso ser exibido. Isto obtido acrescentado-se um inteiro m ao cdigo de formatao. Neste caso, m indicar o nmero de colunas que sero utilizadas para exibio do contedo da varivel ou do valor da constante. Por exemplo, levando-se em conta que a frase "Estou aprendendo a programar" contm vinte e oito caracteres, o programa abaixo #include <stdio.h> main() { printf("%38s", "Estou aprendendo a programar"); } exibe na tela a frase referida a partir da dcima coluna. Observe que este programa tambm exemplifica a utilizao de uma constante (no caso, uma cadeia de caracteres) como um argumento da funo printf(). Observe tambm que referncias a constantes do tipo cadeia de caracteres devem ser feitas com a cadeia escrita entre aspas. As aspas distinguem para o sistema

uma cadeia de caracteres constante de um identificador de varivel. O mesmo efeito poderia ser obtido com o programa #include <stdio.h> main() { printf(" Estou aprendendo a programar"); } onde existem dez espaos em branco entre o abre aspas e a letra E. Para se fixar a coluna a partir da qual e o nmero de casa decimais com que um nmero de ponto flutuante ser exibido, deve-se utilizar dois parmetros separados por um ponto. Por exemplo, considerando que se exibirmos o nmero 3.1416 com duas casas decimais ele ficar com quatro caracteres, o programa #include <stdio.h> main() { printf("%14.2f", 3.1416); } exibir na tela 3.14 a partir da dcima coluna. O recurso da exibio de valores utilizando um nmero pr-definido de colunas pode ser utilizado para alinhar direita a sada do programa. Por exemplo, se os contedos das variveis do tipo float x, y e z so 103.45, 5.3678 e 45.0, a sequncia de comandos printf("%13.2f", x); printf("%13.2f", y); printf("%13.2f", z); exibe na tela 103.45 5.37 45.00 Vale observar que possvel obter o mesmo efeito com uma nica ativao (ou chamada) da funo printf(), como veremos a seguir: printf("%13.2f \n %13.2f \n %13.2f ", x, y, z);

Exibindo nmeros "como caracteres" e vice-versa


Uma varivel do tipo char armazena os cdigos ASCII dos caracteres suportados pelo sistema. Como este armazenamento feito atravs de cadeias de bit's, na verdade, o que armazenado so nmeros inteiros compreendidos entre 128 e 127. Aos nmeros de 0 a 127 correspondem os caracteres de cdigo ASCII iguais ao prprio nmero e aos nmeros de -1 a -128 correspondem os caracteres de cdigo ASCII iguais aos nmeros situados no intervalo de 128 a 255, respectivamente. O cdigo de formatao da sada que indicar a forma como o contedo de uma varivel do tipo char ser exibido. Se c uma varivel do tipo char, pode-se associar a sua sada com os cdigos %d, %o, %x, %c. No primeiro caso o nmero armazenado em c exibido; no segundo caso este nmero ser exibido no sistema octal; no terceiro, o nmero ser exibido no sistema hexadecimal e no ltimo caso ser exibido o caractere como comentado acima. Por exemplo, se o contedo da varivel char c 67, o comando printf("%c %d %o %x", c, c, c, c); exibir na tela C 67 103 43

A razo disto que 67 o cdigo ASCII de C no sistema decimal, 103 este cdigo no sistema octal e 43 o cdigo ASCII de C no sistema hexadecimal.
Quando um argumento uma constante, ele ser exibido de forma que depende do cdigo de

formatao. Quando a constante uma cadeia de caracteres, no h muito o que fazer: a execuo do comando printf("Este comando exibir a palavra %s", "paz"); exibir na tela a frase Este comando exibir a palavra paz da mesma maneira que o comando printf("Este comando exibir a palavra paz"); que muito mais simples. Porm, quando a constante um caractere ou um nmero inteiro, o que ser exibido depende do cdigo de formatao. Por exemplo, o comando printf("%c", 'A'); exibe o caractere A, enquanto que o comando printf("%d", 'A'); exibir o nmero 65. Por sua vez, o comando printf("%d", 65); exibe o nmero 65, enquanto que o comando printf("%c", 65); exibe o caractere A. Observe que referncias a constantes caracteres feita com o caractere escrito entre apstrofos, enquanto que referncias a cadeias de caracteres so feitas com as cadeias escritas entre aspas, como j foi observado antes.

Os cdigos especiais
De acordo com a tabela abaixo, os cdigos especiais permitem a exibio de alguns caracteres, como %, \, dentro de uma mensagem e a realizao de aes que permitem a formatao da sada de modo que esta seja elegante e agradvel para o usurio.
Tabela 9 Cdigos especiais da funo printf()

Cdigo \n \t \b \f \a \" \\ \%

Ao leva o cursor para a prxima linha executa uma tabulao executa um retrocesso leva o cursor para a prxima pgina emite um sinal sonoro (beep) exibe o caractere " exibe o caractere \ exibe o caractere %

Uma observao interessante que o cdigo \a pode ser obtido atravs do caractere de cdigo ASCII igual a 7. Assim, a execuo dos comandos printf("\a"); e printf("%c", 7); realizam a mesma ao de emisso de um sinal sonoro. A utilizao do cdigo \n permite que a exibio de constantes ou de contedos de variveis atravs da funo printf() possa ser feita em linhas diferentes. No exemplo dado na seo anterior sobre o alinhamento da sada dos dados, a sada poderia ser feita com uma nica chamada da funo printf(). Repetindo o referido exemplo, se os contedos das variveis do tipo float x, y e z so 103.45, 5.3678 e 45.0, o comando printf("%13.2f"/n %13.2f \n %13.2f", x, y, z); exibe na tela

103.45 5.37 45.00

2.9 Comando de atribuio Armazenando dados gerados pelo programa


A seo 2.7 apresentou o comando que permite que se armazene em variveis a entrada do programa. Agora veremos como armazenar dados gerados durante a execuo de um programa. Considere um programa para o clculo da mdia de uma relao de nmeros. Naturalmente, a quantidade de nmeros da relao (se no foi fornecida a priori) deve ser de alguma forma determinada e armazenada em alguma varivel para que possa ser utilizada no clculo final da mdia pretendida.
O armazenamento de dados gerados pelo prprio programa, alteraes no contedo de variveis e determinaes de resultados finais de um processamento so realizados atravs do comando de atribuio, que deve ser escrito com a seguinte sintaxe. Identificador de varivel = expresso;

A expresso do segundo membro pode se resumir a um valor constante pertencente ao tipo de dado da varivel do primeiro membro, caso em que o valor armazenado naquela varivel. Se no for este o caso, a expresso avaliada e, se for do mesmo tipo da varivel do primeiro membro, o resultado armazenado na varivel.
A expresso do segundo membro pode envolver a prpria varivel do primeiro membro. Neste caso, o contedo anterior da varivel ser utilizado para a avaliao da expresso e ser substitudo pelo valor desta expresso. Por exemplo, se i uma varivel do tipo int ou do tipo float o comando i = i + 1; faz com que o seu contedo seja incrementado de uma unidade. Veremos ao longo do livro que comandos do tipo i = i + 1; aparecem com muita frequncia. A linguagem C oferece uma forma simplificada de escrever este comando: i++;. Esta sintaxe se tornou to caracterstica da linguagem C que sua "ampliao" para incorporar recursos de programao orientada a objetos foi denominada C++ (de forma semelhante, o comando i = i 1 pode ser escrito i--;). O incremento de uma varivel de uma unidade tambm pode ser obtido atravs do comando ++i e estas expresses podem figurar em expresses aritmticas. A diferena entre i++ e ++i pode ser entendida no seguinte exemplo. A sequncia de comandos i = 2; j = i++; k = ++i; realiza as seguintes aes: i = 2, armazena em i o valor 2; j = i++, armazena em j o valor 2 e armazena em i o valor 3 (incrementa o valor de i); k = ++i, armazena em i o valor 4 (incrementa o valor de i) e armazena o valor 4 na varivel j.

Um exemplo simples: determinando a parte fracionria de um nmero


Como dissemos na seo 2.3, o armazenamento de um valor de ponto flutuante numa varivel do tipo int faz com que seja armazenada na varivel a parte inteira do valor de ponto flutuante. Isto permite que se extraia facilmente a parte fracionria de um nmero. Por exemplo, o programa a seguir fornece a parte fracionria de um nmero dado, calculada como a diferena entre ele e a sua parte inteira.

/* Programa que fornece a parte fracionria de um nmero dado */ #include <stdio.h> main() { float Num, Frac; int Inteiro; printf("Digite um numero "); scanf("%f", &Num); Inteiro = Num; Frac = Num - Inteiro; printf("A parte fracionaria de %f e' %f ", Num, Frac); } H que se ter cuidado com nmeros fracionrios. J foi dito que o sistema (e qualquer ambiente para programao) no armazena exatamente todos os nmeros reais, armazenando, de fato, aproximaes da maioria deles. Por exemplo, se modificssemos o comando de sada do programa anterior para printf("A parte fracionaria de %f e' %.9f ", Num, Frac); e o executssemos para a entrada 2.41381 teramos como sada a frase

A parte fracionaria de 2.41381 e' 0.413810015! O ponto de exclamao (que no faz parte da sada do programa) foi posto pelo fato de que a sada esperada para esta entrada seria 0.41381.

Combinando comandos de atribuio com operadores aritmticos


O comando de atribuio pode ser combinado com operadores aritmticos para substituir atribuies cuja expresso do segundo membro contenha a varivel do primeiro membro. Se x for o identificador da varivel e $ for um operador aritmtico, a atribuio x = x $ (expresso); pode ser indicada, simplesmente, por x $= expresso; Por exemplo, x *= 4; equivale a x = x*4; x += 5; equivale a x = x + 5; x %= y + 1; equivale a x = x % (y + 1); x -= 5; equivale a x = x 5; x /= 2; equivale a x = x/2;.

De acordo com o objetivo do livro, evitaremos a utilizao destas opes oferecidas pela linguagem C, por entendermos que elas podem dificultar a legibilidade do comando. No nosso entendimento, s programadores mais experientes devem usar estes recursos.

Lendo caracteres
Alem da possibilidade de se dar entrada em caracteres atravs da funo scanf() com cdigo de converso "%c", pode-se dar entrada em caracteres utilizando-se as funes getch() e getche() cujos cabealhos encontram-se no arquivo conio.h. Para a execuo destas funes necessrio que se acione uma tecla; quando isto feito, o caractere correspondente retornado pela funo e pode ento ser armazenado numa varivel do tipo char atravs de um comando de atribuio. A diferena entre estas funes que na primeira o caractere digitado no aparece na tela de trabalho, o que acontece com a segunda funo. Por

exemplo, a execuo do programa #include <stdio.h> #include <conio.h> main() { char c; c = getch(); printf("Voce digitou a letra %c \n", c); } digitando-se a letra A deixa a tela de trabalho da seguinte forma Voce digitou a letra A enquanto que a execuo do programa #include <stdio.h> #include <conio.h> main() { char c; c = getche(); printf("Voce digitou a letra %c \n", c); } deixa a tela de trabalho da seguinte forma: A Voc digitou a letra A

2.10 Exemplos Parte I


1. Voltando ao programa do clculo da mdia de trs nmeros dados, observe que a mdia foi calculada e exibida, mas no foi armazenada. Se este programa fizesse parte de um programa maior (e isto normalmente acontece! No se usa computao para uma questo to simples!) e esta mdia fosse necessria em outra parte do programa, aquele trecho teria que ser rescrito. uma boa prtica, portanto, que resultados finais de processamento sejam armazenados em variveis, sendo ento os contedos destas variveis exibidos atravs da funo printf(). Assim, o programa referido ficaria melhor escrito da seguinte forma. /* Programa que determina a mdia de trs nmeros dados */ #include <stdio.h> main() { float a, b, c, Media; puts("Digite trs nmeros"); scanf("%f %f %f", &a, &b, &c); Media = (a + b + c)/3; printf("A media dos nmeros %f , %f e %f igual a %f ", a, b, c, Media); } 2. Agora apresentaremos um programa que recebendo um nmero inteiro como entrada fornece o algarismo da casa das unidades deste nmero, questo discutida no captulo 1. Como vimos naquele captulo, o algarismo procurado o resto da diviso do nmero dado por 10. Temos ento o seguinte programa (no captulo 6 veremos um programa que necessita da soluo desta questo). /* Programa que determina o algarismo da casa das unidades de um inteiro dado */ #include <stdio.h> main() {

int Num, Unidades; printf("Digite um inteiro"); scanf("%d", &Num); Unidades = Num % 10; printf("O algarismo da casa das unidades de %d e' %d ", Num, Unidades); } 3. Se quisssemos um programa para inverter um nmero com dois algarismos (por exemplo, se a entrada fosse 74, a sada deveria ser 47) poderamos utilizar o seguinte fato: se x e y so os algarismos de um nmero (casa das dezenas e casa das unidades, respectivamente), ento este nmero x . 10 + y. Assim, a inverso seria y . 10 + x e bastaria extrair os dois algarismos do nmero dado e utilizar a expresso acima. A extrao do algarismo da casa das unidades foi mostrada no exemplo anterior. E o algarismo da casa das dezenas? Basta ver que ele o quociente da diviso do nmero por 10 e este quociente obtido atravs do operador / com operandos inteiros. Temos ento o seguinte programa. /* Programa que inverte um nmero com dois algarismos */ #include <stdio.h> main() { int Num, Unidades, Dezenas, Invertido; printf("Digite um inteiro com dois algarismos"); scanf("%d", &Num); Unidades = Num % 10; Dezenas = Num/10; Invertido = Unidades * 10 + Dezenas; printf("O invertido de %d e' %d ", Num, Invertido); }

Dificilmente o caro leitor vai escrever um programa com este objetivo (para que serve inverter um nmero com dois algarismos?). Esta questo e algumas outras esto sendo discutidas aqui apenas como exemplos para o desenvolvimento da lgica de programao e pelo fato de que podem ser trechos de programas maiores, o que ser mostrado no prximo exemplo.
4. Imagine que queiramos um programa que determine o menor mltiplo de um inteiro dado maior do que um outro inteiro dado. Por exemplo, se a entrada fosse 13 e 100, a sada deveria ser 104 (104 o menor mltiplo de 13 que maior que 100). Como dividendo = divisor x quociente + resto e resto < divisor, temos que o valor da expresso dividendo - resto + divisor o mltiplo procurado.

/*Programa que determina o menor mltiplo de um inteiro maior que outro inteiro*/
#include <stdio.h> main() { int Num, Divisor, MenMultiplo; printf("Digite o inteiro do qual o nmero procurado deve ser mltiplo"); scanf("%d", &Divisor); printf("Digite o inteiro que deve ser menor que o mltiplo \n"); scanf("%d", &Num); MenMultiplo = Num - Num % Divisor + Divisor; printf("O menor multiplo de %d maior do que %d e' %d \n", Divisor, Num, MenMultiplo); } 5. Vamos utilizar o raciocnio desenvolvido no exemplo anterior para escrever um programa que ser parte fundamental de uma aplicao prtica a ser discutida no prximo captulo. O exemplo mostrar tambm algo mais ou menos bvio, mas que deve ser destacado: um programador s capaz de escrever um programa que resolva um determinado problema se ele souber resolver o tal problema "na mo", ou seja,

com a utilizao apenas de lpis e papel. Trata-se de um programa para determinar a quantidade de mltiplos de um inteiro dado k compreendidos (estritamente) entre dois inteiros x e y dados. Por exemplo, se a entrada for k = 7, x = 10 e y = 42, o programa deve retornar a mensagem a quantidade de mltiplos de 7 compreendidos entre 10 e 42 4 (que so 14, 21, 28, 35). Uma soluo na mo desta questo utiliza progresses aritmticas, assunto da Matemtica que estudada no Ensino Mdio. Uma progresso aritmtica de primeiro termo a1 e razo r uma sequncia de nmeros a1, a2, ..., an cuja diferena entre dois termos consecutivos constante e igual a r. fcil provar que an = a1 + (n 1)r. Na nossa questo, a1 o menor mltiplo de k maior que x (exemplo anterior), an o maior mltiplo de k menor que y e r igual a k. fcil ver que o maior mltiplo de k menor que y dado por (y 1) (y 1) % k, sendo y 1 utilizado para gerenciar o caso em que y mltiplo de k, j que queremos mltiplos de k menor que y. /*Programa que determina o nmero de mltiplos de um inteiro k situados entre dois inteiros x e y*/ #include <stdio.h> main() { int i, x, y, a, k, NumMultiplos = 0; printf("Digite os inteiros x e y (y > x)"); scanf("%d %d", &x, &y); a = y - 1; printf("Digite o inteiro k \n"); scanf("%d", &k); NumMultiplos = (a - a % k - x + x % k)/k; printf("O nmero de multiplos de %d compreendidos entre %d e %d e' %d \n", k, x, y, NumMultiplos); } 6. O programa a seguir, alm de ser muito interessante no sentido do desenvolvimento da lgica de programao, ser utilizado (a sequncia de comandos da funo main()) em outros programas. Seu objetivo permutar os contedos de duas variveis. Ou seja, suponhamos que, atravs de comandos de entrada o programa armazenou nas variveis x e y os valores 7 e 18 e pretendamos que o programa faa com que o contedo de x passe a ser 18 e o de y passe a ser igual a 7. primeira vista, bastaria a sequncia de comandos x = y; y = x; Ocorre que, quando o segundo comando fosse executado, o primeiro j teria sido e o contedo de x no seria mais o original. No nosso exemplo, teramos a seguinte situao x 17 8 y 8 8 e a permuta no teria sido feita, alm do fato de que o contedo original de x teria sido perdido. Uma alternativa considerar uma varivel auxiliar que "guarde" o contedo de x antes que este seja substitudo pelo contedo de y. Teramos assim o seguinte programa. /* Programa que permuta os contedos de duas variveis */ #include <stdio.h> main() { float x, y, Aux; printf("Digite os dois numeros "); scanf("%f %f", &x, &y); printf("Entrada x = %0.1f, y = %0.1f \n", x, y); Aux = x;

x = y; y = Aux; printf("Saida x = %0.2f, y = %0.2f \n", x, y); } Cabe observar que a permuta dos contedos pode ser obtida sem a utilizao da varivel Aux. Isto deixado para que o leitor descubra a soluo, sendo apresentado como exerccio proposto.

2.11 Funes de biblioteca


Como dissemos na seo 2.5, os compiladores C oferecem diversas funes com objetivos prdeterminados e que podem ser executadas durante a execuo de um programa. Para isto a execuo da funo deve ser solicitada no programa como uma instruo, como operando de uma expresso ou como argumento de outra funo (a solicitao da execuo de uma funo normalmente chamada de ativao ou chamada da funo). Para que o programador possa colocar no seu programa uma instruo que ative uma funo necessrio que ele conhea o identificador da funo, quantos e de que tipo so os argumentos com que elas devem ser ativadas e o tipo de valor que ela retorna ao programa quando termina sua execuo (como j foi dito, este conjunto constitui o prottipo da funo). A definio de uma funo pr-definida se faz atravs da seguinte sintaxe.

Identificador da funo(Lista de argumentos)


sendo que a lista de argumentos pode ser vazia. A tabela a seguir apresenta algumas das funes prdefinidas dos compiladores C, indicando o tipo dos seus argumentos e comentando o seu valor de retorno.
Tabela 12 Algumas funes de biblioteca

Identificador Argumentos O que retorna fabs(x) double Valor absoluto do argumento x acos(x) double Arco cujo valor do co-seno o argumento x asin(x) double Arco cujo valor do seno o argumento x atan(x) double Arco cujo valor da tangente o argumento x cos(x) double Co-seno do argumento x log(x) double Logaritmo natural do argumento x log10(x) double Logaritmo decimal do argumento x pow(x, y) double, double Argumento x elevado ao argumento y pow10(x) int 10 elevado ao argumento x random(x) int Um nmero aleatrio entre 0 e x - 1 sin(x) double Seno do argumento x sqrt(x) double Raiz quadrada do argumento x tan(x) doubl Tangente do argumento x tolower(x) char Converte o caractere x para minsculo toupper(x) char Converte o caractere x para maiusculo O prottipo da funo random() se encontra no arquivo stdlib.h e os prottipos das funes tolower() e toupper() esto no arquivo ctype.h. Os prottipos das outras funes esto no arquivo math.h que, como seu nome indica, contm os prottipos das funes matemticas. Para que a funo random() seja ativada necessrio que sua ativao seja precedida pela ativao da funo randomize() que ativa o gerador de nmero aleatrio. Por exemplo, o programa abaixo exibir um nmero aleatrio entre 0 e 99. /* programa que exibe, aleatoriamente, um nmero entre 0 e 99 */ #include <stdio.h> #include <stdlib.h> main() { int x; randomize(); x = random(100);

printf("%d \n", x); } O exemplo a seguir, alm de pretender motivar o prximo captulo, ressalta uma observao j feita anteriormente: um programador s capaz de escrever um programa que resolva um determinado problema se ele souber resolver o tal problema "na mo", ou seja, com a utilizao apenas de lpis e papel. Trata-se de um programa que calcule a rea de um tringulo, dados os comprimentos dos seus lados. Naturalmente, s capaz de escrever este programa aquele que conhecer a frmula abaixo, que d a rea do tringulo cujos lados tm comprimentos a, b e c:

S=
onde

p . ( p a ) . ( p b) . ( p c )

p=

a+ b+ c 2

o semipermetro do tringulo. Com isto, temos o seguinte programa. /*Programa que determina a rea de um tringulo de lados de comprimentos dados*/ #include <stdio.h> #include <math.h> main() { float x, y, z, Area, SemiPer; printf("Digite os comprimentos dos lados do triangulo"); scanf("%f %f %f", &x, &y, &z); SemiPer = (x + y + z)/2; Area = sqrt(SemiPer * (SemiPer - x) * (SemiPer - y) * (SemiPer - z)); printf("A area do triangulo de lados %f , %f e %f e' igual a %f \n", x, y, z, Area); } Se este programa for executado com entrada 3, 4 e 5 temos SemiPer = 6 e

S=

6 . (6 3) . (6 4) . (6 5) =

36

e, como era de se esperar, a rea do tringulo cujos lados tm comprimento 3, 4 e 5 unidades de comprimento igual a 6 unidades de rea. Agora, se este programa fosse executado para entrada 1, 2 e 5 teramos SemiPer = 4,
S = 4 . (4 1) . ( 4 2 ) . ( 4 5 ) = 24

S=

4 . (4 1) . (4 2) . (4 5) =

24 e ocorreria erro de execuo pois o sistema (como era de se

esperar) no calcula raiz quadrada de nmero negativo. O que acontece que nem sempre trs nmeros podem ser comprimentos dos lados de um tringulo (a matemtica prova que isto s acontece se cada um deles for menor do que a soma dos outros dois). Assim, o comando que calcula a Area s deveria ser executado se os valores digitados para x, y, e z pudessem ser comprimentos dos lados de um tringulo.

2.12 Exerccios propostos


1. Avalie cada uma das expresses abaixo. a) (-(-9) + sqrt((-9)*(-9) - 4*3*6))/(2*3). b) ((pow(3, 2) == 9) && (acos(0) == 0)) || (4 % 8 == 3). 2. Escreva programas para a) Converter uma temperatura dada em graus Fahrenheit para graus Celsius. b) Gerar o invertido de um nmero com trs algarismos (exemplo: o invertido de 498 894). c) Somar duas fraes ordinrias, fornecendo o resultado em forma de frao. d) Determinar o maior mltiplo de um inteiro dado menor do que ou igual a um outro inteiro dado

(exemplo: o maior mltiplo de 7 menor que 50 49). e) Determinar o permetro de um polgono regular inscrito numa circunferncia, dados o nmero de lados do polgono e o raio da circunferncia. 3. Escreva um programa que permute o contedo de duas variveis sem utilizar uma varivel auxiliar (ver exemplo 5 da seo 2.9). 4. Uma loja vende seus produtos no sistema entrada mais duas prestaes, sendo a entrada maior do que ou igual s duas prestaes; estas devem ser iguais, inteiras e as maiores possveis. Por exemplo, se o valor da mercadoria for R$ 270,00, a entrada e as duas prestaes so iguais a R$ 90,00; se o valor da mercadoria for R$ 302,75, a entrada de R$ 102,75 e as duas prestaes so a iguais a R$ 100,00. Escreva um programa que receba o valor da mercadoria e fornea o valor da entrada e das duas prestaes, de acordo com as regras acima. Observe que uma justificativa para a adoo desta regra que ela facilita a confeco e o consequente pagamento dos boletos das duas prestaes. 5. Um intervalo de tempo pode ser dado em dias, horas, minutos, segundos ou sequncias "decrescentes" destas unidades (em dias e horas; em horas e minutos; em horas, minutos e segundos), de acordo com o interesse de quem o est manipulando. Escreva um programa que converta um intervalo de tempo dado em segundos para horas, minutos e segundos. Por exemplo, se o tempo dado for 3 850 segundos, o programa deve fornecer 1 h 4 min 10 s. 6. Escreva um programa que converta um intervalo de tempo dado em minutos para horas, minutos e segundos. Por exemplo, se o tempo dado for 145.87 min, o programa deve fornecer 2 h 25 min 52.2 s (vale lembrar que o ponto o separador da parte inteira). 7. Um programa para gerenciar os saques de um caixa eletrnico deve possuir algum mecanismo para decidir o nmero de notas de cada valor que deve ser disponibilizado para o cliente que realizou o saque. Um possvel critrio seria o da "distribuio tima" no sentido de que as notas de menor valor disponveis fossem distribudas em nmero mnimo possvel. Por exemplo, se a mquina s dispe de notas de R$ 50, de R$ 10, de R$ 5 e de R4 1, para uma quantia solicitada de R$ 87, o programa deveria indicar uma nota de R$ 50, trs notas de R$ 10, uma nota de R$ 5 e duas notas de R$ 1. Escreva um programa que receba o valor da quantia solicitada e retorne a distribuio das notas de acordo com o critrio da distribuio tima. 8. De acordo com a Matemtica Financeira, o clculo das prestaes para amortizao de um financiamento de valor F em n prestaes e a uma taxa de juros i dada pela frmula P = F/ani, onde ani = ((1 + i)n 1)/(i . (1 + i)n). Escreva um programa que determine o valor das prestaes para amortizao de um financiamento, dados o valor do financiamento, o nmero de prestaes para amortizao e a taxa de juros. Observao Propostas de solues dos exerccios propostos podem ser solicitadas atravs de mensagem eletrnica para jaime@ccen.ufal.br com assunto RESPOSTAS LIVRO C, anexando o formulrio abaixo devidamente preenchido. Nome
1 2

Categoria1

Instituio2

Curso2

Cidade/Estado

Categoria: docente, estudante, autodidata Se docente ou estudante

Вам также может понравиться