Você está na página 1de 202

Lógica da programação

Bibliografia (Ementa)

 FORBELLONE, André L. V. e EBERSPACHER, Henru Frederico, Lógica


de Programação: A construção de Algoritmos e Estrutura de
Dados, Ed. Makron Books.
 JAMSA, Kris, KLANDER Lars, Programando em C/C++ - A Bíblia,
Ed. Makron Books
 KERNIGHAN B., RITCHIE, D, C a Linguagem de Programação,
Ed. Campus

BIBLIOGRAFIA COMPLEMENTAR
 SCHILDT, Herbert, C Completo e Total, Ed. Makron Books
 FARRER, Harry et al, Algoritmos Estruturados, Ed. Campus
Bibliografia Complementar

 MANZANO, OLIVEIRA – José Augusto N.G., Jayr


Figueiredo de – ALGORÍTIMOS Lógica para
Desenvolvimento de Programação – Érica – 2001
São Paulo
 DEITEL – H.M. – P.J., C++ Como Programar –
Bookman 2001 – Porto Alegre
 Tremblay, Jean-Paul; Bunt, Richard B. Ciência dos
Computadores - Uma Abordagem Algoritmica;
McGraw Hill. 1983.
Conteúdo
 1. Apresentação da Disciplina  8. Estrutura da memória
 2. Definição e exemplos de algoritmos  9. Variáveis: Declaração e Tipo de
Variáveis
 3. Introdução a Lógica de Programação
 10. Ponteiros de Variáveis
 a. Pseudo Código
 b. Palavras chave
 11. Funções Recursivas em C
 c. Variáveis e Constantes (Strings e Números)  12. Técnicas avançadas de Algoritmos
 d. O comando de Entrada e Saída: Escreva, Leia e Atribua  a. Leitura de Arquivos
 e. Funções da Linguagem: Mod e Div Seqüências
 4. Estruturas de Controle de Fluxo  b. Tipo struct
 a. Decisão: Se ... Então ... Senão  c. Modularização
 b. Repetição com teste no início: Enquanto ... Faça
 c. Repetição com teste no final: Repita ... Até
 5. Vetores
 6. Procedimentos e Funções
 a. Funções Recursivas
 7. A linguagem de Programação C
 a. Regras sintáticas de formação da linguagem
 b. Estrutura de uma aplicação: INCLUDE e MAIN
 c. Equivalência entre o Pseudo Código e os comandos em C
 d. Estruturas de Decisão e Repetição.
 e. Compilando um programa C
 f. Depurando erros.
Definições Básicas

 Para usar a lógica é necessário ter domínio sobre


o pensamento.
 O raciocínio lógico pode ser definido como:
 Um conjunto de estudos que visa a determinar os
processos intelectuais que são as condições gerais do
conhecimento verdadeiro;
 É a seqüência coerente, regular e necessária de
acontecimentos, de coisas ou fato;
 É a maneira do raciocínio particular que cabe a um
indivíduo ou a um grupo.
Definições do Dicionário AURÉLIO
Definições Básicas

Definição que expressa o verdadeiro


raciocínio lógico aos profissionais de TI em
geral.

Um esquema sistemático que define as


interações de sinais no equipamento
automático do processamento de dados, ou o
computador científico com o critério e
princípios formais de raciocínio e pensamento.
Definições Básicas

Concluímos que lógica é:

A ciência que estuda as leis e critérios de


validade que regem o pensamento e a
demonstração, ou seja, ciência dos princípios
formais do raciocínio.
Aplicação da Lógica

Usar a lógica é um fator a ser considerado


por todos, principalmente pelos
profissionais de informática
(Programadores, Analistas de sistema e
Suporte).

Para solucionar problemas e atingir os


objetivos apresentados pelos usuários com
eficiência e eficácia.
Aplicação da Lógica

Se aplica a qualquer linguagem de


programação;
Agiliza a codificação da escrita e da
programação;
Facilita a depuração da leitura do mesmo;
Permite a verificação de possíveis falhas;
Facilita as alterações e atualizações dos
programas.
Aplicação da Lógica

Deve ser composta por quatro passos


fundamentais:
Escrever as instruções em seqüência ligadas
entre si por apenas estruturas seqüenciais;
Escrever instruções em grupos pequenos e
combina-las;
Distribuir os módulos do programa entre os
diferentes programadores;
Revisar o trabalho executado.
Diferenciações de nomenclaturas

Fluxograma, Diagrama de blocos:

Representações gráficas que expressão uma


ordem do fluxo dos pensamentos a serem
executados;
Diferenciações de nomenclaturas

Algoritmo:
Seqüência de passos que visam atingir um
objetivo bem definido.

Os algoritmos são utilizados no dia-a-dia para a


solução dos mais diversos problemas.
Diferenciações de nomenclaturas

 Exemplos genéricos de algoritmos do nosso


cotidiano: um manual de instruções, uma receita
de bolo, a solução de uma equação do 2º grau,
uma pesquisa na lista telefônica, etc.

O que todas essas coisas tem em comum?

 Elas podem ser vistas como uma serie finita e bem


definida de passos ou regras que, quando realizadas,
atingem um objetivo previamente definido.
Diferenciações de nomenclaturas

Outra definição para algoritmos:

Algoritmo é a descrição de um conjunto de


ações que, obedecidas, resultam numa
sucessão finita de passos, atingindo um
objetivo esperado.
Diferenciações de nomenclaturas

São propriedades de algoritmos:

Ações simples e bem definidas (não ambíguas);


Seqüência ordenada de ações;
Seqüência finita de passos.
Exemplo de Algoritmo

Torres de Hanói.
Considere o seguinte problema: Temos três
hastes. Uma das hastes serve de suporte para
três discos de tamanhos diferentes. Os discos
menores são sempre colocados sobre os discos
maiores.
Desejamos mover todos discos para outra
haste, porém só podemos movimentar um disco
de cada vez e um disco maior nunca pode ser
colocado sobre um disco de menor tamanho.
Exemplo de Algoritmo
Exemplo de Algoritmo

 Solução: Em forma narrativa


 Nomeamos as hastes como 1, 2 e 3 e os discos como
p, m e g.
 Considera-se que inicialmente os discos estão na
haste 1. Os passos são: Como podemos ver, com 3
 1. move o disco p para a haste 2. discos precisamos de, no
mínimo, 7 passos para
 2. move o disco m para a haste 3. solucionar o problema.
 3. move o disco p para a haste 3. Quantos passos seriam
 4. move o disco g para a haste 2. necessários para se mover 4
discos? E para n discos?
 5. move o disco p para a haste 1.
 6. move o disco m para a haste 2.
 7. move o disco p para a haste 2.
Problema a resolver

 A corrida de carros:

 Oito carros, de marcas e cores diferentes, que nada tem a ver com suas
cores da Formula 1, estão alinhados, lado a lado, para uma corrida.
 Estabeleça a ordem em que os carros estão dispostos, baseando-se nas
seguintes informações:

 1. O FERRARI está entre os carros 'vermelho' e 'cinza'.


 2. O carro 'cinza' está à esquerda do LOTUS.
 3. O MACLAREN é o segundo carro à esquerda do FERRARI e o primeiro à direita
do carro 'azul'.
 4. O TYRREL não tem carro a sua direita e esta logo depois do carro 'preto'.
 5. O carro preto está entre o TYRREL e o carro 'amarelo'.
 6. O JORDAN não tem carro algum à esquerda: está a esquerda do carro 'verde'.
 7. A direita do carro 'verde' está o MARCH.
 8. O LOTUS é o segundo à direita do carro 'creme' e o segundo a esquerda do
carro 'marrom'.
 9. O WILLIAN é o segundo à esquerda do BENETTON.
Problema a resolver
Quem o escreveu foi Einstein e ele disse que 98% do mundo não conseguiria
resolvê-lo
 Há 5 casas de cores diferentes. Em cada casa mora uma pessoa de nacionalidade
diferente. Os cinco proprietários bebem diferentes bebidas, fumam marcas diferentes
de cigarros e têm determinados animais de estimação.
 Nenhum deles tem os mesmos animais, fuma a mesma marca de cigarro ou bebe a
mesma bebida.
 Através das dicas a seguir, descubra quem tem peixes.
 O inglês vive na casa vermelha.
 O sueco tem cachorros como animais de estimação.
 O dinamarquês bebe chá.
 A casa verde fica à esquerda da casa branca.
 O dono da casa verde bebe café.
 A pessoa que fuma Pall Mall cria pássaros.
 O dono da casa amarela fuma Dunhill.
 O homem que vive na casa do centro bebe leite.
 O norueguês vive na primeira casa.
 O homem que fuma Blends vive ao lado do que tem gatos.
 O homem que cria cavalos vive ao lado do que fuma Dunhill.
 O homem que fuma Bluemaster bebe cerveja.
 O alemão fuma Prince.
 O norueguês vive ao lado da casa azul.
 O homem que fuma Blends é vizinho do que bebe água.
Definições Básicas

 Fluxograma
 Geralmente usada por profissionais de análise de
sistema, bem como profissionais de Organização e
Métodos.
 Diagrama de Blocos
 Ferramenta usada basicamente por profissionais que
está envolvido diretamente com a programação.
 Algoritmo
 Um processo de cálculos matemáticos ou resoluções
de problemas, utilizando regras formais, englobando
fórmulas de expressões aritméticas.
Exemplos

Fluxograma:
Exemplos

Diagrama de bloco

N
Exemplos

Algoritmo
...

Média = (Nota1+Nota2)2

N
S
“Reprovado” Média >= 7 “Aprovado”

...
Simbologia Básica

Formas de representação gráfica:


Terminal Decisão

Seta de Fluxo

Conectores
Processamento

Entrada manual
de dados
Display

Entrada e Saída
de dados
Princípios de resolução de problemas
Problema
É uma proposta duvidosa, que pode ter
numerosas soluções.

Podemos dizer que o problema é uma questão


que foge a uma determinada regra, é o desvio
de um percurso, o qual impede de atingir com
sucesso um determinado objetivo.
Princípios de resolução de problemas
Em uma determinada escola, onde o
cálculo da média é realizado por 4 notas
bimestrais que determinam a aprovação
ou reprovação dos alunos, considerando a
média deve ser maior ou igual a 7 para
que haja a aprovação.
Princípios de resolução de problemas
Exemplo 1
Início

Calcular a média e
determinar a
aprovação do aluno.

Fim
Princípios de resolução de problemas
Exemplo 2
Início

Entrada com
4 Notas

