Académique Documents
Professionnel Documents
Culture Documents
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:
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.
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.
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;
}
#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.
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.
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.
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.
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():
#include <stdio.h>
#include <stdlib.h>
int main()
{
// Declara duas variáveis do tipo inteiro
int valor1;
int 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:
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.
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';
CAPÍTULO 02
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.
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.
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.
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.
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;
}
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:
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);
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.
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.
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.