Mudanças entre as edições de "AULA 21 - Programação 1 - Graduação"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
 
(90 revisões intermediárias por 2 usuários não estão sendo mostradas)
Linha 1: Linha 1:
=Objetivos=
+
=Requisito para formação das Equipes=
  
*Tratamento de arquivos no C;
+
*Três integrantes por equipe.
*O sistema de arquivos no Linux;
 
*O acesso com funções de alto nível.
 
  
=O Sistema de Arquivos no Linux=
+
=Equipes do Projeto Final - Participantes=
  
==O Arquivo==
+
[[Equipe1-2015-1]]
 +
*MARIA FERNANDA SILVA TUTUI
 +
*RICARDO AMORIM
 +
*VITOR MANOEL DA SILVEIRA
  
Um arquivo é um conjunto de dados que pode ser referenciado por um nome e pode ter outros atributos tais como: permissão para leitura e escrita, data da criação, data da última modificação etc.
+
[[Equipe2-2015-1]]
 +
*ADONIS ANDREAS MARINOS
 +
*ANDERSON GASPAR DE MEDEIROS
 +
*DANIEL TREVISAN TATSCH
  
Note que um arquivo pode conter dados como por exemplo: um programa C, um programa executável, textos, música, vídeos e fotos. Seja qual for a natureza dos dados o armazenamento será na forma de bits.
+
[[Equipe3-2015-1]]
 +
*DANIEL CABRAL CORREA
 +
*PABLO FIDELIS DIAS
 +
*PAULO HENRIQUE HORST BIANCHIN
  
Normalmente, arquivos são armazenados em memórias secundárias, tais como CD e HD (''Hard Disk''). Também podem ser armazenados na memória principal RAM ou uma memória rápida FLASH.
+
[[Equipe4-2015-1]]
 +
*ADILSON GOEDERT SIQUEIRA
 +
*GUSTAVO VIEIRA ZACCHI
 +
*RAPHAEL WASHINGTON BAPTISTA GIASSI
  
