Você está na página 1de 136

Aspectos Formais da Computao linguagem C

prof. Camillo Oliveira

PONTIFCIA UNIVERSIDADE CATLICA DO PARAN


CENTRO DE CINCIAS EXATAS E DE TECNOLOGIA
DIRETORIA DE INFORMTICA
CURSO DE ENGENHARIA DE COMPUTAO
DISCIPLINA DE ASPECTOS FORMAIS DA COMPUTAO
PROFESSOR CAMILLO OLIVEIRA

ASPECTOS FORMAIS

Curitiba, 1999.
pag. 1

Aspectos Formais da Computao linguagem C


prof. Camillo Oliveira

pag. 2

Aspectos Formais da Computao linguagem C


prof. Camillo Oliveira
SUMRIO
1 Introduo ...................................................................................................................................................
1.1 Origens da linguagem C ............................................................................................................
1.2 Esqueleto de um programa em linguagem C ............................................................................
1.3 Mapa de memria de um programa em C .................................................................................
2 Tipos bsicos ..............................................................................................................................................
3 Operador de atribuio ...............................................................................................................................
4 Constantes ..................................................................................................................................................
4.1 Constantes caracteres ...............................................................................................................
4.2 Constantes inteiras ....................................................................................................................
4.3 Constantes com ponto flutuante ................................................................................................
4.4 Constantes octais e hexadecimais ............................................................................................
4.5 Constantes string .......................................................................................................................
4.6 Constantes caractere de barra invertida ....................................................................................
5 Converso de tipos .....................................................................................................................................
5.1 Exerccios propostos .................................................................................................................
6 Operadores .................................................................................................................................................
6.1 Operadores aritmticos .............................................................................................................
6.1.1 Incremento e decremento .........................................................................................
6.1.2 Expresses aritmticas ............................................................................................
6.2 Operadores lgicos e relacionais ..............................................................................................
6.2.1 Operadores Lgicos .................................................................................................
6.2.1.1 Tabelas verdade ......................................................................................
6.2.2 Operadores Relacionais ...........................................................................................
6.2.3 Expresses lgicas ...................................................................................................
6.3 Operadores de bits ....................................................................................................................
6.4 Precedncia dos operadores .....................................................................................................
6.5 Abreviaturas ...............................................................................................................................
7 Variveis compostas homogneas .............................................................................................................
7.1 Variveis compostas homogneas unidimensionais (vetores) ..................................................
7.1.1 Inicializao de vetores ............................................................................................
7.2 Variveis compostas homogneas multidimensionais (matrizes) .............................................
7.2.1 Inicializao de matrizes ..........................................................................................
7.3 Exerccios propostos .................................................................................................................
7.4 Operador em tempo de compilao sizeof ...............................................................................
8 Ponteiros .....................................................................................................................................................
8.1 Variveis ponteiros ....................................................................................................................
8.2 Operadores de ponteiros ...........................................................................................................
8.3 Aritmtica de ponteiros ..............................................................................................................
8.4 Indireo mltipla .......................................................................................................................
8.5 Ponteiros e strings .....................................................................................................................
8.6 Ponteiros e vetores ....................................................................................................................
8.7 Ponteiros e matrizes ..................................................................................................................
8.8 Vetor de ponteiros .....................................................................................................................
8.9 Exerccios propostos .................................................................................................................
9 Variveis compostas heterogneas ............................................................................................................
9.1 Estruturas ..................................................................................................................................
9.2 Exerccios propostos .................................................................................................................
9.3 Unies ........................................................................................................................................
10 Enumeraes ............................................................................................................................................
11 Entradas e sadas utilizando scanf(...) e printf(...) ....................................................................................
11.1 printf(...) ...................................................................................................................................
11.2 scanf(...) ...................................................................................................................................
11.3 Exerccios propostos ...............................................................................................................

pag. 3

pag
5
5
7
8
8
10
11
11
11
11
11
11
11
12
13
14
14
15
16
17
17
17
17
17
18
19
20
20
20
22
23
24
26
32
32
33
33
33
33
34
35
35
36
37
38
38
40
62
64
64
64
65
66

Aspectos Formais da Computao linguagem C


prof. Camillo Oliveira
12 Comandos de controle do fluxo de execuo ...........................................................................................
12.1 Comandos de seleo .............................................................................................................
12.1.1 Comando if .............................................................................................................
12.1.1.1 Eros mais comuns .................................................................................
12.1.1.2 Operador de seleo (? :) .....................................................................
12.1.2 Comando switch ....................................................................................................
12.1.3 Exerccios propostos ..............................................................................................
12.2 Comandos de repetio ...........................................................................................................
12.2.1 Comando while ......................................................................................................
12.2.2 Comando do - while ..............................................................................................
12.2.3 Comando for ..........................................................................................................
12.3 Comandos de desvios incondicionais ......................................................................................
12.3.1 Comando break .....................................................................................................
12.3.2 Comando continue ................................................................................................
12.4 Exerccios propostos ...............................................................................................................
12.4.1 Sries .....................................................................................................................
12.4.1.1 Respostas dos exerccios sobre sries .................................................
12.4.2 Vetores ...................................................................................................................
12.4.3 Matrizes ..................................................................................................................
12.4.4 Exerccios gerais sobre repeties .........................................................................
13 Funes ....................................................................................................................................................
13.1 Passagem de parmetros por valor .........................................................................................
13.2 Passagem de parmetros por referncia ................................................................................
13.3 Chamando funes, passando e retornando estruturas ..........................................................
13.4 Chamando funes, passando um vetor como parmetro ......................................................
13.5 Chamando funes, passando uma matriz como parmetro ..................................................
14 Alocao dinmica de memria ................................................................................................................
15 Exerccios propostos .................................................................................................................................
15.1 Strings ......................................................................................................................................
15.2 Operadores de bits ..................................................................................................................
16 Arquivos ....................................................................................................................................................
16.1 Representao de registros .....................................................................................................
16.2 Fluxos e arquivos .....................................................................................................................
16.3 fopen(...) ..................................................................................................................................
16.4 fread(...) ...................................................................................................................................
16.5 fwrite(...) ...................................................................................................................................
16.6 fclose(...) ..................................................................................................................................
16.7 ftell(...) ......................................................................................................................................
16.8 fseek(...) ...................................................................................................................................
16.9 feof(...) .....................................................................................................................................
16.10 fgets(...) e fputs(...) ................................................................................................................
16.11 Exerccios propostos .............................................................................................................
17 Glossrio ...................................................................................................................................................
18 Bibliografia ................................................................................................................................................

pag. 4

69
69
69
75
76
78
79
82
82
83
85
88
88
88
89
89
90
91
92
95
97
99
99
102
104
107
109
110
110
115
121
121
122
124
124
125
126
126
127
128
128
130
134
136

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
1. INTRODUO
1.1 ORIGEM DA LINGUAGEM C
A linguagem C resultado de uma linguagem mais antiga chamada BCPL, que originou a
linguagem B (Ken Thompson), que por sua vez influenciou ao aparecimento da linguagem C (Dennis Ritchie),
nos laboratrios BELL em 1972, tornando-se a linguagem bsica do sistema operacional UNIX.
Por muito tempo, a linguagem C padro foi fornecida junto com o sistema operacional
UNIX. Com a popularidade dos microcomputadores, a linguagem C passou a ser usada com bastante
intensidade. Foi quando em 1983, um comit ANSI (AMERICAN NATIONAL STANDARDS INSTITUTE)
padronizou a linguagem C com 32 palavras chaves (27 originais e mais 5 incorporadas pelo comit). Para
efeito de comparao, a linguagem BASIC para o IBM-PC, possui 159 palavras chaves.
A linguagem C combina o controle e as estruturas de dados de uma linguagem de alto nvel
com a facilidade de trabalhar em equipamentos (mquinas) a um nvel associado e aproximado com a
linguagem de montagem (assembler). Possui uma sintaxe concisa bastante atrativa para os programadores,
sendo que os compiladores geram um cdigo objeto muito eficaz.
As linguagens de alto nvel, so linguagens ricas em tipos de dados. So os tipos de dados
que definem um conjunto de valores de uma varivel pode armazenar e o conjunto de operaes que podem
ser executados com esta varivel.
Linguagens de ALTO NVEL:
ADA
MODULA - 2
PASCAL
COBOL
FORTRAN
BASIC
VISUAL BASIC
Linguagem de MDIO NVEL:
C
MACRO ASSEMBLER
Linguagem de BAIXO NVEL:
ASSEMBLER
A linguagem C uma linguagem estruturada, que permite diversas estruturas de laos
(repeties) como: while, do - while e for.
A linguagem C suporta o conceito de bloco de cdigo, que um conjunto de instrues
entre chaves, Exemplo:
if (x < 10)
{
printf(Muito baixo, tente novamente\n);
scanf(%d,&x);
}
A linguagem C dita para programadores, ao contrrio de outras linguagem, as de ALTO
NVEL, o programador no necessita de conhecimento em informtica para program-las. A linguagem C foi
criada, influenciada e testada em campo por programadores profissionais. O resultado final que a
linguagem C d ao programador o que ele quer: poucas restries, poucas reclamaes, estruturas de
blocos, funes isoladas e um conjunto compacto de palavras chaves. Usando a linguagem C, um
programador pode conseguir aproximadamente a eficincia de cdigo de montagem (mquina, assembler).
No de admirar que a linguagem C seja tranqilamente a linguagem mais popular entre os programadores
profissionais.
pg. 5

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
O fato da linguagem C, freqentemente ser usada em lugar da linguagem Assembly o
fator mais importante para a sua popularidade entre os programadores. A linguagem Assembly usa uma
representao simblica do cdigo binrio real que o computador executa diretamente. Cada operao em
linguagem Assembly leva a uma tarefa simples a ser executada pelo computador. Embora a linguagem
Assembly d aos programadores o potencial de realizar tarefas com mxima flexibilidade e eficincia,
notoriamente difcil de trabalhar quando se est desenvolvendo ou depurando um programa. Alm disso,
como a linguagem Assembly no uma linguagem estruturada, o programa final tende a ser um emaranhado
de jumps, calls e ndices (desvios). Essa falta de estrutura torna os programas em linguagem Assembly
difceis de ler, aperfeioar e fazer manutenes necessrias a qualquer programa de computador. Talvez
mais importantes: as rotinas em linguagem Assembly no so portveis entre mquinas com unidades
centrais de processamento (UCPs) diferentes.

processador de texto
criar/modificar
(cdigo fonte)
pr
processador

biblioteca padro
arquivo de
cabealho

compilao
erro de compilao
biblioteca padro
linker
dados do programa
erro de linker
entrada
programa executvel
depurador
(debugger)
erros de execuo
sada

resultados do
programa

Digrama mostra a seqncia de eventos necessrios para a implementao de um programa em linguagem C.