Calcular a média e
determinar a
Aprovação.

Apresentar se houve
ou não aprovação

Fim
Princípios de resolução de problemas
Exemplo 3
Início

Entrada com
4 Notas

Calcular a
média

N S
Média >= 7

“Reprovado” “Aprovado”

Fim
Estrutura
Linear

N
Estrutura
Estruturada

N S
Técnicas Básicas de programação
Operadores matemáticos
Operadores Operação

+ Soma
- Subtração
* Multiplicação
/ Divisão
^ Exponenciação
Mod Resto da Divisão
Técnicas Básicas de programação
Operadores Lógicos
Operadores Operação

= Atribuição
== Igualdade
!= Diferença
> Maior Que
< Menor Que
>= Maior e Igual
<= Menor e Igual
Técnicas Básicas de programação
Operadores Incremento
Operadores Operação

++ Incremento
-- Decremento
Técnicas Básicas de programação
Tipos de Informações
Um computador nada mais é que uma
ferramenta utilizada para resolver problemas
que envolvam a manipulação de informações,
sendo que estas informações classificam-se
basicamente em dois tipos:
Dados e Instruções.
Técnicas Básicas de programação

Tipos de Dados.
Os dados são representados pelas
informações a serem tratadas (processadas)
por um computador.

Caracteriza-se por três tipos de dados:


Dados numéricos (inteiros e reais),
Dados caracteres,
Dados lógicos.
Técnicas Básicas de programação
Tipos inteiros:
Números inteiros, positivos ou negativos:
35, 0, -35 .....

Tipos Reais:
Abrangem inteiros, negativos, positivos e
fracionários:
35, 0, -35, 1.25, -45.1245547 ......
Técnicas Básicas de programação
 Tipos Caracteres:
 Seqüência de textos e letras, válida quando estiver
entre (“”) aspas:
 “oi.. Tudo bem”, “Telefone: 5555-4444” ....

 Tipos Lógicos:
 Assumem apenas dois valores:
 Verdadeiro ou Falso.
 Podendo ser representado como:
 Sim ou Não
 True ou False
 .V. ou .F.
 Etc...
Técnicas Básicas de programação
Uso de variáveis:
Variável: Tudo aquilo que é sujeito a
variações, que é incerto, instável ou
inconstante.

Uso de constantes:
É tudo aquilo que é fixo ou estável;
O valor do PI = 3,14156
Técnicas Básicas de programação
Expressões Aritméticas ou formulas
matemáticas:
2
ÁREA= PI. RAIO ÁREA = PI * RAIO^2

X = 43. 55 X = (43*(55/(30+2)))
30+2
Técnicas Básicas de programação
Instruções Básicas:
São representadas por um conjunto de
palavras – chaves ou vocabulário de uma
determinada linguagem de programação.

Português estruturado:
início, fim, var, programa, enquanto, se, então,
para, escreva, leia, faça, repita e até_que.
Técnicas Básicas de programação
 Regras básicas:
 Todo problema a ser resolvido será previamente
entendido, passado para um algoritmo, para depois
ser representado graficamente;

 Toda tarefa feita a uma instrução será escrita em letra


minúscula em formato negrito. As instruções não
serão indicadas dentro dos diagramas de blocos;

 Qualquer valor atribuído a uma variável será feito com


símbolo = (igual) tanto no diagrama de blocos quanto
em código português estruturado.
Técnicas Básicas de programação
Problema:
Será efetuada a leitura de dois valores,
efetuar sua respectiva soma e apresentando
seu resultado na tela.
Algoritmo:
1 – Ler dois valores, no caso variáveis A e B;
2 – Efetuar a soma das variáveis A e B, implicando o seu
resultado na variável SOMA;
3 – Apresentar o valor da variável SOMA após a operação
de soma dos dois valores fornecidos.
Técnicas Básicas de programação
Diagrama de blocos
Início

SOMA = A + B

SOMA

Fim
Técnicas Básicas de programação
Português estruturado
programa SOMA_DOIS_NUMEROS
var
SOMA : inteiro
A : inteiro
B : inteiro
início
leia A
leia B
SOMA = A + B
escreva SOMA
fim
Técnicas Básicas de programação
 Desenvolva o algoritmo, Diagrama de blocos e
codificação em português estruturado, para o seguinte
problema:
Ler quatro números e apresentar o resultado
dois a dois dois da adição e multiplicação,
baseando-se na utilização da propriedade
distributiva. Ou seja, se forem lidas as
variáveis A, B, C e D, deverão ser somadas e
multiplicadas A com B, A com C e A com D.
Técnicas Básicas de programação
Técnicas Básicas de programação
Estrutura de Controle – Tomada de Decisões

Desvio condicional Simples.


Trabalharemos com uma instrução na
codificação em português estruturado a
seguir:
se ... então ... fim_se

Ajuda a tomada de decisões, sendo a condição


verdadeira, serão executadas todas as
instruções que estejam entre a instrução
se ... então e a instrução falsa fim_se
Estrutura de Controle – Tomada de Decisões
Diagrama de blocos
Será existente as letras S e N no diagrama de
tomada de decisão. O S representa Sim
conseqüentemente a proposição Verdadeira e
o N representa o Não. Alem das linhas com
setas indicando a direção do processamento.
Estrutura de Controle – Tomada de Decisões

N S
Condição

Condição Verdadeira

Condição Falsa
Estrutura de Controle – Tomada de Decisões

Português estruturado

se ( <condição> ) então
<instruções para a condição verdadeira>
fim_se
<instruções para a condição falsa>
Estrutura de Controle – Tomada de Decisões

 Ler dois valores numéricos, efetuar a adição e


apresentar o seu resultado caso o valor somado
seja maior que 10.

 Algoritmo
 1 – Ler dois valores respectivamente nas variáveis A e B
 2 – efetuar a soma dos valores das variáveis A e B
implicando o valor da soma na variável X
 3 – Apresentar o valor da soma contido na variável X.
Estrutura de Controle – Tomada de Decisões

Diagrama de Bloco.
Início

A, B

X=A+B

N S
X > 10

Fim
Estrutura de Controle – Tomada de Decisões
Português estruturado
programa SOMA_NUMEROS
var
X : inteiro
A : inteiro
B : inteiro
início
leia A, B
X = A + B
se ( X > 10 ) então
escreva X
fim_se
fim
Estrutura de Controle – Tomada de Decisões

Desvio condicional Composto.


Trabalharemos com uma instrução na
codificação em português estruturado a
seguir:
se ... então ... senão ... fim_se

Ajuda a tomada de decisões, sendo a condição


verdadeira, serão executadas todas as
instruções que estejam entre a instrução
se ... então e a instrução falsa no bloco
senão
Estrutura de Controle – Tomada de Decisões
Diagrama de blocos
Será existente as letras S e N no diagrama de
tomada de decisão. O S representa Sim
conseqüentemente a proposição Verdadeira e
o N representa o Não na proposição Falsa.
Alem das linhas com setas indicando a direção
do processamento.
Estrutura de Controle – Tomada de Decisões

N S
Condição

Condição Falsa Condição Verdadeira


Estrutura de Controle – Tomada de Decisões

Português estruturado

se ( <condição> ) então
<instruções para a condição verdadeira>
senão
<instruções para a condição falsa>
fim_se
Estrutura de Controle – Tomada de Decisões

 Ler dois valores numéricos, efetuar a adição e caso


o valor somado seja maior e igual que 10
apresentar o resultado somando-se 5 e se o
resultado for menor que 10 apresentar o resultado
subtraído 7,

 Algoritmo
 1 – Ler dois valores respectivamente nas variáveis A e B
 2 – efetuar a soma dos valores das variáveis A e B
implicando o valor da soma na variável X
 3 – Verificar se X é maior ou iguala 10, caso sim mostre
X + 5 se não mostre X - 7
Estrutura de Controle – Tomada de Decisões
Português estruturado
programa SOMA_NUMEROS
var
X : inteiro
A : inteiro
B : inteiro
início
leia A, B
X = A + B
se ( X >= 10 ) então
escreva X + 5
senão
escreva X - 7
fim_se
fim
Estrutura de Controle – Tomada de Decisões

Desvio condicional Encadeado.


Existe casos que é necessário se estabelecer
verificações de condições sucessivas, para
determinada ação, e que ocorra em um
conjunto anterior de instruções ou condições
para que se estabeleça satisfatória a
proposição.
Estrutura de Controle – Tomada de Decisões
Diagrama de blocos
N S
Condição 1

Instrução executada
N S quando a Condição 1
Condição 2 Verdadeira

Instrução executada Instrução executada


quando a Condição 1 for Falsa quando a Condição 1 for Falsa
e a Condição 2 Falsa e a Condição 2 Verdadeira
Estrutura de Controle – Tomada de Decisões
Português estruturado
se ( <condição 1> ) então
<instruções para a condição 1 verdadeira>
senão
se ( <condição 2> ) então
<instruções para a condição 1 falsa e condição 2 verdadeira>

senão
<instruções para a condição 1 falsa e condição 2 falsa>

fim_se
fim_se
Estrutura de Controle – Tomada de Decisões

 Reajuste salarial, obter o salário e calcular o reajuste do


salário sendo:
 Salário < que 500, reajuste será de 15%;
 Salário >= a 500 mais <= 1000, reajuste será de 10%;
 Salário > 1000, reajuste será de 5%.

 Algoritmo
 1 – Definir uma variável para o salário reajustado como
NOVO_SALARIO;
 2 – Ler um valor para a variável SALARIO;
 3 – Verificar se o valor de SALARIO < 500, se sim reajustar em 15%;
 4 – Verificar se o valor de SALARIO <= 1000, se sim reajustar em 10%
 5 – Verificar se o valor de SALARIO > 1000, se sim reajustar em 5%;
 6 – Apresentar o valor reajustado implicando na variável
NOVO_SALARIO.
Estrutura de Controle – Tomada de Decisões
Diagrama de blocos Início

SALARIO

N S
SALARIO < 500

N S
SALARIO <= 1000

NOVO_SALARIO = SALARIO * 1.15

NOVO_SALARIO = SALARIO * 1.05 NOVO_SALARIO = SALARIO * 1.10

NOVO_SALARIO

Fim
Estrutura de Controle – Tomada de Decisões

Operador Lógico (para tebela verdade)


Pode ser que necessitemos utilizar em algum
momento, trabalhar com o relacionamento de
duas ou mais condições ao mesmo tempo na
mesma condição se.
Neste caso aplicaremos os seguintes operadores
lógicos.
 .e. (and, &&)
 .ou. (or, ||)
 .não. (not, !)
