Escolar Documentos
Profissional Documentos
Cultura Documentos
2
Reitor
Diógenes Caxin
Isabella de Menezes
3
Autor
4
SILVA, Sidney Verginio da.
258 p.
I. Título.
5
Sumário
META ..........................................................................................................................19
OBJETIVOS DA UNIDADE..............................................................................19
1. INTRODUÇÃO...............................................................................................20
META ..........................................................................................................................37
OBJETIVOS DA UNIDADE..............................................................................37
6
2.1.1. Numérico ................................................................................................40
7
2.8.2. Matrizes ................................................................................................ 121
PRÉ-REQUISITOS............................................................................................. 133
8
3.7.4. Estruturas de Repetição.............................................................. 189
9
10
Caro(a) leitor(a),
11
Claro que não devemos levar isso ao pé da letra, mas o exemplo
acima não é totalmente mentira. Mesmo os grandes softwares e
controles extremamente complexos possuem por trás
poderosos computadores capazes de efetuar diversas
operações por segundos, mas sempre, operações binárias (ou
seja, somente somando e subtraindo 0 e 1).
12
Esta disciplina visa justamente dar a você, aluno, condições de
entender a lógica existente na construção de programas, dando-
lhe condições necessárias para trabalhar com softwares que
exijam conhecimentos em linguagem de programação. Claro
que existem diversas linguagens no mundo, cada uma com sua
aplicação e regras próprias, e seria impossível tratar de todas
elas em um único curso, quanto mais em uma disciplina.
Entretanto, os fundamentos aqui apresentados permitem que
você possa aprender outras linguagens em estudos futuros, pois
embora os comandos e funções sejam diferentes, a lógica na
construção de programas é a mesma.
13
bem-vindos! Tenho certeza que muitos alunos possuem
experiências que podem contribuir enormemente para nossos
estudos.
Albert Einstein
14
EMENTA DA DISCIPLINA
OBJETIVOS GERAIS
15
OBJETIVOS ESPECÍFICOS
16
PALAVRAS-CHAVE:
17
18
UNIDADE I – INTRODUÇÃO
META
OBJETIVOS DA UNIDADE
e saída;
19
3. Visualizar a relação existente entre Algoritmos e
programas de computador;
1. INTRODUÇÃO
20
Antes de tratar sobre formas para escrever programas de
computador, devemos ter em mente que o computador ou
software fará somente o que indicarmos, portanto, é vital que
“digamos” ao computador exatamente o que ele deve fazer para
que o programa execute corretamente a tarefa. Em suma, é
necessário entender primeiramente o que é um Algoritmo para
depois entendermos como ele é importante para a
programação de computadores.
21
Se não estiver, repetir todos os passos. Se estiver no ponto
certo, parar a ação.
Pense:
Exemplo:
Pegar a bala;
22
Com as duas mãos, retirar o papel da bala;
23
Serve como modelo para programas, pois sua linguagem é
intermediária à linguagem humana e às linguagens de
programação, sendo então, uma boa ferramenta na validação
da lógica de tarefas a serem automatizadas.
Realize:
24
Existem diversas definições para o termo Algoritmo. Farrer
(1989) já definia como “[...] um conjunto de comandos, que
obedecidos, resultam numa sucessão finita de ações”. Sant’ana
(2010) define algoritmo como sendo “[...] uma sequência finita de
passos que levam à execução de uma tarefa para solução de
um problema”.
25
1.1. Algoritmos e programas de computador
26
A Figura 1 abaixo apresenta alguns exemplos de se representar
um algoritmo.
27
tanto, ele monitorou a temperatura do paciente em três
momentos, obtendo:
Algoritmo
fimalgoritmo
28
Program ExemploTemperatura;
var temperatura1, temperatura2, temperatura3,
media: real;
begin
write ('Digite a primeira temperatura:');
readln (temperatura1);
double CalculaMedia() {
media = (temperatura1+ temperatura2 +
temperatura3) /3;
return media;
}
}
29
Note que, independentemente da linguagem utilizada para
construir o programa, a construção do primeiro algoritmo foi
base para a criação dos programas nas outras linguagens.
Foram definidos os passos (digitar as 3 temperaturas, somá-las
e então dividir por 3) necessários para resolver o problema
(calcular a média de três temperaturas); uma vez definidos os
passos, podemos implementá-los em qualquer linguagem de
programação.
30
1.2. Estrutura de um algoritmo
Realize
31
dados de entrada? Quais os dados de saída? Qual
processamento foi feito, a partir dos dados de entrada, para se
chegar aos dados de saída?
Algoritmo
{comandos do algoritmo}
fimalgoritmo
32
As palavras Algoritmo e fimalgoritmo são chamadas palavras-
chave. Estas são palavras que possuem funções próprias dentro
de um algoritmo, devendo ser usadas para ações específicas.
Assim, para iniciar um algoritmo você sempre deverá usar a
palavra-chave Algoritmo e ao finalizar seu código, fimalgoritmo.
Veremos mais sobre palavras-chave adiante.
Atenção!
33
A sintaxe consiste em um conjunto de regras formais,
que especificam a composição de programas a partir
de letras, dígitos, e outros símbolos. Por exemplo,
regras de sintaxe podem especificar que cada
parênteses aberto em uma expressão aritmética
deve corresponder a um parêntese fechado, e que
dois comandos quaisquer devem ser separados por
um ponto-e-vírgula. As regras de semântica
especificam o “significado” de qualquer programa,
sintaticamente válido, escrito na linguagem.
(SANT’ANA, 2010, p.80)
Atenção!
34
E esta foi nossa primeira unidade. Vimos o
que são os algoritmos e como é sua estrutura
básica. A partir do que estudamos, você já
pode escrever algoritmos que descrevem
situação reais de seu dia a dia. Devemos sempre lembrar que
um algoritmo deve ser escrito em termos de expressões
simples, claras e objetivas. Um algoritmo pode ser uma
excelente ferramenta para descrever corretamente como
executar determinados passos para se atingir um objetivo.
35
36
UNIDADE II – ALGORITMOS COMPUTACIONAIS
META
OBJETIVOS DA UNIDADE
programação;
37
3. Utilizar os principais tipos de dados e estruturas
próprios algoritmos.
38
mente que informações serão cadastradas, como nome,
telefone, data de aniversário, etc. Ou seja, teremos números
(telefone, data de aniversário) e textos (nome) neste algoritmo,
que deverá ser construído levando em conta esta configuração.
Numérico Números
Fonte: (O autor)
39
2.1.1. Numérico
2.1.2. Literal
40
Obs.: Note que um número apresentado entre aspas será
tratado sempre como um texto. Valores numéricos devem vir
sem aspas.
2.1.3. Lógico
O céu é azul.
O céu é verde.
41
No desenvolvimento de algoritmos, podemos encontrar com
situações parecidas, tais como:
2+3=5
5–1=4
6 + 9 = 20
0–0=1
CONJUNÇÃO (E)
42
proposições deverão ser verdadeiras. Caso ao menos uma seja
falsa, a conjunção será falsa. A representação é:
z=2–1=1
a=5+5=9
43
z e y = VERDADEIRO, pois z = 2 – 1 = 1 (verdadeiro) e y = “São
Paulo é a capital do estado de São Paulo” (verdadeira). Como as
proposições são verdadeiras, a união de ambas resulta em
verdadeiro;
44
Qual o resultado das conjunções abaixo?
DISJUNÇÃO (OU)
45
z ou y = VERDADEIRO, pois z = 2 – 1 = 1 (verdadeiro) ou y = “São
Paulo é a capital do estado de São Paulo” (verdadeira). Como as
proposições são verdadeiras, a união de ambas resulta em
verdadeiro;
46
Qual o resultado das conjunções abaixo?
Negação (NÃO)
Vejamos:
47
não a = VERDADEIRO, pois não a => 5 + 5 não é igual a 9
(estamos negando que 5 + 5 = 9), o que é verdadeiro.
48
Uma vez que definimos os tipos de dados existentes, agora
devemos entender outro importante conceito em programação:
Variáveis e Constantes.
Fonte: http://compumaxinformatica.com.br/produto/Memoria-RAM-DDR-I-
1GB-533Mhz.html
49
A memória RAM é um tipo de memória para armazenamento
rápido e temporário de dados pelo computador. Nela são
armazenados dados que são utilizados pelos programas em
execução. Ela é volátil, pois ao desligar o computador ou
encerrar o programa, os dados que estavam armazenados são
apagados. Bom, mas o que isso tem a ver?!
50
esquema abaixo representa a memória RAM do computador
para executar este cálculo:
Algoritmo
declare X, Y, Z: numerico;
{desenvolvimento do algoritmo
Fimalgoritmo
51
No exemplo acima, estamos “declarando” (reservando espaço
em memória) 3 variáveis que irão receber apenas números. Ao
longo do programa, criaremos comandos para atribuir valores a
estas variáveis que então passarão a ocupar, com algum valor
numérico, espaço na memória do computador.
52
2.2.1. Declaração
53
Veja um exemplo:
54
Não fazer uso de palavras-chaves, ou seja, palavras que
possuem um significado próprio no algoritmo. Algumas
palavras-chaves (ou palavras reservadas) são: algoritmo,
fimalgoritmo, declare, leia, escreva, se, então, senão,
numérico, literal, lógico, repita, fim repita, interrompa.
55
Exercícios
NOTA literal =
CONFERE logico =
NOTA numerico =
ENDERECO literal =
RUA numerico =
NOME literal =
56
3) Identifique agora se identificadores abaixo são válidos ou
não. Justifique os que você considerar inválidos.
X1E1 =
ENDEREÇO =
RUA =
NOME_FUNCIONÁRIO =
nome_aluno =
_90 =
E:1 =
2/SEMESTRE =
ANO(2012) =
LEIA_NOME =
57
4) Complete a tabela a seguir:
a) 21
b) "VERDE"
c) "FALSO"
d) “0,21 * 102”
e) VERDADEIRO
f) - 3,54
58
6) Supondo-se que as variáveis NOME , PROFISSAO, IDADE e
SALARIO serão utilizadas em um algoritmo, para armazenar
respectivamente, o nome, a profissão, a idade e o salário de
uma pessoa, escreva o conjunto de declarações necessário
para criar essas variáveis (SANT'ANA, 2010).
( ) DECLARE
( ) X&Z
( ) ALGORITMO
( ) X123
( ) XY
( ) guarda_chuva
( ) ABC DE
( ) ETC.
( ) FIMALGORITMO
59
2.3. Comentários
Algoritmo
declare NUM1, //primeiro número a ser somado
NUM2, //segundo número a ser somado}
SOMA {soma dos dois números} numérico;
{ler os números}
{calcular sua soma}
{escrever a soma}
fimalgoritmo
60
Todos os valores entre chaves são comentários do algoritmo.
61
Atenção
Forma de Atribuição:
A literal;
CONFERE logico;
Resulta em:
X Y Z A CONFERE
62
variáveis, devemos efetuar o comando de atribuição, da
seguinte forma:
X 29
Y X+1;
Z X+Y;
A “Algoritmo”;
Confere Verdadeiro;
63
Lembre-se:
X X + 1;
64
Vejamos outro exemplo prático:
Algoritmo
declare X, Y, Z numérico;
A, B, C literal;
L, M lógico;
X 23.45;
A “TESTE”;
L Falso;
Y X + 2;
Z X + Y;
M L ou (Y > X);
C “BEM”;
B A;
B “A”;
X Z;
fimalgoritmo
65
Como uma variável armazena apenas um valor de um único
tipo, a atribuição
X “TESTE”
66
LEIA
Algoritmo
declare A, B {dois números quaisquer}
SOMA numerico; {soma dos dois números}
leia (A);
leia (B);
SOMA A + B;
{escreva a resposta}
fimalgoritmo
67
ESCREVA
Algoritmo
declare A, B {dois números quaisquer}
SOMA numerico; {soma dos dois números}
leia (A);
leia (B);
SOMA A + B;
escreva (SOMA);{escreva a resposta}
fimalgoritmo
68
Como dito anteriormente, ao encontrar o comando leia o
computador para a execução do algoritmo e aguarda que
valores sejam digitados para A e B. Assim, o usuário que está
usando o programa escrito a partir do algoritmo, não saberá que
o computador está aguardando, não sabendo o que digitar. Da
mesma forma ocorre durante a saída da resposta. Será
mostrado um número sem identificação. Para tanto, é
importante, sempre antes de cada comando leia ou escreva
utilizar frases que instruam ao usuário o que fazer em
determinado momento do algoritmo.
56
11
69
Podemos melhorar o algoritmo anterior reescrevendo-o da
seguinte forma:
70
Bem melhor, não?!
Revendo
Realize.
71
Note que a sintaxe do Visualg difere um pouco da sintaxe que
usamos até o momento neste guia. Entretanto, aprender a
estrutura do Visualg não será difícil para você, que deverá
apenas fazer pequenos ajustes entre o algoritmo escrito e o
algoritmo trabalhado no Visualg.
72
Realize
73
As constantes e/ou variáveis podem ser de qualquer tipo
(numérico, lógico ou literal), mas devem obedecer à
compatibilidade, ou seja, em uma expressão devemos ter
operadores e operandos de um único tipo. Portanto, em um
algoritmo, teremos sempre expressões numéricas OU literais OU
lógicas; nunca os três tipos em uma única expressão.
74
2.6.1. Expressões aritméticas
75
Tabela 6: Expressões Aritméticas
76
2) As expressões aritméticas possuem ordem de
A 5 + 3 * 2 {resulta em 16}
A (5+3) * 1 {resulta em 8}
77
Veja que o uso de parênteses altera o resultado da expressão.
A – B x (C+D) / ( (E-1) – F) + G
78
variáveis do tipo lógico (FARRER, 1989). A Tabela abaixo
apresenta os tipos de operadores existentes:
79
Portanto, uma expressão de relação (lógica) é uma comparação
realizada entre dois valores do mesmo tipo básico. Estes valores
são representados por constantes, variáveis ou expressões
aritméticas. Vejamos alguns exemplos:
Dadas as variáveis:
Algoritmo
declare A, B, SOMA numerico;
NOME literal;
80
escreva (“Digite um nome para CLIENTE: ”);
leia (NOME);
SOMA A + B ;
81
Note que este algoritmo possui um alinhamento dos
comandos; os comandos dentro da estrutura
algoritmo – fimalgoritmo possuem um
deslocamento maior a partir da margem da página. A isso
chamamos de indentação. Pesquise o que significa esse termo
e qual sua importância. Dê exemplos de programas bem
indentados e mal indentados.
82
código várias vezes? Para isso usamos as estruturas de controle
que veremos a seguir.
2.7.1. Sequência
Algoritmo
declare {variáveis}
comando 1;
comando 2;
.
.
comando n;
fimalgoritmo
83
Entretanto, em várias ocasiões precisamos que um determinado
comando seja executado mais de uma vez, ou então, seja
“pulado” para o próximo comando:
Algoritmo
declare {variáveis}
comando 1;
comando 2;
comando 3;
comando 4;
comando 5;
.
.
comando n;
fimalgoritmo
84
2.7.2. Estrutura Condicional
se [condição]
entao [comando ou]
[bloco de comandos]
fimse
85
Para cada se corresponde um único então e um
único fimse.
86
Vejamos:
Algoritmo
declare DIVISOR,RESULT, DIVIDENDO real;
DIVIDENDO = 10
escreva (“Digite um Número para o Divisor: ”);
leia (DIVISOR);
se (DIVISOR > 0)
então RESULT = DIVIDENDO / DIVISOR;
escreva (“O Resultado é: ”, RESULT);
fimse
se (DIVISOR <= 0)
então escreva (“Não é possível dividir por
0”);
fimse
87
armazenado na variável RESULT. Daí então é escrito na tela o
resultado do cálculo – o valor da variável RESULT.
88
de comandos. Ela permite executar um comando (ou uma
sequência de comandos) se a condição é verdadeira. Se a
condição for falsa, são executados outros blocos de comandos.
se [condição]
entao [comando ou]
[bloco de comandos]
senao [comando ou]
[bloco de comandos]
fimse
onde:
89
Algoritmo
declare NOTA1,NOTA2, MEDIA numerico;
MEDIA = (NOTA1+NOTA2)/2
Como funciona?
90
então, escrevendo que o aluno está reprovado. Note que não há
como o algoritmo “fugir” desta condição. Se a média for maior
ou igual que 60 pontos, é executada uma ação. Caso a média
seja menor a 60 pontos, é executada outra ação complementar.
Algoritmo
.
.
se A2 <= B3
então TESTE <- verdadeiro
senao TESTE <- falso
fimse
C <- TESTE
.
.
fimalgoritmo
91
1) (FARRER, 1989) Ao fim da execução do algoritmo, o valor
armazenado em C será FALSO se:
A. ( ) A2 < B3
B. ( ) A2 <= B3
C. ( ) A2 >= B3
D. ( ) A2 > B3
E. ( ) A2 = B3
92
2.7.3. Estrutura de Repetição
Algoritmo
declare N1, N2, MEDIA numerico;
NOMEALUNO literal;
leia NOMEALUNO;
leia N1;
leia N2;
MEDIA <- (N1+N2)/2;
escreva (NOMEALUNO, MEDIA);
fimalgoritmo
93
Pois bem, o que fazer caso seja necessário efetuar este
algoritmo para dois alunos? Duplicar os comandos? Vejamos:
Algoritmo
declare N1, N2, MEDIA numerico;
NOMEALUNO literal;
NOTA1, NOTA2, MEDIA2 numerico;
NOMEALUNO2 literal;
leia NOMEALUNO;
leia N1;
leia N2;
MEDIA <- (N1+N2)/2;
escreva (NOMEALUNO, MEDIA);
leia NOMEALUNO2;
leia NOTA1;
leia NOTA2;
MEDIA2 <- (N1+N2)/2;
escreva (NOMEALUNO2, MEDIA2);
fimalgoritmo
fimalgoritmo
94
alunos, o algoritmo teria uma estrutura enorme, concorda? Por
isso usamos os comandos de repetição.
Interrupção no Início
95
Estrutura:
repita
se [condição]
então interrompa;
fimse
[comando ou]
[bloco de comandos]
fimrepita
96
Veja como ficaria o algoritmo reescrito:
Algoritmo
declare N1, N2, MEDIA, CONTADOR real;
NOMEALUNO literal;
{Inicializando o valor de contador}
CONTADOR <- 1;
repita
se (CONTADOR > 100)
entao interrompa;
fimse
leia (NOMEALUNO, N1, N2);
MEDIA <- (N1+N2)/2;
escreva (NOMEALUNO, MEDIA);
{Incrementa o contador}
CONTADOR <- CONTADOR+1;
fimrepita
fimalgoritmo
97
interrompido quando a variável possui valor 101. Neste caso,
como ela possui valor maior que 100, o teste resulta em
VERDADEIRO e o comando entao interrompa é executado,
encerrando a repetição.
Vejamos:
Algoritmo
declare SOMA, NUM, CONTADOR real;
{Inicializando valores}
CONTADOR <- 1;
SOMA <- 0;
98
repita
se (CONTADOR > 5)
então interrompa;
fimse
escreva (“Digite um número:” );
leia (NUM);
SOMA <- SOMA + NUM;
{Incrementa o contador}
CONTADOR <- CONTADOR+1;
fimrepita
escreva (“Soma:”, SOMA);
fimalgoritmo
99
Vejamos outro exemplo, unindo agora a definição de contadores
e somadores:
Algoritmo
declare MAIOR, NUM, SOMA, CONTADOR real;
{Inicializando valores}
CONTADOR <- 1;
MAIOR <- 0;
SOMA <- 0;
repita
se (CONTADOR > 5)
entao interrompa;
fimse
escreva (“Digite um número:” );
leia (NUM);
se (NUM > 5)
entao MAIOR <- MAIOR + 1;
fimse
CONTADOR <- CONTADOR+1;
fimrepita
escreval (“Quantidade de números lidos:”,
CONTADOR-1);
escreval (“Quantidade de números maiores que 5”,
MAIOR);
fimalgoritmo
100
Tabela 9: Valores durante a execução do algoritmo
Interrupção no Meio
101
Forma geral:
repita
[comando ou]
[bloco de comandos]
se [condição]
então interrompa;
fimse
[comando ou]
[bloco de comandos]
fimrepita
102
Vejamos:
Algoritmo
declare N1, N2, MEDIA numerico;
{não precisamos mais da variável CONTADOR}
NOMEALUNO literal;
repita
leia (NOMEALUNO);
se (NOMEALUNO = “CANCELAR”)
entao interrompa;
fimse
leia (N1, N2);
MEDIA <-(N1+N2)/2;
escreva (NOMEALUNO, MEDIA);
fimrepita
fimalgoritmo
103
cálculo da média. Estes comandos são executados até que
você digite a palavra “CANCELAR”. Ao ler esta palavra, o
comando SE retorna o valor VERDADEIRO (pois é igual a
Cancelar), desviando, assim, o fluxo para o comando entao
interrompa e para o fim da estrutura de repetição. Veja que esta
estrutura pode ser repetida n vezes, até que alguém digite o
valor “Cancelar”.
Interrupção no Fim
104
Veja a sintaxe deste comando:
repita
[comando ou]
[bloco de comandos]
se [condição]
entao interrompa;
fimse
ate fimrepita
Algoritmo
declare N1, N2, MEDIA real;
{não precisamos mais da variável CONTADOR}
NOMEALUNO, OPCAO literal;
repita
escreva (“Digite o nome do aluno: ”);
leia (NOMEALUNO);
escreval (“Digite as notas semestrais do
aluno: ”);
leia N1;
leia N2;
MEDIA <-(N1+N2)/2;
escreval (NOMEALUNO, MEDIA);
105
escreval (“ “);
escreval (“Deseja repetir para outro aluno?
Sim/Nao ”);
leia (OPCAO);
se ( (OPCAO = “NAO”) ou (OPCAO = “nao”) )
entao interrompa;
fimse
fimrepita
Outro exemplo:
Algoritmo
declare NUMERO numerico;
NUMERO <- 0;
repita
escreva (NUMERO);
NUMERO <- NUMERO + 1;
se (NUMERO > 100)
então interrompa;
106
fimse
fimrepita
fimalgoritmo
se 1);
107
Esta sequência é executada até que o valor de NUMERO
108
Algoritmo
declare NUMERO numerico;
NUMERO <- 0;
enquanto (NUMERO <= 100) faca;
escreva (NUMERO);
NUMERO <- NUMERO + 1;
fimenquanto
fimalgoritmo
109
predeterminado. Geralmente é utilizado quando sabemos
exatamente a quantidade de repetições dos comandos.
Sintaxe:
110
Algoritmo
declare NUMERO numerico;
para NUMERO de 0 ate 100 passo 1 faca
escreva (NUMERO);
fimpara
fimalgoritmo
111
Revendo
112
Vamos realizar alguns exercícios para revisão.
113
2.8. Estruturas de dados
2.8.1. Vetores
Sintaxe:
114
declare NOME_VARIAVEL: vetor [LI .. LF] de tipo;
115
Visualmente:
NOME
NOME
116
De forma similar, os comandos abaixo:
Resultariam em:
NOME
117
O resultado na tela seria:
Jéssica
Maria
Algoritmo
declare TOTAL: real;
NOTAS: vetor [1..5] de real;
escreval (“Digite a Nota 1 do aluno: ”);
118
leia (NOTAS[1]);
escreval (“Digite a Nota 2 do aluno: ”);
leia (NOTAS[2]);
escreval (“Digite a Nota 3 do aluno: ”);
leia (NOTAS[3]);
escreval (“Digite a Nota 4 do aluno: ”);
leia (NOTAS[4]);
escreval (“Digite a Nota 5 do aluno: ”);
leia (NOTAS[5]);
119
Utilizando estruturas de repetição com vetores.
Algoritmo
declare TOTAL, CONTADOR inteiro;
NOTAS : vetor [1..5] de inteiro;
CONTADOR <-1;
TOTAL <- 0;
{a variável contador será responsável pelo índice do
vetor}
120
Implemente este algoritmo no Visualg. Altere a
contagem da repetição para 6 e veja o que acontece
na execução do programa.
2.8.2. Matrizes
121
NOME_VARIAVEL é o nome que será dado à sua variável
heterogênea (matriz);
[LI1 .. LF1, LI2 .. LF2]: LI1 é o limite inferior e LF1 o limite superior
(final), LI2 é o limite inferior e LF2 o limite superior (final).
122
nome “Sidney”? Ora, na linha 2 e coluna 1, em outras palavras, 2
x 1 (não entenda o x como multiplicação). Da mesma forma, o
nome Paula está na posição 1 x 1 (linha 1, coluna 1). Portanto,
esta tabela possui as posições:
123
Veja que cada campo é referenciado por um índice, composto
pelo número da linha e da coluna que o dado ocupa na
estrutura. Portanto, ao referenciar dados em uma matriz,
usamos sempre a notação NOME_DA_VARIAVEL
[linha:coluna].
124
Resultando em:
Algoritmo
declare MATRIZ: vetor [1..4,1..2]de literal;
leia (MATRIZ[1,1]);
leia (MATRIZ[1,2]);
leia (MATRIZ[2,1]);
leia (MATRIZ[2,2]);
leia (MATRIZ[3,1]);
125
leia (MATRIZ[3,2]);
leia (MATRIZ[4,1]);
leia (MATRIZ[4,2]);
126
Veja que a primeira estrutura de repetição inicia a contagem do
número de linhas, já a segunda estrutura logo em seguida inicia
a contagem do número de colunas. Assim, antes do comando
escreva (“Digite um número”), os contadores estão na posição
1:1 (linha 1 e coluna 1). Logo após o usuário terminar a
digitação do número, o comando para incrementa somente a
variável coluna; assim, os contadores passam a ter o valor 1:2
(linha 1 e coluna 2). Daí então é lido o segundo número. Como
127
a variável coluna chegou ao limite do comando para (2), a
estrutura de repetição é encerrada e volta ao primeiro comando
para, que agora, incrementa a variável linha, que passa a ter o
valor 2. Novamente, a segunda estrutura de repetição é iniciada,
e os contadores passam a ter o valor 2:1. A segunda estrutura lê
os números para esta posição e para a posição 2:2. Ao final,
como a variável coluna chegou a seu limite, a estrutura é
encerrada. Mas agora a variável linha também chegou ao limite
do comando para (2), portanto, esta estrutura também é
encerrada, passando para o próximo comando – escreval
(“Escrita da Matriz”). Note que o segundo bloco, para escrita
dos números da matriz, funciona de forma similar à leitura dos
números.
Exercícios
128
2) Escreva um algoritmo que leia 20 números inteiros, calcule
e mostre a soma dos mesmos. Mostre também quantos
destes números são pares e quantos são ímpares.
Implemente também no Visualg.
129
Chegamos ao final de nossa segunda unidade,
querido aluno. Vimos que os algoritmos são
importantes ferramentas para a elaboração de
programas de computador. Aprendemos como é a estrutura de
um algoritmo, os dados utilizados e as principais operações que
podemos realizar. Tudo isso é de grande importância para
entendermos como construir programas de computador
utilizando efetivas linguagens de programação.
130
131
UNIDADE III – A LINGUAGEM DE
PROGRAMAÇÃO C
META
OBJETIVOS DA UNIDADE
execução de um programa;
132
3. Solucionar os problemas e exercícios propostos
neste capítulo;
PRÉ-REQUISITOS
3. INTRODUÇÃO À LINGUAGEM C
133
linguagem de algoritmo. Uma vez escrito o algoritmo, podemos
“traduzi-lo” para qualquer linguagem de programação. É isso
que trataremos nesta unidade: a escrita de programas utilizando
a linguagem C.
134
As linguagens de programação possuem conjuntos de símbolos
e regras de sintaxe que permitem a construção de comandos
que descrevem de forma precisa ações compreensíveis e
executáveis para o computador.
135
computadores só podem executar algoritmos expressos em
linguagem de máquina¸ que são um conjunto de instruções
capazes de ativar diretamente os dispositivos eletrônicos do
computador, fazendo com que este realize as operações
necessárias para atingir o objetivo final do programa (FARRER,
1989).
de máquina;
136
alternativa entre a comunicação ser humano x computador
(FARRER, 1989). Assim como em algoritmos, uma linguagem de
programação possui suas próprias regras de sintaxe e
semântica.
137
Por mais avançados que sejam, os computadores são capazes
de executar somente programas em Linguagem de Máquina, ou
seja, executam instruções utilizando circuitos elétricos e
comandos binários (0 e 1). Entretanto, a maioria dos programas
são construídos em linguagens de alto nível, legíveis ao ser
humano, como Delphi, C#, Java.
138
Primeiro o computador traduz o código-fonte para o código-
objeto. Isso acontece em tempo de execução, caso a linguagem
use um interpretador (traduz e executa uma instrução por vez).
Caso a linguagem utilize um compilador, as instruções são
traduzidas antes que se inicie a execução do programa
(FARRER, 1989).
humano.
139
não estão necessariamente definidas no mesmo arquivo que o
rotinas.
140
vezes um programador precisa entender o programa após certo
141
interação entre eles permita a resolução do problema de forma
quesito.
142
Standards Institute – ANSI, criou um comitê para padronização
da linguagem C, chegando assim a uma obra que abrangia um
padrão de forma da linguagem C. (SCHILDT, 1997)
143
Note que dentro da função main encontra-se o corpo principal
do programa. A função main deve existir em todo programa C,
pois é a partir dela que o programa em C começa a ser
executado.
barras invertidas: //
144
Comentários com mais de uma linha devem ser
Exemplo:
// isto é um comentário
145
3.3. Tipos de Dados
146
Tabela 10: Tipos de dados e valores suportados
147
As palavras signed e unsigned são chamados modificadores,
pois modificam o tipo básico do dado. O uso do modificador
signed faz com que o tipo aceite apenas valores positivos, já
unsigned aceita valores positivos e negativos. O uso de cada
tipo varia de acordo com a necessidade do programa,
entretanto, é interessante definir o mais exatamente possível o
tipo de dado para otimizar a execução do programa e o uso de
memória RAM do computador.
VARIÁVEIS
148
O uso de identificadores em C possui 3 importantes
características:
de 31 serão ignorados;
C;
tipo lista_de_variaveis;
Alguns exemplos:
int a, b, x;
149
short int Numero, numero;
double Preco;
Variável Local
Veja:
void divisao ()
{
int a, b;
double resultado;
}
150
Caso tentemos atribuir um valor às variáveis a, b ou resultado
em outro trecho do código, teríamos um erro de execução, pois
o programa só “enxerga” estas variáveis dentro deste bloco.
Parâmetro Formal
/* Parâmetro formal */
#include <stdio.h>
void EscreveCaracter (char c)
{
putchar (c);
}
main ()
{
EscreveCaracter ('a');
}
151
em outra parte do programa. Veremos isso com mais detalhes
adiante. O comando putchar escreve um caractere na tela.
Variáveis Globais
/* Variável global */
#include <stdio.h>
152
melhor organização e estruturação de programas em C.
Veremos mais a respeito de funções nas páginas seguintes.
CONSTANTES
Como diz o nome, são variáveis que não podem ter seu valor
modificado durante a execução do programa. O valor inicial
deve ser atribuído no momento da inicialização (declaração) da
variável.
Sintaxe:
Veja o exemplo:
/* Constante */
#include <stdio.h>
153
const int valor = 10; /* Declaração da constante
*/
main ()
{
c = valor/10;
print (c); /*comando para escrever valores
numéricos*/
}
( ) Valor
( ) Salario-Liquido
( ) B248
( ) X2_( )
( ) Nota Aluno
154
( ) A1B2C3
()3x4
( ) KM/H
( ) NomeDaEmpresa
( ) Sala215
155
3.5. Operadores
156
É possível realizar atribuições múltiplas na linguagem C,
atribuindo o mesmo valor a muitas variáveis utilizando apenas
uma linha de comando:
x = y = z = a = 0;
157
Alguns exemplos:
int A, B;
A = 5;
B = 2;
x = 10;
y = ++ x;
x = 10;
y = x++;
158
O fato é que no primeiro exemplo, o operador de incremento
(++) foi atribuído antes da variável x, portanto, o programa
aumenta em 1 o valor de x e só depois atribui a y. No segundo
caso ocorre o contrário, primeiro o valor de x (10) é atribuído a y
e somente depois o valor de x é incrementado.
159
Para alterar a ordem de execução de uma operação, devemos
utilizar parênteses, tal como vimos em algoritmos:
int A, B;
A = 5;
B = 2;
X + = 10
é o mesmo que X = X + 10
160
3.5.3. Operadores Lógicos e Relacionais
161
Tabela 14: Operadores Lógicos
Relembrando...
a) ++ x – z
c) x / y
d) x % y
162
e) X + Y
f) 5*x + z - (y/y) + x
g) x > x
h) z != x
i) ! ( y == z)
163
/* Exemplo - Programa que lê caracteres e os escreve na
tela em maiúsculo ou minúsculo */
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
main (void)
{
char ch;
printf ("Entre com algum texto - Digite um
ponto para sair. \n");
do{
ch = getchar();
if (islower(ch))
ch = toupper (ch);
else ch = tolower (ch);
putchar (ch);
} while (ch!= '.');
}
164
na tela através do comando putchar(). O programa só é
encerrado quando o usuário digita um ponto.
165
ch = getch();
if (islower(ch))
ch = toupper (ch);
else ch = tolower (ch);
putchar (ch);
} while (ch!= '.');
}
STRINGS
166
Vejamos:
main ()
{
char nome[20];
puts ("\n Escreva seu nome:"); /* \n pulo uma
linha */
gets (nome);
printf ("Oi, %s", nome);
getch();
}
167
Printf()
168
Portanto, imagine que num determinado programa você tenha
uma variável X do tipo double com valor 10,546454. Pode-se
escrevê-la de vários formatos, variando apenas o formato
desejado através do comando printf():
169
123.23
3.23
Oi
1234567
170
Já o formato "%5.7s" indica que a string deve ser
171
A saída deste programa será:
Scanf()
172
Tabela 16: Especificadores de formato de scanf()
173
printf ("\nDigite a idade: ");
scanf ("%d", &idade);
printf ("\n\n%s, você tem %d anos.\n", nome,
idade);
getch();
}
esvaziado;
174
uma variável do tipo string, informar um campo a
175
conteúdo:
getch() :
getchar() :
putchar():
getche():
gets() :
puts():
176
3) Escreva um programa em C para apresentar os valores
abaixo:
Inteiro = 10
Caractere = A
Float = 99.99
String = Linguagem C
int x, y , z;
x=y=10;
z= ++x;
y++;
x = x + y -(z--);
177
5) Implemente o programa abaixo. Explique com suas
palavras o funcionamento deste programa em C.
#include <stdio.h>
#include <conio.h>
main(void)
{
int i, j;
printf("\nEntre com dois números inteiros: ");
scanf("%d%d", &i, &j);
printf("\n%d == %d eh %d\n", i, j, i==j);
printf("\n%d != %d eh %d\n", i, j, i!=j);
printf("\n%d <= %d eh %d\n", i, j, i<=j);
printf("\n%d >= %d eh %d\n", i, j, i>=j);
printf("\n%d < %d eh %d\n", i, j, i<j);
printf("\n%d > %d eh %d\n", i, j, i>j);
getch();
}
178
6) As expressões abaixo são falsas ou verdadeiras? Após
isso, implemente estas expressões em um programa e
confira o resultado.
((10>5) || (5>10))
#include <stdio.h>
#include <conio.h>
main (void)
f = num/4;
179
printf ("%f",f);
getch();
if (expressão) comando;
else comando;
180
if e else são palavras-chave e comando é um comando ou
bloco de comandos (entre chaves { }). A expressão será avaliada
como Falsa (se retornar 0) ou Verdadeira (retorno diferente de
0). Caso a expressão seja Verdadeira, os comandos são
executados. Caso contrário, os comandos são ignorados ou
então se executa os comandos dentro após o else. Este
comando else é opcional.
main (void)
{
int num;
printf ("Digite um numero entre 0 e 10: ");
scanf ("%d",&num);
181
No programa acima, após digitar um número qualquer, o
comando if(num==10) verifica se o número digitado pelo
usuário é igual a 10. Caso seja, o bloco de comandos logo após
é executado, daí então são mostradas na tela duas mensagens.
Caso o número seja diferente de 10, o comando if desvia o fluxo
automaticamente para o comando else, que executa o
comando printf, exibindo a mensagem de erro na tela.
if (i)
{
if (j) comando 1;
if (k) commando 2; /* este if está associado ao
else logo abaixo */
else commando 3 /* este else está associado ao
if do comando 2 */
}
182
else comando 4 /* este else está associado ao if
(i) */
O último else não está associado ao if (j), pois este não está no
mesmo bloco, ao contrário, está associado ao if (i) que está fora
do bloco e é o mais próximo. O else dentro do bloco está
associado ao if (k) que é o if mais próximo.
183
else
{
printf (“\n Você errou!”);
if (num > 5)
printf ("\n O número digitado é muito
alto");
else
printf ("\n O número digitado é muito
baixo");
getch();
}
184
Como dito, é possível criar vários comandos if-else dentro de
uma estrutura if-else. As condições são sempre avaliadas de
cima para baixo. Tão logo uma condição verdadeira seja
encontrada, os comandos associados a ela são executados e
todo o fluxo é desviado para fora. Caso nenhum teste resulte em
verdadeiro, o último comando else é executado. Veja:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
main (void)
{
int magic; // número mágico
int palpite; // palpite do usuário
if (palpite == magic)
{
printf("**** Voce acertou!! ***");
printf("%d é o número magico!",
magic);
}
else
if (palpite > magic)
printf ("Errado, palpite muito alto!");
else
printf ("Errado, palpite muito baixo!");
185
}
switch (expressão){
case (valor 1):
sequência de comandos;
case (valor 1):
sequência de comandos;
.
186
.
.
default:
sequência de comandos;
Um exemplo prático:
switch (numero){
case 1:
printf("\n%s", "Numero digitado --> UM.");
break;
case 2:
printf("\n%s", "Numero digitado --> DOIS.");
break;
case 3:
printf("\n%s", "Numero digitado --> TRES.");
break;
case 4:
printf("\n%s", "Numero digitado -->
QUATRO.");
break;
case 5:
printf("\n%s", "Numero digitado --> CINCO.");
break;
187
default:
puts("\nVoce nao digitou nenhum valor entre 1
e 5.");
}
puts ("\n\nTecle algo para sair..");
getch();
}
case 2 = falso;
case 3 = falso;
case 4 = falso;
188
Caso o usuário digite 0, todos os testes acima são feitos. Como
todos retornam FALSO, o programa executa então os comandos
contidos após o comando default. Em verdade, default
funciona como um “escape”, pois geralmente colocamos junto a
ele comandos que devem ser executados caso nenhuma
condição seja atendida.
O laço for
189
relacional que determina quando a repetição cessará;
incremento define como a variável contadora será alterada a
cada repetição da estrutura. Logo em seguida, temos os
comandos que devem ser executados na repetição.
#include <stdio.h>
#include <conio.h>
main (void)
{
int x;
for (x=1; x<=1000; x++)
printf (“%d ”, x);
getch();
}
#include <stdio.h>
#include <conio.h>
main (void)
{
int x, z;
for (x=100; x !=65 ; x = x- 5)
{
z = x * x;
printf(“O quadrado de %d eh %d”, x,z);
}
getch();
}
190
Veja que neste laço ocorre o contrário do primeiro laço: aqui, a
variável x é inicializada com 100, e decrementada de 5 em 5 até
que atinja o valor 65. A cada repetição, é escrito o quadrado do
valor atual de x na repetição. Implemente no Dec-C++ e veja o
resultado.
x=10;
for (y=10; y != x; ++y)
printf(“%d”, y);
printf (“%d ”, y); // apenas este comando será
executado
}
O laço while
191
vezes, ao passo que na estrutura while, esta repetição pode ser
interrompida a qualquer momento. Sua sintaxe é:
while (condição)
comandos;
192
O programa acima lê uma tecla digitada pelo usuário e exibe
uma mensagem até que o usuário digite a tecla “f”, quando
finalmente é exibida a mensagem “Fim”.
O laço do-while
do {
comando ;
} while (condição);
193
/* Exemplo de repeticao do-while */
#include <stdio.h>
#include <conio.h>
main (void)
int i = 1;
do {
i++;
getch();
194
3.7.5. Outros comandos de controle de fluxo
Comando return
Sintaxe:
return expressão;
195
/* Exemplo de desvio usando return */
#include <stdio.h>
#include <conio.h>
int menos (int a, int b)
{
return (a - b);
}
main (void)
{
int x, y;
puts ("\nDigite dois inteiros separados por
espaco: ");
scanf ("%d%d", &x, &y);
printf ("%d menos %d e' igual a %d\n\n", x, y,
menos (x, y));
getch();
}
Comando break
196
/* Exemplo de desvio usando comando break */
#include <stdio.h>
#include <conio.h>
main ()
{
int t = 1;
for (;;)
/* aqui não declaramos nenhuma condição para o laço
for. Isso faria com que o laço executasse
indefinidamente */
{
if (t > 100)
break;
printf ("%4d", t++);
}
getch();
}
197
Comando continue
198
Este programa solicita que o usuário digite um nome completo.
Este nome é armazenado numa variável chamada s. Logo
depois, o comando for escreve este nome – usamos o comando
for, pois cada letra é uma posição da variável s –, tal como os
vetores que vimos em algoritmos. No entanto, caso a estrutura
encontre no nome um espaço em branco, este será. O uso do
comando continue força o laço a ir para o próximo passo,
“pulando”, assim, a escrita do espaço. Implemente este
programa e veja o resultado.
199
entre 5 e 7, significa “M”. Acima de 7 até 10 o tamanho será G.
Desenvolva este programa na linguagem usando a estrutura de
seleção composta (switch).
3.8. Modularização
200
específicas. Imagine, por exemplo, um programa que calcule o
reajuste de um funcionário. Para cada salário digitado você
deveria escrever os comandos que efetuam o cálculo:
#include <stdio.h>
#include <conio.h>
main (void)
{
float salario, novoSalario;
char opcao;
201
novoSalario = salario + (salario *
0.1);
printf ("\n\nNovo salario: %3.2f",
novoSalario);
}
else printf ("\n\nFim do programa");
}
3.8.1. Funções
202
particular e agrupadas numa unidade com um nome para
referenciá-la” (MIZRAHI, 2008).
203
resultado, deve-se desenhar uma linha. Vejamos como
implementar este programa usando funções:
//Exemplo de função
#include <stdio.h>
#include <conio.h>
void linha ( )
{
int cont;
for (cont = 0; cont <=50; cont ++)
printf ("%s", "-");
}
main (void)
{
int resultado, num_lido;
printf("Digite um numero qualquer: ");
scanf("%d", &num_lido);
linha ();
resultado = quadrado (num_lido);
printf ("\n O quadrado do numero lido e: %d",
resultado);
getch();
}
204
Implemente este programa no Dev-C++ e veja o
resultado. Note que podemos incluir as funções
em qualquer momento. Faça um teste: inclua a
função linha() antes do comando getch() e veja o que acontece!
205
3.8.2. Passagem de valores para funções
206
Por uma questão de otimização de código,
estruturação do programa e até mesmo economia
de memória, é importante tentar sempre utilizar
blocos de comandos com variáveis locais. Isso evita que
variáveis que talvez nem sejam utilizadas ocupem um endereço
de memória. Programadores experientes dividem seus
programas em vários módulos ou blocos e criam uma
verdadeira documentação dos mesmos. Isso permite utilizar
estes blocos em desenvolvimento de programas futuros.
207
3.9. Estruturas de Dados
Relembre!
208
Sintaxe:
main ()
{
int NOTAS[5];
}
Importante!!!
209
NOTAS
NOTAS [0];
NOTAS [1];
NOTAS [2];
NOTAS [3];
NOTAS [4];
210
Neste exemplo, usamos um laço de repetição para atribuir
valores ao vetor. Note que o valor inicial de índice é 100 e
atribuímos este valor à posição 99 do vetor (Indice-1), pois a
posição 100 do vetor não existe. Ao chegar ao valor 1, a posição
do vetor é 0 (Vetor[índice-1] é o mesmo que Vetor[0]). Então, é
atribuída a esta posição o número 1.
Strings
211
do que o necessário para o programa. Por exemplo, para uma
palavra de 10 posições, devemos declará-la com 11 posições.
212
O correto seria:
main (void)
{
char nome1[40], nome2[40];
printf ("\nDigite um nome : ");
fgets (nome1, 39, stdin);
213
puts ("\n\n**** TESTE DA FUNCAO strcat ");
strcat (nome1, nome2);
printf ("Nomes concatenados : %s ", nome1);
214
3.9.2. Matrizes Bidimensionais
215
for (IndiceL = 0; IndiceL < 3; IndiceL++)
for (IndiceC = 0; IndiceC < 4; IndiceC++)
printf ("%4d", Matriz [IndiceL][IndiceC]);
getch ();
}
3.9.3. Estruturas
216
nome. A isso chamamos de Estruturas ou Registros. Uma
Estrutura possui elementos logicamente relacionados, porém,
de diferentes tipos, aumentando, assim, as possibilidades para
armazenamento de dados no programa.
Sua sintaxe é:
struct nome {
tipo nome_da_variavel;
tipo nome_da_variavel;
tipo nome_da_variavel;
...
} variaveis_estruturas;
onde:
struct endereco
{
char nome [20];
char rua [40];
char cidade [20];
char estado[2];
217
signed int CEP [8];
};
218
struct endereco
{
char nome [20];
char rua [40];
char cidade [20];
char estado[2];
signed int CEP [8];
}; Endereco_clientes; Endereco_Fornecedores;
219
Endereco_clientes.CEP = 37010540;
gets (Endereco_clientes.nome);
gets (Endereco_clientes.rua);
scanf (%d, Endereco_clientes.CEP);
220
armazenada uma estrutura contendo todos os dados definidos
na estrutura endereco. Para acessar um estrutura específica,
deve-se indexar o nome da estrutura. Por exemplo, para se
imprimir o código de CEP da estrutura 3:
221
2) Escreva um programa que crie uma matriz 3 x 3 e atribua o
número 3 a todas as posições das diagonais desta matriz.
222
3.10. Operações com Arquivos na Linguagem C
223
3.10.1. Definições
FILE *arq;
224
3.10.2. Formas de acesso
FILE *arquivo;
fopen(nome_do_arquivo, mode_de_abertura );
225
Tabela 17: Modos de abertura de arquivos
Fonte: Adaptado de ASCENCIO, CAMPOS (2012)
Vejamos um exemplo:
FILE *arquivo;
arquivo = fopen(“arquivo.txt”, “w”);
226
leitura de dados, pois usamos o modo de abertura “w”. Quando
usamos uma função fopen() para abrir um arquivo no modo
escrita (w e w+), podem ocorrer duas situações:
arquivo vazio.
#include <stdio.h>
#include <conio.h>
main (void)
{
FILE *arquivo;
arquivo = fopen (“arquivo.txt”, “w”);
if (arquivo == NULL)
printf (“\n Ocorreu um erro, o arquivo não
foi aberto.”);
else
227
{
/*os demais comandos do programa só serão
executados
se o arquivo foi aberto corretamente. */
}
getch();
}
#include <stdio.h>
main (void)
{
system (“md C:\\exemplo\\teste”);
getch();
}
228
Usamos neste exemplo a função system() para criar um
diretório (pasta) no disco C. Para isso, passamos através dela
uma string que utiliza o comando md, padrão do Windows para
criação de pastas. Para não confundir o compilador com
caracteres de controle, usamos duas barras invertidas ( \\ ) para
indicar o caminho das pastas.
#include <stdio.h>
#include <conio.h>
main(void)
{
229
FILE *arquivo;
int resposta;
arquivo = fopen("arquivo.txt", "w");
if (arquivo == NULL)
printf ("Erro na abertura do arquivo!\n\n");
else
{
printf ("Sucesso na abertura do
arquivo!\n\n");
resposta = fclose(arquivo);
if (resposta ==0)
printf ("\n\nSucesso no fechamento do
arquivo!");
else
printf ("\n\nErro no fechamento do
arquivo!");
}
getch();
}
230
usa o endereço guardado na variável arquivo para fechar o
arquivo “arquivo.txt”, armazenando o resultado desta operação
na variável resposta. Caso este resultado seja igual a 0
(resposta == 0), o arquivo foi fechado corretamente. Como já
dissemos, é importante decidir corretamente o modo de
abertura do arquivo e, principalmente, deixá-lo aberto o menor
tempo possível, já que um erro na execução do programa pode
danificar arquivos abertos.
231
Gravando Caracteres em Arquivos
#include <stdio.h>
#include <conio.h>
main (void)
{
FILE *arquivo;
char carac;
arquivo = fopen("caractere.dat", "a");
if (arquivo = NULL)
printf ("Erro na abertura. \n\n");
else
{
printf ("\nDigite um caractere: ");
scanf("%c*c", &carac);
while (carac != 'f')
{
fputc(carac, arquivo);
if (ferror(arquivo))
printf ("Erro na gravacao do
arquivo\n");
else
{
printf ("\nGravacao realizada com
sucesso!");
printf ("\nDigite outro
caractere");
scanf("%c*c", &carac);
}
}
}
232
fclose(arquivo);
getch();
}
#include <stdio.h>
#include <conio.h>
main (void)
{
FILE *arquivo;
233
char c;
arquivo = fopen("caractere.txt", "r");
if (arquivo = NULL)
printf ("Erro na abertura. \n\n");
else
{
do
{
c = fgetc (arquivo);
if (ferror(arquivo))
printf ("Erro na leitura do
caractere\n");
else
{
if (!feof(arquivo))
{
printf ("\nLeitura realizada com
sucesso!");
printf ("Caractere lido: %c",
c);
}
}
} while (!feof(arquivo));
}
fclose(arquivo);
getch();
}
234
a função ferror() verifica se a leitura foi feita corretamente. Logo
após, temos a função feof(), que verifica se o fim do arquivo foi
encontrado. Isso é necessário para que não seja exibido o
caractere de fim de arquivo. Essa estrutura se repete até que
seja detectado o fim de arquivo, novamente através de nova
função feof(). Por fim, o arquivo é fechado e o programa é
encerrado.
#include <conio.h>
#include <stdio.h>
#include <string.h>
main (void)
{
FILE *p;
235
char cadeia [30];
p = fopen ("cadeias.txt", "a");
if (p == NULL)
printf("\nErro de abertura!");
else
{
printf("\nDigite uma cadeia de caracteres -
\"fim\" para encerrar: ");
gets(cadeia);
while (strcmp (cadeia, "fim") != 0)
{
fputs (cadeia, p);
if (ferror (p))
printf("\nErro na gravação da
cadeia");
else
printf("\nGravacao realizada com
sucesso!");
printf ("\n\nDigite outra cadeia: ");
gets (cadeia);
}
}
fclose(p);
printf ("\n\nTecle algo para sair ");
getch ();
}
236
O programa solicita que seja digitada uma cadeia de caracteres,
lê esta cadeia e armazena na variável cadeia. A estrutura de
repetição permite que sejam digitadas várias cadeias. A
repetição é encerrada quando se digita a palavra “fim” – por isso
o comando strcmp(cadeia, "fim"), que compara o valor da
variável cadeia ao valor “fim”. Caso esta comparação seja
verdadeira – ou seja, igual a 0 –, a estrutura de repetição é
encerrada. A cada repetição, a função puts() grava a cadeia de
caracteres digitada no arquivo referenciado pela variável p.
Novamente usamos a função ferror() para verificar se a
gravação foi feita com sucesso, e, no fim, o arquivo é fechado.
#include <stdio.h>
237
#include <conio.h>
main (void)
{
FILE *p;
char cadeia [5];
p = fopen ("cadeias.txt", "r");
if (p == NULL)
printf ("\nErro na abertura do arquivo.");
else
{
while (!feof(p))
{
fgets(cadeia, 5,p);
if (ferror(p))
printf ("\nErro na leitura da cadeia!");
else
{
printf ("\nLeitura realizada com
sucesso! - Cadeia lida: %s\n", cadeia);
}
}
}
fclose(p);
printf ("\nTecle algo para sair");
getch();
}
238
Mais uma vez temos uma estrutura de repetição que permite ler
todas as cadeias de caracteres gravadas em arquivo. A função
fgets() lê uma cadeia de 5 caracteres armazenados no arquivo
referenciado por p, armazenando os caracteres na variável
cadeia (note que estamos lendo os caracteres de 5 em 5.
Aumente ou diminua este valor para ver o resultado).
239
uma variável, ou, ainda, armazenar o conteúdo destas variáveis
diretamente no arquivo.
onde:
240
Veja um exemplo prático.
#include <stdio.h>
#include <conio.h>
main (void)
{
struct cliente{
int numero;
char nome [20];
};
FILE *cli;
struct cliente c;
cli = fopen("clientes.txt", "w");
if (cli == NULL)
printf ("\nErro na abertura do arquivo");
else
{
printf ("\nDigite o numero do cliente a ser
incluído: ");
scanf("%d", &c.numero);
printf ("\nDigite o nome do cliente a ser
incluído: ");
241
scanf("%s", &c.nome);
fwrite(&c, sizeof(struct cliente), 1, cli);
if (ferror(cli))
printf ("\nErro na gravação");
else
printf ("\n\nGravacao realizada com
sucesso!");
fclose(cli);
}
getch();
}
242
gravar o conteúdo da estrutura armazenada na variável c no
arquivo referenciado pela variável cli. As funções ferror() e
fclose() já são conhecidas.
243
onde:
244
int numero;
char nome [20];
};
struct cliente c;
cli = fopen("clientes.txt", "r");
if (cli == NULL)
printf ("\nErro na abertura do arquivo");
else
{
fread(&c, sizeof(struct cliente),1,cli);
if (cli == NULL)
printf ("\nErro na leitura do arquivo");
else
printf ("\n\nLeitura do arquivo realizada
com sucesso!");
while (!feof(cli))
{
printf ("\n\nNumero do cliente lido: %d",
c.numero);
printf ("\n\nNome do cliente lido: %s",
c.nome);
fread(&c, sizeof(struct cliente),1,cli);
if (ferror(cli))
printf("\n\nErro na leitura do
arquivo.");
else
printf ("\n\nLeitura realizada com
sucesso!");
245
}
fclose(cli);
}
printf ("\n\nTecle algo para sair!");
getch();
}
246
Na função fread(), temos:
Cursores em arquivos
247
Em alguns momentos, devemos reposicionar este cursor.
Imagine que você tenha um programa que efetue, num único
código, escrita e leitura de dados. Como o arquivo não será
fechado, é possível que você esteja lendo um arquivo a partir de
seu fim, ou ainda, que você grave dados sobre outros já
existentes. Por isso devemos usar comandos de reposicionar
cursores em arquivos. Os comandos utilizados são: rewind() e
fseek().
Veja:
#include <stdio.h>
#include <conio.h>
main (void)
{
FILE *cli;
struct cliente{
int numero;
char nome [20];
};
struct cliente c;
cli = fopen("clientes.txt", "r");
if (cli == NULL)
printf ("\nErro na abertura do arquivo");
else
248
{
fread(&c, sizeof(struct cliente),1,cli);
if (ferror(cli))
printf("\n\Erro na leitura");
else
{
printf ("\n\nLeiura realizada com
sucesso");
printf ("\n\nNumero do cliente lido:
%d", c.numero);
printf ("\n\nNome do cliente lido: %s",
c.nome);
rewind(cli);
printf ("\n\nCursor reposicionado no
inicio ->");
fread(&c, sizeof(struct
cliente),1,cli);
if (ferror(cli))
printf("\n\nErro na leitura do
arquivo.");
else
{
printf ("\n\nLeitura realizada com
sucesso!");
printf ("\n\nNumero do cliente
lido: %d", c.numero);
printf ("\n\nNome do cliente lido:
%s", c.nome);
}
}
fclose(cli);
}
getch();
}
249
Note que eliminamos a estrutura de repetição while(). Após as
primeiras leituras, reposicionamos o cursor no início do arquivo,
efetuando nova leitura dos dados. Por isso os dados são
exibidos de forma repetida, pois foram lidos novamente. Após
isso, o arquivo é fechado.
250
SEEK_CUR: permite a movimentação de qtd_bytes
251
Exemplos:
A) Renomeando um arquivo:
#include <stdio.h>
#include <conio.h>
main (void)
{
int x;
FILE *arq;
fclose(arq);
getch();
}
252
B) Apagando um arquivo:
#include <stdio.h>
#include <conio.h>
main (void)
int x;
x = remove (“cliente.txt”);
if (x == 0)
else
getch();
253
Acesse a Midiateca e baixe o arquivo em C
contendo um programa completo para
manipulação de arquivos.
254
FINALIZANDO
Caro aluno,
255
apenas botões, ícones e textos, você agora é capaz de enxergar
variáveis, funções, vetores, estruturas de dados...
Um grande abraço!
Julho de 2013.
256
REFERÊNCIAS
257
SALVETTI, Dirceu Douglas; BARBOSA, Lisbete Madsen.
Algoritmos. São Paulo: Makron Books, 1998.
258