Está en la página 1de 41

#include<math.

h>
#include<stdio.h>
#include<stdlib.h>
float max(float x,
float y){
if (x > y)

return
x;
return y;

float mediaHarmPond(float
amostra1,

float peso1,
float amostra2,
float peso2,
float amostra3,
float peso3) {
return (peso1 + peso2
+peso3)/(peso1/max(amostra1,0.0001)+peso2/max(amostra2,0.0001)+peso3/
max(amostra3,0.0001));
}
void main(){
unsigned long int cod;
int i, n=0;
float p1, p2, p3, mh[60], mh_media=0, somatorio=0, s;
FILE *saida;
if ((saida = fopen("l:medias.DAT", "w"))== NULL){ // Cria um
arquivo para escrita

printf("Nao conseguiu criar arquivo de saida.\n");


exit(0);
// Aborta execucao

LinguagemdeProgramaoC

SUMRIO
1

s = sqrt(somatorio/(n-1));

MODIFICADORESDESADA................................................................................................................11
EXERCCIOS.....................................................................................................................................11

TIPOSDEDADOS........................................................................................................................13
4.1
4.2

BIBLIOTECAS.....................................................................................................................................7
ASBIBLIOTECASDISPONVEISEALGUMASFUNESINTERESSANTES.............................................................7

COMANDODEESCRITA...............................................................................................................9
3.1
3.2

VISOGERALDEUMPROGRAMAC........................................................................................................5

ESTRUTURABSICADEUMPROGRAMAEMC............................................................................6
2.1
2.2

CONSTANTES..................................................................................................................................15
CONSTANTESPRDEFINIDAS..............................................................................................................16

VARIVEIS.................................................................................................................................17
5.1 NOMEDEVARIVEIS........................................................................................................................17
5.2 DECLARAODEVARIVEIS...............................................................................................................17
5.2.1
EscopodeVariveis............................................................................................................18
5.3 PALAVRASRESERVADAS.....................................................................................................................20

OPERADORES.............................................................................................................................21
6.1 ATRIBUIO...................................................................................................................................21
6.1.1
ConversodeTiposemAtribuies....................................................................................21
6.2 OPERADORESARITMTICOS...............................................................................................................22
6.2.1
OperadoresAritmticosdeAtribuio...............................................................................23
6.3 OPERADORESRELACIONAISELGICOS.................................................................................................24
6.4 PRECEDNCIADOSOPERADORESARITMTICO,RELACIONAISELGICOS......................................................25
6.5 OPERADORESDEPONTEIROS&E*.....................................................................................................25
6.6 OPERADORVRGULA........................................................................................................................26
6.7 EXPRESSES...................................................................................................................................26
6.7.1
ConversodeTiposemExpresses....................................................................................26
6.7.2
Casts...................................................................................................................................27
6.7.3
EspaamentoeParnteses.................................................................................................28

while(1){

printf("Forneca
o codigo do aluno\n");
scanf("%ld",&cod);
if (cod==0) break; // Sai do laco
printf("Forneca as notas das provas do aluno\n");
scanf("%f %f %f",&p1, &p2, &p3);
if (p1>=0 && p1<=10 && p2>=0 && p2<=10 && p3>=0 && p3<=10){
mh[n] = mediaHarmPond(p1,1,p2,2,p3,3);
mh_media += mh[n];
fprintf(saida,"Codigo: %8ld Prova 1: %2.2f Prova 2: %2.2f
Prova 3: %2.2f Media harmonica ponderada: %2.2f\n", cod, p1, p2, p3,
mh[n]);
n++;
} else
printf("Intervalo de notas invalido\n");
}
mh_media = mh_media/n;
for(i=0;i<n;i++)
somatorio+=(mh[i]-mh_media)*(mh[i]-mh_media);

INTRODUO.............................................................................................................................5
1.1

ALGUMASFUNESDEE/S.......................................................................................................29
7.1 SCANF().........................................................................................................................................29
7.2 LENDOEESCREVENDOCARACTERES.....................................................................................................31
7.2.1
getche()egetch()................................................................................................................31
7.3 EXERCCIOS.....................................................................................................................................32

COMANDOSCONDICIONAIS.......................................................................................................34
8.1
8.2

COMANDOIF..................................................................................................................................34
COMANDOSWITCH..........................................................................................................................35

LinguagemdeProgramaoC

LinguagemdeProgramaoC

8.3
9

EXERCCIOS.....................................................................................................................................36

ESTRUTURADEREPETIO(LAOS)...........................................................................................40
9.1
9.2
9.3
9.4
9.5
9.6

10

LAOFOR.......................................................................................................................................40
LAOWHILE...................................................................................................................................41
LAODOWHILE..............................................................................................................................42
BREAK...........................................................................................................................................43
EXIT()............................................................................................................................................44
EXERCCIOS.....................................................................................................................................44
FUNES...............................................................................................................................50

10.1 LOCALIZAODASFUNES...............................................................................................................51
10.1.1 Corpodafunoantesdoprogramaprincipal(nomesmoarquivo)..................................51
10.1.2 Corpodafunodepoisdoprogramaprincipal(nomesmoarquivo)................................51
10.1.3 Corpodafunoescritoemarquivoseparado...................................................................52
10.2 PROTTIPODEFUNES...................................................................................................................53
10.3 DIRETIVA#DEFINE...........................................................................................................................53
10.4 EXERCCIOS.....................................................................................................................................54
11

VETORESEMATRIZES.............................................................................................................57

11.1
11.2
11.3
11.4
12

INICIALIZAODEVETORESEMATRIZES...............................................................................................57
MATRIZESEVETORESCOMOARGUMENTODEFUNES..........................................................................58
LIMITES.........................................................................................................................................58
EXERCCIOS.....................................................................................................................................59

STRINGS(CADEIADECARACTERES)........................................................................................65

12.1 LEITURADESTRINGS........................................................................................................................65
12.1.1 scanf().................................................................................................................................65
12.1.2 gets()...................................................................................................................................67
12.2 ESCRITADESTRINGS.........................................................................................................................67
12.2.1 printf().................................................................................................................................67
12.2.2 puts()...................................................................................................................................67
12.3 FUNESDEMANIPULAODESTRINGS.............................................................................................68
12.3.1 strlen()................................................................................................................................68
12.3.2 strcat()................................................................................................................................68
12.3.3 strcmp()..............................................................................................................................68
12.3.4 strcpy()................................................................................................................................69
12.4 EXEMPLOGERAL.............................................................................................................................69
12.5 EXERCCIOS.....................................................................................................................................69
13

E/SCOMARQUIVO................................................................................................................76

13.1
13.2
13.3
13.4
13.5
13.6
13.7
13.8
13.9

STREAMS.......................................................................................................................................76
ARQUIVOS......................................................................................................................................76
SISTEMADEARQUIVOS.....................................................................................................................76
ESTRUTURAFILE.............................................................................................................................77
ABERTURADEARQUIVOS..................................................................................................................77
FECHAMENTODEARQUIVO...............................................................................................................78
VERIFICANDOFIMDEARQUIVO...........................................................................................................78
COMANDODEGRAVAOEMMODOTEXTOFORMATADO........................................................................78
STREAMSPADRO...........................................................................................................................79

13.10

EXERCCIOS.................................................................................................................................79

A. TABELAASCII.............................................................................................................................81
14

BIBLIOGRAFIA........................................................................................................................82

LinguagemdeProgramaoC

LinguagemdeProgramaoC

INTRODUO

A linguagem C foi criada por Dennis M. Ritchie e Ken Thompson no Laboratrio Bell em 1972,
baseadanalinguagemBdeThompsonqueeraumaevoluodaantigaBCPL.Elafoiimplementadapela
primeiraveznumcomputadorDECPDP11queusavaosistemaoperacionalUNIX.

ESTRUTURABSICADEUMPROGRAMAEMC

UmprogramaCconsisteemumaouvriasfunes.Aseguirmostradaaestruturaglobaldeum
programaemC.Detalhessobrecadapartedoprogramaserovistosaolongodotexto.
Sintaxe:

AlinguagemCtornousemuitopopulardevidoacaractersticascomo:

<Bibliotecas>
<Declaraes_globais>

Cumalinguagemdealtonvelcomumasintaxebastanteestruturadaeflexveltornandosua
programaobastantesimplificada.

<Tipo_de_dado> <nome_funo1>( <lista_de_parmetros>) {


<Declaraes_locais>
<Seqncia de comandos>
}

ProgramasemCsocompilados,gerandoprogramasexecutveis.
Ccompartilharecursostantodealtoquantodebaixonvel,poispermiteacessoeprogramao
diretadomicroprocessador.Comisto,rotinascujadependnciadotempocrtica,podemser
facilmente implementadas usando instrues em Assembly. Por esta razo, C a linguagem
preferidadosprogramadoresdeaplicativos.

<Tipo_de_dado> <nome_funo2>( <lista_de_parmetros>) {


<Declaraes_locais>
<Seqncia de comandos>
}

C uma linguagem estruturalmente simples e de grande portabilidade. O compilador C gera


cdigosmaisenxutosevelozesdoquemuitasoutraslinguagens.

<Tipo_de_dado> <nome_funoN>( <lista_de_parmetros>) {


<Declaraes_locais>
<Seqncia de comandos>
}

Emboraestruturalmentesimples(poucasfunesintrnsecas),Cnoperdefuncionalidadepois
permite a incluso de uma farta quantidade de rotinas do usurio. Os fabricantes de
compiladoresfornecemumaamplavariedadederotinasprcompiladasembiblioteca.
ComoumaferramentapoderosaalinguagemCusadanaconstruodevriosaplicativoscomo
sistemasoperacionais,planilhaseletrnicas,processadoresdetexto,sistemasdetransmissodedados,
entreoutros.UmexemploclssicoosistemaoperacionalUNIX,oqualfoiimplementadoemC.

Como um programa pode ter mais de umafuno, deve existir um mecanismo quegarantaque
todos os programas inicializem da mesma forma. Este mecanismo pode ser entendido como a
padronizaodafunoqueserchamadaprimeiramente.Talfunochamasemain().
Sintaxe:
int main()
{

Noinciodadcadade80,alinguagemCpadronizadapeloAmericanNationalStandardInstitute:
surgeoANSIC.Atualmente,alinguagemCvemsendousadaparadesenvolvernovaslinguagens,entre
elasalinguagemC++eJava.

1.1

VISOGERALDEUMPROGRAMAC

A gerao do programa executvel a partir do programa fonte obedece a uma seqncia de


operaesantedetornarseumexecutvel.Depoisdeescreverocdigofonte(ouprograma)emum
editor de textos (ou um ambiente de programao integrado), o programador executa o compilador.
Essa ao desencadeia uma seqncia de etapas, cada qual traduzindo a codificao do usurio para
umaformadelinguagemdenvelinferior,queterminacomoexecutvelcriadopelolinkador.
Editor

Figura1.1CodificaodeumprogramaC

return 0;

terminaafuno

Conforme a sintaxe, int seria um tipo de dado do valor que retornado para o sistema
operacional(normalmenteuminteiro,jqueestevalorutilizadopelosistemaoperacionalparasaber
como o programa foi finalizado). A funo main()no possui parmetro neste caso (mas existe a
possibilidadedereceberdadosnachamadadoprograma).Ocomandoreturndevolve0(isto,ocdigo
para dizer que o programa foi executado com sucesso) para quem chamou a funo , neste caso o
sistemaoperacional
}

UmprogramaemCdevepossuirsomenteumanicafunomain()
AbaixorelacionamsealgumasregrasparaaprogramaoemC:

Prprocessador

Compilador

primeirafunoaserexecutada
iniciaocorpodafuno

Linkador

Toda funo C deve ser iniciada e encerrada por um abre chaves e um fecha chaves
respectivamente;
O nome da funo, os parnteses e as chaves so os nicos elementos obrigatrios de uma
funo;
Todasasinstruesdevemestardentrodaschaves;

LinguagemdeProgramaoC

LinguagemdeProgramaoC

AsinstruesCsosempreencerradasporumpontoevrgula;

int abs(int i);


double fabs(double d);

2.1

BIBLIOTECAS

Calculaovalorabsolutodointeiro i edoreal d,respectivamente.


double sin(double arco);

A linguagem C organiza os diferentes conjuntos de funes comuns em bibliotecas padres de


funes.Ento,parafazerusodecertafunodeumadeterminadabiblioteca,oprogramadortemque
informar que biblioteca est utilizando. Apesar de parecer complicado de ter que saber em qual
biblioteca cada comando est definido, normalmente, um programa no utiliza muitas bibliotecas
padresdefinidas(cadabibliotecapossuidiversasfunes).Almdisso,acadafunonova,definese
dabibliotecaondeamesmaestdefinida.

double cos(double arco);


double tan(double arco);
double asin(double arco);
double acos(double arco);
double atan(double arco);

Parafazeristo,usaseumadiretivadecompilaoaqualcolocadaforadequalquerfunodo
programa.Adiretiva#includeinstruiocompiladoraleroutroarquivofonte.

Funestrigonomtricasdongulo arco,emradianos.

double ceil(double num);


double floor(double num);

Sintaxe:

Funesdearredondamentoparainteiro.

ceil()

#include nome_arq

ondenome_arqtemqueestarentreaspasousmbolosdemaioroumenor.Emalgumasplataformas,
somenteumaforma(<>).Paraoutras,aspassignificamparaocompiladorqueabibliotecaemquesto
deveserbuscadaprimeiramentenodiretrioatualedepoisnodiretriopadrodocompiladoroupelas
variveis de ambiente. Tambm, os caracteres <> significam ao compilador que deve procurar
somentenodiretriopadroounosdiretriosdefinidospelasvariveisdeambiente.

Arredondaparacima.Ex.ceil(3.2)3.0;

floor()

Arredondaparabaixo.Ex.floor(3.2)4.0;

double log(double num);


double log10(double num);

Funes logartmicas: log() logaritmo natural (base e), log10() logaritmo


Exemplo2.1
#include <stdio.h>

decimal(base10).
double pow(double base, double exp);

Noseusaopontoevrgulaapsdiretivasdecompilao.Estetipodedeclaraomuitousado
nosprogramasprofissionais.CadacomandoprdefinidoemCestprototipadoemalgumabiblioteca
(istoinformadoconjuntamenteaocomando).

2.2

Potenciao:pow(3.2,5.6) =3.25.6.
double sqrt(double num);

Raizquadrada:sqrt(9.0) = 3.0.

ASBIBLIOTECASDISPONVEISEALGUMASFUNESINTERESSANTES
Bibliotecastdlib.h

A seguir segue uma lista de algumas as bibliotecas disponveis no compilador Turbo C++
Borland: Ao longo do texto veremos o uso de muitas funes cobrindo uma boa parte destas
bibliotecas,pormoleitorquedesejartornarse"fluente"nalinguagemCpode(edeve)estudlascom
profundidade.
alloc.h

assert.h

bcd.h

bios.h

complex.h

conio.h

ctype.h

dir.h

dirent.h

dos.h

errno.h

fcntl.h

float.h

fstream.h

generic.h

graphics.h

io.h

iomanip.h

iostream.h

limits.h

locale.h

malloc.h

math.h

mem.h

process.h

setjmp.h

share.h

signal.h

stdarg.h

stddef.h

stdio.h

stdiostr.h

stdlib.h

stream.h

string.h

strstrea.h

sys\stat.h

sys\timeb.h

sys\types.h

time.h

values.h

Aseguir,algumasfunesdisponveispelasbibliotecasdalinguagemC:

Bibliotecamath.h

int random(int num);

Geraumnmerointeiroaleatrioentre 0 e num - 1.

LinguagemdeProgramaoC

10

LinguagemdeProgramaoC

COMANDODEESCRITA

Afunoprintf()umadasfunesdeE/S(entradaesada)quemostranatelaosparmetros
quesopassadoscomoargumento.Seuprottipoestnabibliotecastdio.h.
Sintaxe:

printf(<expressao_de_controle>,lista_de_argumentos)

%o

Octal

%s

CadeiadeCaracteres

%u

InteirodecimalsemSinal

%xou%X

Hexadecimal(caracteresemmnsculoemaisculo,respectivamente)

%p

Ponteiro(endereo)

%n

Ponteirointeiro.

%%

Escreveosmbolo%

onde:
expresso_de_controle = contm caracteres que sero exibidos na tela e cdigos de
formatao que indicam o formato em que os argumentos (da
lista_de_argumentos)devemserimpressos.
lista_de_argumentos=listadeargumentosqueseroapresentadasnaexpresso_de_controle.
Tal lista no tem tamanho mximo e cada argumento deve ser
separadoporumavrgula.

A Tabela 3.1 mostra os cdigos na linguagem para caracteres que no podem ser inseridos
diretamentedoteclado.
Tabela3.1Cdigoparaoscaracteresespeciais

CDIGO
\n

SIGNIFICADO
NovaLinha(LF)

\t

Tabulao(HT)

\b

Retrocesso(BS)

\\

Barrainvertida

\f

SaltaPginadeFormulrio(FF)

\r

RetornodeCarro(CR)

\v

TabulaoVertical

\a

Alerta(beep)

\N

Constanteoctal(ondeNumaconstanteoctal)

\xN

ConstanteHexadecimal(ondeNumaconstantehexadecimal)

\0

Nulo

Almdestes,existemoscdigosparaformataodeimpressodosargumentospassadospara
afuno,osquaisestrelacionadosnaTabela3.2.
Tabela3.2Cdigosparaformataodeimpresso

Cdigo

Significado

%c

CaractereSimples

%dou%i

Inteirodecimalcomsinal

%eou%E

NotaoCientfica(comeminsculooumaisculo,respectivamente)

%f

PontoFlutuante

%gou%G %eou%f(omaiscurto,respectivamente)

O uso incorreto do cdigo de formatao produz, em geral, uma sada


incorreta. Por exemplo, o comando printf(%f,x), onde a varivel x
declaradacomointx=4,produzasada0eno4comoesperavase,pois
oprintfprocuraporumavarivelrealenointeira.
Exemplo3.1
#include <stdio.h>
int main() {
printf(A %s C foi criada em %d \nOk?, Linguagem, 1972);
return 0;
}

Execuo:
A Linguagem C foi criada em 1972
Ok?

NoExemplo3.1percebeseousodedoistiposdecdigos:primeirodeformataocom%s(paraum
literal string) representando a constante Linguagem e %d (inteiro decimal) representando a
constanteano1972;segundoumcdigoespecialpararepresentarcaracteredenovalinha\n.
Exemplo3.2
#include <stdio.h>
int main() {
printf(A %s %c foi, Linguagem, C);
printf( criada em %d , 1972);
return 0;
}

Execuo:
A Linguagem C foi criada em 1972

NoExemplo3.2,notasequeCdelimitadoporaspassimplesenquantoqueLinguagem
delimitadoporaspasduplas.Istoindicaaocompiladorcomodiferenciarumcaracteredeumacadeiade
caracteres.

Oespecificadordeformato%nfazcomqueoprintf()armazenenavarivelapontadaporseu
argumentocorrespondentecomumvalorigualaonmerodecaracteresquejforamescritos.
Exemplo3.3
#include <stdio.h>
int main() {
int cont;
printf(caracteres%n escritos\n, &cont);
printf(%d\n, cont);
return 0;

11

LinguagemdeProgramaoC

12

Camisa lisa

Execuo:
Caracteres escritos
10

Estetipodeformatocomumenteutilizadoparaformataodinmicadesadadedados.

Oespecificadordeformato%putilizadoparamostrarumendereodememriadeacordo
comoformatodeendereamentodamquina.
Exemplo3.4
#include <stdio.h>
int main() {
int cont;
printf("A varivel cont est armazenada no endereo: %p\n", &cont);
return 0;
}

Execuo:
A varivel cont est armazenada no endereo: 0012FF5C

3.1

MODIFICADORESDESADA

ParacomplementaroscdigosdeformataoalinguagemCoferecealgunscdigosespeciais
paramelhoraraapresentaodosdados.Paraistorelacionamse:
:alinhamentopelaesquerda.
+:colocaosinaldemenosoumaisseovalorfornumrico.
n(nmero):indicaotamanhomnimodocampo.Opreenchimentofeitocomespaosem
branco.Seotamanhoiniciarcom0(ex.05),opreenchimentopassaaserfeitocomzeros.
.m:tamanhomximodocampo,menosparaosreaisondeusadoparaindicaronmero
decasasdecimais.
*:substituiumdosn,masoseuvaloroprximoparmetro.
l:indicaquesegueumdadolongo.
Exemplo3.3
COMANDO
printf(%s %d, Numero,10);
printf(%8s %4d, Numero,10);
printf(%-8s %4d, Numero,10);
printf(%-3.5s %2.2f,Numero,10.99);
printf(Long %ld, 57485784);

TELA
Numero 10
##Numero ##10
Numero## ##10
Numer 10.99
Long 57485784

onde:

#representa1espaoembranco.

3.2

LinguagemdeProgramaoC

EXERCCIOS

1. Escrevaoscomandosdesadaformatadaquegeremasseguintessadas:
01234567890123456789012
a) Camisa estampada

40,00

35,00

b) Camisa estampada
Camisa lisa

40,00
35,00

c) Camisa estampada
Camisa lisa

00040,00
00035,00

d) Camisa e
Camisa l

40
35

2. Corrijaoseguinteprograma:
#include <stdio.h>
int main{ }(
printf(A Linguagem C foi criada em %d\n, 1972)
return1;
)

13

LinguagemdeProgramaoC

14

LinguagemdeProgramaoC

TIPOSDEDADOS

EmCexistem5tiposdevariveisbsicas.NoscomputadoresdalinhaIBMPC(plataforma32
bits), a Tabela 4.1 vlida. Este tipos de dados definem a quantidade de memria que ocupa e o
intervalordevaloresqueconseguerepresentar.
Tabela4.1Tiposdedadosbsicosparaplataformas32bits

Bits

FaixaMnima

char

128a127

int

32

2,147,483,648a2,147,483,647

float

32

3.4E38a3.4E+38

double

64

1.7E308a1.7E+308

void

semvalor

Ponto
Flutuante

Tipo

Os tipos char e int armazenam nmeros inteiros, enquanto que os tipos


floateDoublearmazenamnmerosdepontoflutuante(umformatode
representaodigitaldenmerosreais).
Comexceodevoid,ostiposdedadosbsicospodemestaracompanhadospormodificadoresna
declaraodevariveis.OsmodificadoresdetiposdalinguagemCso:

Oespecificadordeformatolongpodeseraindautilizadoparatipoponto
flutuante (indicando que segue um double): %le, %l E, %lf, %lg, e %lG.
OutroespecificadodeformatooL,oqualutilizadoparaassociarum
longdouble:%Le,%LE,%Lf,%Lg,e%LG.
A Tabela 4.2 mostra todas a combinaes de tipos de dados e as informaes sobre tamanho,
formataoeintervalo.
Tabela4.2Utilizaodostiposdedados(plataforma32bits)

Inteiros

32.767

32.768

32.767

unsignedshortint

16

%hu

65.535

int

32

%i

2.147.483.648

2.147.483.647

signedint

32

%i

2.147.483.648

2.147.483.647

unsignedint

32

%u

4.294.967.295

longint

32

%li

2.147.483.648

2.147.483.647

signedlongint

32

%li

2.147.483.648

2.147.483.647

unsignedlongint

32

%lu

4.294.967.295

float

32

%f

3,4E38

3.4E+38

double

64

%lf

1,7E308

1,7E+308

longdouble

80

%Lf

3,4E4932

3,4E+4932

Execuo:
Comprei 2 camisas de tamanho G.
No total, paguei R$ 20.70.

As variveis podem ser inicializadas no momento em que se faz a declarao das mesmas.
Podeseveristousandooprogramaanterior,queaexecuoseramesmadaversoanterior.

Bits

Formatao
printf()

Inicio

Fim

char

%c

128

127

unsignedchar

%c

255

signedchar

%c

128

127

32.768

%hi

Exemplo4.1
#include <stdio.h>
int main() {
int qtde;
char tam;
float total;
qtde = 2; tam = G;
total = 20.70;
printf(Comprei %d camisas de tamanho %c., qtde, tam);
printf(\nNo total, paguei R$ %f., custo);
return 0;
}

Afunoprintf()possuiespecificadoresdeformatoquepermitemmostrar
inteiros short e long. O %ld,%li,%lo,%lu,%lxespecificamqueotipode
dadolong.O%hd,%hi,%ho,%hu,%hxespecificamqueotipodedado
short.

Tipo

%hi

16

O tamanho, e conseqentemente o intervalo de valores, pode variar de


plataforma para plataforma. Por exemplo, o long double em algumas
plataformas possui 10 bytes de tamanho. O char j um tipo que no
variadeplataforma.

Osmodificadoressigned,short,longeunsignedpodemseraplicadosaostiposbsicoschareint.
Contudo,longtambmpodeseraplicadoadouble.

16

signedshortint

Ousodesignedcominteirosredundante.Noentanto,elepermitidoporqueadeclarao
defaultdeinteirosassumeumnmerocomsinal.Ousomaisimportantedesignedmodificarcharem
implementaesemqueessetipo,porpadro,notemsinal.Algumasimplementaespodempermitir
queunsignedsejaaplicadoaostiposdepontoflutuante(comoemunsigneddouble).Porm,issoreduz
aportabilidadedeseucdigoegeralmentenorecomendado.Omodificadorunsignedalteraovalor
dafaixamnimadotipoatravsdousodobitmaissignificativo(indicadordesinal).

unsigned;
short.

signed;
long;

shortint

Intervalo

Exemplo4.2
#include <stdio.h>
int main() {
int qtde=2;
char tam=G;
float total=20.70;

15

LinguagemdeProgramaoC

16

LinguagemdeProgramaoC

printf(Comprei %d camisas de tamanho %c., qtde, tam);


printf(\nNo total, paguei R$ %f., custo);
return 0;

tipos inteiros, o sufixo U representa unsigned e o L representa long. A tabela 5.3 mostra alguns
exemplosdeconstantes.

Tabela4.3Exemplodeconstantes

Devido s diferenas de tipos em diferentes mquinas e plataformas,


podese utilizar a funo sizeof() para descobrir o tamanho real da
variveloutipo.
Exemplo4.3
#include <stdio.h>
int main() {
printf("Tipo\t\tTamanho\n");
printf("char\t\t%d\n",sizeof(char));
printf("int\t\t%d\n",sizeof(int));
printf("float\t\t%d\n",sizeof(float));
printf("double\t\t%d\n",sizeof(double));
printf("long int\t%d\n",sizeof(long int));
return 0;
}

Execuo:
Tipo
char
int
float
double
long int

4.1

Tamanho
1
4
4
8
4

CONSTANTES

Uma constante tem valor fixo e inaltervel durante a execuo do programa. Isto pode ser
exemplificadopeloExemplo3.1eExemplo3.2dafunoprintf()epeloExemplo4.4.
Exemplo4.4

C
programa
8
465.67

Umaconstantecaractereescritaentreaspassimples()enquantoqueumaconstanteliteral
entreaspasduplas()econstantesnumricascomoonmeropropriamentedito.
AsconstantesAeAsodiferentespoisaprimeiraumcaractereea
segunda um literal. Apesar do contedo ser o mesmo a linguagem C
representaasduasconstantesdemaneiradiferente.

ConstantesemCpodemserdequalquerumdoscincotiposdedadosbsicos.Amaneiracomo
cada constante representada depende do seu tipo. Podese especificar precisamente o tipo da
constantenumrica atravsdautilizaodeumsufixo. Para tipos empontoflutuantecolocaseumF
apsonmero,elesertratadocomofloat.SeforcolocadoumL,eletornarseumlongdouble.Para

TipodeDado

ExemplodeConstantes

int

112321000234

longint

35000L34L

shortint

101290

unsignedint

10000U987U40000

float

123.23F2.34e3F

double

123.23123123330.9876324

longdouble

1001.2L

Alm destas existem as constantes Hexadecimais e Octais. Usamse tais sistemas numricos
para facilitar a programao. Uma constante hexadecimal deve consistir em um 0x seguido por uma
constantenaformahexadecimal.Umaconstanteoctalcomeacom0.
Exemplo4.5
int hex = 0x80;
int oct = 012;

4.2

/* 128 em decimal */
/* 10 em decimal */

CONSTANTESPRDEFINIDAS

Em alguns compiladores C, algumas constantes simblicas j esto prdefinidas. Estas


constantesemgeraldefinamalgunsvaloresmatemticos(,/2,e,etc.),limitesdetiposetc.Aseguir
segue uma tabela contendo algumas (existem muitas outras) constantes simblicas prdefinidas no
compiladorTurboC++daBorland.
Biblioteca

Constante

Valor

Significado

math.h

M_PI

3.14159...

math.h

M_PI_2

1.57079...

/2

math.h

M_PI_4

0,78539...

/4

math.h

M_1_PI

0,31830...

1/

math.h

M_SQRT2

1,41421...

conio.h

BLACK

valor da cor (preto)

conio.h

BLUE

valor da cor (azul)

conio.h

GREEN

valor da cor (verde)

conio.h

CYAN

valor da cor (cyan)

conio.h

RED

valor da cor (vermelho)

conio.h

MAGENTA

valor da cor (magenta)

limits.h

INT_MAX

2.147.483.647

limite superior do tipo int

limits.h

INT_MIN

-2.147.483.648

limite inferior do tipo int

17

LinguagemdeProgramaoC

18

LinguagemdeProgramaoC

Seexistirmaisdeumavariveldomesmotipo,podesedeclarladeumavezseparandoseus
nomesporvrgulas.

VARIVEIS

Varivel em C um espao de memria reservado para armazenar um certo tipo de dado e


tendo um nome para referenciar o seu contedo. O contedo da mesma pode variar segundo os
comandosdealteraodoprograma.

int ano, mes, dia;

5.2.1 ESCOPODEVARIVEIS

Exemplo5.1
#include <stdio.h>
int main() {
int ano;
ano = 1972;
printf(A Linguagem C foi criada em %d , ano);
return 0;
}

O escopo de uma varivel define onde a mesma pode ser referenciada. O escopo de uma
varivel est relacionado posio onde ela declarada. Existem trs lugares bsicos: dentro de
funes,nadefiniodosparmetrosdasfuneseforadetodasasfunes.Estassovariveislocais,
parmetrosformaisevariveisglobais,respectivamente.

Variveisquesodeclaradasforadequalquerfuno.Taisvariveissoreconhecidas(isto,
podemseralteradasoureferenciadas)peloprogramainteiroepodemserusadasporqualquerpedao
decdigo.

Aprimeirainstruo,
int ano;

umexemplodedeclaraodevarivel,isto,apresentaumtipo,int,eumnome,ano.

5.2.1.1 VARIVEISGLOBAIS

Exemplo5.3
#include <stdio.h>

Asegundainstruo,

int num=10;

ano = 1972;

int main() {
printf(%d, num * num);
return 0;
}

atribuiumvalorvariveleestevalorseracessadoatravsdeseunome.Pararealizaristofoiusadoo
operadordeatribuio(=).

5.1

NOMEDEVARIVEIS

Aseguirlistamosalgumasregrasparanomesdevariveis:

Exemplo5.4
#include <stdio.h>

UmavarivelnopodeteromesmonomedeumapalavrachavedeC.
Letrasmaisculasdiferemdasletrasminsculas.
Onmerodecaracteresvlidosdefinidodeambienteparaambiente.
Todo identificador deve iniciar com letra (maiscula ou minscula) e ser
compostoexclusivamenteporletras,dgitoseunderscore(isto,_).
Exemplo5.2
char x;
int x2r;
float #ertt;
float main;
float total da venda;
float total_da_venda;

5.2

/*
/*
/*
/*
/*
/*

Vlida
*/
Vlida
*/
Invlida */
Invlida */
Invlida */
Vlida */

DECLARAODEVARIVEIS

A declarao de variveis serve para reservar uma quantidade de memria apropriada para
armazenar o tipo especificado. Tal declarao consiste no nome de um tipo, seguido do nome da
varivel.EmCtodasasvariveisdevemserdeclaradas.

OExemplo5.4mostraquequalquerfunodoprogramapodemanipularumavarivelglobal.

int num=2;
int media(int y, int x) {
return ((x+z)/num);
}
int main() {
int x1 = 15;
int x2 = 4;
printf(%d
%d , num * num, media(x1,x2));
return 0;
}

Devese ressalvar que um mesmo programa em C pode conter n variveis com o mesmo
identificador,desdequeapenasumadelassejaglobaleasdemaisn1sejamdeclaradaslocalmenteem
n1funes.Sehouverduasvariveiscomomesmoidentificadorx,umaglobaleoutralocalfunoX,
asrefernciasvarivelxdentrodeXcorrespondemarefernciasvarivellocaleasrefernciasfora
deXcorrespondemvarivelglobal.

Em algumas situaes, variveis globais so teis para passar informaes entre funes ou
entreoalgoritmoprincipaleasfunes,massuautilizaodeveserfeitacomparcimnia,poisseuuso
indiscriminado pode ser fonte de erros difceis deserem identificados. O Exemplo 5.5 ilustra um erro
tpicodecorrentedousoincorretodevariveisglobais.

19

LinguagemdeProgramaoC

20

LinguagemdeProgramaoC

Exemplo5.5
#include<stdio.h>

Variveisquesodeclaradasdentrodeumafuno.Taisvariveisspodemserreferenciadas
por comandos que esto dentro do bloco no qual as variveis foram declaradas, isto , no so
reconhecidasforadeseuprprioblocodecdigo(nemmesmonafunomain()).

int i;
// Funo que escreve seqncias decrescentes de nmeros:
void escNa1(int n) {
for (i=n; i>0; i--)
printf("%i ",i);
}
int main() {
for (i=1; i<=5; i++) {
escNa1(i);
printf("\n");
}
}

Nesseexemplo,afunoescNa1()recebeumvalorneescreveosnmerosdena1.Afuno
main(), por sua vez, utiliza escNa1() para escrever, em ordem decrescente, o nmero 1, seguido das
seqnciasde2a1,3a1,4a1e,finalmente,5a1.Afunoestaparentementecorreta.Avariveli
umavarivelglobalmodificadatantonolaodafunoescNa1()quantodafunomain().Esperarse
iaqueaexecuodoprogramagerasseasseguintesseqncias:
1
2
3
4
5

1
2 1
3 2 1
4 3 2 1

Aoexecutarseoprograma,entretanto,obtidooseguinteresultado:
1
1
1
1
1
1
1
1
...

Aexplicaoparaessecomportamentoqueavarivelirecebe1nafunomain()esubstitui
oargumentondachamadaescNa1().EmescNa1(),eladecrementada,passandoaser0.Naprxima
iteraodofordemain(),elaincrementada(voltandoaser1)esubstituioargumentondachamada
escNa1().Esseprocessorepeteseindefinidamente.

Na medida do possvel, devese evitar o uso de variveis globais, priorizando o uso de


argumentosquandofornecessriopassarourecebervaloresdefunes.Outrarazoparaonousode
variveisglobaisfacilitarareutilizaodefunesentrediferentesprogramas.Seumafunoutiliza
uma varivel global, ao portar essa funo para outro programa ser necessrio portar, tambm, as
variveis globais que ela referencia, tornando mais difcil a reutilizao dessa funo em outros
algoritmos.

5.2.1.2 VARIVEISLOCAIS

Exemplo5.6
#include <stdio.h>
int main() {
int num;
num = 10;
return 0;
}
Como a linguagem C permite somente a declarao de variveis logo aps a
abertura de abre-chaves, alguns programadores abrem chaves no meio do programa
apenas para declara uma nova varivel.
Exemplo5.7
#include <stdio.h>
int main() {
int num;
num = 10;
/* At este ponto somente a varivel num existe */
{
int x= 10; /* A partir deste ponto as variveis x e num existem */
num = x + 2;
}
/* A partir deste ponto somente a varivel num existe */
return 0;
}

5.2.1.3 PARMETROSFORMAIS

Variveisquesodeclaradasparapassagemdeparmetrosemfunes.

Exemplo5.8
int soma(int x, int y) {
return (x+y);
}

5.3

PALAVRASRESERVADAS

Existem certos nomes que no podem ser usados como identificadores. So chamadas as
palavras reservadas e so de uso restrito da linguagem C (comandos, estruturas, declaraes, etc.).
AlgumaspalavrasreservadasemCso:
asm

auto

break

case

cdecl

char

class

const

continue

_cs

default

delete

do

double

_ds

else

enum

_es

extern

_export

far

_fastcall

float

for

friend

goto

huge

if

inline

int

interrupt

_loadds

long

near

new

operator

pascal

private

protected

public

register

return

_saveregs

_seg

short

signed

sizeof

_ss

static

struct

switch

template

this

typedef

union

unsigned

virtual

void

volatile

while

21

LinguagemdeProgramaoC

22

LinguagemdeProgramaoC

Tabela6.1Conversesdetiposeseusefeitos

OPERADORES

A linguagem C muito rica em operadores internos. C define quatro classes de operadores:


aritmticos,relacionais,lgicosebitabit.Almdisso,Ctemalgunsoperadoresespeciaisparatarefas
particulares.

6.1

ATRIBUIO

Para o operador de atribuio utilizado o smbolo =. Lembrese que as atribuies so


executadasdadireitaparaesquerda.
Exemplo6.1
x = 10;
y = x;

Alm disto, a linguagem oferece um tipo de atribuio mltipla, isto , em um comando s podese
atribuiromesmovaloramuitasvariveis.
Exemplo6.2
a = b = c = 10;

TipoDestino

TipodaExpresso

PossvelInformaoPerdida

signedchar

char

Sevalor>127,odestinonegativo

char

shortint

Os8bitsmaissignificativos

char

int

Os24bitsmaissignificativos

char

longint

Os24bitsmaissignificativos

int

float

Apartefracionriaepossivelmentemais

float

double

Preciso,oresultadoarredondado

ParautilizaraTabela6.1afimdefazerumaconversonomostrada,simplesmenteconverta
umtipoporvezatacabar.Porexemplo,paraconverterdoubleemint,primeiroconvertadoubleem
floate,ento,floatemint.

6.2

OPERADORESARITMTICOS
ATabela6.2mostraosoperadoresaritmticossuportadospelalinguagem.
Tabela6.2Operadoresaritmticos

/* a, b, c tero o valor 10

6.1.1 CONVERSODETIPOSEMATRIBUIES

A linguagem C permitea converso automtica de tipos, o que no acontece em Pascal, por


exemplo. Converso de tipos referese situao em que variveis de um tipo so misturadas com
varveisdeoutrotipo.Emumcomandodeatribuio,aregradeconversodetiposmuitosimples:o
valor do lado direito (lado da expresso) de uma atribuio convertido no tipo do lado esquerdo
(variveldestino),comonoExemplo6.3:
Exemplo6.3
#include <stdio.h>
int main() {
int x;
char ch;
float f;
ch = x;
// Linha
x = f;
// Linha
f = ch;
// Linha
f = x;
// Linha
return 0;
}

Operador

Ao

Subtrao,tambmmenosunrio

Adio

Multiplicao

Diviso

MdulodaDiviso(resto)

Decremento

++

Incremento

Omenosunriomultiplicaseunicooperandopor1.Isso,qualquernmeroprecedidopor
umsinal

1
2
3
4

Nalinha1,osbitsmaissignificativosdavarivelinteiraxsoignorados,deixandochcomos8
bitsmenossignificativos.Sexestentre255e0,entochextmvaloresidnticos.Deoutraforma,o
valordechrefleteapenasosbitsmenossignificativosdex.Nalinha2,xrecebeaparteinteiradef.Na
linha3,fconverteovalorinteirode8bitsarmazenadoemchnomesmovaloremformatodeponto
flutuante. Isso tambm acontece na linha 4, exceto por f converter um valor inteiro de 16 bits no
formatodepontoflutuante.

A Tabela 6.1 mostra algumas converses de tipos e seus efeitos. Para essas converses foi
assumidoumapalavrade32bits.

O operador/ executaumadiviso inteiraquandoambososoperandos


sodotipointeiro.
Exemplo6.4
int op1=20, op2=3;
float op3=20, op4=3;
printf("%i\n",op1/op2);
printf("%f\n",op1/op4);
printf("%f\n",op3/op2);
printf("%f\n",op3/op4);

/*
/*
/*
/*

Imprime
Imprime
Imprime
Imprime

6 */
6.666667 */
6.666667 */
6.666667 */

O operador% devolve o resto deumadivisointeira. Por isso,osdois


operandos envolvidos devem ser do tipo inteiro e o segundo operando
nopodeser0(zero).
Exemplo6.5
int op1=20, op2=3;

23

LinguagemdeProgramaoC

24

float op3=20, op4=3;


printf("%i\n",op1%op2);
printf("%i\n",op2%op1);
printf("%i\n",op1%op4);
printf("%i\n",op2%0);
printf("%i\n",op3%0);

/*
/*
/*
/*
/*

Imprime
Imprime
Erro de
Erro de
Erro de

Exemplo6.7
x *=
x /=
x %=
x -=

2 */
3 */
compilao */
execuo: diviso por zero */
compilao */

AlinguagemCincluidoisoperadoresquegeralmentenoencontramosemoutraslinguagens.
So os operadores de incremento (++) e decremento (), os quais somam 1 ao seu operando, e
subtraem1deseuoperando,respectivamente.

Quando usados em uma expresso tem seus efeitos alterados pela posio do sinal de
decremento e incremento. Se o operador de incremento ou decremento preceder seu operando, C
executaaoperaodeincrementooudecrementoantesdeusarovalordooperando.Seooperador
estiverapsseuoperando,Cusaovalordooperandoantesdeincrementlooudecrementlo.
Exemplo6.6
x = 10;
y = ++x;

x = 10;
y = x++;

/*y recebe 11*/

/*

recebe

10

a
a
a
a

x
x
x
x

=
=
=
=

x
x
x
x

*
/
%
-

2
(y + 5)
(2 + y)
y

OPERADORESRELACIONAISELGICOS
ATabela6.4mostraosoperadoresrelacionaiselgicossuportadospelalinguagemC.

Operador

Ao

Operador

Ao

>

Maiorque

&&

E(AND)

>=

Maiorouigualque

||

OU(OR)

<

Menorque

NO(NOT)

<=

Menorouigualque

==

Igual

!=

Diferente

EmC,verdadeiroqualquervalordiferentedezero,efalsozero.Asexpressesqueusam
operadoresrelacionaisoulgicosdevolvemzeroparafalsoe1paraverdadeiro.
Todaexpressorelacionalelgicaproduzcomoresultado0ou1.

Maisalta

equivale
equivale
equivale
equivale

*/

Aprecednciadosoperadoresaritmticos(qualoperadordeverserexecutadoprimeiro)a
seguinte:
++

(menosunrio)
*
/
%
+

6.3

2
y + 5
2 + y
y

Tabela6.4Operadoresrelacionaiselgicos

x++;ou++x;oux=x+1;
x;oux;oux=x1;

Exemplo6.8
#include <stdio.h>

Maisbaixa

Os operadores do mesmo nvel de precedncia so avaliados pelo compilador da esquerda para a


direita.

6.2.1 OPERADORESARITMTICOSDEATRIBUIO

LinguagemdeProgramaoC

ATabela6.3mostraosoperadoresaritmticosdeatribuiosuportadospelalinguagem.
Tabela6.3Operadoresaritmticosdeatribuio

Operador

Ao

x=y

x=xy

x+=y

x=x+y

x*=y

x=x*y

x/=y

x=x/y

x%=y

x=x%y

int main() {
char varLogica;
varLogica
printf("A
varLogica
printf("A
varLogica
printf("A
varLogica
printf("A
varLogica
printf("A
varLogica
printf("A
varLogica
printf("A
return 0;
}

= 10 == 20;
expresso anterior
= 10 < 20;
expresso anterior
= 10 != 20;
expresso anterior
= 10 != 20 && 3 ==
expresso anterior
= 10 == 20 || 3 ==
expresso anterior
= 10 == 20 && 3 ==
expresso anterior
= !(10 == 20) && 3
expresso anterior

Execuo:

Asexpressescomesteoperadoressomaiscompactasenormalmenteproduzemumcdigo
demquinamaiseficiente.
Aexecuodaoperaoaritmticaocorreporltimoapsaavaliaoda
expressodireitadosinaligual.

A
A
A
A
A
A
A

expresso
expresso
expresso
expresso
expresso
expresso
expresso

anterior
anterior
anterior
anterior
anterior
anterior
anterior

0
1
1
1
1
0
1

%i\n",varLogica);
%i\n",varLogica);
%i\n",varLogica);
3;
%i\n",varLogica);
3;
%i\n",varLogica);
3;
%i\n",varLogica);
== 3;
%i\n",varLogica);

25

LinguagemdeProgramaoC

26

6.4

LinguagemdeProgramaoC

Aprecednciadosoperadoresrelacionaiselgicosaseguinte:

2. &3constantesnosovlidas;

!
>
==
&&
||

3. variveis declaradas com classe de armazenamento register (no existe endereo para
registrador).

>=
!=

<

<=

Maisalta

Maisbaixa

Osegundooperador*.Eleumoperadorunrioquedevolveovalordavarivellocalizada
noendereoqueosegue.Porexemplo,semcontmoendereodavarivelcont,
q = *m;

PRECEDNCIADOSOPERADORESARITMTICO,RELACIONAISELGICOS

A Tabela 6.5 mostra a precedncia dos operadores aritmticos, relacionais e lgicos da


linguagemC.
Tabela6.5:Precednciadosoperadoresaritmticos,relacionaiselgicos

Precedncia
1
2
3
4
5
6
7
8
9

Operador
()
(menosunrio)++!(NO)
*/%
+
<<=>>=
==!=
&&
||
=*=/=%=+==

colocaovalordecontemq.Esteoperadormuitoutilizadoemmanipulaodeposiesdememriae
duranteapassagemdeparmetrosemfunes.

Osseguintesoperadores*e&colocamovalor10navarivelchamadatarget.Oresultado(o
valor10)desteprogramamostradonatela.
Exemplo6.9
#include <stdio.h>
int main() {
int target, source;
int *m;
source = 10;
m = &source;
target = *m;
printf(%d,target);
return 0;
}

6.6
Todooperadoraritmticocomoperandosnumricosproduzumresultado
numrico.
Todooperadorrelacionalcomoperandosnumricosproduzumresultado
lgico.
Todooperadorlgicocomoperandoslgicoproduzumresultadolgico.

6.5

OPERADORESDEPONTEIROS&E*

Um ponteiro um endereo na memria de uma varivel. Uma varivel de ponteiro uma


varivelespecialmentedeclaradaparaguardarumponteiroparaseutipoespecificado.

O primeiro operador de ponteiro &. Ele um operador unrio que devolve o endereo na
memriadeseuoperando.Porexemplo,
m = &cont;
atribui o endereo de memria da varivel cont em m. Este operador muito utilizado na leitura de
variveis.

Estetipodeoperandonopodeserutilizadoemtrscasos:
1. &(cont+4)sempreassociaseaumavarivelenoexpresso;

OPERADORVRGULA

O operador vrgula usado para encadear diversas expresses. O lado esquerdo de um


operadorvrgulasempreavaliadocomovoid.Issosignificaqueaexpressodoladodireitosetornao
valordetodaaexpressoseparadaporvrgulas.
Exemplo6.10
x = (y = 3, y + 1);

6.7

NoExemplo6.10,primeiroyrecebe3e,emseguida,atribuiovalor4ax.

EXPRESSES

Operadores, constantes e variveis so os elementos que constituem as expresses. Uma


expressoemqualquercombinaovlidadesseselementos.

6.7.1 CONVERSODETIPOSEMEXPRESSES

Quandoconstantesevariveisdetiposdiferentessomisturadasemumaexpresso,elasso
convertidasaummesmotipo.OcompiladorCconvertetodososoperandosnotipodomaioroperando,
oquedenominadopromoodetipo.Issofeitooperaoporoperao,comodescritonasregrasde
conversodetiposabaixo.
SEumoperandolongdouble

27

LinguagemdeProgramaoC

28

LinguagemdeProgramaoC

int op1=20, op2=3;


float op3=20;
printf("%f\n",(float)op1/op2);
printf("%i\n",(int)op3/op2);
printf("%i\n",(int)op3%op2);
printf("%f=%f\n",20.0/3, (float)20/3);

ENTOosegundoconvertidoparalongdouble.
SENO,SEumoperandodouble
ENTOosegundoconvertidoparadouble.
SENO,SEumoperandofloat
ENTOosegundoconvertidoparafloat.
SENO,SEumoperandounsignedlong
ENTOosegundoconvertidoparaunsignedlong.
SENO,SEumoperandolong
ENTOosegundoconvertidoparalong.
SENO,SEumoperandounsigned
ENTOosegundoconvertidoparaunsigned.

/*
/*
/*
/*

Imprime
Imprime
Imprime
Imprime

6.666667 */
6 */
2 */
6.666667 */

Como um operador, um cast unrio e tem a mesma precedncia de


qualqueroutrooperadorunrio.

6.7.3 ESPAAMENTOEPARNTESES

Haindaumcasoadicionalespecial:seumoperandolongeooutrounsigned,eseovalor
dounsignednopodeserrepresentadoporumlong,osdoisoperandossoconvertidosparaunsigned
long.

A linguagem C no limita o espaamento ou tabulaes em uma expresso. Ajudam a


aumentar a legibilidade do programa. O excesso de parnteses no causa erros, isto , colocar
parntesesondenonecessita,noprovocaerros,masdificultaaleituradoprograma.

ConsidereasconversesdetipoqueocorremnoExemplo6.11.

Exemplo6.11
char ch;
int i;
float f;
double d;
result= ( ch / i )

( f * d )

int

double

( f + i );
float

double
double

Primeiro,ocaracterechconvertidoparauminteiroefloatfconvertidoparadouble.Emseguida,o
resultado de ch/i convertido para double porque f*d double. O resultado final double porque,
nessemomento,osdoisoperandossodouble.

6.7.2 CASTS

A linguagem permite que uma expresso pode ser forada a ser de um tipo especificado
usandoumaconstruochamadacast.Aformageraldeumcast

(tipo)expresso

ondeumtipoumtipodedadopadrodeC.Porexemplo,paratercertezadequeaexpressox/2
serdotipofloat,escrevese
(float) x/2;

Nestecasoseavarivelxfosseuminteiromparsemocastseuvalorreriauminteiro(oque
no seria verdadeiro). Entretanto, com o uso do Cast oa varivel x definida como um float o que
tornaroseuresultadoumfloat.
Exemplo6.12

29

LinguagemdeProgramaoC

30

LinguagemdeProgramaoC

Quandoafunoscanf()forutilizadaparalercaracteres(isto,utilizaro
%c),deveseadicionaralinhadecomandoflush(stdin);apsalinhada
funo scanf(). Esta funo limpa o bufer do teclado j que o %c
consideraoENTERcomoumnovocaracter.

ALGUMASFUNESDEE/S

Nestecaptuloservistoalgumasfunescomoscanf(),getchar()eputchar().Taisfunes
encontramsenoarquivostdio.h.

7.1

O caractere * colocado aps o % avisa funo que deve ser lido um valordo tipo indicado
pelaespecificao,masnodeveseratribudoanenhumavarivel(nodeveterparmetrosnalistade
argumentosparaestasespecificaes).

SCANF()

Estafunoserveparalerdadosformatadosdaentradapadro(teclado).Suasintaxesimilar
de printf(), isto , uma expresso de controles seguida por uma lista de argumentos separados por
vrgulas.Aprincipaldiferenaqueosargumentosdescanf()devemserendereosdevariveis.Para
enviaroendereodecadaargumentoutilizaseooperador&.
Sintaxe:
scanf(expresso_de_controle, lista_de_argumentos)

A expresso de controle pode conter cdigos de formatao (mostrados na Tabela 7.1),


precedidosporumsinal%,caracteresdeespaoembrancoecaracteresdeespaonobranco.
Tabela7.1Cdigosdeformataodocomandoscanf()

Cdigo

Significado

%c

Lumnicocaracteresimples

%dou%i

Luminteirodecimal

%e

Lumnmeroemnotaocientfica

%f

Lumnmeroempontoflutuante

%g

Lumnmeroempontoflutuante

%o

Lumnmeroemoctal

%s

Lumacadeiadecaracteres

%u

Luminteirodecimalsemsinal

%x

Lumhexadecimal

%ld

Luminteirolongo

%lf

Lumpontoflutuantelongo

%Lf

Lumpontoflutuantelongo(Double)

%%

Buscaporumconjuntodecaracteres

Exemplo7.1
#include <stdio.h>
int main() {
char a;
printf(Digite um caractere e veja-o em decimal, );
printf ( octal e hexadecimal. \n);
scanf(%c,&a);
printf(\n%c=%d dec., %o oct. e %x hex. \n,a,a,a,a);
return 0;
}

Execuo(faavocmesmo):

Exemplo7.2
#include <stdio.h>
int main() {
char hora, minuto, segundo;
printf("Digite a hora no formato hh:mm:ss: ");
scanf("%i%*c%i%*c%i",&hora,&minuto,&segundo);
printf("Voc digitou %02i:%02i:%02i\n",hora,minuto,segundo);
return 0;
}

Notequeocaractere:foiignoradopelafunoscanf()noExemplo7.2,comodefinidopeloformato
%*c(ignorarumcaracter).
Execuo:
Digite a hora no formato hh:mm:ss: 12:34:4
Voc digitou 12:34:04

Umcaracteredeespaobranco(isto,umespao,umatabulaoouumanovalinhaenter)
na expresso de controle faz com que a funo scanf() ignore um ou mais caracteres de espao em
brancodurantealeitura. Umcaracteredeespaonobranconaexpressodecontrolefazcomquea
funoscanf()leiaeignorecaracteresiguaisdurantealeitura.OExemplo7.3mostraumprogramaque
exemplificaousodecaracteresdeespaoembrancoenobranco.
Exemplo7.3
#include <stdio.h>
int main() {
int x,y;
scanf("%d%d",&x,&y);
printf("x=%d y=%d\n",x,y);
scanf("%d,%d",&x,&y);
printf("x=%d y=%d\n",x,y);
scanf("%dt%d",&x,&y);
printf("x=%d y=%d\n",x,y);
return 0;
}

Execuo:
1 2
x=1 y=2
3,4
x=3 y=4
5t6
x=5 y=6

31

LinguagemdeProgramaoC

32

LinguagemdeProgramaoC

No primeiro scanf(), as variveis esto separadas por um espao em branco, o que permite que o
usurio utilize uma tabulao, um enter ou espao em branco (escolhido durante a execuo) para
separar os dois valores a serem lidos. No segundo scanf(), uma vrgula colocada entre os dois
especificadoresfazendocomqueafunoleiauminteiro,umavrgulaedescarteamesma,eleiaoutro
inteiro.Notequealeiturafoirealizadacomsucessodeacordocomoresultadodafunoprintf()que
seguealeitura.Noterceiroscanf(),umcaracteret colocadoentreosdoisespecificadoresfazendo
comqueafunoleiauminteiro,umcaracteretedescarteomesmo,eleiaoutrointeiro,comoocaso
dosegundoscanf().Porisso,temquetermuitocuidadoparanoconfundiroscanf()comoprintf()e
colocartextonaexpressodecontrole.

O Exemplo 7.2 pode ser reescrito da seguinte forma utilizando um espao de caractere no
branco.AdiferenaentreoExemplo7.4eoExemplo7.2queoprimeiroobrigaousurioadigitaro
caractere:entreosnmeros,enquantoqueosegundoaceitaqualquertipodecaractere.

Exemplo7.6
#include <stdio.h>
int main() {
char ch;
printf(Digite algum caractere:);
ch=getche();
printf(\n A tecla pressionada eh %c., ch);
return 0;
}

Exemplo7.4
#include <stdio.h>
int main() {
char hora, minuto, segundo;
printf("Digite a hora no formato hh:mm:ss: ");
scanf("%i:%i:%i",&hora,&minuto,&segundo);
printf("Voc digitou %02i:%02i:%02i\n",hora,minuto,segundo);
return 0;
}

7.2

LENDOEESCREVENDOCARACTERES

Afunogetchar()lumcaracteredoteclado(estecomandonecessitaopressionamentoda
tecla<ENTER>apsocaractere),eputchar()escreveumcaracterenatela.Afunogetchar()espera
atqueumateclasejapressionada(aqualmostradanatela)edevolveoseuvalor.Afunoputchar()
escreve seu argumento caractere na tela a partir da posio atual do cursor. Os prottipos para
getchar()eputchar()somostradosaqui:
int getchar(void);
int putchar(int c);

Afunogetchar()devolveuminteiro,masobytedebaixaordemcontmocaractere.Alm
disso,podesechamarputchar()comumargumentocaractere.Afunoputchar()devolveocaractere
escrito, ou EOF (definida em stdio.h e geralmente igual a 1), se ocorreu algum erro. A funo
putchar()noacrescentaum\nasada.
Exemplo7.5
#include <stdio.h>
int main() {
char ch;
printf(Digite algum caractere:); ch=getchar();
printf(\n A tecla pressionada eh );
putchar(ch);
return 0;
}

7.2.1 GETCHE()EGETCH()

A funo getche() l um caractere do teclado sem pressionar <ENTER> e mostra o que foi
digitado.Estafunonoaceitaargumentosedevolveocaracterelidoparaafunoqueachamou.

Execuo:
Digite algum caractere: a
A tecla pressionada eh a.

Afunogetch()lumcaracteredotecladosempressionar<ENTER>enomostraoquefoi
digitado.Estafunonoaceitaargumentosedevolveocaracterelidoparaafunoqueachamou.
As funes getch() e getche() no so implementadas em todos os
compiladores.Porisso,verifiqueseoseucompiladoroferecetaisfunes
antesdeuslas.

7.3

EXERCCIOS

1. Faaumprogramaqueleia3variveisa,bec,coeficientesdeumaequaodo2graueescrevaas
duasrazesdaequao.

x=

b
,
2a

= b 2 4ac

onde

2. Umrepresentantecomercialrealizarumaviagemdevriosdiasdeautomvel,e,aps,quersaber
aquilometragemmdiaporlitrodegasolina.Paraisto,eleanotaraquilometragemnovelocmetro
aosairdeviagem,edepois,aquilometragemnachegada;eletambmvaisomartodaagasolina(em
litros) usada para abastecer o carro durante a viagem. Escreva um programa em C que, a partir
dessesdados,informeaquilometragemmdiaporlitrodegasolina.
3. Escrevaumprograma emCque leiaadistnciapercorridaemkmeotempoqueumpilotolevou
para percorrla (em minutos). O programa deve calcular a velocidade mdia em km/h, e exibir a
seguintefrase:
A velocidade mdia foi <velocidade media calculada> km/h.
4. EscrevaumprogramaemCquecalculeeescrevaasomaSNdosNprimeirostermosdeumasrie:

Sn =

(a1 + a n ) n
2

ondea1oprimeirotermodasrie,anoltimoenonmerodetermos.Osvaloresdea1,anen
serofornecidospelousurio.
5. Escreva um programa em C que calcule e escreva o valor de um termo an qualquer de uma
progressogeomtricadadapor:

a n = a1 q n 1

33

LinguagemdeProgramaoC

34

LinguagemdeProgramaoC

ondea1oprimeirotermodasrie,anoltimoenonmerodetermos.Osvaloresdea1,anen
serofornecidospelousurio.
6. Emumapizzaria,cadatulipadechopecustaR$2,80eumapizzamistagrandecustaR$20,00mais
R$1,50 por tipo de cobertura pedida (queijo, presunto, banana, etc.). Uma turma vai pizzaria e
pede uma determinada quantidade de chopes e uma pizza grande com uma determinada
quantidade de coberturas. Escreva um programa em C que calcule e conta e, sabendo quantas
pessoasestomesa,quantoquecadaumdevepagar(noesqueaos10%dogarom).
7. EscrevaumprogramaemCqueleia,comafunogetch(),seiscaracteresnumricosrepresentando
osdgitosdeumnmero.Oprimeirocaracterelidorepresentaodgitomaisesquerdadonmero;
oltimocaracterelidorepresentaodgitomaisdireitadonmero.Oprogramadevearmazenar
emumavarivelintonmerocorrespondenteseqnciadecaracteres.Ovalorcorrespondente
obtidoatravsdosomatriodovalordosdgitosmultiplicadospor10elevadoaoseupeso,ondeo
dgitomais direitatempeso 0,oseguintetempeso1,o terceiropeso2eassimpordiante.Por
exemplo,seaseqnciadecaractereslidafoi
'0''2''5''3''7''3'
ovalorcolocadonavarivelser
105x0+104x2+103x5+102x3+101x7+100x3=25373
Dica: para a converso de um caractere numrico no nmero correspondente, basta subtrair o
cdigoASCIIdocaracterezerodoprpriocaracter.assim,'0''0'=0;'1''0'=1;'2''0'=2;...;'9'
'0'=9.
8. Escreva um programa em C que leia o valor total, em termos de preo, de uma compra e o valor
pago. O programa deve calcular e escrever o troco, em termos da quantidade de cdulas de R$
100,00,50,00,10,00,5,00e1,00edemoedasde50,25,10,5e1centavos.
9. FaaumprogramaemCquecalculeaquantidadedelatasdetintanecessriaeocustoparapintar
tanquescilndricosdecombustvel,ondesofornecidos(oprogramal)aaltura(h)eoraio(r)desse
cilindro.Area(a)deumcilindrodadapelaseguintefrmula:

a = r + 2r
2

Sabese que a latade tinta anticorrosivacustaR$40,00,cadalatacontm5litrosecadalitrode


tintapinta3metrosquadradosemmdia.Paraquefiquebemcobertodetinta,hnecessidadede
duasmos.

COMANDOSCONDICIONAIS

Oscomandoscondicionaisdeterminamseumpedaodecdigodeveserexecutadodeacordo
comoresultadodeumaexpressolgica.TrscomandossodisponibilizadospelalinguagemC:
if
ifelse
switch

8.1

COMANDOIF

Sintaxe:

if(<expresso>)

<comando>;

else

<comando>;
onde comando pode ser um nico comando, um bloco de comandos ou nada (no caso de comandos
vazios).Aclusulaelseopcional.Utilizandooportugusestruturado,estecomandoseriadefinidoda
seguintemaneira:
seexpressoento
comando
senao
comando
fimse

NoExemplo8.1,ocomandodeatribuioexecutadoseesomentesexfordiferentede0.
Notequenoexisteumsmbolooupalavraparadefinirocomeodoblocoento.
Exemplo8.1
if (x != 0)
y = 0;

Casohajaumelseelepertenceaoifmaisprximo.
Exemplo8.2
if (a > 5) {
if (a < 10)
b = 3;
} else
b = 7;

NoExemplo8.2,ocomandodeatribuiob=3;somenteexecutadoseovalordavarivela
maiorque5emenordoque10.Ocomandodeatribuiob=3;somenteexecutadoseovalorda
varivel a menor que 5. Se no fosse separado por chaves o comando if mais interno o else
pertenceriaaomesmoenoaomaisexterno.
Exemplo8.3
/* Programa para adivinhar um numero */
#include stdio.h
#include stdlib.h

35

LinguagemdeProgramaoC

LinguagemdeProgramaoC

int main() {
int num, tentativa;
num = rand();
/*gera numero aleatorio entre 0 e 32767*/
scanf(%d, &tentativa);
if (tentativa == num)
printf(* * * CERTO * * *);
return 0;
}

Paramontarumblocodecomandosomentenecessriousaroabree
fecha chaves para marcar incio e fim de bloco de comandos
respectivamente.

8.2

36

COMANDOSWITCH

Ctemumcomandointernodeseleomltipla,switch,quetestasucessivamenteovalorde
umaexpressocontraumalistadeconstantesinteirasoudecaractere.
Sintaxe:

switch (<expresso>) {
case <valor1> : <seqncia de comandos>
break;
case <valor2> : <seqncia de comandos>
break;

default:
<seqncia de comandos>

Ocasodefaultopcionale,emborasejageralmenteposicionadonofinal
do bloco switch, elepodeapareceremqualquerposioentreoscases
especificados.

Casoumbreakesquecido,oprogramacontinuaaexecutarasprximasinstruesatachar
outrobreakouosmbolofechachaves.
Exemplo8.5
#include <stdio.h>
int main() {
int n;
for (n = 1; n<=5; n++) {
printf(%d\t,n);
switch( n ) {
case 1: printf(A); break;
case 3: printf(B);
case 4: printf(C); break;
default: printf(*);
case 5: printf(D);
}
printf(.\n);
}
}

1
2
3
4
5

Ovalordaexpressotestado,naordem,contraosvaloresdasconstantesespecificadasnos
comandos case. Quando uma igualdade for encontrada, a seqncia de comandos associada quele
caseserexecutadaatqueocomandobreakouofimdocomandoswitchsejaalcanado.Ocomando
default(opcional)executadonomomentoemquenocoincidirnenhumvalor.
Exemplo8.4
#include <stdio.h>
int main() {
char opcao;
printf(1. Opcao 1 \n);
printf(2. Opcao 2 \n);
printf(3. Opcao 3 \n);
printf(Opcao:);
opcao=getchar();
switch(opcao) {
case 1: printf (\nVoc escolheu a opcao 1);
break;
case 2: printf (\n Voc escolheu a opcao 2);
break;
case 3: printf (\n Voc escolheu a opcao 3);
break;
default: printf (\n Nenhuma opcao selecionada);
break;
}
return 0;
}

OresultadoparaoExemplo8.5mostradoaseguir:
A.
*D.
BC.
C.
D.

Note que quando n igual a 2, a opo default executada e como no h um break que
finaliza ocasodefault,o comandopara ocaso5tambmexecutado.O mesmo ocorrequandon
igual a 3. Como este caso no foi finalizado pelo break, o prximo comando (caso 4) tambm
executadoatacharumbreak.
Como toda a estrutura switch envolvida por chaves, no necessrio
usar bloco quando h mais que uma instruo associada a um
determinadocase.

8.3

EXERCCIOS

1. Escreverumprogramaqueleia3paresdecoordenadas(x,y),quedefinam3pontose:
Verificarseelesformamumtringulo(a<b+c):nopodemestaralinhadosenopodem
haverpontossobrepostos.
calcularosladosdotringulo.
classificarotipodotringulo:
eqiltero,isscelesouescaleno.
acutngulo,obtusnguloouretngulo
2. Avalie (fornea o resultado) das seguintes expresses lgicas e aritmticas, mostrando todos os
passosutilizadosparaaobtenodasoluo:

37

LinguagemdeProgramaoC

38

LinguagemdeProgramaoC

a)

(((4>=3)&&(3!=3.1))||(5>=4))&&(!(5==5.0))

b) (20%6)+73.0+7/2.0+(19/5)+(20+4)/4*3
3. EscrevaumprogramaemCqueleiadoisnmeroseescrevaomaiordeles

valordacompramdiaefetuada;

cdigosdosclientesqueefetuaramcomprassuperioresa20reais;e

cdigosdosclientesqueefetuaramcomprasinferioresa50reais.

4. Escrevaumprogramaqueleia3nmeroseosescreveemordemcrescente.
5. Faa um programa que leia um nmero inteiro, verifique se positivo ou negativo e escreva uma
mensagemapropriada.
6. Escreva um programa em C que leia um nmero n (declarado como float). Se o n for positivo,
escrevaumamensagemindicandoseeleparoumpar.
7. EscrevaumprogramaemCqueleiadoisnmerosinteiroseescrevaomdulodadiferenaentreos
dois(omduloovalorabsoluto,semprepositivo).
8. EscrevaumprogramaemCqueleiatrsvaloreseescrevaamdiaponderadadeles.Noclculoda
mdiaponderada,atribudopeso5paraomaiordos3valoresepeso2.5paraosoutrosdois.

16. EscrevaumprogramaemCquelcdigodeumfuncionrio,onmerodehorasporeletrabalhadas
eovalorqueelerecebeporhora.Oprogramadevecalcularoimpostoderendacomosegue:

sobreovalordosalriobrutoigualouacimadeR$2000,00,incideumaalquotade25%;

sobreovalordosalriobrutoacimadeR$1500,00eabaixode2000.00incideumaalquotade
15%;e

sobreovalordosalriobrutoacimadeR$1000,00eabaixode1500.00,incideumaalquotade
10%.

Oprogramadeveimprimirocdigodofuncionrio,seusalriobrutoeseusalriolquido.
17. Sejaoseguinteprograma
#include <stdio.h>
#include <stdlib.h>

9. Umsistemadeequaeslinearesdotipo:

#include <math.h>

a.x+b.y=c

void main(){

d.x+e.y=f

float cod, sal_bruto, aumento, adicional;

podeserresolvidodaseguinteforma:

x=

a.f c.d
c.e b.f
y=
a.e b.d
a.e b.d

EscreverumprogramaemCqueloscoeficientesa,b,c,d,eefecalculaeescreveosvaloresdexe
y.Lembresequeosdenominadoresdasequaesnopodemserzero.
10. Escreva um programa em C que leia quatro valores correspondentes aos lados deumpolgono.O
programadeveinformarseopolgonoformadoporessesvaloresumretngulo,umquadradoou
umtrapzio.
11. EscrevaumprogramaemCquerecebeahoradeinciodeumjogonaforma<hora,minutos>ea
horadeseutrmino.Oprogramadeveescreveraduraodojogoemminutos.

int n_filhos;
printf("entre com o cdigo do empregado:\n");
scanf("%f", &cod);
printf("entre com o salrio bruto:\n");
scanf("%f", &sal_bruto);
printf("entre com o nmero de filhos:\n");
scanf("%d", &n_filhos);
/* bloco 1 */
if (sal_bruto >= 3000){
aumento = sal_bruto*0.10;
}
if ((sal_bruto <3000)&& (sal_bruto >=2000)){
aumento = sal_bruto*0.15;

12. EscrevaumprogramaemCqueleiatrsvaloresnumricosrepresentandoosladosdeumtringulo.
Oprogramadeveverificareinformarseotringuloformadoeqiltero,isscelesouescaleno.
13. EscrevaprogramaemCqueleiaopreodoselonecessrioparaenviarumacartasimples,opreo
doenvelopeecertaquantiadedinheiro.Oprogramadevecalculareescreveronmerodecartas
possveisdeseremenviadascomtalquantia,supondoumseloporcarta.
14. Uma loja fornece 5% de desconto para funcionrios e 10% de desconto para clientes especiais.
EscrevaumprogramaemCquecalculeovalortotalaserpagoporumapessoa.Oprogramadever
ler o valor total da compra efetuada e um cdigo que identifique se o comprador um cliente
comum(cdigo'c'),umfuncionrio('f')ouumclienteespecial('e').
15. Escrevaumprograma emCque leiaoscdigosde5clientesdeumalojaeovalor(emreais)que
cadaumdestesclientespagouporsuacompra.Oprogramadeverescrever:

valortotalpagopelos5clientes;

}
if ((sal_bruto <2000)&& (sal_bruto >=1000)){
aumento = sal_bruto*0.20;
}
if (sal_bruto <1000){
aumento = sal_bruto*0.25;
}
/* bloco 2 */
if (n_filhos == 0){
adicional = 0;
}
if (n_filhos == 1){
adicional = 100;
}

39

LinguagemdeProgramaoC

40

LinguagemdeProgramaoC

if (n_filhos == 2){
adicional = 150;
}
if (n_filhos == 3){
adicional = 200;
}
else {

ESTRUTURADEREPETIO(LAOS)

A ordem de execuo dos programas em C at agora de cima para baixo. Entretanto, esta
ordem pode ser alterada atravs do uso de comandos que permitem alterar o controle do fluxo de
programafazendocomqueoprogramaexecutecertocdigodiversasvezes.Estescomandoschamam
sedelaosealinguagemCpossuitrscomandos:for,whileedowhile.

adicional = 300;
}

Noexisterestriodenmerodecomandosquepodemserexecutados
repetidamente num lao e nem a utilizao de um comando dentro de
outro.

sal_bruto = sal_bruto + aumento + adicional;


printf("cdigo = %f sal_bruto = %.2f\n", cod, sal_bruto);
}

Escrevaasseguintesalteraesnoprograma,semalterarsuafuncionalidade:

todasasmodificaesnecessriasparaqueavarivelcodsejadotipoint;

removaasbibliotecasquenoestosendoutilizadas;

altereobloco1,demodoasimplificarascondiesdoscomadosif.

removaosabre({)efechachaves(})desnecessrios;

substituaobloco2porumcomandoswitch.

18. SejaoseguinteprogramaemC:
#include <conio.h>
#include <stdio.h>
void main(){
int n1, n2, n3;

9.1

LAOFOR

Olaoforumaestruturadecontrolederepetiocondicionalcominicializaoeincremento.
Umcontadornormalmenteutilizadoparacontaronmerodevezesqueolaodeveserexecutado.
Sintaxe:
for(inicializao; condio;incremento)
comando;

onde comandoumcomandovazio,umcomandosimples,ouumblocodecomandos.Comoilustrado
naFigura9.1,primeiroexecutadoainicializaoqueconsisteematribuiesiniciais(podesermaisde
uma, utilizando a vrgula entre atribuies). Depois testada a condio (expresso relacional) de
controledolao.Oincremento(oudecremento)executadoapsaexecuodocomandooublocode
comandos.Ofimdolaodeterminadopelovalorfalsoqueacondioseapresenta.

clrscr();
scanf("%d %d %d",&n1, &n2, &n3);
if ((n1>=n2)&&(n1>=n3))
if (n2>=n3) printf("%d %d %d\n", n1, n2, n3);
else printf("%d %d %d\n", n1, n3, n2);
else
if ((n2>=n1)&&(n2>=n3))
if (n1>=n3) printf("%d %d %d\n", n2, n1, n3);
else printf("%d %d %d\n", n2, n3, n1);
else
if (n1>=n2) printf("%d %d %d\n", n3, n1, n2);
else printf("%d %d %d\n", n3, n2, n1);

Figura9.1:Fluxogramadolaofor.

Oqueserescritonatela,supondoqueosvaloreslidosforam2,4e1?
19. ImplementeemCumacalculadorasimplesdequatrooperaes.Ousuriodevefornecerovalordo
primeiro operando (float), a operao (um char: '+', '', '*', '/') e o segundo operando (float). A
calculadoramostra,ento,oresultadodaoperao.Paratestedooperador,useocomandoswitch.

A inicializao, condio, incremento, e at as instrues dolaofor so


opcionais.Almdocomando,osparnteseseosdois;soobrigatrios.
Exemplo9.1
#include stdio.h
int main() {
int x;
for (x=1; x<=100; x++)
printf(%d,x);
return 0;
}

41

LinguagemdeProgramaoC

42

LinguagemdeProgramaoC

No programa acima x inicializado com 1. Uma vez que x menor que 100, printf()
executadoexincrementadoem1etestadoparaverseaindamenorouiguala100.Esseprocesso
serepeteatquexfiquemaiorque100;nesseponto,olaotermina.Entoesteprogramaimprimena
telaosnmerosde1a100.

Exemplo9.3
#include <stdio.h>
int main() {
int cont=0;
char ch;
while((c=getchar()) != 0)
cont++;
printf(Foram lidos %d caracteres,cont);
return 0;
}

O Exemplo 9.2 mostra o uso de um for aninhado dentro de outro. O programa exibe um
quadro feito do caractere ASCII (cdigo 176). O lao mais externo controla o nmero de linhas
enquantoqueointernocontrolaascolunas.
Exemplo9.2
#include <stdio.h>

9.3

int main() {
int i,j;
printf(" 0123456789\n");
for (i = 0; i< 5; i++) {
printf("%d",i);
for (j = 0; j< 10; j++)
printf("%c",176);
printf("\n");
}
return 0;
}

LAODOWHILE

Aocontrriodoscomandosforewhile,quetestamacondiodolaonocomeo,olaodo
whileverificaacondioaofinaldolao.
Sintaxe:

do{

<comando>
}while(condio);

Estelaoutilizadoemcasosondeocomandooublocodecomandosdeveserexecutadopelomenos
umavez(porexemplo,leiturademenusExemplo9.4,validaodedadosnaleitura No Erro! Auto
refernciadeindicadornovlida.,oprogramaficalendoumvalorinteiroenquantoousuriodigitar
nmerosmenorque1oumaiorque3.Notequeaprpriacondiodesadaserveparaverificarseo
valordigitadoestconformeodesejado.

Execuo:
0123456789
0
1
2
3
4

Exemplo9.5).AFigura9.3mostraofluxogramadolaodowhile.

9.2

LAOWHILE

O lao while uma estrutura de controle de repetio condicional no qual a condio


avaliadaporprimeiro
Sintaxe:

while(condio)comando;
ondecomandoumcomandovazio,umacomandosimples,ouumblocodecomandos.Comoilustrado
na Figura 9.2, primeiro testada a condio (expresso relacional) de controle do lao. E a cada
execuodecomandorepetidootestedecondio.Olaopradeexecutarquandoacondiofor
falsa.

Figura9.3:Fluxogramadolaodowhile.

NoExemplo9.4,oprogramamostramensagensconformeaentradadousurio.Oprograafica
lendodgitosenquantoousuriodigitardgitosdiferentesde1,2,ou3(aqualacondiode
sadadolao).

Figura9.2:Fluxogramadolaowhile.

Exemplo9.4

43

LinguagemdeProgramaoC

44

LinguagemdeProgramaoC

#include <stdio.h>
int main() {
char opcao;
printf(1. Opcao 1 \n);
printf(2. Opcao 2 \n);
printf(3. Opcao 3 \n);
printf(Opcao:);
do {
opcao=getchar();
switch(opcao) {
case 1: printf (\nVoc escolheu a opcao 1);
break;
case 2: printf (\n Voc escolheu a opcao 2);
break;
case 3: printf (\n Voc escolheu a opcao 3);
break;
default: printf (\n Nenhuma opcao selecionada);
break;
}
} while (opcao != 1 && opcao != 2 && opcao != 3);
return 0;
}

int main() {
int n, k;
printf(\nDigite um nmero natural: );
scanf(%u, &n);
for(k=2; k<=n-1; k++)
if( n%k == 0 ) break;
if (k==n)
printf(\nO nmero primo);
else
printf(\nO nmero no primo);
return 0;
}

Observequeoforpodeserinterrompidotantopelacondiokn1quantopelacondion%k==0.
Otestek==n,foradarepetio,necessrioparasedeterminarcomoarepetiofoiinterrompida.
Claramente,sekchegaaassumirovalornporquearepetiofornofoiinterrompidapelobreake,
conseqentemente,onmerospodeserprimo.

9.5

EXIT()

No Erro! Autoreferncia de indicador no vlida., o programa fica lendo um valor inteiro


enquantoousuriodigitarnmerosmenorque1oumaiorque3.Notequeaprpriacondiodesada
serveparaverificarseovalordigitadoestconformeodesejado.

Podese finalizar um programa usando a funo exit() da biblioteca padro. Essa funo
provocaumaterminaoimediatadoprogramainteiro,forandoumretornoaosistemaoperacional.

Exemplo9.5
#include <stdio.h>
int main() {
char opcao;
do {
printf(Digite um valor entre 1 e 3);
scanf(%i,&opcao);
} while (opo < 1 || opo > 3);
printf(Opcao:, opcao);
return 0;
}

Sintaxe:

No preciso usarchaves quandohumnicocomandoaserrepetido,


entretanto,elassogeralmenteincludasparaevitarconfusoentrewhile
edowhile.

9.4

BREAK

Alm de sua utilizao no comando switch, o comando break pode ser usado no corpo de
qualquer estrutura de repetio C. Causa a sada imediata do lao eocontrole passa para o prximo
comandodoprograma.
Sintaxe:

break;

Ainserodeumbreakemumlaopodeserresultadodeumaescolha
erradadotipodelaoouseqnciadecomandosdolao.
Exemplo9.6
#include <stdio.h>

void exit(int cdigo_de_retorno);

O valor de cdigo_de_retorno retornado ao processo chamador (sistema operacional). O zero


geralmente usado como um cdigo de retorno que indica uma terminao normal do programa. No
Exemplo9.7oprogramafinalizadoquandoousuriodigitaraopo4.
Exemplo9.7
#include <stdio.h>
int main() {
char opcao;
printf(1. Opcao 1 \n);
printf(2. Opcao 2 \n);
printf(3. Opcao 3 \n);
printf(4. Abandonar \n);
printf(Opcao:);
do {
opcao=getchar();
switch(opcao) {
case 1: printf (\nVoc escolheu a opcao 1);
break;
case 2: printf (\n Voc escolheu a opcao 2);
break;
case 3: printf (\n Voc escolheu a opcao 3);
break;
case 4: exit(0);
/* retorna ao SO */
}
} while (opcao != 1 && opcao != 2 && opcao != 3);
return 0;
}

9.6

EXERCCIOS

45

LinguagemdeProgramaoC

46

LinguagemdeProgramaoC

while (i<=n){
printf("%d ", t_atu);
aux = t_atu;
t_atu = t_atu+t_ant;
t_ant = aux;
i++;
}

1. Escrevaumprogramaparacalcularofatorialdeumnmerolido.
2. Escreva um programa para ler um caractere de comparao e vrios caracteres de entrada
finalizadospor0econtaronmerodevezesqueocaracteredecomparaoapareceu.
3. Escreverumprogramaquemostreosnmerosprimosentre1e100.
4. Escrevaumprogramaqueleiaumnmeronodeterminadodevalorespositivos,emostreasomae
mdiadosrespectivosnmerosaoserlidoumvalornegativo.
5. Faaumprogramaqueleiaumnmero(inteiro)eescrevatodososseusdivisores.
6. Faa um programa que receba como entrada uma quantia em dinheiro e mostre na tela a
quantidadedenotasde5,10,50e100sonecessriaspararepresentarovalor.Oprogramadeve
contabilizarapartirdasnotasde100.
7. SuponhaumnmeroNqualquer:seNparentoNagoraN/2;seNmparNagora3*N+1.
AssimparaN=3calculamosaseguintetabela:

31042

10521

51614

16842

8421
Observequeapartirdeseteiteraesaseqncia421comeaaserepetir.Faaumprograma
quecalculeparaumdadoNonmerodeiteraesatsechegaraoprimeiro1.
8. FaaumprogramaqueimprimaoselementosdeumaPAeosomatriodamesmadados:primeiro
termo,nmerodetermoserazo

O que ser escrito na tela, supondo que o valor fornecido para n seja 6? Mostreoteste demesa
completoutilizadoparadeterminarasada.
15. Existeumalgoritmointeressanteparaseobteraraizquadradadeumnmeroquandoelaexata.
Paraisso,bastasubtrair nmerosmparesconsecutivosdonmerodoqualsedesejaretirararaiz
quadrada.Onmerodevezesseraraizdonmero.Porexemplo:

25 = 25 1 3 5 7 9 = 0
Noexemplo,subtraramsede25os5primeirosnmerosmparesconsecutivosatquesechegasse
0. Assim, a raiz quadrada de 25 5. Faa um programa que leia um inteiro n e escreva a raiz
quadrada de n. Por exemplo, se o nmero lido foi 49, ele escrever 7. O calculo da raiz quadrada
dever ser feito usando o algoritmo acima, sem usar qualquer funo prexistente em alguma
bibliotecaC.
16. Escreva um programa que l um nmero no determinado de conjuntos de valores, cada um
formado pelo nmero de um aluno esuas 3 notas. O programa calcula, para cadaaluno, a mdia
ponderada com pesos respectivos de 4 para a maior nota e 3 para as outras duas. Ele tambm
escreveonmerodo aluno,suas3notas, amdiacalculadaeuma mensagem"Aprovado"sesua
notaformaiorouiguala6ou"Exame"sesuanotamenordoque6.Oprogramapradelerdados
quandoonmerofornecidofor0.
17. OvalordePI/2podesercalculadopelaseguintesriedeprodutos:

9. Faa um programa que imprima um elemento da seqncia de Fibonacci, dado o numero do


elemento.

22446688
L
13355778

Faaumprogramaquecalculeeescrevaesteprodutocom10000termos.
10. Faaumprogramaondeousurioentracomumnmerodecimaleomesmocalculaeimprimeo
nmeronosistemabinrio.

18. Umaoclassificadodeacordocomoresultadodetrstestes,quedevemverificarseelesatisfazs
seguintesespecificaes:

11. Faa um programa onde o usurio entra com dois nmeros A e B o programa devolve como
resultadoAelevadoaB.

Teste1:contedodecarbonoabaixode7%;

Teste2:durezaRokwellmaiorque50;

12. Escrevaumprogramaquesoliciteaousuriotrsnmerosinteirosa,b,condeamaiorque1.Seu
programadevesomartodososinteirosentrebecdivisveispora.

Teste3:resistnciatraomaiordoque80.000psi.

13. Escreverumprogramaqueleiaoscdigosetaxasdeconsumo,emKw,dosconsumidoresdeuma
cidade. O programa pra de ler quando o cdigo fornecido for zero. O programa deve escrever a
mdiadeconsumoeosvaloresdamaioremenortaxadeconsumo.
14. Sejaoseguinteprograma:
#include <stdio.h>
void main(){
int t_ant = 1, t_atu = 1, aux, i = 2, n;
scanf("%d", &n);
printf("1 ");
if (n>1)

Oaorecebegrau10sepassapelostrstestes;9,sepassaapenasnostestes1e2;8,sepassano
teste1;e7,senopassounostrstestes.FaaumprogramaemCqueleianmerosdeamostrase,
paracadaamostra,leiaocontedodecarbono(em%),adurezaRokwellearesistnciatrao(em
psi), e escreva o nmero da amostra e grau obtido. O programa pra de ler amostras quando o
nmerodeamostrafornecidosejanegativo.
19. Faa um programa em C que gere todos os nmeros que so mltiplos de 2, 3, 5 e 7
simultaneamente,de1a1000000.

47

LinguagemdeProgramaoC

48

LinguagemdeProgramaoC

20. Faa um programa em C que gere uma tabela com os nmeros de 1 a 100 com seus divisores. A
sadadevesernaforma:

27. 18) Escreva um programa em C que leia um nmero e escreva seu fatorial. O fatorial de n
representadoporn!sendoque

Nmero

Divisores

0! = 1

1! = 1

1, 2

2! = 1.2 = 2

1, 3

1, 2, 4

3! = 1.2.3 = 6
4! = 1.2.3.4 = 24

...

5! = 1.2.3.4.5 = 120

21. EscrevaumprogramaemCqueleiadoisvaloresnumricos:neteto.Oprogramadeveler,ento,n
valoresnumricoseescreveropercentualdevaloreslidosmaioresdoqueteto.
22. EscrevaumprogramaemCqueleiatrsvaloresnumricos:n,valor1evalor2.Oprogramadeveler,
ento, n valores numricos e escrever o percentual de valores lidos menores do que valor1 e o
percentualdevaloreslidosmaioresdoquevalor2.
23. Altere programa abaixo para que ele repita a pergunta ate que o caractere lido seja valido
(independentementedeseremmaisculaouminscula).
#include <stdio.h>
void main(){
char ch;
printf(Deseja continuar? (s/n)\n);
ch = getche();
if (ch == 's') printf("Continua...")
else if (ch == 'n') printf("Nao continua...")
}

24. FaaumprogramaemCqueleiaumnmeron(inteiropositivomenorque10000)eescrevatodos
os nmeros de 0 a n cuja soma dos dgitos formantes 10. Por exemplo,se n = 160, o programa
escrever

28. FaaumprogramaemCleiaosresultadosdaeleiode300candidatosscincovagasdedeputado
estadual.Osdadosso:nmerodocandidatoenmerodevotosobtidos.Oprogramadeveescrever
osnmerosdos5candidatoseleitos.
29. Faa um programa em C que leia a rea de uma floresta e a taxa anual de desmatamento. O
programadeveinformaremquantosanosaflorestaestarcompletamentedesmatada.
30. Escrever um programa em C que l 100 conjuntos de 2 valores, representando o nmero de um
aluno (num) e sua altura (Ai) em centmetros. O programa deve escrever a mdia aritmtica das
alturaseosnmerosdosalunosmaisaltoemaisbaixo.
31. Faa um programa em C que calcule o resultado final da eleio para presidncia da repblica.
Existem4(quatro)partidosdisputandoaeleio,cujoscdigosso12,13,14e15;paracomputar
osvotos,oprogramalocdigodopartidovotado.Ocdigo0(zero)indicavotoembranco,cdigo
1 (um) indica voto nulo. O programa pra de ler cdigos quando o cdigo fornecido for 1. O
programa dever apurar e escrever o total de votos recebidos por cada partido, o total de votos
brancos e o total de votos nulos. Ele tambm dever informar se h necessidade de um segundo
turno,i.e.,Opartidomaisvotadonoobteve50%+1dosvotosvlidos(nobrancos,nonulos).No
casodenohaversegundoturno,oprogramadeveescreveropartidovencedor;nocasodehavero
segundoturno,oprogramadeveescreverquaispartidosodisputaro.

19 28 37 46 55 64 73 82 91 109 118 127 136 145 154

25. Foramentrevistados500alunosdeumauniversidade.Paracadaalunosentrevistadofoiregistradoo
cdigo do curso que ele freqenta (1: engenharia; 2: computao; 3: administrao) e sua idade.
FaaumprogramaemCqueprocessetaisdadosfornecendoasseguintesinformaes:

nmerodealunosporcurso;

nmerodealunoscomidadeentre20e25anos,porcurso;e

cursoscomamenormdiadeidade.

26. FaaumprogramaemCque,paracadavendedordeumarevendadeautomveis,leiaseucdigo,
seu salrio fixo e o nmero de carros do tipo 1, do tipo 2 e do tipo 3 por ele vendido no ms. O
cdigo0(zero)indicaquenohmaisvendedores.Oprogramadevecalculareescreverosalriode
cadavendedor.Paracadacarrovendido,ovendedorrecebeumacomissode5%.Ovalordevenda
de um carro do tipo 1 R$ 15.000,00; do tipo 2, R$ 20.000,00; do tipo 3 R$ 30.000,00. Alm da
comisso,ovendedorrecebeumbnusdeacordocomototaldevendas(independentementedo
tipodecarrovendido)conformesegue:

seelevendeumaisde5carros,obnusdeR$300,00;

seelevendeumaisde8carros,obnusdeR$500,00;e

seelevendeumaisde10carros,obnusdeR$1000,00.

32. Decidiuse, em uma linha de produo, fazer uma verificao da taxa de uso diria dos
equipamentos.FaaumprogramaemCqueleiaocdigodoequipamentoesuataxadeusodiria
(nmerohoras/dia).Oprogramadeveescrever:

ocdigodoequipamentomaisusado;

onmerodeequipamentoscujataxadeusoigualousuperiora15horas/dia;e

onmerodeequipamentoscujataxadeusoigualouinferiora5horas/dia.

Aentradadedadosdeveserfinalizadaquandoocdigodeequipamentoinformadoforzero.
33. Umdeterminadotipodeaplicaofinanceirarendeumataxafixaporms.FaaumprogramaemC
que leia osaldodaaplicao,ataxa(percentual),umdeterminadonmerodemeseseinformeo
saldo,passadoessenmerodemeses.
34. ParaoprogramaemCabaixo,digaoqueserescritonatela,supondoqueovalorfornecidoparaN
foi6?Mostreotestedemesacompletoutilizadoparadeterminarasada.
#include<stdio.h>
void main(){
int N, i=0, divs=1;
printf("Fornea um nmero inteiro\n");

49

LinguagemdeProgramaoC

50

LinguagemdeProgramaoC

scanf("%d",&N);
do{
if (N%i == 0) divs+= i;
i++;
} while(i <= N/2);
if (divs == N) printf("%d perfeito",N);
else printf("%d no perfeito",N);

35. Umalojacobra,porprodutosvendidosnocredirio,umataxade1,5%aoms.Faaumprograma
emCqueleiaopreodoprodutovistaeonmerodevezesemqueeleserpago.Oprograma
deveescreveropreofinaldoprodutoparaonmerodevezesinformado.
36. Ovalordepodesercalculadopelaseguintesrie:

4
4
4
4
+
+
+L+
1 + w 2 (1 0,5) 1 + w 2 (2 0,5) 1 + w 2 (3 0,5)
1 + w 2 (n 0,5)

Aformageraldeumafuno:

w=

1
n

enonmerodetermos.FaaumprogramaemCqueleiaovalordenecalculeeescrevaovalor
de,atravsdessealgoritmo,comntermos.
37. Mostre,paracadalinhaexecutadadoprogramaabaixo,osvaloresdasvariveis,considerandoqueo
valorfornecidoparanfoi18.
#include<stdio.h>
void main(){
int N, i=0, divs=1;
scanf("%d",&N);
do{
if (N%i == 0) divs = divs +i;
i++;
} while(i <= N/2);
}

..declarao_de_variveis;
corpo_funo;
}

Exemplo10.1
int soma(int x, int y) {
...
}

As funes retornam um valor (do tipo indicado em tipo_funo). O valor retornado pela
funodadopelocomandoreturn(ovalorretornadopodeounoserutilizado).

onde

01
02
03
04
05
06
07
08
09

Sintaxe:

tipo_funonome_funo(declarao_parmetros){

10 FUNES

Existem dois tipos de passagem de argumentos: por valor e por referncia. A segunda
realizadaatravsdeapontadores.
Exemplo10.2

int pot(int x, int n) {


int p;
for(p=1;n>0;n--)
p *= x;
return p;
}

/* x elevado na n potncia */

NoExemplo10.2,osargumentosforampassadosporvaloreafunoretornaumvalordotipo
inteiro.Achamadaseria:
a = pot(10,2);

NoExemplo10.3,nenhumvalorretornado(porissousaseotipovoid)masrealizadouma
trocadosvaloresdasvariveis,necessitandodeumapassagemdeparmetrosporreferncia.
Exemplo10.3
/* troca os valores de duas variveis*/
void troca(int *a, *b) {
int aux;
aux = *a;
*a = *b;
*b = aux;
}

Achamadaparaestafunoseria:
int x=1,y=2;
troca(&x,&y);

Na passagem de parmetros por referncia passado explicitamente o endereo da varivel


com o uso do operador &. Quando o argumento for uma matriz automaticamente ser passado o
endereodamatrizparaafuno.

51

LinguagemdeProgramaoC

52

LinguagemdeProgramaoC

[corpo de funo]
}

AlinguagemCaceitachamadasrecursivasdefunes.

10.1 LOCALIZAODASFUNES
Existem basicamente duas posies possveis para escrevermos o corpo de uma funo: ou
antes ou depois do programa principal. Podemos ainda escrever uma funo no mesmo arquivo do
programaprincipalouemarquivoseparado.

10.1.1 CORPODAFUNOANTESDOPROGRAMAPRINCIPAL(NOMESMO
ARQUIVO)
Quando escrevemos a definio de uma funo antes do programa principal e no mesmo
arquivodeste,nenhumaoutrainstruonecessria.
Exemplo10.4
float media2(float a, float b) {
float med;
med = (a + b) / 2.0;
return(med);
}

// funo

int main() {
// programa principal
float num_1, num_2, med;
puts(Digite dois nmeros:);
scanf(%f %f, &num_1, &num_2);
med = media2(num_1, num_2);
// chamada da funo
printf(\nA media destes nmeros e %f, med);
return 0;
}

Paraqueumafunosejareconhecidaduranteacompilaodevemosde
clarlaoudefinilaantesdequalquerrefernciaquefeitaaelanoresto
doprograma.

10.1.2 CORPODAFUNODEPOISDOPROGRAMAPRINCIPAL(NOMESMO
ARQUIVO)
Quando escrevemos a definio de uma funo depois do programa principal e no mesmo
arquivo deste, devemos incluir um prottipo da funo chamada. Um prottipo uma instruoque
define o nome da funo, seu tipo de retorno e a quantidade e o tipo dos argumentos da funo. O
prottipo de uma funo indica ao compilador quais so as funes usadas no programa principal os
tipo.Asintaxegeralparaistoaseguinte:
Sintaxe:
int main() {
tipo nomef(...);
...
var = nomef(...)
...
}
tipo nomef(...){

Exemplo10.5
#include <stdio.h>
int main() {
// programa principal
float media2(float,float);
// prottipo de media2()
float num_1, num_2, med;
puts(Digite dois nmeros:);
scanf(%f %f, &num_1, &num_2);
med = media2(num_1, num_2);
// chamada a funo
printf(\nA media destes nmeros e %f, med);
}
float media2(float a, float b){ // funo media2()
float med;
med = (a + b) / 2.0;
return(med);
}

// programa principal
// prottipo da funo
// chamada a funo

// definio da funo

Prottipodeumafunonadamaisqueadeclaraodafunosemo
seucorpo.Porisso,alistadeargumentosdoprottipopodemserescritas
apenascomostiposdosargumentos.

10.1.3 CORPODAFUNOESCRITOEMARQUIVOSEPARADO
EmC,comoemmuitasoutraslinguagens,permitidoqueousuriocrieumafunoemum
arquivo e um programaque a chame em outro arquivo distinto. Esta facilidade permite a criaode
bibliotecas de usurio: um conjunto de arquivos contendo funes escritas pelo usurio. Esta
possibilidadeumagrandevantagemutilizadaemlargaescalaporprogramadoresprofissionais.
Quando escrevemos a definio de uma funo em arquivo separado do programa principal
devemos incluir este arquivo no conjunto de arquivos de compilao do programa principal. Esta
incluso feita com a diretiva #include. Esta diretiva, vista nas sees 2.4.2 e 3.7.1, instrui o
compiladorparaincluirnacompilaodoprogramaoutrosarquivosquecontemadefiniodasfunes
deusurioedebiblioteca.
Sintaxe:
#include path
int main() {
...
var = nomef(...)
...
}

// incluso da funo
// programa principal
// chamada a funo

Nadiretiva#include,indicamosentreaspasduplasocaminhodelocalizaodoarquivoonde
estdefinidaafunochamada.
Exemplo10.6
#include c:\tc\userbib\stat.h
int main() {
float num_1, num_2, med;
puts(Digite dois nmeros:);
scanf(%f %f, &num_1, &num_2);
med = media2(num_1, num_2);
//
printf(\nA media destes nmeros
return 0;

// incluso da funo
// programa principal

chamada a funo
e %f, med);

53

LinguagemdeProgramaoC

54

LinguagemdeProgramaoC

#define EXPRESSAO(x) x+5


#define EXPRESSAO2(x) (x+5)

10.2 PROTTIPODEFUNES

OpadroANSICexpandiuadeclaraotradicionaldefuno,permitindoqueaquantidadee
ostiposdosargumentosdasfunessejamdeclarados.Adefinioexpandidachamadaprottipode
funo.ProttiposdefunesnofaziampartedalinguagemCoriginal.

int main() {
int i =
printf("Incorreto: %2d\n",5 * EXPRESSAO(3));
printf("Correto:
%2d\n",5 * EXPRESSAO2(3));
return 0;
}

ProttipospermitemqueCforneaumaverificaomaisfortedostipos.Prottiposdefunes
ajudamadetectarerrosantesqueelesocorram.verificadonmerodeparmetros,compatibilidade
detipos,entreoutras.

Execuo

10.4 EXERCCIOS

Existemtrstiposdedeclaraodeprottipos:
Sintaxe

tipo_funonome_funo();

tipo_funonome_funo(lista_tipo_argumentos);
tipo_funonome_funo(lista_tipo_nome_argumentos);

Exemplo
intpot();
intpot(int,int);
intpot(intx,inty);

10.3 DIRETIVA#DEFINE

Adiretiva#definepodeserusadaparadefinirconstantessimblicascomnomesapropriados.
Porexemplo,aconstantePIpodeserdefinidacomovalor3.14159.

Incorreto: 20
Correto:
40

1. Escreva um programa que receba como parmetro um ndice (float). Aps, ler uma sequncia de
nmeros (a qual termina por 0) e exibir o seu valor multiplicado pelo ndice. A funo que
transformaumastringemumfloatatof(char*x).
2. Escrevaumafunoquerecebaumcaracterecomoargumentoequeretornealetramaisculasea
mesmaforminscula.funes:islower(intch),toupper(intch).
3. Existeumalgoritmointeressanteparaseobteraraizquadradadeumnmeroquandoelaexata.
Paraisso,bastasubtrair nmerosmparesconsecutivosdonmerodoqualsedesejaretirararaiz
quadrada.Onmerodevezesseraraizdonmero.Porexemplo:

25 = 25 1 3 5 7 9 = 0

#define PI 3.14159

S pode ser escrito um comando destes por linha, e no h pontoevrgula aps qualquer
diretivadoprprocessador.

Adiretiva#definedefinidacomo umamacro,isto,antesdocdigosercompilado,opr
processador substitui todas as instncias iguais ao que est definido pela diretiva. O prprocessador
realmentemudaocdigofonteparaqueocompiladorpossarealizarasuaanlise.

Estadiretivausadaparadefinirmacroscomargumentos.
#define AREA(x) (4*PI*x*x)

A declarao acima define a funo AREA() aqual calcula a rea de umaesfera. A vantagem
desta declarao no tipagem do argumento x. No deve haver espaos entre o nome da macro e
seusidentificadores.
Cuidado ao utilizar #define para expresses, pois como o texto
substitudo pelo que foi definida, a precedncia de operadores pode
alteraroresultadodesejado.Porisso,recomendaseousodeparnteses
aoredordeexpresses.

OExemplo10.7mostracomooresultadodeumaexpressopodeserafetadoporumamacro
incorretamentedefinida.
Exemplo10.7
#include <stdio.h>

Noexemplo,subtraramsede25os5primeirosnmerosmparesconsecutivosatquesechegasse
0.Assim,araizquadradade255.Escrevaumafunoquerecebauminteironeretornearaiz
quadrada de n. Por exemplo, se a funo receber 49, ele retornar 7. O calculo da raiz quadrada
dever ser feito usando o algoritmo acima, sem usar qualquer funo prexistente de alguma
bibliotecaC.
4. Sejaoseguinteprograma:
#include<stdio.h>
void x(int n){
int i, resto;
i = n;
do{
resto = i%16;
i=i/16;
switch(resto){
case 10: printf("A");
case 11: printf("B");
case 12: printf("C");
case 13: printf("D");
case 14: printf("E");
case 15: printf("F");
default: printf("%d",
}
}while(i>0);
printf("\n");
}
void main(){

break;
break;
break;
break;
break;
break;
resto);

55

LinguagemdeProgramaoC

56

LinguagemdeProgramaoC

int N;
scanf("%d",&N);
x(N);
}

a=

onde

v = v f vi

O que ser escrito na tela, supondo que o valor fornecido para N seja 10846? Mostre o teste de
mesacompletoutilizadoparadeterminarasada.

avariaodavelocidadeouavelocidadefinalmenosavelocidadeinicial.EscrevaumafunoemC
que receba como parmetros a velocidade inicial, a velocidade final e o intervalo de tempo
correspondente e retorne a acelerao. Mostre, tambm, uma funo main() que chame essa
funo.

5. Simule a execuo do programa abaixo mostrando todas as mudanas de valores de variveis e o


resultadodaimpresso.
#include<stdio.h>
int perf(long int N){
long int i, divs=0;
for(i=1; i<= N/2; i++)
if (N%i == 0) divs = divs + i;
if (divs == N) return 1;
else return 0;
}
void main(){
long int x=14;
if (perf(x)==1) printf("%d perfeito",x);
else printf("%d no perfeito",x);
}

11. Ovalorde/2podesercalculadopelaseguintesriedeprodutos:

22446688
L
13355778

EscrevaumafunoemCquerecebacomoargumentoumnmerointeironeretorneovalorde
calculadoatravsdasrieacimacomntermos.
12. Umaoclassificadodeacordocomoresultadodetrstestes,quedevemverificarseelesatisfazs
seguintesespecificaes:

6. Escreva uma funo em C que receba como argumentos a altura (alt) e o sexo de uma pessoa e
retorneoseupesoideal.Parahomens,calcularopesoidealusandoafrmula

PI h= 72.7 alt 58

Teste1:contedodecarbonoabaixode7%;

Teste2:durezaRokwellmaiorque50;

Teste3:resistnciatraomaiordoque80.000psi.

Oaorecebegrau10sepassapelostrstestes;9,sepassaapenasnostestes1e2;8,sepassano
teste1;e7,senopassounostrstestes.EscrevaumafunoemCqueocontedodecarbono
(em%),adurezaRokwellearesistnciatrao(empsi)deumaamostradeaoeretorneograu
obtido.

e,paramulheres,

PI m= 62.1 alt 44.7 .


7. EscrevaumafunoemCcomoseguinteprottipo
long int multiplicatrio(int i, int n)

Afunodeveretornaromultiplicatriodeian.Porexemplo,achamada
multiplicatrio(3,10)

13. EscrevaumafunoemCquerecebaumnmeroneretorne1seasomadosdgitosformantesden
for10;0casocontrrio.Porexemplo,seovalordenrecebidofor145afunoretorna1.
14. Escreva uma funo em C que receba um numero e retorne seu fatorial. O fatorial de n
representadoporn!sendoque

retorna1814400(345678910).

0! = 1
1! = 1

8. EscrevaumafunoemCcomoseguinteprottipo

2! = 12 = 2

long int somatrio(int i, int n)

3! = 123 = 6
4! = 1234 = 24

Afunodeveretornarosomatriodeian.Porexemplo,achamada

5! = 12345 = 120

somatrio(3,10)

retorna52(3+4+5+6+7+8+9+10).
9. EscrevaumafunoemCquerecebadoisnmeroseretorneomaiordeles.
10. A acelerao a taxa de variao da velocidade em relao ao tempo, isto , a razo entre a
variaodavelocidadeeointervalodetempo.Matematicamente,

15. Definaasmacrosdescritasaseguir:
a) eh_minuscula(c):informaseocaracterecumaletraminscula.
b) eh_maiuscula(c):informaseocaracterecumaletramaiscula.
c) minuscula(c):convertealetracparaminscula.
d) maiuscula(c):convertealetracparamaiscula.

57

LinguagemdeProgramaoC

58

LinguagemdeProgramaoC

11 VETORESEMATRIZES

Vetoresematrizessoestruturasdedadosusadapararepresentarumacertaquantidadede
variveis de valores homogneos. Em C, estas estruturas precisam ser declaradas, como quaisquer
outras variveis, para que o compilador conhea o tipo do vetor ou da matriz e reserve espao de
memriasuficienteparaarmazenlo.

Oquediferenciaadeclaraodeumamatrizouvetordadeclaraodequalquervarivela
parte que segue o nome, isto , os pares de colchetes ([ e ]) que envolvam um nmero inteiro, que
indicaaocompiladorotamanhodamatriz.

Quando houver uma inicializao de um vetor ou uma matriz na


declarao,podesesuprimirsempreovalordoprimeirocolchete,isto,
pelonmerodeargumentoseleassumeonmerodoprimeirocolchete.
Exemplo11.3
int TAB[]={1,5,10,15,20}
int MAT[][6]={ { 1, 0, 1, 0, 1, 0 },
{ 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0 },
{ 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0 } };

11.2 MATRIZESEVETORESCOMOARGUMENTODEFUNES
int notas[5];

A declarao acima aloca um intervalo de memria com nome notas para armazenar 5
elementosdotipoint.Pordefinioumvetoroumatrizcompostoporelementosdeumnicotipo.

ParaadeclaraodemaisdeumadimensoemCnecessrioonmerodepardecolchetes
serigualaonmerodedimenses.Isto,seamatrizfordeduasdimensesteremosumadeclarao
assim:
int notas[5][5];

quedeclaraumamatrizbidimensional;paratrsdimensesassim
int notas[5][5][5];

que declara uma matriz tridimensional e assim por diante. O limite de ndices definido pelo
compiladoroupelamemria.

Oselementosdovetoroudamatrizsosempreenumeradosporndicesiniciadospor0(zero).

Exemplo11.1
for (i=0;i<5;i++) {
printf(Digite a nota do aluno %d:,i);
scanf(%d, &notas[i]);
}

AlinguagemCnorealizaverificaodelimitesemmatrizes!

11.1 INICIALIZAODEVETORESEMATRIZES

ComooCpermiteainicializaodevariveisbsicas,tambmpermitidoainicializaode
vetoresematrizes.
Exemplo11.2
int TAB[5]={1,5,10,15,20}
int MAT[5][6]={ { 1, 0, 1, 0, 1, 0 },
{ 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0 },
{ 0, 1, 0, 1, 0, 1 },
{ 1, 0, 1, 0, 1, 0 } };

O C permite que passe matrizes ou vetores como argumento de uma funo. Mas h uma
peculiaridadenapassagemdeparmetros:aformacomoelapassada.

Onomedeumamatrizouvetordesacompanhadodecolchetesequivalenteaoendereoda
matrizoudovetor,isto,passagemporreferncia.

Quando o nome estiver acompanhado de um indexador passado como argumento o


contedodaquelaposiodamatrizoudovetor,isto,passagemporvalor.

11.3 LIMITES
NalinguagemC,devemostercuidadocomoslimitesdeumvetor.Emboranasuadeclarao,
tenhamos definido o tamanho de um vetor, o Cnofaznenhumtestedeverificaodeacesso aum
elementodentrodovetorouno.
Porexemplosedeclaramosumvetorcomointvalor[5],teoricamentestemsentidousarmos
oselementosvalor[0],...,valor[4].Porm,oCnoacusaerroseusarmosvalor[12]emalgumlugardo
programa.Estestestesdelimitedevemserfeitoslogicamentedentrodoprograma.

Este fato se deve a maneira como o C trata vetores. A memria do microcomputador um


espao (fsico) particionado em pores de1 byte. Se declaramos um vetor como int vet[3], estamos
reservando 6 bytes (3 segmentos de 2 bytes) de memria para armazenar os seus elementos. O
primeirosegmentoserreservadoparavet[0],osegundosegmentoparavet[1]eoterceirosegmento
para vet[2]. O segmento inicial chamado de segmento base, de modoquevet[0]serlocalizadono
segmentobase.Quandoacessamosoelementovet[i],oprocessadoracessaosegmentolocalizadoem
base+i.Seiforiguala2,estamosacessandoosegmentobase+2ouvet[2](oultimosegmentoreservado
paraovetor).Porm,seiforiguala7,estamosaacessandosegmentobase+7quenofoireservado
paraoselementosdovetorequeprovavelmenteestsendousadoporumaoutravariveloucontm
informaoespria(lixo).
Acessarumsegmentoforadoespaodestinadoaumvetorpodedestruir
informaes reservadas de outras variveis. Estes erros so difceis de
detectar, pois o compilador no gera nenhuma mensagem de erro. A
soluomaisadequadasempreavaliaroslimitesdeumvetorantesde
manipullo.

59

LinguagemdeProgramaoC

60

LinguagemdeProgramaoC

Aprincpioestefatopoderiaparecerumdefeitodalinguagem,masnaverdadetratasedeum
recursomuitopoderosodoC.Podermanipularsemrestriestodosossegmentosdememriauma
flexibilidadeapreciadapelosprogramadores.

10

11

12

13

14

15

16

17

18

19

11.4 EXERCCIOS
1.

Faaumprogramaqueleia10valoresinteiroseescrevaosnaordeminversaaqueforamlidos.

2.

Faaumprogramaqueleia10valoresinteiros,calculesuamdiaeescrevatodososvaloresque
estoabaixodamdia.

3.

Calcularosnmerosprimosentre0e100(inclusive)utilizandoocrivodeEritstenes:

Usarumvetorde101inteiros;
zerarovetor;
repetirde2a100
paracadanmero:somar1atodososcontadoresdosseusmltiplos.
aofinalosnmerosquepossuem0novetorsoprimos.

4.

Escreva um programa que leia um vetor de 100 posies e mostreo em ordem crescente e
decrescente.

5.

FaaumprogramaqueleiaumamatrizM[10][10]esometodososelementosabaixodadiagonal
principal.

6.

FaaumprogramaqueleiaumamatrizM[4][4]emostraasuatransposta.

7.

Escrevaumafunoquerealizeamultiplicaodematrizes.

8.

Escrevaumafunoquerecebaumvetoreotamanhodomesmoetroqueoselementos(1como
ltimo,o2comopenltimoeassimpordiante).

9.

Faa um programa em C que leia dois vetores unidimensionais A e B, de dimenso 8, e realize a


trocadoselementosdestesvetores;ouseja,apsaexecuodoprogramaovetorBdeverconter
osvaloresfornecidosparaovetorA,eviceversa.

10. EscrevaumprogramaemCquerealizeocontroledasvagasdeumestacionamento,representado
atravs de um vetor. A posio i do vetor marcada com 1 indica quea vaga i est ocupada; se a
posio estiver marcada com 0, a vaga est livre. Inicialmente, todas as vagas esto livres (o
estacionamento tem 20 vagas). O programa deve constantemente requisitar ao operador a
operao a ser executada. So oferecidas trs operaes: sada de veculo ('s' ou 'S'), entrada de
veculo('e'ou'E')edeixaroprograma('d'ou'D').Seja,porexemplo,oestacionamentonaseguinte
situao:

Oestadodovetorrepresentandooestacionamentoseria:
0

10

11

12

13

14

15

16

17

18

19

Quando um veculo sai dos estacionamento, o programa deve atualizar o vetor refletindo a nova
vagalivre;quandoumveculoentranoestacionamento,oprogramadeveinformarqualavagalivre
(seexistir)maisprximadaentradaeatualizarovetorrefletindoanovavagaocupada.
11. Sejaumaflorestade1.000.000.000m2.Comumpercentualdedesmatamentocorrentede1.2%
ao ano que aumenta 50% ao ano. Assim, no prximo ano ele aumentar para 1.8% (1.2 + 0.6),
depois2.7%(1.8+0.9),4.05%(2.7+1.35)etc.FaaumprogramaemCquecoloqueemumvetor
os percentuais de desmatamento dos prximos 10 anos e em outro vetor a rea desmatada
correspondente.
12. FaaumprogramaemCquearmazeneemumvetoros50primeirosnmerosprimos.
13. FaaumprogramaemCqueleiaumconjuntode50valoresemumvetorA.Depoisdelidosos50
valores, o programa dever colocar em vetor P os elementos pares de A e em I os elementos
mpares.
14. FaaumprogramaemCqueleiaoprimeirotermodeumaprogressogeomtrica(a1)earazo
(q). O programa deve colocar em um vetor os 100 primeiros termos da progresso. Um termo
qualquer da progresso ser o resultado da multiplicao do valor do termo anterior pela razo,
i.e.,
an = an-1q
15. Faa um programa em C que leia dois vetores numricos v1 e v2 de 100 posies e calcule o
produtoescalardeles.Oprodutoescalardadopelosomatriodamultiplicaodecadaposio
dosvetores,isto,
Produto_esc = v1[0]v2[0] + v1[1]v2[1] + v1[2]v2[2] + v1[3]v2[3] + ...

16. FaaumprogramaemCqueleiaumvetorcontendoosconceitosdosalunosdeumaturmade20.
Osconceitospodemser'A','B','B','B'e'E'.Oprogramadevedesenharumhistogramahorizontal
correspondentedistribuiodosconceitos.Paraovetordeconceitos
0

'A'

'A'

'C'

'B'

'A'

'B'

'A'

'B'

'D'

'B'

61

LinguagemdeProgramaoC

62

LinguagemdeProgramaoC

10

11

12

13

14

15

16

17

18

19

'A'

'B'

'C'

'E'

'C'

'C'

'A'

'C'

'A'

'B'

ohistogramaserdesenhadoseria
A
B

19. Escreva um programa em C que leia um vetor de 20 posies e o escreva. A seguir, o programa
deve compactar o vetor, retirando dele todos os valores nulos ou negativos e escrever o vetor
compactado. Aps, ele deve ser ainda mais compactado, atravs da retirada dos elementos em
duplicados.
20. EscrevaumafunoemCcomoseguinteprottipo:

void digitosSomam10(int i, int j, int V[10])

D
E

AfunocolocanovetorVos10primeirosnmerosdeiajcujasomadosdgitosformantes10.
Porexemplo,sei=10ej=200,ento

OcdigoASCIIdocaractere176.
17. EscrevaumprogramaemCqueleiaoscdigoseconceitosdosalunosdeumaturmadetamanho
mximo60.Oprogramadevercolocaremumvetorasituaodecadaaluno:'A',seoconceitofor
superior a 0; 'E' caso contrrio. O algoritmo pra de ler quando o cdigo informado for 0. Por
exemplo,
1

'A'

'A'

'A'

'E'

'A'

'A'

'E'

'E'

59
...

A'

18. FaaumprogramaemCquecalculeeescrevaamdiamvel.Oprogramadeverexecutarumlao
deleituradevaloresinteirosepositivos;aintroduodevaloresnegativosservircomoindicador
detrminodeleitura.Paracadavalorfornecido,deverserimpressaamdiacalculada.Amdia
mvel efetuada sobre um nmero especificado de pontos. Quando se introduz um novo dado,
descartaseovalormaisantigodandoselugaraonovodado.Esteesquemadesubstituiofazda
mdiamveluminstrumentovaliosonaanlisedetendncias.Quantomenoronmerodedados,
mais sensvel ser com relao mdia. Considerar para a soluo deste problema 10
pontos(valores), armazenados em um vetor. Supondo, por exemplo, que em um determinado
momentoovetortemosseguintesvalores
0

10

28

37

46

55

64

73

82

91

109

Seentreiejnohouverem10nmeroscujasomadosdgitosformantes,asdemaisposiesno
preenchidasdeverosercompletadascom1.
21. EscrevaumafunoemCcomoseguinteprottipo:
void interseccao(char V1[10], char V2[10], char V3[10])

AfunorecebeosvetoresV1eV2preenchidosecolocaemV3oresultadodaintersecodeV1e
V2,i.e.,colocaemV3apenasoscaracteresqueestocontidosnosdoisvetores.Exemplo:
V1
0

'A'

'E'

'F'

'6'

'$'

'H'

'M'

'O'

'X'

'Z'

'B'

'C'

'K'

'E'

'F'

'G'

'T'

'O'

'M'

'6'

'E'

'F'

'O'

'M'

'6'

' '

' '

' '

' '

' '

V2

V3

eonovovalorlidofoi3.Amdiamvelser

(7 + 4 + 2 + 5 + 3 + 4 + 6 + 7 + 4) + 3

0
19

22. EscrevaumafunoemCcomoseguinteprottipo:
void parteInteira(double V1[10], double V2[10])

Observequenoclculoovalormaisantigo(5)foisubstitudopor3(omaisrecente).Ovetoragora
ficarassim:
0

Senaprximaleituraforlidoovalor4,amdiamvelser

AfunorecebeosvetoresV1preenchidoecolocaemV2aparteinteiraesemsinaldoselementos
deV1.Exemplo:
V1
0

15

-67

13.14

96.7

-43.04

99

-6

78.01

123

-7.07

(4 + 2 + 5 + 3 + 4 + 6 + 7 + 4) + 4
10

Ovalormaisantigo(7),quefoisubstitudopelo4eovetoragoraficarassim:
0

V2
0

15

67

13

96

43

99

78

123

23. EscrevaumafunoemCcomoseguinteprottipo:

63

LinguagemdeProgramaoC

64

LinguagemdeProgramaoC

void uniao(char V1[10], char V2[10], char V3[20])

AfunorecebeosvetoresV1eV2preenchidosecolocaemV3oresultadodauniodeV1eV2,
i.e.,colocaemV3oscaracteresqueestocontidosnosdoisvetores,norepetindoocorrncias.Por
exemplo:

considerandooscasosemqueocontedodaposiodeAmenordoqueocontedodaposio
deB,conformeoexemploabaixo.
0

V1
0

'A'

'E'

'F'

'6'

'$'

'H'

'M'

'O'

'X'

'Z'

V2

'B'

'C'

'K'

'E'

'F'

'G'

'T'

'O'

'M'

'6'

'A'

'E'

'F'

'6'

'$'

'H'

'M'

'O'

'X'

'Z'

10

11

12

13

14

15

16

17

18

19

'B'

'C'

'K'

'G'

'T'

' '

' '

' '

' '

' '

V3

24. FaaumprogramaemCqueleiaumamatriz5 5.Apslido,amatrizdeverserinvertida,isto,as


linhas tornarseo colunas e as colunas tornarseo linhas. Na figura abaixo, mostrado um
exemplodeinverso.

10

10

13

20

4
8

13

86

20

11

20

13

10

86

60

77

60

33

10

20

33

21

11

77

21

13

25. Faa um programa em C que leia uma matriz 5x5 e escreva se ela simtrica. Uma matriz
simtricaseelaigualsuatransposta.AmatrizMabaixo,porexemplo,simtricajqueM=Mt.

Mt

31

31

11

10

20

11

10

20

11

66

13

11

66

13

10

33

10

10

33

10

31

20

13

10

31

20

13

10

26. FaaumprogramaemCqueleiaoscdigoseasnotasfinais(entre0e10)deumaturmadealunos
de tamanho desconhecido (mas no maior que 60) at que o cdigo fornecido seja negativo. O
algoritmodeveescreveroscdigosdosalunosqueficaramcomnotafinalinferiornotamdiada
turma.
27. EscrevaumprogramaemCqueleiaemdoisvetoresAeB,de6posies,nmerosdeumdgito.O
programadevecolocaremumvetorCoresultadodasubtraodeAporB,posioporposio,

65

LinguagemdeProgramaoC

66

LinguagemdeProgramaoC

Execuo
Digite seu nome: Carlos Alberto
Saudacoes, Carlos

12 STRINGS(CADEIADECARACTERES)

EmCnoexisteumtipodedadoquerepresenteumacadeiadecaracteres,tambmchamada
de string. Ao contrrio, as string so implementadas como um vetor de caracteres, terminados pelo
caractere NULL (\0). O caractere NULL serve como uma marca defimdestringparaasfunes que
lidamcomstrings.

Comoemqualquervetor,oscaracteresdastringpodemserindividualmenteacessados.

Adeclarao:
char nome[15];

OpadroANCSICadicionouaoscanf()umnovoespecificadordeformatochamadoscanset.O
scanset representa um conjunto de caracteres que pode ser lido pela funo scanf(). Para definir um
scanset,utilizaseumacadeiadecaracteresaserlidaentrecolchetes,precedidosporum%.OExemplo
12.4mostraalgunsscansetseseurespectivosignificado.
Exemplo12.4
%[XYZ]
%[0-9]
%[A-Z]
%[a-z]

reserva um espao de memria para uma string de tamanho 14, pois o dcimoquinto byte para o
caractere NULL. A manipulao de strings pode ser feitaatravs de funes ou elemento a elemento
comosefosseumvetor.
Exemplo12.1
char str[2];
str[0] = U;
str[1] = \0;

ler
ler
ler
ler

apenas
apenas
apenas
apenas

os
os
os
os

caracteres
caracteres
caracteres
caracteres

X, Y, e Z
de 0 a 9
maisculos do alfabeto
minsculos do alfabeto

Quando o scanset utilizado, a funo scanf() continua lendo e


armazenandooscaracteresnastringatqueencontreumcaractereque
nopertenaaoconjunto.

Para inverter a seleo, colocase o caractere acento circunflexo (^) antes do conjunto de
caracteres.Assim,afunoscanf()noaceitarcaracterealgumdoconjuntodefinido.

/* Caractere NULL para finalizar string */

Comotodovetorasstringspodemserinicializadas,comomostramoExemplo12.2:
Exemplo12.2
char nome[]={C,a,r,l,o,s,\0};
char nome[]=Carlos;
char nomes[][8]={Eduardo,
Andre,
Adriana,
Carla,
Jose};

O Exemplo 12.5 mostra um cdigo utilizando o scanset. No primeiro scanf(), somente os


caracteres a, b, c, d, e, f sero aceitos na leitura. No segundo scanf(), somente os caracteres
maisculosdoalfabetoseroaceitosnaleitura.Noterceiroscanf(),osdgitosde0a9noseroaceitos
naleitura.Notequeousuriodigitoucaracteresforadoconjuntodefinidoemtodosostrsscanf(),mas
elesnoforamlidos.
Exemplo12.5
#include <stdio.h>
int main() {
char str[20]=;
scanf("%[abcdef]",str);
fflush(stdin);
printf("> %s\n",str);
scanf("%[A-Z]",str);
fflush(stdin);
printf("> %s\n",str);
scanf("%[^0-9]",str);
printf("> %s\n",str);
return 0;
}

12.1 LEITURADESTRINGS

Para ler uma string podese utilizar a funo scanf() ou a funo gets() da biblioteca C para
receberastring.

12.1.1 SCANF()

Afunoscanf()bastantelimitadaparaaleituradestrings.Poisnopodehaverespaosem
branconastringlida.Oquevierapsoespaoembrancoeliminado.

Execuo:
abcABC
> abc
ABCabc
> ABC
!@#123
> !@#

Exemplo12.3
#include <stdio.h>
int main() {
char nome[15];
printf(Digite seu nome:);
scanf(%s,&nome);
printf(Saudacoes %s,nome);
return 0;
}

Caso a string inteira no considerada


scanf() no altera o contedo da string.

vlida,

67

LinguagemdeProgramaoC

68

LinguagemdeProgramaoC

12.1.2 GETS()

Execuo
Digite seu nome:
Carlos Alberto
Saudacoes,
Carlos Alberto
puts() pula de linha sozinha
los Alberto

Afunogets()bastanteconvenienteparaaleituradestrings.Oseupropsitounicamente
lerumastringdasuaentradapadroquepordefaultoteclado.

Vistoqueumastringnotemumtamanhoprdeterminado,gets()lcaracteresatencontrar
odenovalinha(\n)quegeradoaopressionaratecla[Enter].Todososcaracteresanterioresao\n
so armazenados na string e ento includo o caractere \0. Caracteres brancos como espaos e
tabulaessoaceitveiscomopartedastring.
Exemplo12.6
#include <stdio.h>
int main() {
char nome[15];
printf(Digite seu nome:);
gets(nome);
printf(Saudaes %s,nome);
return 0;
}

Afunoputs()reconhece\0comofimdestring.Cadaimpressodeputs(),eleacabacomum
caracteredenovalinha.

Utilizandoafunoprintf()omesmoefeitoseria:
printf(%s\n,nome);

puts(nome);

12.3 FUNESDEMANIPULAODESTRINGS

Comostringssoimplementadascomovetores,osoperadoresusuaisnopodemseraplicados
sobre este tipo de dado. Por exemplo: comparao atribuio no so suportados por este tipo de
dado.

Execuo
Digite seu nome: Carlos Alberto
Saudaes, Carlos Alberto

AsfunesdescritasnasprximasseesutilizamocabealhopadroSTRING.H.

12.2 ESCRITADESTRINGS

12.3.1 STRLEN()

Devolve o comprimento da string terminada por um nulo apontada por str. O nulo no
contado.

Paraescreverumastringpodeseutilizarafunoprintf()ouafunoputs()dabibliotecaC.

12.2.1 PRINTF()

Sintaxe:
size_t strlen(char *str);

A funo printf() ao imprimir a string no realiza uma nova linha, como definido na sua
implementao.Emcompensaoumafunoquepodeserusadaparaimpressodemaisqueuma
stringporlinha.

Exemplo12.8
printf(%d,strlen(ola));

/* O resultado 3 */

12.2.2 PUTS()

12.3.2 STRCAT()

A funo puts() o complementa de gets(). O seu propsito unicamente imprimir a string


apontadapeloseuargumento.Oendereodestastringdevesermandadoparaputs()comoargumento.

Concatenaumacpiadestr2emstr1eterminastr1comumnulo.Comonoexisteverificao
delimites,deinteiraresponsabilidadedousurioqueotamanhodestr1sejasuficientementegrande
paraarmazenarseucontedooriginaleodestr2.

OExemplo12.7ilustraalgumasdasmuitaspossibilidadesdeseuuso.

Exemplo12.7
/* mostra o uso de putc() */
#include <stdio.h>
int main() {
char nome[81];
puts(Digite seu nome:);
gets(nome);
puts(Saudacoes, );
puts(nome);
puts(puts() pula de linha sozinha);
puts(&nome[4]);
return 0;
}

Sintaxe:
char *strcat(char *str1, const char *str2);
Exemplo12.9
printf(%s,strcat(ola, mundo)); /* O resultado ola mundo */

12.3.3 STRCMP()

Comparalexicograficamenteduasstringsedevolveuminteirobaseadonoresultadocomo
mostradoaqui:

Valor

Significado

69

LinguagemdeProgramaoC

70

LinguagemdeProgramaoC

Menorquezero
Zero

Maiorquezero

str1menorquestr2
str1igualastr2
str1maiorquestr2

Desconsiderarsealetramaisculaouminscula;
Terminacomocaractere0.

3.

Escreverafunoatoi()(recebeumastringcomoparmetroetransformaemuminteiro).

4.

EscrevaumafunoemCcomoseguinteprottipo

Sintaxe:
int strcmp(const char *str1, const char *str2);

void itoa(long int numero, char str[])

12.3.4 STRCPY()

A funo recebe um nmero inteiro (positivo ou negativo) e coloca em str sua representao na
forma de um string. Por exemplo, se o nmero for 12345, o string receber "12345"; nostring,
nonecessriorepresentarosinalpositivo.Observaes:(1)paraobterseocdigoASCIIdeum
caracterenumricoqualquer,bastasomaronmeroequivalenteaocdigoASCIIdocaractere0
(zero).Porexemplo,ocdigoASCIIdocaractere'5''0'+5;(2)onmeronotermaisdoque5
dgitos;(3)podesepegardgitoadgitodonmeroutilizandooperaesdedivisointeiraeresto
dadivisosucessivasporpotnciasde10.Exemplo:

Copiaocontedodestr2emstr1.str2deveserumponteiroparaumastringterminadacom
umnulo.Afunostrcpy()devolveumponteiroparastr1.
Sintaxe:
char *strcpy(char *str1, const char *str2);
Exemplo12.10
char str[80];
strcpy(str, mundo);

72385

/* copia mundo na string str */

-70000

12.4 EXEMPLOGERAL

Oprogramaabaixoexemplificaousodasfunesdescritasanteriormente.

Exemplo12.11
#include stdio.h
#include string.h
int main() {
char s1[80], s2[80];
gets(s1);
gets(s2);
printf(comprimento: %d %d \n, strlen(s1), strlen(s2));
if (!strcmp(s1,s2))
printf(As strings sao iguais\n);
strcat(s1,s2);
printf(%s\n,s1);
strcpy(s1, Isso e um teste \n);
printf(s1);
return 0;
}

2385
-2000

Aorodaresteprogramaeentrarcomasstringsolaeola,asadaser
comprimentos: 3 3
As strings so iguais
aloalo
Isso e um teste

12.5 EXERCCIOS
1.

Faaumprogramaqueleia3nomes(at30letras)eosescrevaemordemalfabtica.

2.

Escrevaumprogramaqueleiaumnmeroindeterminadodecaracteresecontaonmerodevezes
quecadaletra(AZ)aparece:

385
-300

10000
7
1000
2
100
3

85

10

-80

-5

5.

Simuleaexecuodoprogramaabaixomostrandotodasasmudanasdevaloresdevariveis.
#include<stdio.h>
#include<conio.h>
#include<string.h>
void X(int n, char str[]){
int i;
i = strlen(str);
str[i]='\0';
do{
str[i] = n%2+'0';
n=n/2;
i--;
}while(i>0);
}
void main(){
int a=13;
char strx[30];
X(a,strx);
printf("%d = %s \n", a,strx);

71

LinguagemdeProgramaoC

72

6.

LinguagemdeProgramaoC

EscrevaumafunoemCcomoseguinteprottipo

Afunorecebeumnmerointeirosemsinalecolocaemumstringarepresentaodonmero
em binrio. A obteno da representao em binrio de um nmero feita atravs de divises
(inteira)sucessivasdonmeropor2.Orestodecadadivisoforneceosdgitosbinrios.Exemplo:

int palin(char str[])

Afunorecebeumstringeretorna1seelerepresentarumapalavrapalndroma,isto,igualde
trsparafrente(como"arara","radar","somos"etc.);seapalavranopalndroma,afunodeve
retornar0.

10973
1

2
5486
0

7.

2
2743

EscrevaumafunoemCcomoseguinteprottipo

int chrtimes(const char str1[], const char ch)

2
1371
1

2
685

A funo recebe um string e um caractere e retorna o nmero de ocorrncias da letra


correspondenteaocaracterenostring.Porexemplo,achamada

2
342

chrtimes("paranapanema", 'a')

2
171
1

retorna5(observequeasletrasmaisculaseminsculastemcdigosASCIIdiferenciados).
8.

2
85

EscrevaumafunoemCcomoseguinteprottipo

42
0

int numchrtimes(const char str1[])

2
21
1

Afunorecebeumstringeretornaonmerodeocorrnciasdecaracteresnumricosnostring.
Porexemplo,achamada

EscrevaumafunoemCcomoseguinteprottipo:

Afunorecebedois strings,str1estr2,eretornaonmerodeocorrnciasdestr2emstr1.Por
exemplo,achamada

2
5

Dgito mais significativo (+ esq.)

retorna3.

int strtimes(const char str1[], const char str2[])

10
0

numchrtimes("alfa1 bravo2 charlie 5")

9.

Assim,apsachamada
int2bin(10973, numbin)

numbinirconter"10101011011101".

strtimes("com o grmio, onde o grmio estiver", "grmio")

retorna2(afunonodistingueletrasmaisculasdeminsculas).
10. Escrevaafuno
int strin(const char str1[],const char str2[])

12. Afunorecebeumnmerointeirosemsinalecolocaemumastringarepresentaodonmero
emhexadecimal.Aobtenodarepresentaoemhexadecimaldeumnmerofeitaatravsde
divises (inteira) sucessivas do nmero por 16. O resto de cada diviso fornece os dgitos
hexadecimais.Nabasehexadecimal,ovalor10representadopelaletraa,ovalor11porb,o
valor12porC,ovalor13pord,ovalor14poreeovalor15porf.

Afunoverificasestr1estcontidoemstr2,apartirdaposio0.Emcasoafirmativo,afuno
retorna1,emcasonegativo,0.Porexemplo,achamada

10973

strin("ASTRO", "ASTRONAUTA");

13

16
685
13

retorna1,masaschamadas
strin("astro", "mastro");

16
42

16

10

16

Dgito mais significativo (+ esq.)

strin("carro", "caravana");

retornam0.

Assim,apsachamada
int2hexa(10973, numhexa)

11. EscrevaumafunoemCcomoseguinteprottipo:
void int2bin(int n, char str[])

numhexairconter"2ADD".

73

LinguagemdeProgramaoC

74

LinguagemdeProgramaoC

13. EscrevaumafunoemCcomoseguinteprottipo:
void int2hexa(int n, char str[])

Apartirdasdefiniesacima,escrevaumafunoemCcomoprottipo
float descripto(char codigo[])

14. Sejamasduasfunesabaixo:
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#define preco_max 1000000

Afunorecebeumstringeretornaovalorcorrespondenteaostringdecodificado.
16. Considerandoasfunescodificaecriptodaquestoanterior,mostreovalorimpressopelafuno
main()abaixo:
void main(){

void codifica(unsigned long int numero, unsigned long int div, char
chave[], char str[]){

char codigo[20];
float preco = 23345.98;

unsigned long int resto;

cripto(preco,codigo);

int i = 0;
do{
resto = numero%div;
numero = numero/div;

printf("codigo do preco: %s\n", codigo);


}

17. EscrevaumafunoemCcomoseguinteprottipo

div = div/10;

int strlen(char str[])

str[i] = chave[numero];
numero = resto;

Afunorecebeumstringeretornaseutamanho,semincluirocaracterenulo('\0').

i++;
}while(div!=0);

18. EscrevaumafunoemCcomoseguinteprottipo
void strcpy(char str1[], char str2[])

str[i] = \0;
}

Afunorecebedoisstrings(str2[]estr1[])ecopiaocontedodestr2[]parastr1[].

void cripto(float preco, char codigo[]){


char chave[] = "nevralgico";
unsigned long int parte_int;
int parte_frac;

19. Mostreoresultadodaexecuodoprograma(funomain())abaixo.
int kyz(const char str1[], const char str2[]){
int cont=0, j, i, achou =1;

parte_int = (unsigned long int) floor(preco);

for (i=0; str1[i]!='\0';i++){

parte_frac = (unsigned long int) (preco/parte_frac)*100;

do{

codifica(parte_int, preco_max, chave, codigo);

if (str1[i]!=str2[j]){

codigo[strlen(codigo)]=.;

achou= 0;

codifica(parte_int, 100, chave, codigo);

j = 0;

break;
}

15. A funo codifica recebe um nmero inteiro, o valor mximo que ele pode assumir, um string
representandoumachavedecodificaoeumavarivelstringquereceberonumerocodificado,
atravs da substituio dos dgitos pelos caracteres correspondentes da chave. A funo cripto
recebe um nmero fracionrio e coloca em um string as partes inteira e fracionria do nmero
codificadas.Elapodeserutilizadaconformeoexemploabaixo:

j++;
i++;
} while(str2[j]!='\0');
if (achou) cont++;
j = 0;

void main(){

achou = 1;

char codigo[20];
}

float preco;

return cont;

do{
printf("entre com preco:\n");

scanf("%f",&preco);
cripto(preco,codigo);
printf("codigo do preco: %s\n", codigo);
} while(1);

void main(){
char maior[]="ABXYZCXYZKLMNPQXYZ";
char menor[]="XYZ";

75

LinguagemdeProgramaoC

76

LinguagemdeProgramaoC

printf( "%d\n", kyz(maior,menor)) ;


}

13 E/SCOMARQUIVO

20. EscrevaumafunoemCquerecebadoisstringseretorne1seosstringssoiguais;0seelesso
diferentes.
21. Escreva um programa em C que leia valores para dois vetores de strings, conforme a definio
abaixo:
char maridos[10][30], esposas[10][30];

Os valores lidos correspondem a nomes de pessoas. O primeiro vetor conter apenas nomes de
homens;osegundoconterapenasnomesdemulheres.Porexemplo,

joo

elias ado

vtor

hugo

carlos heitor olvio enio lus

marta irma

carla sandra gilda paula

ana

isete

iara sandra

Sogruposdedadosarmazenadosemmeionovoltil(disco,fita,entreoutros).Soutilizados
paraarmazenardadosdeformapermanente.

AlinguagemCnocontmnenhumcomandodeE/S.Aocontrrio,todasasoperaesdeE/S
ocorrem atravs de chamadas a funes da biblioteca C padro. Essa abordagem faz o sistema de
arquivosdeCextremamentepoderosoeflexvel.OsistemadeE/SdeCnico,porquedadospodem
sertransferidosnasuarepresentaobinriainternaouemumformatodetexto.

13.1 STREAMS

A linguagem C oferece uma abstrao da interface para controle de E/S, independente do


dispositivo real (terminais, acionadores de disco, acionadores de fita, entre outros) que acessado.
Sendoqueodispositivorealchamadodearquivo.

Existem dois tipos de streams: texto e binria. A primeira uma seqncia de caracteres
organizados em linhas e terminadas por um caractere de nova linha (depende da implementao). A
segundaumaseqnciadebytescomumacorrespondnciadeumparaumcomaquelesencontrados
nodispositivoexternoisto,noocorrenenhumatraduodecaracteres.

Aseguir,oprogramalumamatriz1010contendoapenas0se1s,conformeoexemploabaixo:
0
1
2
3
4
5
6
7
8
9

0
0
0
0
0
0
0
0
0
1
0

1
0
0
0
0
0
0
0
1
0
0

2
1
0
0
0
0
0
0
0
0
0

3
0
0
1
0
0
0
0
0
0
0

4
0
0
0
0
1
0
0
0
0
0

5
0
1
0
0
0
0
0
0
0
0

6
0
0
0
1
0
0
0
0
0
0

7
0
0
0
0
0
1
0
0
0
0

8
0
0
0
0
0
0
1
0
0
0

9
0
0
0
0
0
0
0
0
0
1

Uma posio i,j da matriz acima contendo o valor 1 indica que o elemento i do vetor maridos
casadocomoelementojdovetoresposas.Oprogramadeveescrevertaisrelaesnaforma<i>
casadocom<j>.Paraoexemploacima,asadaseria:
Joo casado com carla
Elias casado com paula
Ado casado com sandra
...

13.2 ARQUIVOS

Um arquivo pode ser qualquer coisa, desde um arquivo em disco at um terminal ou uma
impressora.Associase uma stream comumarquivo especfico realizando uma operao deabertura.
Todosasstreamssoiguais,masnotodososarquivos.Isto,umarquivodiscopodesuportaracesso
aleatrioenquantoumtecladonopode.

Cada streamassociada aum arquivo temumaestrutura de controle de arquivodotipoFILE.


EssaestruturadefinidanocabealhoSTDIO.H.

Todososarquivossofechadosautomaticamentequandooprogramatermina,normalmente
commain()retornandoaosistemaoperacionalouumachamadaexit().Osarquivosnosofechados
quandoumprogramaquebra(crash).

13.3 SISTEMADEARQUIVOS

O sistema de arquivos ANSI composto de diversas funes interrelacionadas. As mais


comunssomostradasnaTabela13.1.EssasfunesexigemqueocabealhoSTDIO.Hsejaincludoem
qualquerprogramaemquesoutilizadas.
Tabela13.1Funesmaiscomunsdosistemadearquivocombuffer

Nome

Funo

fopen()

Abreumarquivo

fclose()

Fechaumarquivo

putc()

Escreveumcaractereemumarquivo

fputc()

Omesmoqueputc()

77

LinguagemdeProgramaoC

78

LinguagemdeProgramaoC

getc()

Lumcaracteredeumarquivo

Criaumarquivotextoparaescrita

fgetc()

Omesmoquegetc()

Anexaaumarquivotexto

fseek()

Posicionaoarquivoemumbyteespecfico

rb

Abreumarquivobinrioparaleitura

fprintf()

paraumarquivooqueprintf()paraoconsole

wb

Criaumarquivobinrioparaescrita

fscanf()

paraumarquivooquescanf()paraoconsole

ab

Anexaaumarquivobinrio

feof()

Devolveverdadeiroseofimdearquivoforatingido

r+

Abreumarquivotextoparaleitura/escrita

ferror()

Devolveverdadeiroseocorreuumerro

w+

Criaumarquivotextoparaleitura/escrita

rewind()

Repeoindicadordeposiodearquivonoinciodoarquivo

a+

Anexaoucriaumarquivotextoparaleitura/escrita

remove()

Apagaumarquivo

r+bourb+

Abreumarquivobinrioparaleitura/escrita

fflush()

Descarregaumarquivo

w+bouwb+

Criaumarquivobinrioparaleitura/escrita

a+bouab+

Anexaaumarquivobinrioparaleitura/escrita

OarquivocabealhoSTDIO.HforneceosprottiposparaasfunesdeE/Sedefineestestrs
tipos:size_t,fpos_teFILE.Otiposize_tessencialmenteomesmoqueumunsigned,assim comoo
fpos_t.OtipoFILEdiscutidonaprximaseo.

A biblioteca STDIO.H define vrias macros como: EOF, SEEK_SET, SEEK_CUR e SEEK_END. A
macroEOFgeralmentedefinidacomo1eovalorquandoumafunodeentradatentaleralmdo
final do arquivo. As outras macros so usadas com fseek(), que uma funo que executa acesso
aleatrioemumarquivo.

Exemplo13.2
FILE *arq;
/* ponteiro de arquivo */
arq = fopen(dados.dat,wb);

Seaoabrirumarquivoparaleituraomesmonoexistirafunofopenretornaumponteiro
nulo(NULL).
arq = fopen(dados.dat,rb);
if (arq == NULL)
arq=fopen(dados.dat,wb);

13.4 ESTRUTURAFILE

Paraamanipulaodearquivosutilizadoadeclaraodeponteiro(ponteirodearquivo).Isto
,umponteiroparainformaesquedefinemvriosdadossobreoarquivo,comooseunome,status,e
a posio atual do arquivo. Um ponteiro de arquivo uma varivel ponteiro do tipo FILE . Todas as
funessorealizadasutilizandooponteiro.Paraadeclaraodeumponteirodearquivoutilizasea
seguintesintaxe:

13.6 FECHAMENTODEARQUIVO

Afunofclose()fechaumastreamquefoiabertaatravsdeumachamadafopen().Esta
funotemaseguintesintaxe:
Sintaxe:
int fclose(FILE *fp);

Sintaxe:
FILE *<var>

ondefpoponteirodearquivodevolvidopelachamadafopen().Ovalorderetorno0significauma
operaodefechamentobemsucedida.

Exemplo13.1
FILE *fp;

13.7 VERIFICANDOFIMDEARQUIVO
13.5 ABERTURADEARQUIVOS

Afunofopen()abreumastreamparausoeassociaumarquivoaela.Retornaoponteirode
arquivoassociadoaessearquivo.

A funo feof()devolve verdadeiroquando for encontrado o fimde arquivo. O prottipo desta


funoestdeclaradoabaixo:
Sintaxe:
int feof(FILE *fp);

Sintaxe:
FILE *fopen(const char * <nome_arquivo>, const

char * <modo_abertura>);

Omododeaberturadefineaformacomofeitooacessoaosdados(somenteleitura,leiturae
escrita,etc).AsformaprincipaissoapresentadasnaTabela13.2.
Tabela13.2Osmodosdeaberturavlidos

Modo

Significado

Abreumarquivotextoparaleitura

Estafunopodeseraplicadatantoparaarquivotextocomoparaarquivosbinrios.

13.8 COMANDODEGRAVAOEMMODOTEXTOFORMATADO

Como extenso das funes bsicas de E/S j discutidas, o sistema de E/S com buffer inclui
fprintf() e fscanf(). Essas funes se comportam exatamente como printf() e scanf() exceto por
operarememarquivos.Osprottiposdefprintf()efscanf()so

79

LinguagemdeProgramaoC

80

LinguagemdeProgramaoC

Sintaxe:
int fprintf(FILE *fp, const char *control_string, ...);
int fscanf(FILE *fp, const char *control_string, ...);

2.

Faaumprogramaqueleia11nmerosdeumarquivo.

3.

EscreverumprogramaemCqueleiaumnmeroindeterminadodecdigos(inteiro)etaxasde
consumo (real), em Kw, dos consumidores de uma cidade e grave os dados em um arquivo
chamadomedidas.txt.Oprogramapradelerquandoocdigofornecidoforzero.

4.

EscreverumprogramaemCqueleiaoarquivogeradonoexerccio1emostrequantastaxas
existemeomaiorconsumo.

5.

Escrever um programa em C que leia um arquivo texto (temp.txt) e grave em outro arquivo
(tempMax.txt).Oarquivoorigempossuiuumnmeroindeterminadodelinhas,ondecadalinha
possui 5 colunas: dia, ms, ano, temperatura mnima (real), temperatura mxima (real). O
programa deve escrever no arquivo tempMax.txt o dia, ms, ano, e a temperatura mxima
somente quando ela for maior que a temperatura mxima do dia anterior. Por exemplo,
assumaqueoarquivotemp.txtpossuaoseguintecontedo:

ondefpumponteirodearquivodevolvidoporumachamadafopen().fprintf()efscanf()direcionam
suasoperaesdeE/Sparaoarquivoapontadoporfp.
Afscanf()devolveonmerodeelementoslidos,convertidosearmazenados.Nocasodefimde
arquivoofscanf()devolveovalorEOF.

OExemplo13.3mostraumprogramaquelumastringeuminteirodoteclado,escreveosem
umarquivoemdiscoeemseguidalemostraainformaonatela.
Exemplo13.3
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
int main() {
FILE *fp;
char s[80];
int t;
if((fp=fopen(teste,w))==NULL) {
printf(Arquivo nao pode ser aberto\n);
exit(1);
}
printf(entre com uma string e um nmero: );
fscanf(stdin, %s%d, s, &t); /* le do teclado */
fprintf(fp, %s %d, s, t);
/* escreve no arquivo */
fclose(fp);
if((fp=fopen(teste,w))==NULL) {
printf(Arquivo nao pode ser aberto\n);
exit(1);
}
fscanf(fp, %s%d, s, &t);
/* le do arquivo */
fprintf(stdout, %s %d, s, t); /* imprime na tela */
return 0;
}

Aformataorealizadaparaleituraeescritadedadospodecomprometeravelocidadede
processamentodoprograma.

13.9 STREAMSPADRO

Semprequeumprogramainiciado,trsstreamspadressoabertasautomaticamente:

stdin
stdout
stderr
stdaux
stdprn

(entradapadroteclado);
(sadapadrotela);
(sadadeerropadrotela);
(sadaauxiliarpadroportaserial);
(impressorapadroimpressoraparalela).

EssasstreamspodemserutilizadasnormalmenteparaexecutaroperaesdeE/Sbufferizada.

13.10 EXERCCIOS
1.

Faaumprogramaqueescrevaosnmerosde0a10emumarquivo.

10 10 2007 16.5 32.2


11 10 2007 15.4 31.0
12 10 2007 17.5 32.7
13 10 2007 18.6 32.4
14 10 2007 17.5 30.3
15 10 2007 18.3 31.2
16 10 2007 16.8 30.2
17 10 2007 17.6 31.3

OprogramadevegeraroarquivotempMax.txtcomoseguintecontedo:
12 10 2007 32.7
15 10 2007 31.2
17 10 2007 31.3

81

LinguagemdeProgramaoC

82

LinguagemdeProgramaoC

14 BIBLIOGRAFIA
A. TABELAASCII
KERNIGHAN,BrianW.;RITCHIE,DennisM..C:ALinguagemdeProgramao.11Edio.PortoAlegre:
EDISA,1998.208p.
Cd

Car

Cd

Car

32

Cd

Car

Cd

Car

Cd

Car

Cd

Car

Cd

Car

Cd

Car

64

96

128

160

192

224

33

65

97

129

161

193

225

34

66

98

130

162

194

226

35

67

99

131

163

195

227

36

68

100

132

164

196

228

37

69

101

133

165

197

229

38

&

70

102

134

166

198

230

39

71

103

135

167

199

231

40

72

104

136

168

200

232

41

73

105

137

169

201

233

10

42

74

106

138

170

202

234

11

43

75

107

139

171

203

235

12

44

76

108

140

172

204

236

13

45

77

109

141

173

205

237

46

78

110

142

174

206

238

15

47

79

111

143

175

207

239

16

48

80

112

144

176

208

240

17

49

81

113

145

177

209

241

18

50

82

114

146

178

210

242

19

!!

51

83

115

147

179

211

243

20

52

84

116

148

180

212

244

21

53

85

117

149

181

213

245

22

54

86

118

150

182

214

246

23

55

87

119

151

183

215

247

24

56

88

120

152

184

216

248

25

57

89

121

153

185

217

249

26

58

90

122

154

186

218

250

27

59

91

123

155

187

219

251

28

60

<

92

124

156

188

220

252

29

61

93

125

157

189

221

253

30

62

>

94

126

158

190

222

254

31

63

95

127

159

191

223

255

14

MIZRAHI,V.V.TreinamentoemLinguagemC.SoPaulo:PearsonPrenticeHall,2008.
SCHILDT,H.CCompletoetotal.3aEdio.SoPaulo:McGrawHill,1996.

También podría gustarte