Escolar Documentos
Profissional Documentos
Cultura Documentos
Apostila de Linguagem C TOP
Apostila de Linguagem C TOP
Linguagem de Programao C
Linguagem de Programao C
Linguagem de Programao C
Sumrio
CAPTULO I Introduo.............................................................................1
Linguagens de Programao - Definio ...............................................1
Programao em linguagem simblica ..................................................1
Lio 1 - Entrada/Sada .........................................................................2
Lio 2 - Variveis e Constantes............................................................7
Lio 3 - Operadores e funes matemticas .......................................11
Lio 4 - Estruturas condicionais - Decises if...else .............................15
Lio 5 - Estruturas condicionais - Decises switch...case ....................19
Lio 6 - Estruturas de repetio ..........................................................22
Lio 7 - Desvios ...................................................................................26
CAPTULO II Trabalhando com tela em modo texto .................................29
CAPTULO III Trabalhando com tela em modo grfico .............................37
CAPTULO IV Arquivos de dados .............................................................47
APNDICE A- Funes diversas..................................................................58
APNDICE B- Tabela ASCII ........................................................................60
Linguagem de Programao C
CAPTULO I
Introduo
Linguagens de Programao - Definio
Um computador uma mquina capaz de executar operaes, mas para que "ele" saiba o que e
como executar preciso programa-lo. Um programa de computador nada mais que um conjunto
de instrues, escrito atravs de uma linguagem prpria, que orienta o computador a realizar uma
determinada tarefa.
A nica linguagem que o computador "entende" a chamada Linguagem de Mquina, que
formada por um conjunto de cdigos numricos, prprios para comandar a mquina. Porm, estes
cdigos so extremamente complicados para o entendimento humano, por isso surgiram as
linguagens simblicas.
Uma linguagem simblica , na realidade, um conjunto de palavras e regras facilmente
compreendidas pelo homem, mas para que o computador as entenda existe a necessidade de uma
traduo para a linguagem de mquina. Este processo de traduo denominado "compilao".
Diagrama esquemtico do processo de criao de um programa:
Programa
Fonte
(em linguagem
simblica)
(a)
Compilador
(b)
Programa
executvel
(em linguagem
de mquina)
(c)
(a) O programa fonte um arquivo "texto" digitado pelo programador. Este arquivo contm as instrues
necessrias para que o computador realize a tarefa desejada. Utiliza-se a linguagem simblica,
genericamente chamada de linguagem de programao.
(b) O programa fonte lido pelo compilador , que traduz as instrues da linguagem simblica para a
linguagem de mquina. Neste processo so apontados os eventuais erros existentes no programa fonte, e
enquanto houver erros o compilador no gerar o programa executvel (em linguagem de mquina),
neste caso o programador dever retornar ao editor e corrigir os erros apontados.
(c) Aps o processo de compilao, se no forem detectados erros, ser criado o programa executvel (em
linguagem de mquina). Este programa receber o sufixo .EXE e poder ser executado atravs do prompt
do MS-DOS.
ATENO
Para que o estudo da linguagem C ganhe maior produtividade, esta apostila encontra-se dividida em
lies que partem de um nvel mais baixo at um nvel mais alto de complexidade. Trabalharemos
com exemplos prticos, onde, sempre que possvel, mostraremos o algoritmo em linguagem Inter-S
e o programa fonte correspondente em linguagem C. As instrues sero comentadas e
exemplificadas no final de cada lio.
Linguagem de Programao C
Lio 1 - Entrada/Sada
Objetivo: Criar um programa que leia 2 nmeros do teclado e mostre o resultado da soma dos
mesmos. (Nome do programa: LICAO1)
Soluo:
Algoritmo em Inter-S
// Programa: Lio 1
// Autor : <nome-do-aluno>
// Data : 99/99/9999
/* Programa Licao1
Autor: <nome-do-aluno>
Data.: 99/99/9999
*/
#include <stdio.h>
#include <conio.h>
Rotina
Declare valor1, valor2, resultado Numerico
Receba valor1
Receba valor2
Resultado = valor1 + valor2
Escreva resultado
FimRotina
main() {
int valor1, valor2, resultado;
scanf("%d",&valor1);
scanf("%d",&valor2);
resultado = valor1 + valor2;
printf("%d",resultado);
}
Comentrios:
Observe que as primeiras linhas do algoritmo em Inter-S iniciam-se com duas barras (//). Estas
linhas no so reconhecidas como instrues, servem para introduzirmos comentrios quaisquer. Na
codificao em linguagem C os comentrios so colocados entre os caracteres /* e */. Observe que,
no nosso exemplo, estas linhas trazem uma pequena documentao do programa: nome (LICAO1),
autor (nome do programador) e data de criao, mas o programador poder escrever o que achar
necessrio para documentar o programa, desde que esta documentao se inicie com os caracteres
/* (barra-asterisco) e termine com os caracteres */ (asterisco-barra).
Em seguida, ainda observando a codificao do programa fonte, existem duas linhas que chamamos
de diretivas de compilao (#include <...>). Estas diretivas sero tratadas mais adiante, no momento
basta saber que elas sero necessrias para que o programa funcione adequadamente.
As linhas seguintes expressam o algoritmo propriamente dito. Na linguagem Inter-S determinamos o
incio do algoritmo com a palavra Rotina, que expresso como main() { na codificao em
linguagem C; o final da rotina dado pela expresso FimRotina que na codificao em linguagem C
aparece como um fechamento de chave ( } ).
Veja abaixo a descrio das demais linhas do algoritmo Inter-S e o formato correspondente em
linguagem C:
Declare valor1, valor2, resultado Numrico
A expresso Declare processa a declarao das variveis que sero utilizadas pela rotina.
Definimos os nomes das variveis e o tipo de dado que elas armazenaro. Neste exemplo
estamos declarando as variveis valor1, valor2 e resultado, as quais recebero dados
numricos.
O formato desta instruo em linguagem C o seguinte:
int valor1, valor2, resultado;
Onde int indica que as variveis da lista sero numricas inteiras (sem decimais).
Linguagem de Programao C
Receba valor1
Esta instruo determina a leitura da entrada padro (no nosso caso o teclado), e coloca o
contedo lido na varivel especificada: valor1. Em outras palavras, esta instruo aguarda que
um dado seja digitado, colocando-o na varivel valor1.
Instruo correspondente em linguagem C:
scanf("%d",&valor1);
Onde scanf uma funo para a leitura do teclado. Entre parnteses indicamos o tipo da
informao a ser lida: "%d" (indica que o dado ser numrico), aps a vrgula informamos qual
a varivel que receber o dado: &valor1. (o smbolo & um ponteiro necessrio neste caso, que
permite a alocao do valor da varivel em um endereo especfico de memria).
Receba valor2
Instruo idntica anterior, mudando apenas a varivel que receber a informao: valor2.
Instruo correspondente em linguagem C:
scanf("%d",&valor2);
Escreva resultado
Esta instruo envia uma informao para a sada padro (no nosso caso o vdeo). Escreva
resultado faz com que o contedo da varivel resultado seja escrito no vdeo.
Instruo correspondente em linguagem C:
printf("%d",resultado);
Onde printf uma funo para a escrita em tela. Entre parnteses indicamos o tipo da
informao a ser escrita: "%d" (indica que o dado numrico), aps a vrgula informamos qual
a varivel cujo contedo ser exibido: resultado.
Nota importante: Toda linha de instruo em linguagem C deve ser finalizada com um ponto-evrgula (;)
Linguagem de Programao C
Digite TC e tecle <enter>. Isto far com que o editor da linguagem C seja executado. Inicie a
digitao do programa fonte. Digite o programa LICAO1 da mesma forma que ele est
apresentado na pgina 2, mas para voc no precisar virar a pgina, cuidamos de reproduzi-lo
abaixo:
/* Programa Licao1
Autor: <nome-do-aluno>
Data.: 99/99/9999
*/
#include <stdio.h>
#include <conio.h>
main() {
int valor1, valor2, resultado;
scanf("%d",&valor1);
scanf("%d",&valor2);
resultado = valor1 + valor2;
printf("%d",resultado);
}
Obs.: Letras maisculas e minsculas so interpretadas de forma diferente pelo compilador C, portanto,
digite as instrues acima da mesma maneira que esto apresentadas.
Aps a digitao grave o programa utilizando o comando FILE /SAVE . Ser solicitado o nome
com o qual o arquivo ser gravado, digite LICAO1.C (todo programa fonte em linguagem C deve
possuir sufixo .C)
Saia do editor executando o comando FILE / EXIT. No prompt do MS-DOS voc poder verificar
que um arquivo com nome LICAO1.EXE foi criado (utilize o comando DIR). Este arquivo o
programa executvel. Para faz-lo funcionar basta digitar LICAO1 e teclar <enter>.
Linguagem de Programao C
Algoritmo em Inter-S
// Programa: Lio 1
// Autor : <nome-do-aluno>
// Data : 99/99/9999
/* Programa Licao1
Autor: <nome-do-aluno>
Data.: 99/99/9999
*/
#include <stdio.h>
#include <conio.h>
Rotina
Declare valor1, valor2, resultado Numerico
Limpa
Escreva "Programa LICAO1"
Escreva "Digite o 1 valor:"
Receba valor1
Escreva "Digite o 2 valor:"
Receba valor2
Resultado = valor1 + valor2
Escreva "Soma dos valores:"
Escreva resultado
FimRotina
main() {
int valor1, valor2, resultado;
clrscr();
printf("Programa LICAO1\n");
printf("Digite o 1 valor:");
scanf("%d",&valor1);
printf("Digite o 2 valor:");
scanf("%d",&valor2);
resultado = valor1 + valor2;
printf("Soma dos valores:");
printf("%d",resultado);
}
As novas instrues:
Limpa
Faz com que a tela seja "apagada", ou seja, deixa a tela totalmente limpa. importante o uso dessa
instruo para evitar a poluio visual da aplicao. A funo correspondente em linguagem C :
clrscr();
Linguagem de Programao C
Exerccios de fixao
a) Elabore um programa em linguagem C para receber trs nmeros pelo teclado e exibir a mdia
aritmtica dos mesmos. D-lhe o nome de EXERC1A. (Faa o algoritmo em Inter-S e a
codificao em linguagem C). Para calcular a mdia utilize a seguinte frmula:
(Valor1 + Valor2 + Valor3) / 3
Note que o operador de diviso representado por uma barra (/). Utilize-a tanto na linguagem InterS como na codificao do programa em linguagem C. Os parnteses determinam a prioridade do
clculo, neste caso temos que a soma dos valores ser executada antes da operao de diviso.
Linguagem de Programao C
Linguagem de Programao C
O programa LICAO2, apresentado abaixo, mostra os formatos das instrues para a declarao de
variveis e constantes, tanto em Inter-S como em linguagem C:
Algoritmo em Inter-S
// Programa: Lio 2
// Autor : <nome-do-aluno>
// Data : 99/99/9999
/* Programa Licao2
Autor: <nome-do-aluno>
Data.: 99/99/9999
*/
#include <stdio.h>
#include <conio.h>
Rotina
Declare produto Caractere
Declare qtde Numerico
Declare preco Numerico
Declare total Numerico
Limpa
Escreva "Digite o nome do produto:"
Receba produto
Escreva "Digite o preco do produto:"
Receba preco
Escreva "Digite a quantidade:"
Receba qtde
total = qtde * preco
Escreva "O valor total do produto "
Escreva produto
Escreva " : "
Escreva total
FimRotina
main() {
char produto[10];
int qtde;
float preco;
double total;
clrscr();
printf("Digite o nome do produto:");
scanf("%10s",produto);
printf("Digite o preco do produto:");
scanf("%f",&preco);
printf("Digite a quantidade:");
scanf("%d",&qtde);
total = qtde * preco;
printf("O valor do produto ");
printf(produto);
printf(" : ");
printf("%f",total);
}
Comentrios:
O programa apresentado solicitar pelo teclado o nome do produto (que poder ter no mximo 10
caracteres), o preo do produto (numrico real de 7 dgitos) e a quantidade (numrico inteiro). Far o
clculo: quantidade x preo, colocando o resultado na varivel total (numrico real de 15 dgitos).
Finalmente exibir no vdeo o valor total do produto.
Para uma melhor compreenso do programa, vamos analisa-lo linha a linha:
Programa fonte em Linguagem C
Comentrios
/* Programa Licao2
Autor: <nome-do-aluno>
Data.: 99/99/9999
*/
#include <stdio.h>
#include <conio.h>
Documentao
Documentao
Documentao
Final da documentao
Diretiva de compilao
Diretiva de compilao
main() {
char produto[10];
int qtde;
float preco;
double total;
clrscr();
printf("Digite o nome do produto:");
scanf("%10s",produto);
printf("Digite o preco do produto:");
scanf("%f",&preco);
printf("Digite a quantidade:");
scanf("%d",&qtde);
total = qtde * preco;
Linguagem de Programao C
printf("O valor do produto ");
printf(produto);
printf(" : ");
printf("%f",total);
As novas instrues:
Observe que as novidades existentes no programa LICAO2 esto presentes nas declaraes das
variveis e nas formas de solicit-las pelo teclado (scanf) e escrev-las no vdeo (printf).
No momento da declarao de uma varivel devemos inicialmente informar o tipo de dado que ela
receber, utilizando um dos seguintes identificadores de tipo:
Char "
Int
"
Float "
Double "
No caso da declarao de uma varivel do tipo alfanumrica, devemos indicar aps o nome da
mesma, a quantidade de caracteres que ela suportar. Esta quantidade expressa entre colchetes [ ]. Na omisso desta definio, a varivel suportar apenas um caracter. Exemplos:
Char produto[10]; " Declara a varivel produto como alfanumrica com o tamanho de 10
caracteres.
Char resposta; " Declara a varivel resposta como alfanumrica com o tamanho de 1
caractere.
A funo scanf (recebimento de dados pelo teclado) tambm deve ser ajustada de acordo com o
tipo de informao. Observe a instruo abaixo:
scanf("%10s",produto);
No programa, esta instruo tem a finalidade de receber o contedo da varivel produto. Note que
devemos informar o tipo e o tamanho do dado atravs da expresso "%10s", onde o nmero 10
indica o tamanho e a letra s indica que a varivel uma String (o nome utilizado para identificar uma
varivel alfanumrica com tamanho superior a 1 caractere).
Na tabela abaixo encontramos a relao dos formatos para a declarao, recebimento pelo teclado
(scanf) e escrita no vdeo (printf) dos diversos tipos de dados:
Formato da declarao
int numero;
float numero;
double numero;
char letra;
char texto[20];
Formato do scanf
scanf("%d",&numero);
scanf("%f",&numero);
scanf("%f",&numero);
scanf("%c",&letra);
scanf("%20s",texto);
10
Formato do printf
printf("%d",numero);
printf("%f",numero);
printf("%f",numero);
printf("%c",letra);
printf(texto);
Linguagem de Programao C
Exerccios de fixao
a) Elabore um programa em linguagem C para receber as seguintes informaes:
Nome : Alfanumrico de 15 caracteres;
Dia do nascimento: Numrico inteiro;
Ms do nascimento: Numrico inteiro;
Ano do nascimento: Numrico inteiro;
Valor da mesada: Numrico real de 7 dgitos.
Aps o recebimento destas informaes, o programa dever apagar a tela e escrev-las no
vdeo.
D o nome EXERC2A ao programa. (Faa o algoritmo em pseudo-linguagem e a codificao
em linguagem C).
b) Implemente o programa EXERC2A para mostrar no final a renda anual (valor da mesada
multiplicado por 12). Grave-o como EXERC2B.
11
Linguagem de Programao C
Operadores
Existem cinco operadores aritmticos em C. Cada operador aritmtico est relacionado a uma
operao aritmtica elementar: adio, subtrao, multiplicao e diviso. Existe ainda um operador
(%) chamado operador de mdulo cujo significado o resto da diviso inteira. Os smbolos dos
operadores aritmticos so:
Operador
+
*
/
%
Operao
adio.
subtrao.
multiplicao
diviso
mdulo (resto da diviso inteira)
num%2
12
Linguagem de Programao C
Exemplo: Observe, nas expresses abaixo, o seu valor e a ordem das operaes efetuadas:
Expresso
Valor Ordem
1 + (2 - 3)
0
- +
(24 - 3) * 5
105
- *
(4 - 2 * 6) / 4 + 1
-1
* - / +
6 / ((2 + 11) % 3) * 4
24
+ % / *
Observe que os operadores e os operandos deste exemplo so os mesmos do exemplo anterior. Os
valores, porm, so diferentes pois a ordem de execuo das operaes foi modificada pelo uso dos
parnteses.
O Programa LICAO3A, apresentado abaixo, demonstra algumas operaes matemticas. Ele solicita
o valor do salrio bruto e um percentual de desconto, calcula e exibe o valor do salrio lquido:
Algoritmo em Inter-S
// Programa: Lio3A
// Autor : <nome-do-aluno>
// Data : 99/99/9999
/* Programa Licao3A
Autor: <nome-do-aluno>
Data.: 99/99/9999
*/
#include <stdio.h>
#include <conio.h>
Rotina
Declare bruto, liq, perc Numerico
Limpa
Escreva "Digite o salario bruto: "
Receba bruto
Escreva "Digite o percentual: "
Receba perc
liq = bruto-(bruto*perc/100)
Escreva "Salario liquido: "
Escreva liq
FimRotina
main() {
float bruto, liq, perc;
clrscr();
printf("Digite o salario bruto:");
scanf("%f",&bruto);
printf("Digite o percentual:");
scanf("%f",&perc);
liq = bruto-(bruto*perc/100);
printf("Salario liquido: ");
printf("%f",liq);
}
Comentrios:
Observe a instruo para o clculo do salrio lquido:
liq = bruto-(bruto*perc/100);
A utilizao de parnteses necessria neste caso. Eles determinam a prioridade do clculo:
primeiramente efetuada a operao: bruto*perc/100 (pois est entre parnteses), o resultado,
em seguida, subtrado de bruto.
Funes
Uma funo um sub-programa (tambm chamado de sub-rotina). Esta sub-rotina recebe
informaes, as processa e retorna outra informao. Por exemplo, podemos ter uma funo que
receba um valor numrico, calcule sua raiz quadrada e retorne o valor obtido. Existem dois tipos de
funes: funes de biblioteca e funes de usurio. Funes de biblioteca so funes escritas
pelos fabricantes do compilador e j esto pr-compiladas, isto , j esto escritas em cdigo de
mquina. Funes de usurio so funes escritas pelo programador. Nesta lio trataremos
somente das funes de biblioteca.
13
Linguagem de Programao C
Para podermos usar uma funo de biblioteca devemos incluir a biblioteca na compilao do
programa. Esta incluso feita com o uso da diretiva #include colocada antes da rotina principal,
como j observamos nos programas anteriores.
Vejamos algumas funes matemticas da biblioteca math.h:
Funes trigonomtricas do ngulo arco, em radianos:
sin(arco); // seno
cos(arco); // coseno
tan(arco); // tangente
asin(arco); // arco-seno
acos(arco); // arco-coseno
atan(arco); // arco-tangente
Funcoes de arredondamento:
ceil(num) ;
// Exemplo:
floor(num) ;
// Exemplo:
Funes diversas:
log(num);
log10(num);
pow(base, exp);
sqrt(num);
//
//
//
//
ceil(3.2) == 3.0;
floor(3.2) == 4.0;
Para utilizar uma destas funes introduza a linha de comando #include <math.h> no cabealho
de seu programa. A partir deste momento voc poder, dentro de qualquer rotina, utilizar qualquer
funo da biblioteca math.h. O programa abaixo exemplifica a utilizao de funes matemticas.
Ele solicita um nmero pelo teclado, calcula e mostra a raiz quadrada e o cubo deste nmero:
Algoritmo em Inter-S
// Programa: Lio3B
// Autor : <nome-do-aluno>
// Data : 99/99/9999
/* Programa Licao3B
Autor: <nome-do-aluno>
Data.: 99/99/9999
*/
#include <stdio.h>
#include <conio.h>
#include <math.h>
Rotina
Declare num, resultado Numerico
Limpa
Escreva "Digite um nmero: "
Receba num
resultado = raiz(num)
Escreva "Raiz Quadrada do nmero: "
Escreva resultado
resultado = num^3
Escreva "Cubo do nmero: "
Escreva resultado
FimRotina
main() {
float num, resultado;
clrscr();
printf("Digite um nmero: ");
scanf("%f",&num);
resultado = sqrt(num);
printf("Raiz quadrada do nmero: ");
printf("%f",resultado);
resultado = pow(num,3);
printf("\nCubo do nmero: ");
printf("%f",resultado);
}
Nota: A linguagem Inter-S no possui diretivas, pois todas as funes j esto includas no
compilador.
14
Linguagem de Programao C
Exerccios de fixao
a) Elabore um programa em linguagem C que receba as variveis numricas de ponto flutuante
(float) w e z e mostre o resultado das seguintes expresses matemticas:
a1)
a2)
a3)
w+z
(w+100) x V z
V w2 + z2
15
Linguagem de Programao C
condio
V
bloco
Algoritmo em Inter-S
// Programa: Lio4A
// Autor : <nome-do-aluno>
// Data : 99/99/9999
/* Programa Licao4A
Autor: <nome-do-aluno>
Data.: 99/99/9999
*/
#include <stdio.h>
#include <conio.h>
#include <math.h>
Rotina
Declare num, resultado Numerico
Limpa
Escreva "Digite um nmero: "
Receba num
Se num > = 0 entao
resultado = raiz(num)
Escreva "Raiz quadrada: "
Escreva resultado
FimSe
FimRotina
main() {
float num, resultado;
clrscr();
printf("Digite um nmero: ");
scanf("%f",&num);
if(num >= 0) {
resultado = sqrt(num);
printf("Raiz Quadrada: ");
printf("%f",resultado);
}
}
16
Linguagem de Programao C
A estrutura de deciso demonstrada tem como primeiro comando a avaliao de uma expresso:
Se num >= 0, em seguida encontram-se os comandos que sero executados caso a avaliao seja
verdadeira. Este bloco de comandos finalizado com a instruo FimSe. Observe o uso da
edentao, ou seja, o bloco de comandos encontra-se alinhado a partir de uma margem mais
direita. Este procedimento necessrio para garantir um melhor entendimento do algoritmo.
Note que na codificao em linguagem C o bloco de comandos que ser executado no caso da
condio ser verdadeira encontra-se entre chaves ( { } ), observe tambm que utilizamos a
edentao na codificao em linguagem C.
Reproduzimos abaixo a estrutura de deciso utilizada no programa LICAO4A:
if(num >= 0) {
resultado = sqrt(num);
printf("Raiz Quadrada: ");
printf("%f",resultado);
}
O comando if (se) processa a avaliao da expresso que se encontra entre parnteses, que no
nosso caso : num > = 0 (na realidade feita uma pergunta: num maior ou igual a zero?). Se a
resposta for verdadeira o bloco de instrues que se encontra entre chaves ser executado; caso a
resposta seja falsa, ou seja, se num no for maior ou igual a zero, o bloco no ser executado.
condio?
bloco 1
bloco 2
Algoritmo em Inter-S
// Programa: Lio4B
// Autor : <nome-do-aluno>
// Data : 99/99/9999
/* Programa Licao4B
Autor: <nome-do-aluno>
Data.: 99/99/9999
*/
#include <stdio.h>
#include <conio.h>
#include <math.h>
Rotina
Declare num, resto Numerico
Limpa
main() {
int num, resto;
clrscr();
17
Linguagem de Programao C
Escreva "Digite um nmero: "
Receba num
resto = num mod 2
Se resto = 0 entao
Escreva "Nmero par"
Senao
Escreva "Nmero mpar"
FimSe
FimRotina
Inicialmente devemos esclarecer o processo utilizado para descobrir se o nmero par ou mpar.
Sabemos que nmeros pares so mltiplos de 2, portanto, se dividirmos um nmero par por 2
teremos 0 (zero) como resto da diviso. Se o nmero for mpar, teremos 1 (um) como resto da
diviso por 2. Observe os exemplos abaixo:
16
15
J vimos que em linguagem C temos um operador matemtico que nos retorna o resto de uma
diviso: o operador mdulo, representado pelo caracter %. As divises acima podem ser
representadas em C da seguinte forma:
resto = 16 % 2 " a varivel resto receber contedo 0 (zero), pois no existe resto nesta diviso.
resto = 15 % 2 " a varivel resto receber contedo 1 (um), pois o resto da diviso 1.
Observe no programa LICAO4B que a estrutura de deciso contm dois blocos de comandos. O
primeiro encontra-se logo aps o comando if, e o segundo aps o comando else:
if(resto = = 0) {
printf("Nmero par");
} else {
printf("Nmero mpar");
}
18
Linguagem de Programao C
Operadores relacionais
Nas expresses que so avaliadas pelo comando if, utilizamos operadores de relao, os quais
nos permite verificar se um determinado valor igual ou no a um outro, se maior ou menor, etc.
Operadores relacionais verificam a relao de magnitude e igualdade entre dois valores. So seis
os operadores relacionais em C:
Operador
>
<
>=
<=
==
!=
Significado
maior que
menor que
maior ou igual a (no menor que)
menor ou igual a (no maior que)
igual a
no igual a (diferente de)
Operadores lgicos
At aqui ainda no tivemos a oportunidade de utilizar os operadores lgicos. So operadores que
utilizam a lgica booleana para a construo de expresses condicionais. Por exemplo: se eu quiser
que uma determinada rotina seja executada somente quando os valores de duas variveis (x e y)
sejam iguais a zero, eu construo a seguinte expresso:
Pseudo-linguagem
Se x = 0 e y = 0 entao ...
Linguagem C
if (x = = 0 && y = = 0) { ...
Por outro lado, se eu quiser que uma determinada rotina seja executada quando o valor de uma das
duas variveis seja igual a zero, ou seja, se x for igual a zero ou y for igual a zero, eu construo a
seguinte expresso:
Pseudo-linguagem
Se x = 0 ou y = 0 entao ...
Linguagem C
if (x = = 0 y = = 0) { ...
Exerccio de fixao
Elabore um programa em linguagem C que receba um ano (numrico inteiro) e informe se o ano
bissexto ou no (anos bissextos so mltiplos de 4, portanto, se a diviso do ano por 4 gerar resto
igual a zero, o ano bissexto - use o operador %). Grave o programa como EXERC4.
19
Linguagem de Programao C
expresso
rotulo 1
conjunto 1
rotulo 2
conjunto 2
...
rotulo N
conjunto N
default
conjunto D
O valor de expresso avaliado e o fluxo lgico ser desviado para o conjunto cujo rtulo igual ao
resultado da expresso e todas as instrues abaixo deste rtulo sero executadas. Caso o
resultado da expresso for diferente de todos os valores dos rtulos ento conjunto d executado.
Os rtulos devem ser expresses constantes diferentes entre si. O rtulo default opcional.
Esta estrutura particularmente til quando se tem um conjunto de instrues que se deve executar
em ordem, porm pode-se comear em pontos diferentes.
20
Linguagem de Programao C
Algoritmo em Inter-S
// Programa: Lio5A
// Autor : <nome-do-aluno>
// Data : 99/99/9999
/* Programa Licao5A
Autor: <nome-do-aluno>
Data.: 99/99/9999
*/
#include <stdio.h>
#include <conio.h>
Rotina
main() {
Declare selecao Numerico
int selecao;
clrscr();
Limpa
printf("Selecione o estgio: ");
Escreva "Selecione o estgio:"
scanf("%d",&selecao);
Receba selecao
switch(selecao) {
Caso selecao
case 1:printf("Obter ingredientes\n");
Seja =1 faca Escreva "Obter ingredientes"
case 2:printf("Juntar \n");
Seja =2 faca Escreva "Juntar"
case 3:printf("Bater a massa\n");
Seja =3 faca Escreva "Bater a massa"
case 4:printf("Colocar na forma\n");
Seja =4 faca Escreva "Colocar na forma"
case 5:printf("Levar ao forno\n");
Seja =5 faca Escreva "Levar ao forno"
default:printf("Fim\n");
CasoNao faca Escreva "Fim"
}
FimCaso
}
FimRotina
Neste exemplo, o programa recebe um nmero que corresponde seleo do estgio. Se a varivel
selecao receber valor 1, ento sero executados os procedimentos a partir do rtulo case 1; se
selecao receber valor 2, sero executados os procedimentos a partir do rtulo case 2, e assim por
diante. Observe que existem 5 rtulos (case 1 a case 5) e um rtulo default, se a varivel selecao
receber um contedo fora do intervalo de 1 a 5, somente o procedimento aps o rtulo default ser
executado. Lembramos que o rtulo default opcional, ou seja, o programador pode utiliza-lo ou
no.
Na codificao em Inter-S, observaremos que somente uma das instrues SEJA ser executada,
caracterstica que difere da estrutura switch da linguagem C.
A instruo break.
Existem situaes em uma estrutura de deciso switch...case em que desejamos que somente um
procedimento seja executado (como ocorre normalmente com a instruo CASO no Inter-S). Para
esta finalidade utilizamos a instruo break, a qual faz com que a execuo da estrutura seja
encerrada aps a execuo do procedimento selecionado. O programa LICAO5B, demonstrado a
seguir, ilustra a utilizao de uma estrutura switch...case que executa apenas um dos
procedimentos rotulados.
Linguagem de Programao C
case 3: printf("Bater a massa\n"); break;
case 4: printf("Colocar na forma\n"); break;
case 5: printf("Levar ao forno\n"); break;
default: printf("Fim\n");
}
}
Note que o programa apresentado parecido com o LICAO5A, a nica diferena est na utilizao
da instruo break. Esta instruo garante que somente um dos procedimentos ser executado, de
acordo com o valor da varivel selecao, compatibilizando o algoritmo em linguagem C com o
algoritmo Inter-S
Exerccio de fixao
Elabore um programa em linguagem C que receba duas variveis numricas e atravs de uma
estrutura de deciso switch...case mostre a soma destas variveis, ou a subtrao, ou a
multiplicao ou a diviso, de acordo com o valor recebido em uma terceira varivel. Grave o
programa como EXERC5.
22
Linguagem de Programao C
Estrutura do...while
Esta uma estrutura bsica de repetio condicional. Permite a execuo de um bloco de instrues
repetidamente. Sua sintaxe a seguinte:
do{
bloco
}while(condio);
onde: condio uma expresso lgica ou numrica.
bloco um conjunto de instrues.
Esta estrutura faz com que o bloco de instrues seja executado pelo menos uma vez. Aps a
execuo do bloco, a condio avaliada. Se a condio verdadeira o bloco executado outra
vez, caso contrrio a repetio terminada. O fluxograma desta estrutura mostrado na figura 6.1:
bloco
condio?
O programa LICAO6A, demonstrado abaixo, utiliza uma estrutura do...while para receber um
nmero pelo teclado e mostrar o quadrado do mesmo. A estrutura ser encerrada quando o nmero
digitado for menor ou igual a zero, ou seja, ser executada enquanto o nmero for maior que zero:
Algoritmo em Inter-S
// Programa: Lio6A
// Autor : <nome-do-aluno>
// Data : 99/99/9999
/* Programa Licao6A
Autor: <nome-do-aluno>
Data.: 99/99/9999
*/
#include <stdio.h>
#include <conio.h>
Rotina
Declare num Numerico
main() {
float num;
23
Linguagem de Programao C
Limpa
Repita
Escreva "Digite um nmero: "
Receba num
Escreva "Quadrado: "
Escreva num*num
AteQue num <= 0
FimRotina
clrscr();
do {
printf("\nDigite um nmero: ");
scanf("%f",&num);
printf("Quadrado: ");
printf("%f", num*num);
} while(num > 0);
}
Observe que as instrues existentes entre os comandos do e while sero executadas enquanto o
valor da varivel num for maior que zero.
Note que no algoritmo Inter-S o final da estrutura representado pela expresso AteQue, ou seja, a
estrutura ser repetida at que algo seja verdadeiro. J no algoritmo em linguagem C a estrutura
finalizada pela expresso while, ou seja, a estrutura ser repetida enquanto algo for verdadeiro.
Estrutura while
A estrutura de repetio condicional while semelhante a estrutura do...while. Sua sintaxe a
seguinte:
while(condio){
bloco
}
onde: condio uma expresso lgica ou numrica.
bloco um conjunto de instrues.
Esta estrutura faz com que a condio seja avaliada em primeiro lugar. Se a condio verdadeira
o bloco executado uma vez e a condio avaliada novamente. Caso a condio seja falsa a
repetio terminada sem a execuo do bloco. Observe que nesta estrutura, ao contrrio da
estrutura do...while, o bloco de instrues pode no ser executado nenhuma vez, basta que a
condio seja inicialmente falsa. O fluxograma desta estrutura mostrada na figura 6.2:
condio?
V
bloco
24
Linguagem de Programao C
O programa LICAO6B, demonstrado abaixo, ilustra a utilizao de uma estrutura while. O programa
faz o mesmo que o programa anterior (LICAO6A), porm, a estrutura de repetio diferente:
Algoritmo em Inter-S
// Programa: Lio6B
// Autor : <nome-do-aluno>
// Data : 99/99/9999
/* Programa Licao6B
Autor: <nome-do-aluno>
Data.: 99/99/9999
*/
#include <stdio.h>
#include <conio.h>
Rotina
Declare num Numerico
Num = 1
Limpa
Enquanto num > 0 Faca
Escreva "Digite um nmero: "
Receba num
Escreva "Quadrado: "
Escreva num*num
FimEnquanto
FimRotina
main() {
float num;
num = 1;
clrscr();
while(num > 0) {
printf("\nDigite um numero: ");
scanf("%f",&num);
printf("Quadrado: ");
printf("%f", num*num);
}
}
Observe que o programa acima tem o mesmo objetivo do programa LICAO6A: recebe um nmero
pelo teclado e mostra o quadrado do mesmo enquanto o nmero for maior que zero. Note tambm
que a varivel num foi iniciada com o valor 1 (num = 1), isto foi necessrio para que a estrutura
pudesse ser iniciada, pois se o valor de num, na primeira vez, fosse menor ou igual a zero, a
estrutura no seria executada e o programa terminaria.
Estrutura for
A estrutura for muito semelhante s estruturas de repetio vistas anteriormente, entretanto
costuma ser utilizada quando se quer um nmero determinado de ciclos. A contagem dos ciclos
feita por uma varivel chamada de contador. A estrutura for , as vezes, chamada de estrutura de
repetio com contador. Sua sintaxe a seguinte:
for(inicializao; condio; incremento){
bloco
}
onde: inicializao uma expresso de inicializao do contador.
condio uma expresso lgica de controle de repetio.
incremento uma expresso de incremento do contador.
bloco um conjunto de instrues a ser executado.
Esta estrutura executa um nmero determinado de repeties usando um contador de iteraes. O
contador inicializado na expresso de inicializao antes da primeira iterao. Por exemplo: i =
0; ou cont = 20. Ento o bloco executado e depois de cada iterao, o contador incrementado
de acordo com a expresso de incremento. Por exemplo: i=i+1 ou cont = cont-2. Ento a
expresso de condio avaliada: se a condio for verdadeira, o bloco executado novamente e
o ciclo recomea, se a condio for falsa termina-se o lao. Esta condio , em geral, uma
expresso lgica que determina o ultimo valor do contador. Por exemplo: i <= 100 ou cont > 0.
25
Linguagem de Programao C
O programa LICAO6C, demonstrado abaixo, ilustra a utilizao da estrutura for. O contador i
inicializado com o valor 1. O bloco repetido enquanto a condio i <= 10 for verdadeira. O
contador incrementado com a instruo i=i+1. Esta estrutura, deste modo, mostra na tela os
nmeros 1, 2, ..., 9, 10.
Algoritmo em Inter-S
// Programa: Lio6C
// Autor : <nome-do-aluno>
// Data : 99/99/9999
/* Programa Licao6C
Autor: <nome-do-aluno>
Data.: 99/99/9999
*/
#include <stdio.h>
#include <conio.h>
Rotina
Declare i Numerico
Limpa
Para i=1 Ate 10 Faca
Escreva i
FimPara
FimRotina
main() {
int i;
clrscr();
for(i=1; i<=10; i=i+1) {
printf("%d",i);
}
}
interessante notar que a mesma estrutura lgica pode ser implementada usando as estruturas for
ou do...while:
Exemplo: As seguintes instrues so plenamente equivalentes:
i = 1;
do{
printf("%d",i);
i=i+1;
}while(i <= 10);
Obs.: Quando necessrio, podemos interromper a execuo dos comandos de uma estrutura de
repetio utilizando a instruo break. Como j vimos na lio anterior, a instruo break promove
o encerramento da estrutura, independentemente da condio de controle ser verdadeira ou falsa.
Exerccios de fixao
a) Elabore um programa em linguagem C que receba um nmero inteiro e mostre a tabuada de 1 a
10 deste nmero. Utilize a estrutura do...while. Grave o programa como EXERC6A.
b) Faa outro programa de tabuada, semelhante ao EXERC6A, usando agora a estrutura while.
Grave-o como EXERC6B.
c) Faa mais um programa, semelhante aos anteriores, utilizando a estrutura for. Grave-o como
EXERC6C.
26
Linguagem de Programao C
Lio 7 - Desvios
Desvios so instrues que desviam a seqncia de execuo dos comandos para um outro ponto
especificado do programa. Temos na linguagem C, basicamente, 2 tipos de desvios incondicionais:
goto (o mesmo que a instruo VaPara do Inter-S) e funo definida pelo usurio
(correspondente instruo SubRotina do Inter-S).
Algoritmo em Inter-S
// Programa: Lio7A
// Autor : <nome-do-aluno>
// Data : 99/99/9999
/* Programa Licao7A
Autor: <nome-do-aluno>
Data.: 99/99/9999
*/
#include <stdio.h>
#include <conio.h>
Rotina
Declare val, soma Numerico
Declare num Numrico
Limpa
Escreva "Digite valores:"
[Inicio]
Escreva "Valor: "
Receba val
Se val <= 0 Entao
VaPara Fim
FimSe
num = num + 1
soma = soma + val
VaPara Inicio
[Fim]
Escreva "Mdia: ", soma / num
FimRotina
main() {
float val, soma;
int num;
clrscr();
printf("Digite valores:");
inicio:
printf("\nValor:");
scanf("%f",&val);
if(val <= 0){
goto fim;
}
num = num + 1;
soma = soma + val;
goto inicio;
fim:
printf("Mdia: %f",soma/num);
}
Observe a existncia de dois rtulos no programa acima: Inicio e Fim (note que os rtulos devem
ser seguidos por dois-pontos : ). Para processar um desvio basta utilizar a instruo goto indicando
o rtulo do ponto para onde queremos desviar o fluxo.
27
Linguagem de Programao C
Desvio Funo
Na pgina 12 (lio 3) vimos o conceito de funes. Dissemos que funes so sub-programas
escritos em um local fora da rotina principal (main).
Vimos tambm que existem dois tipos de funes: de biblioteca e definidas pelo programador. Na
lio 3 estudamos algumas funes de biblioteca, mais precisamente da biblioteca matemtica
math.h. Agora estudaremos as funes definidas pelo programador, que tambm podem ser
chamadas de SubRotinas, pois so blocos de instrues definidos em um ponto fora da rotina
principal.
Diferente do que ocorre com um desvio do tipo VaPara, um desvio SubRotina sempre retorna ao
ponto de chamada aps a execuo das instrues definidas naquele procedimento.
O programa LICAO7B, demonstrado abaixo, ilustra a utilizao de duas funes. A primeira,
preparar_tela, um procedimento que no requer parmetros, ou seja, no necessita de nenhuma
informao para que as instrues nele existentes sejam executadas. A segunda, media, um
procedimento que requer dois parmetros para que seja executado. Observe o programa e em
seguida faremos os devidos comentrios:
Algoritmo em Inter-S
// Programa: Lio7B
// Autor : <nome-do-aluno>
// Data : 99/99/9999
/* Programa Licao7B
Autor: <nome-do-aluno>
Data.: 99/99/9999
*/
#include <stdio.h>
#include <conio.h>
Rotina
Declare valor1, valor2, y Numerico
//
Declare media Numerico
Processe Preparar_tela
Escreva "Digite o 1 valor:"
Receba valor1
Escreva "Digite o 2 valor:"
Receba valor2
Processe media
Escreva "Media: "
Escreva y
FimRotina
main() {
float valor1, valor2, y;
void preparar_tela();
float media(float, float);
preparar_tela();
printf("Digite o 1 valor:");
scanf("%f",&valor1);
printf("Digite o 2 valor:");
scanf("%f",&valor2);
y = media(valor1, valor2);
printf("Mdia: ");
printf("%f",y);
}
SubRotina Preparar_tela
Limpa
Escreva "Programa LICAO7B"
FimSubRotina
void preparar_tela() {
clrscr();
printf("Programa LICAO7B\n");
}
SubRotina Media
//
y = (a + b) / 2
//
FimSubRotina
Comentrios
No programa acima utilizamos 2 funes: preparar_tela e media. Observe que devemos declarar
estas funes assim como declaramos as variveis, com a diferena de que devemos indicar o tipo
de dado que a funo retornar e o tipo dos dados que serviro de parmetros:
28
Linguagem de Programao C
Observe a instruo abaixo:
void preparar_tela();
Esta instruo est declarando a funo preparar_tela, indicando que ela no retornar nenhum
dado, ou seja, uma funo vazia (void). Ao mesmo tempo informa que a funo no receber
nenhum parmetro, pois no existe nenhuma indicao entre os parnteses.
A instruo de declarao da funo media tem caractersticas diferentes:
float media(float, float);
O indicador de tipo float, utilizado no incio da instruo, informa que a funo retornar um dado
numrico de ponto flutuante. Os indicadores float que se encontram entre parnteses, indicam que a
funo receber dois parmetros do tipo numrico de ponto flutuante.
Aps a declarao das funes, estas podem ser chamadas em qualquer ponto dentro da rotina
principal (main). Observe a instruo de chamada da funo preparar_tela:
preparar_tela();
Esta instruo promover a execuo dos comandos existentes dentro da funo preparar_tela, os
quais esto definidos aps o encerramento da rotina principal. Aps a execuo destes comandos, o
programa retornar instruo subseqente chamada da funo.
Exerccios de fixao
a) Crie o programa EXERC7A utilizando como base o programa LICAO6C (pgina 25), substituindo
a estrutura de repetio for por desvios goto.
b) Elabore um programa para calcular e mostrar a mdia de 4 notas bimestrais, informadas pelo
teclado. Crie uma funo para o clculo. Grave o programa como EXERC7B.
29
Linguagem de Programao C
CAPTULO II
Trabalhando com tela em modo texto
Comandos para recebimento e exibio de dados em tela padro (modo texto)
Neste captulo estudaremos os comandos bsicos para o recebimento e sada de dados utilizando
tela em modo texto.
Como j sabido, o objetivo de todo e qualquer programa de computador o processamento dos
dados de entrada de forma a gerar os dados de sada. Como podemos perceber, os comandos de
entrada e sada de informaes sempre estaro presentes em nossos programas.
Nas outras apostilas deste site tivemos a oportunidade de utilizar as funes scanf (entrada de
dados) e printf (sada de dados). Nesta apostila estudaremos estas e outras funes para o
recebimento e exibio de dados, porm, antes de nos aprofundarmos neste estudo, necessrio
um conhecimento sobre as funes de vdeo (tela).
A linguagem C oferece dois modos para a exibio de dados em vdeo: modo texto e modo grfico.
No modo texto podemos utilizar apenas os caracteres pertencentes tabela ASCII* (letras, dgitos e
caracteres especiais), ao passo que no modo grfico podemos construir imagens mais sofisticadas
desenhando-as ponto-a-ponto ou utilizando funes prontas para o traado de linhas, crculos,
retngulos, etc.
* Tabela ASCII (Americam Standard Code for Information Interchange - Tabela de cdigo padro
americano para a troca de informaes) uma tabela adotada pelos fabricantes de
computadores que contm os cdigos internos para a representao dos caracteres (letras,
dgitos, sinais grficos, caracteres especiais e de controle).
. (6,3)
30
Linguagem de Programao C
Linguagem C
printf("Ola pessoal");
printf("%d",vl);
printf("Valor= %d",vl);
Note que nos dois ltimos exemplos a varivel vl uma varivel numrica, sendo assim, dentro
da constante alfanumrica const_char , devemos indicar o tipo de dado que a varivel armazena,
atravs dos caracteres %d. Estes caracteres so chamados de controle, pois indicam ao
compilador qual o formato do dado que ser escrito na tela. Por enquanto nossos exemplos
utilizaram apenas variveis numricas inteiras (nmeros inteiros) que tm o formato %d. Mais
adiante estudaremos os demais tipos de variveis suportados pela linguagem C.
Funo cprintf() - (color print formated) - escrita formatada em cores
Objetivo: Permite a escrita de informaes na tela, a partir da posio do cursor, usando cores.
Sintaxe.: cprintf(const_char,[lista_var])
Exemplos:
Algoritmo Inter-S
Escreva "Ola pessoal"
Escreva vl
Escreva "Valor=" , vl
Linguagem C
cprintf("Ola pessoal");
cprintf("%d",vl);
cprintf("Valor= %d",vl);
Note que a funo cprintf idntica funo printf, a diferena que cprintf aceita definies de
cores, mas para que a sada seja colorida necessrio definir as cores de fundo e de letra antes
de seu uso, isto feito atravs das funes textbackground() e textcolor(), conforme a seguinte
sintaxe:
textcolor(cor_de_letra);
textbackground(cor_de_fundo);
Onde cor_de_letra e cor_de_fundo so nmeros inteiros referentes s cores da palheta padro
(16 cores no modo texto). Cada cor representada por um nmero, conforme tabela abaixo:
Cor
Preto
Azul
Verde
Ciano
-
N
0
1
2
3
Cor
Vermelho
Magenta
Marrom
Cinza claro
N
4
5
6
7
Cor
Cinza escuro
Azul claro
Verde claro
Ciano claro
N
8
9
10
11
Cor
Vermelho claro
Magenta claro
Amarelo
Branco
N
12
13
14
15
As cores a partir da nmero 8, inclusive, no podem ser utilizadas como cor de fundo.
Para que a cor fique piscante, adicione 128 ao seu nmero. Veja exemplos:
31
Linguagem de Programao C
Exemplo 1:
textcolor(15);
textbackground(1);
cprintf(" Vichinsky ");
Escreve a expresso Vichinsky com letras brancas (cor n 15) sobre fundo azul (cor n 1)
Exemplo 2:
textcolor(142);
textbackground(4);
cprintf(" Alerta! ");
Escreve a expresso Alerta! com letras amarelas piscantes (cor n 14 + 128) sobre fundo
vermelho (cor n 4)
32
Linguagem de Programao C
Para dar uma esttica melhor moldura podemos utilizar o conjunto de caracteres semi-grficos
do computador. Estes caracteres no se encontram no teclado, mas podem ser extrados atravs
da combinao de um cdigo numrico com a tecla ALT. Observe que para a construo da
moldura utilizamos os seguintes caracteres: ponto (.), hfen (-), barra vertical (|) e apstrofo ('),
mas poderamos utilizar os caracteres semi-grficos, mostrados a seguir:
218 196 194 191
179
195
192
180
193 217
Exemplo de tela
Linguagem C
33
");
");
");
");
Linguagem de Programao C
Linguagem C
scanf("%d",&vl);
printf("Digite o valor");scanf("%d",&vl);
Note que vl uma varivel numrica, sendo assim, dentro da constante alfanumrica const_char ,
devemos indicar o tipo de dado que a varivel receber, atravs dos caracteres %d. Estes
caracteres so chamados de controle, pois indicam ao compilador qual o formato do dado que
ser recebido (lembre-se que as funes de entrada printf e cprintf tambm exigem esses
caracteres de controle).
No segundo exemplo acima, observe que utilizamos um texto que ser escrito na tela antes do
recebimento do valor. Em Inter-S a instruo feita atravs do comando Receba, informando-se
entre aspas o texto a ser apresentado na tela e o nome da varivel que receber o contedo
digitado, separando-os com vrgula (,). Em linguagem C este comando deve ser feito em duas
etapas: com a funo printf (ou cprintf) colocamos o texto que dever aparecer na tela e em
seguida utilizamos a funo scanf para receber o contedo da varivel.
Resumo
Vimos at agora as funes para entrada e sada de dados utilizadas no modo texto. Com elas
podemos construir telas sofisticadas utilizando os recursos de cores, posicionamento do cursor para
escrever ou receber informaes a partir de qualquer linha ou coluna da tela, etc.
Veja no quadro sinptico as funes estudadas:
34
Linguagem de Programao C
Funo
printf()
cprintf
textcolor()
textbackground()
gotoxy()
clrscr()
scanf()
Juntando tudo
Para ilustrar a aplicao das funes estudadas, vamos partir de um exerccio resolvido que solicita
dois dados pelo teclado e processa a soma dos mesmos, e ento, anexaremos a ele algumas
"benfeitorias" que o deixaro com um visual mais interessante.
Algoritmo em Inter-S
// Programa Soma.ALG
// Autor: Vichinsky
// Data: 01/01/2000
Rotina
main() {
Declare N1, N2, Soma Numericos
int n1, n2, soma;
Receba "Digite o primeiro nmero", N1
printf("Digite o 1 nmero");scanf("%d",&n1);
Receba "Digite o segundo Nmero", N2
printf("Digite o 2 nmero");scanf("%d",&n2);
Soma = N1 + N2
soma = n1 + n2;
Escreva "Soma", Soma
printf("Soma %d",soma);
FimRotina
}
Encontra-se aqui o algoritmo e o cdigo fonte do programa original SOMA.C. Se voc ainda no o
digitou, faa-o agora.
Nos prximos passos no mais apresentaremos o algoritmo em Inter-S, pois a lgica do
programa ser mantida. Incluiremos apenas as funes para melhorar o visual da aplicao, e
isto no altera a lgica, considera-se apenas um trabalho de embelezamento ou "perfumaria".
2 passo: Colocao de uma moldura
A primeira coisa que iremos fazer uma moldura que envolva as informaes de tela. Para isto
teremos que usar a funo de limpeza (clrscr) e a funo de posicionamento do cursor (gotoxy).
Usaremos tambm a funo cprintf em substituio printf.
35
Linguagem de Programao C
/* Programa SOMA.C
Autor: Vichinsky
Data.: 01/01/2000
*/
#include <stdio.h>
#include <conio.h>
main() {
int n1, n2, soma;
clrscr();
gotoxy(1,1);cprintf("
gotoxy(1,2);cprintf(" PROGRAMA SOMA.C
gotoxy(1,3);cprintf("
gotoxy(1,4);cprintf(" Digite o 1 numero:
gotoxy(1,5);cprintf(" Digite o 2 numero:
gotoxy(1,6);cprintf(" Soma..............:
gotoxy(1,7);cprintf("
gotoxy(23,4);scanf("%d",&n1);
gotoxy(23,5);scanf("%d",&n2);
soma = n1 + n2;
gotoxy(23,6);cprintf("%d",soma);
}
");
");
");
");
");
");
");
Note que inicialmente montada uma moldura envolvendo as informaes de tela: identificao
do programa e nome dos campos a serem preenchidos. Utilizamos a funo clrscr para a limpeza
de tela e em seguida um conjunto de instrues contendo 7 funes gotoxy que tm o objetivo de
posicionar o cursor na linha e coluna desejada para que a informao seja exibida atravs da
funo cprintf. Para a montagem da moldura deve-se empregar os caracteres semi-grficos
(aqueles que no existem no teclado) mantendo-se pressionada a tecla ALT e digitando-se o
cdigo correspondente :
Para obter este caracter
pressione ALT + 218
ALT+195
gotoxy(1,1);cprintf("
gotoxy(1,2);cprintf("
gotoxy(1,3);cprintf("
gotoxy(1,4);cprintf("
gotoxy(1,5);cprintf("
gotoxy(1,6);cprintf("
gotoxy(1,7);cprintf("
ALT+196
ALT+191
ALT+180
");
");
");
");
");
");
");
PROGRAMA SOMA.C
Digite o 1 numero:
Digite o 2 numero:
Soma..............:
ALT+192
ALT+179
ALT+217
Observe tambm que antes do recebimento dos dados com a funo scanf, devemos posicionar
o cursor na coluna e linha desejadas:
gotoxy(23,4);scanf("%d",&n1);
gotoxy(23,5);scanf("%d",&n2);
O contedo de n1 ser solicitado na linha 4 a partir da coluna 23. O contedo de n2 ser
solicitado na linha 5 a partir da coluna 23.
36
Linguagem de Programao C
");
");
");
");
");
");
");
Definimos o texto branco (cor n 15) e o fundo azul (cor n 1). As funes de cores foram
colocadas aps a funo de limpeza de tela (clrscr), mas voc poder coloc-las antes. Desta
forma toda a tela ficar azul, e no apenas a rea da moldura. Faa um teste!
Note que aps a definio todas a informaes escritas com a funo cprintf assumiro as cores
especificadas. Mesmo aps o programa ser encerrado estas cores sero mantidas.
37
Linguagem de Programao C
CAPTULO III
Trabalhando com tela em modo grfico
Comandos para utilizao da tela em modo grfico / funes da biblioteca grfica.
Neste captulo estudaremos os comandos e funes necessrias para a elaborao de programas
que trabalhem com telas no modo grfico.
No captulo anterior estudamos as funes de tela em modo texto. Vimos que a tela composta por
uma matriz de 80 colunas por 25 linhas (em seu estado padro), e que podemos exibir apenas os
caracteres da tabela ASCII. Quando voc trabalhar com o MS-DOS (prompt do MS-DOS) observe
que os caracteres (letras, nmeros, sinais de pontuao, etc) so formados por um conjunto de
pontos. Por exemplo, a letra A, se ampliada, ter o seguinte aspecto:
....
.
.
.
.
.
.
.....
.
Cada um dos pontos que compe um caracter chamado de pixel, e no modo texto ns no temos
controle sobre eles, pois so colocados automaticamente quando pedimos a exibio do caracter.
por este motivo que no conseguimos obter desenhos ou figuras diferentes no modo texto.
Como podemos, ento, manipular os pixels dentro de um programa para criar desenhos?
A resposta muito simples: trabalhando no modo grfico!
Existem vrias formas para se trabalhar com telas grficas na linguagem C, algumas delas requerem
conhecimentos tcnicos mais aprofundados para que o programador construa sua prpria biblioteca
de funes grficas, porm, para as nossas atividades, vamos trabalhar com os recursos oferecidos
pelas bibliotecas padres da linguagem (aquelas que j vm prontas).
A tela no modo grfico no trabalha com linhas e colunas como acontece em modo texto, mas sim
com pontos horizontais e verticais, constituindo uma matriz. Os pontos, ou pixels (termo tcnico
utilizado), so referenciados atravs de dois eixos: x e y, assim como no plano cartesiano:
Origem
(0,0)
y
Representao da tela grfica. Observe que o ponto origem (coordenada 0,0) encontra-se no canto
esquerdo superior do vdeo. O eixo y apresenta uma escala crescente de cima para baixo (no
existem negativos)
A quantidade de pontos suportados por uma tela grfica depende do tipo de adaptador instalado no
computador. Os adaptadores (placas de vdeo) mais comuns so: CGA (Adaptador Grfico
Colorido), EGA (Adaptador Grfico Estendido) e VGA (Matriz Grfica de Vdeo). Os computadores
atuais so equipados, em sua grande maioria, com adaptadores VGA.
No iremos nos aprofundar nestes detalhes tcnicos, mas importante que voc saiba qual o
adaptador grfico instalado no computador que executar os seus programas, para que reconhea a
quantidade de pontos (resoluo) suportada por ele.
38
Linguagem de Programao C
Para que seus programas acessem a tela grfica, voc deve informar o tipo de adaptador utilizado e
o modo de resoluo, pois cada adaptador pode trabalhar basicamente com 3 modos de resoluo
(baixa, mdia ou alta). Quanto maior a resoluo maior o nmero de pontos suportados.
Voc deve estar ansioso para saber como colocar estas informaes no programa. Muito bem, o
primeiro passo incluir uma referncia ao arquivo graphics.h no cabealho de seu programa:
#include <graphics.h>
Em seguida, dentro da rotina principal (main), voc deve inserir uma seqncia de instrues para
fazer a iniciao do modo grfico. Estas instrues devem aparecer logo aps s declaraes das
variveis e constantes utilizadas:
int gdriver = VGA, gmode = VGAHI, errorcode;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk) {
printf("Erro: %s\n", grapherrormsg(errorcode));
exit(1);
}
Parece coisa de louco, no acha? Mas no se assuste, as instrues acima so de uma
simplicidade muito grande, pois estamos utilizando algumas funes previamente preparadas pelo
fabricante do Turbo C. Vamos aos esclarecimentos:
Inicialmente estamos declarando duas constantes (gdriver e gmode) e uma varivel errorcode
:
int gdriver = VGA, gmode = VGAHI, errorcode;
A constante gdriver est recebendo o contedo de VGA, que na realidade tambm uma
constante definida dentro do arquivo graphics.h, que tem como contedo o cdigo interno
que representa o adaptador grfico VGA.
A constante gmode est recebendo o contedo de VGAHI (constante que contm o cdigo
que representa o modo de resoluo alta - VGA High)
A varivel errorcode est reservada para receber um cdigo de situao, que ser analisado
nas instrues subseqentes.
Aps o processo de iniciao do modo grfico, devemos verificar se a ao foi bem sucedida,
ou seja, se a funo initgraph conseguiu reconhecer o adaptador e o modo de resoluo
definidos. Para esta verificao devemos atribuir varivel errorcode o resultado gerado pela
funo graphresult :
errorcode = graphresult();
A funo graphresult retorna o resultado da iniciao do modo grfico atravs de um cdigo
de situao, o qual ser avaliado pelas seguintes instrues:
39
Linguagem de Programao C
if (errorcode != grOk) {
printf("Erro: %s\n", grapherrormsg(errorcode));
exit(1);
}
Atravs de uma estrutura de deciso estamos perguntando se o contedo da varivel
errorcode diferente do contedo da constante grOk: if (errorcode != grOk)
A constante grOk est definida no arquivo graphics.h e contm o cdigo que indica o sucesso
da iniciao do modo grfico. Para perguntar se errorcode diferente utilizamos o operador
relacional != (exclamao e sinal de igualdade), que em linguagem C corresponde a
"diferente" ou "no igual".
Se o contedo de errorcode for diferente de grOk ento houve um erro na iniciao, neste
caso o programa deve ser encerrado. Observe que antes do encerramento ser colocada
uma informao atravs da funo printf :
printf("Erro: %s\n", grapherrormsg(errorcode));
Esta instruo escrever na tela a expresso "Erro" e a descrio do erro encontrado.
Para finalizar o programa estamos utilizando a funo exit(1). O nmero 1 entre parnteses
indica que o programa foi encerrado mediante uma ocorrncia de erro.
Voc percebeu que apesar da aparncia assustadora as instrues para se iniciar a tela grfica so
bastante simples: basta saber qual o adaptador grfico que estar utilizando e qual o modo de
resoluo desejado; coloca-se estas informaes nas constantes gdriver (adaptador) e gmode
(modo). A tabela a seguir mostra alguns dos adaptadores que voc poder usar e os modos de
resoluo suportados por eles:
Adaptador
EGA
EGA
VGA
VGA
VGA
Resoluo
Baixa (Low)
Alta (High)
Baixa (Low)
Media (Med)
Alta (High)
Valor de
gdriver
EGA
EGA
VGA
VGA
VGA
Valor de
gmode
EGALO
EGAHI
VGALO
VGAMED
VGAHI
Quantidade de
pontos
640 x 200
640 x 350
640 x 200
640 x 350
640 x 480
Muito bem! Com o contedo terico visto at agora temos como iniciar a construo de um
programa grfico, mas do que adianta acessar a tela grfica se ainda no sabemos como enviar
informaes para ela?
Para comear vamos construir um programa que desenhe um crculo amarelo no centro da tela,
considerando o adaptador VGA no modo de alta resoluo (VGAHI):
/* Programa GRAF1.C - Desenha um crculo amarelo */
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
main(){
int gdriver = VGA, gmode = VGAHI, errorcode;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk) {
printf("Erro: %s\n", grapherrormsg(errorcode));
exit(1);
}
setcolor(14); circle(320,240,100);
getch();
closegraph();
exit(0);
}
40
Linguagem de Programao C
Explicaes
Na tabela abaixo estamos reproduzindo o programa GRAF1.C com as devidas explicaes para
cada uma das linhas de instrues:
Linhas de instrues
/* Programa GRAF1.C -Desenha um crculo */
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
main( ) {
int gdriver = VGA, gmode = VGAHI, errorcode;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk) {
printf("Erro: %s\n", grapherrormsg(errorcode));
exit(1);
}
setcolor(14); circle(320,240,100);
getch();
closegraph();
exit(0);
}
Explicaes
Linha de identificao (comentrio)
Referncia ao arquivo graphics.h (biblioteca)
Referncia ao arquivo stdio.h (biblioteca)
Referncia ao arquivo conio.h (biblioteca)
Incio da rotina principal
Declarao das constantes e variveis
Iniciao do modo grfico
Obteno do resultado da iniciao
Verifica se houve erro na iniciao
Se houve erro escreve uma mensagem na tela e...
...encerra o programa
Finaliza a verificao
Ajusta a cor para amarelo (14) e desenha o crculo
Gera uma pausa at que uma tecla seja pressionada
Fecha o modo grfico
Encerra o programa normalmente
Fim da rotina principal
Este programa, simplesmente, desenha um crculo no centro da tela grfica. A instruo responsvel
pelo desenho :
setcolor(14); circle(320,240,100);
Atravs da funo setcolor determinamos a cor do desenho, que neste caso amarelo (cor nmero
14). Em seguida, atravs da funo circle, desenhamos o crculo. Observe que entre os parnteses
da funo existem trs parmetros: 320, 240, 100. Os dois parmetros iniciais indicam a coordenada
da tela que ser o centro do crculo (x=320 e y=240) e o terceiro parmetro indica o tamanho do raio
medido em pontos grficos (pixels). Observe a representao abaixo:
0
320
640
480
Y
Note que o centro do crculo encontra-se justamente no centro da tela, ou seja, na posio 320 do
eixo X e 240 do eixo Y (lembre-se que no padro VGA de alta resoluo temos 640 pontos no eixo X
e 480 pontos no eixo Y, a coordenada central do crculo utiliza justamente a metade desses valores).
Para aumentar ou diminuir o tamanho do crculo basta alterar o valor do raio, aumentando-o ou
diminuindo-o respectivamente.
41
Linguagem de Programao C
Com este pequeno programa exemplo j temos uma noo de como utilizar o modo grfico em
nossas aplicaes. Porm, antes de prosseguirmos, vejamos um resumo das funes grficas que
iremos utilizar em nossos futuros programas.
setcolor(c)
setfillstyle(p,c)
bar(x1,y1,x2,y2)
fillellipse(x,y,r1,r2)
Desenha uma elipse preenchida com a cor definida pela funo setfillstyle,
com centro na coordenada x-y, com tamanho do maior raio definido por r1 e
menor raio definido por r2.
circle(x,y,r)
rectangle(x1,y1,x2,y2)
line(x1,y1,x2,y2)
putpixel(x,y,c)
sprintf(s,f,v)
Envia para a varivel string (s) um texto formatado (f) que pode conter
valores de variveis (v).
outtextxy(x,y,s)
closegraph()
Nota: As referncias em azul indicam os valores dos parmetros requeridos pela funo. Estes
valores podem ser constantes ou variveis. Por exemplo, para desenhar um retngulo a partir da
coordenada 100,50 at a coordenada 500,430 podemos usar uma das seguintes instrues:
rectangle(100,50,500,430);
ou
x1=100; y1=50; x2=500; y2=430;
rectangle(x1,y1,x2,y2);
Em ambos os casos teremos o seguinte resultado:
X1=100
Y1=50
Y2=430
X2=500
42
Linguagem de Programao C
Observe que para escrever o texto "Ola amigos da Linguagem C" utilizamos a funo outtextxy:
outtextxy(10,20,"Ola amigos da Linguagem C");
Neste caso no houve necessidade de se utilizar a funo sprintf, pois a informao a ser escrita
no contm variveis. Por outro lado, para exibir o contedo da varivel var preciso que se prepare
a informao atravs da funo sprintf :
var=35;
sprintf(mensagem, "Valor da varivel var: %d", var);
outtextxy(10,50,mensagem);
Note que a funo sprintf coloca na varivel caracter mensagem o texto "Valor da varivel" ,
agregando o contedo da varivel var. Em seguida utilizamos a funo outtextxy para exibir o
contedo de mensagem a partir da coordenada 10,50. (Observe que a varivel mensagem
declarada no incio da rotina atravs da instruo char mensagem[80];).
43
Linguagem de Programao C
Ao
Diminui 1 da varivel y e coloca um ponto na nova coordenada.
Soma 1 na varivel y e coloca um ponto na nova coordenada.
Soma 1 da varivel x e coloca um ponto na nova coordenada.
Diminui 1 da varivel x e coloca um ponto na nova coordenada.
Ajusta a cor para 0 (preto)
Ajusta a cor para 1 (azul)
Ajusta a cor para 2 (verde)
Ajusta a cor para 3 (ciano)
Encerra o programa
44
Linguagem de Programao C
if (op=='K'){
if (x>0) x=x-1;
putpixel(x,y,cor);
}
if (op=='0'){cor=0;}
if (op=='1'){cor=1;}
if (op=='2'){cor=2;}
if (op=='3'){cor=3;}
if (op=='*'){closegraph(); exit(0);}
goto volta;
}
Programa exemplo 2: Cores e figuras: Demonstra o uso de cores e desenho de figuras
O programa abaixo, aps iniciar o modo grfico e preparar as variveis de trabalho, faz uma
demonstrao de cores, exibindo todas as cores possveis neste modo. Em seguida apresenta um
menu que permite a seleo de 3 opes. Analise-o:
/* Programa: CORES.C - Demonstrao das cores */
#include <graphics.h>
#include <stdio.h>
#include <conio.h>
main(){
int i;
char op;
char mensagem[80];
int gdriver = VGA, gmode = VGAHI, errorcode;
initgraph(&gdriver, &gmode, "");
errorcode = graphresult();
if (errorcode != grOk) {
printf("Erro: %s\n", grapherrormsg(errorcode));
exit(1);
}
cleardevice();
setcolor(1); outtextxy(10, 1, "Cor 1");
circle(70,5,4);
setcolor(2); outtextxy(10, 16, "Cor 2"); circle(70,20,4);
setcolor(3); outtextxy(10, 31, "Cor 3"); circle(70,35,4);
setcolor(4); outtextxy(10, 46, "Cor 4"); circle(70,50,4);
setcolor(5); outtextxy(10, 61, "Cor 5"); circle(70,65,4);
setcolor(6); outtextxy(10, 76, "Cor 6"); circle(70,80,4);
setcolor(7); outtextxy(10, 91, "Cor 7"); circle(70,95,4);
setcolor(8); outtextxy(10, 106, "Cor 8"); circle(70,110,4);
setcolor(9); outtextxy(10, 121, "Cor 9"); circle(70,125,4);
setcolor(10);outtextxy(10, 136, "Cor 10");circle(70,140,4);
setcolor(11);outtextxy(10, 151, "Cor 11");circle(70,155,4);
setcolor(12);outtextxy(10, 166, "Cor 12");circle(70,170,4);
setcolor(13);outtextxy(10, 181, "Cor 13");circle(70,185,4);
setcolor(14);outtextxy(10, 196, "Cor 14");circle(70,200,4);
setcolor(15);outtextxy(10, 211, "Cor 15");circle(70,215,4);
outtextxy(10,250,"Tecle algo para continuar");
getch();
menu:
cleardevice();
setcolor(14);
outtextxy(250, 5, "Menu de opcoes");
setcolor(3);
outtextxy(220, 20, "[1] Desenho de circulos");
45
Linguagem de Programao C
46
*/
*/
*/
*/
*/
*/
*/
*/
*/
*/
Linguagem de Programao C
Atividades complementares
Digite os programas apresentados neste captulo (GRAF1.C, GRAF2.C, LIVRE.C, CORES.C e
FIGURAS.C). Veja o funcionamento dos mesmos e faa alteraes a seu gosto, como por exemplo:
mudar as cores, alterar o tamanho das figuras, modificar os textos, etc. importante que voc
compreenda o funcionamento das funes estudadas, e a prtica o melhor caminho para isso.
Observao: Para que um programa grfico possa ser executado, preciso que o arquivo
EGAVGA.BGI esteja presente na mesma pasta (diretrio) onde se encontra o
programa. Este arquivo contm um conjunto de funes especficas para que o
programa reconhea o modo grfico (este arquivo faz parte do pacote Turbo C). No
nosso caso no teremos problema, pois o arquivo EGAVGA.BGI est presente na
pasta TC201, mas se voc quiser copiar um programa grfico para um computador
que no possua o Turbo C, no esquea de copiar tambm o arquivo EGAVGA.BGI.
47
Linguagem de Programao C
CAPTULO IV
Arquivos de dados
Funes de biblioteca para a manipulao de arquivos em disco.
Neste captulo estudaremos as funes bsicas da linguagem C para a manipulao de dados em
arquivos gravados em disco.
Os programas vistos at agora trabalham com informaes que so armazenadas em variveis de
memria. As variveis conservam seus contedos somente enquanto o programa est sendo
executado, quando o programa finalizado, todos os dados manipulados por ele so perdidos.
Porm, existem situaes em que necessitamos armazenar as informaes de forma permanente,
para que no sejam perdidas quando o programa for encerrado. Vamos imaginar que voc queira
construir um programa para armazenar os dados de seus amigos - uma agenda telefnica de
amigos. Para este feito ser necessrio o armazenamento permanente das informaes, pois voc
no deseja perd-las quando o programa for encerrado. Como fazer isto?
Bem, podemos comear com uma rotina que recebe as informaes dos amigos:
/* Programa AGENDA.C */
#include<stdio.h>
#include<conio.h>
main(){
int codigo;
char nome[30];
char telefone[15];
char resp;
inicio:
clrscr();
printf("Digite o codigo do amigo..: ");scanf("%d",&codigo);
printf("Digite o nome do amigo....: ");scanf("%s",nome);
printf("Digite o telefone do amigo: ");scanf("%s",telefone);
printf("Continua (S/N)? ");scanf("%s",&resp);
if (resp=='N' resp=='n') {
exit(0);
}
goto inicio;
}
O programa acima (AGENDA.C) comea com a declarao de 4 variveis: codigo, nome, telefone e
resp. Em seguida existe um rtulo denominado inicio, que indica o ponto onde se inicia o processo
de recebimento dos dados. Os dados codigo, nome e telefone do amigo so recebidos pelo teclado
atravs das funes scanf. Em seguida a mensagem "Continua (S/N)?" mostrada na tela atravs
da funo printf e o dado resp recebido pelo teclado. Se o contedo de resp for N ou n o
programa ser encerrado, caso contrrio haver um desvio para o rtulo inicio (goto inicio;),
repetindo-se o processo de recebimento dos dados.
Se voc digitar e compilar esta rotina perceber que o funcionamento dela perfeito: ela receber
as informaes pelo teclado e as armazenar nas variveis declaradas. Mas existir um problema:
as variveis conservaro seus contedos at que outro contedo seja atribudo a elas, ou seja, esta
rotina no faz o armazenamento permanente dos dados recebidos, portanto, no serve para
absolutamente nada!
Qual a sada para que os dados digitados sejam armazenados permanentemente?
Armazenando-os em um arquivo de dados!
Um arquivo de dados um conjunto de informaes armazenado em um meio magntico ou ptico
(disquete, disco rgido, fita, Cd, etc.) onde permanecer gravado e disponvel para quaisquer futuras
utilizaes.
48
Linguagem de Programao C
Para ilustrar este conceito, vamos imaginar que a nossa agenda de amigos tenha as seguintes
informaes:
Cdigo
1
2
3
4
5
Agenda de amigos
Nome
Antonio Laurentino Miguel
Bianco Branco de Assis Moreira
Juarez Joo Columbiano Mattos
Pedro Pedreira Rocha
Z Man
Telefone
1234-5678
8765-4321
9999-7777
0001-1110
1000-1234
Estas informaes, da forma que esto estruturadas, caracterizam um arquivo de dados. Podemos
atravs disto tirar algumas definies:
-
Um arquivo de dados deve possuir um nome. No nosso caso o nome "Agenda de amigos",
mas em linguagem C o nome deve possuir no mximo 8 (oito) caracteres e um sufixo com no
mximo 3 (trs), vamos usar "AGENDA.DAT" (o sufixo deve aparecer aps um ponto final e
deve informar o tipo de arquivo; estamos utilizando a expresso DAT, que uma abreviao
de data - dado em ingls - mas poderamos utilizar qualquer sufixo desejado).
Um arquivo de dados deve possuir uma estrutura bem definida, observe as linhas e colunas,
que nos do a idia de uma matriz ou tabela. Cada uma da linhas armazena os dados de um
amigo, e cada coluna indica um dado (cdigo, nome ou telefone).
Tecnicamente chamamos as linhas de registros e as colunas de campos.
Todos os registros possuem os mesmos campos e, portanto, o mesmo tamanho.
Z Man
Campo 1
(cdigo)
1000-1234
Campo 2 (nome)
Campo 3 (telefone)
Registro
J temos uma noo do que um arquivo de dados, vamos ver agora como fazer com que os dados
dos nossos amigos sejam gravados em um arquivo.
49
Linguagem de Programao C
Em seguida devemos declarar a estrutura do arquivo, ou seja, devemos definir os campos que o
arquivo possuir. No nosso exemplo do arquivo AGENDA.DAT (agenda de amigos) temos os
campos: codigo, nome e telefone, portanto, devemos construir uma estrutura que os defina:
struct {
int codigo;
char nome[30];
char telefone[15];
} registro;
Observe que devemos utilizar o comando struct e entre chaves indicar os tipos e os nomes de cada
um dos campos do arquivo. Aps o fechamento da chave devemos indicar o nome da estrutura, que
neste exemplo registro, tambm bastante sugestivo, pois na realidade a estrutura construda
corresponde ao registro do arquivo AGENDA.DAT.
Desta forma o nosso programa AGENDA.C dever possuir as seguintes linhas iniciais:
/* Programa AGENDA.C */
#include<stdio.h>
#include<conio.h>
FILE *arquivo;
struct {
int codigo;
char nome[30];
char telefone[15];
}registro;
main(){
...
50
Linguagem de Programao C
A segunda linha s ser executada se o arquivo no pde ser aberto. Observe que esta linha
semelhante primeira, com a diferena na expresso que define o tipo de abertura: "wb".
Na realidade esta instruo faz a tentativa de criao do arquivo e ao mesmo tempo verifica
se a criao foi bem sucedida, comparando o ponteiro arquivo com o valor NULL (nulo). Se o
ponteiro for nulo significa que o arquivo tambm no pode ser criado, neste caso no h nada
mais a fazer, a no ser finalizar o programa.
A sexta linha, assim como a quinta, apenas encerra a estrutura condicional iniciada na
primeira linha.
Em sntese, a rotina apresentada simplesmente verifica se o arquivo pode ser aberto, criando-o caso
ele no exista, ou finalizando o programa caso esteja danificado.
Agora podemos abrir o arquivo definitivamente, com a certeza de que haver sucesso na operao.
Usaremos o seguinte comando:
arquivo=fopen("AGENDA.DAT","r+b")
A funo fopen a responsvel pela abertura do arquivo. Devemos informar, entre parnteses, o
nome do arquivo e o modo de acesso: "AGENDA.DAT" o nome e "r+b" determina que o modo de
acesso leitura/escrita, isto , o arquivo poder ser lido e escrito (como um caderno).
Veja na pgina seguinte como ficar o incio do programa aps a incluso destas instrues:
51
Linguagem de Programao C
/* Programa AGENDA.C */
#include<stdio.h>
#include<conio.h>
FILE *arquivo;
struct {
int codigo;
char nome[30];
char telefone[15];
}registro;
main() {
int wcodigo;
char wnome[30];
char wtelefone[15];
char resp;
if((arquivo=fopen("AGENDA.DAT","r+b"))==NULL) {
if((arquivo=fopen("AGENDA.DAT","wb"))==NULL) {
printf("Erro de abertura");
exit(1);
}
}
fclose(arquivo);
arquivo=fopen("AGENDA.DAT","r+b");
...
Note que nas declaraes os nomes das variveis esto sublinhados. Fizemos este destaque para
indicar que os nomes foram alterados para no entrarem em conflito com os nomes dos campos
definidos na estrutura do arquivo (struct). Agora as variveis wcodigo, wnome e wtelefone sero as
variveis que recebero os dados pelo teclado, e codigo, nome e telefone sero os campos do
arquivo de dados.
Terceiro passo: Escrita dos dados
No primeiro passo realizamos a preparao do ponteiro e a definio da estrutura do arquivo de
dados, ou seja, definimos um nome para referenciar o arquivo (nome do ponteiro) e definimos os
nomes e tipos dos campos que sero gravados (codigo, nome e telefone).
No segundo passo realizamos a abertura do arquivo de dados.
Agora falta apenas saber como escrever os dados no arquivo. Para isto, devemos receber as
informaes pelo teclado e transferi-las para o arquivo. Vamos utilizar uma estrutura de repetio
que ser iniciada com o rtulo incio, veja como ficar o algoritmo em Inter-S deste trecho:
[inicio]
Limpa
Receba "Digite o codigo do amigo..: ", wcodigo
Receba "Digite o nome do amigo....: ", wnome
Receba "Digite o telefone do amigo: ", wtelefone
Codigo = wcodigo
Nome = wnome
Telefone = wtelefone
Grave item[codigo] AGENDA.DAT
Receba "Continua (S/N)? ", resp
Se resp = 'N' ou resp = 'n' entao
Interrompa
FimSe
Vapara inicio
52
Linguagem de Programao C
Observe que no algoritmo, aps o recebimento dos dados pelo teclado, estamos atribuindo aos
campos do registro os contedos recebidos pelas variveis:
Codigo = wcodigo
Nome = wnome
Telefone = wtelefone
Em linguagem C, para referenciar um campo devemos informar o nome do registro (que no nosso
caso o prprio nome registro - definido na estrutura struct) seguido por um ponto final e o nome do
campo. Exemplo: registro.codigo.
Em seguida devemos gravar o registro no arquivo, usamos em Inter-S o seguinte comando:
Grave Item[codigo] AGENDA.DAT
A figura abaixo ilustra o processo de gravao, observe-a:
registro
a) os dados so digitados
pelo teclado e armazenados
nas variveis wcodigo,
wnome e wtelefone
wcodigo
codigo
wnome
nome
wtelefone
telefone
Linguagem de Programao C
arquivo=fopen("AGENDA.DAT","r+b");
inicio:
clrscr();
printf("Digite o codigo do amigo..: ");scanf("%d",&wcodigo);
printf("Digite o nome do amigo....: ");scanf("%s",wnome);
printf("Digite o telefone do amigo: ");scanf("%s",wtelefone);
registro.codigo = wcodigo;
strcpy(registro.nome, wnome);
strcpy(registro.telefone, wtelefone);
fwrite(®istro, sizeof(registro), 1, arquivo);
printf("Continua (S/N)? ");scanf("%s",&resp);
if (resp=='N' resp=='n') {
fclose(arquivo);
exit(0);
}
goto inicio;
}
Observando o programa acima voc encontrar algumas funes que, a princpio, nos parecem
bastante estranhas (so as funes que destacamos em azul). Vamos analis-las:
strcpy(registro.nome, wnome);
A funo strcpy faz com que a varivel caracter indicada aps a abertura do parntese receba o
contedo da varivel que aparece depois da vrgula. Neste caso registro.nome receber o
contedo de wnome. A instruo equivalente em Inter-S : nome = wnome.
strcpy exigida apenas para atribuies de variveis do tipo string (caracter), para variveis
numricas utiliza-se apenas o sinal de igualdade (=), exemplo: registro.codigo=wcodigo.
fwrite(®istro, sizeof(registro), 1, arquivo);
A funo fwrite faz a gravao (escrita) dos dados no arquivo. Precisamos informar, entre os
parnteses, o nome da varivel que contm os dados (precedida do ponteiro &), o tamanho desta
varivel (sizeof), a quantidade de registros que sero gravados e o nome do ponteiro do arquivo:
®istro..........................Nome da varivel (estrutura) que contm os dados
sizeof(registro) ...........Tamanho da varivel (estrutura) que contm os dados
1...........................................Quantidade de registros a gravar
arquivo ..............................Nome do ponteiro que identifica o arquivo a ser gravado
fclose(arquivo);
A funo fclose realiza o fechamento do arquivo identificado pelo ponteiro entre parnteses.
Concluindo
A rotina de gravao do programa AGENDA.C est completa. Digite o programa e veja o seu
funcionamento. Mesmo que tenha digitado corretamente, voc notar um grande problema durante a
digitao dos dados, a saber:
Quando voc digita um espao no nome do amigo, o programa colocar o texto que vem aps o
espao como contedo da prxima varivel, gerando uma baguna na lgica do programa. Tente
fazer isso: digite Ze Mane como nome do amigo e perceba que o telefone no ser solicitado, pois o
programa colocar o Ze na varivel wnome e Mane na varivel wtelefone.
Como resolver este problema?
Perceba ento que o espao funciona como um "delimitador" da informao digitada. Para sanar
este problema, faa com que a funo scanf reconhea o espao como um caracter normal.
54
Linguagem de Programao C
Para isto devemos alterar a rotina de recebimento, implementando alguns itens. Observe como ela
ficar:
printf("Digite o codigo do amigo..: ");scanf("%d",&wcodigo);
fflush(stdin);
printf("Digite o nome do amigo....: ");scanf("%30[A-z ]",wnome);
fflush(stdin);
printf("Digite o telefone do amigo: ");scanf("%15s",wtelefone);
fflush(stdin);
Devemos colocar a funo fflush(stdin) aps as instrues de recebimento
(scanf). Esta funo processa o "descarregamento" da memria do teclado, de
maneira que no reste nenhuma informao "perdida", que poderia ser agregada
indevidamente ao contedo da varivel do prximo scanf.
Para o recebimento dos dados caracteres estamos utilizando um controle um
pouquinho diferente. No programa original estvamos usando a seqncia "%s" para
indicar que a varivel wnome do tipo caractere: scanf("%s",wnome); , agora
estamos usando o controle "%30[A-z ]" : scanf("%30[A-z ]",wnome); . O nmero
30 informa que o tamanho da varivel de 30 caracteres; as letras A-z entre os
colchetes informam que s sero aceitos caracteres de A (maisculo) z
(minsculo), ou seja, durante a digitao do nome do amigo sero aceitas apenas
letras maisculas e/ou minsculas; existe ainda um espao aps o z (antes do
fechamento do colchete), este espao indica que tambm sero aceitos espaos em
branco no nome do amigo. Com estas alteraes o seu programa poder receber
qualquer nome e sobrenome, inclusive o Z Man!
IMPORTANTE: Espero que neste ponto voc j tenha digitado e compilado o programa
AGENDA.C, e observado o seu funcionamento com as implementaes citadas acima. Mas se voc
ainda no fez isso, sugiro que o faa antes de prosseguir, pois os conceitos que veremos a partir
daqui estaro nele baseados.
55
Linguagem de Programao C
Rotina
Declare arquivo(AGENDA.DAT) chave(codigo)
Registro ( codigo Numerico [4]
nome caractere [30]
telefone caractere [15])
Abra AGENDA.DAT
Topo
[Inicio]
Leia Proximo registro Agenda.dat
Se nao FDA entao
Escreva "Codigo do amigo", codigo
Escreva "Nome do amigo", nome
Escreva "Telefone do amigo", telefone
Vapara Inicio
FimSe
Feche Agenda.dat
FimRotina
Note que foram introduzidos alguns elementos novos neste algoritmo, como por exemplo a
declarao da estrutura do registro, que estamos colocando logo aps o incio da rotina principal.
Esta declarao corresponde instruo struct (discutida na pgina 49).
A instruo Abra AGENDA.DAT corresponde ao conjunto de instrues para a abertura do arquivo
de dados.
Em seguida aparece o comando Topo, que faz com que o ponteiro de leitura seja posicionado no
primeiro registro do arquivo (topo).
O rtulo [Inicio] indica o ponto de retorno para a leitura do arquivo. Em seguida feita uma leitura no
arquivo (Leia Proximo registro Agenda.data). Esta instruo obtm os dados de um registro
apenas, que correspondem ao dados de um amigo.
Perguntamos em seguida se no final de arquivo: Se nao FDA entao, se a resposta for afirmativa
ento devemos escrever os dados do amigo na tela e voltar para ler o prximo registro (Vapara
Inicio), caso contrrio, devemos fechar o arquivo (Feche Agenda.dat) e encerrar a rotina, pois o final
do arquivo foi atingido.
Veja a seguir o algoritmo escrito em linguagem C :
/* Programa LEAGENDA.C */
#include<stdio.h>
#include<conio.h>
FILE *arquivo;
struct {
int codigo;
char nome[30];
char telefone[15];
}registro;
main() {
if((arquivo=fopen("AGENDA.DAT","r+b"))==NULL) {
if((arquivo=fopen("AGENDA.DAT","wb"))==NULL) {
printf("Erro de abertura");
exit(1);
}
}
fclose(arquivo);
arquivo=fopen("AGENDA.DAT","r+b");
clrscr();
gotoxy(20,1);cprintf("Leitura do arquivo AGENDA.DAT");
56
Linguagem de Programao C
rewind(arquivo);
inicio:
if (fread(®istro, sizeof(registro), 1, arquivo) == 1) {
gotoxy(10,3);cprintf("Codigo do amigo..: %d",registro.codigo);
gotoxy(10,4);cprintf("Nome do amigo....: %-30s",registro.nome);
gotoxy(10,5);cprintf("Telefone do amigo: %15s",registro.telefone);
gotoxy(10,7);cprintf("Tecle algo para continuar ");
getch();
goto inicio;
}
fclose(arquivo);
}
57
Linguagem de Programao C
Atividades complementares
Sofistique os programas AGENDA.C e LEAGENDA.C, colocando cores e molduras. Torne-os mais
agradveis quanto esttica.
58
Linguagem de Programao C
59
Linguagem de Programao C
Propsito: A funo sound() ativa o alto-falante do PC com uma freqncia freq (Hz). A funo
delay() realiza uma pausa (aguarda intervalo de tempo) de durao tempo (milisegundos). A
funo nosound() desativa o alto-falante.
60
Linguagem de Programao C
Hex.
Controle
00h
NUL (Null)
01h
02h
03h
04h
05h
ENQ (Enquiry)
06h
ACK (Acknowledge)
07h
BEL (Bell)
08h
BS (Backspace)
09h
HT (Horizontal Tab)
10
0Ah
LF
11
0Bh
VT (Vertical Tab)
12
0Ch
FF (Form Feed)
13
0Dh
CR (Carriage Return)
14
0Eh
SO (Shift Out)
15
0Fh
SI (Shift In)
16
10h
17
11h
(Line Feed)
61
Linguagem de Programao C
18
12h
19
13h
20
14h
21
15h
22
16h
23
17h
24
18h
CAN (Cancel)
25
19h
EM (End of Media)
26
1Ah
SUB (Substitute)
27
1Bh
ESC (Escape)
28
1Ch
FS (File Separator)
29
1Dh
GS (Group Separator)
30
1Eh
RS (Record Separator)
31
1Fh
US (Unit Separator)
62
Linguagem de Programao C
Binrio
00000000
00000001
00000010
00000011
00000100
00000101
00000110
00000111
00001000
00001001
00001010
00001011
00001100
00001101
00001110
00001111
00010000
00010001
00010010
00010011
00010100
00010101
00010110
00010111
00011000
00011001
00011010
00011011
00011100
00011101
00011110
00011111
00100000
00100001
00100010
00100011
00100100
00100101
00100110
00100111
00101000
00101001
00101010
00101011
00101100
00101101
00101110
00101111
00110000
00110001
00110010
00110011
00110100
00110101
00110110
00110111
00111000
00111001
00111010
00111011
00111100
00111101
00111110
00111111
dec.
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
chr
spc
!
#
$
%
&
(
)
*
+
,
.
/
0
1
2
3
4
5
6
7
8
9
:
;
<
=
>
?
Binrio
01000000
01000001
01000010
01000011
01000100
01000101
01000110
01000111
01001000
01001001
01001010
01001011
01001100
01001101
01001110
01001111
01010000
01010001
01010010
01010011
01010100
01010101
01010110
01010111
01011000
01011001
01011010
01011011
01011100
01011101
01011110
01011111
01100000
01100001
01100010
01100011
01100100
01100101
01100110
01100111
01101000
01101001
01101010
01101011
01101100
01101101
01101110
01101111
01110000
01110001
01110010
01110011
01110100
01110101
01110110
01110111
01111000
01111001
01111010
01111011
01111100
01111101
01111110
01111111
dec.
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
105
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
chr
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
`
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
Binrio
10000000
10000001
10000010
10000011
10000100
10000101
10000110
10000111
10001000
10001001
10001010
10001011
10001100
10001101
10001110
10001111
10010000
10010001
10010010
10010011
10010100
10010101
10010110
10010111
10011000
10011001
10011010
10011011
10011100
10011101
10011110
10011111
10100000
10100001
10100010
10100011
10100100
10100101
10100110
10100111
10101000
10101001
10101010
10101011
10101100
10101101
10101110
10101111
10110000
10110001
10110010
10110011
10110100
10110101
10110110
10110111
10111000
10111001
10111010
10111011
10111100
10111101
10111110
10111111
63
dec.
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
chr
_
_
_
+
+
+
+
+
Binrio
11000000
11000001
11000010
11000011
11000100
11000101
11000110
11000111
11001000
11001001
11001010
11001011
11001100
11001101
11001110
11001111
11010000
11010001
11010010
11010011
11010100
11010101
11010110
11010111
11011000
11011001
11011010
11011011
11011100
11011101
11011110
11011111
11100000
11100001
11100010
11100011
11100100
11100101
11100110
11100111
11101000
11101001
11101010
11101011
11101100
11101101
11101110
11101111
11110000
11110001
11110010
11110011
11110100
11110101
11110110
11110111
11111000
11111001
11111010
11111011
11111100
11111101
11111110
11111111
dec.
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
chr
+
+
+
+
+
+
+
+
+
+
+
+
+
+
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
_
n
_
_
Linguagem de Programao C
64