Processador de texto - usado para criar o texto do programa (cdigo fonte) ou modificar
o texto j existente.
Pr processadores - o programa inicia com o pr processamento de diretivas que ativam
substituio de macros, compilaes condicionais e a incluso de outros arquivos textos (cdigo fonte) no
programa. Exemplo: arquivos de cabealho (header files) que suprem detalhes sobre funes das bibliotecas.
O pr processador l um arquivo texto (cdigo fonte), expande alguma macro, incluir algum arquivo de
cabealho (header files) e escreve o resultado para um arquivo texto intermedirio que lido pelo compilador.
Compilador - o compilador converte o arquivo gerado pelo pr processador em um cdigo
objeto, que contm cdigo executvel de mquina, mais informaes para o linker. Exemplo: detalhes de
funes padres requeridas. Alguns compiladores podem gerar uma listagem combinada entre o compilador
e o assembler, que apresenta o cdigo original do C e as sentenas em linguagem assembler.
Linker - Exceto para programas muito especialistas (programas embutidos), a maioria dos
programas requer funes da biblioteca padro. O linkeditor junta os arquivos de cdigo objeto, bibliotecas
padro e outros arquivos gerados pelo usurio, para formar o arquivo executvel (em cdigo de mquina
para ser executado sob o sistema operacional.
pg. 6

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Execuo do programa - O usurio atravs do prompt do sistema operacional, pode
executar o programa. Durante a execuo do programa, dados podem ser entrados via teclado e ou arquivos
e resultados podem sair para o monitor de vdeo, arquivos e ou impressoras.
Depuradores (debugger) - muitos ambientes de programao possuem um depurador
automtico que ajuda na deteco e correo de erros de compilao, de linkedio (juno), erros de
execuo e erros de lgica de programao, estes dois ltimos erros s aparecem durante a execuo do
programa. Nestes depuradores, pontos de quebra podem ser inseridos (significa que voc pode executar o
programa at o ponto marcado como quebra), examinar o contedo de variveis etc. Quando o programa
trabalha corretamente (foi corretamente implementado), o depurador no mais necessrio e o programa
roda (executa) por si s.
Os depuradores geralmente so interpretadores. Um interpretador executa o cdigo fonte
uma linha por vez, executando instruo especfica contida nessa linha. Por isso um programa interpretado
mais lento que o compilado.
Um ambiente integrado de desenvolvimento contm um processador de texto, habilitando o
programador a escrever o cdigo fonte e pressionando uma tecla pr definida ou o boto do mouse, ativa o
processo de compilao e linkedio. Se, em tempo de compilao e ou linkedio, ocorrer erros, o programa
para a compilao e mostra as mensagens de erro e o usurio deve corrigi-las. Se a compilao e a
linkedio completar e sem erros, o programa executvel foi gerado podendo ser executado dentro do
ambiente (sob o controle do depurador) ou fora, direto no sistema operacional.
Um erro pode ocorrer:
durante a compilao (em tempo de compilao): erro de sintaxe, que indica que o programa no est
escrito conforme as regras da linguagem, exemplo: a estrutura de uma sentena est incorreta (erro de
sintaxe).
durante a linkedio (em tempo de linkedio): mltiplas definies de uma referncia (duas funes com o
mesmo nome) ou uma referncia indefinida (uma funo chamada no programa e no encontrada).
durante a execuo (em tempo de execuo): o programa aborta com um erro de run time (diviso por zero)
ou no faz o que deve ser feito (resultado incorreto).
1.2 ESQUELETO DE UM PROGRAMA EM LINGUAGEM C
/* declarao das variveis globais */
void main()
{
/* incio de bloco */
/* declarao das variveis */
}

/* seqncia de comando e funes */


/* final de bloco */

Sempre um programa ou um conjunto de programas em linguagem C, deve ter uma nica


funo main. Sempre aparecer um destes prottipos: void main(), void main(void), int main(), int
main(void), main() ou main(void). Exemplo de um programa bem simples seria:
Para exemplificar os processos descritos anteriormente, observe o cdigo abaixo:
#include <stdio.h>

// pr processador de diretivas

void main()
// cabealho (header) da funo main
{
// incio do bloco de cdigo da funo main
puts(Engenharia de computao . . . );
}
// final do bloco de cdigo da funo main.
pg. 7

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
1.3 MAPA DE MEMRIA EM C
Um programa compilado em linguagem C, cria e usa quatro regies, que so: rea de
cdigo, rea de dados, heap e pilha.
A pilha tem diversos usos durante a execuo de seu programa. Ela possui o endereo de
retorno das chamadas de funes, argumentos para as funes e variveis locais, tambm guarda o estado
atual da UCP (unidade central de processamento).
O heap uma regio de memria livre, que seu programa pode usar nas funes de
alocaes dinmicas em linguagem C, em aplicaes como listas encadeadas e rvores.
As reas do heap e pilha so ditas reas dinmicas, por que so utilizadas (manipuladas)
durante a execuo do programa (em tempo de execuo).
A disposio exata do programa pode variar de compilador para compilador e de ambiente
para ambiente. Por isso dado um modelo conceitual da memria.

PILHA

HEAP

DADOS

CDIGO

2. TIPOS BSICOS
Na linguagem C existem cinco tipos de dados, que so: caractere (char), inteiro (int), ponto
flutuante (float), ponto flutuante de preciso dupla (double) e sem valor (void). Veremos que todos os outros
tipos de dados so baseados em um desses tipos. O tamanho e a faixa desses tipos de dados variam de
acordo com o tipo de processador e com a implementao do compilador C. O padro ANSI estipula apenas
a faixa mnima de cada tipo de dado e no o seu tamanho em bytes.
O formato exato de valores em ponto flutuante depende de como esto implementados.
Inteiros geralmente correspondem ao tamanho natural da palavra do computador hospedeiro. Valores
caracteres so geralmente usados para conter valores definidos pelo conjunto de caracteres ASCII
(AMERICAN NATIONAL STANDARD CODE for INFORMATION INTERCHANGE). Os valores fora desta
faixa podem ser manipulados diferentemente entre as implementaes em C.
Um programa de computador manipula dados, os dados tem que ser armazenados em
algum lugar. Este lugar chamado de memria. Qualquer linguagem de programao deve oferecer meios
de acesso memria, ou seja, um meio de reservar um pedao da memria e um meio de identificar (dar um
nome) a este pedao que foi reservado de memria.
A declarao de uma varivel, reserva um espao na memria onde ser guardado um tipo
de dado especificado.
O tipo do dado informa ao compilador quanto de espao de memria necessrio para
armazenar aquele tipo de dado e como o dado deve ser manipulado. Por exemplo: para o computador e
muito diferente a soma de dois nmeros inteiros e dois nmeros reais.
pg. 8

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Na linguagem C a declarao de variveis obedece a seguinte sintaxe:
[modificador] tipo identificador;
[modificador] tipo identificador 1, identificador 2, . . . ;
Os tipos bsicos da linguagem C so: char (caractere), int (inteiro), float (real), double
(real) e void (sem valor).
Os modificadores do tipo (opcional) so: signed (sinalizado, com sinal), unsigned (no
sinalizado, sem sinal), long (longo) e short (curto). Os modificadores so opcionais na declarao da
varivel. Exceto o tipo void, os demais tipos de dados bsicos podem ter vrios modificadores precedendoos. Um modificador usado para alterar o significado de um tipo bsico para adapt-lo mais precisamente s
necessidades de diversas situaes.
Os modificadores signed, short, long e unsigned podem ser aplicados aos tipos bsicos
caractere e inteiro. O modificador long tambm pode ser aplicado ao tipo bsico double. (Observe que o
padro ANSI elimina o long double porque ele tem o mesmo significado de um double.
O identificador uma seqncia de caracteres alfanumricos e o caracter _ (sublinhado). O
primeiro caracter da seqncia deve ser uma letra ou um sublinhado e os caracteres subseqentes devem
ser letras, nmeros ou sublinhados. O padro ANSI C define os nomes de variveis, funes, rtulos (labels)
e vrios outros objetos definidos pelo usurio como identificadores.
Exemplo:
Correto
contador
teste344
_ano
tempo_mdio

Incorreto
1contador
teste!344
%_ano
tempo...mdio

Exemplo de declaraes de variveis


float x, salrio, nota, media;
unsigned int ano;
char c, sexo;
double x1, y1, z1, razo, sal_inicial, sal_final;
A tabela a seguir mostra o tamanho e o intervalo numrico em uma arquitetura de 16 bits.
Tipo

Tamanho
Bytes
1

Bits
8

1
2

8
16

0 a 255
-32.768 a 32.767

2
2

16
16

0 a 65.535
-32.768 a 32.767

2
4

16
32

0 a 65.535
-2.147.483.648 a 2.147.483.647

4
4

32
32

double

64

long double

10

80

0 a 4.294.967.295
3.4E-38 a 3.4E+38
(7 dgitos de preciso)
1.7E-308 a 1.7E+308
(15 dgitos de preciso)
3.4E-4932 a 1.1E+4932

char
signed char
unsigned char
short int
signed short int
unsigned short int
int
signed int
unsigned int
long int
signed long int
unsigned long int
float

Intervalo
-128 a 127

pg. 9

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Para uma arquitetura de 32 bits, o que muda o tamanho do inteiro (int), que do tamanho
da palavra (32 bits). O short int passa a ser 16 bits e o long int 64 bits.
Obs. Vale lembrar que quando declaramos uma varivel, um espao (em bytes) na memria do computador
reservado para a varivel.
Obs. O padro ANSI determina que os identificadores podem ter qualquer tamanho, mas pelo menos os
primeiros seis caracteres devem ser significativos se o identificador estiver envolvido em um processo externo de
linkedio. So chamados ento de nome externos. Caso contrrio so chamados de nomes internos e os 31
primeiros caracteres so significativos. bom olhar o manual do usurio para ver exatamente quantos
caracteres significativos so permitidos pelo compilador que se est usando.
Obs. Letras maisculas e minsculas so tratadas diferentemente. Portanto ano, Ano, ANO so trs
identificadores distintos.
Obs. Um identificador no pode ser igual um palavra chave da linguagem C e no deve ter o mesmo nome que
as funes que voc escreveu ou as que esto na biblioteca.
3. OPERADOR DE ATRIBUIO
Na linguagem C, voc pode usar o operador de atribuio dentro de qualquer expresso
vlida em C. Isto no acontece com a maioria das linguagem de computador.
void main()
{
int a, b;
a = 2 + (b = 3);
}
Analise o programa acima e informe os valores das variveis a e b.
a = _________________ b = _________________
Quando quisermos atribuir um valor a uma determinada posio de memria utilizaremos o
smbolo =, que costumamos chamar de igual.
O operando a esquerda (lvalue) sempre se refere a uma posio de memria, o operando a
direita (rvalue) ser um valor.
A sintaxe seria: nome_da_varivel = expresso;
int a, b;
a = 5;
b = a;

// o valor 5 vai para a posio de memria da varivel a


// o valor armazenado na varivel a copiado para b

A atribuio de um valor inicial para uma varivel pode ser feita na mesma hora em que
feita a sua declarao.
unsigned long int x = 10, b = 200;
Para toda varivel global atribudo um valor inicial igual zero (nulo), o que no ocorre
com uma varivel local, que sempre possui sujeira da memria (um valor que no interessa, por isso
chamado de lixo).
a = b + 1 = c = 2 + 5; // erro, b + 1 retorna um valor, no um lvalue

pg. 10

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
4. CONSTANTES
Referem-se aos valores fixos que o programa no pode alterar. Estas constantes podem
ser de qualquer um dos cinco tipos de dados bsico.
4.1 CONSTANTES CARACTERES
So envolvidas por aspas simples. Um caractere entre apstrofos (aspas simples), a,
uma constante que tem o valor do cdigo ASCII que a representa.
unsigned char a = B; // a possui o valor do cdigo ASCII que representa (66).
char x = %; // x possui o valor do cdigo ASCII.
4.2 CONSTANTES INTEIRAS
Uma constante inteira representada com nmeros sem componentes fracionrios. O tipo
de uma constante inteira o menor tipo de dado capaz de armazen-la: int, unsigned int, long int,
unsigned long int. A menos que a varivel venha acompanhada de um sufixo que indique o seu tipo: U unsigned int, L- long int e UL - unsigned long int.
4.3 CONSTANTES COM PONTO FLUTUANTE (NMEROS REAIS)
Constantes com ponto flutuante requerem ponto decimal seguido pela parte fracionria do
nmero. Existem dois tipos bsicos de variveis com ponto flutuante: float e double. Podemos tambm
utilizar sufixos que indicam o seu tipo: F - float e L - long double.
Tipos de dados
int
long int
short int
unsigned int
float
double
long double

Exemplo de constantes
1 123 21000 -234
35000L -34L
10 -12 90
10000U 977U 40000U
123.23F 4.34e-3F 124.F 2e1
123.23 12312333. -0.9876432
101.2L

4.4 CONSTANTES HEXADECIMAIS E OCTAIS


Muitas vezes so utilizados variveis no sistema numrico na base 8 (octal) e na base 16
(hexadecimal). O sistema octal utiliza os dgitos 0 a 7 e o hexadecimal os dgitos 0 a 9 e as letras A, B, C, D,
E e F para representar os algarismos 10, 11, 12, 13, 14 e 15.
Uma constante hexadecimal deve consistir de um 0x seguido por uma constante na forma
hexadecimal. Uma constante octal com um 0 seguido por uma constante na forma octal.
int h = 0xF
int 0 = 012

/* 15 em decimal */
/* 10 em decimal */

4.5 CONSTANTES STRING


So constantes formadas por um conjunto de caracteres (bytes) entre aspas (aspas
duplas). Por exemplo PUC-Pr..
4.6 CONSTANTES CARACTERE DE BARRA INVERTIDA
So constantes especiais para os caracteres de controle como o return, line feed, beep e
etc.. Voc deve utilizar os cdigos de barra invertida em lugar de seu ASCII equivalente para aumentar a
portabilidade.

pg. 11

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira

Cdigo
\b
\f
\n
\r
\t
\
\
\0
\\
\v
\a
\N
\xN

Significado
Retrocesso (BS)
Alimentao de formulrio (FF)
Nova linha
Retorno de carro (CR)
Tabulao horizontal (HT)

Nulo
Barra invertida
Tabulao vertical
Alerta (beep)
Constante octal (onde N uma constante octal
Constante hexadecimal (onde N uma constante hexadecimal)

5. CONVERSO DE TIPOS
A converso de tipos refere-se situao em que variveis de um tipo so misturadas com
variveis de outro tipo. Em um comando de atribuio, a regra de converso de tipos muito simples: o valor
do lado direito (o lado da expresso) de uma atribuio convertido no tipo do dado esquerdo (a
varivel destino).
Quando se converte de inteiros para caracteres, inteiros longos para inteiros, a regra bsica
que a quantidade apropriada de bits significativos ser ignorada. Isso significa que 8 bits so perdidos
quando se vai de inteiro para caractere ou inteiro curto, e 16 bits so perdidos quando se vai de um inteiro
longo para um inteiro.
A converso de um int em um float ou float em double etc. no aumenta a preciso ou
exatido. Esses tipos de converso apenas mudam a forma em que o valor representado.
Tipos destino
char
char
char
char
char
int
int
int
int
float
double

Tipo da expresso
unsigned char
int
unsigned int
long int
unsigned long int
long int
unsigned long int
float
double
double
long double

Possvel informao perdida


Se valor > 127, o destino negativo
Os 8 bits mais significativos
Os 8 bits mais significativos
Os 24 bits mais significativos
Os 24 bits mais significativos
Os 16 bits mais significativos
Os 16 bits mais significativos
A parte fracionria e as vezes mais
A parte fracionria e as vezes mais
Preciso, o resultado arredondado
Preciso, o resultado arredondado

pg. 12

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
5.1 EXERCCIOS PROPOSTOS
1. Dado o programa
void main()
{
char x, a;
unsigned char b;
int y, z;
unsigned long int w;
x = 0x7F;
w = 65535U;
y = 1439;
x = x + 1;
a = b = y;
z = w;
}
Analise o programa anterior e informe o contedo das variveis x, y, z, a, b e w, quando a execuo do
programa estiver na linha 14. (d o resultados em valores na base 10)
x = __________ y = __________ z = __________
a = __________ b = __________ w = __________
2. Analise o programa que segue, executando-o at a linha 10 e explique o contedo das variveis x, y e z.
void main()
{
double x;
float y;
int z;
x = 2.1234567890123456789012345;
y = x;
z = y;
}
x = __________ y = __________ z = __________
Justifique a resposta:
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
3. Analise o programa que segue, informe e justifique o contedo das variveis a e b, quando a execuo do
programa estiver na linha 8.
void main()
{
char a;
int b;
a = 66;
b = B;
}
pg. 13

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
a = ____________

b = ____________

Justifique a resposta (analise a tabela ASCII):


___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
4. Analise o programa que segue, informe o contedo das variveis r, s, t, u e v, quando a execuo do
programa estiver na linha 14. Sugesto: observe as variveis no watch em hexadecimal.
void main()
{
unsgined long int r;
int s;
unsigned int t;
char u;
unsigned char v;
r = 0x12345678L;
s = r;
t = r;
u = r;
v = r;
}
r = __________ s = __________ t = __________
u = __________ v = __________
6. OPERADORES
A linguagem C rica em operadores internos. A linguagem C d mais nfase aos
operadores que a maioria das outras linguagens de computador. Na linguagem C podemos definir
operadores: aritmticos, relacionais, lgicos e de bits. Alm disso outros operadores utilizados para tarefas
particulares.
Os operadores geram dados intermedirios, que podem ser utilizados.
6.1 OPERADORES ARITMTICOS
Operadores aritmticos
Subtrao, tambm menos unrio
+
Adio
*
Multiplicao
/
Diviso
%
Mdulo da diviso (resto)
-Decremento
++
Incremento

pg. 14

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Exemplo:
void main()
{
int a, b;
a = 5 / 2;
b = -a;
}
Quando o operador / (diviso) for utilizado a um inteiro ou caractere, qualquer resto
truncado. Por isso na linha 5, aps a sua execuo, o valor armazenado na varivel a ser o valor 2, visto
que uma diviso de inteiros (no suporta parte fracionria).
O menos unrio (linha 6) multiplica seu nico operando por -1. Isso , qualquer nmero
precedido por um sinal de menos troca-se o sinal. Portanto o valor armazenado na varivel b na linha 6 seria
o valor -2.
6.1.1 INCREMENTO E DECREMENTO
A linguagem C possui dois operadores teis geralmente no encontrados em outras
linguagens. So os operadores de incremento e decremento, ++ e --. O operador ++ soma 1 ao seu
operando, e -- subtrai 1.
x = x + 1;
// o mesmo que ++x ou x++;
x = x - 1;// o mesmo que --x ou x--;
Os dois tipos de operadores de incremento e decremento podem ser utilizados como
prefixo ou sufixo do operando (++c, c++, --y, y--).
Os operadores de incremento e decremento operam sobre um lvalue e retornam ao valor
armazenado na varivel.
Exemplo:
void main()
{
int c, a;
a = 5;
c = ++a; // incrementa a em 1 e atribui o valor de a para a
de memria c
++a++; // erro pois o resultado intermedirio gerado por ++a
lvalue. No pode ser usado
// como
incremento.
}

//
operando

posio

// um valor, no um
para o operador de

Exemplo:
void main()
{
int a, b, c, d, x = 10, y = 5;
a = x++;
b = ++x;
c = --y;
d = y--;
}

pg. 15

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Analisando o programa anterior, notamos que na linguagem C, valores podem ser
atribudos as variveis na hora da declarao das mesmas (linha 3). Assim para as variveis x e y so
atribudos os valores iniciais de 10 e 5 respectivamente.
Quando um operador de incremento ou decremento precede seu operando, C executa a
operao de incremento ou decremento antes de usar o valor do operando. Se o operador estiver aps seu
operando, C usa o valor do operando antes de increment-lo ou decrement-lo.
Fazendo um teste de mesa para o programa anterior teramos:
a
10

b
12

c
4

d
4

x
10
11
12

y
5
4
3

A precedncia dos operadores aritmticos seria:


++ -* / %
+ Os operadores do mesmo nvel de precedncia so avaliados pelo computador da
esquerda para a direita. Obviamente, parnteses podem ser usados para alterar a ordem de avaliao. A
linguagem C trata os parnteses da mesma forma que todas as outras linguagens de programao.
Parnteses foram uma operao, ou um conjunto de operaes, a ter um nvel de precedncia maior.
6.1.2 EXPRESSES ARITMTICAS
So expresses onde os operandos podem ser constantes e ou variveis e os operadores
so aritmticos.
Exemplo:
void main()
{
int cnt, acm, ind1, ind2;
cnt = 100;
acm = 100 + cnt;
ind1 = acm + cnt++;
ind2 = acm + ++cnt;
cnt = --ind1 + 1000;
}
Mostrando o teste de mesa do programa acima temos os seguintes valores atribudos para
as variveis ao longo da execuo do programa.
cnt
100
101
102
1299

acm
200

ind1
300
299

ind2
302

pg. 16

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
O programa anterior poderia ser escrito da seguinte maneira:
void main()
{
int cnt, acm, ind1, ind2;
cnt = 100;
acm = 100 + cnt;
ind1 = acm + cnt;
cnt++;
++cnt;
ind2 = acm + cnt;
--ind1;
cnt = ind1 + 1000;
}
OBS. Sempre que tivermos dvidas com operadores ++ e ou --, uma boa ttica explodirmos
(expandrmos) a expresso em mais linhas de cdigo, de modo que consigamos observar melhor a
seqncia de operaes a serem feitas.
6.2 OPERADORES LGICOS E RELACIONAIS
6.2.1 OPERADORES LGICOS
Operador
&&
||
!

Ao
and
or
not

Conjuno
Disjuno
negao

6.2.1.1 TABELAS VERDADE

1
1
0
0

&&
1
0
1
0

1
0
0
0

1
1
0
0

||
1
0
1
0

1
1
1
0

!
1
0

0
1

Perceba que no temos o operador lgico xor na linguagem C, ento, devemos obt-lo a
partir de uma expresso lgica utilizando and, or ou not.
6.2.2 OPERADORES RELACIONAIS
Operador
>
>=
<
<=
==
!=

Ao
maior que
maior ou igual
menor que
menor ou igual
igual
diferente

O importante, nos operadores lgicos e relacionais, que estes so utilizados em


expresses lgicas e o resultado de uma expresso lgica 0 (falso) ou 1 (verdadeiro).
As precedncias entre os operadores lgicos e relacionais seriam:
!
> >= < <=
== !=
&&
||
pg. 17

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
6.2.3 EXPRESSES LGICAS
So expresses onde os operando so constantes e ou variveis e os operadores so
lgicos e ou relacionais. O resultado de uma expresso lgica sempre 1 (um) para verdadeiro ou 0 (zero)
para falso.
As expresses lgicas sero utilizadas nos comandos de seleo (if) e repetio (while, do
while, for), estas expresses que controlaro o fluxo de execuo do programa atravs dos comandos.
Mais na frente veremos com mais detalhes estes comandos.
Exemplos de expresses lgicas:
Altura < 1.80 && Peso < 100
(x < 10 && y > 10) && z == 10
Salrio < 2000.00 || Horas > 40
6.3 OPERADORES DE BITS
Ao contrrio de muitas linguagens, a linguagem C suporta um completo conjunto de
operadores de bits. Uma vez que C foi projetada para substituir a linguagem assembly na maioria das tarefas
de programao, era importante dar suporte as operaes que podem ser feitas em linguagem assembly.
Operaes com bits consistem em testar, atribuir ou deslocar os bits efetivos em um byte ou palavra, que
correspondem aos tipos char, int ou variantes do padro C. Operaes com bits no podem ser usadas em
float, double, long double, void ou outros tipos mais complexos.
Os operadores de bits so:
Operador
&
|
^
~
>>
<<

Ao
and
or
xor
complemento
deslocamento.
direita
deslocamento
esquerda

para

para

Os operadores de bits encontram aplicaes mais freqentemente em drivers de


dispositivos - como em programas de modems, rotinas de arquivos em disco e rotinas de impressoras. porque as operaes com bits mascaram certos bits.
Para ligar um determinado bit, ou seja, torn-lo 1, utiliza-se o operador |. Na seqncia
temos um exemplo que ilustra
0000000000011000001
0001000000010100000 |
0001000000011100001
Para desligar um bit, ou seja, torn-lo 0 (zero), utiliza-se o operador &. Na seqncia temos
um exemplo para desligar um bit.
0100100000011000001
1111011111111111111 &
0100000000011000001
O operador ^ geralmente utilizado para inverter o estado de um bit.
0100100000011000001
0000100000000000000
0100000000011000001

^
pg. 18

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
O operador de complemento ~, inverte o estado de cada bit da varivel especificada. Ou
seja, todo 1 vira 0 e todo 0 vira 1.
Os operadores de bits so usados freqentemente em rotinas de criptografia. Se voc
deseja fazer um arquivo em disco parecer ilegvel, realize algumas manipulaes de bits no arquivo. Um dos
mtodos mais simples complementar cada byte usando o complemento de um para inverter cada bit no
byte. Veja o exemplo que segue:
0100100010011011001
1011011101100100110
0100100010011011001

~
1 complemento
2 complemento

Para finalizar os operadores de bits, temos os deslocamento de bit para a direita (>>) e para
a esquerda (<<).
Suponha x ser uma varivel do tipo unsigned char.
Antes
X=7
X <<= 1
X <<= 3
X <<= 2
X >>= 1
X >>= 2

0
000
00001

Ao
00000111
00001110
01110000
11000000
01100000
00011000

0
00

Depois
7
14
112
192
96
24

Quando temos: x <<= 1;, o mesmo que x = x << 1;, ou seja, os bits de x sero
deslocados para a esquerda em 1 e o resultado do deslocamento atribudo na varivel x. Este tipo de
notao vale para todos os operadores de bits.
Vale a pena observar que o deslocamento em 1 para a esquerda, voc multiplica o nmero
por 2 e o deslocamento em 1 para a direita o mesmo que dividir o nmero por 2.
6.4 PRECEDNCIA DOS OPERADORES
Precedncia
Mais alta
15
15
14
14
13
12
11
10
9
8
7
6
5
4
3
2
mais baixa
1

unrio
unrio
unrio
multiplicativo.
aditivo
deslocamento
relacional
igualdade
bit a bit AND
bit a bit XOR
bit a bit OR
lgico AND
lgico OR
condicional
atribuio
seqncia

Operadores
.
->
()
[]
lvalue++ lvalue-! ~ + - ++lvalue --lvalue
(typecast)
sizeof
*
/
%
+
<<
>>
<
<=
>
>=
==
!=
&
^
|
&&
||
?:
= *= /= %= += -= >>= <<= &= ^= |=
,

Associatividade
esquerda para direita
direita para esquerda
direita para esquerda
direita para esquerda
esquerda para direita
esquerda para direita
esquerda para direita
esquerda para direita
esquerda para direita
esquerda para direita
esquerda para direita
esquerda para direita
esquerda para direita
esquerda para direita
direita para esquerda
direita para esquerda
esquerda para direita

Obs. Vale lembrar que parnteses e colchetes afetam a ordem de avaliao da expresso.

pg. 19

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
6.5 ABREVIAES (ABREVIATURAS) NA LINGUAGEM C
A linguagem C oferece abreviaes (abreviaturas) que simplificam a codificao de certos
tipos de comandos de atribuio.
x = x + 10;
Significa pegar o contedo da varivel x, somar dez (10) e atribuir o resultado na varivel x.
Isto poderia ser escrito de outra forma, produzindo o mesmo resultado, que seria:
x += 10;
O compilador entende atribuir varivel x o valor da varivel x mais 10, que mesmo
resultado produzido anteriormente.
Esta mesma idia vale para os operadores de bits e matemticos, como segue:
Forma
abreviada
x += 3;
x -= 4;
x /= 10;
x %= 2;
x *= 5.6;
x &= 2;
x |= 5;
x ^= 2;
x <<= 3;
x >>= 2;

Forma no
abreviada
x = x + 3;
x = x - 4;
x = x / 10;
x = x % 2;
x = x * 5.6
x = x & 2;
x = x | 5;
x = x ^2;
x = x << 3;
x = x >> 2

importante saber sobre as abreviaes (abreviaturas), visto que nos livros e programas
feitos por programadores profissionais, voc sempre ir encontrar a forma abreviada.
7. VARIVEIS COMPOSTAS HOMOGNEAS
Do mesmo modo que na teoria de conjuntos, uma varivel pode ser interpretada como um
elemento e uma estrutura de dados como um conjunto. Quando uma determinada estrutura de dados for
composta de variveis com o mesmo tipo primitivo, temos um conjunto homogneo de dados.
7.1 VARIVEIS COMPOSTAS UNIDIMENSIONAIS (VETORES)
Para entendermos variveis compostas unidimensionais, imaginemos um edifcio com um
nmero finito de andares, representando uma estrutura de dados, e seus andares, parties dessa estrutura.
Visto que os andares so uma segmentao direta do prdio, estes compem ento o que chamado de
estrutura unidimensional (uma dimenso).
Um vetor uma coleo de variveis do mesmo tipo que so referenciadas por um nome
comum. Na linguagem C, todos os vetores consistem em localizaes contguas de memria.
A declarao de um vetor seria:
[modificador] tipo identificador[tamanho];
Obs. Os colchetes do identificador, delimitando o tamanho do vetor, no so opcionais.

pg. 20

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
unsigned int vet[8];
0

void main()
{
int v[5];
v[0] = 2;
v[1] = 10;
v[2] = v[0] + 5 * v[1];
v[4] = v[2] - 8 / v[0];
v[3] = v[1];
}
Mostrando o teste de mesa do programa acima temos:
v[0]
2

v[1]
10

v[2]
52

v[3]
10

v[4]
48

5 * v[1]
50

8 / v[0]
4

O programa abaixo mostra que: os ndices de um vetor pode ser uma varivel ou uma
expresso. Note que o operador ++ est depois do operando i (sufixo). Analise os valores finais das
variveis.
void main(void)
{
int v[5], i;
i = 0;
v[i++] = 0x2;
v[i++] = 10;
v[i++] = v[0] + 5 * v[1];
v[i++] = v[2] - 8 / v[0];
v[i++] = v[1];
}
O programa abaixo possui um erro de programao que ocorrer em tempo de execuo.
Qual o erro que o programa tem? Faa um teste de mesa e justifique a sua resposta.
void main(void)
{
int v[5], i;
i = 0;
v[++i] = 0x2;
v[++i] = 10;
v[++i] = v[0] + 5 * v[1];
v[++i] = v[2] - 8 / v[0];
v[++i] = v[1];
}
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

pg. 21

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
7.1.1 INICIALIZAO DE VETORES
Um vetor pode ser inicializado logo aps a sua declarao, como segue:
unsigned long int v[4] = {100,1234,1200,1233};
0
100

1
1234

2
1200

3
1233

float b[4] = {2.4,124,2e1,3E-5};


0
2.4

1
124

2
2e1

3
3E-5

double tipos[4] = {-0.02,1.24,3,-5.6};


0
-0.02

1
1.24

2
3

3
-5.6

Ao inicializarmos um vetor de caracteres, temos:


char nome[14] = Computao;
0
C

1
o

2
m

3
p

4
u

5
t

6
a

9
o

10
\0

11

12

13

14

5
t

6
a

9
o

10

11

12

13

14

6
\0

10

11

12

13

14

char nome[10] = Computao;


0
C

1
o

2
m

3
p

4
u

unsigned char x[7] = PUC-PR;


0
P

1
U

2
C

3
-

4
P

5
R

unsigned char y[9] = {P, U , C , - , P , R, \0};


0
P

1
U

2
C

3
-

4
P

5
R

6
\0

10

11

12

13

14

10

11

12

13

14

char var[5] = P;
0
P

1
\0

pg. 22

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Faa um teste de mesa e explique o contedo da varivel str, quando a execuo do
programa estiver na linha 10.
1.
2.
3.
4.

void main()
{
int x;
unsigned char str[16] = ASPECTOS;

5.
6.
7.
8.
9.
10. }

x = 040;
str[0] ^= x;
str[1] ^= x;
str[2] ^= x;
str[3] ^= x;
str = ____________________
Justifique a resposta (observe a tabela de cdigos ASCII):
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

OBSERVAES SOBRE VETORES


O clculo do tamanho em bytes de um vetor est diretamente em funo do seu tamanho e o tipo bsico. Que
seria: total em bytes = tamanho do tipo * tamanho do vetor.
Na linguagem C no existe uma verificao dos limites dos vetores. Pode-se ultrapassar os limites e escrever
dados no lugar de outra varivel ou mesmo no cdigo do programa. responsabilidade do programador prover
verificao dos limites onde for necessrio, de modo nunca invadir espao na memria, de uma outra varivel.
7.2 VARIVEIS COMPOSTAS MULTIDIMENSIONAIS (MATRIZES)
Ainda no exemplo do edifcio, suponha que alm do acesso pelo elevador at um
determinado andar, tenhamos tambm a diviso do andar em apartamentos. Para chegar a algum deles no
basta s o nmero do andar, precisamos tambm do nmero do apartamento.
As estruturas compostas unidimensionais tem como principal caracterstica a necessidade
de apenas um ndice para o endereamento - so estrutura com uma nica dimenso. Uma estrutura que
precise de mais de um ndice, como no caso do edifcio dividido em apartamentos, seria ento denominada
estrutura composta multidimensional (neste caso duas dimenses (bidimensional)).
Imagine um conjunto de trs prdios de apartamentos. Teramos uma estrutura homognea
tridimensional, com trs ndices. Para chegarmos ao apartamento desejado, os ndices seriam: o nmero do
prdio, o andar e o nmero do apartamento.
Dependendo do problema que se tem para resolver, podemos pensar na estrutura
multidimensional que quisermos.
A declarao de uma matriz seria:
[modificador] tipo identificador[num. de linhas][num. de colunas];
Quando declaramos uma matriz, um espao, em bytes, reservado na memria e a matriz
se encontra linearmente a partir de um endereo base.

pg. 23

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Exemplo:
double m[5][5];
0

0
1
2
3
4
7.2.1 INICIALIZAO DE MATRIZES
Podemos inicializarmos uma matriz logo aps a sua declarao, como segue:
unsigned long int v[2][2] = {{1000,1234},{1200,1233}};
0
1000
1200

0
1

1
1234
1233

float b[3][2] = {{2.4,124},{2e1,3E-5},{-0.11,2.}};


1
2.4
2e1
-0.11

0
1
2

2
124
3E-5
2.

double matriz[2][10] ={{1,1,1,1,1,1,1,1,1,1},{2,2,2,2,2,2,2,2,2,2}};


0
1.0
2.0

0
1

1
1.0
2.0

2
1.0
2.0

3
1.0
2.0

4
1.0
2.0

5
1.0
2.0

6
1.0
2.0

7
1.0
2.0

8
1.0
2.0

9
1.0
2.0

Exemplo:
1. void main()
2. {
3.
int x, y;
4.
double m[3][4] = {{0,0,0,0},{0,0,0,0},{0,0,0,0}};
5.
6.
x = 2;
7.
y = 3;
8.
m[0][0] = 10;
9.
m[2][1] = 4.34 + m[x - 2][y - 3];
10.
m[x][x] = 3.e-3;
11.
m[x][y] = 100.01;
12. }
Teramos a seguinte matriz quando a execuo do programa estivesse na linha 12.

0
1
2

0
10.0
0.0
0.0

1
0.0
3.e-3
14.34

2
0.0
0.0
3.e-3

3
0.0
0.0
100.01

pg. 24

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
char Nomes[3][15] = {Carla,Manoel,Maria};
0
0 C
1 M
2 M

1
a
a
a

2
r
n
r

3
l
o
i

4
a
e
a

5
\0
l
\0

10 11 12 13 14

\0

Podem existir aplicaes que utilizem matrizes que possuam mais que duas dimenses.
Um exemplo seria:
int m[3][2][4] = {{{4,4,4,4},{4,4,4,4}},{{5,5,5,5},{5,5,5,5}},{{6,6,6,6},{6,6,6,6}}};
Esquematicamente ficaria:
2 5666
1 5555 6
0 4444 5
4444
OBSERVAES SOBRE MATRIZES
O clculo do tamanho em bytes de uma matriz est diretamente relacionado com o seu tamanho e o tipo bsico.
Que seria: total em bytes = tamanho do tipo * nmero de linhas * nmero de colunas.
Na linguagem C no existe uma verificao dos limites das matrizes. Pode-se ultrapassar os limites e escrever
dados no lugar de outra varivel ou mesmo no cdigo do programa. responsabilidade do programador prover
verificao dos limites onde for necessrio, de modo nunca invadir o espao na memria, de uma outra varivel.

pg. 25

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
7.3 EXERCCIOS PROPOSTOS
1. Analise o programa abaixo, informando o contedo das variveis a e b, quando a execuo estiver na linha
11.
1.
2.
3.
4.

void main()
{
unsigned int a;
unsigned int b;

5.
6.
7.
8.
9.
10.
11. }

a = 0x9129;
b = 0x8218;
a >>= 4;
a &= 0x00FF;
b >>= 4;
b &= 0x00FF;
a = ___________

b = ___________

2. Analise o cdigo que segue e informe o contedo das variveis a e b, quando a execuo estiver na linha
9.
1.
2.
3.
4.
5.
6.
7.
8.
9.

void main()
{
unsigned char a[3];
char b[3] = {0x80,0x09,0xB0};
a[0] = b[0];
b[1] = ~b[1];
a[1] = b[1];
a[2] = b[2];
}
a = __________________b = __________________

3. Analise o programa abaixo, informando o contedo das variveis a, b e c, quando a execuo estiver na
linha 15.
1.
2.
3.
4.

void main()
{
unsigned char a[5];
char b[5];

5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15. }

c = 0x3FF;
a[0] = b[0] = c;
c <<= 1;
a[1] = b[1] = c;
c ^= 0x80;
a[2] = b[2] = c;
c >>= 4;
a[3] = b[3] = c;
c |= 0x90;
a[4] = b[4] = c;
a = __________________b = __________________c = _____

pg. 26

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
4. Dado o cdigo:
1.
2.
3.
4.
5.
6.
7.
8.
9.

void main()
{
unsigned char a;
char b;
unsigned int c;
int d;
a = b = c = d = 0x0FF;
c = d |= 0x8000;
}
Qual o contedo das variveis a, b, c e d, quando a execuo do programa estiver na linha 9.
a = ___________

b = ___________

c = ___________

d = ___________

5. Analise o cdigo abaixo e informe o contedo da varivel v, quando a execuo estiver na linha 9.
1.
2.
3.
4.
5.
6.
7.
8.
9.

void main(void)
{
int v[4], v1, v2;
v1 = v2 = 1;
v[0] = 0xF & 032 + 1;
v[1] = 2 * 0x80 + 02;
v[2] = 1 + v2 * 2 >= v1 + 3 && v1;
v[3] = (1 + v2) * 2 >= v1 + 3 && v1;
}

6. Analise o programa abaixo e fazendo um teste de mesa e informe o contedo da varivel mat, i e j, quando
a execuo do programa estiver na linha 12.
1.
2.
3.
4.

void main()
{
int m[2][2];
unsigned int i, j;

5.
6.
7.
8.
9.
10.
11.
12. }

m[0][0] = 1;
m[0][1] = m[1][0] = m[1][1] = 0;
i = j = 1;
m[0][0] += 10;
m[0][j] = m[i - 1][j - 1] + 10;
m[i][0] = m[0][j] * (m[0][0] - 1);
m[i][j] = m[0][0] - m[0][1] - m[1][0];
Teste de mesa
m[0][0]

m[0][1]

m[1][0]

m[1][1]

m = _______________________ i = _____

j = _____

pg. 27

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
7. Analise o programa abaixo e informe o contedo da varivel s, quando a execuo do programa estiver na
linha 7. Sugesto: utilize uma tabela de cdigos ASCII para verificar o valor do caracteres e vice versa.
1.
2.
3.
4.
5.
6.
7.

void main()
{
char s[5] = Puc;
s[0] = ~s[0];
s[1] = ~s[1];
s[2] = ~s[2];
}
s = _________________

8. Analise o programa abaixo e informe o contedo das variveis x e y, quando a execuo do programa
estiver na linha 16.
1.
2.
3.
4.
5.
6.

void main()
{
unsigned int n;
char y[4];
unsigned char x[4];
unsigned long int a;

7.
8.
9.
10.
11.
12.
13.
14.
15.
16. }

n = 1;
n %= 8;
n++;
a = 0xFFEEDDCCUL;
x[0] = y[0] = n | a;
x[1] = y[1] = a >> (n * 2);
x[2] = y[2] = a >> (n * 4);
x[3] = y[3] = a >> (n * 6);
x[1] ^= y[2] ^= 0x80;
x = ___________________

y = ___________________

9. Analise o cdigo abaixo e informe o contedo das variveis x, y, z e w, quando a execuo do programa
estiver na linha 13.
1.
2.
3.
4.
5.

void main()
{
unsigned int n;
unsigned char x, w;
char y, z;

6.
7.
8.
9.
10.
11.
12.
13. }

n = 0x000A;
x = 0xFFF0;
z = 0x007F;
x += (n % 0x0A);
y = x;
y += y;
w = z = (z + 0x0001);
x = __________

y = __________

z = __________

w = __________

pg. 28

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
10. Analise o cdigo que segue e informe o contedo da varivel a, quando a execuo do programa estiver
na linha 15.
1.
2.
3.
4.
5.

void main()
{
unsigned int n;
unsigned char a[5] = {0xFF,0xFE,0xFD,0xFC,0xFB};
char i;

6.
7.
8.
9.
10.
11.
12.
13.
14.
15. }

n = 20;
n %= 3;
n += 2;
i = -1;
a[0] = a[++i] + n;
a[1] = a[++i] + n;
a[2] = a[i + 1] + n;
a[3] = a[i + 2] + n;
a[4] = a[i + 3] + n;
a = ______________________________

11. Analise o programa abaixo e informe o contedo da varivel a, quando a execuo do programa estiver
na linha 19.
1.
2.
3.
4.
5.

void main()
{
unsgned int n;
int a[7] = {07,07,07,07,07,07,07};
double c, d;

6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19. }

c = 1.1;
d = 2.2;
n >>= 4;
n = 0x00F0;
n %= 0x000F;
a[4] = n;
a[0] = (a[0] > n && n < 100) || n == 9;
a[1] = a[0]++ + --a[2] - -a[3] + -a[4];
a[2] = a[1] + a[2] > n || !(a[0] + 2 < n);
a[3] = a[5]++ - ++a[6];
a[4] = c + 1 > d;
a[5] = ++a[0] + a[1]++;
a[6] = --a[0] + -a[1];
a = ________________________________________

pg. 29

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
12. Analise o cdigo que segue e informe o contedo das variveis a e d, quando a execuo do programa
estiver na linha 12.
1.
2.
3.
4.

void main()
{
int a[4], b, c, n;
double d[4];

5.
6.
7.
8.
9.
10.
11.
12. }

n = 11;
b = 10 * (n % 5) + 1;
c = 10;
a[0] = d[0] = b / c;
a[1] = d[1] = b / (float) c;
a[2] = d[2] = b / 20;
a[3] = d[3] = b / 20.0;
a = _________________________________
d = _________________________________

13. Analise o cdigo abaixo e informe o contedo das variveis a, b e c, quando a execuo do programa
estiver na linha 11.
1.
2.
3.

void main()
{
int a[4] = {1,1,1,1}, b, c, n;

4.
5.
6.
7.
8.
9.
10.
11. }

n = 0x000B;
b = n % 8;
c = 2;
a[0] = b++ - c;
a[1] = ++b - c;
a[2] += --a[0] + a[1]++;
a[3] = ++a[0] - a[1] + a[2];
a = ___________________________________
b = ______________

c = ______________

14. Analise o cdigo que segue e informe o contedo das variveis a e b, quando a execuo do programa
estiver na linha 10.
1.
2.
3.
4.

void main()
{
unsigned char a;
char b, n;

5.
6.
7.
8.
9.
10. }

n = 0x14;
n %= 0x10;
n++;
n |= 0x80;
a = b = n;
a = ______________

b = ______________

pg. 30

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
15. Execute, o programa abaixo, at a linha 10 e informe o contedo das variveis a e b.
1.
2.
3.
4.

void main()
{
unsigned char a, b, c;
char d, e, n;

5.
6.
7.
8.
9.
10. }

n = n % 0x10;
a = 0x10;
b = d = n - a;
c = 0xFE;
e = c;
a = ______________

b = ______________

16. Execute, o programa abaixo, at a linha 13 e informe o contedo da varivel m.


1.
2.
3.
4.

void main()
{
double x, m[3][2] = {{0,0},{0,0},{0,0}};
int a, b;

5.
6.
7.
8.
9.
10.
11.
12.
13. }

a = 1;
b = 2;
x = 3;
m[a][a] = x / b;
m[0][a] = 5 / b;
a = b;
m[a][b - a] = 7 / m[1][1];
m[--a][0] = !((a + b) >= x);
m = _________________________________________

pg. 31

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
7.4 OPERADOR EM TEMPO DE COMPILAO SIZEOF(...)
O operador sizeof um operador em tempo de compilao, unrio, que retorna o tamanho,
em bytes da varivel ou especificador de tipo entre parnteses, que ele precede.
Analise o cdigo abaixo, e informe quais os valores que esto no vetor y, quando a
execuo do programa estiver na linha 16.
y = _______________________________________
1.
2.
3.
4.
5.

void main()
{
unsigned int x, y[9];
double a, b[6];
char s, r[6] = casa;

6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16. }

y[0] = sizeof(x);
y[1] = sizeof(y);
y[2] = sizeof(a);
y[3] = sizeof(b);
y[4] = sizeof(s);
y[5] = sizeof(r);
y[6] = sizeof(y) / sizeof(int);
/* nmero de elementos de y */
y[7] = sizeof(b) / sizeof(double); /* nmero de elementos de b */
y[8] = sizeof(r) / sizeof(char);
/* nmero de elementos de r */
x = y[0] + y[1] + y[2] + y[3] + y[4] + y[5] + y[6] + y[7] + y[8];
Por que os valores de y[1] e y[3] so 18 e 48 respectivamente?
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

O operador sizeof ajuda basicamente a gerar cdigos portveis que dependam do tamanho
dos tipos de dados internos da linguagem C. Por exemplo, imagine um programa de banco de dados que
precise armazenar seis valores inteiros por registro. Se voc quer transportar o programa de banco de dados
para vrios computadores, no deve assumir o tamanho de um inteiro, mas deve determinar o tamanho do
inteiro usando sizeof.
8. PONTEIROS
Ponteiro uma varivel que contm um endereo de memria. Esse endereo
normalmente a posio de uma outra varivel na memria.
Endereo na
memria
1000
1001
1002
1003
1004
1005
1006

Varivel na
memria
1003

pg. 32

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
8.1 VARIVEIS PONTEIROS
Na linguagem C a declarao de variveis ponteiros obedece a seguinte sintaxe:
[modificador] tipo *identificador;
[modificador] tipo *identificador 1, *identificador 2, . . .;
Onde o tipo bsico pode ser qualquer tipo vlido em C. O tipo define o tipo base do
ponteiro, que indica o tipo de variveis que o ponteiro pode apontar (guardar o endereo). Tecnicamente,
qualquer tipo de ponteiro pode apontar para qualquer lugar na memria. No entanto, toda a aritmtica de
ponteiros feita atravs do tipo base do ponteiro, assim, importante declarar o ponteiro corretamente.
8.2 OPERADORES DE PONTEIROS
&, operador unrio que devolve o endereo na memria do seu operando.
m = &c; /* m recebe o endereo de c */
*, operador unrio que devolve o valor da varivel localizada no endereo que o segue.
q = *m; /* q recebe o valor que est no endereo m */
Exemplo:
void main()
{
float x, y;
int *p;
x = y = 10.098;
p = &x;
y = *p;
}
O cdigo acima contm um erro. O ponteiro p aponta para um tipo base int, logo teremos
informaes perdidas, visto que o tipo float possui 4 bytes. O ponteiro p faz referncia apenas aos dois
primeiros bytes e no aos quatro bytes do tipo float.
8.3 ARITMTICA DE PONTEIROS
Existem duas operaes: adio e subtrao.
char *ch = 3000;
int *i = 3000;
ch
ch + 0
ch + 1
ch + 2
ch + 3
ch + 4
ch + 5

endereo
3000
3001
3002
3003
3004
3005

i
i+0
i+1
i+2

8.4 INDIREO MLTIPLA (PONTEIRO APONTANDO PARA PONTEIRO)


Quando falamos em indireo mltipla significa dizer que podemos ter variveis ponteiros
apontando para outras variveis ponteiros. Variveis ponteiros que possuem o endereo de outras variveis
ponteiros.

pg. 33

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Exemplo:
1.
2.
3.

void main()
{
unsigned int a, *p1, **p2, ***p3;

4.
5.
6.
7.
8.
9.
10.
11. }

a = 100;
p1 = &a;
*p1 += *p1;
p2 = &p1;
**p2 = 1000;
p3 = &p2;
***p3 += 1000;

Na linha 5, a varivel ponteiro p1 recebe o endereo da varivel a. Na linha 6 a posio


apontada pela varivel ponteiro p1 incrementada em 100. Na linha 7, a varivel ponteiro p2 recebe o
endereo de da varivel ponteiro p1. Na linha 8, a posio apontada pela varivel ponteiro p2 recebe o valor
inteiro 1000. Na linha 9, a varivel ponteiro p3 recebe o endereo da varivel ponteiro p2. Na linha 10, a
posio apontada pela varivel ponteiro p3 incrementada em 1000.
8.5 PONTEIROS E STRINGS
Exemplo:
1.
2.
3.

void main()
{
char s[8] = "PUC-PR", *p;

4.
5.
6.
7.
8.
9.
10.
11. }

p = s;
p[0] ^= 32;
*(p + 2) ^= 040; // 40 na base 8 (octal)
*(p + 4) ^= 0x20; // 20 na base 16 (hexadecimal)
p[3] = '_';
p++; // incrementa o endereo contido em p em 1 byte (tipo char)
++p;
// incrementa o endereo contido em p em 1 byte (tipo char)

Na linha 3, temos as declaraes das variveis: s (vetor de caracteres de tamanho igual


8) e *p (varivel ponteiro do tipo caracter, ou seja, que contm o endereo de uma outra varivel que do
tipo caracter (char)).
Na linha 4, a varivel ponteiro p recebe o endereo do primeiro byte da varivel vetor s (p
aponta para o ndice 0 (zero) do vetor s).
Na linha 5, com o contedo da posio p[0], feito um xor (^) (operador de bits), com a
constante numrica inteira 32 (base 10), atribuindo o resultado na posio p[0]. Na linha 6, com o contedo
da posio *(p + 2), feito um xor (|) (operador de bits), com a constante numrica octal 040 (base 8),
atribuindo o resultado na posio *(p + 2). Na linha 7, com o contedo da posio *(p + 4), feito um xor (|)
(operador de bits), com a constante hexadecimal 0x20 (base 16), atribuindo o resultado na posio *(p + 4).
Na linha 8, na posio p[3], atribudo a constante caractere _.
Nas linhas 9 e 10 so incrementados os endereos contidos na varivel ponteiro p, agora p
no contm mais o endereo do ndice 0 do vetor s, mas sim o endereo do terceiro byte (ndice 2), dizendo
que p aponta para o terceiro byte de s.

pg. 34

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Exemplo:
1.
2.
3.
4.
5.
6.
7.
8.
9.

void main()
{
char string[16] = "Pontifcia", *p1, *p2;
p1 = p2 = string;
p1++;
p1++;
p1++;
p1 = p2;
}

Na linha 4 tanto as variveis ponteiro p1 e p2 recebem o endereo do primeiro byte da


varivel string (as variveis ponteiro p1 e p2 apontam para string[0] (P)). Nas linhas 5, 6 e 7, cada uma
delas incrementa o endereo em um byte. Um byte porque o tipo base da varivel ponteiro p1 char
(caractere). Depois de executada a linha 7, a varivel ponteiro p1 aponta para o endereo de string[3], ou
seja, o quarto byte (caractere) da varivel string. Na linha 8 a varivel ponteiro p1 ir receber o endereo da
varivel ponteiro p2, que aponta para o primeiro byte da varivel caractere string (string[0]).
8.6 PONTEIROS E VETORES
Exemplo:
1.
2.
3.

void main()
{
float vet[7] = {1.0,1.0,1.0,1.0,1.0,1.0,1.0}, *v;

4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16. }

v = vet; // v recebe o endereo do elemento 0 do vetor vet


v[0] *= 1.1;
v[1] -= v[0];
v[2] += v[0]++ + -v[1];
v[3] += 2.2 + --v[0];
*(v + 4) *= sizeof(int);
*(v + 5) /= 10;
*(v + 6) = *(v + 0) + *(v + 1) + v[2] + v[3];
v++;
v[0] = 11.11;
v++;
*(v) = 22.22;
// *(v + 0) = 22.22;

8.7 PONTEIROS E MATRIZES


Exemplo:
1.
2.
3.

void main(void)
{
int mat[3][3] = {{0,0,0},{0,0,0},{0,0,0}}, *m;

4.
5.
6.
7.
8.
9.
10.
11.
12. }

m = (int *) mat; // m aponta para o elemento (0,0) de mat


m[3*0+1] = 1;
// mat[0][1] = 1;
m[3*1+1] = 1;
// mat[1][1] = 1;
m[3*2+1] = 1;
// mat[2][1] = 1;
m[3*0+0] += m[3*0+1] + m[3*0+2]; // mat[0][0] += m[0][1] + m[0][2];
m[3*1+0] *= m[3*0+0] + m[3*0+1] + m[3*0+2];
m[3*2+0] = m[3*2+1] + m[3*2+2]; // mat[2][0] = mat[2][1] + mat[2][2];
m[3*1+2] = m[3*0+1] + m[3*1+1] + m[3*2+1];

pg. 35

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Quando atribumos o endereo de uma matriz para uma varivel ponteiro (linha 4), a matriz
deixa de ser tratada como matriz, com dois ndices (linha e coluna), e passa a ser tratada como um vetor.
Mesmo quando declaramos uma matriz (int mat[3][3]), esta est disposta na memria de uma forma linear e
contgua. Na forma de ponteiro, como a matriz passa a ser tratada como vetor, temos que calcular o ndice
deste ponteiro em funo da linha e da coluna. Por exemplo: no programa anterior, mat[1][2] corresponde no
ponteiro m[3*1+2]. Isto porque o ndice (1,2) equivale : total de colunas * nmero da linha + nmero da
coluna.
8.8 VETOR DE PONTEIROS
Podemos ter, na linguagem C, vetores de ponteiros. um vetor onde cada posio deste
vetor contm o endereo de um outra varivel na memria. Cada ndice do vetor armazena um endereo
(aponta para uma outra varivel).
Exemplo:
1.
2.
3.
4.

void main()
{
char *v[4], *p = "puc-pr";
char *s[3] = {"primeiro","segundo","terceiro"};

5.
6.
7.
8.
9.
10.
11.
12.
13.
14. }

v[0] = p;
v[1] = s[0];
v[2] = s[1];
v[3] = s[2];
*v[0] ^= 0x20;
*(v[1]) = 'Z';
*(v[1] + 4) = 'X';
*v[2] = 'W';
v[2][3] = 'Q';

Na linha 3, foi declarado um vetor de ponteiros v de tamanho igual quatro (foram


reservados 8 bytes na memria, supondo endereos menores que 64 Kbytes, seriam reservados 16 bytes se
os endereos fossem maiores que 64 kbytes, isto depender do modelo de memria utilizado) e a varivel
ponteiro p. A varivel ponteiro p aponta para o primeiro byte (caractere) da constante string puc-pr, que se
encontra armazenada na rea de dados e que gasta 7 bytes (inclui o \0).
Na linha 4, aparece a declarao de um vetor de ponteiros (s[3]), que possui dimenso
igual trs.
Na linha 5, v[0] recebe o endereo da varivel ponteiro p, apontando para o primeiro byte
(caractere) da constante string puc-pr. Na linha 6, v[1] recebe o endereo do primeiro byte da constante
s[0]. Na linha 7, v[2] recebe o endereo da constante s[2]. Na linha 8, v[3] recebe o endereo da constante
s[2].
Na linha 9, a varivel ponteiro v[0] contm o endereo (aponta) para o primeiro byte da
constante puc-pr, como temos *v[0], fazemos referncia ao contedo deste endereo, onde feito um xor
(operador de bits), com a constante numrica hexadecimal 0x20 (32 em decimal ou 040 em octal).
Na linha 10, atribudo na posio apontada por v[1], a constante caractere Z. Na linha
11, atribudo na posio apontada por *(v[1] + 4) a constante caractere X. Logo, temos ZrimXiro ao invs
de primeiro.
Na linha 12, atribudo na posio apontada por v[2], a constante caractere W. Na linha
12, atribudo na posio apontada por v[2][3], a constante caractere Q. Logo, temos WegQndo ao invs
de segundo.
No programa, acima comentado, foi mostrado as vrias maneira que dispomos para fazer
referncia as informaes apontadas pelas variveis ponteiros existentes no programa.
pg. 36

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Exemplo: Analise o programa abaixo e perceba o incremento e o decremento do endereo
que o ponteiros possuem. Quando da depurao do programa observe na janela de watch as variveis e
tambm o tipo bsico do ponteiro (importante).
1.
2.
3.
4.

void main()
{
char s[16] = "Pontifcia", *p1, *p2;
int i[6] = {1,2,3,4,5,6}, *p3, *p4;

5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21. }

i[0] = sizeof(s);
i[1] = sizeof(i);
// manipulando os ponteiros para o tipo char
p1 = s; // p1 recebe o endereo s[0]
p2 = &s[4];
// p2 recebe o endereo s[4]
p1++; // incrementa o endereo em 1 byte (tipo char)
p1++;
p2--; // decrementa o endereo em 1 byte (tipo char)
p2--;
// manipulando os ponteiros para o tipo int
p3 = i; // p3 recebe o endereo de i[0]
p4 = &i[4];
// p4 recebe o endereo de i[4]
p3++; // incrementa o endereo em 2 bytes (tipo int)
++p3;
--p4;
// decrementa o endereo em 2 bytes (tipo int)
p4--;

8.9 EXERCCIOS PROPOSTOS


1. Analise o programa abaixo e informe o contedo das variveis a, b e c, quando a execuo do estiver na
linha 10.
1.
2.
3.

void main()
{
int a, b, c, *p1, *p2;

4.
5.
6.
7.
8.
9.
10. }

a = 5;
b = 2;
p1 = &a;
p2 = &b;
c = *p1 + *p2;
*p1 = *p1 * *p2;
a = _____________

b = _____________

c = _____________

pg. 37

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
2. Analise o programa abaixo e informe o contedo da varivel v, quando a execuo do programa estiver na
linha 14.
1.
2.
3.

void main()
{
int v[5], a, b, *p1, *p2;

4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14. }

a = 2;
b = 3;
v[b - a] = 5;
p1 = v;
*p1 = 1;
p2 = &v[b];
*p2 = 13;
p2++;
*p2 = *(p1 + 1) + a;
*(p1 + a) = a;
v = ______________________________________

9. VARIVEIS COMPOSTAS HETEROGNEAS


9.1 ESTRUTURAS
Em linguagem C, uma estrutura uma coleo de variveis referenciadas por um nome,
fornecendo uma maneira conveniente de se ter informaes relacionadas agrupadas. A definio de uma
estrutura forma um modelo que pode ser usado para criar variveis estruturas. As variveis que
compreendem a estrutura so chamadas elementos da estrutura.
De uma forma genrica, todos os elementos de uma estrutura so logicamente
relacionados. Imagine informaes sobre o nome, endereo, telefone, cep, informaes estas utilizadas em
um programa de lista postal, seria facilmente representados atravs de uma estrutura.
A definio de uma estrutura para um programa em linguagem C poderia ser:
struct NOME
{
[modificador] tipo identificador;
[modificador] tipo identificador[tamanho];
[modificador] tipo identificador[linhas][colunas];
[modificador] tipo *identifcador;
[modificador] tipo *identificador[tamanho];
struct XXXX identificador;
};
Exemplo:
struct ENDEREO
{
char nome[30];
char rua[40];
char cidade[20];
char estado[3];
char cep[8];
char fone[11];
unsigned int idade;
unsigned int ndep;
};

// nmero de dependentes

pg. 38

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Devemos observar que a definio termina com um ponto-e-vrgula. Isto ocorre porque a
definio de estrutura, em linguagem C, um comando. O rtulo (nome) da estrutura, identifica uma estrutura
de dados particular, sendo o seu especificador de tipo.
Quando definida uma estrutura, nesse ponto do cdigo, nenhuma varivel foi de fato
declarada, nenhum espao na memria foi reservado. Apenas a forma dos dados foi definida. Para
declarar uma varivel com um estrutura, devemos escrever:
struct NOME identificador;
Exemplo:
struct ENDEREO endereo;
O cdigo acima declara uma varivel endereo do tipo estrutura ENDEREO. Quando
voc define uma estrutura, est essencialmente definindo um tipo complexo de varivel, no uma varivel.
No existe uma varivel desse tipo at que seja realmente declarada.
Exemplo:
struct ENDEREO *endereo;
O cdigo acima declara uma varivel ponteiro *endereo. Esta varivel ponteiro ter o
endereo de uma estrutura do tipo ENDEREO (aponta para um tipo de dado que uma estrutura (struct
ENDEREO)).
Exemplo:
struct ENDEREO endereos[10];
O cdigo acima declara uma varivel vetor de tamanho 10 (dez elementos). Cada elemento
deste vetor um dado do tipo estrutura (struct ENDEREO).
Exemplo:
struct ENDEREO endereos[5][10];
O cdigo acima declara uma varivel matriz de cinco linhas por 10 colunas. Cada elemento
da matriz endereos armazena uma estrutura (struct ENDEREOS).
Exemplo:
struct ENDEREO *endereos[16];
O cdigo acima declara uma varivel vetor de ponteiros de tamanho igual a 16. Cada
elemento do vetor de ponteiros endereo aponta para uma estrutura (struct ENDEREO).
O compilador da linguagem C coloca automaticamente memria suficiente para acomodar
as variveis que formam a varivel estrutura.

pg. 39

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Podemos declarar uma ou mais variveis quando a estrutura definida.
struct ENDEREO
{
char nome[30];
char rua[40];
char cidade[20];
char estado[3];
char cep[8];
char fone[11];
unsigned int idade;
unsigned int ndep;
} info1, info2, end1;

// nmero de dependentes

A definio da estrutura ocorre e logo aps o bloco de cdigo da estrutura, ocorreu as


declaraes de trs variveis do tipo da estrutura em questo. Um espao de sizeof(ENDEREO) foi
reservado na memria para cada uma das variveis declaradas.
Para fazermos referncia, manipularmos os elementos de uma estrutura, utilizaremos o
operador ponto (.) e quando estivermos utilizando ponteiros, utilizaremos o operador seta (->).
9.2 EXERCCIOS PROPOSTOS
1. Dada a definio da estrutura:
struct STT
{
int a;
float b;
};
Dada a declarao:

struct STT s;

Qual o tamanho em bytes da varivel s (sizeof(s))? _______________


Supondo o endereo inicial da varivel s igual 3E816. Qual o endereo de s.a e s.b? (d o endereo em
hexadecimal).
s.a = _________ s.b = _________
Dada a declarao:

struct STT r[5];

Qual o tamanho em bytes da varivel r (sizeof(r))? ________________


Supondo o endereo inicial da varivel r igual 17508. Qual o endereo de r[2], r[2].a e r[2].b? (d o resultado
do endereo em hexadecimal).
r[2] = __________ r[2].a = __________ r[2].b = __________
Dada a declarao:

struct STT m[3][3];

Qual o tamanho em bytes da varivel m (sizeof(m))? ______________


Supondo o endereo inicial da varivel m igual 7D016. Qual o endereo de m[1][1], m[1][1].a e m[1][1].b? (d
o resultado do endereo em hexadecimal).
m[1][1] = _________ m[1][1].a = _________ m[1][1].b = _________

pg. 40

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
2. Dada as definies das estruturas:
struct INFO_1
{
char s[2][3];
int x;
};
struct INFO_2
{
char a;
struct INFO_1 b;
};
struct INFO_3
{
float a;
long int b;
struct INFO_2 c[2];
};
Dada a declarao:
struct INFO_3 y[3];

Complete o quadro abaixo:


16 bits
sizeof(INFO_1) =
_______________________
sizeof(INFO_2) =
_______________________
sizeof(INFO_3) =
_______________________
sizeof(y[1].c) =
_______________________
sizeof(y[2].c[1].b.s[1][2]) = _______________________
sizeof(y) =
_______________________

32 bits
_______________________
_______________________
_______________________
_______________________
_______________________
_______________________

Supondo o endereo inicial da varivel y igual 5DC16. Quais os endereos das seguintes variveis em
arquiteturas de 16 bits e 32 bits.

______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________

pg. 41

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira

y[1] =
y[1].a =
y[1].b =
y[1].c[1].b.s[1][2] =
y[1].c[0].a =
y[2].c[0].b.s[0][1] =

16 bits
_______________________
_______________________
_______________________
_______________________
_______________________
_______________________

32 bits
_______________________
_______________________
_______________________
_______________________
_______________________
_______________________

3. Dada as definies das estruturas:


struct REG_1
{
int x[2];
char y;
};
struct REG_2
{
char a;
struct REG_1 b[2][2];
};
struct REG_3
{
struct REG_1 d[3]
struct REG_2 e[2];
};
Dada a declarao:
struct REG_3 Reg;

Complete o quadro abaixo:


16 bits
sizeof(Reg.d) =
______________________
sizeof(Reg.e[1].a) =
______________________
sizeof(Reg.e[0].b) =
______________________
sizeof(Reg.e[0].b[1][0].x[1]) = ______________________
sizeof(REG_1) =
______________________
sizeof(REG_2) =
______________________
sizeof(REG_3) =
______________________
sizeof(Reg) =
______________________

32 bits
______________________
______________________
______________________
______________________
______________________
______________________
______________________
______________________

pg. 42

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira

Supondo o endereo inicial da varivel Reg igual 7D016. Quais os endereos das seguintes variveis em
arquiteturas de 16 bits e 32 bits.

______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________

Reg.d[2].y =
Reg.e[0].b[1][0].x[1] =
Reg.e[1].a =
Reg.d[0].x =
Reg.e[1].b[1][1] =
Reg.e[1].b[1][0].y =

16 bits
_______________________
_______________________
_______________________
_______________________
_______________________
_______________________

32 bits
_______________________
_______________________
_______________________
_______________________
_______________________
_______________________

pg. 43

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira

R 2 , pode ser representado por um par de nmeros pertencentes ao conjunto dos


2
nmeros reais e que formam um par ordenado ( x , y ) . Uma reta, representada no espao R , pode ser

4. Um ponto no espao

definida por dois pontos. Defina os tipos de dados PONTO e RETA, este ltimo em funo de PONTO e
declare um conjunto de 5 retas. Sabendo que a terceira reta passa pelos pontos (9.2,5) e (0.8,1.6), atribua
estes valores ao conjunto de retas, que foi declarado.

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

pg. 44

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
5. Utilizando o tipo de dado PONTO, do exerccio anterior, defina os seguintes tipos:
CIRCULO, definido por um ponto e o comprimento do raio.

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

pg. 45

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
RETA, definida por um ponto e seu coeficiente angular.

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
TRIANGULO_1, definido por um conjunto de trs pontos.

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

pg. 46

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira

TRIANGULO_2, definido por trs pontos.

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
QUADRILATERO_1, definido por um conjunto de quatro pontos.

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
pg. 47

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira

QUADRILATERO_2, definido por quatro pontos.

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

pg. 48

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira

6. Um ponto no espao R , pode ser representado por uma trinca de nmeros pertencentes ao conjunto dos
nmeros reais e que formam uma trinca ordenada ( x , y , z ) . Um cubo reto pode ser definido por oito pontos
3

em R e tambm pode ser definido por um conjunto de oito pontos. Defina os tipos PONTO, CUBO_1 e
CUBO_2, estes dois ltimos em funo de PONTO. Declare duas variveis do tipo CUBO_1 e CUBO_2,
respectivamente e inicialize-os com os seguintes valores dos vrtices: (0,0,0), (4,0,0), (4,4,0), (0,4,0), (0,0,4),
(4,0,4), (4,4,4), (0,4,4).

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

pg. 49

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
7. Uma Reta pode ser definida por um ponto e o seu coeficiente angular. Um plano pode ser definido por
uma RETA e um PONTO, desde que este ponto no pertena a esta reta.
Defina o tipo PLANO em funo dos tipos RETA e PONTO.

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

pg. 50

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Declare uma varivel do tipo PLANO e atribua valores para este plano.

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

pg. 51

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Declare um conjunto de cinco PLANOS e atribua valores para terceiro plano.

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

pg. 52

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
8. Uma data pode ser definida por trs nmeros, que representam o dia (1,...,31), ms (1,...,12, janeiro igual
1) e ano (um nmero de quatro algarismos). Defina o tipo de dado DATA. Utilize menor tipo de dado que
caiba a faixa de intervalo.

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
Declare duas variveis do tipo DATA, chamadas de Inicio e Fim e atribua as datas 13/4/1992 e
29/12/1999.

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

pg. 53

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
9. Um endereo residencial pode ser definido atravs do nome da rua (35 bytes), o bairro (20 bytes), a cidade
(30 bytes), a sigla do estado da federao (UF) (2 bytes), o cdigo de endereamento postal (Cep) (8 bytes).
Defina o tipo ENDEREO.

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

pg. 54

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
10. Um telefone pode ser definido com trs tipos de informaes, que so: o cdigo de discagem distncia
(ddd) (3 bytes), prefixo de rea (Prefixo) (4 bytes) e o nmero restante (Nmero) (4 bytes). Defina o tipo
FONE.

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

pg. 55

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
11. O tipo de dado CLIENTE pode ser identificado pelo nome (40 bytes), nmero do registro geral (RG) (8
bytes), data de nascimento, endereo, fone. Defina o tipo CLIENTE, utilizando quando puder os tipos
anteriores j definidos.

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
Declare um conjunto de 20 (vinte) clientes do tipo CLIENTE.

___________________________________________________________

pg. 56

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Supondo o endereo inicial igual 100D16. Qual o endereo do dcimo cliente. (D o resultado em
hexadecimal)

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

pg. 57

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
12. Uma aplice de seguro de vida pode ser formada pelo nmero da aplice, CLIENTE, ENDEREO, valor
da aplice, prmio (%), nome do beneficirio (40 bytes) e data de aniversrio. Defina o tipo APL_VIDA
(aplice de vida).

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

pg. 58

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
13. Uma aplice de seguro de automvel pode ser composta pelo nmero da aplice, CLIENTE,
ENDEREO, valor da aplice, prmio (%), depreciao, licena (10 bytes), unidade da federao (UF),
modelo (15 bytes) e ano de fabricao. Defina o tipo APL_AUTO (aplice de automvel).

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

pg. 59

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
14. Uma aplice de seguro de imvel pode ser formada pelo nmero da aplice, CLIENTE, ENDEREO,
valor da aplice, prmio (%), depreciao, licena e ano de construo. Defina o tipo APL_IMOVEL (aplice
de imvel).

___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________
___________________________________________________________

pg. 60

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
O exemplo abaixo mostra bem a definio de uma estrutura, a declarao da varivel info,
que do tipo struct INFO e, tambm mostra, a manipulao de seu elementos sem ponteiros (linhas 11 a 14)
e atravs de um ponteiro que contm o endereo da varivel info (p aponta para a info (linha 16)).
struct INFO
{
char nome[25];
int idade;
double altura;
};
void main()
{
struct INFO info = {"Jos da Silva",30,1.82}, *p;
// manipulando a estrutura sem ponteiros
info.nome[0] ^= 040;
info.nome[8] ^= 040;
info.idade = 35;
info.altura = 1.90;
/* manipulando a estrutura atravs de um ponteiro */
p = &info; /* p recebe o endereo de info */
p->nome[0] ^= 0x20;
p->nome[8] ^= 0x20;
p->idade = 25;
p->altura = 1.78;
}
No cdigo do programa que segue, temos um ponteiro apontando para um tipo estrutura
(linha 5). O ponteiro prximo contm o endereo (aponta) de uma struct REGISTRO. Sugere a noo de
encadeamento.
struct REGISTRO
{
unsigned int cdigo;
unsigned char nome[16];
struct REGISTRO *proximo;
};
void main()
{
struct REGISTRO *p;
struct REGISTRO r1 = {1,"Cludio",'\0'};
struct REGISTRO r2 = {2,"Renata",'\0'};
struct REGISTRO r3 = {3,"Marcela",'\0'};
struct REGISTRO v[3] = {{4,"Joo",0},{5,"Maria",0},{6,"Renato",0}};
// manipulando as variveis sem ponteiros
r1.proximo = &r2;
r2.proximo = &r3;
r3.proximo = &r1;
// manipulando as varivel com ponteiros
p = &r1;
p->proximo = &v[0];
p->proximo->proximo = &r3;
p->proximo->proximo->proximo = &v[1];
p->proximo->proximo->proximo->proximo = &r2;
p->proximo->proximo->proximo->proximo->proximo = &v[3];
}
pg. 61

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
9.3 UNIES
Na linguagem C, uma union uma posio de memria que compartilhada por duas ou
mais variveis diferente, geralmente de tipos de dados diferentes, em momentos diferentes. A definio de
uma union semelhante definio de uma estrutura. Sua forma geral e:
union NOME
{
[modificador] tipo identificador;
[modificador] tipo identificador[tamanho];
[modificador] tipo identificador[linhas][colunas];
[modificador] tipo *identifcador;
[modificador] tipo *identificador[tamanho];
struct XXXX identificador;
union YYYY identificador;
};
Exemplo:
union TIPO
{
unsigned char c;
unsigned int i;
};
A definio de uma union no declara quaisquer variveis. Para declarar uma varivel do
tipo union seria:
union TIPO t;
A varivel t uma varivel do tipo union. Nesta union, varivel inteira i e a varivel
caractere c compartilham a mesma posio de memria. obvio que a varivel inteira i ocupa dois bytes na
memria e a varivel caractere c ocupa apenas um byte.
Quando uma varivel union declarada, o compilador cria automaticamente uma varivel
grande suficiente para conter o maior tipo de varivel da union.
union TIPO *u;
A varivel ponteiro u aponta para uma union (contm o endereo de uma union).
Neste cdigo que apresentado abaixo, tem-se uma unio identificada por TIPO. Esta
possui dois elementos que so um inteiro e um vetor de caracteres de tamanho igual dois. O tamanho da
varivel t, que do tipo unio seria dois bytes. Observe os valores de i, c[0] e c[1], quando a execuo do
programa estiver na linha 14.
union TIPO
{
unsigned int i;
unsigned char c[2];
};
void main(void)
{
union TIPO t, *u;
u = &t;
u->i = 255;
u->i = 256;
u->c[0] = 0x0F;
u->c[1] = 0x01;
}
pg. 62

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
O programa abaixo mostra a utilizao de uma unio chamada PRIMITIVA. Onde os seus
elementos so quatro estruturas, que definem uma RETA, CRCULO, TRINGULO e um QUADRADO.
struct PONTO_2D
{
double x, y;
};
struct TRINGULO
{
struct PONTO_2D v[3];
};
struct QUADRADO
{
struct PONTO_2D v[4];
};
struct CIRCULO
{
double raio;
struct PONTO_2D c;
};
struct RETA
{
struct PONTO_2D p1, p2;
};
union PRIMITIVA
{
struct CIRCULO circulo;
struct QUADRADO quadrado;
struct TRINGULO tringulo;
struct RETA reta;
};
void main()
{
unsigned int t[5], i = -1;
union PRIMITIVA a, *b;
// preenche o vetor t com o tamanho das estruturas e da union
t[++i] = sizeof(union PRIMITIVA);
t[++i] = sizeof(struct CIRCULO);
t[++i] = sizeof(struct QUADRADO);
t[++i] = sizeof(struct TRINGULO);
t[++i] = sizeof(struct RETA);
// manipulando os elementos da union sem ponteiro
a.reta.p1.x = 1;
a.reta.p1.y = 2;
a.reta.p2.x = 1;
a.reta.p2.y = 2;
// manipulando os elementos da union com ponteiro
b = &a;
b->circulo.raio = 3.5;
b->circulo.c.x = 3;
b->circulo.c.y = 4;
}
Usar uma unio ajuda na produo de cdigos independentes da mquina (hardware).
Como o compilador no perde o tamanho real das variveis que perfazem a unio, nenhuma dependncia do
hardware produzida. A ento, no necessrio se preocupar com o tamanho do int, char, float ou
qualquer outra coisa que seja.

pg. 63

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
As unies so mais utilizadas freqentemente nas converses de tipos quando
necessrias, porque pode referenciar os dados contidos na unio de maneiras diferentes.
10. ENUMERAES
Uma enumerao uma extenso da linguagem C acrescentada pelo padro ANSI. Uma
enumerao um conjunto de constantes inteiras que especifica todos os valores legais que uma varivel
desse tipo pode ter. Enumeraes so comuns na vida cotidiana. Um exemplo de enumerao das moedas
usadas nos Estados Unidos : penny, nickel, dime, quarter, half-dollar, dollar.
As enumeraes so definidas de forma semelhante a estruturas. A diferena que temos
a palavra enum usada no incio de um tipo de enumerao. A forma geral de uma enumerao :
enum NOME { lista de enumerao };
Para declararmos uma varivel do tipo enumerao seria:
enum identificador;
Para entender bem as enumeraes o ponto que cada smbolo representa um valor
inteiro e podem ser usados em qualquer lugar em que um inteiro pode ser usado. Cada smbolo dado um
valor maior em uma unidade do precedente. O valor do primeiro smbolo da enumerao 0.
Neste exemplo, mostramos como definir, declarar e uma simples manipulao de uma
enumerao.
enum DIAS {DOM,SEG,TER,QUA,QUI,SEX,SAB};
enum MESES {JAN, FEV, MAR, ABR = 20, MAI, JUN, JUL, AGO, SET, OUT, NOV, DEZ};
enum OPCOES {INCLUIR = -2, EXCLUIR, SAIR};
void main()
{
enum DIAS dia[3] = {DOM,DOM,DOM};
enum MESES mes[4] = {JAN,JAN = 10,JAN,JAN};
enum OPCOES opcoes[3] = {SAIR,SAIR,SAIR};
unsigned int i = -1;
dia[++i] = DOM;
dia[++i] = TER;
dia[++i] = SEX;
mes[i++ - 2] = MAR;
mes[i++ - 2] = ABR;
mes[i++ - 2] = MAI;
mes[i - 2] = JUN;
opcoes[i++ - 5] = INCLUIR;
opcoes[i++ - 5] = EXCLUIR;
opcoes[i - 5] = SAIR;
}
11. ENTRADA E SADA UTILIZANDO SCANF(...) E PRINTF(...)
11.1 PRINTF(. . .)
Printf uma rotina da biblioteca padro que possibilita a escrita no monitor de vdeo do
computador.
O prottipo desta rotina (funo) encontra-se no arquivo de header STDIO.H. Esta funo
devolve o nmero de caracteres escritos ou um valor negativo se ocorrer algum erro. Seu prottipo seria:
int printf(char *string, [lista de argumentos, . . .]);
pg. 64

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Para escrever qualquer string (seqncia de caracteres) no monitor de vdeo do
computador, basta passarmos como parmetro o string a ser escrito.
Exemplos da utilizao do printf.
Escrever PONTIFCIA seria:
printf(PONTIFCIA);
Escrever PUC-PR 1999
printf(PUC-PR 1999);
Escrever Nome:
printf(Nome: );
Se desejarmos escrever o contedo de variveis precisamos utilizar formatos para indicar o
tipo de dado a ser escrito.
Formato
%c
%d
%i
%e
%E
%f
%lf
%g
%G
%o
%s
%u
%x
%X
%p
%%

Descrio
Caractere
Inteiro decimal com sinal
Inteiro decimal com sinal
Notao cientfica (e minsculo)
Notao cientfica (E maisculo)
Float
Double
Usa %e ou %f, o que for mais curto
Usa %E ou %F, o que for mais curto
Octal
string (seqncia de caracteres)
Inteiro decimal sem sinal
Hexadecimal sem sinal (letras minsculas)
Hexadecimal sem sinal (letras maisculas)
Ponteiro (endereo)
escreve o smbolo %

Exemplos da utilizao da funo printf para escrever o contedo de variveis. Para isto
suponha as seguintes declaraes e inicializaes: int x = 15; double y = 3.1415;
Escrever o contedo das variveis x e y:
printf(x = %d,x);
printf(y = %lf,y);
printf(x = %d - y = %lf,x,y);
Escrever o endereo das variveis x e y:
printf(x = %p,&x);
printf(x = %p,&y);
11.2 SCANF(. . .)
uma rotina da biblioteca padro e seu prottipo est em STDIO.H. O scanf l os dados
digitados via teclado, transformando-os para o formato especificado na chamada da funo scanf.
O prottipo da funo :
int scanf(char *formato, endereo da varivel);

pg. 65

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Especificadores de formato:
Formato
%c
%d
%i
%f
%lf
%o
%s
%u
%x

Descrio
Caractere
Inteiro decimal com sinal
Inteiro decimal com sinal
float
double
Octal
string (seqncia de caracteres)
Inteiro decimal sem sinal
Hexadecimal sem sinal (letras minsculas)

Exemplos da utilizao da funo scanf para leitura de um valor entrando via teclado. Para
isto suponha as seguintes declaraes de variveis: int x; float y; char Nome[35]; char Chr;
Ler as variveis x, y, Nome, Chr:
scanf(%d,&x);
scanf(%f,&y);
scanf(%s,Nome); ou scanf(%s,&Nome[0]);
scanf(%c,&Chr);
11.3 EXERCCIOS PROPOSTOS
1. Faa um programa que leia um nmero inteiro e mostre este nmero em decimal, octal e hexadecimal.
2. Faa um programa que possua quatro variveis inteiras declaradas. Mostre o endereo de cada uma das
quatro variveis declaradas no programa.
3. Faa um programa que leia quatro notas, calcule e mostre a mdia aritmtica das notas lidas.
4. Faa um programa que leia um nmero real (ponto flutuante) e mostre o nmero lido com e sem notao
cientfica.
5. Faa um programa que leia os catetos de um tringulo retngulo, calcule e mostre o valor da hipotenusa,
com trs casas decimais.
6. Construa um programa que leia os trs lados de um paraleleppedo em centmetros, calcule e mostre o
valor da diagonal do paraleleppedo em metros. (mostre o resultado em notao cientfica)
7. A partir da diagonal de um quadrado, desejamos elaborar um programa que nos informe o comprimento do
lado deste quadrado. Implemente um programa que leia o valor da diagonal, calcule e mostre o valor do lado
do quadrado, com uma casa decimal.

8. A converso de graus Fahrenheit para Centgrados obtida pela frmula

C=

5
( F 32) . Codifique um
9

programa que leia o valor de um temperatura em graus Fahrenheit, transforme e mostre a temperatura em
graus Centgrados.
9. Para a codificao do programa que segue, utilize a seguinte definio:
struct PONTO
{
double x, y, z;
};

pg. 66

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Elabore um programa que leia as coordenadas de dois pontos, calcule e mostre a distncia entre os
3

dois pontos lidos, no espao tridimensional ( R ). A distncia entre dois pontos dada pela frmula:

d = ( x 2 x1 )2 + ( y 2 y1 )2 + ( z 2 z1 )2
10. Utilizando a mesma definio anterior para ponto. Implemente um programa que leia as coordenadas de
dois pontos, no plano cartesiano ( x , y ) , calcule e mostre o coeficiente angular da reta que passa pelos
pontos lidos. O coeficiente angular de uma reta dado por:

m = ( y1 y 0 ) / ( x1 x 0 )

11. Dada a definio abaixo:


struct CONE
{
double Raio, Altura;
};
Implemente um programa que leia o raio e a altura de um cone, calcule e mostre o volume do cone.
12. Dada a estrutura abaixo:
struct PIRMIDE
{
double Diagonal, Altura;
};
Construa um programa que leia a diagonal da base e a altura, de uma pirmide de base quadrada,
calcule e mostre a rea da base da pirmide e o volume.
13. Escreva um programa que calcule a quantidade de latas de tinta necessrias e o custo para pintar
tanques cilndricos de combustvel, por dentro e por fora, onde so fornecidos a altura e o raio desse cilindro.

Sabemos que:
a lata de tinta custa R$ 55,00.
cada lata contm 5 litros.
cada litro de tinta pintam 3 metros quadrados.

14. Analise o programa abaixo e informe o que foi escrito no monitor de vdeo do computador, quando a
execuo do programa estiver na linha 11.
__________________________________
1.

#include <stdio.h>

2.
3.
4.

void main()
{
int n, d1, d2, d3, d4;

5.
6.
7.
8.
9.
10.
11. }

n = 1789;
d4 = n % 10;
d3 = (n / 10) % 10;
d2 = (n / 100) % 10;
d1 = (n / 1000) % 10;
printf(%d%d%d%d,d4,d3,d2,d1);

pg. 67

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
15. Dada a seguinte estrutura:
struct ATLETA
{
char Nome[40];
int Idade;
float Altura;
};
Elabore um programa que leia as informaes de um atleta, utilizando a estrutura acima definida e
mostre as informaes lidas.
16. Dadas as seguintes estruturas:
struct FONE
{
int DDD, Prefixo, Nmero;
};
struct ALUNO
{
int Cdigo;
char Nome[40];
struct FONE Fone;
};
Faa um programa que leia as informaes de um aluno, utilizando as estruturas acima definidas e
mostre as informaes lidas.
17. Utilizando a definio FONE do programa anterior, faa um programa que leia o nmero de um telefone e
mostre o telefone no seguinte formato: (41)330-1515.
18. Dadas as seguintes definies:
struct DATA
{
char Dia;
char Mes;
int Ano;
};
struct INTERVALO
{
struct DATA Incio;
struct DATA Fim;
};
Faa um programa que leia um intervalo de horas (utilizando as estruturas definidas acima) e mostre
o intervalo da seguinte forma, por exemplo:
Incio:
Fim:

10/12/1990
11/10/1999

pg. 68

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
12. COMANDOS DE CONTROLE DO FLUXO DE EXECUO
O padro ANSI divide os comandos de controle de um programa em linguagem C, nos
seguintes grupos: seleo, iterao (repetio), desvio, rtulo (label), expresso e bloco.
12.1 COMANDOS DE SELEO
Os comandos de seleo disponveis em linguagem C so: if e switch. Os comandos so
ditos seleo porque selecionam o fluxo do programa ao longo da execuo do programa (em tempo de
execuo).
12.1.1 COMANDO IF
Estrutura de seleo simples.
if (condio)
instruo 1;
Representao atravs de um diagrama de blocos.

avaliao da
falso
condio
verdadeiro
execuo da
instruo 1

Este tipo de estrutura, que a mais simples que existe, analisada da seguinte maneira: se
condio, que uma expresso lgica, for verdadeira (1), ocorrer a execuo da instruo 1, caso contrrio,
se condio for falsa (0), no ocorrer a execuo da instruo 1.
OBS. Na linguagem C, qualquer valor diferente de zero interpretado como verdadeiro.
Execute o programa, que segue, passo a passo e observe o contedo das das variveis x e
y. Feito isto, troque os valores de x e y e execute novamente o programa passo a passo. Procure observar e
compreender o funcionamento do comando de seleo if.
void main()
{
int x, y;
x = 2;
y = 1;
if (x > y)
x = x++ - --y;
}

pg. 69

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Representao do programa anterior atravs de um diagrama de blocos.

x = 2;
y = 1;
Verdadeiro

avaliar
x>y
falso

--y;
x + y;
x++;

Estrutura de seleo composta.


if (condio)
instruo 1;
else
instruo 2;
Representando atravs de um diagrama de blocos.

verdadeiro

instruo 1

avaliao da
condio

falso

Instruo 2

A expresso lgica condio avaliada e se condio verdadeira (1), executa a instruo 1,


caso contrrio, se condio falsa (0), a instruo 2 executada.
Execute o programa, que segue, passo a passo e observe o contedo das variveis x, y e
Menor. Feito isto, troque os valores de x e y e execute novamente o programa passo a passo. Procure
observar e compreender o funcionamento do comando de seleo if.
void main()
{
int x, y, Menor;
x = -1;
y = 1;
if (x < y)
Menor = x;
else
Menor = y;
}

pg. 70

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Representao do programa anterior atravs de um diagrama de blocos.

x = -1;
y = 1;
Verdadeiro

Avaliar
x<y

falso

Menor = x;

Menor = y

OBS. Quando tivermos mais de uma linha de cdigo (instruo) a ser executada, dentro de um if ou de um else,
somos obrigados a colocar chaves, indicando o incio e final do bloco do comando. Quando tivermos apenas
uma linha de cdigo, o incio e final de bloco opcional.
Execute o programa, que segue, passo a passo e observe o contedo das variveis x, y,
Maior e Menor. Feito isto, troque os valores de x e y e execute novamente o programa passo a passo.
Procure observar e compreender o funcionamento do comando de seleo if.
void main()
{
int x, y, Menor, Maior;
x = -1;
y = 1;
if (x < y)
{
Menor = x;
Maior = y;
}
else
{
Menor = y;
Maior = x;
}
}
Representao do programa anterior atravs de um diagrama de blocos.

x = -1;
y = 1;
Verdadeiro

Menor = x;
Maior = y;

Avaliar
x<y

Falso

Menor = y
Maior = x

Podemos ter seqncias de cdigo onde aparecem if dentro de if e assim por diante.
Execute o programa, que segue, passo a passo e observe o contedo das variveis x, y,
Maior e Menor. Feito isto, troque os valores de x e y e execute novamente o programa passo a passo.
Procure observar e compreender o funcionamento do comando de seleo if.
pg. 71

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
1.
2.
3.

void main()
{
int x, y, Menor, Maior;

4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19. }

x = -1;
y = 1;
if (x == y)
Menor = Maior = x;
else
if (x < y)
{
Menor = x;
Maior = y;
}
else
{
Menor = y;
Maior = x;
}

O else da linha 8 possui apenas uma linha de cdigo, que um comando if, ficando
opcional usar chaves para delimitar o incio e final de bloco. Dependendo da experincia do programador,
uma boa prtica, na dvida, colocar chaves e o programa ficaria:
void main()
{
int x, y, Menor, Maior;
x = -1;
y = 1;
if (x == y)
{
Menor = Maior = x;
}
else
{
if (x < y)
{
Menor = x;
Maior = y;
}
else
{
Menor = y;
Maior = x;
}
}
}

pg. 72

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Representao do programa anterior atravs de um diagrama de blocos.

x = -1;
y = 1;
Verdadeiro

avaliar
x == y

falso
verdadeiro

Menor = x;
Maior = y;
Menor = x;
Maior = y

avaliar
x<y

falso

Menor = y;
Maior = x;

O programa a seguir atribui valores iniciais para as variveis x, y e z. Depois verifica se


esto em ordem crescente, trocando o contedo das variveis, quando necessrio. Observar a seqncia de
cdigo utilizado para trocar o contedo de duas variveis, neste caso duas variveis inteiras.
1.
2.
3.

void main()
{
int a, x, y, z;

4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28. }

x = 2;
y = 1;
z = 3;
if (x > y || x > z)
{
if (y < z)
{
a = x;
x = y;
y = a;
}
else
{
a = x;
x = z;
z = a;
}
}
if (y > z)
{
a = y;
y = z;
z = a;
}

pg. 73

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Representao do programa anterior atravs de um diagrama de blocos.

x = 2;
y = 1;
z=3
verdadeiro
verdadeiro

avaliar
y<z

a = x;
x = y;
y = a;

Avaliar
x > y || x > z

falso

falso

a = x;
x = z;
z = a;

verdadeiro

Avaliar
y>z

falso

a = y;
y = z;
z = a;

O programa pode ser rescrito de uma outra maneira, tirando as chave das linhas 8 e 21, j
que possumos uma linha de cdigo (um comando if). Tambm poderamos, a ttulo de ilustrao, fazer a
troca entre duas variveis inteiras utilizando o operador de bits xor (^). O programa ficaria:
1.
2.
3.

void main()
{
int x, y, z;

4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14. }

x = 2;
y = 1;
z = 3;
if (x > y || x > z)
if (y < z)
x ^= y ^= x ^= y;
else
x ^= z ^= x ^= z;
if (y > z)
y ^= z ^= y ^= z;

bvio que ao expandirmos as linhas 9, 11, 13, teramos que colocar chaves novamente
para marcar o incio e fim do bloco dos comandos. Estas mesmas linhas poderiam ser rescritas da seguinte
maneira, levando em contra a precedncia e associatividade dos operadores, bem como, a ordem de
execuo que da direita para a esquerda.
Linha 9 Linha 11 Linha 13 -

x = x ^ (y = y ^ (x = x ^ y));
x = x ^ (z = z ^ (x = x ^ z));
y = y ^ (z = z ^ (y = y ^ z));

pg. 74

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
12.1.1.1 ERROS MAIS COMUNS
Um erro bastante comum seria ao invs de colocarmos o operador de igualdade (==)
colocamos o operador de atribuio (=). (linha 5)
1.
2.
3.
4.
5.
6.
7.
8.
9.

void main()
{
unsigned char ch1, ch2;
ch1 = A;
if (ch1 = S)
ch2++;
else
ch2 = ch1;
}

Na linha 5 no queremos atribuir constante caractere S para a varivel caractere ch1 e


sim compararmos ch1 com o valor da constante caractere S (if (ch1 == S)). Neste caso a expresso: ch1 =
S, sempre ser verdadeira. Para a linguagem C qualquer valor diferente de zero (0) ser sempre verdadeiro.
No programa que segue temos um erro bastante comum, que seria colocarmos um ponto
final na linha do comando if. (linha 4)
1.
2.
3.
4.
5.
6.

void main(void)
{
char x[16] = Puc-pr, y[16] = Pontifcia;
if (x[3] == y[3]);
x[3] = y[3] = W;
}

Na linha 4 aparece um ponto-e-vrgula (;) no final do comando if isto significa que um if


sem linha nenhuma a ser executada em funo do resultado da expresso lgica (x[3] == y[3]). A linha 5 s
deve ser executada se a expresso lgica do if for verdadeira (um). Com o ponto-e-vrgula isto no ocorre. A
linha 5 sempre ser executada. Portanto um erro que no aparece durante a compilao e a gerao do
programa executvel, aparece sim, em tempo de execuo do programa.
Outro erro bastante comum seria esquecer ou no colocar chaves (quando obrigatrias), de
incio e final do bloco, em uma seqncia de if - else.
void main()
{
int x = 10, y = 9, z = 0;
if (x > 0)
{
c++;
++y;
if (a / c > 0)
c += 3;
y--;
}

pg. 75

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
12.1.1.2 OPERADOR INTERROGAO DOIS PONTOS (? :)
Podemos utilizar este operador para substituir comandos if - else na forma geral:
if (condio)
instruo 1;
else
instruo 2;
As expresses devem ser comandos simples, nunca um outro comando da linguagem C.
Este operador chamado de operador interrogao dois pontos por requerer trs operando.
Sua forma geral e:
(expresso 1) ? (expresso 2) : (expresso 3);
Sua avaliao : expresso 1 avaliada. Se expresso 1 verdadeira, expresso 2
avaliada e se torna o valor da expresso inteira. Se expresso 1 falsa, ento expresso 3 avaliada e se
torna o valor da expresso.
Analise o programa abaixo e observe o contedo das variveis, tentando compreender o
funcionamento do operador interrogao dois pontos (? :).
void main(void)
{
int x, y, Menor;
x = -1;
x = 1;
Menor = (x < y) ? (x) : (y);
}
Analise o programa abaixo e observe o contedo das variveis, tentando compreender o
funcionamento do operador interrogao dois pontos (? :).
void main()
{
int g, passo, impar;
g = 0;
passo = 2;
g += (passo > 0) ? (g * 4) : (-passo);
g -= (passo % 2) ? (impar = 1) : (3);
}
Analise o programa abaixo e observe o contedo das variveis, tentando compreender o
funcionamento do operador interrogao dois pontos (? :).
void main()
{
int n, g, passo;
n = 3;
g = 0;
passo = -2;
n *= (!(n % 2)) ? (1) : (-1);
g += (passo > 0) ? (passo + 3) : (-passo);
g -= (g % 2) ? (passo++ * 3) : (--passo * g);
}
pg. 76

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
OBS. No devemos utilizar indiscriminadamente o operador interrogao dois pontos (? :). Isto causaria um
empobrecimento do cdigo do programa quando a legibilidade, compreenso e possveis manutenes que
venham a ser necessrias.
Dado o cdigo abaixo:
void main(void)
{
int a, b, c;
a = 0;
b = -3;
if (a > 0)
if (b > 0)
c = a % b;
else
c = a / b;
else
if (b == -3)
c = -b;
else
c--;
}
O programa anterior poderia ser rescrito utilizando o operador interrogao dois pontos (?
:), e ficaria bem mais complexo, de difcil legibilidade e manuteno. Ficaria assim:
void main(void)
{
int a, b, c;
a = 0;
b = -3;
c = (a > 0) ? ((b > 0) ? (a % b) : (a / b)) : ((b == -3) ? (-b) : (c--));
}
Uma verso para o programa anterior, para no ficaria muito ruim
legibilidade e manutenibilidade seria:

cdigo quanto a

void main(void)
{
int a, b, c;
a = 0;
b = -3;
if (a > 0)
c = (b > 0) ? (a % b) : (a / b);
else
c = (b == -3) ? (-b) : (c + 1);
}

pg. 77

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
12.1.2 COMANDO SWITCH
A sintaxe do comando switch :
switch (varivel)
{
case (constante 1):
. . .;
break;
...
...
...
...
case (constante N):
. . .;
break;
...
...
...
...
default:
. . .;
}
A varivel, analisada no comando switch deve ser um caractere ou um inteiro. As
constantes dos vrios cases, so constantes inteiras ou caracteres. Quando a execuo do programa chegar
em um comando switch, o contedo da varivel analisado e segue um dos caminhos (case). A palavra
default (na falta) opcional, pode ou no aparecer, se aparecer significa que caso nenhum dos cases
satisfaa sempre entrar no default, executando as linhas de cdigo que estiverem abaixo do default. Note
que aparece a palavra reservada break, que um desvio incondicional (sem condio). Quando
encontrado um break, no caso do switch, o fluxo da execuo do programa vai para a primeira linha depois
da chave que fecha o bloco de cdigo do comando switch. Bloco este que obrigatrio.
O comando switch pode substituir uma seqncia de if - else que possui apenas testes de
igualdades.
O programa abaixo atribui varivel c, o resultado da soma, da subtrao, do quociente ou
do resto, entre os valores a e b. Para isso feito uma seqncia de if - else em funo da varivel opo
(opo igual 1 (um) realiza-se soma, opo igual 2 (dois), subtrao, opo igual 3 (trs), quociente e
opo igual 4 (quatro), resto. Quando a execuo do programa estiver na linha 15, o contedo da varivel c
ter o resultado da expresso a - b.
void main()
{
int a, b, c, opo;
a = 3;
b = 4;
opo = 2;
if (opo == 1) // soma
c = a + b;
else
if (opo == 2) // subtrao
c = a - b;
else
if (opo == 3) // quociente
c = a / b;
else
c = a % b;
// resto
}

pg. 78

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Poderamos rescrever o cdigo anterior utilizando o comando de seleo switch.
void main()
{
int a, b, c, opo;
a = 3;
b = 4;
opcao = 2;
switch (opo)
{
case (1):
// soma
c = a + b;
break;
case (2):
// subtrao
c = a - b;
break;
case (3):
// quociente
c = a / b;
break;
case (4);
// resto
c = a % b;
break;
}
}
12.1.3 EXERCCIOS PROPOSTOS
2

Um ponto em R pode ser definido por um par ordenado


cartesiano. Podendo ser definido como segue:

( x, y ) ,

formando uma coordenada no plano

struct PONTO
{
double x, y;
};
Uma reta pode ser representada por um ponto (definio anterior) e pelo seu coeficiente angular e pode ser
definido como segue:
struct RETA
{
struct PONTO p;
double m;
};
Levando em conta as definies anteriores implemente os programas que seguem:
1. Faa um programa que leia duas retas, mostre as suas equaes
maior coeficiente angular.

( y = ax + b )

e qual delas possui a

2. Faa um programa que leia duas retas e informe se as retas lidas so paralelas ou no. Duas retas, no
verticais, distintas so paralelas se, e somente se, possuem o mesmo coeficiente angular.
3. Implemente um programa que leia duas retas e informe se estas retas so perpendiculares ou no. Duas
retas, no verticais, distintas so perpendiculares se, e somente se, o coeficiente angular de uma das
retas simtrico do inverso do coeficiente angular da outra reta.
4. Construa um programa que leia um ponto e um reta e informe se o ponto pertence ou no a esta reta.
pg. 79

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
5. Codifique um programa que leia duas retas e se forem concorrentes, calcule e mostre ponto de
intercesso. Duas retas, no verticais, distintas so concorrente se no forem paralelas.
Tanto um cone como um cilindro pode ser definido pelo seu raio e altura, como segue:
struct CONE
{
double Raio;
double Altura;
};
struct CILINDRO
{
double Raio;
double Altura;
};
Levando em conta as definies anteriores, implemente os programas que seguem:
6. Implemente um programa que leia dois cubos e informe qual dos dois possui o maior volume.
7. Codifique um programa que leia um cone, calcule e mostre a altura que um cilindro deve ter de modo que
possua o mesmo volume do cone. O cilindro e o cone possuem a mesma base.
8. Desejamos calcular, a partir do sexo e da altura, o peso ideal de uma pessoa. Para isto devemos saber
que existem duas frmulas, que so:
para homens:
para homens:

peso _ ideal = ( 72,7 * altura ) 58 ;


peso _ ideal = ( 62,1 * altura ) 44,7 ;

Para a implementao deste programa utilize a definio abaixo:


struct PESSOA
{
char Nome[40];
char Sexo;
int Idade;
double Altura;
};
Elabore um programa que leia as informaes de uma pessoa e informe se esta pessoa est obesa
ou no. Para que uma pessoa seja considerada obesa, a diferena entre o seu peso e o peso ideal deve ser
superior 40 quilogramas.
9. Codifique um programa que leia o nome e o peso de um boxeador e informe categoria a qual o boxeador
pertence, seguindo a tabela abaixo:
Categoria
Palha
Pluma
Leve
Pesado
Super Pesado

Peso (Kg)
menor que 50 Kg
50 - 59,999
60 - 75,999
76 - 87,999
maior ou igual 88

Utilize na implementao a estrutura abaixo:


struct BOXEADOR
{
char Nome[40];
float Peso;
};
pg. 80

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
10. Faa um programa que escolha a moeda a ser lida (1 - libra, 2 - franco, 3 - dlar, 4 - marco ou 5 - real),
leia um montante, transforme (conforme tabela) e mostre o valor equivalente nas outras moedas. Utilize para
isto uma estrutura chamada MOEDA, que possui os seguinte elementos: Libra, Franco, Dlar, Marco e Real.
Moeda
1 dlar americano
1 libra esterlina
1 franco francs
1 marco alemo

Valor (R$)
1,12
0,96
1,37
1,15

11. Faa um programa que leia trs valores A, B e C, verifique se eles podem ser os comprimentos dos lados
de um tringulo e, se forem, verificar se compem um tringulo equiltero, issceles ou escaleno. Informar
tambm se no compuserem nenhum tringulo.
Lembramos que:

comprimento de cada lado de um tringulo menor do que a soma dos comprimentos dos outros dois
lados.
Chama-se tringulo equiltero ao tringulo que tem os comprimentos dos trs lados iguais.
Chama-se tringulo issceles ao tringulo que tem os comprimentos de dois lados iguais. Portanto, todo
tringulo equiltero tambm issceles.
Chama-se tringulo escaleno ao tringulo que tem os comprimentos de seus trs lados diferentes.

12. Faa um programa que seja capaz de concluir qual dentre os animais seguintes foi escolhido, atravs de
perguntas e respostas. Animais possveis: ona, boi, porco, homem, mico leo, morcego, golfinho, avestruz,
pingim, pato, condor, jabuti, jacar, sucuri.
exemplo:
mamfero? S
quadrpede? S
carnvoro? N
herbvoro? S
Ento o animal escolhido foi o boi.
- mamfero

- aves

- rpteis

- quadrpede

- carnvoro
- herbvoro
- onvoro

- ona
- boi
- porco

- bpede

- onvoro
- frutfero

- homem
- mico leo

- voadores

- morcego

- aquticos

- golfinho

- no voadoras

- tropical
- polar

- nadadoras

- pato

- de rapina

- condor

- com casco

- jabuti

- carnvoro

- jacar

- sem patas

- sucuri

- avestruz
- pingim

13. Faa um programa que leia um nmero real e informe se este nmero possui ou no casas decimais
(parte fracionria).
pg. 81

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
14. Elabore um programa que leia um nmero real e mostre o nmero arredondado. Os critrios so: 2,2 vai
para 2,0; 2.8 vai para 3,0; 2,5 vai para 3,0.
12.2 COMANDOS DE REPETIO
A linguagem C possui trs comandos estruturados de repetio, que so: while, do - while
e o for. Os comandos de repetio so responsveis por permitirem que um bloco de cdigo seja repetido
por um nmero finito de vezes. Quem controla o nmero de vezes (iteraes) que o comando faz so as
expresses lgicas.
12.2.1 COMANDO DE REPETIO WHILE
O comando de repetio while caracteriza-se por fazer o teste no incio. Por isso muitas
vezes dito comando de repetio com teste no incio. Isto implica que nem sempre o cdigo dentro do bloco
do comando ser executado. Isto elimina a necessidade de efetuar um teste condicional antes do comando.
A forma geral de um comando while seria:
while (condio)
instruo 1;
Representao atravs de um diagrama de blocos.

Avaliar
Condio
Verdadeiro
executar
instruo 1

falso

Onde condio uma expresso lgica. Enquanto o resultado da expresso lgica for
verdadeiro (na linguagem C verdadeiro qualquer valor diferente de 0 (zero)) a instruo 1 executada.
Caso contrrio, a instruo 1 no ser executada.
OBS. Vale lembrar que se tivermos mais que uma linha de cdigo (instruo) a ser executada dentro de uma
comando while, obrigatrio a utilizao de chaves ({,}), para marcar o incio e final do bloco de cdigo do
comando while.
O programa a seguir preenche um vetor de 10 posies da seguinte maneira. As posies
de ndice mpar preenchido com o valor trs e as posies de ndice par com o valor dois.
void main(void)
{
int i, v[10];
i = 0;
while (i < 10)
{
if (i % 2)
v[i] = 3;
else
v[i] = 2;
i++;
}
}

pg. 82

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Representao do programa anterior atravs de um diagrama de blocos.

i = 0;

verdadeiro
verdadeiro

Avaliar
i%2

v[i] = 3;

falso

Avaliar
i < 10
falso

v[i] = 2;

i++;

O programa anterior poderia ser rescrito utilizando o operador interrogao dois pontos (?
:). A seqncia de cdigo ficaria:
void main(void)
{
int i, v[10];
i = 0;
while (i < 10)
v[i++] = (i % 2) ? (3) : (2);
}
Exemplo: O programa abaixo calcula a mdia aritmtica de um vetor de nmeros reais e
tambm extrai o maior e o menor nmero do vetor. O vetor inicializado na declarao.
void main()
{
unsigned int i;
double vetor[7] = {1.1, 2.3, 2.0, 4.6, 5.0, 3.0, 5.6};
double mdia, menor, maior, acumulador;
menor = 99;
maior = acumulador = i = 0;
while (i < sizeof(vetor) / sizeof(double))
{
acumulador = acumulador + v[i];
if (v[i] < menor)
menor = v[i];
else
if (v[i] > maior)
maior = v[i];
i++;
}
mdia = acumulador / (sizeof(vetor) / sizeof(double));
}
12.2.2 COMANDO DE REPETIO DO - WHILE
O comando de repetio do - while possui o teste no final do comando. Isto garante que
uma iterao sempre ser feita.
pg. 83

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
A forma geral de um comando do - while seria:
do
instruo 1;
while (condio);
Onde condio uma expresso lgica. Enquanto o resultado da expresso lgica for
verdadeiro (na linguagem C verdadeiro qualquer valor diferente de 0 (zero)) a instruo 1 executada.
Caso contrrio, a instruo 1 no ser executada.
Representao atravs de um diagrama de blocos.

Execuo da
instruo 1
verdadeiro

Avaliar
Condio
falso

OBS. Se tivermos mais que uma linha de cdigo a ser executada dentro do comando do - while, obrigatrio a
colocao de chaves para indicar o incio e final do bloco do comando do - while.
OBS. bom salientar que o comando do while sempre acaba com um ponto-e-vrgula (;) na linha da
declarao do while.
O programa abaixo calcula o fatorial do nmero 4.
1.
2.
3.

void main()
{
int x, f;

4.
5.
6.
7.
8.
9.
10. }

x = f = 1;
do
{
f *= x;
x++;
} while (x < 5);

Representao do programa anterior atravs de um diagrama de blocos.

x = 1;
f = 1;

f = f * x;
x++;
verdadeiro

avaliar
x<5
Falso

pg. 84

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
O programa anterior poderia ser rescrito da seguinte maneira:
void main()
{
int x, f;
x = f = 1;
do
f *= x++;
while (x < 5);
}
12.2.3 COMANDO DE REPETIO FOR
O comando de repetio for tambm chamado de comando de repetio com varivel de
controle. Na sua declarao existem trs expresses que so: inicializao, condio e
incremento/decremento. O interessante deste comando que o controle todo est na sua declarao. A
inicializao e incremento/decremento so expresses aritmticas, enquanto condio uma expresso
lgica, que controlar o nmero de repeties.
A forma geral de um comando for seria:
for (inicializao; condio; incremento/decremento)
instruo 1;

inicializao
avaliar
condio
verdadeiro
executar instruo 1

falso

Incremento/
decremento

OBS. Se tivermos mais que uma linha de cdigo, obrigatrio a utilizao de chaves ({,}), para marcar o incio e
final do bloco de cdigos pertencentes ao comando for.
O programa abaixo calcula o fatorial do nmero 4.
1.
2.
3.
4.
5.
6.
7.

void main()
{
int x, f;
f = 1;
for (x = 1; x < 5; x++)
f *= x;
}

Quando a execuo do programa estiver na linha 5, temos um comando for. Ser realizada
a inicializao da varivel x com o valor 1, a condio testada e se for verdadeira (para a linguagem C,
qualquer valor diferente de zero verdadeiro), executa a linha 6. Depois de executada uma interao,
incrementado o contedo da varivel x, neste caso em um.

pg. 85

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Representao do programa anterior atravs de um diagrama de blocos.

f = 1;
x = 1;
avaliar
falso
x<5
verdadeiro
f = f * x;
x++;

Os programas que seguem, geram a matriz descrita abaixo, de maneira diferentes,


utilizando os vrios comandos de repeties existentes na linguagem C.
SZZZZ
YSZZZ
YYSZZ
YYYSZ
YYYYS
Com o comando for:
void main()
{
char matriz[5][5], i, j;
for (i = 0; i < 5; i++)
for (j = 0; j < 5; j++)
if (i == j)
matriz[i][j] = W;
else
if (i < j)
matriz[i][j] = Z;
else
matriz[i][j] = Y;
}

pg. 86

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Com o comando while:
void main()
{
char matriz[5][5], i, j;
i = 0;
while (i < 5)
{
j = 0;
while (j < 5)
{
if (i == j)
matriz[i][j] = W;
else
if (i < j)
matriz[i][j] = Z;
else
matriz[i][j] = Y;
j++;
}
i++;
}
}
Com o comando do - while
void main()
{
char matriz[5][5], i, j;
i = 0;
do
{
j = 0;
do
{
if (i == j)
matriz[i][j] = W;
else
if (i < j)
matriz[i][j] = Z;
else
matriz[i][j] = Y;
j++;
} while (j < 5);
i++;
} while (i < 5);
}

pg. 87

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Observe o cdigo abaixo e analise o incremento das variveis i e j.
void main()
{
char matriz[5][5], i, j;
i = 0;
do
{
j = 0;
do
{
if (i == j)
matriz[i][j] = 'W';
else
if (i < j)
matriz[i][j] = 'Z';
else
matriz[i][j] = 'Y';
} while (++j < 5);
} while (++i < 5);
}
12.3 COMANDOS DE DESVIOS INCONDICIONAIS
12.3.1 COMANDO BREAK
O comando break quando utilizado dentro de uma estrutura de repetio, provoca um
desvio do fluxo do programa para fora do comando de repetio. Evitando o teste condicional normal do lao.
O cdigo a seguir mostra uma utilizao simples do comando break.
void main()
{
int t, c = 0;
for (t = 0; t < 100; t++)
{
c++;
if (t == 5)
break;
}
}
Quando a execuo do programa acima estiver na linha 9, um salto para a linha 11 ser
dado, ou seja, a execuo do programa ir para esta linha.
12.3.2 COMANDO CONTINUE
O comando continue quando utilizado dentro de uma estrutura de repetio, provoca um
desvio do fluxo de modo que ocorra uma nova iterao, pulando qualquer cdigo intermedirio.
O cdigo a seguir mostra uma utilizao simples do comando continue.

pg. 88

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
void main()
{
char string[36] = Ca sa, *s;
int contador;
s = string;
for (contador = 0; *s; s++)
{
s++;
if (*s != )
continue;
contador++;
}
}
12.4 EXERCCIOS PROPOSTOS
12.4.1 SRIES
1. Fazer um programa que calcule e escreva o valor de S.

1 3 5 7
99
S = + + + +...+
1 2 3 4
50
2. Fazer um programa que calcule e escreva a seguinte soma:

21 2 2 2 3
250
+
+
+...+
50 49 48
1
3. Fazer um programa para calcular e escrever a seguinte soma:

S=

37 x 38 36 x 37 35x 36
1x 2
+
+
+...+
1
2
3
37

4. Fazer um programa que calcule e escreva o valor de S onde:

1 2 3 4
5
6 10
S= + +
...
1 4 9 16 25 36 100
5. Fazer um programa que calcule e escreva a soma dos 50 primeiros termos da seguinte srie:

1000 997 994 991

+...
1
2
3
4
6. Fazer um programa que calcule e escreva a soma dos 30 primeiros termos da srie:

480 475 470 465

+...
10
11
12
13
7. Fazer um programa para gerar e escrever uma tabela com os valores do seno de um ngulo A em
radianos, utilizando a srie de Mac-Laurin truncada, apresentada a seguir:

pg. 89

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira

sen A = A

A3 A5
A7
+

6 120 5040

Condies: os valores dos ngulos A devem variar de 0,0 a 6,3, inclusive, de 0,1 em 0,1.
8. O valor aproximado de

pode ser calculado usando-se a srie:

S=

1 1 1
1
1
3 + 3 3 + 3 ...
3
1 3 5
7
9

. Fazer um programa para calcular e escrever o valor de

sendo

com 51 termos.

9. Fazer um programa que calcule e escreva o valor de S, atravs do somatrio que segue:

S=

1
2
4
8
16384

+...+
225 196 169 144
1

10. Fazer um programa que calcule e escreva a soma dos 20 primeiros termos da srie:

100 99 98 97
+
+
+
+...
0 ! 1! 2 ! 3!
11. Fazer um programa que calcule e escreva a soma dos 50 primeiros termos da srie:

1! 2 ! 3! 4 ! 5 !
+ + ...
1 3 7 15 31
12.4.1.1 RESPOSTA DOS EXERCCIOS SOBRE SRIES
Exerccio 1 - Soma = 95.50079466167059650000
Exerccio 2 - Soma = 1560828692041339.75000000000000000000
Exerccio 3 - Soma = 4080.75078370370875000000
Exerccio 4 - Soma = 0.64563492063492078400
Exerccio 5 - Soma = 685.29690205764632100000
Exerccio 6 - Soma = 21.11071558638006710000
Exerccio 7
Seno 0.0 = 0.00000000000000000000
Seno 0.1 = 0.09983341664682540700
Seno 0.2 = 0.19866933079365081700
Seno 0.3 = 0.29552020660714289900
Seno 0.4 = 0.38941834158730159700
Seno 0.5 = 0.47942553323412701000
Seno 0.6 = 0.56464244571428567900
Seno 0.7 = 0.64421757652777778000
Seno 0.8 = 0.71735572317460316600
Seno 0.9 = 0.78332584982142849900
Seno 1.0 = 0.84146825396825386500
Seno 1.1 = 0.89120093311507930800
Seno 1.2 = 0.93202505142857139400
pg. 90

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Seno 1.3 = 0.96352940640873019400
Seno 1.4 = 0.98539379555555561800
Seno 1.5 = 0.99739118303571427900
Seno 1.6 = 0.99938856634920636400
Seno 1.7 = 0.99134644299603169600
Seno 1.8 = 0.97331677714285702600
Seno 1.9 = 0.94543936628968239200
Seno 2.0 = 0.90793650793650770800
Seno 2.1 = 0.86110586624999974100
Seno 2.2 = 0.80531143873015831300
Seno 2.3 = 0.74097252287698367500
Seno 2.4 = 0.66855058285714219500
Seno 2.5 = 0.58853391617063421900
Seno 2.6 = 0.50142002031745946900
Seno 2.7 = 0.40769555946428470700
Seno 2.8 = 0.30781383111110993700
Seno 2.9 = 0.20216963275793514700
Seno 3.0 = 0.09107142857142705440
Seno 3.1 = -0.02528928394841438790
Seno 3.2 = -0.14687150730158918300
Seno 3.3 = -0.27382127732143063400
Seno 3.4 = -0.40651129650793882400
Seno 3.5 = -0.54558376736111369200
Seno 3.6 = -0.69199652571428849100
Seno 3.7 = -0.84707257406746339100
Seno 3.8 = -1.01255311492063838000
Seno 3.9 = -1.19065418410714674000
Seno 4.0 = -1.38412698412698765000
Seno 4.1 = -1.59632201748016200000
Seno 4.2 = -1.83125712000000274000
Seno 4.3 = -2.09368949418650985000
Seno 4.4 = -2.38919184253968364000
Seno 4.5 = -2.72423270089285730000
Seno 4.6 = -3.10626107174603039000
Seno 4.7 = -3.54379545759920322000
Seno 4.8 = -4.04651739428570867000
Seno 4.9 = -4.62536958430554712000
Seno 5.0 = -5.29265873015871779000
Seno 5.1 = -6.06216316767855368000
Seno 5.2 = -6.94924539936505603000
Seno 5.3 = -7.97096962771822248000
Seno 5.4 = -9.14622438857138853000
Seno 5.5 = -10.49585038442455160000
Seno 5.6 = -12.04277361777771380000
Seno 5.7 = -13.81214392446420550000
Seno 5.8 = -15.83147900698402740000
Seno 5.9 = -18.13081406783717850000
Seno 6.0 = -20.74285714285699460000
Seno 6.1 = -23.70315023454347170000
Seno 6.2 = -27.05023634539660900000
Seno 6.3 = -30.82583251124974310000
Seno 6.4 = -35.07500893460287020000
Exerccio 8 - Soma = 3.14158881890944786000
Exerccio 9 - Soma = 14693.63808699286530000000
Exerccio 10 - Soma = 269.10990101744556600000
Exerccio 11 - Soma = -2.597495598776510110000000000000000000000e+49
pg. 91

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
12.4.2 VETORES
1. Faa um programa que leia um vetor de inteiros de oito elementos e mostre este vetor na mesma linha,
com um espao entre os elementos.
2. Faa um programa que leia um vetor de reais de tamanho igual dez e mostre o valor do somatrio dos
elementos do vetor.
3. Faa um programa que leia um vetor de inteiros de tamanho igual quinze e informe o menor elemento do
vetor.
4. Implemente um programa que leia um vetor de inteiros de tamanho igual doze e informe o maior e o
menor valor existente neste vetor.
5. Implemente um programa que leia um vetor de inteiros de tamanho igual quinze, calcule e mostre a
amplitude dos elementos. A amplitude a diferena entre o maior e o menor elemento do vetor.
6. Faa um programa que leia um vetor qualquer de dez posies, calcule e mostre a mdia aritmtica dos
elementos deste vetor.
7. Faa um programa que leia dois vetores de caracteres, de tamanhos iguais cinco e oito respectivamente.
Gere um terceiro vetor que possua as informaes dos dois vetores lidos respetivamente (um na seqncia
do outro).
10. Construa um programa que leia um vetor de quinze elementos quaisquer. Calcule a varincia e o desvio
padro dos dados deste vetor. Onde:
n 1

Variancia = ( v i media ) 2

desvio = var iancia

i= 0

11. Faa um programa que leia uma seqncia de caracteres (string) e conte e mostre o nmero de vogais
desta seqncia de caracteres.
12. Implemente um programa que leia um vetor, de caracteres, de tamanho igual dez, mostre o vetor lido,
inverta e mostre o vetor invertido. Para realizar a inverso, tente no utilizar outro vetor, faa a inverso no
mesmo vetor.
13. Faa um programa que leia um valor (base dez) inteiro, maior ou igual zero contido no intervalo 1 a 255
inclusive, tranforme e mostre este valor na base dois. Faa este programa de duas maneira, utilizando um
vetor e sem vetor. Faa tambm uma consistncia do nmero lido, informando que o nmero no vlido
(fora do intervalo pedido). O programa acaba quando for lido o valor 0 (zero).
12.4.3 MATRIZES
1. Faa um programa que leia uma matriz (5x5) de caracteres e mostre a matriz no formato de matriz que
estamos acostumados.
2. Construa um programa que leia duas matrizes de ordem trs e mostre a soma destas duas matrizes.
3. Implemente um programa que leia duas matrizes de ordem trs, calcule e mostre o resultado da
multiplicao das matrizes.
4. Faa um programa que l uma matriz (4x2), l um escalar e mostra o resultado da multiplicao da matriz
lida pelo escalar.

pg. 92

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
5. Faa um programa que gere e mostre a seguinte matriz:
1
1
1
1
1
1
1
1
1
1

1
1
1
1
1
1
1
1
1
1

1
1
1
1
1
1
1
1
1
1

1
1
1
1
1
1
1
1
1
1

1
1
1
1
1
1
1
1
1
1

1
1
1
1
2
2
2
2
2
2

1
1
1
1
2
2
2
2
2
2

1
1
1
1
2
2
2
2
2
2

1
1
1
1
2
2
2
2
2
2

1
1
1
1
2
2
2
2
2
2

6. Faa um programa que gere e mostre a seguinte matriz:


2
2
2
2
1
1
1
1
1
1

2
2
2
2
1
1
1
1
1
1

2
2
2
2
1
1
1
1
1
1

2
2
2
2
1
1
1
1
1
1

2
2
2
2
1
1
1
1
1
1

1
1
1
1
2
2
2
2
2
2

1
1
1
1
2
2
2
2
2
2

1
1
1
1
2
2
2
2
2
2

1
1
1
1
2
2
2
2
2
2

1
1
1
1
2
2
2
2
2
2

7. Faa um programa que gere e mostre a seguinte matriz:


2
2
2
2
1
1
1
1
1
1

2
2
2
2
1
1
1
1
1
1

2
2
2
2
1
1
1
1
1
1

1
1
1
1
1
1
1
1
1
1

1
1
1
1
1
1
1
1
1
1

1
1
1
1
1
1
1
1
1
1

1
1
1
1
2
2
2
2
2
2

1
1
1
1
2
2
2
2
2
2

1
1
1
1
2
2
2
2
2
2

1
1
1
1
2
2
2
2
2
2

8. Faa um programa que gere e mostre a seguinte matriz:


A
A
A
A
A
A
A
A
A
A

A
A
A
A
A
A
A
A
A
A

A
A
B
B
B
B
B
B
A
A

A
A
B
B
B
B
B
B
A
A

A
A
B
B
B
B
B
B
A
A

A
A
B
B
B
B
B
B
A
A

A
A
B
B
B
B
B
B
A
A

A
A
B
B
B
B
B
B
A
A

A
A
A
A
A
A
A
A
A
A

A
A
A
A
A
A
A
A
A
A

pg. 93

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
9. Faa um programa que gere e mostre a seguinte matriz:
0
0
0
0
0
0
0
0
0
0

1
1
1
1
1
1
1
1
1
1

0
0
0
0
0
0
0
0
0
0

1
1
1
1
1
1
1
1
1
1

0
0
0
0
0
0
0
0
0
0

1
1
1
1
1
1
1
1
1
1

0
0
0
0
0
0
0
0
0
0

1
1
1
1
1
1
1
1
1
1

0
0
0
0
0
0
0
0
0
0

1
1
1
1
1
1
1
1
1
1

10. Faa um programa que gere e mostre a seguinte matriz:


0
1
0
1
0
1
0
1
0
1

0
1
0
1
0
1
0
1
0
1

0
1
0
1
0
1
0
1
0
1

0
1
0
1
0
1
0
1
0
1

0
1
0
1
0
1
0
1
0
1

0
1
0
1
0
1
0
1
0
1

0
1
0
1
0
1
0
1
0
1

0
1
0
1
0
1
0
1
0
1

0
1
0
1
0
1
0
1
0
1

0
1
0
1
0
1
0
1
0
1

11. Faa um programa que gere e mostre a seguinte matriz:


0
0
0
0
0
0
0
0
0
0

0
0
0
0
0
0
0
0
0
0

0
0
0
0
0
0
0
0
0
0

0
0
0
0
0
0
0
0
0
0

0
0
0
0
0
0
0
0
0
0

0
0
0
0
0
0
0
0
0
0

1
1
1
1
1
1
1
1
1
1

1
1
1
1
1
1
1
1
1
1

1
1
1
1
1
1
1
1
1
1

1
1
1
1
1
1
1
1
1
1

12. Faa um programa que gere e mostre a seguinte matriz:


A
A
A
A
A
A
A
B
B
B

A
A
A
A
A
A
A
B
B
B

A
A
A
A
A
A
A
B
B
B

A
A
A
A
A
A
A
B
B
B

A
A
A
A
A
A
A
B
B
B

A
A
A
A
A
A
A
B
B
B

A
A
A
A
A
A
A
B
B
B

A
A
A
A
A
A
A
B
B
B

A
A
A
A
A
A
A
B
B
B

A
A
A
A
A
A
A
B
B
B

pg. 94

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
13. Faa um programa que gere e mostre a seguinte matriz:
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A

A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A

A
A
B
B
B
B
A
A
A
B
B
B
B
A
A
A

A
A
B
B
B
B
A
A
A
B
B
B
B
A
A
A

A
A
B
B
B
B
A
A
A
B
B
B
B
A
A
A

A
A
B
B
B
B
A
A
A
B
B
B
B
A
A
A

A
A
B
B
B
B
A
A
A
B
B
B
B
A
A
A

A
A
B
B
B
B
A
A
A
B
B
B
B
A
A
A

A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A

A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A

A
A
B
B
B
B
B
B
B
B
B
B
B
B
A
A

A
A
B
B
B
B
B
B
B
B
B
B
B
B
A
A

A
A
B
B
B
B
B
B
B
B
B
B
B
B
A
A

A
A
B
B
B
B
B
B
B
B
B
B
B
B
A
A

A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A

A
A
A
A
A
A
A
A
A
A
A
A
A
A
A
A

14. Construa um programa que leia uma matriz (4x3), calcule e mostre o somatrio dos valores contidos linha
por linha. Por exemplo:
1
1,1
2
5

2
0,1
0,2
1

1
2
0,1
2

4
2,2
2,3
8

15. Implemente um programa que leia uma matriz (4x3), calcule e mostre o somatrio dos valores contidos
coluna por coluna. Por exemplo:
1
1,1
2
5

9,1

2
0,1
0,2
1

3,3

1
2
0,1
2

5,1

12.4.4 EXERCCIOS GERAIS SOBRE REPETIES


1. Faa um programa que leia um valor do tipo float (32 bits) e mostre como este float est armazenado na
memria do computador, mostrando o contedo e a seqncia dos bytes que representam o float lido.
Exemplo: o nmero 2513.125, seria mostrado:
8D06:0FFF - 45
8D06:0FFE - 1D
8D06:0FFD - 12
8D06:0FFC - 00

pg. 95

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
2. Elabore um programa que leia um valor inteiro e mostre a tabuada deste nmero, da seguinte maneira.
Suponha que o nmero lido seja o 5, o programa mostraria:
5x1=5
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45
5 x 10 = 50
3. Faa um programa que leia o valor N, um nmero inteiro positivo e calcule o valor do seguinte somatrio:

S = 1

1 1 1
1
+ +...+
2 3 4
N

4. O nmero 3025 possui a seguinte caracterstica:

30 + 25 = 55

55 * 55 = 3025
Construa um programa que pesquise e mostre todos os nmeros de quatro algarismos que
apresentam tal caracterstica.
5. Faa um programa que pesquise, no intervalo de 0 a 200, os nmeros perfeitos. Um nmero perfeito
aquele cuja soma de seus divisores, exceto ele prprio, igual ao nmero. Exemplo: 6 perfeito porque
1 + 2 + 3 = 6.
6. Faa um programa que mostre os nmeros primos no intervalo de 100 a 200. Um nmero primo se e
somente se ele for divisvel por 1 ou ele mesmo.
7. Faa um programa que leia um nmero inteiro e positivo e mostre este nmero invertido. Sem utilizar
vetor. Exemplo: foi lido 3456 o programa mostrar 6543.
8. A quadrado de um nmero inteiro e positivo igual soma dos n primeiros termos mpares. Faa um
programa que leia um nmero inteiro e positivo, calcule o quadrado deste nmero e mostre-o em seguida.
Exemplo:

32 = 1 + 3 + 5 = 9
n 1

n 2 ( 2 * i + 1)
i= 0

pg. 96

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
13. FUNES
As funes so uma das caractersticas mais importantes da linguagem C. As funes so,
nada mais nada menos, que, blocos de cdigos, identificados por um nome, onde toda a atividade do
programa ocorre. O cdigo de uma funo um bloco discreto. O cdigo de uma funo privativo funo
e nenhum outro comando pode ter acesso em uma outra funo. Exceto atravs de uma chamada de funo.
A forma geral de uma funo :
[modificador] tipo nome_da_funo([modificador] tipo identificador 1, . . .)
[modificador] tipo *nome_da_funo([modificador] tipo identificador 1, . . .)
Onde, o nome_da_funo seria um identificador para a funo, que seguem as mesmas
regras do identificador de uma varivel.
O nome de uma funo deve ter uma seqncia significativa, por exemplo: Mdia,
RetornaMdia, MaiorValor LeNotas, LeNota, LeNumero, LeReal, LeNome, RetTurmaAluno, RetornaTurma,
RetornaMediaBimestral, MdiaBimestral, CalculaImposto, MontaMatriz, CalculaVetor, RetNomeUsuario,
MontraQuadro, Crculo, Moldura, RetornaCaractere, RetornaSexo, Simpson, Gauss, MulMatriz, SomaMatriz,
Inversa, MatrizInversa, RetornaElemento, GeraMatriz, GeraVetor, CopiaString, StrTamanho, StrConcatena e
etc.
O nome dever ser compatvel com o que a funo faz. Como as funes da biblioteca
padro da linguagem C, so todas escritas com letras minsculas, de bom grado utilizar nomes para as
funes que comecem com letras maisculas, como vimos no pargrafo anterior.
Tudo que est antes do nome da funo o especificador de valor que o comando return
da funo devolve, podendo ser qualquer tipo vlido. Se nenhum tipo especificado, o default (o que
compilador assume) que a funo devolve um valor inteiro.
A funo tambm pode no retornar nada. Aparecendo o tipo void, especificando um
conjunto vazio de valores. O void usado como tipo retornado por funes que no retornam nada.
As informaes que esto aps o nome da funo, entre parnteses, so os parmetros,
que se trata de uma lista de declaraes de variveis. Sendo uma lista, estas variveis so separadas por
vrgulas, quando existirem mais que uma declarao.
Uma funo pode no ter parmetro algum, neste caso a lista de parmetros vazia.
Apenas abrem-se e fecham-se os parnteses ou escrevemos void dentro dos parnteses.
Os parmetros (variveis declaradas) e as variveis declaradas dentro do bloco de cdigo
da funo, so ditas variveis locais, locais ao bloco de cdigo, (locais na funo). As variveis locais no
podem manter os seus valores entre as chamadas de funes. A nica exceo so para as variveis
estticas (static), fazendo com que o compilador trate varivel com se ela fosse uma varivel global, para
fins de armazenamento, mas ainda limita sua atuao para dentro da funo.
Uma varivel dita global, quando for declarada fora da(s) funo(es). Esta varivel est
armazenada na rea de dados e sempre iniciada com o valor zero (0, NULL, \0). Uma varivel global pode
ser utilizada dentro de qualquer uma das funes, da o termo: a varivel visvel em todo o programa.
Na linguagem C, todas as funes esto no mesmo nvel de escopo. Obedecem as
mesmas regras de escopo que governam se um bloco de cdigo conhece ou tem acesso a outro bloco de
cdigo ou dados. No possvel definir uma funo dentro de uma outra funo. Isto mostra que a linguagem
C no uma linguagem estruturada em blocos.
O programa abaixo mostra a utilizao de funes em um programa. O programa possui
trs funes (main, Quadrado e Cubo). Observe tambm que podemos chamar uma funo dentro de outra
funo.

pg. 97

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
1.
2.

double Cubo(double);
double Quadrado(double);

3.

double c, q;

4.
5.
6.

void main()
{
double v;

7.
8.
9.
10. }

v = 3;
q = Quadrado(v);
c = Cubo(3) + Quadrado(Cubo(v - 1) - 2);

11. double Cubo(double x)


12. {
13.
double r;
14.
15.
16. }

r = Quadrado(x) * x;
return (r);

17. double Quadrado(double x)


18. {
19.
double r;
20.
21.
22. }

r = x * x;
return (r);

Nas linhas 1 e 2, aparecem os prottipos das funes Quadrado e Cubo. O prottipo


(prototype) de uma funo avisa ao compilador quais os tipos e quantos argumentos (parmetros) a funo
receber e o tipo de dado que retornar. Quando a funo main estiver antes da seqncia das funes,
obrigado colocar os prottipos das funes no programa.
Observe a declarao das variveis c e q, que esto fora das funes, logo so ditas
variveis globais.
A varivel v, declarada na linha 8 uma varivel local ao bloco de cdigo da funo main.
Esta varivel s visvel (manipulada) dentro do bloco de cdigo desta funo.
As variveis x e r, declaradas nas linhas 11 e 13, so variveis locais ao bloco de cdigo da
funo Cubo, sendo visveis apenas neste bloco.
As variveis declaradas nas linhas 17 e 19 (x e r), so variveis locais ao bloco de cdigo
da funo Quadrado. Apesar de possurem o mesmo nome que as variveis locais funo Cubo, so
variveis diferentes, posies diferentes na memria.
Nas linhas 8, 9 e 14 ocorrem chamadas de funes. Quando ocorre uma chamada de
funo, o fluxo do programa deslocado para o bloco de cdigo da funo chamada.
Na linha 9, primeiro chamada a funo Cubo(v - 1), em seguida, a funo Quadrado. O
parmetro passado para a funo Quadrado seria o valor obtido do retorno da funo Cubo(v - 1), chamada
anteriormente, menos o valor 2 (dois). Por ltimo teramos chamada da funo Cubo passando o parmetro 3
(trs). Assim o valor retornado pela funo Quadrado mais o resultado retornado pela funo Cubo(3),
atribudo para a varivel c.

pg. 98

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Quando chamamos uma funo ocorrem os seguinte eventos:
1.
2.
3.
4.
5.
6.
7.

Empilha os parmetros (da direita para a esquerda).


Empilha o endereo de retorno.
Chama funo.
Se houver variveis locais reservar espao na pilha.
Executa s instrues.
Coloca o valor de retorno em um registrador.
Desempilha o endereo de retorno e para l retorna.

Nas linhas 15 e 21, aparece o comando return, que um comando de desvio incondicional
(no possui condio). Este comando tem dois importantes usos: primeiro - ele fora uma sada da funo;
segundo - o return usado para retornar um valor da funo.
13.1 PASSAGEM DE PARMETROS POR VALOR
A passagem de parmetros por valor copia o valor de um argumento no parmetro formal
da sub-rotina. Neste caso os valores so passados para a funo e precisam ser guardados em variveis
parmetros declaradas. O(s) valor(es) podem so utilizados dentro do bloco de cdigo da funo e depois do
retorno da funo so destrudos e os valores so perdidos.
Usaremos o exemplo anterior para mostrar a passagem de parmetros por valor.
Rescrevemos o programa apenas de uma forma diferente.
1.
2.

double Cubo(double);
double Quadrado(double);

3.

double c, q;

4.
5.
6.

void main()
{
double v;

7.
8.
9.
10. }

v = 3;
q = Quadrado(v);
c = Cubo(3) + Quadrado(Cubo(v - 1) - 2);

11. double Cubo(double x)


12. {
13.
return (Quadrado(x) * x);
14. }
15. double Quadrado(double x)
16. {
17.
return (x * x);
18. }
OBS. Uma cpia do valor do argumento que passado para a funo. O que ocorre dento da funo no tem
efeito algum sobre a varivel usada na chamada.
13.2 PASSAGEM DE PARMETROS POR REFERNCIA
Nesta maneira de passar um parmetro, o endereo de um argumento copiado no
parmetro. Dentro da funo (sub-rotina), o endereo usado para acessar o argumento real utilizado na
chamada. Isso significa que alteraes feitas no parmetro afetam a varivel usada para chamar a rotina.
O programa que segue, l trs valores inteiros (x, y e z), para depois coloc-los em ordem
crescente, trocando os valores de duas variveis quando necessrio.
pg. 99

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
1.
2.
3.

void main()
{
int a, x, y, z;

4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32. }

printf(x = );
scanf(%d,&x);
printf(y = );
scanf(%d,&y);
printf(z = );
scanf(%d,&z);
if (x > y || x > z)
{
if (y < z)
{
a = x;
x = y;
y = a;
}
else
{
a = x;
x = z;
z = a;
}
}
if (y > z)
{
a = y;
y = z;
z = a;
}
printf(%d - %d - %d,x,y,z);

Podemos perceber seqncias de cdigos que podem ser reunidas em uma funo. Seriam
as seqncias em que funcionalmente realizam a mesma coisa, como: trocarmos os valores de duas
variveis e lermos um nmero inteiro.
O programa ficaria:
1.
2.

int LerInteiro(char *);


void Trocar(int *, int *);

3.
4.
5.

void main()
{
int a, x, y, z;

6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17. }

x = LerInteiro(x = );
y = LerInteiro(y = );
z = LerInteiro(z = );
if (x > y || x > z)
if (y < z)
Trocar(&x,&y);
else
Trocar(&x,&z);
if (y > z)
Trocar(&y,&z);
printf(%d - %d - %d,x,y,z);

pg. 100

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
18. int LerInteiro(char *s)
19. {
20.
int n;
21.
22.
23.
24. }

printf(s);
scanf(%d,&n);
return (n);

25. void Trocar(int *a, int *b)


26. {
27.
int aux;
28.
29.
30.
31. }

aux = *a;
*a = *b;
*b = aux;

A funo Trocar uma funo que no retorna nada por isso no seu prottipo aparece, a
palavra reservada, void para informar que a funo na realidade retorna um conjunto vazio de valores.
Quando feita a chamada da funo Trocar, est sendo passado, como parmetros, o
endereo das variveis e no o seu valor. A declarao dos parmetros preciso declar-los como ponteiros
para o mesmo tipo do endereo passado. Dentro da funo Trocar, ocorrer troca dos dois valores.
Existindo a necessidade de uma varivel auxiliar (aux) e ser manipulado o contedo do endereo passado,
isto ser feito atravs do operador unrio *.
Como a funo Trocar manipula o contedo de endereos, quando do seu trmino, o
contedo (valor) armazenados nos endereos passados estaro modificados.
A funo LerInteiro recebe como parmetro o ttulo do campo, de modo a orientar qual
varivel est sendo entrada (digitada).
O programa anterior poderia ser rescrito, tendo na funo main as chamadas de funes
LerNumeros e OrdenarTresValores, o programa ficaria:
1.
2.
3.

void OrdenarTresValores(int *, int *, int *);


void LerNumeros(int *, int *, int *);
void Trocar(int *, int *);

4.
5.
6.

void main()
{
int a, b, c;

7.
8.
9.
10. }

LerNumeros(&a,&b,&c);
OrdenarTresValores(&a,&b,&c);
printf(%d - %d - %d,a,b,c);

11. void OrdenarTresValores(int *x, int *y, int *z)


12. {
13.
if (*x > *y || *x > *z)
14.
if (*y < *z)
15.
Trocar(x,y);
16.
else
17.
Trocar(x,z);
18.
if (y > z)
19.
Trocar(y,z);
20. }
pg. 101

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
21. void Trocar(int *a, int *b)
22. {
23.
int aux;
24.
25.
26.
27. }

aux = *a;
*a = *b;
*b = aux;

28. void LerNumeros(int *x, int *y, int *z)


29. {
30.
printf(x = );
31.
scanf(%d,x);
32.
printf(y = );
33.
scanf(%d,y);
34.
printf(z = );
35.
scanf(%d,z);
36. }
A funo LerNumeros passa os endereos das variveis onde os valores lidos do teclados
sero colocados. Note que a passagem por referncia.
No exemplo anterior, foi feito a funo OrdenarTresValores, que recebe os trs valores por
referncia e coloca os trs valores em ordem.
OBS. Os dois ltimos cdigos escritos, fazem a mesma coisa s que escritos de maneiras diferentes. Isto
importante por que vai conseguindo um refinamento do programa, deixando-o bastante funcional.
Algumas destas funes podem bem ser utilizadas em outros programass, reutilizando o cdigo sempre
que possvel.
13.3 CHAMANDO FUNES, PASSANDO E RETORNANDO ESTRUTURAS
Dado o programa: o cdigo que segue l o nome e o nmero do telefone, mostrando-os em
seguida, utilizando para isto uma estrutura.
1.
2.
3.
4.
5.

struct INFO
{
char Nome[20];
char Fone[12];
};

6.
7.
8.

void main()
{
struct INFO r;

9.
10.
11.
12.
13.
14. }

printf(Nome: );
scanf(%s,&r.Nome);
printf(Fone: );
scanf(%s,&r.Fone);
printf(Nome: %s - Fone: %s\n,r.Nome,r.Fone);

pg. 102

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
O programa anterior pode ser escrito de uma outra maneira. Vamos escrev-lo utilizando
duas funes, que seriam: LerInfo e MostrarInfo.
1.
2.
3.
4.
5.

struct INFO
{
char Nome[20];
char Fone[12];
};

6.
7.

void LerInfo(struct INFO *);


void MostrarInfo(struct INFO);

8. void main()
9. {
10.
struct INFO r;
11.
12.
13. }

LerInfo(&r);
MostrarInfo(r);

14. void LerInfo(struct INFO *a)


15. {
16.
printf(Nome: );
17.
scanf(%s,&a->Nome);
18.
printf(Fone: );
19.
scanf(%s,&a->Fone);
20. }
21. void MostrarInfo(struct INFO a)
22. {
23.
printf(Nome: %s - Fone: %s\n,a.Nome,a.Fone);
24. }
A funo LerInfo recebe como parmetro um dado do tipo struct INFO. A informaes lidas
via teclado, devero ser colocadas em um lugar na memria que a varivel a. A passagem do parmetro
por referncia, por que desejamos que o contedo exista depois do encerramento da funo.

pg. 103

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Poderamos escrever a funo LerInfo de uma outra maneira. Note que funcionalmente,
que a funo LerInfo, faz a mesma coisa.
1.
2.
3.
4.
5.

struct INFO
{
char Nome[20];
char Fone[12];
};

6.
7.

struct INFO LerInfo();


void MostrarInfo(struct INFO);

8. void main()
9. {
10.
struct INFO r;
11.
12.
13. }

r = LerInfo();
MostrarInfo(r);

14. void LerInfo()


15. {
16.
struct INFO a;
17.
18.
19.
20.
21.
22. }

printf(Nome: );
scanf(%s,&a.Nome);
printf(Fone: );
scanf(%s,&a.Fone);
return (a);

23. void MostrarInfo(struct INFO a)


24. {
25.
printf(Nome: %s - Fone: %s\n,a.Nome,a.Fone);
26. }
Note que a funo LerInfo retorna um tipo de dado, struct INFO, por isso obrigatrio o
uso de um return e da atribuio deste retorno a uma posio de memria.
13.4 CHAMANDO FUNES, PASSANDO UM VETOR COMO PARMETRO
Podemos passar como parmetro, para uma funo, um vetor. Este parmetro sempre ser
declarado, na funo, como ponteiro do tipo do vetor que foi passado.
OBS. A passagem de parmetro de vetores sempre por referncia (sempre passado o endereo do primeiro
elemento ([0]) e recebido na funo como um ponteiro do tipo do vetor passado.
O programa que segue calcula a mdia aritmtica do contedo de um vetor de inteiros, que
representam as idades de doze pessoas. O programa ir ler o vetor de idades, calcular a mdia e mostrar a
mdia das idades.

pg. 104

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
1.
2.
3.
4.

void main()
{
int Idades[12], i;
double Media = 0;

5.
6.
7.
8.
9.
10.
11.
12.
13. }

for (i = 0; i < 12; i++)


{
printf(Idades[%d] = ,i);
scanf(%lf,&Idades[i]);
}
for (i = 0; i < 12; i++)
Media += Idades[i] / 12.0;
printf(Media = %.2lf\n,Media);

O programa anterior poderia ser escrito utilizando uma funo que l o contedo do vetor
de idades e uma outra funo que calcula a mdia das idades do vetor. O programa ficaria assim:
1.
2.

void LerIdades(int *);


double CalcularMedia(int *);

3.
4.
5.
6.

void main()
{
int Idades[12];
double Media;

7.
8.
9.
10. }

LerIdades(Idades);
Media = CalcularMedia(Idades);
printf(Media = %.2lf\n,Media);

11. void LerIdades(int *v)


12. {
13.
int i;
14.
15.
16.
17.
18.
19. }

for (i = 0; i < 12; i++)


{
printf(v[%d] = ,i);
scanf(%lf,&v[i]);
}

20. double CalcularMedia(int *v)


21. {
22.
int i;
23.
double m = 0;
24.
25.
26.
27. }

for (i = 0; i < 12; i++)


m += v[i] / 12.0; // m += *(v + i) / 12.0;
return (m);

pg. 105

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
O programa que segue l um vetor de pontos no plano cartesiano e mostra estes pontos.
Inicialmente o programa sem funes:
1.
2.
3.
4.

struct PONTO
{
double x, y;
};

5.
6.
7.
8.

void main()
{
struct PONTO p[5];
int i;

9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19. }

for (i = 0; i < 5; i++)


{
printf(Ponto %d:\n,i);
printf(x = );
scanf(%lf,&p[i].x);
printf(y = );
scanf(%lf,&p[i].y);
}
for (i = 0; i < 5; i++)
printf(Ponto %d : (%lf,%lf)\n,i,p[i].x,p[i].y);
Rescrevendo o programa com duas novas funes (LerPontos e MostrarPontos) teramos:

1.
2.
3.
4.

struct PONTO
{
double x, y;
};

5.
6.

void LerPontos(struct PONTO *);


void MostrarPontos(struct PONTO *);

7.
8.
9.

void main()
{
struct PONTO p[5];

10.
11.
12. }

LerPontos(p);
MostrarPontos(p);

13. void LerPontos(struct PONTO *v)


14. {
15.
int i;
16.
17.
18.
19.
20.
21.
22.
23.
24. }

for (i = 0; i < 5; i++)


{
printf(Ponto %d:\n,i);
printf(x = );
scanf(%lf,&v[i].x);
printf(y = );
scanf(%lf,&v[i].y);
}

pg. 106

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
25. void MostrarPontos(struct PONTO *v)
26. {
27.
int i;
28.
29.
30. }

for (i = 0; i < 5; i++)


printf(Ponto %d : (%lf,%lf)\n,i,v[i].x,v[i].y);

13.5 CHAMANDO FUNES, PASSANDO UMA MATRIZ COMO PARMETRO


Podemos passar como parmetro, para uma funo, uma matriz. Este parmetro sempre
ser declarado, na funo, como ponteiro do tipo da matriz que foi passada.
OBS. A passagem de parmetro de matrizes sempre por referncia (sempre passado o endereo do
primeiro elemento ([0][0]) e recebido na funo como um ponteiro do tipo da matriz passada.
O programa que segue l uma matriz (3x2) e mostra o contedo da matriz, no formato de
matriz, que estamos acostumados.
1.
2.
3.
4.

void main()
{
int i, j;
double Matriz[3][2];

5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19. }

clrscr();
for (i = 0; i < 3; i++)
for (j = 0; j < 2; j++)
{
printf(m[%d][%d] = ,i,j);
scanf(%lf,&m[i][j]);
}
for (i = 0; i < 3; i++)
{
for (j = 0; j < 2; j++)
printf(%.1lf,m[i][j])
printf(\n);
}
getch(); // apenas para parar a tela

Podemos rescrever o programa utilizando funes. Criaremos duas funes: LerMatriz e


MostrarMatriz. A funo LerMatriz vai ler o contedo da matriz e colocar as informaes na memria, a partir
do endereo recebido como parmetro. O novo programa ficaria:

pg. 107

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira

OBS. Quando passado uma matriz como parmetro para uma funo, dentro da funo no podemos utilizar
os ndices linha e coluna, como de costume. Isto porque temos dentro da funo um ponteiro para um
endereo e a matriz est linearmente na memria, a partir deste endereo.
1.
2.

void LerMatriz(double *);


void MostrarMatriz(double *);

3.
4.
5.
6.

void main()
{
int i, j;
double Matriz[3][2];

7.
8.
9.
10.
11. }

clrscr();
LerMatriz((double *) Matriz,3,2);
MostrarMatriz((double *) Matriz,3,2);
getch(); // apenas para parar a tela

12. void LerMatriz(double *m, int l, int c)


13. {
14.
int i, j;
15.
16.
17.
18.
19.
20.
21. }

for (i = 0; i < l; i++)


for (j = 0; j < c; j++)
{
printf(m[%d][%d] = ,i,j);
scanf(%lf,&m[c * i + j]);
}

22. void MostrarMatriz(double *m, int l, int c)


23. {
24.
int i, j;
25.
26.
27.
28.
29.
30.
31. }

for (i = 0; i < l; i++)


{
for (j = 0; j < c; j++)
printf(%.1lf,m[c * i + j])
printf(\n);
}

pg. 108

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
14. ALOCAO DINMICA DE MEMRIA
Na linguagem C, podemos reservar blocos de bytes de memria dinamicamente, durante a
execuo do programa. O espao reservado estaria no heap.
Para reservarmos memria no heap, ns temos a funo malloc (memory allocation), da
biblioteca padro. O seu prottipo : void *malloc(size_t), que recebe como parmetro o nmero de bytes a
ser reservados no heap e retorna um ponteiro para o primeiro byte do bloco reservado. Se no existe
memria suficiente no heap, a funo malloc retorna NULL (0,\0). O prottipo pode ser encontrado em:
<stdlib.h>, <alloc.h>.
conveniente verificarmos sempre se conseguimos reservar memria, utilizando um if e
abortarmos o programa sempre que no conseguimos reservar espao na memria.
Sempre que um programa reservou memria no heap, no mesmo programa, deve ser
liberada a memria, atravs da funo free, que possui o seguinte prottipo: void free(void *), que encontro
em <stdlib.h>, <alloc.h>. A funo free recebe como parmetro o endereo do primeiro byte de um bloco.
O programa abaixo l uma seqncia de caracteres (string) e mostra em seguida. O espao
reservado para a seqncia de caracteres, que lida atravs da alocao dinmica de memria.
1.
2.
3.

void main()
{
char *Str;

4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15. }

Str = (char *) malloc(35); // reserva memria no heap


if (!Str)
{
// no conseguiu reservar memria no heap
puts(Faltou memria\a\n . . .);
exit(0);
}
printf(Nome: );
gets(Str);
printf(Nome lido: %s\n,Str);
free(Str);
// libera memria
getch();

O programa a seguir, l um vetor de cinco inteiros e mostra o contedo deste vetor.


Utilizando alocao dinmica de memria.
1.
2.
3.

void main()
{
int i, *v;

4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19. }

v = (int *) malloc(10);
// malloc(sizeof(int) * 5));
if (!v)
{
// no conseguiu reservar memria no heap
puts(Faltou memria\a\n . . .);
exit(0);
}
for (i = 0; i < 5; i++)
{
printf(v[%d] = );
scanf(%d,&v[i]);
}
for (i = 0; i < 5; i++)
printf(%d ,v[i]); // printf(%d ,*(v + i));
free(v); // libera memria
getch();
pg. 109

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
15. EXERCCIOS PROPOSTOS
15.1 STRINGS
OBS.
Deve ser tomado o maior cuidado possvel quanto manipulao de uma seqncia de caracteres na linguagem
C. Como existe uma flexibilidade grande de programao, fica a cargo do programador, que deve tomar cuidado
com a invaso do espao de memria de uma outra memria. O programador deve ter uma viso ampla do que
est sendo feito e pensar em tudo que for necessrio.
Quando manipulamos seqncias de caracteres, com a linguagem C, devemos pensar no barra invertida zero
(\0, 0 ou NULL). Existem situaes que necessrio o \0, outras no. O caractere barra invertida zero, na
linguagem C, tem a funo de finalizar (indicar o fim) de uma seqncia de caracteres.
Quando o retorno de uma funo, aps a manipulao de uma seqncia de caracteres, que ocorre por
referncia deve-se tomar cuidado para que esta seqncia de caracteres tenha espao reservado dentro do
endereo passado para funo.

OBS. Procure utilizar com e ou sem alocao dinmica de memria e observe os cdigos gerados.
1. Fazer um programa, que leia uma seqncia de caracteres (string) pelo teclado, atravs da funo gets,
da biblioteca padro. O programa deve mostrar o tamanho da seqncia de caracteres lida. O tamanho do
string (seqncia da caracteres) deve ser calculada atravs de uma funo chamada StrTam, que recebe
como parmetros um string e retorna o tamanho do string.
2. Fazer um programa, que leia uma seqncia de caracteres (string) pelo teclado, atravs da funo gets,
da biblioteca padro. O programa deve copiar o contedo do string lido para uma outra varivel (outra
posio de memria). Est cpia deve ser feita atravs de uma funo chamada StrCopia, que recebe dois
parmetros, dois strings. O prottipo da funo seria: void StrCopia(char *d, char *s), que copia o contedo
da varivel do ponteiro s para a varivel d. Obs. Note o tamanho reservado na memria para as variveis
em questo, principalmente depois da cpia realizada.
3. Fazer um programa, que leia duas seqncias de caracteres (strings) pelo teclado, atravs da funo gets,
da biblioteca padro. O programa deve mostrar os dois strings concatenados (o segundo string lido deve ser
colocado, na seqncia, logo aps o primeiro). A concatenao deve ser feita atravs da funo StrCat, que
recebe dois parmetros, dois strings. O prottipo da funo seria: void StrCat(char *d, char *s), que pe o
contedo da varivel ponteiro s, na seqncia da varivel ponteiro d, gerando a partir do ponteiro d o string
concatenado. Obs. Note o tamanho reservado na memria para a varivel ponteiro d aponta, deve ser
suficiente para receber o contedo das variveis ponteiros d e s.
4. Fazer um programa, que leia uma seqncia de caracteres (string) pelo teclado, atravs da funo gets,
da biblioteca padro. O programa deve mostrar o nmero de caracteres, letras, vogais e consoantes do string
lido. Para isto devemos construir as seguintes funes:

ContarVogais, que recebe um string como parmetro e retorna o nmero de vogais do string.

ContarConsoantes, que recebe um string como parmetro e retorna o nmero de consoantes do string.

ContarLetras, que recebe um string como parmetro e retorna o nmero de letras do string.

pg. 110

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
5. No mesmo programa anterior adicione a seguinte definio:
struct AVAL
{
int Vogais;
int Consoantes;
int Letras;
int Caracteres;
};
Construa trs novas funes que faro a mesma coisa, s que de maneiras diferentes. As funes
so:
struct AVAL PesquisarString(char *s), que recebe a seqncia de caracteres a ser analisada e a funo
retorna uma struct AVAL, preenchida corretamente.
void PesquisarString(char *s, struct AVAL *), que recebe a seqncia de caracteres a ser analisada e, por
referncia, retorna uma struct AVAL, preenchida corretamente.
int PesquisarString(char *s, int *v, int *c, int *l), que recebe a seqncia de caracteres a ser analisada e,
por referncia, retorna o nmero de vogais, consoantes e de letras. A funo retorna o nmero de caracteres
do string passado para a anlise.
6. A funo gets possui o incmodo, de no controlar o tamanho do string a ser lido. Faa um programa que
leia e mostre um string. Para lermos o string, devemos construir a funo LerString, que recebe como
parmetros um string e o tamanho mximo do string a ser lido. O prottipo seria: void LerString(char *s, int
t). A funo LerString retorna o string lido na varivel s, passada por referncia. A funo encerrada
quando:
A tecla RETURN (cdigo ASCII 13) for pressionada, colocando um \0 no final do string.
A tecla ESC (cdigo ASCII 27) for pressionada, colocando um \0 no primeiro byte do string, retornando
assim um string nulo).
O nmero de caracteres a serem digitados no pode exceder a t - 1, onde t foi passado como parmetro.
7. Rescreva a funo LerString, de modo que possua o seguinte prottipo: void LerString(char *s, int t, int
tipo), onde o tipo o tipo do caractere a ser lido, que far parte do string e que pode ser: 0 - ALFABTICO
(s caracteres alfabticos), 1 - ALFANUMRICO (s caracteres alfabticos e ou numricos), 2 NUM_INTEIRO (s caracteres numricos), 3 - NUM_REAL (s caracteres numricos e o caractere ponto) e 4
- SEM_TIPO (qualquer caractere ASCII). A funo no deixa ser lido um caractere que no faa parte do tipo
de caractere. Sugesto: utilize #defines para os tipos mencionados.
8. Faa um programa, que leia uma seqncia de caracteres numricos (utilize a funo LerString do
exerccio anterior), transforme e mostre o string lido em um inteiro. Para fazer esta transformao, escreva
uma funo que possua o seguinte prottipo: int RetornarInteiro(char *), que recebe como parmetro uma
seqncia de caracteres numricos (string numrico) e que retorna um inteiro.
9. Faa um programa, que leia uma seqncia de caracteres numricos mais o caractere ponto (utilize a
funo LerString dos exerccios anteriores), transforme e mostre o string lido em um real. Para fazer esta
transformao, escreva uma funo que possua o seguinte prottipo:double RetornarReal(char *), que
recebe como parmetro uma seqncia de caracteres numricos (string numrico) com ou sem o caractere
ponto e que retorna um inteiro.

pg. 111

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
10. Faa um programa que l dois nmeros: um inteiro e um real. A leitura destes dois nmeros devem ser
feitas atravs de duas funes, que so: Obs. Os valores devem ser lidos caractere a caractere usando a
funo getch(), da biblioteca padro, colocando-os em um vetor de caracteres finalizado sempre com
o caracteres \0. Utilize as funes dos exerccios 7, 8 e 9, respectivamente.
int LerInteiro(int n), que recebe como parmetro o nmero mximo de algarismos que possui o nmero a
ser lido por esta funo.
double LerReal(int n), que recebe como parmetro o nmero mximo de algarismos que possui o nmero a
ser lido por esta funo.
11. Faa um programa que leia um string (seqncia de caracteres) alfabtico, utilizando a funo void
LerString(char *s, int t, int tp) e converta esta seqncia de caracteres toda para maisculas e minsculas.
Para realizar tal tarefa construa as seguintes funes, que so:
void StrMai(char *s), que recebe como parmetro o endereo do primeiro byte de uma seqncia de
caracteres (string) e converte-os para maisculas.
void StrMin(char *s), que recebe como parmetro o endereo do primeiro byte de uma seqncia de
caracteres (string) e converte-os para minsculas.
char ChrMai(char c), que recebe um caractere, convete-o para maiusculo e retorna este caractere
convertido.
char ChrMai(char c), que recebe um caractere, convete-o para minsculo e retorna este caractere
convertido.
12. Construa um programa que utilize a funo void LerString(char *s, int t, int tp), para ler uma seqncia
de caracteres pelo teclado. O programa deve mostrar o tipo do string (da seqncia de caracteres), que pode
ser: 0 - ALFABTICO (s caracteres alfabticos), 1 - ALFANUMRICO (s caracteres alfabticos e ou
numricos), 2 - NUM_INTEIRO (s caracteres numricos), 3 - NUM_REAL (s caracteres numricos e o
caractere ponto) e 4 - SEM_TIPO (qualquer caractere ASCII). Para realizar tal tarefa construa um funo que
recebe o endereo de um string e retorna um inteiro conforme o tipo do string. O prottipo da funo seria: int
TipoString(char *s).

pg. 112

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
13. Dado o cdigo abaixo:
#define TAM 20
void MemSet(char *, char, int);
void main()
{
char *s = (char *) malloc(TAM);

// alocao de memria (heap)

if (!s)
{
puts(Faltou memria . . .\a\a);
exit(0);
}
puts(s);
MemSet(s,v,50);
puts(s);
free(s); // liberar a memria reservada com malloc
getch();
}

void MemSet(char *s, char c, int t)


{
___________________________________
___________________________________
___________________________________
___________________________________
___________________________________
___________________________________
___________________________________
}
Construa o cdigo da funo MemSet, que preenche uma rea de memria de t bytes, com o
caractere c.

pg. 113

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
14. Dado o programa abaixo
struct FONE
{
char Cdigo[3];
char rea[4];
char Nmero[4];
};

void MostrarFone( ______________, ______________ );


void main()
{
char s[11] = 0413301515;
struct FONE f = {{041},{330},{1563}};
MostrarFone(s,11);
MostrarFone(&f,11);
getch();
}

void MostrarFone( ______________, ______________ );


{
___________________________________________
___________________________________________
___________________________________________
___________________________________________
___________________________________________
___________________________________________
___________________________________________
___________________________________________
___________________________________________
___________________________________________
___________________________________________
___________________________________________
}
Cosntrua a funo MostrarFone. Esta funo mostra o nmero de um telefone, que pode estar em
um string ou em uma estrutura, como percebido no cdigo acima. O nmero do telefone mostrado no
seguinte formato: (041) 330-1515.

pg. 114

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
15.2 OPERADORES DE BITS
1. Complete a funo main do cdigo que segue implementando as funes que esto sendo chamadas. O
bit mais significativo seria o bit de nmero 8 (oito) e o bit menos significativo seria o bit de nmero 1 (um), ou
seja, a nmerao dos bits vo da direita para a esquerda (menos significativo para o mais significativo).
Funes a serem implementadas:
ContarBitsLigado - que recebe o contedo de um caractere como parmetro e retorna o nmero de bits
ligados deste caractere.
DesligarBit - que recebe o endereo de um caractere e o nmero do bit a ser desligado.
InverterBit - que rebebe o endereo de um caractere e o nmero do bit a ter o seu valor invertido, se 1 (um)
tornar 0 (zero) e vice-versa.
LigarBit - que recebe o endereo de um caractere e o nmero do bit a ser ligado.
EstadoBit - que recebe o contedo de um caractere e o bit a ser verificado o estado. Ligado ou desligado.

/********************************************************************************
Prottipos de funes
********************************************************************************/
_____________ ContarBitsLigado( _____________, _____________);
_____________ DesligarBit( _______________, _______________);
_____________ InverterBit( _______________, _______________);
_____________ LigarBit( _______________, _______________);
_____________ EstadoBit( _______________, _______________);
/*******************************************************************************
Funes
*******************************************************************************/
void main()
{
unsigned char Chr, Nbits, Bit;
Chr = 0x80;
LigarBit(&Chr,4);
Nbits = ContarBitsLigado(Chr);
LigarBit(&Chr,5);
Nbits = ContarBitsLigado(Chr);
Chr = ~Chr;
DesligarBit(&Chr,6);
DesligarBit(&Chr,5);
Nbits = ContarBitsLigados(Chr);
InverterBit(&Chr,4);
Bit = EstadoBit(Chr,1);
DesligarBit(&Chr,1);
pg. 115

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira

DesligarBit(&Chr,6);
Nbits = ContarBitsLigados(Chr);
}
_____________ ContarBitsLigado( _____________, _____________)
{
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
}
______________ DesligarBit( _______________, _______________)
{
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
}

pg. 116

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira

______________ InverterBit(_______________, _______________)


{
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
}
______________ LigarBit( _______________, _______________)
{
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
}
______________ EstadoBit(_______________, _______________)
{
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
}

pg. 117

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
2. Complete a funo main do cdigo que segue implementando as funes que esto sendo chamadas. O
bit mais significativo seria o bit de nmero 8 (oito) e o bit menos significativo seria o bit de nmero 1 (um),
ou seja, a nmerao dos bits vo da direita para a esquerda (menos significativo para o mais
significativo).
Funes a serem implementadas:
ContarBitsLigado - que recebe o contedo de um caractere como parmetro e retorna o nmero de bits
ligados deste caractere.
DesligarBit - que recebe o contedo de um caractere e o nmero do bit a ser desligado e retorna o caractere
com o bit desligado.
InverterBit - que rebebe um caractere e o nmero do bit a ter o seu valor invertido, se 1 (um) tornar 0 (zero)
e vice-versa e retorna o caractere com o bit invertido.
LigarBit - que recebe o contedo de um caractere e o nmero do bit a ser ligado e retorna o caractere com o
bit desligado.
EstadoBit - que recebe o contedo de um caractere e o bit a ser verificado o estado e retorna um (ligado) ou
zero (desligado).

/********************************************************************************
Prottipos de funes
********************************************************************************/
_____________ ContarBitsLigado( _____________, _____________);
_____________ DesligarBit( _______________, _______________);
_____________ InverterBit( _______________, _______________);
_____________ LigarBit( _______________, _______________);
_____________ EstadoBit( _______________, _______________);
/*******************************************************************************
Funes
*******************************************************************************/
void main()
{
unsigned char Chr, Nbits, Bit;
Chr = 0x90;
Chr = LigarBit(Chr,4);
Nbits = ContarBitsLigado(Chr);
Chr = LigarBit(Chr,5);
Nbits = ContarBitsLigado(Chr);
Chr = ~Chr;
Chr = DesligarBit(Chr,6);
Chr = DesligarBit(Chr,5);
Nbits = ContarBitsLigados(Chr);
Chr = InverterBit(Chr,4);
Bit = EstadoBit(Chr,1);
pg. 118

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira

Chr = DesligarBit(Chr,1);
Chr = DesligarBit(Chr,6);
Nbits = ContarBitsLigados(Chr);
}
_____________ ContarBitsLigado( _____________, _____________)
{
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
}
______________ DesligarBit( _______________, _______________)
{
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
}

pg. 119

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira

______________ InverterBit( _______________, _______________)


{
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
}
______________ LigarBit( _______________, _______________)
{
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
}
______________ EstadoBit( _______________, _______________)
{
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
______________________________________________________
}

pg. 120

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
16. ARQUIVOS
O trabalho com arquivos fundamental em programao. Atravs dos arquivos que
conseguimos fazer programas que conseguem produzir informaes permanentes no computador.
Informao estas que podero ser alteradas e ou excludas no futuro. Armazenando os dados em discos na
forma de arquivos.
O conceito de arquivo est no nosso cotidiano, que bastante normal a utilizao de
arquivos para armazenar-mos grandes quantidades de informao, por um grande perodo de tempo.
Exemplos: os arquivos mantidos por uma companhia telefnica, agenda de telefones, as informaes de um
paciente em um consultrio mdico e etc.
O arquivo um conjunto (coleo) de registros (de uma estrutura de dados). Cada registro
ocupa uma posio fixa dentro do arquivo. Os registros so estruturas formadas por um conjunto de
informaes chamadas de campos.
Exemplo de um arquivo do cotidiano seria o arquivo de uma biblioteca, que possui o
catlogo dos livros existentes na biblioteca.
Para isto temos a ficha do livro:
Cdigo do livro: __________________________
Ttulo: __________________________________
Autor: __________________________________
Assunto: ________________________________
Editora: _______________________ Ano: _____
Cada ficha de um livro seria um registro e cada registro possui seis campos que so: cdigo
do livro, ttulo, autor, assunto, editora e ano.
Quando todas as fichas (registros) dos livros forem colocadas juntas em um mesmo local
(um arquivo de ao) formando assim o arquivo da biblioteca, podendo ser manipulado pelas pessoas, que
utilizam o arquivo de fichas.
Cdigo do livro: 13.546
Cdigo do livro: 13.002
...
...
...
...
...
...
...
...
...
...
...
...
.
...
Cdigo do livro: 12.932
Cdigo do livro: 12.903
Ttulo: Programando em linguagem C
Autor: Jos Joo Kriger
Assunto: Programao de computadores
Editora: Cu Azul Ltda
Ano: 1992

...
. .

16.1 REPRESENTAO DE REGISTROS


Para representarmos um registro na codificao da linguagem C, lanaramos mo de
estruturas e unies, quando necessrio.
Em cima do exemplo anterior, a do arquivo da biblioteca, cada ficha de um livro constante
em um arquivo de ao, onde todas as fichas so guardadas, cada ficha o registro de um livro, que contm
campos (cdigo, ttulo, autor, assunto, editora e ano). Para representarmos este registro na linguagem
teramos:

pg. 121

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
struct LIVRO
{
int Cdigo;
char Ttulo[35];
char Autor[40];
char Assunto[35];
char Editora[30];
int Ano;
};
A estrutura LIVRO anloga ao registro Livro (ficha do arquivo), onde os seus elementos
(cdigo, ttulo, autor, assunto, editora e ano) correspondem aos campos dos registros.
16.2 FLUXOS E ARQUIVOS
A linguagem C no possui comandos de entrada e sada. O trabalho todo relacionado
manipulao de arquivos se d atravs de funes da biblioteca padro. Este tipo de abordagem, garante ser
um sistema bastante poderoso e flexvel.
Na linguagem C existe dois mtodos para o tratamento de arquivos. O primeiro o sistema
ANSI, com buffer, tambm chamado de formatado ou alto nvel e um segundo sistema UNIX, sem buffer,
tambm chamado de no formatado.
O sistema de entrada e sada na linguagem C, torna os diversos detalhes dos dispositivos
reais transparentes para o programador. Isto para dar maior portabilidade possvel.
As funes de entrada e sada trabalham sobre fluxos de dados. Os fluxos podem ser
conectados dispositivos reais, sendo considerados como arquivos. Um fluxo uma seqncia de dados e
existem dois tipo:
Os fluxos de TEXTO, que so seqncias de caracteres ASCII, muitas vezes linhas terminadas com uma
nova linha (\n).
Os fluxos BINRIOS, que so seqncias de bytes em estado bruto, no ocorrendo nenhuma traduo.
A maior parte das funes de entrada e sada so projetadas para operar sobre fluxos.
Estes fluxos garantem a flexibilidade, podendo ser atribudos diferentes dispositivos reais. Algumas dessas
conexes j esto construdas quando iniciado o programa. Cinco fluxos padronizados esto definidos e
conectados aos vrios dispositivos fsicos que so:
Fluxo
stdout
stdin
stdprn
stdaux
stderr

Conectado
tela
teclado
impressora
tela
tela

Para manipularmos arquivos precisamos das seguintes etapas:

abrir o arquivo.
ler e ou gravar no arquivo.
fechar o arquivo.

Abrir o arquivo, significa criarmos um fluxo (texto ou binrio) para podermos em seguida
gravar e ou ler dados no arquivo, atravs do dispositivo de fluxo criado. Aps a manipulao deve ser
fechado o arquivo, fechar o fluxo criado anteriormente. Para realizarmos tais tarefas com arquivos, existe na
biblioteca padro funes que sero brevemente comentadas na seqncia.

pg. 122

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Para abrirmos um arquivo necessrio criarmos um fluxo e este fluxo criado atravs da
declarao de um ponteiro para uma estrutura j definida na biblioteca padro (STDIO.H). Que segue a ttulo
de curiosidade a sua definio:
File control structure for streams.
typedef struct
{
short
unsigned
char
unsigned char
short
unsigned char
unsigned
short
} FILE;

level;
flags;
fd;
hold;
bsize;
*buffer, *curp;
istemp;
token;

_F_xxxx
File status flags of streams
Name

Meaning

_F_RDWR
_F_READ
_F_WRIT
_F_BUF
_F_LBUF
_F_ERR
_F_EOF
_F_BIN
_F_IN
_F_OUT
_F_TERM

Read and write


Read-only file
Write-only file
Malloc'ed buffer data
Line-buffered file
Error indicator
EOF indicator
Binary file indicator
Data is incoming
Data is outgoing
File is a terminal

Ento antes de abrirmos um fluxo de arquivo temos a declarao:


FILE *f;
Onde f um ponteiro para um tipo definido de estrutura FILE. Vale lembrar que ns no nos
preocupamos em saber muito sobre FILE e seus sinalizadores de estados (status flags), estas informaes
so transparentes para o programador, sendo que a completa e total manipulao deste ficam a cargo,
internamente, das funes da biblioteca padro, que trata de arquivos.
Aps a declarao do ponteiro do tipo FILE, devemos abrir o arquivo utilizando a funo
fopen, que possui o seguinte prottipo:

pg. 123

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
16.3 FOPEN(...)
FILE *fopen(char *, char *);
Onde os parmetros passados so o nome do arquivo (com ou sem caminho) e o modo,
que determina como o arquivo vai ser aberto (leitura, escrita, leitura e ou escrita).
Modo
r
w
a
rb
wb
ab
r+
w+
a+
r+b
w+b
a+b

Significado
Abre um arquivo texto para leitura
Cria um arquivo texto para escrita
Anexa a uma arquivo texto
Abre um arquivo binrio para leitura
Cria um arquivo binrio para escrita
Anexa a um arquivo binrio
Abre um arquivo texto para leitura
Cria um arquivo binrio para escrita
Anexa ou cria um arquivo texto para leitura e ou escrita
Abre um arquivo binrio para leitura e ou escrita
Cria um arquivo binrio para leitura e ou escrita
Anexa a um arquivo binrio para leitura e ou escrita

f = fopen(TESTE.$$$,w);
A funo fopen retorna o endereo de uma estrutura FILE (retorna um ponteiro). Este valor
nunca deve ser alterado. Caso acontea algum erro na abertura do arquivo (no existe o diretrio, nome do
arquivo errado e etc.) a funo fopen retornar NULL (nulo, zero). Devido ao retorno de fopen, deve sempre
ser feito um teste para a verificao da abertura do aquivo.
if (!f)
{
puts(Problemas na abertura do arquivo . . . \a);
exit(0);
}
J que no conseguiu abir o arquivo, d-se uma mensagem e sai do programa, neste caso.
O cdigo escrito anteriormente, poderia ser rescrito de uma outra maneira, utilizando a
funo fopen j no comando de seleo, assim:
if (!(f = fopen(TESTE.$$$,a)))
{
puts(Problemas na abertura do arquivo . . . \a);
exit(0);
}
Ler e ou gravar no arquivo, isto significa apanhar ou por uma informao (um nmero de
bytes) em um arquivo que esteja aberto, informaes.
16.4 FREAD(...)
Para ler informaes de um arquivo, podemos utilizar a funo fread, que possui prottipo:
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
Esta funo l um nmero especifico de tens de dados de igual tamanho de um fluxo
aberto (arquivo aberto).
Os argumentos da funo so:
ptr Aponta para o bloco no qual os dados sero lidos.
pg. 124

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
size Tamanho de cada tem que ser lido, em bytes.
n Nmero de tens que sero lidos.
stream Aponta para o fluxo aberto (arquivo).
O nmero de bytes lidos no total igual (n * size).
Retorna o nmero de tens lidos (se conseguiu ler) ou um final de arquivo ou um erro,
retornando possivelmente zero.
Exemplo:
1. void main(void)
2. {
3.
FILE *stream;
4.
char msg[] = "Isto um teste";
5.
char buf[20];
6.
7.
if (!(stream = fopen("DUMMY.FIL", "w+")))
8.
{
9.
puts(No foi possvel abrir o aquivo . . .\a\a\n);
10.
return;
11.
}
12.
/* escreve algum dado no arquivo */
13.
fwrite(msg,strlen(msg) + 1,1,stream);
14.
/* posiciona no inicio do arquivo */
15.
fseek(stream, SEEK_SET, 0);
16.
/* l o dado e mostra no monitor de vdeo */
17.
fread(buf,strlen(msg) + 1,1,stream);
18.
printf("%s\n", buf);
19.
/* fecha o arquivo */
20.
fclose(stream);
21. }
16.5 FWRITE(...)
Para gravar informaes em um arquivo, podemos utilizar a funo fwrite, que possui
prottipo:
size_t fwrite(const void *ptr, size_t size, size_t n, FILE*stream);
Esta funo escreve um nmero especifico de tens de dados de igual tamanho de um fluxo
aberto (arquivo aberto).
Os argumentos da funo so:
ptr Aponta para o bloco no qual os dados sero escritos.
size Tamanho de cada tem que ser escrito, em bytes.
n Nmero de tens que sero escritos.
stream Aponta para o fluxo aberto (arquivo).
O nmero de bytes escritos no total igual (n * size).
Retorna o nmero de tens escritos (se conseguiu escrever) ou um erro possivelmente zero.

pg. 125

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Exemplo:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.

struct INFO
{
int i;
char ch;
};
void main(void)
{
FILE *stream;
struct INFO s;
/* abre o arquivo TEST.$$$ */
if (!(stream = fopen("TEST.$$$", "wb")))
{
puts(No foi possvel abrir o aquivo . . .\a\a\n);
return;
}
s.i = 0;
s.ch = 'A';
fwrite(&s,sizeof(s),1,stream); /* escreve a estrutura s no arquivo */
fclose(stream); /* fecha o arquivo */
}

16.6 FCLOSE(...)
Esta funo fecha um fluxo de arquivo. Seu prottipo :
int fclose(FILE *stream);
Todos os buffers associados com a fluxo so esvaziados antes de serem fechados.
Se houver sucesso no fechamento do fluxo de arquivo, retorna 0. Se ocorrer erro retorna
um EOF.
Exemplo:
1. void main(void)
2. {
3.
FILE *fp;
4.
char buf[11] = "0123456789";
5.
6.
/* cria um arquivo contendo dez bytes */
7.
fp = fopen("DUMMY.FIL", "w");
8.
if (!fp)
9.
{
10.
puts(No foi possvel abrir o aquivo . . .\a\a\n);
11.
return;
12.
}
13.
fwrite(&buf, strlen(buf), 1, fp);
14.
/* fecha o arquivo */
15.
fclose(fp);
16. }
16.7 FTELL(...)
Retorna a posio corrente do ponteiro de um arquivo de fluxo. O prottipo seria:
long ftell(FILE *stream);
pg. 126

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
Se o arquivo binrio, o desvio medido em bytes do inicio do arquivo.
O valor retornado por ftell pode ser usado na chamda subseqnte de um fseek. Retorna a
posio corrente do ponteiro de um fluxo de arquivo. Se ocorrer erro, retorna 1L.
Exemplo
1. void main(void)
2. {
3.
FILE *stream;
4.
5.
stream = fopen("MYFILE.TXT", "w+");
6.
if (!stream)
7.
{
8.
puts(No foi possvel abrir o aquivo . . .\a\a\n);
9.
return;
10.
}
11.
fprintf(stream, "This is a test");
12.
printf("The file pointer is at byte %ld\n", ftell(stream));
13.
fclose(stream);
14. }
16.8 FSEEK(...)
Reposiciona o ponteiro associado um fluxo de arquivo para a nova posio. O prottipo
seria:
int fseek(FILE *stream, long offset, int whence);
Os arqgumentos so:

stream - Ponteiro para um fluxo de arquivo.


offset Diferena em bytes entre de onde e a nova posio. Para fluxos de arquivos no
modo texto, offset dever ser 0 ou um valor retornado por ftell.
whence Uma das trs SEEK_SET (inicio), SEEK_CUR (corrente) e SEEK_END
(final) posies de localizao do ponteiro de fluxo do arquivo. (0, 1, ou 2
respectivamente).

Depois de um fseek, a prxima operao de atualizao de um arquivo pode ser uma


leitura ou escrita.
O retorno seria: O ponteiro movido com sucesso, fseek retorna 0. Caso no consiga
mover o ponteiro retorna um valor no zero (ocorreu algum erro)..
Exemplo:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.

long FileSize(FILE *stream);


void main(void)
{
FILE *stream;
stream = fopen("FILE.TXT", "w+");
if (!stream)
{
puts(No foi possvel abrir o aquivo . . .\a\a\n);
return;
}
fprintf(stream, "Isto um teste ");
printf("O tamanho do arquivo FILE.TXT %ld bytes\n", FileSize(stream));
fclose(stream);
}
pg. 127

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
16. long FileSize(FILE *stream)
17. {
18.
long curpos, length;
19.
20.
curpos = ftell(stream);
21.
fseek(stream, 0L, SEEK_END);
22.
length = ftell(stream);
23.
fseek(stream, curpos, SEEK_SET);
24.
return (length);
25. }
16.9 FEOF(...)
uma macro que testa se o final de um arquivo de fluxo foi alcanado. O prottipo :
int feof(FILE *stream);
Retorna um no zero se um final de arquivo foi encontrado. Retorna um zero se o final de
arquivo no foi encontrado.
Exemplo:
1. void main(void)
2. {
3.
FILE *stream;
4.
5.
/* abre um arquivo para leitura */
6.
stream = fopen("DUMMY.FIL", "r");
7.
if (!stream)
8.
{
9.
puts(No foi possvel abrir o aquivo . . .\a\a\n);
10.
return;
11.
}
12.
/* l um charactere de um arquivo */
13.
fgetc(stream);
14.
/* verifica se EOF */
15.
if (feof(stream))
16.
puts(" final de arquivo ");
17.
fclose(stream);
18. }
16.10 FGETS(...) e FPUTS(...)
A funo fgets l uma seqncia de caracteres (string) de um fluxo de arquivo. A funo
fputs escreve uma seqncia de caracteres (string) em um fluxo de arquivo.
O seus prottipos so:
char *fgets(char *s, int n, FILE *stream);
int fputs(const char *s, FILE *stream);
A funo fgets l caracters de um fluxo de arquivo, parando quando for lido tambm um n
1 caracteres ou um caractere de linha nova (\n), o que vier primeiro. A funo fgets coloca um byte nulo (\0)
depois do caractere nova linha, indicando o final da seqncia de caracteres (string).
A funo fputs copia uma seqncia de caracteres (string), terminado com o caractere nulo
para um fluxo de arquivo, no colocando um caractere de nova linha e nem copiando o caractere nulo.
A funo fgets retorna o um ponteiro para s. Encontrando um EOF ou ocorrendo um erro
fgets retorna NULL.
pg. 128

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
A funo

fputs retorna retorna o ltimo caractere escrito. Se ocorrer algum erro fputs

retorna EOF.
Exemplo:
1. void main(void)
2. {
3.
FILE *stream;
4.
char string[16] = "Isto um teste ";
5.
char msg[20];
6.
7.
/* abre um arquivo para leitura */
8.
stream = fopen("DUMMY.FIL", "w+");
9.
if (!stream)
10.
{
11.
puts(No foi possvel abrir o aquivo . . .\a\a\n);
12.
return;
13.
}
14.
/* escreve um string em um arquivo */
15.
fwrite(string,strlen(string),1,stream);
16.
/* posiciona no incio do arquivo */
17.
fseek(stream, 0, SEEK_SET);
18.
/* l um string de um arquivo */
19.
fgets(msg,strlen(string) + 1,stream);
20.
/* mostra o string lido */
21.
printf("%s", msg);
22.
fclose(stream);
23. }
Exemplo:
1. void main(void)
2. {
3.
FILE *stream;
4.
int i = 100;
5.
char c = 'C';
6.
float f = 1.234;
7.
8.
/* abre um arquivo para leitura */
9.
stream = fopen("DUMMY.FIL", "w+");
10.
if (!stream)
11.
{
12.
puts(No foi possvel abrir o aquivo . . .\a\a\n);
13.
return;
14.
}
15.
/* escreve algum dado no arquivo */
16.
fprintf(stream, "%d %c %f", i, c, f);
17.
/* fecha um arquivo */
18.
fclose(stream);
19. }

pg. 129

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
16.11 EXERCCIOS PROPOSTOS
1. Faa um programa, em linguagem C, que leia caracteres a caractere do teclado, utilizando a funo
getchar e grave em um arquivo com o nome KTOD.DAT, atravs da funo fputc. O programa termina
quando o caractere lido for um $.
2. Faa um programa, em linguagem C, que leia caractere a caractere do arquivo KTOD.DAT, atravs da
funo fgetc e mostrando o caractere atravs da funo putchar.
3. Faa um programa, em linguagem C, que gere o arquivo LADOS.DAT. Este arquivo possui 3000 valores
inteiros, gerados aleatoriamente utilizando a funo random.
4. Faa um programa, em linguagem C, que leia o arquivo LADOS.DAT, utilizando a estrutura definida
abaixo:
struct TRIANGULO
{
int a, b, c;
};
O programa dever informar quantos so tringulos e no tringulos.
5. Faa um programa, em linguagem C, que leia o arquivo LADOS.DAT e utilizando uma estrutura
TRIANGULO, informe qual o tringulo, que possui o maior permetro.
6. Faa um programa, em linguagem C, que gere o arquivo TRIAN.DAT, que possui todos os lados que
formam um tringulo, extrados do arquivo LADOS.DAT.
7. Considere o fragmento de cdigo abaixo:
/*************************************************************************
Includes
**************************************************************************/
#include <conio.h>
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <lib.h>
/***************************************************************************
Estruturas
***************************************************************************/
struct DATA
{
char
char
int
};

Dia;
Mes;
Ano;

struct NOME
{
char
Nome[40];
char
Sexo;
struct DATA Data; // data de nascimento
};
pg. 130

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
struct FONE
{
char Codigo[3];
char Prefixo[4];
char Numero[4];
};
struct ENDERECO
{
char Rua[35];
char Bairro[25];
char Cep[8];
};
struct REG
{
char Codigo[6]; // seqncia de caracteres numricos
struct NOME Nome;
struct FONE Fone;
struct ENDERECO Endereco;
struct DATA Data; // data do sistema operacional
char Email[40];
};
/***************************************************************************
Prototipos de funes
***************************************************************************/
void ApanharDataSistema(struct DATA *Data);
void LerRegistro(struct REG *);
void GerarCodigo(char *);
void GerarEmail(struct REG *, char *);
void GravarRegistro(struct REG);
/***************************************************************************
Funcoes
/***************************************************************************/
void main()
{
struct REG Reg;
randomize(); // funo para inicializar o gerador de nmeros aleatrios
do
{
LerRegistro(&Reg);
if (!Reg.Nome.Nome[0])
break;
GravarRegistro(Reg);
} while (1);
}
/***************************************************************************
Sintaxe: void LerRegistro(struct REG *Reg)
Funo: Ler uma estrutura do tipo REG.
Entrada: Ponteiro para uma estrutura do tipo REG.
Sada: Nenhuma.
/***************************************************************************/
void LerRegistro(struct REG *Reg)
{
pg. 131

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
GerarCodigo(Reg->Codigo,sizeof(Reg->Codigo));
...
...
...
...
// codigo para a leitura dos outros elementos da estrutura REG
...
...
...
...
ApanharDataSistema(Reg->Data);
GerarEmail(Reg,"system");
}
/***************************************************************************
Sintaxe: void ApanharDataSistema(struct DATA *Data)
Funo: Apanhar a data do sistema operacional.
Entrada: Ponteiro para uma estrutura do tipo DATA.
Sada: Nenhuma.
/***************************************************************************/
void ApanharDataSistema(struct DATA *Data)
{
...
...
...
...
}
/***************************************************************************
Sintaxe: void GravarRegistro(struct REG *Reg)
Funo: Gravar em disco o conteudo de uma struct Reg, no
arquivo CADASTRO.DAT.
Entrada: Ponteiro para uma estrutura do tipo REG.
Sada: Nenhuma.
/***************************************************************************/
void GravarRegistro(struct REG Reg)
{
...
...
...
...
}
/***************************************************************************
Sintaxe: void GerarEmail(struct REG *Reg, char *Provedor)
Funo: Gerar o email a partir do nome completo da pessoa.
Entrada: Ponteiro para uma estrutura do tipo REG e um char.
Sada: Nenhuma.
/***************************************************************************/
void GerarEmail(struct REG *Reg, char *Provedor)
{
...
...
...
...
}
/***************************************************************************
Sintaxe: void GerarCodigo(char *Codigo, int Tamanho)
Funo: Gerar um cdigo numrico (caracteres numricos).
Entrada: Ponteiro para um char (Cdigo) e o tamanho.
Sada: Nenhuma.
/***************************************************************************/
void GerarCodigo(char *Codigo, int Tamanho)
{
...
...
...
...
}
Complete o programa com o cdigo necessrio para as funes que faltam ser implementadas.
LerRegistro, esta funo deve ler um tipo struct REG, passado por referncia para a funo.
pg. 132

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
GerarCodigo, est funo gera um string preenchido aleatriamente com caracteres numricos. Utilize para
isto a funo random.
ApanharDataSistema, para a implementao desta funo utilize a funo getdate.
GerarEmail, o email deve ser gerado a partir do nome completo da pessoa, pegando sempre a letra inicial de
cada nome do nome, mais um caractere gerado aleatriamente. Ex.: Jos Nogueira Filho, o emil poderia ser
jnfk@system.com.br.
GravarRegistro, funo que grava em disco o contedo de uma varivel do tipo struct REG, no arquivo
CADASTRO.DAT.
8. Faa um programa, em linguagem C, que extraia do arquivo CADASTRO.DAT os campos cdigo e email,
gerando um outro arquivo, com estes campos, o novo arquivo deve ter o nome de EMAIL.DAT.
9. Faa um programa, em linguagem C, que retire do arquivo CADASTRO.DAT o campo email,
reorganizando o arquivo todo. Faa tudo isto no mesmo arquivo.

pg. 133

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
17. GLOSSRIO
ANSI -

American National Standards Institute (Instituto Nacional de Padronizao


Americano).

ARQUIVO (FILE) -

Uma coleo organizada de informaes, preparada para ser usada com alguma
finalidade. Os registros em um arquivo podem ser seqenciais ou no, dependendo
das necessidades de sua utilizao.
Uma coleo de registros tratada como uma unidade.
Um conjunto de registros inter-relacionados tratados como uma unidade por
exemplo, em controle de estoque o arquivo deve ser constitudo de itens (registros)
de estoque.
Unidade principal de dados fsicos formada por um conjunto de registros fsicos
dispostos em formatos prescritos e descrita pela informao de controle a qual o
sistema tem acesso.

ASCII -

American National Standard Code for Information Interchange (Cdigo para


Intercmbio de Informao Nacional Padro Americano), X 3.4.1968. Um cdigo de
nvel 8 (7 bits e paridade) desenvolvido por um subcomit da USASI. Este cdigo foi
desenvolvido com a finalidade de padronizar as comunicaes americanas.

ASSEMBLE -

Montar, preparar um programa em linguagem objeto a partir de um programa em


linguagem simblica, substituindo os cdigos de operaes simblico e absoluto ou
endereo relocvel para endereo simblico.

ASSEMBLER -

Montador, programa que monta; transforma os cdigos de operao simblicos em


cdigos absolutos ou de mquina.

ASSEMBLY -

Montagem, sada produzida pelo montador ASSEMBLER.

BIT -

Abreviatura de binary digit. a menor unidade de um computador. Magnetizado,


no estado desligado assume o valor zero e no estado ligado assume o valor um.

BCPL -

Linguagem de programao de sistemas que incorpora as estruturas de controle


necessrias programao estruturada. Sua principal caracterstica consiste em
ser uma linguagem de tipo livre; ou seja, o nico tipo de objeto de dados que pode
ser usado uma palavra composta de bits.

CRIPTOGRAFIA -

Proteo de uma mensagem mediante em dos mtodos (cdigo cifrado) que


transformam um texto em linguagem natural em texto cifrado ou vice-versa. O
primeiro ou mtodo primrio, consiste em substituio que cada elemento individual
do texto cifrado em cdigo, por ser elemento correspondente em linguagem natural.
A lista dessas substituies recebe o nove de cdigo de chaves e deve manter-se
secreto com o objetivo de proteger a informao. O processo de cifragem consiste
em mudar um texto em linguagem natural para texto em linguagem cifrada
(criptografada) mediante transformao criptogrfica, geralmente de tal modo que
cada bit, caractere ou palavra do texto normal (seja substitudo por bit, caractere ou
palavra do texto cifrado (criptografado).
A transformao do dado ou informao, para encobrir ou dissimular seu
significado.

DRIVE -

Mecanismo impulsionador.

PALAVRA - (WORD)

Conjunto ordenado de bytes (caracteres) que ocupa um localizao no


armazenamento e tratado pelos circuitos do computador (em operaes de
transferncias, aritmtica etc.), com uma unidade.
Ordinariamente a palavra tratada, tanto pela unidade de controle como pela
unidade aritmtica como uma quantidade.
O comprimento da palavra poder ser fixo ou varivel dependendo do computador.
pg. 134

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
REGISTRADORES

Dispositivo do hardware usado para armazenar uma certa quantidade de bit, bytes
ou caracteres. Um registrador normalmente construdo de elementos tais como
transmissores ou tubos e geralmente armazena uma palavra de informao. A
programao comum exige que o registrador tenha condies de operar a
informao e no apenas somente armazen-la.

REGISTRO (RECORD) -

Um grupo de fatos relacionados ou campos de informaes tratadas como uma


unidade ou ainda uma lista de informaes em uma forma a ser impressa.

ULA -

Unidade lgico aritmtica (ALU - Arithmetic Logical Unit). a parte do hardware do


computador na qual so realizadas as operaes aritmticas e lgicas.
A unidade aritmtica geralmente constituda de um acumulador, alguns
registradores especiais para o armazenamento dos operandos e resultados,
suplementados por circuitos de deslocamentos e de seqncia, diviso e outras
operaes desejadas.

pg. 135

Aspectos Formais da Computao - linguagem C


Prof. Camillo Oliveira
18. BIBLIOGRAFIA
C for engineers, Brian Bramer & Susan Bramer. Ed. John Wiley & Sons.
TURBO C - GUIA DO USURIO. Herbert Schildt. Ed. Makron Books.
TREINAMENTO EM LINGUAGEM C, CURSO COMPLETO - Mdulos 1 e 2. Victorine, Viviane e Mizrahi.
Ed. McGraw-Hill.
Dominando o Turbo C. Stan Kelly-Bootle. Ed. Cincia Moderna.
Linguagem C - Kernighan & Ritchie
C, Completo e total - Herbert Schildt. Ed. Makron Books.

pg. 136