Em português estruturados está sempre entre os
pontos (.).
Estrutura de Controle – Tomada de Decisões

Operador Lógico .e. (and, &&)

CONDIÇÃO 1 CONDIÇÃO 1 RESULTADO


Falso Falso Falso
Verdade Falso Falso
Falso Verdade Falso
Verdade Verdade Verdade
Operador condicional
Operação se..então ( -> )

CONDIÇÃO 1 CONDIÇÃO 1 RESULTADO


Verdade Verdade Verdade
Verdade Falso Falso
Falso Verdade Verdade
Falso Falso Verdade
Estrutura de Controle – Tomada de Decisões

Operador Lógico .e. (and, &&)


Diagrama de Blocos

N
Condição 1 S
.e.
Condição 2

Instrução executada
se ambas as condições
forem verdadeiras
Estrutura de Controle – Tomada de Decisões

Operador Lógico .e. (and, &&)


Português estruturado

se ( <condição1> ) .e. ( <condição2> ) então


<Instrução executada se ambas as condições forem verdadeiras>

fim_se
Estrutura de Controle – Tomada de Decisões

Operador Lógico .ou. (or, ||)

CONDIÇÃO 1 CONDIÇÃO 1 RESULTADO


Falso Falso Falso
Verdade Falso Verdade
Falso Verdade Verdade
Verdade Verdade Verdade
Estrutura de Controle – Tomada de Decisões

Operador Lógico .ou. (or, ||)


Diagrama de Blocos

N
Condição 1 S
.ou.
Condição 2

Instrução executada
se pelo menos
uma das condição
for verdadeira
Estrutura de Controle – Tomada de Decisões

Operador Lógico .ou. (or, ||)


Português estruturado

se ( <condição1> ) .ou. ( <condição2> ) então


<Instrução executada se pelo menos uma condição for verdadeiras>

fim_se
Estrutura de Controle – Tomada de Decisões

Operador Lógico .não. (not, !)

CONDIÇÃO 1 RESULTADO
Falso Verdade
Verdade Falso
Estrutura de Controle – Tomada de Decisões

Operador Lógico .não. (not, !)


Diagrama de Blocos

N
S
.não.
Condição

Instrução executada
se condição
for falsa
Estrutura de Controle – Tomada de Decisões

Operador Lógico .não. (not, !)


Português estruturado

se .não. ( <condição> ) então


<Instrução executada se a condição for falsa>
fim_se
Estrutura de Controle – Tomada de Decisões

 Exercício de fixação
Estrutura de Controle – Tomada de Decisões
 Exercício:
 O índice de Massa Corporal (IMC) é uma fórmula que indica se um
adulto está acima do peso, se está obeso ou abaixo do peso ideal
considerado saudável. A fórmula para calcular o Índice de Massa
Corporal é: IMC = peso / (altura)2.
 Desenvolva o algoritmo, Diagrama de blocos e codificação em
português estruturado, para o seguinte problema:
 Ler dois valores, peso e altura em seguida calcular o índice de massa
corporal (IMC) e apresentar em tela se a pessoa está abaixo do peso,
no peso normal, acima do peso ou obeso obedecendo a tabela da
Organização Mundial de Saúde.

Condição IMC em adultos

Tabela da Organização Abaixo do peso Abaixo de 18.5


Mundial de Saúde
No peso normal Entre 18.5 e 25
Acima do peso Entre 25 e 30
Obeso Acima de 30
Estrutura de Controle de Laços – ou Malha
de Repetição

Desenvolva um programa que leia cinco


vezes um determinado valor e que este
valor seja multiplicado por três e
apresentado o resultado em tela.

Como solucionar este problema sem ter


que repetir as mesmas linhas de códigos
repetidamente ?
Estrutura de Controle – Tomada de Decisões

Repetição do tipo: Teste lógico no início do


Looping.
Caracteriza-se por uma estrutura que efetua
um teste lógico no início do looping,
verificando se é permitido executar o trecho
de instruções subordinado ao looping.

A estrutura e denominada de enquanto.


enquanto ... faça .... fim_enquanto
Estrutura de Controle – Tomada de Decisões

Diagrama de blocos

N
Condição

Instrução executada
Enquanto a condição
é verdadeira
Estrutura de Controle – Tomada de Decisões

Português estruturado

enquanto ( <condição> ) faça


<Instrução para condição verdadeira>
fim_enquanto
Estrutura de Controle – Tomada de Decisões

 Resolvendo o nosso problema anterior:


 Algoritmo:
 1 – Criar uma variável para servir como contador com o valor
inicial igual a um;
 2 – Enquanto o valor do contador for menor ou igual a 5,
processar os passos 3, 4 e 5;
 3 – Ler um valor para a variável X;
 4 – Efetuar a multiplicação da variável X por 3 implicando na
variável R;
 5 – Apresentar o valor calculado contido na variável R;
 6 – Quando o contador for maior que 5, encerrar o
processamento.
Estrutura de Controle – Tomada de Decisões
Diagrama de blocos Início

Cont = 1

N
Cont <= 1

R=X*3

Cont ++ Cont = Cont + 1

Início
Estrutura de Controle – Tomada de Decisões
Português estruturado
programa LOOPING_1A
var
X, R, CONT : inteiro
início
CONT = 1
enquanto ( CONT < = 5 ) faça
leia X
R = X * 3
escreva R
CONT = CONT + 1 /// ou CONT ++
fim_enquanto
fim
Estrutura de Controle – Tomada de Decisões

Exercício:
Desenvolva um programa que leia cinco vezes
um determinado valor e que este valor seja
multiplicado por três e apresentado o
resultado em tela.

Alterar o problema sendo que só sairá do


looping quando o usuário queira, efetuando
uma pergunta em tela se deseja continuar ?
Estrutura de Controle – Tomada de Decisões

Repetição do tipo: Teste lógico no fim do


Looping.
Caracteriza-se por uma estrutura que efetua
um teste lógico no fim do looping

A estrutura e denominada de repita.


repita ... até_que
Estrutura de Controle – Tomada de Decisões

Resolvendo o nosso problema anterior:


Algoritmo:
1 – Criar uma variável contador;
2 – Ler um valor para a variável X;
3 – Efetuar a multiplicação da variável X por 3
implicando na variável R;
4 – Apresentar o valor calculado contido na variável R;
5 – Acrescentar um ao contador;
6 – Repetir os passos 2, 3, 4 e 5 até que o contador
seja maior que 5.
Estrutura de Controle – Tomada de Decisões
Diagrama de blocos Início

Cont = 1

R=X*3

Cont ++ Cont = Cont + 1

N
Cont > 5

Fim
Estrutura de Controle – Tomada de Decisões
Português estruturado
programa LOOPING_2A
var
X, R, CONT : inteiro
início
CONT = 1
repita
leia X
R = X * 3
escreva R
CONT = CONT + 1 /// ou CONT ++
até_que ( CONT > 5 )
fim
Estrutura de Controle – Tomada de Decisões

Repetição do Tipo: Variável de controle.


Possibilita o uso de contadores finitos, sem o
uso das condições anteriores.

Os loopings que possuem um número finito de


execução poderão ser executados através de
estrutura de laços contados para, sendo
conseguida com a utilização do conjunto de
instruções:
para ... de ... até ... faça ... fim_para
Estrutura de Controle – Tomada de Decisões

Diagrama de blocos

Variável = Início, Fim, Incremento

Instruções
Estrutura de Controle – Tomada de Decisões
Português estruturado

para <variável> de <início> até <fim> passo <incremento>


<Instruções>
fim_para
Estrutura de Controle – Tomada de Decisões

Exemplo:

Pedir a leitura de um valor para a variável X,


multiplicar este valor por 3 implicando-o à
variável de resposta R e apresentar o valor
obtido, repetindo esta seqüência por cinco
vezes.
Estrutura de Controle – Tomada de Decisões

Algoritmo
1 – Definir um contador variando de 1 a 5;
2 – Ler um valor para a variável X;
3 – Efetuar a multiplicação do valor de X por
3, implicando o resultado na variável R;
4 – Apresentar o valor calculado contido na
variável R;
5 – Repetir os passos 2, 3, 4 e 5 até que o
contador seja encerrado.
Estrutura de Controle – Tomada de Decisões

Diagrama de blocos
Início

Cont = 1, 5, 1

R=X*3

Fim
Estrutura de Controle – Tomada de Decisões
Português estruturado
programa LOOPING_2A
var
X, R, CONT : inteiro
início
para CONT de 1 até 5 passo 1
leia X
R = X * 3
escreva R
fim_para
fim
Estrutura de Controle – Tomada de Decisões

Exercício
Elaborar o algoritmo, diagrama de blocos e
português estruturado de um programa que
efetue o cálculo, e apresente em tela o
resultado, da fatorial do número 5, 5!
Desta forma temos 5! = 5 x 4 x 3 x 2 x 1
Que equivale a 120
Estrutura de Controle – Tomada de Decisões

Exercício
Elaborar o algoritmo, diagrama de blocos e
português estruturado de um programa que
efetue o cálculo da fatorial de um número
fornecido pelo usuário, e após a apresentação
do resultado em tela perguntar se ele deseja
efetuar outro fatorial ?
Exercícios para fixação
Desenvolva o diagrama de blocos e a
codificação em português estruturado para
os seguintes problemas:

a) Elaborar um programa que efetue a leitura


de um número inteiro e apresentar uma
mensagem informando se o número é par ou
ímpar. E perguntar ao usuário se ele deseja
efetuar outra operação caso negativo encerre
o programa( utilizar MOD 2)
Exercícios para fixação

b) Elaborar um programa que


apresente no final o somatório dos
valores pares existentes na faixa de 1
até 500 .
Exercícios para fixação

c) Elaborar um programa que efetue a leitura do


nome e do sexo de uma pessoa, apresentando
como saída uma das seguintes mensagens:
“Ilmo Sr.”, para o sexo informado como
masculino, ou a mensagem “Ilma Sra.”, para o
sexo informado como feminino. Apresente
também abaixo da mensagem impressa o
nome da pessoa.
Exercícios para fixação

d) Elaborar um programa que leia um