Quanto a forma como os dados são armazenados, podemos dizer que os arquivos são [http://en.wikipedia.org/wiki/Binary_file binários] ou [http://en.wikipedia.org/wiki/Text_file texto]. Qualquer um deles armazena bits em que em conjunto de 8, representam os bytes, que por sua vez estão associados a um código ASCII.
+
[[Equipe5-2015-1]]
 +
*LEONARDO TASCA
 +
*LUISA MACHADO
 +
*NATALIA ADRIANA MIRANDA
  
==Sistema de Arquivos==
+
[[Equipe6-2015-1]]
 +
*AUGUSTO DA SILVEIRA WILLEMANN
 +
*GABRIEL FARIAS TURNES
 +
*JEFERSON RICARDO TICHZ ESPINDOLA
  
Um sistema tal como o Linux possui milhares de arquivos. Para que arquivos possam ser acessados e armazenados de forma consistente, eles são organizados em um sistema de arquivos.
+
[[Equipe7-2015-1]]
 +
*JOAO VITOR DA ANUNCIACAO
 +
*RAISSA LINHARES GOMES
 +
*VICTOR CESCONETTO DE PIERI
  
Tipicamente, um sistema de arquivos ocupa uma área de um disco (ou mídia de armazenamento).
 
Nesta área ficam armazenados blocos de armazenamento dos dados dos arquivos e também as estruturas chamadas de '''inodes'''.
 
  
Um [http://upload.wikimedia.org/wikipedia/commons/a/a2/Ext2-inode.gif inode] é um estrutura que possui as propriedades do arquivo e ponteiros para os blocos que contém os dados do arquivo. Tipicamente um sistema de arquivos possui uma lista de inodes que permite "indexar" cada um dos arquivos do sistema de arquivos.
+
<!--
 +
=Placa de aquisição de dados=
  
Existem vários formatos de sistema de arquivos, dependendo do sistema operacional. No linux os formatos mais conhecidos são: ext2, ext3, ext4 etc.
+
*Saídas digitais
  
Um sistema de arquivos normalmente possui uma estrutura de dados inicial chamada de superbloco. O superbloco traz informações sobre o tamanho de blocos do sistema, o início da lista de inodes (/), etc.
+
Existem 3 saídas digitais na placa, e essas são chamadas de OUT1, OUT2 e OUT3.
  
;Sistema de arquivos
+
[[Arquivo:saida_digital.jpg|600px]]
{| border="1" cellpadding="10" cellspacing="10"  
+
 
! style="background: #ffdead;" | superbloco
+
Essas saídas são energizadas, e quando estão ligadas enviam 5V a saída escolhida.
! style="background: #ffdead;" | lista de inodes
+
 
! style="background: #ffdead;" | blocos dos arquivos
+
 
|}
+
 
<br>
+
*Entradas digitais
 +
 
 +
Existem, também, 3 entradas digitais, que são nomeadas INP1, INP2 e INP3.
 +
 
 +
[[Arquivo:entrada_digital.jpg|600px]]
 +
 
 +
Essas entradas são do tipo seco, o que significa que elas ficam ativas quando aterradas(GND).
 +
 
 +
 
 +
 
 +
*Saídas analógicas
 +
 
 +
Existem 2 saídas analógicas, e essas nomeadas DA1 e DA2.
 +
 
 +
[[Arquivo:saida_analogica.jpg|500px]]
 +
 
 +
Essas saídas podem ser ajustadas para mandar tensões entre 0V e 5V.
 +
 
 +
 
 +
 
 +
*Entradas analógicas
 +
 
 +
As 8 entradas analógicas existentes na placa são nomeadas como AD1, AD2, AD3...AD8
 +
 
 +
[[Arquivo:entrada_analogica.jpg|500px]]
 +
 
 +
Estas entradas suportam tensões de até 10V
 +
 
 +
 
 +
==Instalação==
 +
 
 +
Fazer o dowload do arquivo bibprg neste link: [http://db.tt/17JRNYpK Download]
 +
 
 +
Instruções para instalação:
 +
 
 +
Na pasta make:
 +
 
 +
*Dentro do arquivo shell.sh, no campo "SENHA". Botar senha de root do PC em uso;
 +
 
 +
*Dentro do arquivo Perm-Cerne.rules, na segunda linha, no campo OWNER="Aluno". Mudar "Aluno" para o nome do usuário do computador.
 +
 
 +
Feito isso, basta que, a partir do terminal, seja feito o comando make dentro da pasta make.
 +
 
 +
==Criando programas em C utilizando a biblioteca prg==
 +
 
 +
As seguintes funções estão disponíveis nesta biblioteca:
 +
 
 +
*função conectar:
 +
esta função conecta a plaquinha ao host PC
 +
 
 +
Parâmetros: não possui
 +
 
 +
como utilizar:
 +
conectar ();
 +
 
 +
 
 +
*Função "info"
 +
esta função retorna informações da placa. Pode retornar o nome do fabricante e o string do produto.
 +
 
 +
Parâmetros: não possui
 +
 
 +
como utilizar:
 +
info ();  
 +
 
 +
 
 +
*Função "enviar_digital"
 +
Envia um sinal para uma das 3 saídas digitais da placa de aquisição
 +
 
 +
como utilizar:
 +
 
 +
Parâmetros: 2 parâmetros do tipo char, onde o primeiro representa uma saída digital (1, 2 ou 3) e o segundo representa o estado da saída, podendo ser 1(nível alto) ou 0(nível baixo).
 +
 
 +
enviar_digital (saída, estado);  
 +
 
 +
/*IMPORTANTE: as varíaveis saída e estado, sao do tipo CHAR*/
 +
ou
 +
 
 +
enviar_digital (‘1’, ‘1’)
 +
 
 +
/*saída 1 é colocada em nivel alto(5V)*/
 +
 
 +
 
 +
*Função "enviar_analogica"
 +
função utilizada para enviar um sinal para uma das 2 saídas analógicas da placa de aquisição
 +
 
 +
como utilizar:
 +
Parâmetros: 2 parâmetros do tipo char, onde o primeiro representa uma saída analógica (1 ou 2) e o segundo é uma string que representa o estado da saída, podendo esta variar de “000” a “255”. Onde “000” é 0V e 255 é 5V.
 +
Outras tensões podem ser encontradas através de calculos simples, como 2,5V  “127”
 +
 
 +
enviar_analogica (saida, estado);
 +
 
 +
/*Onde a variavel saida e estado sao do tipo CHAR*/
 +
 
 +
ou
 +
 
 +
enviar_analogica (‘1’, “127”);
 +
 
 +
/*onde a saída analógica 1 está sendo energizada com aproximadamente 2.5V*/
 +
 
 +
 +
*Função "receber_digital"
 +
 
 +
Função utilizada para receber informações das entradas digitais;
 +
 
 +
A entrada digital desta placa é do tipo seco. Ela retornará 0 caso a entrada NÃO estiver aterrada, e 1 se estiver.
 +
 
 +
 
 +
como utilizar:
 +
 
 +
Parâmetros: receber(nº da saída);
 +
Retorno: o retorno desta função é um inteiro (int)
 +
 
 +
receber_digital (char saida) ;
 +
 
 +
ou
  
==Diretórios==
+
receber_digital (‘1’) ;
  
São arquivos especiais que contém basicamente uma lista contendo nome e inode correspondente dos arquivos que o diretório contém.
+
/*onde a função retornará 0 ou 1 da entrada 1 */
 +
/*Existem 3 entradas digitais, portanto a variavel saída pode ser 1, 2 ou 3*/
  
Em um sistema de arquivos, o diretório / é o diretório raiz do sistema, a partir do qual pode-se encontrar todos os demais arquivos.
 
  
==Referência a um arquivo==
+
*Função "receber_analogica"
 +
Função utilizada para receber informações das entradas analógicas;
  
A localização de um arquivo pode ser realizada pela referência absoluta, ou seja, desde o diretório / do sistema:
+
As entradas analógicas retornam valores de 0,00V a 9,99V;
  
cat /etc/passwd
+
como utilizar:
  
O comando cat tem por objetivo mostrar no terminal o conteúdo do arquivo ''passwd''. Para que este arquivo seja encontrado na árvore de diretórios, deve-se fornecer a referência absoluta, desde o diretório /
+
Parâmetros: receber(nº da saída);
 +
Retorno: o retorno desta função é um número real (float)
  
Uma alternativa de acesso, é o uso da referência relativa ao diretório de trabalho. O conceito de diretório de trabalho é criado pelo interpretador de comandos (''shell''). Desta forma pode-se por exemplo fazer o comando:
+
receber_analogica (char saida) ;
  
cat passwd
+
ou
  
O sistema procurará o arquivo passwd dentro do diretório de trabalho, que é referenciado armazenado pelo ''shell''. Neste caso, o diretório de trabalho deveria ser ''/etc''
+
receber_analogica (‘1’) ;
  
cd /etc
+
/*onde a função retornará retornará um valor entre 0,00 e 9,99 */
cat passwd
+
/*Existem 8 entradas analogicas, portanto a variavel saída pode ser 1, 2, 3, 4, 5, 6, 7 ou 8*/
  
=====No Linux/Unix tudo é arquivo=====
 
  
No Linux, qualquer referência/acesso ao hardware/dispositivos é realizada na forma de acesso a arquivo. Ver arquivos no diretório de dispositivos:
+
*Função "print_display"
 +
/*Função utilizada para imprimir um mensagem no display lcd*/
  
  ls -l /dev
+
como utilizar:
  
Como consequência, a partir de um programa em C, é possível abrir e escrever/ler em um dispositivo (desde que se tenha autorização).
+
//Parâmetros: print_display(linha,"mensagem");
  
===Acessando arquivos a partir de programas C===
+
print_display (int linha, char mensagem[]);
  
====Acesso a arquivos: funções de baixo e alto nível====
 
  
Em sistemas do porte do Linux e Windows, por questões de segurança e controle, todo acesso a arquivo é realizado através de código do sistema operacional. Desta forma, um programa que deseja acessar um arquivo deve gerar uma CHAMADA AO SISTEMA.
+
*Função "limpar_display" limpa o display
O Linux (assim como outros sistemas) possui uma API (Application Programming Interface) bem definida, na forma de um conjunto de chamadas que permitem realizar uma série de funcionalidades (serviços) para os processos(programas em execução).
+
/*Função utilizada para limpar o display*/
  
Um programa em C realiza uma CHAMADA AO SISTEMA com auxílio de funções da biblioteca C (a glib no caso do Linux).
+
como utilizar:
Duas categorias de funções para acesso a arquivo são disponibilizadas [http://en.wikipedia.org/wiki/C_file_input/output (ver detalhes aqui)]:
 
*Funções de baixo nível: acessam diretamente o sistema;
 
*Funções de alto nível: as funções intermediam o acesso, criando buffers no espaço de endereçamento do processo. As funções de baixo nível são invocadas para ler e escrever dados no buffer.
 
  
====Acesso a arquivo em MODO TEXTO através de funções de alto nível====
+
//Parâmetros: não possui
  
O acesso em alto nível é realizado usando uma estrutura do tipo [http://www.gnu.org/software/libc/manual/html_node/Streams.html#Streams FILE] definida no stdio.h.
+
limpar_display();
Todo acesso passa inicialmente por abrir o arquivo (função fopen), ler/escrever (várias funções, tipo fread(), fwrite()) e fechar o arquivo (fclose()).
 
  
 +
==Exemplos==
  
=====Exemplo 1: Escrevendo e lendo um arquivo texto de forma formatada=====
+
Sempre lembrando do arquivo de cabeçalho "bibprg.h" que está dentro da pasta que foi baixada
  
Nos exemplos que se seguem, serão usadas as funções [http://www.cplusplus.com/reference/cstdio/fopen/ fopen] e [http://www.cplusplus.com/reference/cstdio/fclose/?kw=fclose fclose], para abrir e fechar arquivo e [http://www.cplusplus.com/reference/cstdio/fprintf/?kw=fprintf fprintf()] e [http://www.cplusplus.com/reference/cstdio/fscanf/?kw=fscanf fscanf()] para leitura e escrita.
+
Saída digital
A forma é similar ao ''printf'' e ''scanf''(ver http://diuf.unifr.ch/pai/ip/tutorials/c/TC02_scanf.pdf), a não ser pelo fato de que a escrita e leitura é realizada no arquivo indicado
 
por  ''p_arq''
 
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
 +
#include "bibprg.h"
  
void main()
+
main (){
{
 
  FILE *p_arq;
 
  int i;
 
  int res;
 
  
  if ((p_arq=fopen("IFSC.txt", "w")) == NULL) {
+
char saida='1', estado='0';
    printf("Problemas na abertura do arquivo\n");
+
    return;
+
conectar ();
  }
+
   
 
+
enviar_digital ('1','1');
  for (i = 0; i<10;i++) {
+
sleep (1);
  /* A funcao fprintf devolve o número de bytes gravados ou EOF se houve erro na gravação */
+
enviar_digital (saida,estado);
      if((res = fprintf(p_arq,"Linha %d\n",i))==EOF) {       
+
}
        printf("Erro\n");
 
  break;
 
      }
 
  }
 
  fclose(p_arq);
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
Lembrando que o dois parâmetros são do tipo CHAR
  
Note que se o arquivo IFSC.txt não existir, ele será criado.
 
Para ver o que fois escrito faça:
 
cat IFSC.txt
 
  
 +
Saída analógica
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
 +
#include "bibprg.h"
  
void main()
+
main (){
{
 
  FILE *p_arq;
 
  int i,j;
 
  int res;
 
  char buff[100];
 
  
  if ((p_arq=fopen("IFSC.txt", "r")) == NULL) {
+
char saida='1', estado[3]="000";
    printf("Problemas na abertura do arquivo\n");
 
    return;
 
  }
 
  
  for (i = 0; i<10;i++) {
+
conectar ();
      if((res = fscanf(p_arq,"%s %d",buff,&j))==EOF) {       
+
        printf("Fim de leitura\n");
+
enviar_analogica('1', "130");
  break;
+
sleep(2);
      }
+
enviar_analogica(saida, estado);
      printf("%s %d\n",buff,j);
+
}
  }
 
  fclose(p_arq);
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
Os dois parâmetros são do tipo CHAR, sendo o segundo uma cadeia de caracteres que varia de 000 á 255
  
Note que o fscanf se comporta de forma similar ao scanf. A função retorna o caracter EOF (end-of-file) quando não existe mais dados a serem lidos.
 
 
*Exercícios
 
 
#Implementar uma função que soma duas matrizes fornecidas em dois arquivos texto separados: MatA.dat e MatB.dat. Colocar o resultado em um arquivo chamado MatC.dat.
 
  
 +
Entrada digital
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 
#include <stdio.h>
 
#include <stdio.h>
+
#include "bibprg.h"
void main()
 
{
 
  FILE *p_arq;
 
  int i,j,res;
 
  float MatA[5][5], MatB[5][5], MatR[5][5];
 
 
 
  /* Ler a matriz MatA do arquivo */
 
  if ((p_arq=fopen("MatA.dat", "r")) == NULL) {
 
    printf("Problemas na abertura do arquivo\n");
 
    return;
 
  }
 
 
 
  for (i =0;i<5;i++) {
 
      for (j=0;j<5;j++) {
 
      if((res = fscanf(p_arq,"%f",&MatA[i][j]))==EOF){     
 
        printf("Fim de leitura\n");
 
break;
 
      }
 
      printf("%f ",MatA[i][j]);
 
      }
 
      printf("\n");
 
  }
 
  fclose(p_arq);
 
 
 
  /* Ler a matriz MatB do arquivo */
 
  
  printf("\n\n");
+
main (){
     
 
  /* Ler a matriz MatB do arquivo */
 
  if ((p_arq=fopen("MatB.dat", "r")) == NULL) {
 
    printf("Problemas na abertura do arquivo\n");
 
    return;
 
  }
 
 
 
  for (i =0;i<5;i++) {
 
      for (j=0;j<5;j++) {
 
      if((res = fscanf(p_arq,"%f",&MatB[i][j]))==EOF){     
 
        printf("Fim de leitura\n");
 
break;
 
      }
 
      printf("%f ",MatB[i][j]);
 
      }
 
      printf("\n");
 
  }
 
  fclose(p_arq);
 
   
 
  /* Calcular a soma das matrizes e colocar resultado em MatR */
 
  
  for (i =0;i<5;i++) {
+
char saida='1';
      for (j=0;j<5;j++) {
 
      MatR[i][j]=MatA[i][j]+MatB[i][j];
 
      }
 
  }
 
  printf("Resultado da Adição\n");
 
  for (i =0;i<5;i++) {
 
      for (j=0;j<5;j++) {
 
          printf("%f ", MatR[i][j]); 
 
      }
 
      printf("\n");     
 
  } 
 
  /* Armazenar MatR em arquivo */
 
  
  if ((p_arq=fopen("MatR.dat", "w")) == NULL) {
+
conectar ();
    printf("Problemas na abertura do arquivo\n");
+
    return;
+
printf ("%d\n", receber_digital ('1'));
  }
+
sleep (3);
 
+
printf ("%d\n", receber_digital (saida));
  for (i =0;i<5;i++) {
+
}
      for (j=0;j<5;j++) {
 
        if((res = fprintf(p_arq,"%f ",MatR[i][j]))==EOF) {     
 
        printf("erro\n");
 
break;
 
      }
 
      }
 
      fprintf(p_arq,"\n");
 
  }
 
  fclose(p_arq);      
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
====Exemplo2====
+
Parâmetro do tipo CHAR
  
Neste exemplo usaremos as funções fgetc e fputc para ler e cescrever caracteres ASCII nos arquivos. Seja um programa que conta o número de ocorrências do caracter 'a' em um arquivo e reescreve o arquivo sem os "as":
 
  
 +
Entrada analógica
 
<syntaxhighlight lang=c>
 
<syntaxhighlight lang=c>
 +
 
#include <stdio.h>
 
#include <stdio.h>
#include <stdlib.h>
+
#include "bibprg.h"
main()
 
{
 
  FILE *fp_fonte,*fp_destino;
 
  int x,cont=0;
 
                 
 
  if((fp_fonte=fopen("teste.dat","r")) == NULL) {
 
puts("Não conseguiu abrir o arquivo\n");
 
exit(1);
 
  }
 
  if((fp_destino=fopen("dest.dat","w")) == NULL){
 
puts("Não conseguiu abrir o arquivo\n");
 
exit(1);
 
  }
 
  
  /* note que fgetc retorna um inteiro contendo o ASCII lido */
+
main (){
  while ((x=fgetc(fp_fonte)) != EOF){
+
 
      if(x=='a')
+
conectar ();
        cont++;
+
      else
+
printf("%f\n",receber_analogica('1'));
if((x=fputc(x,fp_destino))==EOF) {
+
sleep (2);
puts("Não conseguiu abrir o arquivo\n");
+
printf("%f\n",receber_analogica('1'));
exit(1);
+
}  
}
 
  }
 
  printf("ocorrências de a = %d\n", cont);
 
  fclose(fp_fonte);
 
  fclose(fp_destino);
 
}
 
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
Parâmetro do tipo CHAR
  
Note que ''fputc'' recebe o caracter como um inteiro mas realiza um ''cast'' para
+
Display
''unsigned char'' com fins de escrevê-lo no arquivo.
 
  
====Exemplo 3====
+
<syntaxhighlight lang=c>
 +
#include <stdio.h>
 +
#include "bibprg.h"
  
Neste exemplo vamos explorar o modo de abertura do arquivo para fazer um append (escrever no final do arquivo).
+
main(){
  
<syntaxhighlight lang=c>
+
int i=12;
#include <time.h>
+
char mensagem[50]="Fim";
#include <stdio.h>
+
 +
conectar();
 +
 +
for(;;){
 +
    print_display (1,"Linha 1 display LCD");
 +
    sleep(1);
 
   
 
   
int main(void)
+
    print_display (2,"Linha 2 display LCD");
{
+
    sleep(1);
  time_t ltime;
 
  FILE *fp;
 
  int num;
 
  
  time(&ltime);  
+
    print_display (12,"Linhas 1 e 2 display LCD");
 +
    sleep(1);
  
  if ((fp=fopen("DATA.txt", "a")) == NULL) {
+
    print_display (i, mensagem);
      printf("Problemas na abertura do arquivo\n");
+
    sleep(1);
      return;
+
 
  }
+
}
  if ((num = fputs( ctime(&ltime), fp )) != EOF ) {
 
      fclose(fp);
 
  } else {
 
      printf("Erro na escrita do arquivo!\n");
 
  }
 
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
 +
Onde a variável "i" é do tipo inteiro e a "mensagem" é uma cadeia de caracteres
 +
 +
Ao fim, basta compilar da seguinte forma:
 +
 +
gcc arquivo.c -lprg -lusb-1.0 -o arquivo
 +
-->
 +
 +
<!--
 +
=Sensor de Temperatura LM35=
 +
 +
O LM35 é um sensor de temperatura linear que fornece 10mV para cada grau Celcius que medir. Ou seja, se está fornecendo 100mV, significa que ele está medindo 10°C. [http://blog.webtronico.com/?p=57 http://blog.webtronico.com]
 +
 +
;Principais características
 +
*Pode ser alimentado com uma tensão entre 4 e 20VDC;
 +
*Não necessita de calibração;
 +
*Sua precisão típica é de 0.5°C;
 +
*Pode medir temperaturas entre –55°C à 150°C.
 +
 +
;Veja o teste com LM35
 +
 +
<center>{{#ev:youtube|l9n-8wzex7I#!}} </center>
 +
 +
'''[SIC]''' graus Celsius, não centígrados.
  
Execute o programa da forma (suponha que se chame LOG_tempo:
+
Como sua saída é em tensão e pode ser ligado em 5V, serve como opção para trabalhar com nossas placas de I/O ou Arduíno para medidas de temperaturas.
  log_tempo
 
  cat DATA.txt
 
  log_tempo
 
  cat DATA.txt
 
  log_tempo
 
  cat DATA.txt 
 
 
 
*Exercício: Substitua o modo de append por uma simples escrita (w). Reexecute o programa conforme especificado anteriormente.
 
  
===Ainda funções de acesso a arquivos===
 
  
A localização corrente do acesso a um arquivo pode ser modificada antes de uma leitura ou escrita. Tipicamente, quando se abre
+
;A figura abaixo mostra a ordem dos pinos
uma arquivo para leitura/escrita, o "cursor" de acesso é 0, ou seja início do arquivo. Se o arquivo for aberto em modo append, o "cursor" é posicionado no final. A cada acesso (leitura ou esrita), este cursor é incrementado conforme o número de dados lidos ou escritos.
 
  
É possível entretanto modificar a posição deste cursor, tipicamente com as funções ''fseek()'' e ''rewind()''. (ver http://www.gnu.org/software/libc/manual/html_node/File-Positioning.html#File-Positioning)
+
[[imagem:LM35-pin.png|300px]]
  
Considere o programa abaixo que escreve um vetor de 100 inteiros em um arquivo.
+
;A figura abaixo mostra o encapsulamento mais comum:
  
<syntaxhighlight lang=c>
+
[[imagem:temperature-sensor-lm-35-dz.jpg]]
#include <stdio.h>
+
-->
  
int x[100];
+
<!--
 +
=Como ligar um LED=
  
void main()
+
;O que é um LED?
{
 
  FILE *fp;
 
  
  fp = fopen("teste.dat","w");
+
É um Díodo Emissor de Luz, em inglês diz-se ''<b>L</b>ight <b>E</b>mitter <b>D</b>iode''. Pode ser usado para a emissão de luz em locais e equipamentos onde se torna conveniente a sua utilização em substituição a uma lâmpada. [http://pt.wikipedia.org/wiki/Diodo_emissor_de_luz Diodo Emissor de luz]
  x[0]=32;
 
  x[90]=11;
 
  fwrite(x, sizeof(int),100,fp);
 
  fclose(fp);
 
}
 
</syntaxhighlight>
 
  
Note que o vetor, sendo uma variável global não inicialiazada, será zerado pelo procedimento de ''startup'' do programa.
+
;Como projetar um circuito com LED?
Entretanto, a posição 90 recebe um valor (11).
 
  
Agora observe o programa seguinte que lê especificamente a posição 90 e na sequência restabelece o cursor no início. Note que o fread lê somente um inteiro na posição corrente do arquivo. A posição corrente foi determinada por ''fseek'' e depois retornada para o início com ''rewind''.
+
Deve-se observar a característica físca do LED,e forma correta de polariza-lo.
  
 +
A tabela abaixo mostra algumas características típicas entre os LEDs fabricados por diferentes
 +
empresas:
  
<syntaxhighlight lang=c>
+
{| border="1" cellpadding="5" cellspacing="0" style="text-align: center;"
#include <stdio.h>
+
! style="background: #ffdead;" | Cor
 +
! style="background: #ffdead;" | Queda de tensão
 +
! style="background: #ffdead;" | Corrente
 +
|-
 +
!| Vermelho
 +
| 1.8V
 +
| 20mA
 +
|-
 +
!| Verde
 +
| 2.1V
 +
| 20mA
 +
|-
 +
!| Amarelo
 +
| 2.0V
 +
| 15mA
 +
|-
 +
!| Laranja
 +
| 2.0V
 +
| 20mA
 +
|-
 +
!| Azul
 +
| 3.1V
 +
| 20mA
 +
|-
 +
!| Branco
 +
| 3.1-4V
 +
| 20mA
 +
|-
 +
|}
  
int y;
 
  
void main()
+
Vamos supor que pretende-se acender um LED vermelho, em uma fonte de 5V (USB, Arduído, Carregador de Celelular, placas I/O). Olhando na tabela ve-se que LED vermelho tem uma queda de 1.8V e uma corrente típica de 20mA. Falta portanto definir o resistor a ser utilizado.
{
 
  FILE *fp;
 
  
  fp = fopen("teste.dat","r");
 
  fseek(fp, 90*sizeof(int), SEEK_SET);
 
  fread(&y, sizeof(int),1,fp);
 
  printf("y=%d\n", y);
 
  rewind(fp);
 
  fread(&y, sizeof(int),1,fp);
 
  printf("y=%d\n", y);
 
  fclose(fp);
 
}
 
</syntaxhighlight>
 
  
Exercício
+
Lei de ohm:
  
Considere o programa abaixo. Ele deve acessar uma tabela que se encontra em um arquivo binário. Cada item da tabela
+
:<math> V = R*I\, </math>
se apresenta conforme o registro TRegistro. Implemente a função ''LerTab'' e crie um programa para escrever uma tabela iniciada com
 
uma tabela de 5 registros a fim de testar a função implementada.
 
  
<syntaxhighlight lang= c>
+
Portanto:
#include <stdio.h>
 
  
struct TRegistro {
+
:<math> R = V/I\, </math>
  char nome[30];
 
  int idade;
 
} Registro, *pAux;
 
  
struct TRegistro *LerTab(int indice)
+
:<math> R = (5-1.8)/0.02\, </math>
{
 
}
 
  
void main()
+
:<math> R = 160 Ω\, </math>
{
+
-->
  pAux=LerTab(3);
 
  if (pAux!=0) {
 
      printf("Nome lido %s\n", pAux->nome);
 
  }
 
}
 
</syntaxhighlight>
 
  
 +
=Material complementar=
  
 +
http://www.ime.usp.br/~pf/algoritmos/aulas/lista.html
  
  
Linha 399: Linha 429:
 
! style="background: #cdc5bf;" | [[AULA 20 - Programação 1 - Graduação | << ]]
 
! style="background: #cdc5bf;" | [[AULA 20 - Programação 1 - Graduação | << ]]
 
! style="background: #cdc5bf;" | Aula 21
 
! style="background: #cdc5bf;" | Aula 21
! style="background: #cdc5bf;" | [[PRG1-_Programação_I_-_Graduação | <> ]]
+
! style="background: #cdc5bf;" | [[AULA 22 - Programação 1 - Graduação | >> ]]
 
|}
 
|}

Edição atual tal como às 22h41min de 24 de junho de 2015

Requisito para formação das Equipes

  • Três integrantes por equipe.

Equipes do Projeto Final - Participantes

Equipe1-2015-1

  • MARIA FERNANDA SILVA TUTUI
  • RICARDO AMORIM
  • VITOR MANOEL DA SILVEIRA

Equipe2-2015-1

  • ADONIS ANDREAS MARINOS
  • ANDERSON GASPAR DE MEDEIROS
  • DANIEL TREVISAN TATSCH

Equipe3-2015-1

  • DANIEL CABRAL CORREA
  • PABLO FIDELIS DIAS
  • PAULO HENRIQUE HORST BIANCHIN

Equipe4-2015-1

  • ADILSON GOEDERT SIQUEIRA
  • GUSTAVO VIEIRA ZACCHI
  • RAPHAEL WASHINGTON BAPTISTA GIASSI

Equipe5-2015-1

  • LEONARDO TASCA
  • LUISA MACHADO
  • NATALIA ADRIANA MIRANDA

Equipe6-2015-1

  • AUGUSTO DA SILVEIRA WILLEMANN
  • GABRIEL FARIAS TURNES
  • JEFERSON RICARDO TICHZ ESPINDOLA

Equipe7-2015-1

  • JOAO VITOR DA ANUNCIACAO
  • RAISSA LINHARES GOMES
  • VICTOR CESCONETTO DE PIERI



Material complementar

http://www.ime.usp.br/~pf/algoritmos/aulas/lista.html


<< Aula 21 >>