Vous êtes sur la page 1sur 15

APOSTILA LINGUAGEM C.

PROFESSOR VALDER OLMO CORRÊA

CAPÍTULO 01

Compiladores

A forma pela qual nos comunicamos com um computador é o programa, ou software. Os softwares
são escritos em várias linguagens e a única linguagem que o computador entende é a linguagem de
máquina que e uma coleção de zeros e uns (0 e 1), são os chamados bits. O bit zero significa nível
lógico igual a zero, quer dizer ausência de energia, e o bit um significa nível lógico igual a 1, quer
dizer que há energia. A linguagem de máquina é muito confusa para nós, seres humanos
entendermos, fica isso a cargo dos engenheiros eletrônicos que trabalham com projetos de
computadores.
As linguagens ditas de alto nível são mais acessíveis à compreensão humana e por isso mesmo são
usadas na programação de um computador. Exemplos dessas linguagens são Visual Basic, Delphi,
Java, que é uma excelente linguagem de programação, C# (leia-se C Sharp), que é muito
semelhante à linguagem Java, JavaScript (que não é Java, não confundam!), PHP, essas duas
últimas são linguagens de script para a intenet, e também a linguagem que será objeto de estudo
para nosso curso, a linguagem C.
Mas se todas essas linguagens acima não são linguagens de máqunia como que o computador
entende um programa escrito com elas? A resposta é que devemos escrever nosso programa em uma
dessas linguagens e então compilá-la com um compilador da linguagem. Os compiladores fazem a
tarefa de converter o código escrito em linguagem de alto nível para a linguagem de máquina que o
computador entende, ou seja, o compilador “traduz” o código escrito em linguagem de alto nível
para a linguagem de máquina.
Os compiladores de linguagem C lêem uma a uma as linhas de código que escrevemos e vão
traduzindo para a linguagem de máquina até que a última instrução seja traduzida. Se não houver
erros durante o processo de compilação o compilador cria um programa em disco com a
extensão .OBJ que contém as instruções traduzidas. Mas o programa .OBJ não pode ser executado
pelo computador, pois ainda não possui as bibliotecas com as funções em linguagem de máquina
inseridas nele. O trabalho de se inserir essas funções e bibliotecas no programa cabe a outro
programa chamado Linkeditor. O linkeditor então cria um programa final com a extensão .EXE que
será interpretado pelo computador diretamente pelo sistema operacional. Esse programa com
extensão .EXE somente funciona em Windows, pois o Linux, por exemplo, destroi com todo quanto
é arquivo com essa extensão, Linux não aceita arquivos com extensão .EXE por motios de
segurança.
Então para criarmos nossos programas devemos seguir três passos, que são os seguintes:

1. Digitar as linhas de código de nosso programa em um editor de nossa preferência e gravá-lo


em disco com a extensão .C, no caso da linguagem C. Esse arquivo é chamado de arquivo
fonte.
2. Compilar o programa com extensão .C seguindo as instruções de nosso compilador de
preferência gerando assim o arquivo com extensão .OBJ.
3. Linkeditar o arquivo .OBJ a fim de se gerar o arquivo executável com a extensão .EXE. Ese
arquivo final é chamado de executável.

Para realizar a dura tarefa acima podemos fazer tudo manualmente ou lançarmos mão de boas
IDEs , Integrated Development Enviroment, ou Ambiente de Desenvolvimento Integrado, que já
trás todos os pacotes que precisamos para fazermos nossos programas. Alguns exemplos de IDEs
que podemos trabalhar com a linguagem C são o CodeLite e o Code:Blocks. Essa IDEs já trazem
para nós o compilador da linguagem C, um editor de textos adequado às necessidades e um
Linkeditor, bastando a nós digitarmos o nosso código fonte no editor de textos e então pedirmos
para que a IDE salve e compile o programa e ela fará todo o restante do trabalho.
Uma IDE bastante interessante é o ECLIPSE, que foi desenvolvido para se trabalhar com a
linguagem Java e atualmente traz plugins para as linguagens PHP e C. O Eclipse foi desenvolvido
pela IBM que gastou no projeto a bagatela de 50 milhões de dólares e a deixou livre para nós
usarmos, mas o Eclipse precisa da linguagem Java instalada na máquina, o que não é muito simples
de se fazer, pois precisamos de configurar as variáveis de ambiente, o que não é muito intuitivo, por
isso ficaremos então com o CodeLite ou o Code:Blocks.

A Estrutura Básica de um Programa Escrito na Linguagem C.

Para escrevemos nossos programas em linguagem C necessitamos de seguir algumas normas da


linguagem, isso é válido para qualquer linguagem de programação, ou seja, devemos conhecer sua
estrutura para podemros escrever nossos códigos fontes. A estrutura da linguagem C consite em
funções que realizam determinados trabalhos e segue a seguinte forma geral:

tipo nomeFunc(declaração de parâmetros)


{
Declaração de variáveis;
Instrução 1;
Instrução 2;
Instrução 3;
.
.
.
Instrução n;
return valor_tipo;
}