número. Se positivo armazene-o em A, se
for negativo, em B. No final mostrar o
resultado.
Exercícios para fixação
e) Leia o código de um determinado
produto e mostre a sua classificação.
Utilize a seguinte tabela como referência.
CÓDIGO CLASSIFICAÇÃO
1 Alimento não-perecível
2, 3 ou 4 Alimento perecível
5 ou 6 Vestuário
7 Higiene Pessoal
8 até 15 Limpeza e Utensílios Domésticos
Qualquer outro código Inválido
Exercícios para fixação
f) Escreva um programa que apresente a
série de Fibonacci até o décimo quinto
termo. A série de Fibonacci é formada pela
seqüência: 1,1, 2, 3, 5, 8, 13, 21, 34, ... etc.
Esta série se caracteriza pela soma de um
termo posterior com o seu anterior
subseqüente.
Teste de Mesa
Após desenvolver um algoritmo ele
deverá sempre ser testado. Este teste é
chamado de TESTE DE MESA, que
significa, seguir as instruções do
algoritmo de maneira precisa para
verificar se o procedimento utilizado está
correto ou não.
Teste de Mesa
programa LOOPING_2A
var
X, R, CONT : inteiro
início
para CONT de 1 até 5 passo 1
leia X
R = X * 3
escreva R Passo CONT X R
fim_para
fim 1 1 3 3 * 3 = 9
2 2 2 2 * 3 = 6
3 3 1 1 * 3 = 3
4 4 9 9 * 3 = 27
5 5 4 4 * 3 = 12
Introdução a C
 A linguagem “C” foi criada na década de 70 por Dennis M. Ritchie a partir de
uma outra linguagem: o “B”, criada por Ken Thompson. O “B”, por sua vez,
veio da linguagem BCPL, inventada por Martin Richards.
 A linguagem “C” tornou-se muito importante e popular por possuir tanto
características de “alto nível” quanto de “baixo nível” sendo considerada
uma linguagem de programação de “nível médio “. Outra característica
muito importante é ser portável, isto é, poder ser usada em várias máquinas
de portes e sistemas operacionais diferentes.

 Alto nível : comandos com sintaxe próxima a linguagem humana e tipos de


dados inteiro, real, caracter e string. Exemplo de linguagens de alto nível:
Pacal, Delphi, Basic, Visual Basic, Clipper, etc.
 Baixo nível: manipulação de bits, bytes e endereços. Exemplo: Assembler.
 Nível médio: combina elementos das linguagens de alto nível com a
funcionalidade das de baixo nível. Exemplo: Linguagem “C”.
Estrutura básica de um programa em “C”

Um programa em “C” consiste em uma ou


mais funções, sendo que a única função
que necessariamente precisa estar
presente é a denominada main()
(principal), que é a primeira função a ser
executada quando o programa se inicia.
As outras funções podem proceder ou
suceder a função main().
Estrutura básica de um programa em “C”

main(){
// corpo da função – bloco de comandos

}
 Os parênteses após a palavra “main()”, indica
que é uma função. O nome das demais funções
desenvolvidas em C, pode ser qualquer um,
menos “main”.
Estrutura básica de um programa em “C”

A linguagem “C” é “Case Sensitive”, isto é,


maiúsculas e minúsculas fazem diferença.
Se for declarada uma variável com o nome
soma ela será diferente de Soma, SOMA,
SoMa ou sOmA. Da mesma forma que os
comandos em “C” devem ser sempre
escritos com letras minúsculas.
Estrutura básica de um programa em “C”

Os comentários e as observações do


programa podem aparecer em qualquer
lugar desde que colocados entre os
delimitadores /* comentário */ ou //
comentário.

Em “C” as instruções são sempre


encerradas por “; “.
Estrutura básica de um programa em “C”

Tipos Básicos de dados


Tipo Bit Byte Escala
char 8 1 -128 a 127
int 16 2 -32768 a 32767
float 32 4 3.4E-38 a 3.4E+38
double 64 8 1.7E-308 a 1.7E+308
void 0 0 sem valor
Estrutura básica de um programa em “C”

 Modificadores de tipo
 Exceto o void, os tipos de dados básicos podem ter
vários modificadores precedendo-os. Um modificador
é usado para alterar o significado de um tipo básico
para adaptá-lo mais precisamente às necessidades
de diversas situações:

signed (com sinal)


unsigned (sem sinal)
long (máxima precisão)
short (menor precisão)
Estrutura básica de um programa em “C”
Modificadores de tipo
TIPO TAM.(bytes) ESCALA
Char 1 -127 a 127
Unsigned char 1 0 a 255
Signed char 1 -127 a 127
Int 2 -32767 a 32767
Unsigned int 2 0 a 65535
Signed int 2 -32767 a 32767
Short int 2 -32767 a 32767
Unsigned short int 1 0 a 65535
Signed short int 1 -32767 a 32767
Long int 4 -2147483647 a 2147483647
Signed long int 4 -4294967295 a 4294967295
Unsigned long int 4 0 a 4294967295
Float 4 3.4 *(10-38) a 3.4 * (10+38)
Double 8 1.7*(10-308) a 1.7*(10+308)
Long double 16 3.4*(10-4983) a 3.4*(10+4983)
Estrutura básica de um programa em “C”

IDENTIFICADORES
São usados para dar nomes às variáveis,
constantes, tipos e ou funções. Para a
criação desses identificadores deverá ser
consideradas as informações a seguir:
  Podem ser formados por letras, números ou sublinhado(_);
  Tem que começar por letra ou sublinhado;
  Letras maiúsculas e minúsculas são caracteres distintos;
  Não podem ser palavras reservadas;
  Podem conter qualquer tamanho porém somente os
31primeiros caracteres são significativos.
Estrutura básica de um programa em “C”

VARIÁVEL
É uma posição de memória com um nome,
que é usada para armazenar uma
informação de um tipo específico que
pode ser modificada pelo programa.
Forma Geral :
tipo lista_de variáveis;
Exemplo: int a,b,d;
float x,y;
unsigened int w;
Estrutura básica de um programa em “C”

Inicialização de variáveis:
As variáveis podem ser inicializadas no
mesmo momento em que elas são
declaradas, colocando um sinal de igual e
a informação desejada.
Exemplo:
char op=‘S’; /* as informações do tipo caracter são envolvidas por aspas
simples */

int primeiro=0;
char mensagem[20]=”Bom Dia !!”; /* as strings são
envolvidas por aspas */
Estrutura básica de um programa em “C”

MODIFICADORES DE TIPO DE ACESSO


Constantes : Não podem ser modificadas
pelo programa.
Forma Geral:
const tipo identificador;

Exemplo: const int max=10;


const float taxa1=0.7,taxa2=0.5;
Estrutura básica de um programa em “C”
Outra forma de declarar uma informação como
constante é usando a diretiva de compilação
#define.
Forma Geral:
#define identificador=informação /* não tem ; */
Exemplo:- #define volume=10
#define pi=3.141516
 Volatile : É usado quando uma variável pode ser modificada inesperadamente
por eventos externos ao controle do programa.

Forma Geral: volatile tipo lista_de_variáveis;


Exemplo: volatile int tempo; /* pode ser modificada pelo hardware para
atualizar a hora */.
Bibliotecas de funções .h
Existem bibliotecas com funções que
auxiliam a manipulação dos comando de
entrada e saia e também de manipulação
de telas.

Elas são descritas no início do programa C:

#include <nome_da_biblioteca.h>
Bibliotecas de funções .h
 FUNÇÕES DE TELA
 Biblioteca <conio.h>
#include <conio.h>
 Nela encontramos as seguintes funções
mais usadas:
 clrscr() - limpar a tela; Linux : printf("\033[2J");
 clreol() - limpa a linha;
 gotoxy(coluna,linha) - posiciona o cursor;
 window(coluna incial,linha inicial,coluna final, linha final)
-cria uma janela na tela;
 textcolor(cor) - seleciona a cor dos caracteres de texto;
 textbackground(cor) – seleciona a cor do fundo da tela;
Bibliotecas de funções .h
TABELA DE CORES:
0 PRETO
1 AZUL
2 VERDE
3 CIANO
4 VERMELHA
5 MAGENTA
6 MARROM
7 CINZA CLARO
8 CINZA ESCURO
9 AZUL CLARO
10 VERDE CLARO
11 CIANO CLARO
12 ALARANJADO
13 MAGENTA CLARO
14 AMARELO
15 BRANCO
Bibliotecas de funções .h
 FUNÇÕES DE ENTRADA E SAÍDA DE DADOS
 Biblioteca <stdio.h>
#include <stdio.h>
 getchar() - entrada de um caracter individual;
 getch() - entrada de um caracter. O caracter não é exibido na tela não é
necessário teclar <enter>;
 getche() - entrada de um caracter. O caracter é exibido na tela não é
necessário teclar <enter>;
 putchar - exibe um caracter na tela;
 gets() - entrada de string;
 puts() - saída de string;
 scanf() - entrada de dados formatada com string de controle de acordo com
o tipo da variável;
 printf() - saída de dados formatada com string de controle de acordo com o
tipo da variável;
 cprintf() - saída de dados formatada colorida com string de controle de
acordo com o tipo da variável;
Estrutura básica de um programa em “C”

CONSTANTES BARRA INVERTIDA


São utilizadas para controlar a exibição de dados na
tela e na impressora.
CÓDIGO SIGNIFICADO
\n nova linha (line feed)
\b retrocesso (backspace)
\t tabulação horizontal
\v tabulação vertical
\a alerta(beep)
\” para exibir aspas
\\ para exibir barra invertida
\f salto de folha (form fee)
\r retorna ao início da linha (return)
\0 nulo
Estrutura básica de um programa em “C”

COMANDOS DE FORMATO
São constantes que definem o tipo e o
formato dos dados a serem exibidos.
Comando Formato
%c caracter
%d inteiros decimais com sinal
%i inteiros decimais com sinal
%f decimais com ponto flutuante
%s string
%e notação científica
%o octal
%x hexadecimal
%l inteiro longo
%lf double
%u decimal sem sinal
Utilização das funções C.
A função printf( )
A função printf serve para exibir uma
informação no vídeo ou na impressora e
possui a seguinte estrutura.
 Forma Geral:
 printf(“expressão de controle”, lista de argumentos);

 Exemplo1:
 int i=4;
 float j=5.5;
 printf(“%d\n”, i);
 printf(“Este numero e inteiro: %d e este e real: %f”, i , j);
 Resultado: 4
 Este número é inteiro: 4 e este é real: 5.5
Utilização das funções C.
A Função scanf()
A função scanf() é outra das funções de E/S
implementadas em todos os compiladores C.
Ela é o complemento de printf() e nos permite
ler dados formatados da entrada padrão
(teclado).

