Escolar Documentos
Profissional Documentos
Cultura Documentos
Valter Schastai
Introdução
Programa x Algoritmo
• Um Programa é a formalização de um
algoritmo, utilizando alguma ferramenta,
capaz de permitir que o computador possa
entender a seqüência de ações.
Linguagem do Computador
• A única linguagem que o computador
entende chama-se linguagem de máquina
• Portanto, todos os programas que se
comunicam com o computador devem estar
em linguagem de máquina
Compiladores e Interpretadores
• A forma como os programas são traduzidos
para a linguagem de máquina classifica-se
em duas categorias:
– Interpretados
– Compilados
Interpretadores
• Lê uma instrução, faz consistência da
sintaxe e se não houver erro converte-a para
linguagem de máquina para finalmente
executá-la
• Segue para a próxima instrução, repetindo o
processo até que a última instrução seja
executada, ou algum erro seja encontrado
Compiladores
• Lê uma instrução, faz consistência da
sintaxe e se não houver erro converte-a para
linguagem de máquina e, em vez de
executá-la segue para a próxima instrução
repetindo o processo até que a última
instrução seja atingida ou algum erro seja
encontrado
Compiladores
• Não havendo erros na compilação é gerado
um programa .OBJ
• A partir desse momento, entre em cena o
linkeditor, que fará a associação entre o
programa .OBJ e a biblioteca padrão do
compilador
• O produto final criado pelo linkeditor é o
executável (arquivo com extensão .EXE)
Interpretadores x Compiladores
• O interpretador precisa estar presente todas as
vezes que um programa é executado
• Sendo assim, se uma parte do programa
necessitar ser executada muitas vezes, o
processo será feito o mesmo número de vezes
• Na execução de um programa compilado, o
compilador não precisa estar presente
Interpretadores x Compiladores
• Programas compilados (arquivos .EXE),
não permitem alteração, o que protege o
código fonte
• A linguagem que utilizaremos nesse curso,
linguagem C, gera programas compilados
A Linguagem C
• Criada por Dennis M. Ritchie e Ken
Thompson em 1972
• C é uma linguagem muito utilizada na
programação de qualquer tipo de sistema
(cálculos matemáticos, estruturas de dados,
sistemas operacionais, etc)
• Como por exemplo, o sistema operacional
UNIX é desenvolvido em C
A Linguagem C
• C é suficientemente estruturada para
encorajar bons hábitos de programação
• Por exemplo, programas em C podem ser
desenvolvidos em partes separadas por
pessoas distintas e depois unidas em um
programa final
Como Criar um Programa
Executável em C
• Escrever o programa em qualquer editor de texto e
salvá-lo em um arquivo com o sufixo .c (o arquivo
deve ser salvo no modo texto)
• Compilar o fonte seguindo as instruções do seu
compilador (isso criará o arquivo .EXE)
• Atualmente, a maioria dos compiladores possuem
uma interface que disponibiliza entrada do código
fonte (editor próprio) e funções para compilação
(por exemplo, ctrl+F9, no Turbo C++ 4.0)
O Compilador que Utilizaremos
• No nosso curso utilizaremos o compilador
da borland Turbo C++ 4.0
Algumas Funções Básicas da
Interface do Compilador
• Compilar: F9
• Compilar e Executar: Ctrl + F9
• Help Específico: Cursor na palavra e Ctrl +
F1
Primeiro Programa
arquivo que contém a sub-rotina printf() arquivo que contém a sub-rotina getch()
#include <stdio.h>
#include <conio.h>
void main()
{
Escreve na Tela printf("Primeiro Programa!");
getch();
}
void main()
{
instruções;
}
tipo outras_funções()
{
instruções;
}
A Estrutura Básica de um
Programa C
• A função main() é a primeira função a ser
executada no código (também é obrigatória)
• O identificador void indica que a função não
retorna qualquer valor
• A seção cabeçalho é usada para a definição
das bibliotecas que serão utilizadas no
programa (por exemplo, #include <stdio.h>)
A Estrutura Básica de um
Programa C
• Além da função main() outras funções podem
ser colocadas no programa, essas novas
funções devem possuir um tipo de retorno (ou
void) e um nome identificando-as
• Na seqüência do curso, falaremos mais sobre
definição de funções
Tipos de Dados e Variáveis
Tipos de Dados
• Um tipo de dado define a quantidade de
memória necessária para alojar o dado, a
abrangência de valores possíveis (escala) e
o tipo de operações que podem ser
executadas com este dado
• Definir um tipo de dado, significa informar
ao compilador de que forma este dado deve
ser interpretado e de como ele deve ser
gerenciado na memória
Tipos Básicos
TIPO DESCRIÇÃO BYTES FAIXA
int Inteiro com sinal 2 -32768 a 32767
float Real com sinal 4 3.4 x 10 -38 até 3.4 x 10 38 (+ e -)
char Um ou mais caracteres 1 1 caractere
void main()
{
int a = 5, b = 10, c;
c = a;
a = b;
b = c;
}
Saída de Dados
Introdução
• Toda saída de dados é manipulada por
funções
• Para incluir estas funções em nossos
programas temos que dizer ao compilador
em que biblioteca de arquivos “header”
estas funções estão contidas
• Para a função de saída de dados que
usaremos a biblioteca stdio.h será suficiente
printf()
• Sintaxe:
printf(“expressão de controle”, lista de argumentos);
printf()
• Expressão de Controle
– A expressão de controle pode conter caracteres
que serão exibidos na tela
– Também podem ser inseridos manipuladores de
controle e códigos de formatação que indicam o
formato em que os argumentos devem ser
impressos
printf()
Alguns Manipuladores de Controle
\n Nova linha
\xN Imprime caractere ASCII (N em hexa)
\” Imprime aspas
\\ Imprime barra
printf()
Alguns Códigos de Formatação
%c char
%d int
%f float
%s string
%ld long
%lf double
printf()
• Lista de argumentos:
– A lista de argumentos pode conter qualquer
quantidade de argumentos
– Cada argumento deve ser separado por vírgula
printf()
#include <stdio.h>
#include <conio.h>
void main()
{
char sexo = 'F';
int idade = 15;
float altura = 1.75;
void main()
Quantidade total de caracteres exibidos.
{
Caso seja menor será complementado com
char sexo = 'F';
brancos a esquerda
int idade = 15;
float altura = 1.75;
putchar(caractere);
Entrada de Dados
Introdução
• Assim como a saída de dados é tratada com
funções da biblioteca stdio.h, também a
entrada de dados é tratada dessa forma
scanf()
• A função scanf() é para entrada de dados o
que a função printf() é para saída de dados
• A função scanf() utiliza os mesmos códigos
para formatar dados, porém agora, para
entrada de dados
• Vale ressaltar que os argumentos de scanf()
devem ser endereços de variáveis
• O endereço de uma variável é dado pelo
operador & antes do nome da variável
scanf()
• Sintaxe:
scanf(“expressão de controle”,lista de argumentos);
scanf()
#include <stdio.h>
#include <conio.h>
void main()
{
float anos, dias;
printf("Digite sua idade em anos: ");
scanf("%f",&anos);
dias = anos * 365;
printf("Sua idade em dias e' = %.0f ",dias);
getch();
}
getche() e getch()
• Essas duas funções estão definidas na
biblioteca conio.h e são utilizadas para ler
um caractere no instante em que é
datilografado, sem esperar [enter]
• A função getche() lê o caractere do teclado
e permite que seja impresso na tela
• Esta função não aceita argumentos e
devolve o caractere lido para a função que a
chamou
getche() e getch()
• A função getch() lê o caractere do teclado e
não permite que seja impresso na tela
• Como getche(), esta função não aceita
argumentos e devolve o caractere lido para
a função que a chamou
getche() e getch()
#include <stdio.h>
#include <conio.h>
void main()
{
char c;
printf("Pressione uma tecla : ");
c = getche();
printf("\nLeitura feita com getche()");
printf("\nPressione novamente uma tecla: ");
c = getch();
printf("\nLeitura feita com getch()");
getch();
}
Operadores
Operadores Matemáticos
• Para efetuar cálculos envolvendo valores
numéricos podem ser utilizados os
seguintes operadores matemáticos
+ : Adição
- : Subtração
* : Multiplicação
/ : Divisão
% : Retorna o resto de uma divisão
Operadores de Incremento e
Decremento
++ : Incrementa de 1 seu operando
-- : Decrementa de 1 seu operando
• Os dois operadores trabalham de dois
modos:
– Pré-fixado: O operador aparece antes do nome
da variável
– Pós-fixado: O operador aparece seguindo o
nome da variável
Operadores de Incremento e
Decremento
• Em ambos os casos a variável é alterada, no
entanto, no modo pré-fixado a variável é
incrementada antes de seu valor seu usado e
no modo pós-fixado a variável é
incrementada depois de seu valor ser usado
Operadores de Incremento e
Decremento
• Exemplo:
n = 5; n = 5;
x = n++; x = ++n;
// x = 5 // x = 6
// n = 6 // n = 6
Operadores Aritméticos de
Atribuição
• Estes operadores simplificam a definição de
operações aritméticas
• Eles inicialmente realizam a operação
matemática envolvida e em seguida
atribuem o resultado a uma variável
• Exemplo:
x = x + 10;
pode ser substituído por:
x += 10;
Operadores Aritméticos de
Atribuição
+= : Soma os operandos e o resultado atribui
à variável à esquerda
-= : Diminui os operandos e o resultado
atribui à variável à esquerda
*= : Multiplica os operandos e o resultado
atribui à variável à esquerda
/= : Divide os operandos e o resultado
atribui à variável à esquerda
Operadores Aritméticos de
Atribuição
• Outros exemplos:
i += 2; equivale a i = i + 2;
x *= y+1; equivale a x = x * (y + 1);
t /= 2.5; equivale a t = t / 2.5;
d -= 3; equivale a d = d – 3;
Operadores Relacionais
• Os operadores relacionais são muito
utilizados nas tomadas de decisões
== : igual
!= : diferente
> : maior que
< : menor que
>= : maior ou igual que
<= : menor ou igual que
Operadores Lógicos
• Utilizados normalmente junto com os
operadores relacionais
– && : lógico E
– || : lógico OU
– ! : lógico de negação
Precedência dos Operadores
Operadores Precedência
! maior (1)
* / % 2
+ - 3
> < >= =< 4
== != 5
&& 6
|| menor (7)
Exercícios
• Qual é o erro lógico do programa abaixo ?
#include <stdio.h>
#include <conio.h>
void main()
{
int a,b,c;
printf("Digite 3 numeros: \n");
scanf("%d %d %d",a,b,c);
printf("\n %d %d %d",a,b,c);
getch();
}
Exercícios
• Faça um programa para ler a base e a altura
de um triângulo. Em seguida, escreva a área
do mesmo.
Lembre: Área = ( Base * Altura ) / 2
Solução
#include <stdio.h>
#include <conio.h>
void main()
{
float base, altura, area;
printf("\nEntre com a base do triangulo: ");
scanf("%f",&base);
printf("\nEntre com a altura do triangulo: ");
scanf("%f",&altura);
area = (base * altura) / 2;
printf("\nA area do triangulo e %f",area);
getch();
}
Introdução a Manipulação de
Strings
Introdução
• String é uma das mais úteis e importantes
formas de dados em C e é usada para
armazenar e manipular textos como
palavras, nomes e sentenças
• Em C, string é um vetor unidimensional do
tipo char, terminada pelo caractere null
(‘\0’)
Introdução
• Cada caractere de uma string pode ser
acessado individualmente, o que
proporciona uma grande flexibilidade aos
programas que processam texto
Declarando uma String
• O tipo char deve ser usado antes do nome
dado para a variável string
• Após o nome da variável string declara-se o
tamanho da string entre colchetes
• Por exemplo:
char nome[50];
Lendo Strings com scanf()
• Para ler uma string podemos fazer uso da
função scanf(“%s”,&string)
• Porém essa função quando encontra o
caractere “branco ou espaço” encerra a
leitura
• Portanto muitas vezes não é a função ideal
para leitura de strings
Lendo Strings com gets()
• Normalmente usa-se para leitura de strings
a função gets()
• Essa faz a leitura de caracteres quaisquer
até que seja digitado [enter]
• Sintaxe:
gets(variável_string);
Exemplo
#include <stdio.h>
#include <conio.h>
void main()
{
char nome[50];
printf("Entre com um nome: ");
gets(nome);
printf("O nome que voce digitou foi %s",nome);
getch();
}
Inicializando Strings
• Uma string pode ser inicializada no
momento em que é declarada
• Exemplo:
curso[1]
Exercício
• Construa um programa para ler uma string
que represente uma data no seguinte
formato: dd/mm/aaaa. Após lida a string,
escreva o dia, mês e ano (em números) da
data entrada pelo usuário.
Solução
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
char data[9];
printf("Entre com uma data no formato dd/mm/aaaa: ");
gets(data);
printf("\nO dia e %c%c",data[0],data[1]);
printf("\nO mes e %c%c",data[3],data[4]);
printf("\nO ano e %c%c%c%c",data[6],data[7],
data[8],data[9]);
getch();
}
Comandos de Seleção Única
Introdução
• Na linguagem C temos comandos para
avaliar expressões e selecionar aquela ou
aquelas que forem verdadeiras
• Mais precisamente isto significa executar o
bloco de comandos que está subordinado à
expressão que resultou em verdadeiro
if – Sem Alternativa
• Sintaxe:
if(condição)
{
instruções;
}
if – Sem Alternativa
• Neste tipo de avaliação condicional há uma
expressão sendo avaliada e caso ela resulte
em verdadeiro o bloco de instruções que a
segue é executado
• Caso resulte em falso o bloco é saltado
• Os delimitadores de bloco de instruções
{ e } somente são obrigatórios caso o bloco
tenha mais que uma instruções
Exemplo
#include <stdio.h>
#include <conio.h>
void main()
{
int a,b;
printf("Entre com dois numeros: \n");
scanf("%d %d",&a,&b);
if(a == b)
{
printf("Os Numeros sao Iguais");
}
getch();
}
if – Com Alternativa
• Sintaxe:
if(condição)
{
instruções;
}
else
{
instruções
}
if – Com Alternativa
• Nesta seleção há uma expressão de teste,
que se a expressão resultar em verdadeiro é
executado o bloco de instruções que segue o
if, caso contrário, é executado o bloco que
segue o else
Exemplo
#include <stdio.h>
#include <conio.h>
void main()
{
int a,b;
printf("Entre com dois numeros: \n");
scanf("%d %d",&a,&b);
if(a == b)
{
printf("Os Numeros sao Iguais");
}
else
{
printf("Os Numeros sao Diferentes");
}
getch();
}
if – Mais que uma Condição
• Sintaxe: if(condição)
{
instruções;
}
else if(condição)
{
instruções;
}
else if(condição)
{
instruções;
}
....
else
{
instruções;
}
Exemplo
#include <stdio.h>
#include <conio.h>
void main()
{
int a,b;
printf("Entre com dois numeros: \n");
scanf("%d %d",&a,&b);
if(a > b)
{
printf("O primeiro e maior que o segundo");
}
else if (a < b)
{
printf("O primeiro e menor que o segundo");
}
else
{
printf("Os numeros sao iguais");
}
getch();
}
Operador Ternário “? :”
• Sintaxe:
Expressão_de_teste ?
Expressão_executada_se_verdadeiro :
Expressão_executada_se_falso;
Operador Ternário “? :”
• Um comando idêntico ao comando de
seleção onde há uma expressão de teste com
uma alternativa (if-else) é o operador “? :”
• Este operador é preferível quando for
necessário utilizar uma expressão de teste
mais sintética
• Este operador é denominado de ternário
pois requer três operandos
Exemplo
#include <stdio.h>
#include <conio.h>
void main()
{
int a,b;
printf("Entre com dois numeros: \n");
scanf("%d %d",&a,&b);
a == b ? printf("Iguais") : printf("Diferentes");
getch();
}
Outro Exemplo
int a,b,maior;
printf("Entre com dois numeros: \n");
scanf("%d %d",&a,&b);
maior = a > b ? a : b;
printf("\n Maior = %d",maior);
void main()
{
int numero;
printf("Entre com um numero: ");
scanf("%d",&numero);
if((numero % 2) == 0)
printf("Numero par");
else printf("Numero impar");
void main()
{
float num1, num2;
char operador;
switch(operador)
{
case '+': {printf("\nResultado: %f",num1 + num2); break;}
case '-': {printf("\nResultado: %f",num1 - num2); break;}
case '*': {printf("\nResultado: %f",num1 * num2); break;}
case '/': {printf("\nResultado: %f",num1 / num2); break;}
}
getch();
}
Exercício
• Faça um programa que leia um número que
represente um determinado mês do ano.
Após a leitura escreva por extenso qual o
mês lido. Caso o número digitado não esteja
na faixa de 1..12 escreva uma mensagem
informando o usuário do erro da digitação.
Solução
#include <stdio.h>
#include <conio.h>
void main()
{
int mes;
printf("Digite um numero entre 1 e 12: ");
scanf("%d",&mes);
switch(mes)
{
case 1: {printf("\nJaneiro"); break;}
case 2: {printf("\nFevereiro"); break;}
case 3: {printf("\nMarco"); break;}
// ...
case 12: {printf("\nDezembro"); break;}
default: {printf("\nNumero Invalido");}
}
getch();
}
Comandos de Repetição de
Blocos
Introdução
• Os comandos de repetição de blocos em
linguagens de programação, também são
conhecidos como comandos de iteração, ou
comandos de laço ou ainda “loop” de
instruções
• Estes comandos executam os blocos de
instruções subordinados enquanto uma
determinada condição permanecer como
verdadeira
Comando - for
• O comando for é o mais utilizado quando
devemos repetir a execução de um ou mais
blocos de instruções, um determinado
número de vezes
Comando - for
• Sintaxe:
void main()
{
int i;
for(i=1;i<=10;i++)
{
printf("\n%d",i);
}
getch();
}
Exemplos Flexibilidade - for
#include <stdio.h>
#include <conio.h>
void main()
{
int x,y;
for(x=0,y=0; x+y<10; x++,y++)
{
printf("\n%d",x+y);
}
getch();
}
Exemplos Flexibilidade - for
#include <stdio.h>
#include <conio.h>
void main()
{
char c;
for( ; (c=getch()) != 's'; )
{
printf("\n%c",c);
}
}
Exercício
• Faça um programa que leia uma string do
teclado e após isso escreva ela invertida na
tela do usuário
Solução
#include <stdio.h>
#include <conio.h>
#include <string.h>
void main()
{
char str[50];
int i;
printf("Entre com uma palavra: ");
gets(str);
for(i=(strlen(str)-1);i>=0;i--)
{
printf("%c",str[i]);
}
getch();
}
Exercício
• Fazer um programa, usando
obrigatoriamente a estrutura for, que
calcule escreva o valor de S onde:
1 3 5 7 99
S ...
1 2 3 4 50
Solução
#include <stdio.h>
#include <conio.h>
void main()
{
int num, den;
float s=0;
for(num=1,den=1;num<=99;num+=2,den++)
{
s = s + (float)num/den;
}
printf("%f",s); Sem o (float) a divisão seria uma
getch(); divisão inteira
}
Exercício
• Faça um programa que leia 20 valores reais
e escreva seu somatório (use a estrutura for)
Solução
#include <stdio.h>
#include <conio.h>
void main()
{
int num,i, s=0;
printf("Entre com 5 numeros\n");
for(i=1;i<=5;i++)
{
scanf("%d",&num);
s = s + num;
}
printf("%d",s);
getch();
}
Comando - while
• Comando normalmente utilizado quando é
necessário repetir um bloco de instruções
sem saber de antemão quantas vezes este
bloco deverá ser executado
Comando - while
• Sintaxe:
while(condição)
{
instruções;
}
Comando - while
• Quando precisamos testar uma condição
antes mesmo de iniciar a execução de um
bloco de instruções devemos então utilizar
o comando while com teste no início
Exemplo
#include <stdio.h>
#include <conio.h>
void main()
{
int i=1;
while(i <= 10)
{
printf("%d \n",i);
i++;
}
getch();
}
Exercício
• Faça um programa para calcular um valor A
elevado a um expoente B. Os valores A e B
deverão ser lidos, onde a > 0, b >= 0
Solução
#include <stdio.h>
#include <conio.h>
void main()
{
int a, b, resultado = 1;
printf("Entre com a base e o expoente: \n");
scanf("%d %d",&a,&b);
while(b > 0)
{
resultado = resultado * a;
b--;
}
printf("Resultado: %d",resultado);
getch();
}
Exercício
• Faça um programa para calcular N!, onde
N >= 0.
Solução
#include <stdio.h>
#include <conio.h>
void main()
{
long int n, resultado=1;
printf("Entre com um numero: \n");
scanf("%ld",&n);
while(n > 0)
{
resultado = resultado * n;
n--;
}
printf("O fatorial eh igual a %ld",resultado);
getch();
}
Comando – do ... while
• Para executar um bloco de instruções,
subordinado a um laço de repetição, pelo
menos uma vez, temos o comando
do...while
Comando – do ... while
• Sintaxe:
do
{
instruções;
}while (condição);
Exemplo
#include <stdio.h>
#include <conio.h>
void main()
{
int i=1;
do
{
printf("\n %d",i);
i++;
}while(i <=10);
getch();
}
Exercícios
• Faça um programa para calcular a série
Fibonacci até o vigésimo termo. A série tem
a seguinte forma: 1,1,2,3,5,8,13,21,34,…
(use obrigatoriamente a estrutura do...while)
Solução
#include <stdio.h>
#include <conio.h>
void main()
{
int ant=1, prox=1, novo, cont=2;
printf("%d, %d",ant,prox);
do
{
novo = ant + prox;
printf(“, %d",novo);
ant = prox;
prox = novo;
cont++;
}while(cont <=20);
getch();
}
Exercícios
• Faça um programa para ler um valor X e
calcular Y = X+2X+3X+4X+5X+…+20X
(use a estrutura do...while)
Solução
#include <stdio.h>
#include <conio.h>
void main()
{
int x, y=0, i=1;
printf("Entre com um valor para x: ");
scanf("%d",&x);
do
{
y = y + (i * x);
i++;
}while(i <= 20);
printf("y = %d",y);
getch();
}
Comandos de Desvio de
Execução
• Muitas vezes é necessário interromper o
fluxo normal de processamento de um laço
de repetição, independente deste laço ter
sido implementado com for ou while
• Para fazer isso, temos dois comandos de
desvio: o break e o continue
O Comando break;
• O comando break desvia o fluxo de
processamento para fora do comando de
repetição
• Mais precisamente, para a primeira linha
após o término do comando de repetição
O Comando continue;
• O comando continue transfere o fluxo de
processamento para o teste do comando de
repetição
• Usando o continue com o for, antes do teste
de associado ao for ser verificado ocorre o
incremento das variáveis na seção de
incremento do for
void main()
{
float idade, total_idade=0, total_pessoa=0;
char resp;
while(1)
{
printf("\nIDADE: ");
scanf("%f",&idade);
if(idade <= 0)
{
printf("\nIdade Invalida, deseja continuar?(s/n)");
resp = getche();
if(resp == 's')
continue;
else break;
}
else{
total_idade += idade;
total_pessoa++;
}
}
printf("\nA Media de Idade e %f",(total_idade/total_pessoa));
getch();
}
Exercício
• Altere o programa que calcula o fatorial de
um número, de maneira que seja perguntado
ao usuário se ele deseja calcular ou não o
fatorial de um próximo número.
void main()
{
double n, resultado;
char c;
while(1)
{
resultado = 1;
printf("Entre com um numero: \n");
scanf("%lf",&n);
while(n > 0)
{
resultado = resultado * n;
n--;
}
printf("O fatorial eh igual a %lf \n",resultado);
printf("\nDeseja Continuar(s/n)? ");
c = getch();
if(c == 's')
continue;
else break;
clrscr();
}
}
Funções Definidas pelo Usuário
Introdução
• Funções dividem grandes tarefas de computação
em tarefas menores
• Em C, uma função é uma unidade de código de
programa autônoma desenhada para cumprir uma
tarefa particular
• Provavelmente a principal razão da existência de
funções é impedir que o programador tenha de
escrever o mesmo código repetidas vezes
Sintaxe
void main()
{
linha();
printf("\xDB PROGRAMA EM C \xDB\n");
linha();
getch();
}
void main()
{
float base, expoente;
printf("Entre com a base e o expoente: \n");
scanf("%f %f",&base,&expoente);
printf("Resultado = %f",potencia(base,expoente));
getch();
}
void main()
{
float montante;
printf("Digite o valor do Dolar em Reais: ");
scanf("%f",&valor_dolar);
printf("Digite um montante em Dolar: ");
scanf("%f",&montante);
converte(montante);
printf("\nMontante em Reais = %f",real);
getch();
}
void main()
{
int entrada;
printf("Digite um numero: ");
scanf("%d",&entrada);
if(primo(entrada))
printf("\nNumero Primo");
else printf("\nNumero nao Primo");
getch();
}
void main()
{
float somatorio=0;
int i;
for(i=1;i<=7;i++)
{
somatorio = somatorio + (float)1/fat(i);
}
printf("\nResultado = %f",somatorio);
getch();
}
#define PI 3.14159
void main()
{
float raio;
printf("Digite o raio da esfera: ");
scanf("%f",&raio);
printf("A area da esfera eh %f",area(raio));
getch();
}
float area(float r)
{
return(4 * PI * r * r);
}
Por Que Usar #define ?
• Talvez você se pergunte o que ganhamos
substituindo, no programa anterior, PI por 3.14159
• Suponhamos que você tenha um programa em que
a constante 3.14159 apareça muitas vezes
• Suponha, ainda, que agora você queira uma
precisão maior e queira trocar 3.14159 por
3.141592
Por Que Usar #define ?
• Você deverá ir passo a passo através do
programa e trocar cada ocorrência que
encontrar da constante
• Entretanto, se você tiver definido 3.14159
como sendo PI na diretiva #define, você
deverá somente fazer uma troca
Outro Exemplo
#include <stdio.h>
#include <conio.h>
void main()
{
printf("Resultado: %d",SOMA(3,5));
getch();
}
Outro Exemplo
#include <stdio.h>
#include <conio.h>
void main()
{
int i;
printf("Digite um numero de 0 a 100: ");
scanf("%d",&i);
if( (i<0) || (i>100))
ERRO;
getch();
}
Exercícios
• Torne o código abaixo interpretável pelo
compilador C
algoritmo
inicio
escreva("teste");
espere;
fim
Solução
#include <stdio.h>
#include <conio.h>
algoritmo
inicio
escreva("teste");
espere;
fim
Classes de Armazenamento
Introdução
• Todas as variáveis em C têm dois atributos: um
tipo e uma classe de armazenamento
• Os tipos nós já conhecemos, e as classe de
armazenamento que veremos serão as seguintes:
– auto
– extern
– static
– register
Classe auto
• A maioria das variáveis que declaramos até
agora estão confinadas nas funções que as
usam
• Isto é, são “visíveis” somente às funções
onde estão declaradas
• Tais variáveis são chamadas “locais” ou
“automáticas”, são criadas quando a função
é chamada e destruídas quando a função
termina a sua execução
Classe auto
• As variáveis declaradas dentro de uma
função são automáticas por “default”
• Variáveis automáticas são as mais comuns
dentre as quatro classes
• A classe de variáveis automáticas pode ser
explicitada usando-se a palavra auto
Classe auto
void main()
{
auto int n;
}
É EQUIVALENTE A
void main()
{
int n;
}
Classe extern
• Todas as variáveis declaradas fora de
qualquer função têm a classe de
armazenamento extern
• Variáveis com este tipo de atributo serão
conhecidas por todas as funções declaradas
depois dela
• A declaração de variáveis externas é feita
da mesma maneira como declaramos
variáveis dentro do bloco de uma função
Classe extern
#include <stdio.h>
#include <conio.h>
int n=10;
void main()
{
extern n;
printf("%d",n);
getch();
}
Classe extern
• A palavra extern indica que a função usará
uma variável externa
• Este tipo de declaração, entretanto, não é
obrigatória se a definição original ocorre no
mesmo arquivo fonte
• Lembre-se que variáveis externas retém
seus valores durante toda a execução do
programa
Classe static
• Variáveis static de um lado se assemelham
às automáticas, pois são conhecidas
somente as funções que as declaram e de
outro lado se assemelham às externas pois
mantém seus valores mesmo quando a
função termina
Classe static
• Usa-se variáveis declaradas como static
normalmente para permitir que variáveis
locais guardem seus valores mesmo após o
término da execução do bloco onde são
declaradas
Classe static
void soma();
void main()
{
soma();
soma();
soma();
getch();
}
void soma()
{
static int i=0;
i++;
printf("i = %d \n",i);
}
Classe register
• A classe de armazenamento register indica
que a variável associada deve ser guardada
fisicamente numa memória de acesso
chamada registrador
• Um registrador da máquina é um espaço
onde podemos armazenar um int ou um char
• Cada máquina oferece um certo número de
registradores que podem ser manuseados
pelos usuários
Classe register
• Basicamente variáveis register são usadas
para aumentar a velocidade de
processamento
• Fortes candidatas a este tratamento são as
variáveis de laços
• Segue a seguir um exemplo:
#include <time.h>
void main()
{
int i, j;
register int m,n;
long t;
t = time(0);
for(j=0;j<=10000;j++)
for(i=0;i<=10000;i++)
;
printf("Tempo = %ld\n",time(0)-t);
t = time(0);
for(m=0;m<=10000;m++)
for(n=0;n<=10000;n++)
;
printf("Tempo = %ld\n",time(0)-t);
getch();
}
Entrada e Saída com cin e cout
Introdução
• Os objetos cin e cout são usados somente
em compiladores orientados a objetos
• Esses objetos não funcionam quando o
compilador não suporta orientação a objetos
• Se o compilador suporta orientação a
objetos é necessário incluir a biblioteca
<iostream.h>
cout
• O objeto cout está associado à saída de
video
• É um dispositivo de saída que distingue o
tipo de dado
• Portanto não é necessário declarar o tipo a
ser enviado a saída, como necessariamente
o é, quando trabalhamos com o C
cout
• Sintaxe:
void main()
{
cout << "Testando Saida com COUT";
getch();
}
cin
• O objeto de dados cin é um dispositivo que
envia o valor recebido para uma variável
• O objeto cin está associado ao teclado
• É um dispositivo de entrada de dados que
distingue o tipo de dado
cin
• Sintaxe:
void main()
{
int numero;
cout << "Entre com um numero: ";
cin >> numero;
cout << numero;
getch();
}
Exercícios
• Altere o programa feito para dizer se um
número é primo, de maneira que ele utilize
apenas os comandos cin e cout para entrada
e saída de dados
#include <iostream.h>
int primo(int numero);
void main(){
int entrada;
//printf("Digite um numero: ");
cout << "Digite um numero ";
//scanf("%d",&entrada);
cin >> entrada;
if(primo(entrada))
//printf("\nNumero Primo");
cout << "\nNumero Primo";
else //printf("\nNumero nao Primo");
cout << "\nNumero nao Primo";
getch();
}
int primo(int numero){
int i;
for(i=2;i<numero;i++)
{
if ((numero % i) == 0)
return 0;
}
return 1;
}
Variáveis Compostas
Homogêneas
Introdução
• Uma variável do tipo composta homogênea
é usada para representar uma certa
quantidade de valores homogêneos
• Imagine o seguinte problema:
– Guardar na memória do computador 50 notas
de prova. Calcular e mostrar a média dessas
notas.
Introdução
• Pelo que conhecemos até o momento da
linguagem C, a única forma para resolver
este problema é declararmos 50 variáveis e
atribuir as 50 notas a essas variáveis
• É evidente que precisamos de outra maneira
para referenciar tais coleções de dados
similares
Introdução
• Para tanto, foi criado um novo conceito
para alocação de memória sendo, desta
forma, também criado uma nova maneira de
definir variáveis, a qual foi denominada de
variável indexada.
Introdução
• Uma variável indexada corresponde a uma
seqüência de posições de memória, a qual
daremos único Nome, sendo que cada uma
destas pode ser acessada através do que
conhecemos por índice.
• O índice corresponde normalmente a um
valor númerico
Introdução
• Cada uma das posições de memória de uma
variável indexada pode receber valores no
decorrer do programa como se fosse uma
variável comum, a única diferença reside na
sintaxe de utilização desta variável.
Variáveis Indexadas
Unidimensionais
• Também conhecida por Vetor
Unidimensional
• Um vetor unidimensional é aquele em que o
acesso a um de seus componentes é feito
através de um único índice
Declarando um Vetor
Unidimensional
• Sintaxe:
Tipo Nome[tamanho];
• Onde:
• Tipo: Declara o tipo de dado que cada
elmento irá conter
• Nome: Identificador do Vetor
• Tamanho: Define quantos elementos
conterá o vetor
Referenciando Elementos do
Vetor
• Uma vez declarado o vetor, precisamos de
um modo de referenciar seus elementos
individualmente
• Isto é feito através de um índice entre
colchetes seguindo o nome do vetor
Vetor[índice]
Referenciando Elementos do
Vetor
• Atribuindo valores as posições do vetor
NomeVetor[índice] = Valor;
void main()
{
float nota[NUM_NOTAS];
float soma=0;
int i;
for(i=0;i<NUM_NOTAS;i++)
{
printf("Entre com uma nota: ");
scanf("%f",¬a[i]);
}
for(i=0;i<NUM_NOTAS;i++)
soma = soma + nota[i];
printf("\nMedia = %f",soma/NUM_NOTAS);
for(i=0;i<NUM_NOTAS;i++)
printf("\nNota %d: %f",i,nota[i]);
getch();
}
Inicializando um Vetor
• Em C a inicialização de um vetor pode ser
feita em tempo de compilação
• Exemplo:
printf("\nNumeros Pares");
for(i=0;i<TAM;i++)
if((vetor[i] % 2) == 0)
printf("\n%d",vetor[i]);
Solução
maior = vetor[0];
menor = vetor[0];
for(i=1;i<TAM;i++)
{
if(vetor[i] > maior)
maior = vetor[i];
if(vetor[i] < menor)
menor = vetor[i];
}
printf("\nMaior = %d, Menor = %d",maior,menor);
printf("\nSomatoria: ");
for(i=0;i<TAM;i++)
soma += vetor[i];
printf("\n%d",soma);
Exercício
• Faça um programa para ler uma seqüência
de 40 notas e mostrar quais as notas
maiores que a média dessas notas
Solução
void main()
{
float vetor[TAM];
int i;
float media,soma=0;
for(i=0;i<TAM;i++)
{
printf("Entre com uma nota: ");
scanf("%f",&vetor[i]);
soma += vetor[i];
}
media = (float)soma/TAM;
for(i=0;i<TAM;i++)
if(vetor[i]>media)
printf("\n%f",vetor[i]);
getch();
}
Variáveis Indexadas
Bidimensionais
• Também conhecida por Matriz
• Um vetor bidimensional é aquele em que o
acesso a um de seus componentes é feito
por meio de dois índices (comumente
chamados de linha e coluna)
Declarando uma Matriz
• Sintaxe:
Tipo NomeMatriz[QtdLinhas][QtdColunas];
• Onde:
• Tipo: Declara o tipo de dado que cada
elemento irá conter
• NomeMatriz: Identificador da Matriz
• QtdLinha e QtdColunas: Define quantos
elementos conterá a matriz (linha x coluna)
Referenciando Elementos da
Matriz
• Uma vez declarada a matriz, precisamos de
um modo de referenciar seus elementos
individualmente
• Isto é feito através de dois índices entre
colchetes seguindo o nome do vetor
Matriz[linha][coluna]
Referenciando Elementos da
Matriz
• Atribuindo valores as posições da matriz
NomeMatriz[linha][coluna] = Valor;
for(linha=0;linha<TAM;linha++)
{
for(coluna=0;coluna<TAM;coluna++)
{
printf("%d ",matriz[linha][coluna]);
}
printf("\n");
}
}
Inicializando uma Matriz
• Em C a inicialização de uma matriz também
pode ser feita em tempo de compilação
• Exemplo:
getch();
}
Exercício
• Dada uma matriz 3x4, faça um programa
que determine sua transposta e a imprima
Solução
#define TAML 3
#define TAMC 4
void main()
{
int matriz[TAML][TAMC] = {{0,1,2,3},
{1,0,1,2},
{2,1,0,5}};
int linha, coluna;
for(coluna=0;coluna<TAMC;coluna++)
{
for(linha=0;linha<TAML;linha++)
printf("%d ",matriz[linha][coluna]);
printf("\n");
}
getch();
}
Exercício
• Dadas duas matrizes 4x4, faça um programa
que some as duas e gera uma terceira matriz
com o resultado.
Solução
#define TAM 4
void main()
{
int matriz1[TAM][TAM] = {{0,1,2,3},{1,0,1,2},
{2,1,0,5},{2,1,0,5}};
int matriz2[TAM][TAM] = {{0,1,2,3},{1,0,1,2},
{2,1,0,5},{2,1,0,5}};
int matriz_soma [TAM][TAM];
int linha, coluna;
for(linha=0;linha<TAM;linha++)
{
for(coluna=0;coluna<TAM;coluna++)
matriz_soma[linha][coluna] = matriz1[linha][coluna]+
matriz2[linha][coluna];
}
}
Exercício
• Dadas duas matrizes de ordem 3x2 e 2x3,
faça um programa que calcule o produto
dessas matrizes e o imprima para o usuário.
• Exemplo:
31 (3 * 2) + (1 * 7) (3 * 0) + (1 * 5) ...
20 203 (2 * 2) + (0 * 7)
46 758
void main()
{
int m1[3][2] = {{0,1},{1,0},{2,1}};
int m2[2][3] = {{0,1,2},{1,0,1}};
int lm1, cm2, i, r;
for(lm1=0;lm1<3;lm1++)
{
for(cm2=0;cm2<3;cm2++)
{
r = 0;
for(i=0;i<2;i++)
{
r = r + (m1[lm1][i] * m2[i][cm2]);
}
printf("%d ",r);
}
printf("\n");
}
}
Exercício Proposto
• Dada uma matriz (NxN) de inteiros,
construa um programa para solicitar um
número do usuário e verifique se este
número pertence a matriz
Vetores como Argumentos de
Funções
• Temos visto exemplos de passagem de
vários tipos de variáveis como argumentos
• C permite também passar uma matriz para
uma função
• Vejamos o seguinte exemplo:
int max(int vet[]);
void main()
{
int vetor[TAM];
int i = 0;
do
{
printf("Entre com um numero: ");
scanf("%d",&vetor[i]);
i++;
}
while(i<TAM);
printf("NumMax = %d",max(vetor));
}
int list[40];
list = = &list[0]
Exercício
• Construa uma função em C para copiar uma
sub-string de uma string. A função deve
possuir os seguintes parâmetros:
– String de origem
– Posição para inicio da cópia
– Quantidade de caracteres a serem copiados
– String que conterá a sub-string copiada
void substr(char str_origem[], int i, int qtdade, char sub_str[]);
void main()
{
char str[10] = "Faculdade";
char parte_str[10];
substr(str,0,2,parte_str);
printf("%s",parte_str);
getch();
}
Void main()
{
char str_a[10], str_b[10];
if(str_a == str_b)
printf(“Iguais”);
}
A Função strcmp()
• Este programa não trabalhará corretamente,
pois str_a e str_b são endereços
• Sendo assim, a expressão str_a == str_b não
pergunta se as strings são iguais, mas sim se
seus endereços são iguais
• Uma comparação de strings deve sempre
ser feita por meio da função strcmp()
A Função strcmp()
• A função retorna 0 se as strings são iguais e
outro número qualquer caso contrário
void main()
{
char str_a[10]="teste", str_b[10]="teste";
if(strcmp(str_a,str_b) == 0)
printf("Iguais");
getch();
}
A Função strcat()
• A função strcat() concatena duas strings,
isto é, junta uma string ao final de outra
• Ela toma dois endereços de string como
argumento e copia a segunda string no final
da primeira e esta combinação gera uma
nova primeira string
• A segunda string não é alterada
A Função strcat()
void main()
{
char str_a[10]="Teste", str_b[10]=" de LPI";
strcat(str_a,str_b);
printf("%s",str_a);
getch();
}
A Função strcpy()
• A função strcpy() copia uma string em outra
string
void main()
{
char str_a[10]="LPI", str_b[10];
strcpy(str_b,str_a);
printf("%s",str_b);
getch();
}
Exercício
• Encontre no help do seu compilador C as
funções para tornar um texto todo em letras
minúsculas e para tornar um texto todo em
maiúsculas. Aplique essas funções em
algum programa em C.
Exercício
• Construa uma função para retornar a
quantidade de ocorrências de uma
determinada letra do alfabeto em uma
palavra ou frase. Obs.: Tanto a palavra
como a letra devem ser passados como
parâmetros para a função.
Solução
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
FILE *fptr;
fptr = fopen(“arq.txt”,”w”);
A Função fclose()
• Quando terminamos as operações em um
arquivo precisamos fechá-lo
• Fechar um arquivo provoca dois efeitos:
– Qualquer coisa que permanece no buffer é
gravada
– Libera a estrutura FILE para que seja utilizada
para abertura de outro arquivo
A Função fclose()
• Exemplo:
FILE *fptr;
fptr = fopen(“arq.txt”,”w”);
// Operações com o arquivo
fclose(fptr);
Operações com Arquivos em
Disco
Gravando e Lendo um Arquivo
Caractere a Caractere
Exemplo
#include <conio.h>
#include <stdio.h>
void main()
{
FILE *fptr;
char ch;
fptr = fopen("arqtext.txt","w");
while((ch=getche()) != '\r')
putc(ch,fptr);
fclose(fptr);
}
A Função putc()
• A função putc() grava um caractere em um
arquivo
• No exemplo, putc() toma um caractere
(desde que este não seja o <enter>) e o
grava no arquivo cuja estrutura FILE é
apontada por fptr (ponteiro para o arquivo)
Exemplo
#include <conio.h>
#include <stdio.h>
void main()
{
FILE *fptr;
int ch;
fptr = fopen("arqtext.txt","r");
while((ch=getc(fptr)) != EOF)
printf("%c",ch);
fclose(fptr);
getch();
}
A Função getc()
• A função getc lê um caractere por vez de
um arquivo
• No exemplo, getc() lê um caractere por vez
do arquivo apontado por fptr até que o final
do arquivo seja encontrado
Exercício
• Construa um programa que conte a
quantidade de caracteres do interior de uma
arquivo texto
Solução
#include <conio.h>
#include <stdio.h>
void main()
{
FILE *fptr;
int cont=0;
fptr = fopen("arqtext.txt","r");
while(getc(fptr) != EOF)
cont++;
fclose(fptr);
printf("%d",cont);
getch();
}
Exercício
• Complemente o programa anterior para
contar apenas as vogais
Solução
void main()
{
FILE *fptr;
int ch, cont=0;
fptr = fopen("arqtext.txt","r");
while((ch = getc(fptr)) != EOF)
switch (ch)
{
case 'a' : {cont++;break;}
case 'e' : {cont++;break;}
case 'i' : {cont++;break;}
case 'o' : {cont++;break;}
case 'u' : {cont++;break;}
}
fclose(fptr);
printf("%d",cont);
getch();
}
Operações com Arquivos em
Disco
Gravando e Lendo um Arquivo Linha
a Linha
Exemplo
#include <conio.h>
#include <stdio.h>
#include <string.h>
void main()
{
FILE *fptr;
char string[51];
fptr = fopen("arqtext.txt","w");
while(strlen(gets(string))>0)
{
fputs(string,fptr);
fputs("\n",fptr);
}
fclose(fptr);
}
A Função fputs()
• A função fputs() grava uma string em um
arquivo
• No exemplo, fputs() grava o conteúdo da
variável string no arquivo que é apontado
por fptr (ponteiro para o arquivo)
• Vale ressaltar que a função fputs() não
coloca, automaticamente, o caractere de
nova-linha no fim de cada linha
Exemplo
#include <conio.h>
#include <stdio.h>
#include <string.h>
void main()
{
FILE *fptr;
char string[51];
fptr = fopen("arqtext.txt","r");
while(fgets(string,51,fptr) != NULL)
printf("%s",string);
fclose(fptr);
getch();
}
A Função fgets()
• A função fgets() é o complemento de
fputs(), isto é, fgets() lê uma linha por vez
de um arquivo texto
• No exemplo, fgets() faz a leitura de uma
string, do arquivo texto, de tamanho 51 e
adiciona o conteúdo na variável string
• fgets() retorna NULL quando chega ao final
do arquivo
A Função fgets()
• A função fgets() inclui o caractere de nova
linha e o caractere de fim de string ao final
da string
Operações com Arquivos em
Disco
Gravando um Arquivo de Forma
Formatada
Exemplo
void main()
{
FILE *fptr;
char titulo[51];
float preco;
fptr = fopen("arqtext.txt","w");
do
{
printf("\nDigite o titulo e preco: ");
scanf("%s %f",titulo,&preco);
fprintf(fptr,"%s %f",titulo,preco);
printf("Continua s/n");
} while (getche()!= 'n');
fclose(fptr);
}
A Função fprintf()
• Com a função fprintf() torna-se possível
formatar dados de várias maneiras,
inclusive escrever um valor de uma variável
numérica em um arquivo
• No exemplo, fprintf() foi utilizada para
escrever no arquivo o conteúdo de duas
variáveis, uma do tipo string e outra do tipo
float
• fprintf() assemelha-se muito a função
printf()
A Função fprintf()
• Vale ressaltar que os dados escritos por
fprintf() são todos (independente do tipo)
gravados como caracteres
Exemplo
void main()
{
FILE *fptr;
char titulo[51];
float preco;
fptr = fopen("arqtext.txt","r");
while(fscanf(fptr,"%s %f",titulo,&preco) != EOF)
printf("%s %f \n",titulo,preco);
fclose(fptr);
getch();
}
A Função fscanf()
• A função fscanf() é similar à função scanf(),
exceto que, como em fprintf(), um ponteiro
para FILE seja incluído como primeiro
argumento
• No exemplo, fscanf() lê os dados do
arquivo escrito por fprintf()
Exercício
• Escreva um programa que leia um arquivo
texto, escreva o arquivo na tela e no fim
mostre o número de linhas desse arquivo (é
sabido que no arquivo não existem linhas
com mais de 60 caracteres)
Solução
void main()
{
FILE *fptr;
char string[61];
int cont=0;
fptr = fopen("arqtext.txt","r");
while(fgets(string,61,fptr) != NULL)
{
cont++;
printf("%s",string);
}
fclose(fptr);
printf("\nNumero Linhas = %d",cont);
getch();
}
Operações com Arquivos em
Disco
Gravando um Arquivo na Forma
Registro
Introdução
• Nós já vimos como números podem ser
gravados usando as funções de leitura e
gravação formatada: fscanf() e fprintf()
• Entretanto, guardar números nos formatos
oferecidos por estas funções pode tomar um
grande espaço em disco, pois cada dígito é
armazenado como um caractere
Introdução
• Estas funções apresentam ainda um outro
problema: não é a maneira direta de ler e
escrever tipos de dados complexos como
vetores, matrizes e estruturas
• Matrizes e estruturas são manuseadas
ineficientemente escrevendo cada elemento
da matriz um por vez
Introdução
• O modo registro grava números em
arquivos em disco no formato binário
• Dessa forma, inteiros são gravados em dois
bytes, números em ponto flutuante em
quatro bytes, etc
• Também: vetores, matrizes e estruturas
podem ser gravadas com uma simples
instrução
void main()
{
struct {
char titulo[30];
int codigo;
float preco;
} livro;
char numstr[81];
FILE *fptr;
fptr = fopen("livros.dat","wb");
do{
printf("\nDigite o titulo: ");
gets(livro.titulo);
printf("\nDigite o codigo: ");
gets(numstr);
livro.codigo = atoi(numstr);
printf("\nDigite o preco: ");
gets(numstr);
livro.preco = atof(numstr);
fwrite(&livro,sizeof(livro),1,fptr);
printf("\nOutro livro (s/n)?");
}while(getche() == 's');
fclose(fptr);
}
A Função fwrite()
• A função fwrite() toma 4 argumentos
• O primeiro é o endereço do dado (estrutura)
a ser gravado
• O segundo argumento é um número inteiro
que indica o tamanho do tipo de dado a ser
gravado
• O terceiro argumento é um número inteiro
que informa a fwrite() quantos itens do
mesmo tipo serão gravados
• O quarto é o ponteiro para a estrutura FILE
void main()
{
struct {
char titulo[30];
int codigo;
float preco;
} livro;
char numstr[81];
FILE *fptr;
fptr = fopen("livros.dat","rb");
while(fread(&livro,sizeof(livro),1,fptr) == 1)
{
printf("\nTitulo: %s",livro.titulo);
printf("\nCodigo: %d",livro.codigo);
printf("\nPreco: %f \n",livro.preco);
}
fclose(fptr);
getch();
}
A Função fread()
• A função fread() toma 4 argumentos
• O primeiro é o endereço para o qual os
dados lidos serão armazenados
• O segundo indica a quantidade de bytes do
tipo de dado a ser lido
• O terceiro indica a quantidade de itens a
serem lidos
• O quarto é o ponteiro para a estrutura FILE
Exercício
• Faça um programa para ler do teclado uma
matriz de dimensão (5x5) e gravar ela em
um arquivo
void main()
{
int matriz[5][5];
int l,c;
FILE *fptr;
fptr = fopen("matriz.dat","wb");
for(l=0;l<5;l++)
for(c=0;c<5;c++)
{
printf("Entre com um valor: ");
scanf("%d",matriz[l][c]);
}
fwrite(matriz,sizeof(matriz),1,fptr);
fclose(fptr);
getch();
}
Exercício
• Leia do arquivo a matriz gravada no
exercício anterior
void main()
{
int matriz[5][5];
int l,c;
FILE *fptr;
fptr = fopen("matriz.dat","rb");
fread(matriz,sizeof(matriz),1,fptr);
for(l=0;l<5;l++)
{
for(c=0;c<5;c++)
{
printf("%d ",matriz[l][c]);
}
printf("\n");
}
fclose(fptr);
getch();
}
Cuidados ao Abrir Arquivos
Por Que um Arquivo Pode Não
Ser Aberto ?
• Razões:
– Não exista mais espaço em disco
– Arquivo não exista (caso da leitura)
• Para tratar isso deve-se verificar o retorno
da função fopen()
• Se o arquivo não pode ser aberto, a função
fopen() devolve o valor NULL
Exemplo
void main()
{
FILE *fptr;
if( (fptr = fopen("matriz.dat","rb")) == NULL)
{
printf("ERRO ao abrir o arquivo! ");
getch();
exit(0);
}
printf("Arquivo aberto com sucesso!");
fclose(fptr);
getch();
}