Na estrutura de código acima o tipo é o tipo de dado a ser retornado pela função, veremos os tipos
adiante nesse curso. A palavra nomeFunc é o nome da função, normalmente momeamos nossas
funções para palavras mnemonicas, ou seja, palavras que lembram o que a função deve fazer. Entre
parênteses temos as declarações dos parâmetros, estudaremos isso quando vermos funções. Na linha
onde está escrito Declaração de variáveis declaramos as variáveis que serao utilizadas pelo nosso
programa. O que se segue são as intruções do código, ou seja, é a partir dessa linha que vamos
“ensinar” o computador a realizar uma determinada tarefa. Na linha onde está escrito return
declaramos o que a função deve retornar para a execução do programa, reforço mais uma vez que
ainda veremos isso quando estudarmos funções em C, portanto, não se preocupem por enquanto
com essa nomenclatura.

A Função main().

Os programas escritos em qualquer linguagem necessitam de funções. Nos programas podemos ter
quantas funções quisermos com o nome que quisermos, porém uma função em especial é
obrigatária existir a fim de que o programa funcione, o nome dessa função é main(), principal, em
Inglês. É a função main() quem começa a execução de nosso programa, sem ela o mesmo não seria
interpretado corretamente pelo compilador e o mesmo emitiria uma mensagem de erro. A função
main() é do tipo inteiro, ou seja, ela retorna um valor inteiro à execução do programa, é ela a
responsável por “chamar” ou “invocar” as outras funções do programa e receber os retornos que
essas funções têm.
Os programas em linguagem C devem conter uma única função main(), se o programa contiver uma
única função, essa deve ser a main(). Portanto não podemos nomear outra função com o nome de
main(), pois essa palavra é reservada à linguagem C. Os parênteses após o nome main são o
indicativo de função, é assim que o compilador entende que é uma função, caso contrário poderia
entender que se trata de uma variável do tipo inteira. As chaves após o nome main() indicam o
começo e o fim do código, é dentro dessas chaves que inserimos as linhas de código que a função
deve executar e a função main() não foge a essa regra.

Nosso Primeiro Programa em Linguagem C.

Para escrevemos nosso primeiro programa em linguagem C devemos conhecer alguns comandos,
instruções, funções especiais da linguagem e duas bibliotecas especiais. Vamos escrever nosso
primeiro programa em linguagem C e então explicaremos linha a linha o código. Vamos então
escrever um pequeno programa que escreva na tela o nosso nome. O código é o seguinte:

#include <stdio.h>
#include <stdlib.h>
int main()
{
printf(“Meu nome é Valder Olmo Corrêa”);
system(“pause”);
return 0;
}

Vamos agora a uma explicaçao de cada linha do nosso primeiro programa:

#include <stdio.h>
Essa linha faz com que seja incluída a biblioteca stdio.h ao programa. Essa biblioteca é necessária
pois sem ela não conseguríamos escrever algo na tela, ou seja, não teríamos como fazer uma saída
de dados. A biblioteca stdio.h é uma biblioteca de entrada (i de in) e saída (o de out), por isso
stdio.h. Sem a inclusão dessa biblioteca não poderíamos utilizar a função printf(), que é uma função
de saída de dados, já que tem a função de escrever algo na tela.

#include <stdlib.h>
A linha contendo essa instrução faz com que seja incluída no programa a biblioteca stdlib.h que traz
as diretivas para que a função system funcione. Sem a função system não conseguiríamos parar a
execução do programa e o mesmo seria rodado e encerrado sem que pudéssemos ver o resultado do
processamento.

printf(“Meu nome é Valder Olmo Corrêa”);


Essa linha de código utiliza a função printf() para escrever algo na tela. Note que desejamos
escrever um nome, ou seja, um dado do tipo string (vão se acostumando com essa nomenclatura).
Dentro dos parênteses e entre aspas devemos escrever o que se deseja que seja escrito na tela, em
nosso caso o nome de alguém muito especial.

system(“pause”);
Essa linha provoca uma pausa na execução do programa até que uma tecla seja pressionada. Isso é
necessário, caso contrário não conseguiríamos notar o processamento. A função responsável por
essa pausa é a função system() que recebe o parâmetro pause.

return 0;
Essa linha de código retorna o valor inteiro 0 (zero) para quem chamou a função main(), no caso o
sistema operacional. Após essa linha de código o programa é finalizado.
Notem que todo o nosso código, com exceção das diretivas include, estão entre as chaves da função
main(). Note também que toda instrução deve acabar com um ponto e vírgula (;). O ponto e vírgula
indica ao compilador que a intrução chegou ao fim e que uma nova instrução ceverá ser interpretada
a seguir.
Vamos agora escrever nosso primeiro programa de uma outra forma, veremos como formatar a
saída de dados com a função printf(). Ao invés de escrever o nome completo em uma única linha
iremos escrevê-lo em duas linhas separadamente. Atente ao seguinte programa:

#include <stdio.h>
#include <stdlib.h>
int main()
{
printf(“Meu nome é Valder”);
printf(“Meu sobrenome é Olmo Corrêa”);
system(“pause”);
return 0;
}

Aos olhos de uma pessoa que esteja aprendendo a programar e nunca tenha tido contato com outra
linguagem o programa acima deveria imprimir na tela o nome em uma linha e o sobrenome em
outra, porém não é isso que ele faz, pois em nenhum momento dissemos ao compilador que se deve
imprimir a mensagem dessa forma. Para imprimirmos a mensagem como queremos
devemosmaprender a formatar a saída de dados com a função printf(). Para tanto atende ao
programa a seguir:

#include <stdio.h>
#include <stdlib.h>
int main()
{
printf(“Meu nome é Valder\n”);
printf(“Meu sobrenome é Olmo Corrêa\n”);
system(“pause”);
return 0;
}

Notem agora que inserimos dois caracteres após as strings a serem impressas pela função printf(),
os caracteres \n. Na verdade esses dois caracteres representam um único caracter em C que é nova-
linha. Dessa forma dizemos ao compilador que após a impressão deseja-se passar a execução do
programa para uma nova linha, assim sendo a próxima string será impressa na linha seguinte.
Várias outras formatações podem ser feitas em linguagem C inserindo-se o caracter \ seguido de
outro caracter que informa a linguagem o tipo de formatação que queremos. Na tabela seguinte
encontra-se uma série das fomatações mais utilizadas na linguagem C, estude-as para melhorar sua
experiência com a linguagem.
Código Especial Significado
\n Nova linha
\t Tabulação
\b Retrocesso. Código utilizado pelas impressoras.
\f Salto de página. Utilizado em formulários contínuos.
\a Beep. O toque do alto falante.
\r CR. Retorno do cursor para o ínício da linha.
\\ \ Barra invertida.
\0 Zero.
\' Aspas simples
\” Aspas duplas.
\xdd Representação de números na forma hexadecimal.
\ddd Representação de números na forma octal.

Comentários em Programas

Normalmente os programas que são desenvolvidos para se executar uma tarefa profissional, como
por exemplo um aplicativo de banco de dados, que exige um número muito grande de códigos e,
portanto um número enorme de linhas de código, ou então em um programa de análise numércia ou
elementos finitos, o código fica muito grande e as vezes muito confuso, na hora de se fazer uma
upgrade ou uma atualização do software o trabalho torna-se extremamente cansativo e aborrecedor
se não soubermos o que cada bloco do programa, ou mesmo cada linha, realiza. Para evitar esses
aborrecimentos e otimizar o trabalho na hora de se fazer uma atualização ou de se dar suporte ao
software, inserimos no código linhas de comentários para sabermos o que a mesma está fazendo.
Os comentários nos ajudam a sabermos qual tarefa cada linha ou bloco de programa realiza. Os
comentários não são interpretados pelo compilador, portanto não são interpretados pelo mesmo.
Comentários são inseridos nos programas de duas formas diferentes, vistas a seguir:

1. Com duas barras (//) fazemos o comentário de apenas uma linha do programas.
2. Com os caracteres * e / fazemos comentários em um bloco de linhas do programa, sendo
que a sequência /* indica o início do bloco de comentário e */ indica o finaldo bloco de
comentário.

Veja a seguir como ficaria nosso último programa com linhas de comentários:

#include <stdio.h>
#include <stdlib.h>
int main()
{
/* Programa elaborado pelo professor Valder Olmo Corrêa
para ser utilizado na apostila da disciplina de computação
do curso de Engenharia Mecânica e Civil da Universidade
de Mogi das Cruzes campus Villa Lobos
*/

// Imprime o nome:
printf(“Meu nome é Valder”);
// Imprime o sobre nome:
printf(“Meu sobrenome é Olmo Corrêa”);
system(“pause”);
return 0;
}

Notem que no programa acima há um bloco de comentário de várias linhas inciciando com os
caracteres /* e terminando com os caracteres */ e dois blocos de comentários de uma única linha,
ambos os comentários explicam o que as linhas de código realizam, ou seja, imprimir o nome e o
sobre nome.

Imprimindo Caracteres Numéricos


Muitas vezes precisaremos imprimir o resultado de uma expressão algébrica, em todas as áreas do
conhecimento essa situação é muito comum, pois todas elas utilizam hoje em dia softwares
específicos para se realizar determinadas tarefas e muitas vezes os softwares não o fazem de forma
otimizável ou então não permite a empresa adaptá-los às suas necessidades. Nesse caso os analistas
ou engenheiros devem elaborar um software específico para a empresa que atenda a necessidades da
mesma.
Para imprimir caracteres numéricos com a função printf() podemos proceder de duas formas
distintas. Uma delas é pedir para que seja impresso o número desejado simplesmente colocando-o
dentro da string a ser impressa, veja a linha de código abaixo:

printf(“Este é o número oito => 8”);

Nesse caso sabemos com antecedência qual número deve ser impresso, no caso o número oito, mas
e se não soubéssemos qual o número a ser impresso o qual foi o resultado de um processamento de
nosso programa? Nesse caso há os códigos para impressão da função printf(), que também são
códigos de formatação. Dessa forma devemos informar à função printf() uma lista de parâmetros os
quais informam que tipo de informação deverá ser impressa após a string a ser impressa entre as
aspas. Perceberemos isso melhor na próxima sessão quando vermos o uso de variáveis na
linguagem C, por enquanto atente para a linha de código abaixo que imprime o número oito de uma
forma diferente da vista anteriormente.

printf(“Este é o numero oito: %d\n”, 8);

Reparem os caracteres %d após a string a ser impressa, eles indicam que a função printf() receberá
como argumento um dado inteiro a ser impresso, nesse caso o argumento é o número oito. Reparem
também na vírgula após as aspas, essa vírgula é a separação entre a string a ser impressa e a lista de
argumentos que a função printf() recebe, ou seja, após a vírgula a função printf() recebe uma lista de
argumentos que deverão ser impressos e esses argumentos devem ser indicados inicialmente com os
códigos característicos de cada dado a ser impresso.

Caractere e Cadeia de Caracteres


Os caracteres em C são números delimitados entre 0 e 255, isso quer dizer que um caractere em
linguagem C é representado por um número entre 0 e 255, ou seja, um único byte, ou oito bits. Os
caracteres constantes podem ser escritos entre aspas simples com o seu código ASCII. Um exemplo
é o número 65 que pode ser como 'A'.
Uma cadeia de caracteres em linguagem C é escrita entre aspas duplas. Por exemplo a cadeia de
caracteres “Valder Olmo Corrêa” é corretamente interpretada pela linugagem C, pois está entre
aspas duplas.
Algumas linguagens de programação não fazem diferença entre aspas simples ou aspas duplas na
representação de caracteres ou cadeia de caracteres, mas a linguagem C faz! Por isso devemos
estudar com bastante atenção o uso correto de caracteres na linguagem C a fim de não termos
problemas na impressão de dados desse tipo. Como dito acima, em C usamos as aspas simples para
representar um único caractere utilizando seu código ASCII e usamos aspas duplas para representar
uma cadeia de caracteres que é corretamente interpretada pelo compilador.
Abaixo temos uma tabela com alguns códigos especiais e os dados que cada um deles indica ao
compilador que devem ser impressos.

Códigos de Formatação/
Impressão Significado
%c Caractere simples.
%d Inteiro decimal.
%e Notação científica com e minúsculo.
%E Notação científica com E maiúsculo.
%f Ponto flutuante.
%o Inteiro octal sem sinal
%s String de caracteres.
%x Inteiro hexadecimal sem sinal (letras minúsculas).
%X Inteiro hexadecimal sem sinal (letras maiúsculas).
%p Ponteiro (endereço de memória).
%n Ponteiro inteiro.
%% Impressão do caractere %.

Note na linha abaixo outro exemplo de impressão utilizando os caracteres de formatação para a
função printf():

printf(“Meu nome é %s\n”, “Valder Olmo Corrêa”);


printf(“Minha idade é %d anos e meu saldo bancário é de %d milhoes de reais\n”, 25, 3);

Uso de Constantes e Variáveis em Linguagem C.

Uma variável ou uma constante em C é um espaço reservado de memória destinado a guardar um


certo tipo de dado que possui um nome próprio que por sua vez é definido pelo programador em
tempo de projeto e esse dado ou seu valor pode ser acessado a qualquer momento por outro dado a
fim de se realizar cálculos numéricos ou interpolações com strings.
Ao elaborarmos nossos programas em qualquer linguagem de programação, e a linguagem C não
foge à regra, devemos ter em mente que o programa precisará trabalhar com dados numéricos e
esses dados podem ser constantes, ou seja, não possuem seu valor mudado ao longo de todo o
programa, ou dados variáveis, aqueles que seus valores variam durante a execução do programa e
precisam ou ser informados pelo usuário ou então são resultados de cálculos que o programa
efetuará ao longo do processamento.
Para exemplificar o que foi exposto no parágrafo anterior vamos supor que uma empresa fez um
acordo com os funcionários e que por esse acordo os mesmos receberão durante um ano um reajuste
mensal com taxa fixa de juros mensais. Podemos imaginar assim dois tipos de dados em um
programa, um é a taxa mensal de aumento dos salários da empresa, ou seja, a porcentagem de
aumento ao longo dos meses, que é um dado fixo, uma constante. O outro tipo de dado é o prórpio
salário dos funcionários que se alterará ao longo dos meses, ou seja, um dado variável que o
programa deve calcular seu valor mês a mês.
Notem a extrema importância de se utilizar dados constantes e variáveis em um programa.
Em linguagem C há vários tipos de dados, a exemplo de outras linguagens, e o primeiro tipo de
dado que vamos estudar são os dados numéricos do tipo inteiro. Para fazer uso de variáveis em C
devemos declará-las informando ao compilador o tipo de dado a qual a vairável armazenará bem
como seu nome. Para se declarar uma variável do tipo inteiro em C devemos escrever a palavra
reservada int seguida do nome que qeuremos dar à variável.
Para vermos um exemplo com declaração de variáveis e melhor compreender o que foi explicado
nos dois parágrafos anteriores atente para o programa a seguir:

#include <stdio.h>
#include <stdlib.h>
int main()
{
// Declara duas variáveis do tipo inteiro
int valor1;
int valor2;

// Atribui o valor 20 à variável valor1


valor1 = 20;

// Atribui à variável valor2 o valor da variável valor1 mais o inteiro 30


valor2 = valor1 + 30;

// Imprime na tela do computador os valores das duas variáveis:

printf(“O valor da variavel 1 e %d\n”, valor1);


printf(“O valor da variavel 2 e %d\n”, valor2);

system(“PAUSE”);
return 0;
}

Notem que devemos declarar as variáveis antes de usá-las, caso contrário o compilador irá imprimir
uma mensaem de erro informando que a variável não foi encontrada ou que é inexistente. Toda
declaração de variáveis em linguagem C deve ser feita no inicio da função logo após a abertura das
chaves ({) que representa o início de função. Em algumas linguagens mais atuais a declaração de
variáveis pode ser feita em qualquer ponto do programa, como a linguagem JAVA, por exemplo.
Para finalizar deve-se esclarecer que em C toda variável deve ser declarada antes de ser usada.
Na declaração de variáveis é aconselhado fazê-lo de forma organizada a fim de se identificar quais
os objetivos de cada variável. Nomear variáveis com nomes mnemônicos também ajuda bastante a
identificar a função da variável no programa, recomenda-se também organizar em blocos as
variáveis com objetivos semelhantes e para finalizar é sempre bom incluir uma linha de comentário
e nesse indicar o que a variável ou o conjunto de variáveis, no caso de um bloco, faz ou executa.
Resumindo, temos:

1. Sempre declare as variáveis no início de cada função.


2. Organize a declaração de variáveis em blocos.
3. Nomeia as variáveis com nomes mnemônicos (Nomes que lembram a função da variável).
4. Inclua linhas de comentários comentando a função da variável no programa.
Os Tipos de Variáveis em Linguagem C.

Na linguagem C temos vários tipos de variáveis, um deles já vimos, que é o tipo de variável inteiro
(int). Vamos agora estudar e entender os outros tipos. O tipo de variável, como o próprio nome diz,
nos indica o tipo de dado que será armazenado pela variável, ou seja, um dado do tipo inteiro
armazenará dados inteiros, números inteiros. O tipo de dado também indica ao compilador a
quantidade de memória que deve ser reservada a ele no computador, cada tipo de variável possui
um tamanho, uma quantidade de memória necessário ao seu armazenamento.
Os tipos básicos de variáveis em C são char, int, float, double, e void, sendo que há também os
modificadores desses tipos, que veremos a seguir. Os tipos char e int são utilizados para armazenar
números inteiros sendo que char possui o tamanho de um byte e o tipo int possui o tamanho de 4
bytes, isso nos computadores atuais providos de ambientes de 32 bits, Windows 95 ou posterior,
Linux, Unix, IOS. Desses dados o tipo char não aceita modificadores, como citado anteriormente,
todos os outros aceitam. Os modificadores são apenas três, a saber: short, long, e unsigned.
A tabela a seguir lista os tipos de variáveis em linugagem C, seu tamanho em bits e bytes e a escala
de abrangência dos valores que são possíveis armazenar com cada uma delas:
Tipo Bits Bytes Escala de abrangência
char 8 1 -128 a 127
int 32 4 -2.147.483.648 a 2.147.483.647
short 16 2 -32.765 a 32.767
long 32 4 -2.147.483.648 a 2.147.483.647
float 32 4 3,4x10-38 a 3,4x1038
double 64 8 1,7x10-308 a 1,7x10308
Long double 80 10 3,4x10-4932 a 3,4x104932

Na declaração de uma variável é possível fazê-lo com um operador de atribuição a fim de se dar à
variável um valor inicial. Isso é feito com o operador de atribuição que usa o sinal de igualdade para
esse fim (=), devemos notar que esse operador não significa igualdade em linguagem C, mas sim o
próprio nome do operador que é atribuição. Quando damos um valor inicial para uma variável
estamos inicializando a mesma, ou seja, é o que chamamos de inicialização de variáveis.
Podemos também declarar mais de uma variável na mesma linha, podemos inclusive declarar várias
variáveis na mesma linha e também inicializá-las. Vejamos a seguir alguns exemplos de declaração
de variáveis com sua devida inicialização. Para isso digite o seguinte código em sua IDE de
preferência, salve, compile e rode o programa:

#include <stdio.h>
#include <stdlib.h>
int main()
{
int percentual = 5;
char categ = 'A';
float sal = 1500.00;
float salatual;
printf(“O percentual de reajuste e de %d por cento”, percentual);
printf(“O salario atual e de %f reais”, sal);
printf(“A categoria e classe %c”, categ);
salatual = sal + sal*percentual/100;
printf(“O salario sera reajustado em %d porcento e seu novo valor sera %f reais”, salatual);
}
Notem que no exemplo anterior declaramos variáveis de três tipos diferentes, char, int e float sendo
que inicializamos as variáveis char, int e uma das variáveis float deixando a outra para acumular um
valor, no caso salário atual, que é resultado de um processamento do programa. Também importante
notar que na última linha do programa imprimimos dois tipos de variáveis, bastando para isso
formatar a saída de dados com o símbolo de percentual (%), isso é possível e deve ser feito em
linguagem C, porém devemos fazê-lo com o cuidado de se escrever os códigos de formatação nas
posições corretas onde os valores correspondentes devem ser impressos.

Números com Casas Decimais

As variáveis do tipo inteiro, int, são utilizadas para muitos casos em linguagem C ou em qualquer
outra linguagem, porém esse tipo de dado, como o próprio nome diz, não admite casas decimais,
então não podemos utilizá-las para expressar valores monetários, por exemplo, pois esses valores
necessitam de casas decimais para expressar os centavos.
Para os casos onde há a necessidade de se utilizar variáveis que admitem casas decimais as
linguagens de programação possuem os tipos float, double e long double. Os números em ponto
flutuante são os que os matemáticos chamam de números reais, ou seja, os números que possuem
casa decimais.

Formatando a Impressão

A função printf() imprime na tela os dados que desejamos, porém ela os imprime de forma
desordenada, ou seja, não formatada, como já vimos nas sessões anteriores. Para imprimir os dados
de forma organizada que nos proporcione uma leitura agradável devemos formatar a sua saída.
Algumas formatações já foram exploradas aqui, agora vamos explorar algumas outras
possibilidades de formatação com a função printf(), atentem para nosso último programa, ele
imprime o percentual de reajuste e o salário reajustado em sua última linha de código, notem que a
impressão do dado salatual aparece com inúmeras casas decimais, o que torna sua leitura
desagradável. Para resolver esse problema a linguagem C possui uma forma de se formatar a saída
de dados e com ela podemos informar quantas casas decimais desejamos que seja impressa.
Para exemplificar esse tipo de formatação atentem para o exemplo a seguir, que é o mesmo do
exemplo anterior, porém com a formatação de casas decimais para dados do tipo float.

#include <stdio.h>
#include <stdlib.h>
int main()
{
// Declaração de variáveis
int reajuste = 15;
float salario = 2500.00;
float salatual;
char categ = 'B';

// Imprime salario, reajuste e categoria


printf("O salario e de %5.2f reais\n", salario);
printf("O percentual de reajuste e de %d por cento\n", reajuste);
printf("A categoria e classe %c\n", categ);

// Calcula novo salario


salatual = salario + salario*reajuste/100;

// Imprime o percentual de reajuste e o novo salario


printf("O salario sera reajustado em %d por cento e seu novo valor sera de %5.2f reais\n", reajuste, salatual);
system("PAUSE");
return 0;
}
Reparem nas linhas onde é solicitada a impressão do salário e do salário atual, nessas linhas foram
acrescentadas entre o símbolo de percent e o caractere que define o tipo de variável a ser impressa,
no caso float, que é formatdo pela letra f, dois algarismos separados por um ponto, esses algarismos
definem com quantos algarismos e com quantas casas decimais desejamos imprimir o valor da
variável, no caso com cinco algarismos e duas casas decimais.

CAPÍTULO 02

Operadores, Entrada de Dados, as Funções Scanf(), Getche(), Getch() e Getchar()

No capítulo um vimos como funciona os compiladores e como a linguagem C funciona, fizemos


vários exemplos para nos acostumar com alguns comandos e formatadores da linguagem, também
foi visto os tipos de variáveis e como declará-las e também como utilizar a função printf(), porém
não estudamos a entrada de dados, ou seja, como o computador recebe os dados de nós, usuários,
bem como os operadores da linguagem C também não foram estudados. Esses temas serão assuntos
desse capítulo.
A linguagem C possui vários operadores que servem para o processamento das informações, desses
já vimos um que é o operdor de atribuição (=) e também algumas funções para a entrada de dados
via teclado, como por exemplo a função scanf() e a função getch(). Começaremos agora a estudar
cada um desses operadores e funções, começaremos pelos operadores.

Operadores

Atribuição

Na linguagem C assim como muitas outras linguagens, como Java, por exemplo, o sinal de igual =
não tem significa exatamente igualldade como na matemática. Esse sinal de igual em computação
significa atribuição, ou seja, esse operador que atribui da expressão à sua direita à variável à sua
esquerda. Veja um exemplo abaixo que atribui o valor 50 à variável x:

x = 50;

Aritméticos (+ - * / %)

Os operadores aritméticos em linguagem C são os de adição (+), subtração (-), multiplicação (*), e
o operador módulo (%). Esses operadores são conhecidos como operadores binários, pois operam
sobre dois operandos. Veja na linha de código a seguir um exmplo de uso desses operadores.

salatual = salatual + reajuste;

No exemplo acima é atribuído (=) à variável salatual o seu valor mais (+) o valor do reajuste. O uso
dos outros operadores é análogo ao exemplo acima, co exceção do operador módulo, e veremos
mais sobre seu uso nos exemplos desse capítulo. Os operadores soma, subtração, multiplicação e
divisão operam com qualquer tipo de dado, inteiros ou ponto flutuante, e são usados de modo
semelhante a da aritmética. O operador de módulo (%) opera somente em dados do tipo inteiro e
retorna para o processamento do programa o resto da divisão entre dois inteiros, veja o exemplo a
seguir do uso do operador módulo:

resto = 19%3;

Nesse exemplo o operador módulo atribui à variável resto o valor do resto da divisão do inteiro 19
pelo inteiro 3, no caso o valor 4, pois 19 dividido por 3 resulta em cinco e resto igual a 4.
Precedência de Operadores

Se tivermos uma expressão que precisa ser processada pelo programa e essa expressão contiver
vários operadores há a necessidade de conhecermos a precedência desses operadores. A precedência
dos operadores indica qual deles deverá ser executado primeiro. No antigo curso ginasial, atual
fundamental 2, aprendemos que numa expressão algébrica devemos executar primeiro a
multiplicação ou a divisão e depois a soma e a subtração. Se quiséssemos efetuar uma soma antes
de uma multiplicação ou divisão, por exemplo, deveríamos indicá-la entre parênteses, ou então se
precisássemos resolver uma expressão, resolvíamos primeiro os parênteses, depois os colchetes e
depois as chaves. Em computação a regra é a mesma, porém não podemos colocar colchetes e
chaves em nossas expressões de atribuição, devendo ser utilizado os parênteses em seus lugares.
A seguir é demostrado o uso dessa precedência em alguns exemplos, atentem para eles:

x = k* 3 + 2

No exemplo acima a variável k é multiplicada por três, após isso é somado dois ao rsultado dessa
mutiplicação e por fim o resultado da expressão é atribuído à variável x.

x = (k + 3)*2;

Nesse exemplo primeiro é somado três à variável k, após isso o resultado da soma é multiplicado
por dois e por fim o resultado final da expressão é atribuído à variável x.

x = ((k + 5)*3 – 4)*2;

No exemplo acima primeiramente é atribuído o valor cinco à variável k, após isso o resultado é
multiplicado por três. Após essas duas operações é subtraído 4 do resultado da expressão anterior e
após essa subtração o resultado é multiplicado por 2 obtendo assim o resultado final da operação.
Ao final o resultado é atribuído à variável x.
Devemos notar que
fora os pareênteses os operadores *, / e % possuem a mesma precedência da esquerda para a direita.

A Função scanf() e o Endereçamento de Memória

Até agora em nosso curso apenas pedimos ao programa para que imprimisse algo na tela,
formatamos a saída de dados via monitor (vídeo), porém não fizemos nenhuma entrada de dados, ou
seja, não houve a necessidade de informarmos um valor ao programa em tempo de execução do
mesmo. A entrada de dados é necessária, pois é com ela que preenchemaos um formuláriona
internet, por exemplo.
A entrada de dados é feita com algumas funções, é com essas funções que pedimos ao computado
que nos solicite o valor de algum dado, ou seja, pedimos ao computador que nos peça o valor de
algum dado. A entrada de dados numéricos na linguagem C é feita com a função scanf(). Porém, a
função scanf() necessita do endereço de memória da variável a que o valor será atribuído, essa
prática não é necessária em outras linguagens, como Java, por exemplo. Por isso vamos dedicar
alguns instantes de nosso curso para aprendermos um pouco sobre endereço de memória.

O Operador de Endereço (&)

Na linguagem C o operador & opera sobre o endereço de uma variável. Na verdade ele opera sobre
o nome da variável resultando em seu endereço de memória e a função scanf() necessita desse
endereço para realizar a entrada de dados via teclado. Dessa forma quando declaramos uma variável
o compilador reserva um espaço na memória que será ocupada por essa variável sendo que o
tamanho do espaço reservado na memória depen derá do tipo de dado que a variável armazenará.
Esse espaço de memória possui um endereço que é o endereço do primeiro byte.
Se declararmos uma variável do tipo inteira, por exemplo, a ela dermos o nome de var e a
inicializarmos com o número cinquenta, quando a referenciarmos obteremos o valr cinquenta. A
referência de uma variável é seu endereço de memória que já dito no parágrafo anterior que é o
endereço do primeiro pela mesma. Porém se ao invés de referenciarmos a variável com seu nome,
no caso var, se usarmos &var com a função printf() para imprimí-la, o resultado será o endereço de
memória do primeiro byte ocupado por var, ou seja, o endereço de memória da variável var.
O exemplo aseguir declara uma variável chamada var, atribui a ela o valor cinquenta e após isso,
utilizando a funcão printf() imprime primeiro o valor da variável e depois o seu endereço de
memória.

#include <stdio.h>
#include <stdlib.h>

int main()
{
int var;
var = 50;
printf(“O valor da variavel var e %d\n”, var);
printf(“O endereco de memoria da variavel var e %p\n”, &var);
system(“PAUSE”);
return 0;
}

No caso a saida de nosso programa, ou seja, a impressão no monitor será a seguinte:

O valor da variavel var e 50


O endereco de memoria da variavel var e 0028ff0c

Os endereços de memória são escritos em números hexadecimais que são números escritos na base
16. Para recuperar o endereço de memória de uma variável usamos o formato %p.

Voltemos agora à função scanf(). A função scanf() é uma função de I/O, ou seja, uma das funções de
entrada e saída de dados que são fornecidas com os compiladores da linguagem C. A função scanf()
nos permite ler dados informados pelos usuários via teclado, que é a entrada padrão dos
computadores. Ela faz parte da biblioteca stdio.h.
Assim como a função printf() para usarmos a função scanf() devemos conhecer sua sintaxe, que é
bem semelhante à sintaxe da função printf(), então devemos informar à função scanf() uma
expressão de controle seguida de uma lista de argumentos sendo que os argumentos devem ser
endereços de memória, essa é uma das diferenças entre ela e a função printf(). Com o exposto acima
a sintaxe da função scanf() fica da seguinte forma:

scanf(“expressão de controle”, lista de argumentos)

A expressão de controle pode conter códigos de formatação precedidos pelo sinal de percentagem %
que são os mesmo utilizados pela função printf(). Esses códigos de formatação podem ser vistos na
tabela que já foi impressa quando estudamos a função printf().
Devemos tomar ulguns cuidados para fazermos uma entrada de dados com a função scanf(), pois ela
entende um espaço em branco como final de dado, com isso se quisermos fazer várias entradas de
dados utilizando apenas uma chamada à função scanf() devemos formatar adequadamente a entrada
de dados. Dessa forma devemos realizar a entrada múltipla de dados utilizando espaços em branco
entre as variáveis, nesse caso a tecla ENTER é utilizada como finalizador da entrada de dados.
Quando a entrada de dados for feita por várias chamadas à função scanf(), uma para cada variável,
que é a forma mais adequada e recomendada, ao informarmos o valor da primeira variável e
teclarmos ENTER essa tecla irá finalizar a entrada daquela variável introduzindo um espaço em
branco na entrada de dados informando à função scanf() o término da entrada para aquela variável e
o começo da entrada seguinte.
O exposto no parágrafo anterior é um grande problema ao usarmos a função scanf() para fazermos a
entrada de dados do tipo char que contenha mais de um caractere. Os dados do tipo char que
contenham mais de um caractere são normalmente chamados de dados do tipo String em outras
linguagens, como Java, por exemplo. Na linguagem C os dados do tipo String são vetores de
caracteres, ou seja, são coleções com tamanho definidos de caracteres. Ainda veremos vetores no
nosso curso de linguagem C, por enquanto convença-se de que um dado do tipo String em
linguagem C é um vetor de caracteres terminados por uma barra n, /n, ou barra 0, /0, dependendo do
compilador.
Espere um pouco!!! vetores de caracteres terminados por /n ou /0???? Isso não introduziria um
espaço em branco ao final da variável e quando fizéssemos uma entrada de dados com a função
scanf() não teríamos dois espaços em branco ao final da entrada de dados? Pois éééééé!!!!!! Esse é
o real problema ao se fazer uma entrada de dados do tipo String com scanf(), o dado termina com
um espaço em branco e a tecla ENTER introduz mais um.
Assim a função scanf() lê o espaço em branco da tecla ENTER e deixa o espaço em branco da
variável String no buffer de memória deixando lá um lixo para ser lido pela próxima chamada à
função scanf(). Dessa forma a próxima chamada à função scanf() não lerá o dado que queremos
informar a ela, mas sim pegará aquele lixo, que é o espaço em branco deixado pela última chamada
à função scanf(). Para resolver esse problema de entrada de dados do tipo String a linguagem C
possui as funções gech(), getchar(), gets(), entre outras queserão estudadas ainda nesse capítulo.
Para exercitar um pouco o uso da função scanf() vamos fazer alguns exemplos simples, porém de
grande valia a fim de não nos atrapalharmos com a mesma. Digite o seguinte programa em sua IDE
de preferência:

#include<stdio.h>
#include<stdlib.h>

int main()
{
float salario;
float percentual;

printf(“Informe o salario:);
scanf(“%f\n”, &salario);
printf(“Informe o percentual de reajuste:”);
scanf(“%f\n”, &percentual);

salario = salario + salario*percentual/100;

printf(“O salario reajustado e de %f”, salario);

system(“pause”);
return 0;
}

Reparem na entrada de dados com a função printf() que não colocamos o formatador \n. Isso foi
feito para que digitássemos os valores das variáveis correspondentes na mesma linha em que a
mensagem que as solicita é escrita, dessa forma podemos visualizar melhor o que o programa nos
solicita que seja digitado.

A Entrada de Dados do Tipo Caractere

As Funções Getche() e Getch()

Como vimos na sessão anterior, não é conveniente ler dados do tipo caractere (char) com a função
sacanf(), pois ao teclarmos ENTER a função deixa um lixo no buffer de memória a ser lido pela
próxima chamada da função scanf(). No caso da necessidade de se ler um caractere ou um nome
próprio, por exemplo, e esse tipo de leitura é muito utilizada em programação, a linguagem C
oferece uma série de funções apropriadas para cada caso, o caso de se ler apenas um caractere ou o
caso de se ler um nome próprio, que é um dado do tipo String, que em linguagem C é um vetor de
caracteres.
No caso da necessidade de se ler apenas um caractere do teclado a linguagem C oferece as funções
getche() e getch(). Vamos estudar cada uma delas separadamente.

As Funções Getche() e Getch()

A função getche() captura do teclado um caractere digitado sem a necessidade de se teclar ENTER e
imediatamente após a digitação do caractere o processamento é passado para a próxima linha de
código. Note que não ficará nenhum lixo no buffer de memória, como ocorre com a função scanf().
A função getche() necessita que a biblioteca conio.h seja inclusa no projeto.
Para aprendermos o uso da função getche() digite, compile e execute o seguinte programa em sua
IDE preferida:

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main()
{
char ch;
printf("Pressione uma tecla qualquer: ");
ch = getch();
printf("\nA tecla digitada foi: %c\n", ch);
system("pause");
return 0;
}

Reparem a inclusão da biblioteca conio.h antes da declaração da função main(). A primeira linha
após as chaves da função main() declara uma variável do tipo caractere (char) e a nomeia ch. Após
isso é usada a função printf() para solicitar ao usuário que digite uma tecla qualquer. Na próxima
linha de código é usado a função getche() para se ler o caractere digitado via teclado, reparem que
não há a necessidade do uso do caractere de endereçamento &. A próxima linha do código utiliza a
função printf() para imprimir o caractere digitado paa isso utiliza %c.

A função getch() é bastante similar à função getche() com a diferença de que quando digitamos o
caractere esse não aparecerá na tela do computador, ou seja, em nosso programa na primeira
chamada à função printf() ao digitarmos o caractere desejado esse não aparecerá no vídeo, isso
somente ocorrerá na segunda chamada à função printf() quando formatamos a saída dos dados com
%c e pedimos explicitamente a impressão do caractere digitado. Experimente executar o mesmo
progrma utilizando a função getch() e veja a pequena diferença.

Vous aimerez peut-être aussi