Forma Geral:
scanf(“expressão de controle”, lista de argumentos)
Utilização das funções C.
A lista de argumentos deve consistir nos
endereços das variáveis. C oferece um
operador para tipos básicos chamado
operador de endereço e referenciado pelo
símbolo & que retorna o endereço do
operando. Na função scanf() cada nome
de variável deve ser precedida por um
ampersand(&) ou E-comercial. Somente
strings não devem conter & na frente.
Utilização das funções C.
 Exemplo1: O programa a seguir exibe a idade em dias de uma pessoa.

#include <stdio.h>
#include <conio.h>
void main()
{
int anos, dias;
printf(“Digite sua idade em anos: “);
scanf(“%d”,&anos);
dias = anos*365;
printf(“Sua idade em dias é %.d\n”,dias);
getchar();
}
 Resultado:
Digite sua idade em anos: 4
Sua idade em dias é 1460
Utilização das funções C.
Exercício:
 Calcula a média aritmética de duas notas de um aluno.
#include <stdio.h>
#include <conio.h>
void main()
{
float media,nota1,nota2;
clrscr();
printf(“\t Digite a 1ª nota: “);
scanf(“%f",&nota1);
printf("\t Digite a 2ª nota: ");
scanf("%f",&nota2);
media=(nota1 + nota2)/2;
printf(“\t A média é: %5.2f”, media);
getch();
}
Comandos em C
Comandos de Seleção
if (x>9)
y=100;
else
y=200; if((x == 2) && (x!=1)){
a=10;
b=20;
c=30;
}
else
a=b=c=0; if ((x == 2) && (x!=1)) {
a=10;
b=20;
c=30;
} else {
a=1;
b=c=0;
}
Comandos em C
Comando de Seleção Múltipla
char ch;
switch (ch){
case ‘1’ :
printf(“Inclusão”);
break;
case ‘2’ :
printf(“Consulta”); int num,a,b;
break; switch (num) {
default : case 1,2 :
printf(“Fim”); a=2*2;
} b=-1;
break;
case 3,4,5 :
a=2*3;
b=0;
break;
}
Comandos em C
Comandos de Repetição – while - do
while (ch!=’A’){
c=a+b; while ((a>0) || (b>0)){
printf(“%d”,c); c+=b;
scanf(“%c”,&ch); --a;
} --b;
}
do{
a++
printf(“%d”,a);
} while (a<100);

do{
scanf(“%f”,&a);
scanf(“%d”,&b);
} while ((a<=0) || (b<=0));
Comandos em C
Comandos de Repetição - for
for ( x=1;x<=100;x++ )
printf(“%d”,x);
for (x=0,y=0;x<10;x++,y--)
printf(“%d %d”,x,y);

for (x=100;x!=65;x-=5) {
z = x*x;
printf(“O quadrado de %d e %d”,x,z);
}

for(x=0; ;x++) {
printf(“%d”,x);
if (x==10) break;
}
Estrutura de Dados – Matriz ou Vetor

 Matrizes ou vetores (Tabelas em memória) são


do tipo de dados que podem ser “Construídos” à
medida que se fazem necessário.
Ilustração de uma matriz ou vetor (1x5)
notas[4] ou notas[1..4]
5 3 4 87 9

Significa dizer que a variável notas na posição 0 ou 1


(a depender qual sintaxe utilize) valerá 5
notas[0] = 5 , notas[1] = 3 ......... notas[4] = 9
Estrutura de Dados – Matriz ou Vetor

Diagrama de blocos de uma matriz / vetor


Início
Somará um vetor chamado MD[1..8]
MD[1] = 4.5 SOMA = 0

MD[2] = 6.5
i = 1, 8, 1
MD[3] = 8.0
MD[4] = 3.5 MD[i]

MD[5] = 6.0
SOMA = SOMA + MD[i]
MD[6] = 7.0
MD[7] = 6.5 Média =SOMA/8

MD[8] = 6.0
Média

Fim
Estrutura de Dados – Matriz ou Vetor
Português estruturado
programa Média
var
MD : conjunto[1..8] de real
SOMA, Média : real
i : inteiro
início
SOMA = 0
para i de 1 até 8 passo 1
leia MD[i]
SOMA = SOMA + MD[i]
fim_para
Média = SOMA/8
escreva Média
fim
Estrutura de Dados – Matriz ou Vetor

 STRING
 Em linguagem “C” não existe o tipo string. A utilização
desse tipo de variável se dá através da utilização de
um cadeia de caracteres, isto é um vetor de
caracteres terminados por um nulo (\0). Para
implementar esse tipo de dado deve-se ter sempre
um caracter a mais para armazenar o terminador nulo
Para declarar um tipo string:
char nome[11];

0 1 2 3 4 5 6 7 8 9 10

P a u l o \0
Estrutura de Dados – Matriz ou Vetor
 Para manipular as informações armazenadas em uma
string podemos utilizar as funções string ou utilizamos as
funções caracter , já que uma string é um vetor de
caracteres.

arquivo de cabeçalho para funções de string <string.h>


arquivo de cabeçalho para funções caracter <ctype.h>
Estrutura de Dados – Matriz ou Vetor
 Algumas Funções de Manipulação de Strings usando a
biblioteca <string.h>
Função Descrição Forma Geral

strcpy() copia uma string em outra. strcpy (s1,s2); // copia o conteúdo


de s2 em s1 e termina com nulo.

strcmp() compara duas strings. x=strcmp(s1,s2); // x==0 se as


strings forem iguais ou x!=0 se forem
diferentes.
strcat() junta o conteúdo de duas strcat(s1,s2); // s1 irá conter o
strings. resultado da junção das 2 strings.

strlen() fornece o tamanho de uma x=strlen(s1); // x vai conter o número


string. de caracteres ocupados na string .

strchr() verifica se um caracter x=strschr(s1,ch); // x !=0 se existir o


pertence a string. caracter ou x==0 se não existir.

strstr() verifica se uma string existe x=strstr(s1,s2); // x !=0 se s2 existir


dentro da outra string. em s1 ou x==0 se não existir.
Estrutura de Dados – Matriz ou Vetor
 Algumas Funções de Manipulação de caracter usando a
biblioteca <ctype.h>
Função Descrição Forma Geral
isdigit() verifica se o caracter é um isdigit(a); // !=0 é número; =0 não é
número de 0-9. número.

isalpha() verifica se o caracter é uma isalpha(a); // !=0 é letra; =0 não é


letra letra.

isupper() verifica se um caracter está isupper(a); // !=0 é maiúscula =0 não


em maiúscula é.

ispunct() verifica se um caracter é ispunct(a); // !=0 é pontuação; =0 não


pontuação. é.

isspace() verifica se um caracter é isspace(a); // !=0 é espaço; =0 não é.


espaço.
toupper() transforma um caracter em a=toupper(a); // o conteúdo de a
letra maiúscula. em maiúscula.

tolower() transforma um caracter em a=tolower(a); // o conteúdo de a em


letra minúscula. minúscula.
Estrutura de Dados – Matriz ou Vetor

Uma matriz é um tipo de dado usado para


representar uma certa quantidade de
variáveis de valores homogêneos. Imagine
o seguinte problema: ler a média final de
5 alunos e calcular a media geral. Você
poderia declarar:
Estrutura de Dados – Matriz ou Vetor

void main() {
float notas[7],media=0;
int i;
for (i=0; i<7; i++) {
pritf(“Digite a nota do aluno %d: “,i);
scanf(“%f”, &notas[i]);
media+=notas[i];
}
media=media/8;
printf(“A média Geral= %5.2f”,media);
}
Exemplos – usando Matriz ou Vetor
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
void main(){
char nome[20],op='S';
float va,rl;
do {
clrscr();
printf("\t\tAPLICACOES\n");
printf("\t Nome.....: ");
gets(nome);
printf("\t Valor....: ");
scanf("%f",&va);
if (va<=10000.00)
rl=va*0.014-0.002*va;
else
rl=va*0.018-0.002*va;
printf("\t Rendimento .. : %8.2f\n\n",rl);
printf("Deseja Continuar %s <s/n > ? ",nome);
do {
gotoxy(50,6);
clreol();
scanf("%c",&op);
op=toupper(op);
} while ((op!='S') && (op!='N'));
getchar();
} while (op=='S');
}
Exemplos – usando Matriz ou Vetor
 Matriz multidimensional:

#include <stdio.h>
Resultado:
#include <conio.h> j/i 0 1 2 3
void main(){
0 1 2 3 4
int j,i,num[4][4];
1 5 6 7 8
clrscr();
2 9 10 11 12
for(j=0;j<4;++j){
for(i=0;i<4;++i){ 3 13 14 15 16

num[j][i] = (j*4)+i+1;
printf("%2.0d ",num[j][i]);
} Agora efetue a soma da
printf("\n"); Diagonal principal da Matriz
}
e apresente na tela.
getchar();
}
Função
Função é um seguimento independente do
programa que executa uma tarefa
específica.

Todo o programa em “C” é formado por


uma ou mais funções.
Função
Forma Geral:

tipo nomeDaFunção (lista de parâmetros){


corpo da função;
}

Toda função deverá ter seu protótipo


declarado no início do programa, ou em
um arquivo de cabeçalho .h
Função
 Em “C” podemos ter dois tipos de parâmetros: passagem
de parâmetros por valor e passagem de parâmetros por
referência.
 Na passagem de parâmetros por valor as
informações dos parâmetros são copiadas para a função
receptora. As alterações nesses parâmetros não tem
nenhum efeito na função de origem da informação.
 Na passagem de parâmetros por referência, é
enviado o endereço do parâmetro para a função
receptora, dessa forma o endereço é usado para acessar
as informações originais. Isto significa que qualquer
alteração efetuada no parâmetro estará modificando o
conteúdo original da informação enviada.
Função Pasagem por Valor e Referência
#include <stdio.h>
#include <conio.h> Por referência
void calculo (int *a,int *b);
float sqr (float num);
void main(){
int num1=100,num2=200;
Por Valor
float num,sq;
calculo (&num1,&num2);
printf("\n Os valore atuais de num1= %d e num2 = %d",num1,num2);
printf ("\n\n\nEntre com um numero: ");
scanf ("%f",&num);
sq=sqr(num);
printf ("\n\nO numero original e: %f\n",num);
printf ("O seu quadrado vale: %f\n",sq);
}

void calculo (int *a, int *b){


*a = *a * 2;
*b = *b - 50;
}
Observe os resultados.
float sqr (float num){
num=num*num;
return num;
}
Ponteiros
 Um ponteiro proporciona um modo de acesso a
variáveis sem referenciá-las diretamente. O
mecanismo usado para isto é o endereço da
variável.
“Um ponteiro é uma variável que contém um
endereço de memória. Esse endereço é
normalmente a posição de uma outra variável na
memória. Se uma variável contém o endereço de
uma outra, então diz-se que a 1ª variável aponta
para a segunda”.
Ponteiros
Ponteiro a
30 Variável X

Ponteiro ‘a’ aponta para o endereço da variável X

 Operadores Associados a Ponteiros


 & - operador unário que devolve o endereço da memória do seu
operando;
* - operador unário que devolve o conteúdo da variável localizada
no endereço de memória do seu operando, que é uma variável
ponteiro.
Ponteiros também tem tipos. Quando declaramos um ponteiro nós
informamos ao compilador para que tipo de variável o ponteiro
está apontando.

Forma Geral :
tipo *identificador;
Ponteiros
 Exemplo:
int *px,*py;
Para atribuir valores as variáveis ponteiro e para acessar
as informações usamos:
*px=3;
*py=5;

 Na declaração, o símbolo * indica o tipo apontado (o


ponteiro) em outras situações indica o conteúdo da
variável apontada.
 O ponteiro deve ser inicializado (apontado para algum
lugar conhecido) antes de ser usado.
 Ponteiros são sempre inicializados com o valor 0 ou NULL
então antes de usá-los devemos atribuir algum endereço
válido a eles.
Ponteiros
#include <stdio.h>
#include <conio.h>
void main(){
int x=5,y=6;
int *px,*py;

px=&x;
py=&y;

printf(“px=%p, *px=%d, &px=%p\n”, px,*px,&px);


printf(“py=%p, *py=%d, &py=%p\n”, py,*py,&py);
}

O resultado será:
px=65488, *px=5, &px=65492
py=65490, *py=6, &py=65494
OBS: O formato %p no printf indica que vai ser exibido um endereço.
Ponteiros

X Y
Onde:
5 6 px => retorna o endereço para o qual o
ponteiro aponta;

65488 65490 &px => retorna o endereço do ponteiro;

pX pY *px => retorna o conteúdo da variável


apontada.
65488 65490

65492 65494
Ponteiros
 Podemos fazer algumas operações aritméticas com ponteiros. A primeira, e mais
simples, é a de igualar dois ponteiros p1=p2, assim p1 aponta para o mesmo lugar que
p2. Se quisermos que a variável apontada por p1 tenha o mesmo conteúdo da variável
apontada por p2 devemos fazer *p1=*p2.
 Outras operações com ponteiros também bastante usadas são o incremento e o
decremento. Quando incrementamos um ponteiro ele passa a apontar para o próximo
valor do mesmo tipo para o qual o ponteiro aponta (avança um número de bytes na
memória) como por exemplo:
int *p;
p++; // avança dois bytes na memória
p--; // decrementa dois bytes na memória
 Para incrementar o conteúdo da variável apontada pelo ponteiro p temos:
*p++;
 Outras operações podem ser efetuadas com ponteiros como a adição e subtração de
inteiros com ponteiros, bem como os operadores de (== , !=, >, <, >=,<=).
 Exemplos:
p=p+15; // desloca o ponteiro 15 posições;
*(p+15); // utiliza o conteúdo do ponteiro 15 posições adiante;
p1>p2; // compara qual dos dois ponteiros está mais adiante na memória.
 Existem operações que não podem ser efetuadas com ponteiros, como por exemplo
dividir ou multiplicar ponteiros
Ponteiros

#include <stdio.h>
void main(){
int num,valor;
int *p;
num=70;
p=&num; // recebe o endereço de num
valor=*p; // valor recebe o mesmo conteúdo de num
printf(“\n\n %d \n”,valor);
printf(“Endereço para onde o ponteiro aponta: %p \n”,p);
printf(“Valor da variável apontada: %d \n”,*p);
*p=100; // modifica o conteúdo da variável num indiretamente
printf(“Valor da variável modificada %d \n”,*p);
}
Ponteiros e Matrizes
Uma das aplicações mais importantes com
ponteiros e a varredura seqüencial de uma
matriz, isto é, quando temos que percorrer
todos os elementos de uma matriz de uma
forma seqüencial, podemos usar um
ponteiro incrementando-o até o final da
matriz.
Ponteiros e Matrizes
 Em uma matriz o próprio nome da matriz é o
endereço do primeiro elemento da matriz.
 Se x é uma matriz unidimensional, então, o
endereço do primeiro elemento da matriz pode
ser expresso &x[0] ou simplesmente x.
 Além disso o endereço do segundo elemento da
matriz pode ser expresso por &x[1] ou (x + 1), e
assim por diante até o enésimo elemento da
matriz &x[ i ] ou (x + i) .

Podemos então ter 2 modos diferentes de acessar os


elementos de uma matriz
Ponteiros e Matrizes
Na expressão (x + i) x representa o
endereço e i representa uma quantidade
inteira que significa i elementos depois do
primeiro (deslocamento).
Como &x[ i ] e (x + i) representam o
endereço do inésimo elemento de x, x[ i ]
e *(x + i) representam o conteúdo desse
endereço.
Ponteiros e Matrizes
Exemplo:
#include <stdio.h>
#include <conio.h>
void main(){
int x[10], i;
clrscr();
for (i=0;i<=9;i++){
scanf(“%d”,&x[i]);
printf(“\n i= %d x[i]= %d *(x+i) = %d &x[i] = %p x+1 =
%p”,i , x[i], *(x+i), &x[i], x+i);
}
getchar();
}
Resultado
i = 0 x[ i ]= 10 *(x+i) = 10 &x[ i ] = 72 x + i=72
i = 1 x[ i ]= 11 *(x+i) = 11 &x[ i ] = 74 x + i=74
i = 2 x[ i ]= 12 *(x+i) = 12 &x[ i ] = 76 x + i=76
i = 3 x[ i ]= 13 *(x+i) = 13 &x[ i ] = 78 x + i=78
i = 4 x[ i ]= 14 *(x+i) = 14 &x[ i ] = 7A x + i=7A
Ponteiros e Matrizes
 Exercício:
 Desenvolver um programa que dado um vetor de 10 elementos
numéricos inteiros calcular um outro vetor que deverá conter os
elementos do 1º vetor elevados ao quadrado. Usar aritmética de
ponteiros.
#include <stdio.h>
#include <conio.h>
#include <math.h> void main() {
void main() { int vet1[10],vet2[10],x,*pt;
int vet1[10],vet2[10],x; clrscr();
clrscr(); pt=vet1; // não precisa & porque o
for(x=0;x<10;x++) { //Nome de uma matriz é um ponteiro
scanf("%d",(vet1+x));//não prec. & for(x=0;x<10;x++) {
*(vet2+x)=pow(*(vet1+x),2); scanf("%d",(pt+x));
printf("%d\n",*(vet2+x)); *(vet2+x) = pow (*(pt+x),2);
} printf("%d\n",*(vet2+x);}
getchar(); getchar();
} }
Estruturas, Uniões, Tipos Definidos e Enumerações

