You are on page 1of 15

APOSTILA LINGUAGEM C.

PROFESSOR VALDER OLMO CORRÊA
CAPÍTULO 01
Compilador!
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 ( e !", são os c#amados $its. O $it zero significa n%vel
l&gico igual a zero, quer dizer aus'ncia de energia, e o $it um significa n%vel l&gico igual a !, quer
dizer que #á energia. A linguagem de máquina é muito confusa para n&s, seres #umanos
entendermos, fica isso a cargo dos engen#eiros eletr(nicos que tra$al#am com pro)etos de
computadores.
As linguagens ditas de alto n%vel são mais acess%veis * compreensão #umana e por isso mesmo são
usadas na programação de um computador. +,emplos dessas linguagens são -isual .asic, /elp#i,
0ava, que é uma e,celente linguagem de programação, 12 (leia3se 1 4#arp", que é muito
semel#ante * linguagem 0ava, 0ava4cript (que não é 0ava, não confundam5", 676, essas duas
últimas são linguagens de script para a intenet, e tam$ém a linguagem que será o$)eto de estudo
para nosso curso, a linguagem 1.
8as se todas essas linguagens acima não são linguagens de máqunia como que o computador
entende um programa escrito com elas9 A resposta é que devemos escrever nosso programa em uma
dessas linguagens e então compilá3la 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 se)a, o compilador :traduz; o c&digo escrito em linguagem de alto n%vel
para a linguagem de máquina.
Os compiladores de linguagem 1 l'em uma a uma as lin#as de c&digo que escrevemos e vão
traduzindo para a linguagem de máquina até que a última instrução se)a traduzida. 4e não #ouver
erros durante o processo de compilação o compilador cria um programa em disco com a
e,tensão .O.0 que contém as instruç<es traduzidas. 8as o programa .O.0 não pode ser e,ecutado
pelo computador, pois ainda não possui as $i$liotecas com as funç<es em linguagem de máquina
inseridas nele. O tra$al#o de se inserir essas funç<es e $i$liotecas no programa ca$e a outro
programa c#amado =in>editor. O lin>editor então cria um programa final com a e,tensão .+?+ que
será interpretado pelo computador diretamente pelo sistema operacional. +sse programa com
e,tensão .+?+ somente funciona em @indows, pois o =inu,, por e,emplo, destroi com todo quanto
é arquivo com essa e,tensão, =inu, não aceita arquivos com e,tensão .+?+ por motios de
segurança.
+ntão para criarmos nossos programas devemos seguir tr's passos, que são os seguintesA
!. /igitar as lin#as de c&digo de nosso programa em um editor de nossa prefer'ncia e gravá3lo
em disco com a e,tensão .1, no caso da linguagem 1. +sse arquivo é c#amado de arquivo
fonte.
B. 1ompilar o programa com e,tensão .1 seguindo as instruç<es de nosso compilador de
prefer'ncia gerando assim o arquivo com e,tensão .O.0.
C. =in>editar o arquivo .O.0 a fim de se gerar o arquivo e,ecutável com a e,tensão .+?+. +se
arquivo final é c#amado de e,ecutável.
6ara realizar a dura tarefa acima podemos fazer tudo manualmente ou lançarmos mão de $oas
D/+s , Dntegrated /evelopment +nviroment, ou Am$iente de /esenvolvimento Dntegrado, que )á
trás todos os pacotes que precisamos para fazermos nossos programas. Alguns e,emplos de D/+s
que podemos tra$al#ar com a linguagem 1 são o 1ode=ite e o 1odeA.loc>s. +ssa D/+s )á trazem
para n&s o compilador da linguagem 1, um editor de te,tos adequado *s necessidades e um
=in>editor, $astando a n&s digitarmos o nosso c&digo fonte no editor de te,tos e então pedirmos
para que a D/+ salve e compile o programa e ela fará todo o restante do tra$al#o.
Ema D/+ $astante interessante é o +1=D64+, que foi desenvolvido para se tra$al#ar com a
linguagem 0ava e atualmente traz plugins para as linguagens 676 e 1. O +clipse foi desenvolvido
pela D.8 que gastou no pro)eto a $agatela de F mil#<es de d&lares e a dei,ou livre para n&s
usarmos, mas o +clipse precisa da linguagem 0ava instalada na máquina, o que não é muito simples
de se fazer, pois precisamos de configurar as variáveis de am$iente, o que não é muito intuitivo, por
isso ficaremos então com o 1ode=ite ou o 1odeA.loc>s.
A E!"r#"#ra $%!i&a d #m Pro'rama E!&ri"o (a Li('#a'm C.
6ara escrevemos nossos programas em linguagem 1 necessitamos de seguir algumas normas da
linguagem, isso é válido para qualquer linguagem de programação, ou se)a, devemos con#ecer sua
estrutura para podemros escrever nossos c&digos fontes. A estrutura da linguagem 1 consite em
funç<es que realizam determinados tra$al#os e segue a seguinte forma geralA
tipo nomeGunc(declaração de parHmetros"
I
/eclaração de variáveisJ
Dnstrução !J
Dnstrução BJ
Dnstrução CJ
.
.
.
Dnstrução nJ
return valorKtipoJ
L
Ma 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 nomeGunc é o nome da função, normalmente momeamos nossas
funç<es para palavras mnemonicas, ou se)a, palavras que lem$ram o que a função deve fazer. +ntre
par'nteses temos as declaraç<es dos parHmetros, estudaremos isso quando vermos funç<es. Ma lin#a
onde está escrito /eclaraçã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 se)a, é a partir dessa lin#a que vamos
:ensinar; o computador a realizar uma determinada tarefa. Ma lin#a onde está escrito return
declaramos o que a função deve retornar para a e,ecução do programa, reforço mais uma vez que
ainda veremos isso quando estudarmos funç<es em 1, portanto, não se preocupem por enquanto
com essa nomenclatura.
A F#()*o mai(+,.
Os programas escritos em qualquer linguagem necessitam de funç<es. Mos programas podemos ter
quantas funç<es quisermos com o nome que quisermos, porém uma função em especial é
o$rigatária e,istir a fim de que o programa funcione, o nome dessa função é main(", principal, em
Dngl's. N a função main(" quem começa a e,ecuçã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 se)a, ela retorna um valor inteiro * e,ecução do programa, é ela a
responsável por :c#amar; ou :invocar; as outras funç<es do programa e rece$er os retornos que
essas funç<es t'm.
Os programas em linguagem 1 devem conter uma única função main(", se o programa contiver uma
única função, essa deve ser a main(". 6ortanto não podemos nomear outra função com o nome de
main(", pois essa palavra é reservada * linguagem 1. 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 c#aves ap&s o nome main(" indicam o
começo e o fim do c&digo, é dentro dessas c#aves que inserimos as lin#as de c&digo que a função
deve e,ecutar e a função main(" não foge a essa regra.
No!!o Primiro Pro'rama m Li('#a'm C.
6ara escrevemos nosso primeiro programa em linguagem 1 devemos con#ecer alguns comandos,
instruç<es, funç<es especiais da linguagem e duas $i$liotecas especiais. -amos escrever nosso
primeiro programa em linguagem 1 e então e,plicaremos lin#a a lin#a o c&digo. -amos então
escrever um pequeno programa que escreva na tela o nosso nome. O c&digo é o seguinteA
2include Ostdio.#P
2include Ostdli$.#P
int main("
I
printf(:8eu nome é -alder Olmo 1orr'a;"J
sQstem(:pause;"J
return J
L
-amos agora a uma e,plicaçao de cada lin#a do nosso primeiro programaA
#include <stdio.h>
+ssa lin#a faz com que se)a inclu%da a $i$lioteca stdio.# ao programa. +ssa $i$lioteca é necessária
pois sem ela não consegur%amos escrever algo na tela, ou se)a, não ter%amos como fazer uma sa%da
de dados. A $i$lioteca stdio.# é uma $i$lioteca de entrada (i de in" e sa%da (o de out", por isso
stdio.#. 4em a inclusão dessa $i$lioteca não poder%amos utilizar a função printf(", que é uma função
de sa%da de dados, )á que tem a função de escrever algo na tela.
#include <stdlib.h>
A lin#a contendo essa instrução faz com que se)a inclu%da no programa a $i$lioteca stdli$.# que traz
as diretivas para que a função sQstem funcione. 4em a função sQstem não conseguir%amos parar a
e,ecuçã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”!
+ssa lin#a de c&digo utiliza a função printf(" para escrever algo na tela. Mote que dese)amos
escrever um nome, ou se)a, um dado do tipo string (vão se acostumando com essa nomenclatura".
/entro dos par'nteses e entre aspas devemos escrever o que se dese)a que se)a escrito na tela, em
nosso caso o nome de alguém muito especial.
s"stem(“pause”!
+ssa lin#a provoca uma pausa na e,ecução do programa até que uma tecla se)a pressionada. Dsso é
necessário, caso contrário não conseguir%amos notar o processamento. A função responsável por
essa pausa é a função sQstem(" que rece$e o parHmetro pause.
return #!
+ssa lin#a de c&digo retorna o valor inteiro (zero" para quem c#amou a função main(", no caso o
sistema operacional. Ap&s essa lin#a de c&digo o programa é finalizado.
Motem que todo o nosso c&digo, com e,ceção das diretivas include, estão entre as c#aves da função
main(". Mote tam$ém que toda instrução deve aca$ar com um ponto e v%rgula (J". O ponto e v%rgula
indica ao compilador que a intrução c#egou ao fim e que uma nova instrução ceverá ser interpretada
a seguir.
-amos 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 lin#a
iremos escrev'3lo em duas lin#as separadamente. Atente ao seguinte programaA
2include Ostdio.#P
2include Ostdli$.#P
int main("
I
printf(:8eu nome é -alder;"J
printf(:8eu so$renome é Olmo 1orr'a;"J
sQstem(:pause;"J
return J
L
Aos ol#os de uma pessoa que este)a aprendendo a programar e nunca ten#a tido contato com outra
linguagem o programa acima deveria imprimir na tela o nome em uma lin#a e o so$renome em
outra, porém não é isso que ele faz, pois em nen#um momento dissemos ao compilador que se deve
imprimir a mensagem dessa forma. 6ara imprimirmos a mensagem como queremos
devemosmaprender a formatar a sa%da de dados com a função printf(". 6ara tanto atende ao
programa a seguirA
2include Ostdio.#P
2include Ostdli$.#P
int main("
I
printf(:8eu nome é -alderRn;"J
printf(:8eu so$renome é Olmo 1orr'aRn;"J
sQstem(:pause;"J
return J
L
Motem agora que inserimos dois caracteres ap&s as strings a serem impressas pela função printf(",
os caracteres Rn. Ma verdade esses dois caracteres representam um único caracter em 1 que é (o-a.
li(/a. /essa forma dizemos ao compilador que ap&s a impressão dese)a3se passar a e,ecução do
programa para uma nova lin#a, assim sendo a pr&,ima string será impressa na lin#a seguinte.
-árias outras formataç<es podem ser feitas em linguagem 1 inserindo3se o caracter R seguido de
outro caracter que informa a linguagem o tipo de formatação que queremos. Ma ta$ela seguinte
encontra3se uma série das fomataç<es mais utilizadas na linguagem 1, estude3as para mel#orar sua
e,peri'ncia com a linguagem.
C0di'o E!p&ial Si'(i1i&ado
Rn Mova lin#a
Rt Sa$ulação
R$ Tetrocesso. 1&digo utilizado pelas impressoras.
Rf 4alto de página. Etilizado em formulários cont%nuos.
Ra .eep. O toque do alto falante.
Rr 1T. Tetorno do cursor para o %n%cio da lin#a.
RR R .arra invertida.
R Uero.
RV Aspas simples
R; Aspas duplas.
R,dd Tepresentação de números na forma #e,adecimal.
Rddd Tepresentação de números na forma octal.
Com("%rio! m Pro'rama!
Mormalmente os programas que são desenvolvidos para se e,ecutar uma tarefa profissional, como
por e,emplo um aplicativo de $anco de dados, que e,ige um número muito grande de c&digos e,
portanto um número enorme de lin#as 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 #ora de se fazer uma
upgrade ou uma atualização do software o tra$al#o torna3se e,tremamente cansativo e a$orrecedor
se não sou$ermos o que cada $loco do programa, ou mesmo cada lin#a, realiza. 6ara evitar esses
a$orrecimentos e otimizar o tra$al#o na #ora de se fazer uma atualização ou de se dar suporte ao
software, inserimos no c&digo lin#as de comentários para sa$ermos o que a mesma está fazendo.
Os comentários nos a)udam a sa$ermos qual tarefa cada lin#a ou $loco de programa realiza. Os
comentários não são interpretados pelo compilador, portanto não são interpretados pelo mesmo.
1omentários são inseridos nos programas de duas formas diferentes, vistas a seguirA
!. 1om duas $arras (WW" fazemos o comentário de apenas uma lin#a do programas.
B. 1om os caracteres X e W fazemos comentários em um $loco de lin#as do programa, sendo
que a sequ'ncia WX indica o in%cio do $loco de comentário e XW indica o finaldo $loco de
comentário.
-e)a a seguir como ficaria nosso último programa com lin#as de comentáriosA
2include Ostdio.#P
2include Ostdli$.#P
int main("
I
WX 6rograma ela$orado pelo professor -alder Olmo 1orr'a
para ser utilizado na apostila da disciplina de computação
do curso de +ngen#aria 8ecHnica e 1ivil da Eniversidade
de 8ogi das 1ruzes campus -illa =o$os
XW

WW Dmprime o nomeA
printf(:8eu nome é -alder;"J
WW Dmprime o so$re nomeA
printf(:8eu so$renome é Olmo 1orr'a;"J
sQstem(:pause;"J
return J
L
Motem que no programa acima #á um $loco de comentário de várias lin#as inciciando com os
caracteres WX e terminando com os caracteres XW e dois $locos de comentários de uma única lin#a,
am$os os comentários e,plicam o que as lin#as de c&digo realizam, ou se)a, imprimir o nome e o
so$re nome.
Imprimi(do Cara&"r! N#m2ri&o!
8uitas vezes precisaremos imprimir o resultado de uma e,pressão algé$rica, em todas as áreas do
con#ecimento essa situação é muito comum, pois todas elas utilizam #o)e 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á3los *s suas necessidades. Messe caso os analistas
ou engen#eiros devem ela$orar um software espec%fico para a empresa que atenda a necessidades da
mesma.
6ara imprimir caracteres numéricos com a função printf(" podemos proceder de duas formas
distintas. Ema delas é pedir para que se)a impresso o número dese)ado simplesmente colocando3o
dentro da string a ser impressa, ve)a a lin#a de c&digo a$ai,oA
printf(:+ste é o número oito YP Z;"J
Messe caso sa$emos com anteced'ncia qual número deve ser impresso, no caso o número oito, mas
e se não sou$éssemos qual o número a ser impresso o qual foi o resultado de um processamento de
nosso programa9 Messe caso #á os c&digos para impressão da função printf(", que tam$ém são
c&digos de formatação. /essa forma devemos informar * função printf(" uma lista de parHmetros os
quais informam que tipo de informação deverá ser impressa ap&s a string a ser impressa entre as
aspas. 6erce$eremos isso mel#or na pr&,ima sessão quando vermos o uso de variáveis na
linguagem 1, por enquanto atente para a lin#a de c&digo a$ai,o que imprime o número oito de uma
forma diferente da vista anteriormente.
printf(:+ste é o numero oitoA [dRn;, Z"J
Teparem os caracteres [d ap&s a string a ser impressa, eles indicam que a função printf(" rece$erá
como argumento um dado inteiro a ser impresso, nesse caso o argumento é o número oito. Teparem
tam$é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(" rece$e, ou se)a, ap&s a v%rgula a função printf(" rece$e 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.
Cara&"r Cadia d Cara&"r!
Os caracteres em 1 são números delimitados entre e BFF, isso quer dizer que um caractere em
linguagem 1 é representado por um número entre e BFF, ou se)a, um único $Qte, ou oito $its. Os
caracteres constantes podem ser escritos entre aspas simples com o seu c&digo A41DD. Em e,emplo
é o número \F que pode ser como VAV.
Ema cadeia de caracteres em linguagem 1 é escrita entre aspas duplas. 6or e,emplo a cadeia de
caracteres :-alder Olmo 1orr'a; é corretamente interpretada pela linugagem 1, 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 1 faz5 6or isso devemos
estudar com $astante atenção o uso correto de caracteres na linguagem 1 a fim de não termos
pro$lemas na impressão de dados desse tipo. 1omo dito acima, em 1 usamos as aspas simples para
representar um único caractere utilizando seu c&digo A41DD e usamos aspas duplas para representar
uma cadeia de caracteres que é corretamente interpretada pelo compilador.
A$ai,o temos uma ta$ela com alguns c&digos especiais e os dados que cada um deles indica ao
compilador que devem ser impressos.
1&digos de GormataçãoW
Dmpressão 4ignificado
[c 1aractere simples.
[d Dnteiro decimal.
[e Motação cient%fica com e minúsculo.
[+ Motação cient%fica com + maiúsculo.
[f 6onto flutuante.
[o Dnteiro octal sem sinal
[s 4tring de caracteres.
[, Dnteiro #e,adecimal sem sinal (letras minúsculas".
[? Dnteiro #e,adecimal sem sinal (letras maiúsculas".
[p 6onteiro (endereço de mem&ria".
[n 6onteiro inteiro.
[[ Dmpressão do caractere [.
Mote na lin#a a$ai,o outro e,emplo de impressão utilizando os caracteres de formatação para a
função printf("A
printf(:8eu nome é [sRn;, :-alder Olmo 1orr'a;"J
printf(:8in#a idade é [d anos e meu saldo $ancário é de [d mil#oes de reaisRn;, BF, C"J
U!o d Co(!"a("! Vari%-i! m Li('#a'm C.
Ema variável ou uma constante em 1 é 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 pro)eto 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 ela$orarmos nossos programas em qualquer linguagem de programação, e a linguagem 1 não
foge * regra, devemos ter em mente que o programa precisará tra$al#ar com dados numéricos e
esses dados podem ser constantes, ou se)a, não possuem seu valor mudado ao longo de todo o
programa, ou dados variáveis, aqueles que seus valores variam durante a e,ecuçã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.
6ara e,emplificar o que foi e,posto no parágrafo anterior vamos supor que uma empresa fez um
acordo com os funcionários e que por esse acordo os mesmos rece$erão durante um ano um rea)uste
mensal com ta,a fi,a de )uros mensais. 6odemos imaginar assim dois tipos de dados em um
programa, um é a ta,a mensal de aumento dos salários da empresa, ou se)a, a porcentagem de
aumento ao longo dos meses, que é um dado fi,o, uma constante. O outro tipo de dado é o pr&rpio
salário dos funcionários que se alterará ao longo dos meses, ou se)a, um dado variável que o
programa deve calcular seu valor m's a m's.
Motem a e,trema importHncia de se utilizar dados constantes e variáveis em um programa.
+m linguagem 1 #á vários tipos de dados, a e,emplo de outras linguagens, e o primeiro tipo de
dado que vamos estudar são os dados numéricos do tipo inteiro. 6ara fazer uso de variáveis em 1
devemos declará3las informando ao compilador o tipo de dado a qual a vairável armazenará $em
como seu nome. 6ara se declarar uma variável do tipo inteiro em 1 devemos escrever a palavra
reservada i(" seguida do nome que qeuremos dar * variável.
6ara vermos um e,emplo com declaração de variáveis e mel#or compreender o que foi e,plicado
nos dois parágrafos anteriores atente para o programa a seguirA
2include Ostdio.#P
2include Ostdli$.#P
int main("
I
WW /eclara duas variáveis do tipo inteiro
int valor!J
int valorBJ

WW Atri$ui o valor B * variável valor!
valor! Y BJ

WW Atri$ui * variável valorB o valor da variável valor! mais o inteiro C
valorB Y valor! ] CJ

WW Dmprime na tela do computador os valores das duas variáveisA

printf(:O valor da variavel ! e [dRn;, valor!"J
printf(:O valor da variavel B e [dRn;, valorB"J

sQstem(:6AE4+;"J
return J
L
Motem que devemos declarar as variáveis antes de usá3las, caso contrário o compilador irá imprimir
uma mensaem de erro informando que a variável não foi encontrada ou que é ine,istente. Soda
declaração de variáveis em linguagem 1 deve ser feita no inicio da função logo ap&s a a$ertura das
c#aves (I" que representa o in%cio de função. +m algumas linguagens mais atuais a declaração de
variáveis pode ser feita em qualquer ponto do programa, como a linguagem 0A-A, por e,emplo.
6ara finalizar deve3se esclarecer que em 1 toda variável deve ser declarada antes de ser usada.
Ma declaração de variáveis é aconsel#ado faz'3lo de forma organizada a fim de se identificar quais
os o$)etivos de cada variável. Momear variáveis com nomes mnem(nicos tam$ém a)uda $astante a
identificar a função da variável no programa, recomenda3se tam$ém organizar em $locos as
variáveis com o$)etivos semel#antes e para finalizar é sempre $om incluir uma lin#a de comentário
e nesse indicar o que a variável ou o con)unto de variáveis, no caso de um $loco, faz ou e,ecuta.
Tesumindo, temosA
!. 4empre declare as variáveis no in%cio de cada função.
B. Organize a declaração de variáveis em $locos.
C. Momeia as variáveis com nomes mnem(nicos (Momes que lem$ram a função da variável".
^. Dnclua lin#as de comentários comentando a função da variável no programa.
O! Tipo! d Vari%-i! m Li('#a'm C.
Ma linguagem 1 temos vários tipos de variáveis, um deles )á vimos, que é o tipo de variável inteiro
(int". -amos 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 se)a, um dado do tipo inteiro
armazenará dados inteiros, números inteiros. O tipo de dado tam$ém indica ao compilador a
quantidade de mem&ria que deve ser reservada a ele no computador, cada tipo de variável possui
um taman#o, uma quantidade de mem&ria necessário ao seu armazenamento.
Os tipos $ásicos de variáveis em 1 são &/ar, i(", 1loa", do#3l, e -oid, sendo que #á tam$ém os
modificadores desses tipos, que veremos a seguir. Os tipos c/ar e i(" são utilizados para armazenar
números inteiros sendo que &/ar possui o taman#o de um $Qte e o tipo i(" possui o taman#o de ^
$Qtes, isso nos computadores atuais providos de am$ientes de CB $its, @indows _F ou posterior,
=inu,, Eni,, DO4. /esses dados o tipo c#ar não aceita modificadores, como citado anteriormente,
todos os outros aceitam. Os modificadores são apenas tr's, a sa$erA !/or", lo(', e #(!i'(d.
A ta$ela a seguir lista os tipos de variáveis em linugagem 1, seu taman#o em $its e $Qtes e a escala
de a$rang'ncia dos valores que são poss%veis armazenar com cada uma delasA
Sipo .its .Qtes +scala de a$rang'ncia
c#ar Z ! 3!BZ a !B`
int CB ^ 3B.!^`.^ZC.\^Z a B.!^`.^ZC.\^`
s#ort !\ B 3CB.`\F a CB.`\`
long CB ^ 3B.!^`.^ZC.\^Z a B.!^`.^ZC.\^`
float CB ^ C,^,!
3CZ
a C,^,!
CZ
dou$le \^ Z !,`,!
3CZ
a !,`,!
CZ
=ong dou$le Z ! C,^,!
3^_CB
a C,^,!
^_CB
Ma declaração de uma variável é poss%vel faz'3lo com um operador de atri$uição a fim de se dar *
variável um valor inicial. Dsso é feito com o operador de atri$uição que usa o sinal de igualdade para
esse fim (Y", devemos notar que esse operador não significa igualdade em linguagem 1, mas sim o
pr&prio nome do operador que é atri$uição. auando damos um valor inicial para uma variável
estamos inicializando a mesma, ou se)a, é o que c#amamos de inicialização de variáveis.
6odemos tam$ém declarar mais de uma variável na mesma lin#a, podemos inclusive declarar várias
variáveis na mesma lin#a e tam$ém inicializá3las. -e)amos a seguir alguns e,emplos de declaração
de variáveis com sua devida inicialização. 6ara isso digite o seguinte c&digo em sua D/+ de
prefer'ncia, salve, compile e rode o programaA
2include Ostdio.#P
2include Ostdli$.#P
int main("
I
int percentual Y FJ
c#ar categ Y VAVJ
float sal Y !F.J
float salatualJ
printf(:O percentual de rea)uste e de [d por cento;, percentual"J
printf(:O salario atual e de [f reais;, sal"J
printf(:A categoria e classe [c;, categ"J
salatual Y sal ] salXpercentualW!J
printf(:O salario sera rea)ustado em [d porcento e seu novo valor sera [f reais;, salatual"J
L
Motem que no e,emplo anterior declaramos variáveis de tr's tipos diferentes, c#ar, int e float sendo
que inicializamos as variáveis c#ar, int e uma das variáveis float dei,ando a outra para acumular um
valor, no caso salário atual, que é resultado de um processamento do programa. Sam$ém importante
notar que na última lin#a do programa imprimimos dois tipos de variáveis, $astando para isso
formatar a sa%da de dados com o s%m$olo de percentual ([", isso é poss%vel e deve ser feito em
linguagem 1, porém devemos faz'3lo com o cuidado de se escrever os c&digos de formatação nas
posiç<es corretas onde os valores correspondentes devem ser impressos.
N4mro! &om Ca!a! D&imai!
As variáveis do tipo inteiro, int, são utilizadas para muitos casos em linguagem 1 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á3las para e,pressar valores monetários, por e,emplo, pois esses valores
necessitam de casas decimais para e,pressar os centavos.
6ara os casos onde #á a necessidade de se utilizar variáveis que admitem casas decimais as
linguagens de programação possuem os tipos float, dou$le e long dou$le. Os números em ponto
flutuante são os que os matemáticos c#amam de números reais, ou se)a, os números que possuem
casa decimais.
Forma"a(do a Impr!!*o
A função printf(" imprime na tela os dados que dese)amos, porém ela os imprime de forma
desordenada, ou se)a, não formatada, como )á vimos nas sess<es anteriores. 6ara imprimir os dados
de forma organizada que nos proporcione uma leitura agradável devemos formatar a sua sa%da.
Algumas formataç<es )á foram e,ploradas aqui, agora vamos e,plorar algumas outras
possi$ilidades de formatação com a função printf(", atentem para nosso último programa, ele
imprime o percentual de rea)uste e o salário rea)ustado em sua última lin#a de c&digo, notem que a
impressão do dado salatual aparece com inúmeras casas decimais, o que torna sua leitura
desagradável. 6ara resolver esse pro$lema a linguagem 1 possui uma forma de se formatar a sa%da
de dados e com ela podemos informar quantas casas decimais dese)amos que se)a impressa.
6ara e,emplificar esse tipo de formatação atentem para o e,emplo a seguir, que é o mesmo do
e,emplo anterior, porém com a formatação de casas decimais para dados do tipo float.
2include Ostdio.#P
2include Ostdli$.#P
int main("
I
WW /eclaração de variáveis
int rea)uste Y !FJ
float salario Y BF.J
float salatualJ
c#ar categ Y V.VJ
WW Dmprime salario, rea)uste e categoria
printf(bO salario e de [F.Bf reaisRnb, salario"J
printf(bO percentual de rea)uste e de [d por centoRnb, rea)uste"J
printf(bA categoria e classe [cRnb, categ"J
WW 1alcula novo salario
salatual Y salario ] salarioXrea)usteW!J
WW Dmprime o percentual de rea)uste e o novo salario
printf(bO salario sera rea)ustado em [d por cento e seu novo valor sera de [F.Bf reaisRnb, rea)uste, salatual"J
sQstem(b6AE4+b"J
return J
L
Teparem nas lin#as onde é solicitada a impressão do salário e do salário atual, nessas lin#as foram
acrescentadas entre o s%m$olo 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 dese)amos imprimir o valor da
variável, no caso com cinco algarismos e duas casas decimais.
CAPÍTULO 05
Oprador!6 E("rada d Dado!6 a! F#()7! S&a(1+,6 G"&/+,6 G"&/+, G"&/ar+,
Mo cap%tulo um vimos como funciona os compiladores e como a linguagem 1 funciona, fizemos
vários e,emplos para nos acostumar com alguns comandos e formatadores da linguagem, tam$ém
foi visto os tipos de variáveis e como declará3las e tam$ém como utilizar a função printf(", porém
não estudamos a entrada de dados, ou se)a, como o computador rece$e os dados de n&s, usuários,
$em como os operadores da linguagem 1 tam$ém não foram estudados. +sses temas serão assuntos
desse cap%tulo.
A linguagem 1 possui vários operadores que servem para o processamento das informaç<es, desses
)á vimos um que é o operdor de atri$uição (Y" e tam$ém algumas funç<es para a entrada de dados
via teclado, como por e,emplo a função scanf(" e a função getc#(". 1omeçaremos agora a estudar
cada um desses operadores e funç<es, começaremos pelos operadores.
Oprador!
A"ri3#i)*o
Ma linguagem 1 assim como muitas outras linguagens, como 0ava, por e,emplo, o sinal de igual Y
não tem significa e,atamente igualldade como na matemática. +sse sinal de igual em computação
significa atri$uição, ou se)a, esse operador que atri$ui da e,pressão * sua direita * variável * sua
esquerda. -e)a um e,emplo a$ai,o que atri$ui o valor F * variável ,A
, Y FJ
Ari"m2"i&o! +8 . 9 : ;,
Os operadores aritméticos em linguagem 1 são os de adição (]", su$tração (3", multiplicação (X", e
o operador m&dulo ([". +sses operadores são con#ecidos como operadores $inários, pois operam
so$re dois operandos. -e)a na lin#a de c&digo a seguir um e,mplo de uso desses operadores.
salatual Y salatual ] rea)usteJ
Mo e,emplo acima é atri$u%do (Y" * variável salatual o seu valor mais (]" o valor do rea)uste. O uso
dos outros operadores é análogo ao e,emplo acima, co e,ceção do operador m&dulo, e veremos
mais so$re seu uso nos e,emplos desse cap%tulo. Os operadores soma, su$tração, multiplicação e
divisão operam com qualquer tipo de dado, inteiros ou ponto flutuante, e são usados de modo
semel#ante 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, ve)a o e,emplo a
seguir do uso do operador m&duloA
resto Y !_[CJ
Messe e,emplo o operador m&dulo atri$ui * variável resto o valor do resto da divisão do inteiro !_
pelo inteiro C, no caso o valor ^, pois !_ dividido por C resulta em cinco e resto igual a ^.
Pr&d<(&ia d Oprador!
4e tivermos uma e,pressão que precisa ser processada pelo programa e essa e,pressão contiver
vários operadores #á a necessidade de con#ecermos a preced'ncia desses operadores. A preced'ncia
dos operadores indica qual deles deverá ser e,ecutado primeiro. Mo antigo curso ginasial, atual
fundamental B, aprendemos que numa e,pressão algé$rica devemos e,ecutar primeiro a
multiplicação ou a divisão e depois a soma e a su$tração. 4e quiséssemos efetuar uma soma antes
de uma multiplicação ou divisão, por e,emplo, dever%amos indicá3la entre par'nteses, ou então se
precisássemos resolver uma e,pressão, resolv%amos primeiro os par'nteses, depois os colc#etes e
depois as c#aves. +m computação a regra é a mesma, porém não podemos colocar colc#etes e
c#aves em nossas e,press<es de atri$uição, devendo ser utilizado os par'nteses em seus lugares.
A seguir é demostrado o uso dessa preced'ncia em alguns e,emplos, atentem para elesA
, Y >X C ] B
Mo e,emplo acima a variável > é multiplicada por tr's, ap&s isso é somado dois ao rsultado dessa
mutiplicação e por fim o resultado da e,pressão é atri$u%do * variável ,.
, Y (> ] C"XBJ
Messe e,emplo primeiro é somado tr's * variável >, ap&s isso o resultado da soma é multiplicado
por dois e por fim o resultado final da e,pressão é atri$u%do * variável ,.
, Y ((> ] F"XC c ^"XBJ
Mo e,emplo acima primeiramente é atri$u%do o valor cinco * variável >, ap&s isso o resultado é
multiplicado por tr's. Ap&s essas duas operaç<es é su$tra%do ^ do resultado da e,pressão anterior e
ap&s essa su$tração o resultado é multiplicado por B o$tendo assim o resultado final da operação.
Ao final o resultado é atri$u%do * variável ,.
/evemos notar que
fora os pare'nteses os operadores X, W e [ possuem a mesma preced'ncia da esquerda para a direita.
A F#()*o !&a(1+, o E(dr)am("o d Mm0ria
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 nen#uma entrada de dados, ou
se)a, não #ouve a necessidade de informarmos um valor ao programa em tempo de e,ecução do
mesmo. A entrada de dados é necessária, pois é com ela que preenc#emaos um formuláriona
internet, por e,emplo.
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 se)a, pedimos ao computador que nos peça o valor de
algum dado. A entrada de dados numéricos na linguagem 1 é feita com a função !&a(1+,. 6orém, a
função scanf(" necessita do endereço de mem&ria da variável a que o valor será atri$u%do, essa
prática não é necessária em outras linguagens, como 0ava, por e,emplo. 6or isso vamos dedicar
alguns instantes de nosso curso para aprendermos um pouco so$re endereço de mem&ria.
O Oprador d E(dr)o +=,
Ma linguagem 1 o operador d opera so$re o endereço de uma variável. Ma verdade ele opera so$re
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. /essa 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
taman#o do espaço reservado na mem&ria depen derá do tipo de dado que a variável armazenará.
+sse espaço de mem&ria possui um endereço que é o endereço do primeiro $Qte.
4e declararmos uma variável do tipo inteira, por e,emplo, a ela dermos o nome de var e a
inicializarmos com o número cinquenta, quando a referenciarmos o$teremos o valr cinquenta. A
refer'ncia de uma variável é seu endereço de mem&ria que )á dito no parágrafo anterior que é o
endereço do primeiro pela mesma. 6orém se ao invés de referenciarmos a variável com seu nome,
no caso var, se usarmos dvar com a função printf(" para imprim%3la, o resultado será o endereço de
mem&ria do primeiro $Qte ocupado por var, ou se)a, o endereço de mem&ria da variável var.
O e,emplo aseguir declara uma variável c#amada var, atri$ui 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.
2include Ostdio.#P
2include Ostdli$.#P
int main("
I
int varJ
var Y FJ
printf(:O valor da variavel var e [dRn;, var"J
printf(:O endereco de memoria da variavel var e [pRn;, dvar"J
sQstem(:6AE4+;"J
return J
L
Mo caso a saida de nosso programa, ou se)a, a impressão no monitor será a seguinteA
O valor da variavel var e F
O endereco de memoria da variavel var e BZffc
Os endereços de mem&ria são escritos em números #e,adecimais que são números escritos na $ase
!\. 6ara recuperar o endereço de mem&ria de uma variável usamos o formato [p.
-oltemos agora * função scanf(". A função scanf(" é uma função de DWO, ou se)a, uma das funç<es de
entrada e sa%da de dados que são fornecidas com os compiladores da linguagem 1. A função scanf("
nos permite ler dados informados pelos usuários via teclado, que é a entrada padrão dos
computadores. +la faz parte da $i$lioteca stdio.#.
Assim como a função printf(" para usarmos a função scanf(" devemos con#ecer sua sinta,e, que é
$em semel#ante * sinta,e da função printf(", então devemos informar * função scanf(" uma
e,pressã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(". 1om o e,posto acima
a sinta,e da função scanf(" fica da seguinte formaA
scanf(:e,pressão de controle;, lista de argumentos"
A e,pressã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(". +sses c&digos de formatação podem ser vistos na
ta$ela que )á foi impressa quando estudamos a função printf(".
/evemos tomar ulguns cuidados para fazermos uma entrada de dados com a função scanf(", pois ela
entende um espaço em $ranco como final de dado, com isso se quisermos fazer várias entradas de
dados utilizando apenas uma c#amada * função scanf(" devemos formatar adequadamente a entrada
de dados. /essa forma devemos realizar a entrada múltipla de dados utilizando espaços em $ranco
entre as variáveis, nesse caso a tecla +MS+T é utilizada como finalizador da entrada de dados.
auando a entrada de dados for feita por várias c#amadas * 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 +MS+T essa tecla irá finalizar a entrada daquela variável introduzindo um espaço em
$ranco 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 e,posto no parágrafo anterior é um grande pro$lema ao usarmos a função scanf(" para fazermos a
entrada de dados do tipo c#ar que conten#a mais de um caractere. Os dados do tipo c#ar que
conten#am mais de um caractere são normalmente c#amados de dados do tipo 4tring em outras
linguagens, como 0ava, por e,emplo. Ma linguagem 1 os dados do tipo 4tring são vetores de
caracteres, ou se)a, são coleç<es com taman#o definidos de caracteres. Ainda veremos vetores no
nosso curso de linguagem 1, por enquanto convença3se de que um dado do tipo 4tring em
linguagem 1 é um vetor de caracteres terminados por uma $arra n, Wn, ou $arra , W, dependendo do
compilador.
+spere um pouco555 vetores de caracteres terminados por Wn ou W9999 Dsso não introduziria um
espaço em $ranco 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 $ranco ao final da entrada de dados9 6ois éééééé555555 +sse é
o real pro$lema ao se fazer uma entrada de dados do tipo 4tring com scanf(", o dado termina com
um espaço em $ranco e a tecla +MS+T introduz mais um.
Assim a função scanf(" l' o espaço em $ranco da tecla +MS+T e dei,a o espaço em $ranco da
variável 4tring no $uffer de mem&ria dei,ando lá um li,o para ser lido pela pr&,ima c#amada *
função scanf(". /essa forma a pr&,ima c#amada * função scanf(" não lerá o dado que queremos
informar a ela, mas sim pegará aquele li,o, que é o espaço em $ranco dei,ado pela última c#amada
* função scanf(". 6ara resolver esse pro$lema de entrada de dados do tipo 4tring a linguagem 1
possui as funç<es gec#(", getc#ar(", gets(", entre outras queserão estudadas ainda nesse cap%tulo.
6ara e,ercitar um pouco o uso da função scanf(" vamos fazer alguns e,emplos simples, porém de
grande valia a fim de não nos atrapal#armos com a mesma. /igite o seguinte programa em sua D/+
de prefer'nciaA
2includeOstdio.#P
2includeOstdli$.#P
int main("
I
float salarioJ
float percentualJ

printf(:Dnforme o salarioA"J
scanf(:[fRn;, dsalario"J
printf(:Dnforme o percentual de rea)usteA;"J
scanf(:[fRn;, dpercentual"J

salario Y salario ] salarioXpercentualW!J
printf(:O salario rea)ustado e de [f;, salario"J
sQstem(:pause;"J
return J
L
Teparem na entrada de dados com a função printf(" que não colocamos o formatador Rn. Dsso foi
feito para que digitássemos os valores das variáveis correspondentes na mesma lin#a em que a
mensagem que as solicita é escrita, dessa forma podemos visualizar mel#or o que o programa nos
solicita que se)a digitado.
A E("rada d Dado! do Tipo Cara&"r
A! F#()7! G"&/+, G"&/+,
1omo vimos na sessão anterior, não é conveniente ler dados do tipo caractere (c#ar" com a função
sacanf(", pois ao teclarmos +MS+T a função dei,a um li,o no $uffer de mem&ria a ser lido pela
pr&,ima c#amada da função scanf(". Mo caso da necessidade de se ler um caractere ou um nome
pr&prio, por e,emplo, e esse tipo de leitura é muito utilizada em programação, a linguagem 1
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 4tring, que em linguagem 1 é um vetor de
caracteres.
Mo caso da necessidade de se ler apenas um caractere do teclado a linguagem 1 oferece as funç<es
getc#e(" e getc#(". -amos estudar cada uma delas separadamente.
A! F#()7! G"&/+, G"&/+,
A função getc#e(" captura do teclado um caractere digitado sem a necessidade de se teclar +MS+T e
imediatamente ap&s a digitação do caractere o processamento é passado para a pr&,ima lin#a de
c&digo. Mote que não ficará nen#um li,o no $uffer de mem&ria, como ocorre com a função scanf(".
A função getc#e(" necessita que a $i$lioteca conio.# se)a inclusa no pro)eto.
6ara aprendermos o uso da função getc#e(" digite, compile e e,ecute o seguinte programa em sua
D/+ preferidaA
2include Ostdio.#P
2include Ostdli$.#P
2include Oconio.#P
int main("
I
c#ar c#J
printf(b6ressione uma tecla qualquerA b"J
c# Y getc#("J
printf(bRnA tecla digitada foiA [cRnb, c#"J
sQstem(bpauseb"J
return J
L
Teparem a inclusão da $i$lioteca conio.# antes da declaração da função main(". A primeira lin#a
ap&s as c#aves da função main(" declara uma variável do tipo caractere (c#ar" e a nomeia c#. Ap&s
isso é usada a função printf(" para solicitar ao usuário que digite uma tecla qualquer. Ma pr&,ima
lin#a de c&digo é usado a função getc#e(" para se ler o caractere digitado via teclado, reparem que
não #á a necessidade do uso do caractere de endereçamento d. A pr&,ima lin#a do c&digo utiliza a
função printf(" para imprimir o caractere digitado paa isso utiliza [c.
A função getc#(" é $astante similar * função getc#e(" com a diferença de que quando digitamos o
caractere esse não aparecerá na tela do computador, ou se)a, em nosso programa na primeira
c#amada * função printf(" ao digitarmos o caractere dese)ado esse não aparecerá no v%deo, isso
somente ocorrerá na segunda c#amada * função printf(" quando formatamos a sa%da dos dados com
[c e pedimos e,plicitamente a impressão do caractere digitado. +,perimente e,ecutar o mesmo
progrma utilizando a função getc#(" e ve)a a pequena diferença.