Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
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.
ProgramasemCsocompilados,gerandoprogramasexecutveis.
Ccompartilharecursostantodealtoquantodebaixonvel,poispermiteacessoeprogramao
diretadomicroprocessador.Comisto,rotinascujadependnciadotempocrtica,podemser
facilmente implementadas usando instrues em Assembly. Por esta razo, C a linguagem
preferidadosprogramadoresdeaplicativos.
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
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;
2.1
BIBLIOTECAS
Parafazeristo,usaseumadiretivadecompilaoaqualcolocadaforadequalquerfunodo
programa.Adiretiva#includeinstruiocompiladoraleroutroarquivofonte.
Funestrigonomtricasdongulo arco,emradianos.
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;
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
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)
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
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
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
tipos inteiros, o sufixo U representa unsigned e o L representa long. A tabela 5.3 mostra alguns
exemplosdeconstantes.
Tabela4.3Exemplodeconstantes
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
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
conio.h
BLUE
conio.h
GREEN
conio.h
CYAN
conio.h
RED
conio.h
MAGENTA
limits.h
INT_MAX
2.147.483.647
limits.h
INT_MIN
-2.147.483.648
17
LinguagemdeProgramaoC
18
LinguagemdeProgramaoC
Seexistirmaisdeumavariveldomesmotipo,podesedeclarladeumavezseparandoseus
nomesporvrgulas.
VARIVEIS
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.
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
6.1
ATRIBUIO
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
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.
/*
/*
/*
/*
Imprime
Imprime
Imprime
Imprime
6 */
6.666667 */
6.666667 */
6.666667 */
23
LinguagemdeProgramaoC
24
/*
/*
/*
/*
/*
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++;
/*
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
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
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*
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
6.7
NoExemplo6.10,primeiroyrecebe3e,emseguida,atribuiovalor4ax.
EXPRESSES
6.7.1 CONVERSODETIPOSEMEXPRESSES
Quandoconstantesevariveisdetiposdiferentessomisturadasemumaexpresso,elasso
convertidasaummesmotipo.OcompiladorCconvertetodososoperandosnotipodomaioroperando,
oquedenominadopromoodetipo.Issofeitooperaoporoperao,comodescritonasregrasde
conversodetiposabaixo.
SEumoperandolongdouble
27
LinguagemdeProgramaoC
28
LinguagemdeProgramaoC
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 */
6.7.3 ESPAAMENTOEPARNTESES
Haindaumcasoadicionalespecial:seumoperandolongeooutrounsigned,eseovalor
dounsignednopodeserrepresentadoporumlong,osdoisoperandossoconvertidosparaunsigned
long.
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)
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
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
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.
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.
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
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()
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:
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>
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:
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.
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
/* 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);
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
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.
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,
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
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.
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, ¬as[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.
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.
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.
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:
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
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
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
Para inverter a seleo, colocase o caractere acento circunflexo (^) antes do conjunto de
caracteres.Assim,afunoscanf()noaceitarcaracterealgumdoconjuntodefinido.
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};
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;
}
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()
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);
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
-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:
Afunorecebeumstringeretorna1seelerepresentarumapalavrapalndroma,isto,igualde
trsparafrente(como"arara","radar","somos"etc.);seapalavranopalndroma,afunodeve
retornar0.
10973
1
2
5486
0
7.
2
2743
EscrevaumafunoemCcomoseguinteprottipo
2
1371
1
2
685
2
342
chrtimes("paranapanema", 'a')
2
171
1
retorna5(observequeasletrasmaisculaseminsculastemcdigosASCIIdiferenciados).
8.
2
85
EscrevaumafunoemCcomoseguinteprottipo
42
0
2
21
1
Afunorecebeumstringeretornaonmerodeocorrnciasdecaracteresnumricosnostring.
Porexemplo,achamada
EscrevaumafunoemCcomoseguinteprottipo:
Afunorecebedois strings,str1estr2,eretornaonmerodeocorrnciasdestr2emstr1.Por
exemplo,achamada
2
5
retorna3.
10
0
9.
Assim,apsachamada
int2bin(10973, numbin)
numbinirconter"10101011011101".
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
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;
cripto(preco,codigo);
int i = 0;
do{
resto = numero%div;
numero = numero/div;
17. EscrevaumafunoemCcomoseguinteprottipo
div = div/10;
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[].
19. Mostreoresultadodaexecuodoprograma(funomain())abaixo.
int kyz(const char str1[], const char str2[]){
int cont=0, j, i, achou =1;
do{
if (str1[i]!=str2[j]){
codigo[strlen(codigo)]=.;
achou= 0;
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
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
marta irma
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
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.
Todososarquivossofechadosautomaticamentequandooprogramatermina,normalmente
commain()retornandoaosistemaoperacionalouumachamadaexit().Osarquivosnosofechados
quandoumprogramaquebra(crash).
13.3 SISTEMADEARQUIVOS
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.
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.
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.