A Linguagem “C” permite que se crie


vários tipos diferentes de dados que
possam ser agrupados de formas
definidas.

Essas formas são um tipo de dado


definido pelo programador e são
conhecidas como:
Estruturas e Uniões.
Estruturas, Uniões, Tipos Definidos e Enumerações

 ESTRUTURA
 Uma estrutura é uma coleção de tipos diferentes referenciadas por um
nome, isto é, a estrutura é uma forma de se ter informações agrupadas.

Forma Geral:
struct nome {
tipo nome_da_variável;
tipo nome_da_variável;  elem. da estrutura
....
} variáveis da estrutura;

OBS: A struct é um tipo de dado, não existe um espaço reservado na


memória para ela até que seja declarada uma variável para armazenar
o tipo definido.
Estruturas, Uniões, Tipos Definidos e Enumerações

 Exemplo:
struct veículo {
char modelo[25];
char marca[15];
float custo;
};

veículo carro; // onde vaículo e o tipo e carro a variável

 Outra forma de declarar uma estrutura pode ser:


struct veículo { struct xy {
char modelo[25]; int x;
char marca[15]; float y;
float custo; } a,b; // Duas variáveis com
} carro; // mesmo tipo de struct
Estruturas, Uniões, Tipos Definidos e Enumerações

Para referenciar cada elemento da


estrutura utiliza-se o operador ponto.
Forma Geral:
nome_da_variávelnome_do_elemento;

 Exemplo:-
a.x =10; b.x =5;
a.y =2.5; b.y = 0.5;
gets(carro.modelo);
scanf(“%f”,&carro.custo);
Estruturas, Uniões, Tipos Definidos e Enumerações
 É possível também ter-se uma matriz de estruturas. Exemplos:
struct veículo {
char modelo[20];
char marca[15];
float custo;
} carro[100];
/* isto cria 100 conjuntos de variáveis que estão organizadas com os elementos acima */.

 Para referenciar cada elemento da estrutura utiliza-se:


float aux;
gets(carro[0].marca);
gets(carro[0].modelo);
scanf(“%f”, &aux);}
carro[x].custo = aux;
....
 Para simplificar esta estrutura poderíamos ter:
 float aux;
for (x=0;x<100;x++){
gets(carro[x].marca);
gets(carro[x].modelo);
scanf(“%f”, &aux);}
carro[x].custo = aux;
Exercício

Elaborar um programa que contenha uma


estrutura que armazena o número da
conta e o saldo de 5 clientes. O programa
calcula o saldo médio dos 5 clientes e
exibe na tela quais os clientes que
possuem saldo acima ou igual a média
Solução
#include <stdio.h>
#include <conio.h>
void main(){
struct cliente{
char conta[20];
float saldo;
} cli[5];
float saldo_medio=0,aux;
int x;

for (x=0;x<5;x++){
clrscr();
printf("\t\t\t CONTROLE BANCARIO \n");
printf("\t Nr da Conta.........: ");gets(cli[x].conta);
printf("\t Saldo ..............: ");scanf("%f",&aux);
cli[x].saldo=aux;
saldo_medio += cli[x].saldo;
getchar();
}
saldo_medio=saldo_medio/5;
clrscr();
printf("\t\t CLIENTES COM SALDO ACIMA DA MEDIA \n\n\n");
printf("\t Nr da conta \t Saldo \n\n");
for (x=0;x<5;x++){
if (cli[x].saldo >=saldo_medio)
printf("\t %s \t\t %8.2f \n", cli[x].conta,cli[x].saldo);
}
getchar();
}
Exercício
 Vamos supor que várias pedras do jogo de xadrez estão no
tabuleiro. Para facilitar a indicação das peças, vamos
convencionar:
 1 – peões 2 – cavalos
 3 – torres 4 – bispos
 5 – reis 6 – rainhas
 0 – ausência de peças
O tabuleiro
1 3 0 5 4 0 2 1
a) Construa um programa que determine a 1 0 1 0 0 1 0 0
soma total entre peões e bispos e a
0 0 0 0 1 0 6 0
quantidade de posições com ausência de
peças;
1 0 0 1 1 0 0 1

0 1 0 4 0 0 1 0

b) Escreva outro programa que determine qual a 0 0 3 1 0 0 1 1

quantidade de cada tipo de peça no 1 0 6 6 0 0 1 0

tabuleiro. 1 0 5 0 1 1 0 6
Solução
#include <stdio.h>
#include <conio.h>

void main(){
int tabuleiro[8][8] = { {1,3,0,5,4,0,2,1},
{1,0,1,0,0,1,0,0},
{0,0,0,0,1,0,6,0},
{1,0,0,1,1,0,0,1},
{0,1,0,4,0,0,1,0},
{0,0,3,1,0,0,1,1},
{1,0,6,6,0,0,1,0},
{1,0,5,0,1,1,0,6} };
int i,j;
int branco=0, peao=0, cavalo=0, torre=0, bispo=0, rei=0, rainha=0;

printf("\tApresentação do tabuleiro\n");
for (i=0;i<8;i++){
for (j=0;j<8;j++){
printf("%2.0d",tabuleiro[i][j]);
}
printf("\n");
}

// Continua …..
Solução --- Continuação ----

for (i=0;i<8;i++){
for (j=0;j<8;j++){
switch (tabuleiro[i][j]){
case 0: branco++; break;
case 1: peao++; break;
case 2: cavalo++; break;
case 3: torre++; break;
case 4: bispo++; break;
case 5: rei++; break;
case 6: rainha++; break;
}
}
}
printf("\n");
printf("Soma de Peoes ou bispos e brancos =%d\n",(peao + bispo + branco));
printf("Peoes =%d, cavalos=%d, torres=%d, bispos=%d, reis=%d, rainhas=%d,
branco=%d",peao, cavalo, torre, bispo, rei, rainha, branco);

}
Arquivos
 ARQUIVO : É um conjunto de registros logicamente
organizados armazenados em um dispositivo de
memória secundária (disco rígido, disquetes, fitas
magnéticas, cd, etc), onde cada registro compreende
um conjunto de informações denominadas campos.
Em um arquivo é possível armazenar um volume
grande de dados.
Arquivo
Registro
Campo
Acesso a disco
“Linguagem C” divide as categorias de
acesso a disco em dois grupos.
Alto nível, ou leitura e gravação bufferizada
Baixo nível, ou leitura e gravação não
bufferizada.
Iremos estudar a categoria do grupo de
alto nível por possuir algumas vantagens
sobre a de baixo nível.
“facilidade para ler e gravar qualquer tipo de
dado e a portabilidade”
Acesso a disco
 É possível classificar os arquivos conforme a forma como
eles são abertos:
 Modo texto
 Modo binário

 Um arquivo aberto em modo texto é interpretado em “C”


como sendo uma seqüência de caracteres agrupados em
linhas que devem ser separadas por um caracter de nova
linha, as informações numéricas também são armazenadas
em cadeias de caracteres, enquanto que, no modo binário
tudo é muito mais simples.

 Não há necessidade de nenhuma conversão de tipos. Para os tipos


numéricos na forma binária eles são armazenados como estão na
memória, nem mesmo a indicação de final de arquivo é necessária
pois acaba sendo interpretada automaticamente. Sendo assim
estaremos utilizando leitura e gravação em alto nível com modo de
acesso binário
OPERAÇÕES BÁSICAS COM ARQUIVO

Abrir
Fechar
Apagar
Copiar
Renomear
OPERAÇÕES BÁSICAS COM ARQUIVO
 ABRIR O ARQUIVO: Para podermos utilizar as informações
contidas no arquivo ou para guardá-las nesse arquivo
devemos primeiramente abrir o arquivo:
 É necessária a declaração de uma estrutura do tipo FILE que
receberá um ponteiro para o arquivo que está sendo aberto.

 Para que o S.O. possa abrir o arquivo três informações


devem ser fornecidas: o nome do arquivo, o tipo de
abertura (se o arquivo está sendo lido ou gravado) e onde
guardar as informações sobre o arquivo.
 Usando a função fopen().

 A estrutura FILE contêm informações sobre o arquivo tais como:


seu tamanho atual, a localização de seus buffers de dados, se o
arquivo está sendo lido ou gravado, etc.
OPERAÇÕES BÁSICAS COM ARQUIVO
Nome do arquivo e
tipo de abertura
Programa em “C” S.O. Disco
Ponteiro para
estrutura FILE

MODO SIGNIFICADO

r Abre um arquivo texto para leitura. O arquivo deve existir.

w Cria um arquivo texto para escrita. Se o arquivo exitir será recriado por cima caso não exista será criado.

a Abre um arquivo texto para gravação.Se o arquivo existir os dados serão anexados no final do arquivo se não existir será criado um
novo.

r+ Abrir um arquivo texto para leitura e gravação. O arquivo tem que existir.

w+ Abre um arquivo texto para leitura e gravação. Se o arquivo existir será recriado por cima. Se não existir será criado.

a+ Abre um arquivo texto para atualização e para adicionar dados no fim do arquivo se ele existir se não cria-se um novo arquivo

rb Abre um arquivo binário para leitura. O arquivo deve existir.

wb Cria um arquivo binário para escrita. Se o arquivo exitir será recriado por cima caso não exista será criado.

ab Abre um arquivo binário para gravação.Se o arquivo existir os dados serão anexados no final do arquivo se não existir será criado um
novo.

rb+ Abre um arquivo binário para leitura e gravação. O arquivo deve existir e pode ser atualizado.

wb+ Abrir um arquivo binário para leitura e gravação. Se o arquivo existir ele será destruído e reinicializado. Se não existir será criado.

ab+ Abrir um arquivo binário para atualização e para adicionar dados ao fim do arquivo existente ou um novo arquivo será criado.
OPERAÇÕES BÁSICAS COM ARQUIVO
 Exemplo.:
#include <stdio.h>
#include <conio.h>
void main(){
struct aluno {
char ra[9];
char nome[20];
}teste;
FILE *ARQ;
int x;
long N;
gets(teste.ra);
gets(teste.nome); A função ftell() retorna um número
ARQ=fopen ("curso.dat","ab+");
fseek(ARQ,sizeof(teste),SEEK_END); inteiro longo que representa o número de
N=(ftell(ARQ)/sizeof(teste)-1); bytes do começo do arquivo até a posição
fseek(ARQ,N*sizeof(teste),SEEK_CUR); atual.
fwrite(&teste,sizeof(teste),1,ARQ);
fclose(ARQ);
}

FECHAR ARQUIVO: Todo arquivo aberto deverá ser fechado para garantir a
integridade dos dados armazenados, caso isso não ocorra poderá haver
perda de informações.
 fclose().
OPERAÇÕES BÁSICAS COM ARQUIVO

 APAGAR ARQUIVO: Deleta um arquivo existente. Todo


arquivo antes de ser apagado deve ser fechado.
Forma Geral:
remove(nome físico do arquivo);

 RENOMEAR ARQUIVO: Permite mudar o nome do


arquivo existente para um outro nome diferente. Antes
de renomear o arquivo deve ser fechado.
Forma Geral:
rename(nome físico do arquivo,novo nome físico do arquivo);
onde: Nome dado ao arquivo de dados e o novo nome que será
dado
OPERAÇÕES BÁSICAS COM ARQUIVO
 LER REGISTRO DO ARQUIVO: quando lemos um registro de um
arquivo estamos transferindo os dados do registro do arquivo,
armazenados em memória secundária, para a memória principal do
computador (memória RAM). Para isto utilizamos a seguinte
instrução:
Forma Geral:
fread(&estrutura,sizeof(estrutura),1,ponteiro);
Onde: &estrutura - é o endereço na memória onde os dados serão
lidos;
sizeof(estrutura) – operador que retorna o tamanho da estrutura;
1: quantidade de estruturas a ser lida (normalmente 1);
ponteiro: o nome do ponteiro da estrutura FILE.
OPERAÇÕES BÁSICAS COM ARQUIVO
 ESCREVER UM REGISTRO NO ARQUIVO (GRAVAR) : quando
escrevemos (gravamos) um registro num arquivo, estamos
transferindo os dados do registro, armazenados em memória
principal, para a memória secundária do computador (disquete,
disco rígido, CD, etc). Utilizamos a seguinte instrução:
Forma Geral:
fwrite(&estrutura,sizeof(estrutura),1,ponteiro);

Onde:&estrutura-é o endereço na memória onde os dados serão


armazenados;
sizeof(estrutura) – operador que retorna o tamanho da estrutura;
1: quantidade de estruturas a ser gravada (normalmente 1);
ponteiro: o nome do ponteiro da estrutura FILE.
ORGANIZAÇÃO DE ARQUIVOS
Existem duas formas diferentes de
acesso aos registros de um arquivo:
O acesso seqüencial,
O acesso direto (também conhecido como
randômico)

“Existem outras formas de acesso que são


variações destas que não serão tratadas.”
ORGANIZAÇÃO DE ARQUIVOS
 Acesso Seqüencial:
 Quando desejamos ter acesso aos dados de um
determinado registro mas não sabemos a localização
desse registro no arquivo devemos vasculhar o
arquivo desde o início em busca do registro desejado
até o final do arquivo se necessário. Esta operação
deverá ser repetida seqüencialmente, isto é,
avançando pelos registros armazenados até que se
encontre o registro procurado. Isto significa que para
acessar um registro específico precisamos obedecer a
ordem com que os registros foram armazenados no
arquivo, o que implica em percorrer todos os registro
que o antecedem.
ORGANIZAÇÃO DE ARQUIVOS
 Acesso Direto ou Randômico:
 Neste caso para acessarmos o registro desejado é
necessário que saibamos a sua posição física (posição
do registro no arquivo no instante da gravação).
Dessa forma é possível se posicionar
instantaneamente no registro desejado sem ter que
percorrer todos os registros que o antecedem. Para
isto, é necessário conhecer o número da posição
física do registro dentro do arquivo. A posição física
de um registro é um número único, pois nunca dois
registros diferentes poderão ter a mesma localização.
COMANDOS E FUNÇÕES PARA MANIPULAÇÃO DE
REGISTROS

 Para posicionar o ponteiro de arquivo para o registro:


fseek(ponteiro,sizeof(estrutura),deslocamento);
Onde: ponteiro: é o nome do ponteiro da estrutura FILE.
sizeof(estrutura) – operador que retorna o tamanho da estrutura;
Deslocamento também chamado de modo : posição especificada para o
ponteiro do arquivo;

DESCRIÇÃO Pode ser uma macro MODO


Pode ser um número
Começo do arquivo SEEK_SET 0

Posição corrente do ponteiro SEEK_CUR 1

Final do arquivo SEEK_END 2


COMANDOS E FUNÇÕES PARA MANIPULAÇÃO DE
REGISTROS

 Para indicar o final do arquivo usamos a função feof( )


que retorna um número inteiro enviado pelo S.O que
indica final de arquivo.

Forma Geral:
feof(ponteiro);
Onde: ponteiro é o nome da variável do tipo FILE;
No DOS a função feof() retorna –1 caso seja final de arquivo e 0 caso contrário.
Exemplo:

while ( !feof(ponteiro))
fread(&estrutura,sizeof(estrutura),1,ponteiro);
COMANDOS E FUNÇÕES PARA MANIPULAÇÃO DE
REGISTROS

 Para posicionar o ponteiro de arquivo no início do arquivo, isto é, no


1º registro temos:
Forma Geral:
rewind(ponteiro);
Onde: Ponteiro é o nome da variável do tipo FILE.

 A função ftell() retorna um número inteiro longo que representa o


número de bytes do começo do arquivo até a posição atual.
Forma Geral:
ftell(ponteiro);
Onde: Ponteiro é o nome da variável do tipo FILE.

Se o número que retornou dessa função for dividido pelo tamanho da


estrutura teremos o número da posição física do registro.
Exemplo prático
#include <stdio.h> void main(){
#include <conio.h> abre_arquivo1();
#include <dos.h> menu();
#include <ctype.h> fclose(parq);
#include <stdlib.h> }
#include <string.h>

struct veiculo { void abre_arquivo1(){


char modelo[20]; parq=fopen("t3.dad","ab+");
char marca[20]; if (parq==NULL){
float preco; printf("Ocorreu um erro o arquivo nao pode ser aberto\n");
}reg; delay(1000);
exit(1);
FILE *parq; }
}
void menu(); void abre_arquivo2(){
void abre_arquivo1(); parq=fopen("t3.dad","rb+");
void abre_arquivo2(); if (parq==NULL){
void inclusao(); printf("Ocorreu um erro o arquivo nao pode ser aberto\n");
void consulta_s(); delay(1000);
void consulta_d(); exit(1);
void alteracao(); }
void exclusao(); }
void reorganizar();
void tela1();
void tela2();
char resposta();
Exemplo prático ... Continuação

void menu(){
int op;
do{
clrscr();
gotoxy(20,2);printf("<<< M E N U D E O P C O E S >>>");
gotoxy(30,6);printf("1 - INCLUSAO ");
gotoxy(30,8);printf("2 - CONSULTA SEQUENCIAL");
gotoxy(30,10);printf("3 - CONSULTA DIRETA");
gotoxy(30,12);printf("4 - ALTERACAO");
gotoxy(30,14);printf("5 - EXCLUSAO");
gotoxy(30,16);printf("6 - FIM ");
gotoxy(25,18);printf("Digite a opcao <1-6> ?");
do{
gotoxy(47,18);clreol();scanf("%d",&op);
} while (op<1 || op>6);
if (op!=6){
switch (op){
case 1:inclusao();break;
case 2:consulta_s();break;
case 3:consulta_d();break;
case 4:alteracao();break;
case 5:exclusao();break;
}
}
}while (op!=6);
}
Exemplo prático ... Continuação

void inclusao(){
char op;
int x;
long N;
fseek(parq,sizeof(reg),SEEK_END);
N=(ftell(parq)/sizeof(reg)-1);
do {
tela1();
getchar();
gotoxy(10,6);printf("O NUMERO DO REGISTRO: %ld",N);
gotoxy(40,8);gets(reg.modelo);
gotoxy(40,10);gets(reg.marca);
gotoxy(40,12);scanf("%f",&reg.preco);
fseek(parq,N*sizeof(reg),SEEK_CUR);
fwrite(&reg,sizeof(reg),1,parq);
op=resposta();
N++;
}while(op!='N');
}
Exemplo prático ... Continuação

void consulta_s(){
int num,lin=8;
tela2();
rewind(parq);
fread(&reg,sizeof(reg),1,parq);
while (!feof(parq)){
gotoxy(10,lin);printf("%s",reg.modelo);
gotoxy(40,lin);printf("%s",reg.marca);
gotoxy(60,lin);printf("%10.2f",reg.preco);
fread(&reg,sizeof(reg),1,parq);
lin++;
}
getch();
}
Exemplo prático ... Continuação
void consulta_d(){
int num;
long tam;

char op;
fseek(parq,sizeof(reg),SEEK_END);
tam=(ftell(parq)/sizeof(reg))-2;
do{
tela1();
gotoxy(10,6);printf("QUAL REGISTRO DESEJA CONSULTAR ?");
do{
gotoxy(45,6);clreol();scanf("%d",&num);
}while (num<0 || num>tam);
fseek(parq,num*sizeof(reg),SEEK_SET);
fread(&reg,sizeof(reg),1,parq);
gotoxy(40,8);printf("%s",reg.modelo);
gotoxy(40,10);printf("%s",reg.marca);
gotoxy(40,12);printf("%10.2f",reg.preco);
op=resposta();
}while(op!='N');
}
Exemplo prático ... Continuação
void alteracao(){
int num;
long tam;
char op, resp[20]="";

fclose(parq);
abre_arquivo2();
fseek(parq,sizeof(reg),SEEK_END);
tam=(ftell(parq)/sizeof(reg))-2;

do{
tela1();
gotoxy(10,6);printf("QUAL REGISTRO DESEJA ALTERAR ?");
do{
gotoxy(45,6);clreol();scanf("%d",&num);
}while (num<0 || num>tam);
fseek(parq,num*sizeof(reg),SEEK_SET);
fread(&reg,sizeof(reg),1,parq);
gotoxy(40,8);printf("%s",reg.modelo);
gotoxy(40,10);printf("%s",reg.marca);
gotoxy(40,12);printf("%10.2f",reg.preco);
getchar();
gotoxy(40,8);gets(resp);
if (strcmp(resp,"") !=0){
strcpy(reg.modelo,resp);
gotoxy(40,8);clreol();printf("%s",reg.modelo);
}
// Continua………………………………………………………………………………
Exemplo prático ... Continuação

// Continuação…………………………………………………
gotoxy(40,10);gets(resp);
if (strcmp(resp,"") !=0){
strcpy(reg.marca,resp);
gotoxy(40,10);clreol();printf("%s",reg.marca);
}
do{
gotoxy(40,12);gets(resp);
if (strcmp(resp,"") !=0){
reg.preco=atof(resp);
gotoxy(40,12);clreol();printf("%8.2f",reg.preco);
}
}while (reg.preco <=0);
fseek(parq,num*sizeof(reg),SEEK_SET);
fwrite(&reg,sizeof(reg),1,parq);
op=resposta();
}while(op!='N');
fclose(parq);
abre_arquivo1();
}
Exemplo prático ... Continuação

void exclusao(){
int num,cont=0;
long tam;
char op;

fclose(parq);
abre_arquivo2();
fseek(parq,sizeof(reg),SEEK_END);
tam=(ftell(parq)/sizeof(reg))-2;
do{
tela1();
gotoxy(10,6);printf("QUAL REGISTRO DESEJA CONSULTAR ?");
do{
gotoxy(45,6);clreol();scanf("%d",&num);
}while (num<0 || num>tam);
fseek(parq,num*sizeof(reg),SEEK_SET);
fread(&reg,sizeof(reg),1,parq);
if (strcmp(reg.modelo,"***") == 0){
gotoxy(20,22);printf("Registro ja excluido !!");
delay(1000);
} else
// Continuação ……………………………………………………
Exemplo prático ... Continuação
// Continuação ……………………………………………………
{
gotoxy(40,8);printf("%s",reg.modelo);
gotoxy(40,10);printf("%s",reg.marca);
gotoxy(40,12);printf("%10.2f",reg.preco);
gotoxy(40,19);printf("Confirma Exclusao ?");
op=resposta();
if (op=='S'){
strcpy(reg.modelo,"***");
fseek(parq,num*sizeof(reg),SEEK_SET);
fwrite(&reg,sizeof(reg),1,parq);
cont++;
gotoxy(40,19);printf("Registro Excluido !!");delay(1000);
}
}
gotoxy(40,19);clreol();
op=resposta();
}while(op!='N');
fclose(parq);
abre_arquivo1();
if (cont > 0) reorganizar();
}
Exemplo prático ... Continuação

void reorganizar(){
FILE *parq2;
parq2=fopen("t3.bak","wb+");
fclose(parq);
abre_arquivo2();
rewind(parq);
while (! feof(parq)){
if (fread(&reg,sizeof(reg),1,parq) >=1)
if (strcmp(reg.modelo,"***") !=0)
fwrite(&reg,sizeof(reg),1,parq2);
}
fclose(parq);
fclose(parq2);
remove("t3.dad");
rename("t3.bak","t3.dad");
abre_arquivo1();
}
Exemplo prático ... final
void tela2(){
clrscr();
gotoxy(30,3); printf("CADASTRO DE VEICULOS ");
gotoxy(10,5);printf("MODELO \t\t\t MARCA \t\t\t PRECO R$\n");
}

void tela1(){
clrscr();
gotoxy(40,2);printf("CADASTRO DE VEICULOS");
gotoxy(10,8);printf(" MODELO............: ");
gotoxy(10,10);printf(" MARCA.............: ");
gotoxy(10,12);printf(" PRECO.............: R$");
}

char resposta(){
char op;
gotoxy(40,20);printf("Deseja Continuar <S/N> ?");
do{
gotoxy(65,20);clreol();scanf("%c",&op);
op=toupper(op);
}while (op!='N' && op !='S');
return(op);
}

Você também pode gostar