Introdução a Linguagem de Programação C Fabiano Russo [email_address]
Breve Histórico <ul><li>Em 1973 Dennis Ritchie reescreveu o sistema operacional UNIX em uma linguagem de alto nível (Ling....
C comparado a outras linguagens <ul><li>Devemos entender  Nível Alto  como sendo a capacidade da linguagem em compreender ...
C comparado a outras linguagens Nível Baixo Nível Médio Nível Alto Velocidade Clareza Assembler  C COBOL Basic Pascal Ada ...
Aplicações escritas em C <ul><li>Sistema Operacional: UNIX  </li></ul><ul><li>Planilhas: 1,2,3 e Excel </li></ul><ul><li>B...
Características da Linguagem C <ul><li>Portabilidade entre máquinas e sistemas operacionais. </li></ul><ul><li>Alia caract...
Características da Linguagem C <ul><li>C é uma linguagem compilada: lê todo o código fonte e gera o código objeto (ling. d...
Detalhes Importantes <ul><li>Sempre que o código fonte for alterado ele deve ser novamente compilado. </li></ul><ul><li>C ...
Palavras reservadas <ul><li>São palavras que têm um significado especial para a linguagem. </li></ul><ul><li>auto, break, ...
Bibliotecas <ul><li>Conjunto de funções para realizar tarefas específicas. </li></ul><ul><li>Biblioteca padrão C - ANSI - ...
Estrutura de um programa C <ul><li>/* Primeiro Programa em C */ </li></ul><ul><li>#include <stdio.h> </li></ul><ul><li>mai...
Estrutura de um programa C <ul><li>/* Primeiro Programa em C */  comentários </li></ul><ul><li>#include <stdio.h> /* bibli...
Digitando um programa C <ul><li>Utilizar um editor qualquer: vi ou xedit </li></ul><ul><li>Digite o programa anterior </li...
Compilando e Executando <ul><li>Para compilar: (verifica a sintaxe) </li></ul><ul><ul><ul><li>>> cc  fonte.c  <ENTER> </li...
Variável <ul><li>Variável: “objeto” que pode assumir diversos valores; </li></ul><ul><li>espaço de memória de um certo tip...
Nomes de Variáveis <ul><li>quantos caracteres quiser (32) ; </li></ul><ul><li>comece com letras ou sublinhado: </li></ul><...
Declaração de Variáveis <ul><li>Instrução para reservar uma quantidade de memória para um certo tipo de dado, indicando o ...
Tipos Básicos de Dados <ul><li>determinar um conjunto de valores e as possíveis operações realizadas sobre os mesmos  ; </...
Diferentes tipos de inteiros <ul><li>  </li></ul><ul><li>Long ou Long int  (4 bytes) </li></ul><ul><li>Unsigned  Char  (0 ...
Programa Exemplo – Tipos de Dados e Variáveis <ul><li>#include <stdio.h> </li></ul><ul><li>main( ) </li></ul><ul><li>{ </l...
Comandos básicos <ul><li>Instruções de E/S </li></ul>Entrada de Dados Processamento de dados Saída de Dados
Intruções de E/S – Scanf ( ) <ul><li>Leitura de dados tipados via teclado </li></ul><ul><li>Scanf  (“string de controle”, ...
Comandos de E/S – printf ( ) <ul><li>Apresentação de dados no monitor </li></ul><ul><li>printf (“string de controle”, list...
String de controle <ul><ul><li>%c   caracter </li></ul></ul><ul><ul><li>%d   inteiro </li></ul></ul><ul><ul><li>%e  ...
Exemplo strings de controle <ul><li>#include <stdio.h> </li></ul><ul><li>main ( ) </li></ul><ul><li>{ </li></ul><ul><li>ch...
Operador de Endereço & <ul><li>um endereço de memória é o nome que o computador usa para identificar uma variável </li></u...
Operador de Endereço & <ul><li>Quando usamos & precedendo uma variável estamos falando do endereço desta variável na memór...
Caracteres Especiais <ul><li>n  nova linha  </li></ul><ul><li>r  enter </li></ul><ul><li>t  tabulação (tab) </li></ul><ul>...
Formatando as saídas - printf <ul><li>é possível estabelecer o tamanho mínimo para a impressão de um campo   </li></ul>#in...
Formatando as saídas - printf <ul><li>#include <stdio.h> </li></ul><ul><li>main ( ) </li></ul><ul><li>{ </li></ul><ul><li>...
Programando – Exercício 1 <ul><li>Faça um programa para ler e escrever na tela o seu nome e a sua idade. </li></ul><ul><li...
Programando – Exercício 2 <ul><li>Faça um programa para ler e escrever na tela os seguintes dados: </li></ul><ul><ul><li>N...
Operadores Aritméticos Subtração (unário) - Decremento -- Incremento ++ Resto da divisão inteira % Divisão / Multiplicação...
Operadores Relacionais e Lógicos Condição “E” && Condição “OU” || Não ! Igual a == Diferente de != Menor ou igual que <= M...
Operadores - Observação <ul><li>Em C o resultado da comparação será ZERO se resultar em FALSO e DIFERENTE DE ZERO no caso ...
Operadores - Exemplo <ul><li>#include <stdio.h> </li></ul><ul><li>main ( ) </li></ul><ul><li>{ </li></ul><ul><li>int verda...
Comparações e Testes <ul><li>Observemos antes de mais nada que ++x é diferente de x++!   </li></ul>Se x = 10; y = ++x;  /*...
Programa Exemplo – Pre/Pos Incremento <ul><li>#include<stdio.h> </li></ul><ul><li>main() </li></ul><ul><li>{ </li></ul><ul...
Comparações e Testes <ul><li>Se </li></ul><ul><li>x = 1; </li></ul><ul><li>y = 2; </li></ul><ul><li>printf(“%d == %d e’ %d...
Comparações e Testes <ul><li>if (10 > 4 && !(10 < 9) || 3 <= 4) </li></ul>Como seria avaliado esta instrução? resultaria e...
Operador Sizeof <ul><li>Este operador retorna o tamanho da variável ou tipo que está em seu operando. </li></ul><ul><li>Po...
Conversões de Tipos <ul><li>Quando forem misturadas variáveis de diferentes tipos, o compilador C converterá os operandos ...
Conversões de Tipos - NOTA <ul><li>Nota:  Devemos observar que o compilador C é bastante flexível e pouco vigilante, compo...
Exercícios <ul><li>2) </li></ul><ul><li>3) </li></ul>
Estruturas de Decisão <ul><li>Permitir testes para decidir ações alternativas: </li></ul><ul><ul><li>if </li></ul></ul><ul...
Comando if <ul><li>if (condição) </li></ul><ul><li>instrução; </li></ul># include <stdio.h> main ( ) { char ch; ch = getch...
if aninhados  <ul><li>Se   um comando if está dentro do outro if, dizemos que o if interno está aninhado. </li></ul>#inclu...
Comando if-else <ul><li>O comando if só executa a instrução caso a condição de teste seja verdadeira, nada fazendo se a ex...
Comando if-else <ul><li>if (condição)  </li></ul><ul><li>instrução; </li></ul><ul><li>else </li></ul><ul><li>instrução; </...
Exemplo: Evitar-se divisões por Zero, usando recursos do comando if-else. <ul><li>include <stdio.h> </li></ul><ul><li>main...
Comando if-else aninhados <ul><li>if (condição1) </li></ul><ul><li>instrução </li></ul><ul><li>else if (condição2) </li></...
Como o computador decide de qual  if  o else   pertence?   <ul><li>EX1: </li></ul><ul><li>if (n > 0) </li></ul><ul><li>if ...
Exemplo 1: Programa Adulto, Jovem ou Velho. <ul><li>#include <stdio.h> </li></ul><ul><li>main() </li></ul><ul><li>{ </li><...
Exemplo 2: Maior entre três números <ul><li>main() </li></ul><ul><li>{ </li></ul><ul><li>int a,b,c; </li></ul><ul><li>prin...
Exemplo 3: Dados 2 números apresente-os ordenados. <ul><li>main() </li></ul><ul><li>{ </li></ul><ul><li>int a,b,t; </li></...
Comando ?: <ul><li>Forma compacta de expressar uma instrução if – else </li></ul><ul><li>(condição) ? expressão1 : express...
Exercícios <ul><li>4) </li></ul><ul><li>5) </li></ul><ul><li>6) </li></ul>
Comando Switch <ul><li>Forma de se substituir o comando if – else ao se executar vários testes </li></ul><ul><li>Diversas ...
Comando Switch <ul><li>switch <variável>  { </li></ul><ul><li>case <constante 1> : </li></ul><ul><li><comandos>; </li></ul...
Comando Switch -  Ex: uma calculadora <ul><li>#include <stdio.h> </li></ul><ul><li>main ( ) </li></ul><ul><li>{ </li></ul>...
Exercício <ul><li>Seguindo a idéia do exercício anterior incremente a calculadora com mais funções matemáticas. </li></ul>...
Estruturas de Repetição <ul><li>#include <stdio.h> </li></ul><ul><li>main ( ) </li></ul><ul><li>{ </li></ul><ul><li>  prin...
Estruturas de Repetição <ul><li>for, while, do-while </li></ul><ul><li>repetir uma seqüência de comandos </li></ul>#includ...
Comando for for (<início>;<condição>;<incremento>) <comando>;   <ul><li>Na forma mais simples : </li></ul><ul><li>Iniciali...
Comando for <ul><li>Incremento: </li></ul><ul><ul><li>define como a variável de controle será alterada </li></ul></ul><ul>...
Comando for <ul><li>Flexibilidade: qualquer expressão de um laço “for” pode conter várias instruções separadas por vírgula...
Comando for - Exemplo <ul><li>Exemplo 1: Contagem simples com condição no teste “for”. </li></ul><ul><li>main() </li></ul>...
Comando for –  loop infinito <ul><li>A ausência de condições de inicialização, continuidade e terminação, causarão um proc...
Comando for –  Loop Vazio <ul><li>A presença do ponto e vírgula finalizando o comando, força a execução do loop sem que se...
Comando for –  Loop Finito <ul><li>Ao contrário de outras linguagens que não permitem o término do loop a não ser quando a...
Comando While <ul><li>while <condição> <comando>;   </li></ul>Exemplo: Contagem #include <stdio.h> main() { int i=0; while...
Comando do - while <ul><li>Ao contrário das estruturas “for” e “while” que testam a condição no começo do loop, “do / whil...
<ul><li>/ * testa a capacidade de adivinhar uma letra * / </li></ul><ul><li>#include <stdio.h> </li></ul><ul><li>main ( ) ...
Exercícios
Funções / Procedimentos <ul><li>Dividir uma tarefa complexa em tarefas menores, permitindo esconder detalhes de implementa...
Procedimentos <ul><li>“ Funções” que não retornam valores  </li></ul><ul><li>Tipo: void   </li></ul>#include <stdio.h>  vo...
Funções <ul><li>Retornam valores </li></ul>#include <stdio.h> int  fatorial (int); int  fatorial (int  n) { int  i, result...
Variáveis locais <ul><li>Variáveis declaradas dentro de uma função são denominadas locais e somente podem ser usadas dentr...
Variáveis Locais <ul><li>void desenha ( ) </li></ul><ul><li>{ </li></ul><ul><li>  int  i, j; </li></ul><ul><li>  .  .  . <...
Variáveis Globais <ul><li>Variável que é declarada externamente podendo ser acessada por qualquer função   </li></ul>#incl...
Comando Return <ul><li>Causa a atribuição da expressão a função </li></ul><ul><li>forçando o retorno imediato ao ponto de ...
<ul><li>Note pelo exemplo anterior que a função minúsculo lê um valor internamente convertendo-o para minúsculo.  </li></u...
Passando dados para função <ul><li>Passagem de parâmetro por valor - uma cópia do argumento é passada para a função </li><...
Passando dados  para função <ul><li>main ( )  </li></ul><ul><li>{ </li></ul><ul><li>printf (“ %c”, minúsculo (‘A’) ); </li...
Passando dados para função - Exemplo <ul><li>#include <stdio.h> </li></ul><ul><li>main ( ) </li></ul><ul><li>{ </li></ul><...
Passando vários argumentos <ul><li>Ex 1: </li></ul><ul><li>float área_retângulo  (float  largura, float  altura) </li></ul...
Usando várias funções:  calcular a seguinte seqüência <ul><li>S(x, n) = x/1!  +  x 2 /2!  +  x 3 /3!  +  ... +  x n / n! <...
float  potencia (float  base,  int expoente) { int i;  float  resultado = 1;    if (expoente == 0) return 1; for (i = 1;  ...
int  fat (int n) { int i, resultado = 1;   for ( i = 1;  i <= n;  i ++) resultado *= i; return resultado; }
Vetores <ul><li>tipo de dado usado para representar uma coleção de variáveis de um mesmo tipo </li></ul><ul><li>  estrutur...
Ex: Calcular a média de 300 alunos <ul><li>#include<stdio.h> </li></ul><ul><li>#define N_ALUNOS  40 </li></ul><ul><li>  ma...
Vetores – Observações importantes <ul><li>em ‘C’ não existe declaração de vetor  dinâmico </li></ul><ul><li>o tamanho de u...
Vetores – Observações importantes <ul><li>Solução:   declarar um vetor que suporte um número máximo de elementos   </li></...
Vetores – Observações importantes <ul><li>C não realiza verificação de limites em vetores </li></ul><ul><li>nada impede o ...
Vetores – Obs importantes <ul><li>#include <stdio.h> </li></ul><ul><li>#define TAMANHO  100 </li></ul><ul><li>main( ) </li...
Passando um vetor para uma função <ul><li>#include <stdio.h> </li></ul><ul><li>int maximum( int [] );  /* ANSI function pr...
int  maximum( int values[5] ) { int  max_value, i; max_value = values[0]; for( i = 0; i < 5; ++i ) if( values[i] > max_val...
Matrizes <ul><li>em ‘C’ podemos definir um vetor em que cada posição temos um outro vetor (matriz). </li></ul><ul><li>estr...
Matrizes - Leitura <ul><li>int  i,  j, matéria [ 4 ] [ 40 ]; </li></ul><ul><li>for ( i = 0 ; i < 4; i++ ) { </li></ul><ul>...
Variável String <ul><li>matriz do tipo char terminada pelo caractere null ‘0’ </li></ul><ul><li>cada caractere de um strin...
Lendo Strings <ul><li>scanf :  lê o string até que um branco seja encontrado   </li></ul>Ex: main ( )  { char  nome[40]; p...
Lendo Strings <ul><li>Gets </li></ul><ul><ul><ul><li>lê caracteres até encontrar  ‘n’  </li></ul></ul></ul><ul><ul><ul><li...
Imprimindo Strings <ul><li>printf </li></ul><ul><li>puts </li></ul>Ex: main ( )  { char  nome[40]; printf ( “Digite seu no...
Funções de manipulação de strings <ul><li>Strlen </li></ul><ul><ul><ul><li>retorna o tamanho do string  -  não conta ‘0’  ...
Funções de manipulação de strings <ul><li>strcat ( str1, str2 ) </li></ul><ul><ul><ul><li>concatena str2 ao final de str1 ...
Funções de manipulação de strings <ul><li>strcmp ( str1, str2 ) </li></ul><ul><li>  compara dois strings retornando: </li>...
<ul><li>#include <stdio.h> </li></ul><ul><li>main ( )  </li></ul><ul><li>{ </li></ul><ul><li>char  nome[40]  = “Jose”; </l...
Conversões <ul><li>podemos também converter strings e números (inteiros/fracionários) conforme desejarmos:   </li></ul>Exe...
Ponteiros <ul><li>Ponteiros, como o próprio nome diz, é um tipo de variável que aponta para outra (de um tipo qualquer). N...
Ponteiros <ul><li>int teste=20; </li></ul><ul><li>int *p; </li></ul><ul><li>p=&teste; </li></ul><ul><li>p irá armazenar o ...
Ponteiros Outro exemplo: char algo[5] = { 5, 4, 3, 2, 1 }; char *c; c=&algo[2]; Colocamos em c o endereço do terceiro elem...
Ponteiros <ul><li>int vet_notas[50]; </li></ul><ul><li>int *pont_notas; </li></ul><ul><li>pont_notas=vet_notas; </li></ul>...
Equivalência entre vetores e ponteiros <ul><li>vet_notas[0]==*(pont_notas); </li></ul><ul><li>vet_notas[1]==*(pont_notas+1...
Malloc e Free <ul><li>Alocação dinâmica </li></ul><ul><li>#include <stdio.h> </li></ul><ul><li>main() </li></ul><ul><li>{ ...
Printf(“Entre com o número total de alunosn’”); scanf(“%d”, &numero); notas=(int *)malloc(numero * sizeof(int)); for (i=0;...
Estruturas <ul><li>Uma estrutura é um conjunto de variáveis dentro de um mesmo nome. Em geral, uma variável é de um tipo e...
Estruturas <ul><li>struct molde_conta </li></ul><ul><li>{ </li></ul><ul><li>char nome[50]; </li></ul><ul><li>int telefone;...
Estruturas <ul><li>struct molde_conta </li></ul><ul><li>{ </li></ul><ul><li>char nome[50]; </li></ul><ul><li>int telefone;...
Estrutras - Utilização do tipo <ul><li>Podemos fazer atribuição de structs, do tipo conta2 = conta, e os valores serão idê...
Vetores de Estruturas <ul><li>struct molde_conta conta[100]; </li></ul><ul><ul><li>conta[1].telefone=2212324; </li></ul></...
Arquivos - feopen( ) <ul><li>A função “fopen” tem duas finalidades: </li></ul><ul><ul><li>- abrir uma fila de bytes </li><...
<ul><li>Modo   Significado </li></ul><ul><li>“ r”   Abre Arquivo de Texto para Leitura </li></ul><ul><li>“ w”   Cria Arqui...
Arquivos - putc ( ) <ul><li>Grava caracteres em fila previamente abertos </li></ul><ul><li>int putc(int ch, FILE *fp); </l...
Arquivos - getc ( ) <ul><li>Ler caracteres em uma fila aberta </li></ul><ul><li>int getc(FILE *arquivo); </li></ul><ul><li...
Arquivos - fclose ( ) <ul><li>Fechar as filas abertas. Caso o programa seja encerrado sem que as filas sejam fechadas, dad...
main() { FILE *arq; char ch; if ((arq=fopen(“teste.dat”,”w”)) == NULL) { printf(“Arquivo não pode ser  criadon”); exit(1);...
Arquivos - ferror ( ) <ul><li>Determina se a operação de arquivo produziu um erro. Sua forma geral será: </li></ul><ul><li...
Arquivos - rewind( ) <ul><li>Reinicia o arquivo, equivale ao Reset do Pascal, ou seja apenas movimenta o ponteiro do arqui...
Arquivos - fwrite ( ) fread ( ) <ul><li>Permitem que leiamos/gravemos blocos de dados, sua forma geral é a seguinte: </li>...
Arquivos - fwrite ( )  <ul><li>main() </li></ul><ul><li>{ </li></ul><ul><li>FILE *fp; </li></ul><ul><li>float f = 12.23; <...
Arquivos - fseek ( ) <ul><li>Entrada e saída com acesso aleatório </li></ul><ul><li>int fseek(FILE *fp, long int num_bytes...
<ul><ul><li>Exemplo : Leitura de um caracter em um arquivo binário. </li></ul></ul><ul><li>main() </li></ul><ul><li>{ </li...
<ul><ul><ul><li>carga() </li></ul></ul></ul><ul><ul><ul><li>{ </li></ul></ul></ul><ul><ul><ul><li>FILE *fp; </li></ul></ul...
<ul><ul><ul><li>salvar() </li></ul></ul></ul><ul><ul><ul><li>{ </li></ul></ul></ul><ul><ul><ul><li>FILE *fp; </li></ul></u...
<ul><li>Vamos supor que desejamos criar um programa que escreva num arquivo cujo nome será fornecido na chamada do program...
<ul><ul><ul><li>main(argv,argc) </li></ul></ul></ul><ul><li>onde </li></ul><ul><li>argc - tem o número de argumentos conti...
Exemplo 1: Programa KTOD, que escreve caracteres num arquivo criado/aberto via D.O.S. <ul><li>#include “stdio.h” </li></ul...
<ul><li>if ((fp=fopen(argv[1],”w”)) == NULL) { </li></ul><ul><li>printf(“Arquivo não pode ser aberton”); </li></ul><ul><li...
<ul><ul><li>Exemplo 2: Programa DTOV, que apresenta em vídeo os  </li></ul></ul><ul><ul><li>caracteres digitados via KTOD....
do { putchar(ch); ch=getc(fp); } while( ch != ‘$’); fclose(fp); }
Exemplo 3: Programa para copiar Arquivos. #include “stdio.h” main(argc,argv) int argc; char *argv[]; { FILE *in, *out; cha...
Upcoming SlideShare
Loading in...5
×

Introdução a Linguagem C

24,915

Published on

3 Comments
6 Likes
Statistics
Notes
No Downloads
Views
Total Views
24,915
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
737
Comments
3
Likes
6
Embeds 0
No embeds

No notes for slide

Introdução a Linguagem C

  1. 1. Introdução a Linguagem de Programação C Fabiano Russo [email_address]
  2. 2. Breve Histórico <ul><li>Em 1973 Dennis Ritchie reescreveu o sistema operacional UNIX em uma linguagem de alto nível (Ling. C). </li></ul><ul><li>Surgem diversas implementações utilizando C, porém os códigos gerados eram incompatíveis. </li></ul><ul><li>ANSI (American National Standard Institute), em 1983 padronizou a ling. C. </li></ul>
  3. 3. C comparado a outras linguagens <ul><li>Devemos entender Nível Alto como sendo a capacidade da linguagem em compreender instruções escritas em “ dialetos ” próximos do inglês (Ada e Pascal, por exemplo) e Nível Baixo para aquelas linguagens que se aproximam do assembly , que é a linguagem própria da máquina , compostas por instruções binárias e outras incompreensíveis para o ser humano não treinado para este propósito. Infelizmente, quanto mais clara uma linguagem for para o humano (simplicidade >) mais obscura o será para a máquina (velocidade <). </li></ul>
  4. 4. C comparado a outras linguagens Nível Baixo Nível Médio Nível Alto Velocidade Clareza Assembler C COBOL Basic Pascal Ada Modula -2
  5. 5. Aplicações escritas em C <ul><li>Sistema Operacional: UNIX </li></ul><ul><li>Planilhas: 1,2,3 e Excel </li></ul><ul><li>Banco de Dados: dBase III, IV e Access ( gerenciador de base de dados). </li></ul><ul><li>Aplicações Gráficas: Efeitos Especiais de filmes como Star Trek e Star War. </li></ul>
  6. 6. Características da Linguagem C <ul><li>Portabilidade entre máquinas e sistemas operacionais. </li></ul><ul><li>Alia características de linguagens de alto e baixo nível (liberdade ao programador). </li></ul><ul><li>Programas Estruturados. </li></ul><ul><li>Total interação com o Sistema Operacional. </li></ul><ul><li>Código compacto e rápido, quando comparado ao código de outras linguagem de complexidade análoga. </li></ul>
  7. 7. Características da Linguagem C <ul><li>C é uma linguagem compilada: lê todo o código fonte e gera o código objeto (ling. de máquina) uma única vez. </li></ul><ul><li>Linguagens Interpretadas: lê o código fonte, traduz e executa cada vez que o programa for executado. </li></ul>
  8. 8. Detalhes Importantes <ul><li>Sempre que o código fonte for alterado ele deve ser novamente compilado. </li></ul><ul><li>C é “case senitive” </li></ul><ul><li>Deve-se listar antecipadamente todas a as variáveis utilizadas no programa. </li></ul>
  9. 9. Palavras reservadas <ul><li>São palavras que têm um significado especial para a linguagem. </li></ul><ul><li>auto, break, case, if, for, while, begin, end, continue, return, const,.... </li></ul><ul><li>C entende tais palavras apenas em letras minúsculas </li></ul>
  10. 10. Bibliotecas <ul><li>Conjunto de funções para realizar tarefas específicas. </li></ul><ul><li>Biblioteca padrão C - ANSI - funções básicas. </li></ul><ul><li>As primeiras linhas do programa indicam as bibliotecas utilizadas </li></ul><ul><li>#include “minha_biblioteca.h” ou </li></ul><ul><li>#include <minha_biblioteca.h> </li></ul>
  11. 11. Estrutura de um programa C <ul><li>/* Primeiro Programa em C */ </li></ul><ul><li>#include <stdio.h> </li></ul><ul><li>main() </li></ul><ul><li>{ </li></ul><ul><li>printf(“Meu primeiro programa em Cn”); </li></ul><ul><li>} </li></ul>
  12. 12. Estrutura de um programa C <ul><li>/* Primeiro Programa em C */ comentários </li></ul><ul><li>#include <stdio.h> /* biblioteca de E/S */ </li></ul><ul><li>main() /* função principal – inicio do programa*/ </li></ul><ul><li>{ /* marca início da função*/ </li></ul><ul><li>printf(“Meu primeiro programa em Cn”); /* função para escrever na tela*/ </li></ul><ul><li>} /* marca fim da função*/ </li></ul>
  13. 13. Digitando um programa C <ul><li>Utilizar um editor qualquer: vi ou xedit </li></ul><ul><li>Digite o programa anterior </li></ul><ul><li>Salve com o nome p1.c </li></ul>
  14. 14. Compilando e Executando <ul><li>Para compilar: (verifica a sintaxe) </li></ul><ul><ul><ul><li>>> cc fonte.c <ENTER> </li></ul></ul></ul><ul><li>Para compilar e gerar executável: </li></ul><ul><ul><ul><li>>> cc fonte.c –o nomeexec <ENTER> </li></ul></ul></ul><ul><li>Executando: </li></ul><ul><ul><li>>> ./nomeexec <ENTER> </li></ul></ul><ul><li>OBS: </li></ul><ul><li>Se o nome do executável não for informado o default é a.out </li></ul>
  15. 15. Variável <ul><li>Variável: “objeto” que pode assumir diversos valores; </li></ul><ul><li>espaço de memória de um certo tipo de dado associado a um nome para referenciar seu conteúdo </li></ul><ul><li>Main ( ) </li></ul><ul><li>{ </li></ul><ul><li> int idade; </li></ul><ul><li> idade = 30; </li></ul><ul><li>  printf (“ A idade é : %d”, idade); </li></ul><ul><li>} </li></ul>
  16. 16. Nomes de Variáveis <ul><li>quantos caracteres quiser (32) ; </li></ul><ul><li>comece com letras ou sublinhado: </li></ul><ul><ul><ul><li>Seguidos de letras, números ou sublinhados </li></ul></ul></ul><ul><li>C é sensível ao caso: </li></ul><ul><ul><ul><li>peso <> Peso <> pEso </li></ul></ul></ul><ul><li>não podemos definir um identificador com o mesmo nome que uma palavra chave </li></ul><ul><ul><ul><li>auto static extern int long if while do ...... </li></ul></ul></ul>
  17. 17. Declaração de Variáveis <ul><li>Instrução para reservar uma quantidade de memória para um certo tipo de dado, indicando o nome pelo qual a área será referenciad a </li></ul><ul><ul><li>>> tipo nome-da-variável; ou </li></ul></ul><ul><ul><li>>> tipo nome1, nome2,...,nomen </li></ul></ul><ul><ul><li>EX: char nome; </li></ul></ul><ul><ul><li>int idade, num; </li></ul></ul>
  18. 18. Tipos Básicos de Dados <ul><li>determinar um conjunto de valores e as possíveis operações realizadas sobre os mesmos ; </li></ul><ul><li>informa a quantidade de memória (bytes) ; </li></ul>tipo bytes escala char 1 -128 a 127 int 2 -32.768 a 32.767 float 4 3.4e-38 a 3.4e+38 double 8 1.7e-308 a 1.7e+308
  19. 19. Diferentes tipos de inteiros <ul><li>  </li></ul><ul><li>Long ou Long int (4 bytes) </li></ul><ul><li>Unsigned Char (0 a 255) </li></ul><ul><li>Unsigned int (0 a 65.535) </li></ul><ul><li>  </li></ul><ul><li>obs: int tem sempre o tamanho da palavra da máquina </li></ul>
  20. 20. Programa Exemplo – Tipos de Dados e Variáveis <ul><li>#include <stdio.h> </li></ul><ul><li>main( ) </li></ul><ul><li>{ </li></ul><ul><ul><li>int soma=10; </li></ul></ul><ul><ul><li>float money=2.21; </li></ul></ul><ul><ul><li>char letra= ´A´; </li></ul></ul><ul><ul><li>double pi=2.01E6; </li></ul></ul><ul><ul><li>printf (“valor da soma = %dn”, soma); </li></ul></ul><ul><ul><li>printf (“Valor de Money = %fn”, money); </li></ul></ul><ul><ul><li>printf(“Valor de Letra = %cn”, letra); </li></ul></ul><ul><ul><li>printf(“Valor de Pi = %en”, pi); </li></ul></ul><ul><li>} </li></ul>
  21. 21. Comandos básicos <ul><li>Instruções de E/S </li></ul>Entrada de Dados Processamento de dados Saída de Dados
  22. 22. Intruções de E/S – Scanf ( ) <ul><li>Leitura de dados tipados via teclado </li></ul><ul><li>Scanf (“string de controle”, lista de argumentos); </li></ul><ul><li>Exemplo: </li></ul><ul><li>scanf(“%d”,&idade); </li></ul>OBS : Para seqüência de caracteres (%s), o caracter & não deverá ser usado.
  23. 23. Comandos de E/S – printf ( ) <ul><li>Apresentação de dados no monitor </li></ul><ul><li>printf (“string de controle”, lista de argumentos); </li></ul><ul><li>Exemplo: </li></ul><ul><li>printf (“Digite a sua idade:n”); </li></ul><ul><li>scanf (“%d”, &idade); </li></ul><ul><li>printf(“Sua idade é: %d”, idade); </li></ul>
  24. 24. String de controle <ul><ul><li>%c  caracter </li></ul></ul><ul><ul><li>%d  inteiro </li></ul></ul><ul><ul><li>%e  número ou notação científica </li></ul></ul><ul><ul><li>%f  ponto flutuante </li></ul></ul><ul><ul><li>%o  octal </li></ul></ul><ul><ul><li>%x  hexadecimal </li></ul></ul><ul><ul><li>%s  string (cadeia de caracteres) </li></ul></ul><ul><ul><li>%lf  double </li></ul></ul>
  25. 25. Exemplo strings de controle <ul><li>#include <stdio.h> </li></ul><ul><li>main ( ) </li></ul><ul><li>{ </li></ul><ul><li>char a ; </li></ul><ul><li>printf ( “digite um caracter” ); </li></ul><ul><li>scanf ( “ % c”, &a ); </li></ul><ul><li>printf (“ n %c = %d em decimal”, a, a); </li></ul><ul><li>printf (“%o em octal, %x em hexadecimal”, a, a); </li></ul><ul><li>} </li></ul><ul><li>  </li></ul><ul><li>Digitando m: </li></ul><ul><li>  m = 109 em decimal, 155 em octal, 6d em hexadecimal </li></ul>
  26. 26. Operador de Endereço & <ul><li>um endereço de memória é o nome que o computador usa para identificar uma variável </li></ul><ul><li>toda variável ocupa uma área de memória e seu endereço é o primeiro byte por ela ocupado </li></ul><ul><li>Ex : </li></ul><ul><li>inteiro  2  bytes </li></ul><ul><li>float  4 bytes </li></ul><ul><li>char  1 byte </li></ul>
  27. 27. Operador de Endereço & <ul><li>Quando usamos & precedendo uma variável estamos falando do endereço desta variável na memória </li></ul>Ex: Main ( ) { int num; num = 2; printf (“valor = %d, endereço = %Iu”, num,&num); } Saída: valor = 2, endereço = 1230 Varia conforme memória da máquina
  28. 28. Caracteres Especiais <ul><li>n nova linha </li></ul><ul><li>r enter </li></ul><ul><li>t tabulação (tab) </li></ul><ul><li>b retrocesso </li></ul><ul><li>” aspas </li></ul><ul><li> barra </li></ul>
  29. 29. Formatando as saídas - printf <ul><li>é possível estabelecer o tamanho mínimo para a impressão de um campo </li></ul>#include <stdio.h> main ( ) { printf (“os alunos são %2d n”, 350); printf (“os alunos são %4d n”, 350); printf (“os alunos são %5d n”, 350); } Saída: os alunos são 350 os alunos são 350 os alunos são 350
  30. 30. Formatando as saídas - printf <ul><li>#include <stdio.h> </li></ul><ul><li>main ( ) </li></ul><ul><li>{ </li></ul><ul><li>printf (“ %3.1f n”, 3456.78); </li></ul><ul><li>printf (“ %10.3f n”, 3456.78); </li></ul><ul><li>} </li></ul><ul><li>  </li></ul>Saída: 3456.8 3456.780
  31. 31. Programando – Exercício 1 <ul><li>Faça um programa para ler e escrever na tela o seu nome e a sua idade. </li></ul><ul><li>#include <stdio.h> </li></ul><ul><li>main( ) </li></ul><ul><li>{ </li></ul><ul><ul><li>int idade; </li></ul></ul><ul><ul><li>char nome[30]; </li></ul></ul><ul><ul><li>printf (“Digite o seu nome:n”); </li></ul></ul><ul><ul><li>scanf(“%s”, nome); </li></ul></ul><ul><ul><li>printf (“Digite a sua idade:n”); </li></ul></ul><ul><ul><li>scanf (“%d”, &idade); </li></ul></ul><ul><ul><li>printf(“A idade do(a) %s é %d”,nome, idade); </li></ul></ul><ul><li>} </li></ul>
  32. 32. Programando – Exercício 2 <ul><li>Faça um programa para ler e escrever na tela os seguintes dados: </li></ul><ul><ul><li>Nome </li></ul></ul><ul><ul><li>Endereço </li></ul></ul><ul><ul><li>Telefone </li></ul></ul><ul><ul><li>Cidade </li></ul></ul><ul><ul><li>Cep </li></ul></ul>
  33. 33. Operadores Aritméticos Subtração (unário) - Decremento -- Incremento ++ Resto da divisão inteira % Divisão / Multiplicação * Adição + Ação Operador
  34. 34. Operadores Relacionais e Lógicos Condição “E” && Condição “OU” || Não ! Igual a == Diferente de != Menor ou igual que <= Menor que < Maior ou igual que >= Maior que > Ação Operador
  35. 35. Operadores - Observação <ul><li>Em C o resultado da comparação será ZERO se resultar em FALSO e DIFERENTE DE ZERO no caso de obtermos VERDADEIRO num teste qualquer. </li></ul>
  36. 36. Operadores - Exemplo <ul><li>#include <stdio.h> </li></ul><ul><li>main ( ) </li></ul><ul><li>{ </li></ul><ul><li>int verdadeiro, falso; </li></ul><ul><li>  </li></ul><ul><li>verdadeiro = (15 < 20); </li></ul><ul><li>falso = (15 == 20); </li></ul><ul><li>printf(“Verd.= %d,Falso= %d”, </li></ul><ul><li>verdadeiro, falso); </li></ul><ul><li>} </li></ul>Saída: Verd.=1 Falso = 0
  37. 37. Comparações e Testes <ul><li>Observemos antes de mais nada que ++x é diferente de x++! </li></ul>Se x = 10; y = ++x; /* x=x+1; y=x; */ então x = 11 e y = 11 porém Se x = 10; y = x++; /* y=x; x=x+1 */ então x = 11 e y = 10
  38. 38. Programa Exemplo – Pre/Pos Incremento <ul><li>#include<stdio.h> </li></ul><ul><li>main() </li></ul><ul><li>{ </li></ul><ul><li>int cont = 0, loop; </li></ul><ul><li>loop=++cont; </li></ul><ul><li>printf(“Loop=%d, Cont=%dn”, loop, cont); </li></ul><ul><li>loop=cont++; </li></ul><ul><li>printf(“Loop=%d, Cont=%dn”, loop, cont); </li></ul>Quais são as saídas deste programa ?
  39. 39. Comparações e Testes <ul><li>Se </li></ul><ul><li>x = 1; </li></ul><ul><li>y = 2; </li></ul><ul><li>printf(“%d == %d e’ %dn”, x, y, x==y ) </li></ul>Qual seria a saída deste comando? resultaria em 1 == 2 0 (pois a expressão é falsa)
  40. 40. Comparações e Testes <ul><li>if (10 > 4 && !(10 < 9) || 3 <= 4) </li></ul>Como seria avaliado esta instrução? resultaria em Verdadeiro, pois dez é maior que quatro E dez não é menor que nove OU três é menor ou igual a quatro
  41. 41. Operador Sizeof <ul><li>Este operador retorna o tamanho da variável ou tipo que está em seu operando. </li></ul><ul><li>Por exemplo “sizeof(char)” resultaria em 1. </li></ul>
  42. 42. Conversões de Tipos <ul><li>Quando forem misturadas variáveis de diferentes tipos, o compilador C converterá os operandos para o tipo de operando maior, de acordo com as regras descritas a seguir: </li></ul><ul><li>1-Todo char e short int é convertido para int. Todo float é convertido para double. </li></ul><ul><li>2-Para os demais pares de operandos valem as seguintes regras em seqüência: </li></ul><ul><ul><li>2.1- Se um operando for long double, o outro também o será. </li></ul></ul><ul><ul><li>2.2- Se um operando for double, o outro também o será. </li></ul></ul><ul><ul><li>2.3- Se um operando for long, o outro também o será. </li></ul></ul><ul><ul><li>2.4- Se um operando for unsigned, o outro também o será. </li></ul></ul>
  43. 43. Conversões de Tipos - NOTA <ul><li>Nota: Devemos observar que o compilador C é bastante flexível e pouco vigilante, comportando-se de maneira muito diferente de um compilador Clipper ou Pascal, sempre vigilantes com relação aos tipos das variáveis. De fato aqueles compiladores podem gerar executáveis misturando tipos, porém a ocorrência de erros de execução é quase inevitável. Ao contrário destes compiladores, os compiladores C “ajeitam” as coisas para o programa funcionar da “melhor maneira possível”, o que não significa em hipótese alguma que os resultados serão os esperados por programadores “relapsos”. Assim esta boa característica dos compiladores C, pode transformar-se numa autêntica “bomba relógio” para programas não muito bem elaborados. </li></ul>
  44. 44. Exercícios <ul><li>2) </li></ul><ul><li>3) </li></ul>
  45. 45. Estruturas de Decisão <ul><li>Permitir testes para decidir ações alternativas: </li></ul><ul><ul><li>if </li></ul></ul><ul><ul><li>if - else </li></ul></ul><ul><ul><li>switch </li></ul></ul><ul><ul><li>(?:) Operador Condicional </li></ul></ul>
  46. 46. Comando if <ul><li>if (condição) </li></ul><ul><li>instrução; </li></ul># include <stdio.h> main ( ) { char ch; ch = getchar ( ); if (ch == ‘p’) printf (“você pressionou a tecla p”); } if (condição) { instrução1; intrução2; } #include <stdio.h> main ( ) { if (getchar()) == ‘p’ ) { printf (“ você digitou p”); printf (“ pressione outra tecla ”); getchar( ); } }
  47. 47. if aninhados <ul><li>Se um comando if está dentro do outro if, dizemos que o if interno está aninhado. </li></ul>#include <stdio.h> main ( ) { char ch; printf (“ digite uma letra entre A e Z”); ch = getchar ( ); if (ch >= ‘A’) if (ch < = ‘Z’) printf (“ você acertou”); } #include <stdio.h> main ( ) { char ch; printf (“ digite uma letra entre A e Z”); ch = getchar ( ); if ((ch >= ‘A’) && (ch < = ‘Z’)) printf (“ você acertou”); }
  48. 48. Comando if-else <ul><li>O comando if só executa a instrução caso a condição de teste seja verdadeira, nada fazendo se a expressão for falsa. </li></ul><ul><li>O comando else executará uma instrução ou um conjunto de instruções se a expressão for falsa. </li></ul>
  49. 49. Comando if-else <ul><li>if (condição) </li></ul><ul><li>instrução; </li></ul><ul><li>else </li></ul><ul><li>instrução; </li></ul>#include <stdio.h> main ( ) { if (getchar ( ) == ‘p’) printf (“ você digitou p”); else printf (“ você não digitou p”); }
  50. 50. Exemplo: Evitar-se divisões por Zero, usando recursos do comando if-else. <ul><li>include <stdio.h> </li></ul><ul><li>main() </li></ul><ul><li>{ </li></ul><ul><li>int a,b; </li></ul><ul><li>printf(“Digite 2 números: “); </li></ul><ul><li>scanf(“%d %d”,&a,&b); </li></ul><ul><li>if (b) </li></ul><ul><li>printf(“%f”,a/b); </li></ul><ul><li>else </li></ul><ul><li>printf(“Nao posso dividir por zeron”); </li></ul><ul><li>} </li></ul>
  51. 51. Comando if-else aninhados <ul><li>if (condição1) </li></ul><ul><li>instrução </li></ul><ul><li>else if (condição2) </li></ul><ul><li>instrução </li></ul><ul><li>else if (condição3)... </li></ul>#include <stdio.h> main ( ) { int número; scanf (“ % d”, &número);   if (número < 0) printf (“número menor que zero”); else if (número < 10) printf (“ número  e < 10”); else if (número < 100) printf (“número  10 e < 100); else printf (“número  100”); }
  52. 52. Como o computador decide de qual if o else pertence? <ul><li>EX1: </li></ul><ul><li>if (n > 0) </li></ul><ul><li>if (a > b){ </li></ul><ul><li>z = a; </li></ul><ul><li>calculafatorial(z); </li></ul><ul><li>} </li></ul><ul><li>else </li></ul><ul><li>z = b; </li></ul>Ex1: Quando n > 0 e a < b Ex2: Quando n < 0 <ul><li>else é sempre associado ao if mais interno </li></ul><ul><li>quando z = b será executado? </li></ul>Ex2: if (n > 0) { if (a > b) z = a; } else z = b;
  53. 53. Exemplo 1: Programa Adulto, Jovem ou Velho. <ul><li>#include <stdio.h> </li></ul><ul><li>main() </li></ul><ul><li>{ </li></ul><ul><li>int i; </li></ul><ul><li>printf(“Digite sua idade: “); </li></ul><ul><li>scanf(“%d”,&i); </li></ul><ul><li>if (i > 70) </li></ul><ul><li>printf(“Esta Velho!”); </li></ul><ul><li>else </li></ul><ul><li>if (i > 21) </li></ul><ul><li>printf(“Adulto”); </li></ul><ul><li>else </li></ul><ul><li>printf(“Jovem”); </li></ul><ul><li>} </li></ul>
  54. 54. Exemplo 2: Maior entre três números <ul><li>main() </li></ul><ul><li>{ </li></ul><ul><li>int a,b,c; </li></ul><ul><li>printf(“Digite o 1º Número: “); </li></ul><ul><li>scanf(“%d”,&a); </li></ul><ul><li>printf(“nDigite o 2º Número: “); </li></ul><ul><li>scanf(“%d”,&b); </li></ul><ul><li>printf(“nDigite o 3º Número: “); </li></ul><ul><li>scanf(“%d”,&c); </li></ul><ul><li>if (a > b) </li></ul><ul><li>if (a > c) </li></ul><ul><li>printf(“nO Maior é %d”,a); </li></ul><ul><li>else </li></ul><ul><li>printf(“nO Maior é %d”,c); </li></ul><ul><li>else </li></ul><ul><li>if (b > c) </li></ul><ul><li>printf(“nO Maior é %d”,b); </li></ul><ul><li>else </li></ul><ul><li>printf(“nO Maior é %d”,c); </li></ul><ul><li>} </li></ul>main() { int a,b,c,d; cls(); printf(“Digite o 1º Número: “); scanf(“%d”,&a); printf(“nDigite o 2º Número: “); scanf(“%d”,&b); printf(“nDigite o 3º Número: “); scanf(“%d”,&c); if (a > b) d = a; else d = b; if (c > d) printf(“nO Maior é %d”,c); else printf(“nO Maior é %d”,d); }
  55. 55. Exemplo 3: Dados 2 números apresente-os ordenados. <ul><li>main() </li></ul><ul><li>{ </li></ul><ul><li>int a,b,t; </li></ul><ul><li>printf(“Digite o 1º Número: “); </li></ul><ul><li>scanf(“%d”,&a); </li></ul><ul><li>printf(“nDigite o 2º Número: “); </li></ul><ul><li>scanf(“%d”,&b); </li></ul><ul><li>if (a < b) { </li></ul><ul><li>t = a; </li></ul><ul><li>a = b; </li></ul><ul><li>b = t; </li></ul><ul><li>} </li></ul><ul><li>printf(“nOrdenados: %d e %d “,b,a); </li></ul><ul><li>} </li></ul>
  56. 56. Comando ?: <ul><li>Forma compacta de expressar uma instrução if – else </li></ul><ul><li>(condição) ? expressão1 : expressão2 </li></ul><ul><li>Max = (num1 > num2) ? num1 : num2 </li></ul><ul><li>Note: </li></ul><ul><ul><li>if (num1 > num2) max = num1; </li></ul></ul><ul><ul><li>else max = num2; </li></ul></ul><ul><li>Exemplo: </li></ul><ul><ul><li>ABS = (num < 0) ? - num : num; </li></ul></ul>
  57. 57. Exercícios <ul><li>4) </li></ul><ul><li>5) </li></ul><ul><li>6) </li></ul>
  58. 58. Comando Switch <ul><li>Forma de se substituir o comando if – else ao se executar vários testes </li></ul><ul><li>Diversas vezes precisamos determinar se um valor encontra-se numa lista de valores. Apesar de podermos usar uma seqüência de ifs, este recurso além de não ser elegante, por vezes confunde o entendimento do programa. Vejamos uma opção melhor: o comando switch. </li></ul>
  59. 59. Comando Switch <ul><li>switch <variável> { </li></ul><ul><li>case <constante 1> : </li></ul><ul><li><comandos>; </li></ul><ul><li>[break;] </li></ul><ul><li>case <constante 2> : </li></ul><ul><li><comandos>; </li></ul><ul><li>[break;] </li></ul><ul><li>case <constante 3> : </li></ul><ul><li><comandos>; </li></ul><ul><li>[break;] </li></ul><ul><li>[default : </li></ul><ul><li><comandos>;] </li></ul><ul><li>} </li></ul><ul><li>OBS: </li></ul><ul><li>“ variável” deve ser uma variável do tipo inteiro ou caracter; </li></ul><ul><li>“ break” serve para terminar a seqüência de comandos em execução, por serem opcionais, se forem suprimidos permitem que o “case” a seguir seja executado, sem haver qualquer quebra na seqüência do processamento. </li></ul>
  60. 60. Comando Switch - Ex: uma calculadora <ul><li>#include <stdio.h> </li></ul><ul><li>main ( ) </li></ul><ul><li>{ </li></ul><ul><li>char op; </li></ul><ul><li>float num 1, num 2; </li></ul><ul><li>  </li></ul><ul><li> printf (“ digite um n.o, um operador e um n.o”); </li></ul><ul><li> scanf (“ %f %c %f”, &num1, &op, &num2); </li></ul><ul><li> switch (op) { </li></ul><ul><li>case ‘+’: </li></ul><ul><li> printf (“ = %f”, num 1 + num 2); </li></ul><ul><li> break: </li></ul><ul><li>case ‘-’: </li></ul><ul><li> printf (“ = %f”, num 1 - num 2); </li></ul><ul><li> break; </li></ul><ul><li>default: </li></ul><ul><li> printf (“ operador inválido”); </li></ul><ul><li> } </li></ul><ul><li>} </li></ul>
  61. 61. Exercício <ul><li>Seguindo a idéia do exercício anterior incremente a calculadora com mais funções matemáticas. </li></ul><ul><ul><li>Sugestão: use funções da biblioteca matemática math.h como por exemplo: </li></ul></ul><ul><ul><ul><li>sin(x) cos(x) log(x) sqrt(x) pow(x1,x2) </li></ul></ul></ul><ul><ul><li>Para compilar a biblioteca matemática : </li></ul></ul><ul><ul><ul><li>cc p1.c -o p1 -lm </li></ul></ul></ul>
  62. 62. Estruturas de Repetição <ul><li>#include <stdio.h> </li></ul><ul><li>main ( ) </li></ul><ul><li>{ </li></ul><ul><li> printf (“1”); </li></ul><ul><li> printf (“2”); </li></ul><ul><li> : : : </li></ul><ul><li> printf (“10”); </li></ul><ul><li>} </li></ul><ul><li>saída: 1 2 3 4 ... 10 </li></ul>Como imprimir os 1000 1 os números a partir de 1?
  63. 63. Estruturas de Repetição <ul><li>for, while, do-while </li></ul><ul><li>repetir uma seqüência de comandos </li></ul>#include<stdio.h> m ain ( ) { int num;   for (num = 1; num <= 1000; num++) printf (“ % d”, num); } Saída: 1 2 3 ... 1000
  64. 64. Comando for for (<início>;<condição>;<incremento>) <comando>; <ul><li>Na forma mais simples : </li></ul><ul><li>Inicialização: </li></ul><ul><ul><li>expressão de atribuição </li></ul></ul><ul><ul><li>sempre executada uma única vez </li></ul></ul><ul><li>Teste: </li></ul><ul><ul><li>condição que controla a execução do laço </li></ul></ul><ul><ul><li>é sempre avaliada a cada execução </li></ul></ul><ul><ul><li>verdadeiro  continua a execução </li></ul></ul><ul><ul><li>falso  para a execução </li></ul></ul>
  65. 65. Comando for <ul><li>Incremento: </li></ul><ul><ul><li>define como a variável de controle será alterada </li></ul></ul><ul><ul><li>é sempre executada após a execução do corpo do laço </li></ul></ul><ul><li>Exemplo : imprimindo números pares </li></ul>#include<stdio.h> main ( ) { int número;   for ( número = 2; número < 10; número += 2 ) printf (“ %d”, número); } Saída 2 4 6 8
  66. 66. Comando for <ul><li>Flexibilidade: qualquer expressão de um laço “for” pode conter várias instruções separadas por vírgula. </li></ul>for (x=0,y=0;x+y<100;++x,y=y+x) printf(“%d”,x+y); Esta instrução inicializaria x e y com zero, incrementando x de 1 em 1 e y receberia seu valor acrescido do de x. O resultado a cada iteração seria impresso desta forma: 0 (x=0 e y=0) 2 (x=1 e y=1) 5 (x=2 e y=3) 9 14 e assim sucessivamente.
  67. 67. Comando for - Exemplo <ul><li>Exemplo 1: Contagem simples com condição no teste “for”. </li></ul><ul><li>main() </li></ul><ul><li>{ </li></ul><ul><li>int i,j,resposta; </li></ul><ul><li>char feito = ‘ ‘; </li></ul><ul><li>for (i=1;i<100 && feito != ‘N’;i++) { </li></ul><ul><li>for (j=1;j<10;j++) { </li></ul><ul><li>printf(“Quanto e’ %d + %d? “,i,j); </li></ul><ul><li>scanf(“%d”,&resposta); </li></ul><ul><li>getchar(); /* limpar o buffer do teclado */ </li></ul><ul><li>if (resposta != i+j) </li></ul><ul><li>printf(“Errou!n); </li></ul><ul><li>else </li></ul><ul><li>printf(“Acertou!n”); </li></ul><ul><li>} </li></ul><ul><li>printf(“Mais? (S/N) “); </li></ul><ul><li>scanf(“%c”,&feito); </li></ul><ul><li>getchar(); /* limpar o buffer do teclado */ </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  68. 68. Comando for – loop infinito <ul><li>A ausência de condições de inicialização, continuidade e terminação, causarão um processo contínuo e teoricamente infinito (veremos posteriormente a intrução break , que tem a capacidade de encerrar um processo assemelhado ao exemplificado). </li></ul>for(;;) printf(“Este loop rodará eternamente!n”);
  69. 69. Comando for – Loop Vazio <ul><li>A presença do ponto e vírgula finalizando o comando, força a execução do loop sem que seja executado qualquer outro comando. </li></ul>for(i=0;i<10;i++);
  70. 70. Comando for – Loop Finito <ul><li>Ao contrário de outras linguagens que não permitem o término do loop a não ser quando a condição de finalização for satisfeita, a linguagem C permite que um loop seja interrompido antes de seu término normal (desestruturação) sem que exista qualquer tipo de inconveniente. O comando “break” causa essa interrupção. </li></ul>for(;;) { scanf(“%c”,&c); if (c == ‘A’) break; /*interrompe o que deveria ser um laço eterno*/ } printf(“Fim do Loop!”);
  71. 71. Comando While <ul><li>while <condição> <comando>; </li></ul>Exemplo: Contagem #include <stdio.h> main() { int i=0; while (i < 10) { printf(“%d”,i); i++; } } <ul><li>O loop se repete, enquanto a condição for verdadeira </li></ul>
  72. 72. Comando do - while <ul><li>Ao contrário das estruturas “for” e “while” que testam a condição no começo do loop, “do / while” sempre a testa no final, garantido a execução ao menos uma vez da estrutura. </li></ul>do { <comandos>; } while <condição>; Exemplo: Término determinado pelo usuário. #include <stdio.h> main() { int num; do { scanf(“%d”,&num); } while (num < 100); }
  73. 73. <ul><li>/ * testa a capacidade de adivinhar uma letra * / </li></ul><ul><li>#include <stdio.h> </li></ul><ul><li>main ( ) { </li></ul><ul><li>char ch; </li></ul><ul><li>int tentativas; </li></ul><ul><li>do { </li></ul><ul><li> printf (“digite uma letra”); </li></ul><ul><li>scanf(“%c”, ch); getchar ( ); </li></ul><ul><li> tentativas = 1; </li></ul><ul><ul><ul><li>while ( ch!= ‘t’) { </li></ul></ul></ul><ul><li> printf (“%c é incorreto n”, ch); </li></ul><ul><li> tentativas++; </li></ul><ul><li> printf (“tente novamente n”); </li></ul><ul><li>} </li></ul><ul><li>printf (“%c é correto”, ch); </li></ul><ul><li>printf (“acertou em %d vezes”, tentativas); </li></ul><ul><li>printf (“continua? (s / n):”); </li></ul><ul><li>scanf(“%c”,ch); getchar( ); </li></ul><ul><li>} while (ch == ‘s’); </li></ul><ul><li>} </li></ul>
  74. 74. Exercícios
  75. 75. Funções / Procedimentos <ul><li>Dividir uma tarefa complexa em tarefas menores, permitindo esconder detalhes de implementação </li></ul><ul><li>Evita-se a repetição de um mesmo código </li></ul><ul><li>Tipo Nome (lista de parâmetros) </li></ul><ul><li>{ </li></ul><ul><li>corpo </li></ul><ul><li>} </li></ul>
  76. 76. Procedimentos <ul><li>“ Funções” que não retornam valores </li></ul><ul><li>Tipo: void </li></ul>#include <stdio.h>  void desenha(); void desenha( ) { int i; for (i = 0; i < = 10; i++) printf (“-”); } main ( ) { desenha ( ); printf (“ usando funções”); desenha ( ); } ___________usando funcoes___________
  77. 77. Funções <ul><li>Retornam valores </li></ul>#include <stdio.h> int fatorial (int); int fatorial (int n) { int i, resultado = 1;   for ( i = 1; i <= n; i ++) resultado *= i; return resultado; } main ( ) { printf (“ o fatorial de 4 = %d”, fatorial(4) ); printf (“ o fatorial de 3 = %d”, fatorial(3) ); }
  78. 78. Variáveis locais <ul><li>Variáveis declaradas dentro de uma função são denominadas locais e somente podem ser usadas dentro do próprio bloco </li></ul><ul><li>São criadas apenas na entrada do bloco e destruídas na saída (automáticas) </li></ul>
  79. 79. Variáveis Locais <ul><li>void desenha ( ) </li></ul><ul><li>{ </li></ul><ul><li> int i, j; </li></ul><ul><li> . . . </li></ul><ul><li>} </li></ul><ul><li>main ( ) </li></ul><ul><li>{ </li></ul><ul><li>int a; </li></ul><ul><li>  desenha(); </li></ul><ul><li>a = i;  erro </li></ul><ul><li>. . . </li></ul><ul><li>} </li></ul>void desenha ( ) { int i, j; . . . . . . } void calcula ( ) { int i, j; . . . . . . } i, j em desenha são variáveis diferentes de i, j em calcula.
  80. 80. Variáveis Globais <ul><li>Variável que é declarada externamente podendo ser acessada por qualquer função </li></ul>#include <stdio.h> main ( ) { int i;   ......... ......... desenha ( ); calcula ( ); } void desenha ( ) { int j; i = 0; . . . }   void calcula ( ) { int m; i = 5; . . . }
  81. 81. Comando Return <ul><li>Causa a atribuição da expressão a função </li></ul><ul><li>forçando o retorno imediato ao ponto de chamada da função. </li></ul>#include <stdio.h> main ( ) { char letra;   printf (“ digite uma letra em minúsculo”); letra = minúsculo ( ); if (letra == ‘a’) printf (“ok”); } char minúsculo ( ) { char ch; scanf(“%c”, ch); if ( (ch >= ‘A’) && (ch <= ‘Z’)) return (ch + ‘a’ - ‘A’); else return (ch); }
  82. 82. <ul><li>Note pelo exemplo anterior que a função minúsculo lê um valor internamente convertendo-o para minúsculo. </li></ul><ul><li>Como usar esta função se já temos uma letra e desejamos convertê-la para minúsculo? </li></ul>
  83. 83. Passando dados para função <ul><li>Passagem de parâmetro por valor - uma cópia do argumento é passada para a função </li></ul><ul><li>  </li></ul><ul><li>O parâmetro se comporta como uma variável local </li></ul>
  84. 84. Passando dados para função <ul><li>main ( ) </li></ul><ul><li>{ </li></ul><ul><li>printf (“ %c”, minúsculo (‘A’) ); </li></ul><ul><li> </li></ul><ul><li> parâmetro real </li></ul><ul><li>} </li></ul><ul><li>char minúsculo (char ch) </li></ul><ul><li>  parâmetro formal </li></ul><ul><li>{ </li></ul><ul><li>if (( ch >= ‘A’)&& (ch <= ‘Z’)) </li></ul><ul><li> return (ch + ‘a’-, ‘A’); </li></ul><ul><li>else </li></ul><ul><li>return (ch); </li></ul><ul><li>} </li></ul>
  85. 85. Passando dados para função - Exemplo <ul><li>#include <stdio.h> </li></ul><ul><li>main ( ) </li></ul><ul><li>{ </li></ul><ul><li> int num, b; </li></ul><ul><li> printf (“ entre com um número > o”); </li></ul><ul><li> scanf (“ %d”, &num ); </li></ul><ul><li> b = abs (num); </li></ul><ul><li> . . . </li></ul><ul><li> printf (“ Valor absoluto de num = %d”, abs(num) ); </li></ul><ul><li> . . . </li></ul><ul><li> b = abs(-3); </li></ul><ul><li>} </li></ul><ul><li>int abs (int x) </li></ul><ul><li>{ </li></ul><ul><li> return ( ( x < 0 ) ? -x : x ); </li></ul><ul><li>} </li></ul>
  86. 86. Passando vários argumentos <ul><li>Ex 1: </li></ul><ul><li>float área_retângulo (float largura, float altura) </li></ul><ul><li>{ </li></ul><ul><li>return (largura * altura); </li></ul><ul><li>} </li></ul>Ex 2: float potência (float base, int expoente) { int i; float resultado = 1; if (expoente == 0) return 1; f or (i = 1; i <= expoente; i++) resultado *= base return resultado; }
  87. 87. Usando várias funções: calcular a seguinte seqüência <ul><li>S(x, n) = x/1! + x 2 /2! + x 3 /3! + ... + x n / n! </li></ul>#include <stdio.h> float serie (float , int ); float potencia (float , int) int fat (int); main( ) { float x; int termos;   printf(“entre com o numero de termos: “); scanf(“%d”, &termos); printf(“entre com o valor de X: “); scanf(“%f”, &x); printf(“O valor de série = %f “, serie(x, termos) ); }
  88. 88. float potencia (float base, int expoente) { int i; float resultado = 1;   if (expoente == 0) return 1; for (i = 1; i <= expoente; i++) resultado *= base; return resultado; } float serie (float x, int n) { int i; float resultado = 0;   for ( i = 1; i <= n; i++) resultado += potência( x, i ) / fat( i ); return resultado; }
  89. 89. int fat (int n) { int i, resultado = 1;   for ( i = 1; i <= n; i ++) resultado *= i; return resultado; }
  90. 90. Vetores <ul><li>tipo de dado usado para representar uma coleção de variáveis de um mesmo tipo </li></ul><ul><li>  estrutura de dados homogênea unidimensional </li></ul>Ex: Ler a nota de 3 alunos e calcular a média   int nota0, nota1, nota2;   printf(“entre com a 1a. nota”); scanf(“%d”, &nota0); : : : printf(“média = %f”, (nota0 + nota1 + nota2) / 3));
  91. 91. Ex: Calcular a média de 300 alunos <ul><li>#include<stdio.h> </li></ul><ul><li>#define N_ALUNOS 40 </li></ul><ul><li>  main( ) </li></ul><ul><li>{ int i; </li></ul><ul><li>float notas [ N_ALUNOS ], media = 0; </li></ul><ul><li>  </li></ul><ul><li>for ( i = 0; i < N_ALUNOS; i++ ) { </li></ul><ul><li>printf (“entre com a nota %d”, i+1); </li></ul><ul><li>scanf (“%f”, &notas[ i ]); </li></ul><ul><li>media += notas [ i ]; </li></ul><ul><li>} </li></ul><ul><li>  printf (“ Média = %f n”, media / N_ALUNOS); </li></ul><ul><li>  </li></ul><ul><li>for ( i = 0; i < N_ALUNOS; i++ ) { </li></ul><ul><li>printf (“n Nota do aluno %d = ”, i+1); </li></ul><ul><li>printf (“%f n”, notas[ i ]); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  92. 92. Vetores – Observações importantes <ul><li>em ‘C’ não existe declaração de vetor dinâmico </li></ul><ul><li>o tamanho de um vetor tem que ser determinado em tempo de compilação </li></ul>Ex: int alunos; int notas [ alunos ]; : : : printf (“entre com o número de alunos”); scanf (“%d”, &alunos);   NÂO É ACEITO !!!
  93. 93. Vetores – Observações importantes <ul><li>Solução: declarar um vetor que suporte um número máximo de elementos </li></ul>Ex: int alunos; int notas [ 70 ]; : : : printf (“entre com o número de alunos”); scanf (“%d”, &alunos);
  94. 94. Vetores – Observações importantes <ul><li>C não realiza verificação de limites em vetores </li></ul><ul><li>nada impede o acesso além do fim do vetor </li></ul><ul><li>faça sempre que necessário a verificação dos limites </li></ul>
  95. 95. Vetores – Obs importantes <ul><li>#include <stdio.h> </li></ul><ul><li>#define TAMANHO 100 </li></ul><ul><li>main( ) </li></ul><ul><li>{ </li></ul><ul><li>int quantidade, media = 0; </li></ul><ul><li>float notas [ TAMANHO ]; </li></ul><ul><li>  // quantidade deve ser  TAMANHO </li></ul><ul><li>printf ( “quantas notas devo ler ?”); </li></ul><ul><li>scanf(“%d”, &quantidade); </li></ul><ul><li>  for ( i = 0; i < quantidade; i++) { </li></ul><ul><li>printf ( “entre com a nota %d”, i+1); </li></ul><ul><li>scanf(“%d”, &notas [ i ]); </li></ul><ul><li>} </li></ul><ul><li>  : : : </li></ul><ul><li>  for ( i = 0; i < quantidade; i++) </li></ul><ul><li>media += notas [ i ]; </li></ul><ul><li>  : : : </li></ul><ul><li>} </li></ul>
  96. 96. Passando um vetor para uma função <ul><li>#include <stdio.h> </li></ul><ul><li>int maximum( int [] ); /* ANSI function prototype */ </li></ul><ul><li>main( ) </li></ul><ul><li>{ </li></ul><ul><li>int values[5], i, max; </li></ul><ul><li>printf(&quot;Entre com 5 numeros:n&quot;); </li></ul><ul><li>for( i = 0; i < 5; ++i ) </li></ul><ul><li>scanf(&quot;%d&quot;, &values[i] ); </li></ul><ul><li>max = maximum( values ); </li></ul><ul><li>printf(&quot;nValor Maximo: %dn&quot;, max ); </li></ul><ul><li>} </li></ul>
  97. 97. int maximum( int values[5] ) { int max_value, i; max_value = values[0]; for( i = 0; i < 5; ++i ) if( values[i] > max_value ) max_value = values[i]; return max_value; } Saída: Entre com 5 numeros: 7 23 45 9 121 Valor Maximo: 121
  98. 98. Matrizes <ul><li>em ‘C’ podemos definir um vetor em que cada posição temos um outro vetor (matriz). </li></ul><ul><li>estrutura de dados homogênea multidimensional </li></ul><ul><li>Note: </li></ul><ul><li>  int matéria [ 4 ] [ 40 ]; </li></ul><ul><li>temos 4 matérias, cada uma com 40 alunos </li></ul>
  99. 99. Matrizes - Leitura <ul><li>int i, j, matéria [ 4 ] [ 40 ]; </li></ul><ul><li>for ( i = 0 ; i < 4; i++ ) { </li></ul><ul><li>printf (“entre com as notas da matéria %d”, i+1); </li></ul><ul><li>for ( j = 0; j < 40; j++) { </li></ul><ul><li>printf (“entre com a nota do aluno %d”, j+1); </li></ul><ul><li>scanf (“%d”, &materia [ i ] [ j ]); </li></ul><ul><li>} </li></ul><ul><li>} </li></ul>
  100. 100. Variável String <ul><li>matriz do tipo char terminada pelo caractere null ‘0’ </li></ul><ul><li>cada caractere de um string pode ser acessado individualmente </li></ul><ul><li>vetor de tamanho n  string de tamanho ( n-1 ) </li></ul>Ex: char string[10] = “exemplo” ;   char string[10] = { “exemplo” };   char string[10] = { ‘e’, ‘x’, ‘e’, ‘m’, ‘p’, ‘l’, ‘o’, ‘0’ }; printf ( “%s”, string ); printf ( “%c”, string [ 0 ] );
  101. 101. Lendo Strings <ul><li>scanf : lê o string até que um branco seja encontrado </li></ul>Ex: main ( ) { char nome[40]; printf ( “Digite seu nome: “ ); scanf ( “%s”, &nome[ 0 ] ); //scanf ( “%s”, nome ); printf ( “Bom dia %c”, nome[0] ); } Saída : Digite seu nome: Jose Maria Bom dia Jose
  102. 102. Lendo Strings <ul><li>Gets </li></ul><ul><ul><ul><li>lê caracteres até encontrar ‘n’ </li></ul></ul></ul><ul><ul><ul><li>substitui ‘n’ por ‘0’ </li></ul></ul></ul>Ex: main ( ) { char nome[40]; printf ( “Digite seu nome: “ ); gets ( &nome[ 0 ] ); // ou gets(nome); printf ( “Bom dia %s”, nome ); } Saída : Digite seu nome: Jose Maria Bom dia Jose Maria
  103. 103. Imprimindo Strings <ul><li>printf </li></ul><ul><li>puts </li></ul>Ex: main ( ) { char nome[40]; printf ( “Digite seu nome: “ ); gets ( &nome[ 0 ] ); puts ( “Bom dia ” ); puts ( nome ); } Saída : Digite seu nome: Jose Maria Bom dia Jose Maria
  104. 104. Funções de manipulação de strings <ul><li>Strlen </li></ul><ul><ul><ul><li>retorna o tamanho do string - não conta ‘0’ </li></ul></ul></ul>Ex: main ( ) { char nome[40]; printf ( “Digite seu nome: “ ); gets ( &nome[ 0 ] ); printf (“Tamanho = %d”, strlen(&nome[ 0 ]) ); } Saída : Digite seu nome: Jose Maria Tamanho = 10
  105. 105. Funções de manipulação de strings <ul><li>strcat ( str1, str2 ) </li></ul><ul><ul><ul><li>concatena str2 ao final de str1 </li></ul></ul></ul>Ex: main ( ) { char nome[40] = “Jose”, char sobrenome[30] = “Maria”; strcat(nome, sobrenome); puts (sobrenome); puts (nome); } Saída : Maria JoseMaria Cuidado: dado str1 + str2 tem que caber em str1
  106. 106. Funções de manipulação de strings <ul><li>strcmp ( str1, str2 ) </li></ul><ul><li>  compara dois strings retornando: </li></ul><ul><li>– negativo se str1 < str2 </li></ul><ul><li>– 0 se str1 = str2 </li></ul><ul><li>– positivo se str1 > str2 </li></ul><ul><li>  a comparação é feita por ordem alfabética </li></ul>
  107. 107. <ul><li>#include <stdio.h> </li></ul><ul><li>main ( ) </li></ul><ul><li>{ </li></ul><ul><li>char nome[40] = “Jose”; </li></ul><ul><li>char sobrenome[30] = “Maria”; </li></ul><ul><li>  </li></ul><ul><li>if ( strcmp ( nome, sobrenome ) !=0) </li></ul><ul><li> puts ( “os strings são diferentes” ); </li></ul><ul><li>else </li></ul><ul><li> puts ( “os strings são identicos” ); </li></ul><ul><li>} </li></ul>
  108. 108. Conversões <ul><li>podemos também converter strings e números (inteiros/fracionários) conforme desejarmos: </li></ul>Exemplo: Conversão de String em Número Inteiro #include <stdio.h> main() { int i; char s[10]; printf(“Digite uma sequencia de numeros com letras: “); gets(s); i = atoi(s); printf(“Numero: %d “,i); }
  109. 109. Ponteiros <ul><li>Ponteiros, como o próprio nome diz, é um tipo de variável que aponta para outra (de um tipo qualquer). Na verdade um ponteiro guarda o endereço de memória (local onde se encontra na memória) de uma variável. </li></ul>
  110. 110. Ponteiros <ul><li>int teste=20; </li></ul><ul><li>int *p; </li></ul><ul><li>p=&teste; </li></ul><ul><li>p irá armazenar o endereço de memória da variável teste. Ou seja, p não armazena o valor 20, mas sim o endereço de teste que, este sim, armazena o valor 20. </li></ul><ul><li>como chegar ao valor 20 usando a variável p? </li></ul>int teste=20; int *p; p=&teste; printf(&quot;%dn&quot;,*p);
  111. 111. Ponteiros Outro exemplo: char algo[5] = { 5, 4, 3, 2, 1 }; char *c; c=&algo[2]; Colocamos em c o endereço do terceiro elemento de algo: c[0]=3, c[1]=2 e c[2]=1. Se tivéssemos feito c=&algo[3], então: c[0]=2 e c[1]=1.
  112. 112. Ponteiros <ul><li>int vet_notas[50]; </li></ul><ul><li>int *pont_notas; </li></ul><ul><li>pont_notas=vet_notas; </li></ul><ul><li>Para imprimir a primeira e a décima nota de nosso vetor, temos duas opções: </li></ul><ul><li>print (&quot;A primeira nota é: %d&quot;, vet_notas[0]); </li></ul><ul><li>print (&quot;A primeira nota é: %d&quot;, *pont_notas); </li></ul><ul><li>print (&quot;A décima nota é: %d&quot;, vet_notas[9]); </li></ul><ul><li>print (&quot;A décima nota é: %d&quot;, *(pont_notas+9)); </li></ul>
  113. 113. Equivalência entre vetores e ponteiros <ul><li>vet_notas[0]==*(pont_notas); </li></ul><ul><li>vet_notas[1]==*(pont_notas+1); </li></ul><ul><li>vet_notas[2]==*(pont_notas+2); </li></ul>
  114. 114. Malloc e Free <ul><li>Alocação dinâmica </li></ul><ul><li>#include <stdio.h> </li></ul><ul><li>main() </li></ul><ul><li>{ </li></ul><ul><li>int *notas, numero, i; </li></ul>
  115. 115. Printf(“Entre com o número total de alunosn’”); scanf(“%d”, &numero); notas=(int *)malloc(numero * sizeof(int)); for (i=0; i,numero; i++) { printf(“Digite a nota do aluno %d”, i+1); scanf(“%d”, &notas[i]); printf(“n A nota do aluno %d é :%d: , i+1, notas[i]); } free(notas); }
  116. 116. Estruturas <ul><li>Uma estrutura é um conjunto de variáveis dentro de um mesmo nome. Em geral, uma variável é de um tipo específico, por exemplo, temos uma variável do tipo inteira e estamos fechados a nos referenciar aquele nome que lhe foi dado sempre por um número do tipo inteiro, logicamente. Já as estruturas, dentro de um mesmo nome podemos nos referenciar a uma gama de variáveis pré-definidas. </li></ul>
  117. 117. Estruturas <ul><li>struct molde_conta </li></ul><ul><li>{ </li></ul><ul><li>char nome[50]; </li></ul><ul><li>int telefone; </li></ul><ul><li>float saldo ; </li></ul><ul><li>}; </li></ul><ul><li>Definido o molde, devemos agora declarar a variável que utilizará desse molde: </li></ul><ul><li>struct molde_conta conta; </li></ul>
  118. 118. Estruturas <ul><li>struct molde_conta </li></ul><ul><li>{ </li></ul><ul><li>char nome[50]; </li></ul><ul><li>int telefone; </li></ul><ul><li>float saldo; </li></ul><ul><li>} conta1, conta2; </li></ul><ul><li>equivalente a: </li></ul><ul><li>struct molde_conta conta1, conta2; </li></ul>
  119. 119. Estrutras - Utilização do tipo <ul><li>Podemos fazer atribuição de structs, do tipo conta2 = conta, e os valores serão idênticos. </li></ul><ul><li>Para contar o número de caracteres de nome dentro da estrutura conta, podemos fazer: </li></ul><ul><li>for (i=0,conta.nome[i],++i) ; </li></ul><ul><li>printf (&quot;o nome tem -> %d letras n&quot;,i); </li></ul>
  120. 120. Vetores de Estruturas <ul><li>struct molde_conta conta[100]; </li></ul><ul><ul><li>conta[1].telefone=2212324; </li></ul></ul><ul><ul><li>conta[1].nome=“joao carlos”; </li></ul></ul><ul><ul><li>conta[1].saldo=1245.89; </li></ul></ul><ul><ul><li>conta[5].telefone=2212888; </li></ul></ul><ul><ul><li>conta[5].nome=“Maria dos Santos”; </li></ul></ul><ul><ul><li>conta[5].saldo=6908.79; </li></ul></ul>
  121. 121. Arquivos - feopen( ) <ul><li>A função “fopen” tem duas finalidades: </li></ul><ul><ul><li>- abrir uma fila de bytes </li></ul></ul><ul><ul><li>- ligar um arquivo em disco àquela fila </li></ul></ul><ul><li>FILE *fopen(char *NomeArquivo, char *modo); </li></ul><ul><li>FILE *arquivo; </li></ul><ul><li>if ((arquivo = fopen(“teste”,”w”)) == NULL) { </li></ul><ul><li>puts(“Não posso abrir o Arquivo teste.n”); </li></ul><ul><li>exit(1); /* força o término da execução da rotina */ </li></ul><ul><li>} </li></ul>
  122. 122. <ul><li>Modo Significado </li></ul><ul><li>“ r” Abre Arquivo de Texto para Leitura </li></ul><ul><li>“ w” Cria Arquivo de Texto para Gravação </li></ul><ul><li>“ a” Anexa a um Arquivo de Texto </li></ul><ul><li>“ rb” Abre Arquivo Binário para Leitura </li></ul><ul><li>“ wb” Cria Arquivo Binário para Gravação </li></ul><ul><li>“ ab” Anexa a um Arquivo Binário </li></ul><ul><li>“ r+” Abre Arquivo de Texto para Leitura/Gravação </li></ul><ul><li>“ w+” Cria Arquivo de Texto para Leitura/Gravação </li></ul><ul><li>“ a+” Abre ou Cria Arquivo de Texto para Leitura/Gravação </li></ul><ul><li>“ r+b” Abre Arquivo Binário para Leitura/Gravação </li></ul><ul><li>“ w+b” Cria Arquivo Binário para Leitura/Gravação </li></ul><ul><li>“ a+b” Abre ou Cria Arquivo Binário para Leitura/Gravação </li></ul>
  123. 123. Arquivos - putc ( ) <ul><li>Grava caracteres em fila previamente abertos </li></ul><ul><li>int putc(int ch, FILE *fp); </li></ul><ul><ul><li>ch é o caracter a ser gravado </li></ul></ul><ul><ul><li>fp é o ponteiro devolvido por fopen </li></ul></ul><ul><li>putc(‘a’, arquivo); </li></ul>
  124. 124. Arquivos - getc ( ) <ul><li>Ler caracteres em uma fila aberta </li></ul><ul><li>int getc(FILE *arquivo); </li></ul><ul><li>Exemplo: </li></ul><ul><li>ch = getc(arquivo); </li></ul><ul><li>while (ch != EOF) </li></ul><ul><li>ch = getc(arquivo); </li></ul>
  125. 125. Arquivos - fclose ( ) <ul><li>Fechar as filas abertas. Caso o programa seja encerrado sem que as filas sejam fechadas, dados gravados nos buffers podem ser perdidos. </li></ul><ul><li>int fclose(FILE *fp); </li></ul><ul><li>fclose(arquivo); </li></ul>
  126. 126. main() { FILE *arq; char ch; if ((arq=fopen(“teste.dat”,”w”)) == NULL) { printf(“Arquivo não pode ser criadon”); exit(1); } do{ ch=getchar(); putc(ch,arq); }while (ch!=0); fclose(arq); }
  127. 127. Arquivos - ferror ( ) <ul><li>Determina se a operação de arquivo produziu um erro. Sua forma geral será: </li></ul><ul><li>int ferror(FILE *fp); </li></ul>
  128. 128. Arquivos - rewind( ) <ul><li>Reinicia o arquivo, equivale ao Reset do Pascal, ou seja apenas movimenta o ponteiro do arquivo para seu início. </li></ul>
  129. 129. Arquivos - fwrite ( ) fread ( ) <ul><li>Permitem que leiamos/gravemos blocos de dados, sua forma geral é a seguinte: </li></ul><ul><li>int fread(void *buffer, int num_bytes, int cont, </li></ul><ul><li>FILE *fp); </li></ul><ul><li>int fwrite(void *buffer, int num_bytes, int cont, </li></ul><ul><li>FILE *fp); </li></ul>
  130. 130. Arquivos - fwrite ( ) <ul><li>main() </li></ul><ul><li>{ </li></ul><ul><li>FILE *fp; </li></ul><ul><li>float f = 12.23; </li></ul><ul><li>if ((fp=fopen(“teste”,”wb”)) == NULL) { </li></ul><ul><li>printf(“Arquivo não pode ser criadon”); </li></ul><ul><li>exit(1); </li></ul><ul><li>} </li></ul><ul><li>fwrite(&f,sizeof(float(),1,fp); </li></ul><ul><li>fclose(fp); </li></ul><ul><li>} </li></ul>
  131. 131. Arquivos - fseek ( ) <ul><li>Entrada e saída com acesso aleatório </li></ul><ul><li>int fseek(FILE *fp, long int num_bytes, int origem); </li></ul><ul><li>fp - é o ponteiro de arquivo devolvido por fopen(). </li></ul><ul><li>num_bytes - é um inteiro longo que representa o número de bytes desde a origem até chegar a posição corrente. </li></ul><ul><li>OBS: Este comando é normalmente utilizado em arquivos binários. </li></ul>
  132. 132. <ul><ul><li>Exemplo : Leitura de um caracter em um arquivo binário. </li></ul></ul><ul><li>main() </li></ul><ul><li>{ </li></ul><ul><li>FILE *fp; </li></ul><ul><li>if ((fp=fopen(“teste”,”rb”)) == NULL) { </li></ul><ul><li>printf(“Arquivo não pode ser aberton”); </li></ul><ul><li>exit(1); </li></ul><ul><li>} </li></ul><ul><li>fseek(fp,234L,0); /* L força que seja um inteiro longo */ </li></ul><ul><li>return getc(fp); /* lê o caracter 234 */ </li></ul><ul><li>} </li></ul>
  133. 133. <ul><ul><ul><li>carga() </li></ul></ul></ul><ul><ul><ul><li>{ </li></ul></ul></ul><ul><ul><ul><li>FILE *fp; </li></ul></ul></ul><ul><ul><ul><li>int i; </li></ul></ul></ul><ul><ul><ul><li>if ((fp=fopen(“LISTA.DAT”,”rb”)) == NULL) { </li></ul></ul></ul><ul><ul><ul><li>puts(“Falha na Abertura do Arquivo!”); </li></ul></ul></ul><ul><ul><ul><li>return; </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>inicia_matriz(); </li></ul></ul></ul><ul><ul><ul><li>for (i=0; i < 100; i++) </li></ul></ul></ul><ul><ul><ul><li>if (fread(&matriz[i], sizeof(struct registro), 1, fp) != 1) { </li></ul></ul></ul><ul><ul><ul><li>if (feof(fp)) { </li></ul></ul></ul><ul><ul><ul><li>fclose(fp); </li></ul></ul></ul><ul><ul><ul><li>return; </li></ul></ul></ul><ul><ul><ul><li> } </li></ul></ul></ul><ul><ul><ul><li>else { </li></ul></ul></ul><ul><ul><ul><li>puts(“Erro de Leitura! “); </li></ul></ul></ul><ul><ul><ul><li>fclose(fp); </li></ul></ul></ul><ul><ul><ul><li>return; </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul>Exemplo de montagem de um pequeno cadastro de nomes, endereços e salários de funcionários em arquivo.
  134. 134. <ul><ul><ul><li>salvar() </li></ul></ul></ul><ul><ul><ul><li>{ </li></ul></ul></ul><ul><ul><ul><li>FILE *fp; </li></ul></ul></ul><ul><ul><ul><li>int i; </li></ul></ul></ul><ul><ul><ul><li>if ((fp=fopen(“LISTA.DAT”,”wb”))==NULL) { </li></ul></ul></ul><ul><ul><ul><li>puts(“Falhou Abertura! “); </li></ul></ul></ul><ul><ul><ul><li>return; </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul><ul><ul><ul><li>for (i=0;i<100;i++) </li></ul></ul></ul><ul><ul><ul><li>if (*matriz[i].nome) </li></ul></ul></ul><ul><ul><ul><li>if(fwrite(&matriz[i], </li></ul></ul></ul><ul><ul><ul><li>sizeof(struct registro), 1,fp) != 1) </li></ul></ul></ul><ul><ul><ul><li>puts(“Falha na Gravacao! “); </li></ul></ul></ul><ul><ul><ul><li>fclose(fp); </li></ul></ul></ul><ul><ul><ul><li>} </li></ul></ul></ul>
  135. 135. <ul><li>Vamos supor que desejamos criar um programa que escreva num arquivo cujo nome será fornecido na chamada do programa </li></ul><ul><li>(Exemplificando: KTOD TESTE <Enter> ). </li></ul><ul><li>Gostaríamos que o DOS criasse o arquivo TESTE guardando o conteúdo digitado durante a execução do programa. </li></ul>
  136. 136. <ul><ul><ul><li>main(argv,argc) </li></ul></ul></ul><ul><li>onde </li></ul><ul><li>argc - tem o número de argumentos contidos nas linha de comando (necessariamente maior ou igual a um, pois o próprio programa já é considerado um argumento pelo D.O.S.). </li></ul><ul><li>argv é um ponteiro que acomodará os caracteres digitados. </li></ul>
  137. 137. Exemplo 1: Programa KTOD, que escreve caracteres num arquivo criado/aberto via D.O.S. <ul><li>#include “stdio.h” </li></ul><ul><li>main(argc,argv) </li></ul><ul><li>int argc; </li></ul><ul><li>char *argv[]; </li></ul><ul><li>{ </li></ul><ul><li>FILE *fp; </li></ul><ul><li>char ch; </li></ul><ul><li>if (arg != 2) { </li></ul><ul><li>printf(“Digite o Nome do Arquivon”); </li></ul><ul><li>exit(1); </li></ul><ul><li>} </li></ul>
  138. 138. <ul><li>if ((fp=fopen(argv[1],”w”)) == NULL) { </li></ul><ul><li>printf(“Arquivo não pode ser aberton”); </li></ul><ul><li>exit(1); </li></ul><ul><li>} </li></ul><ul><li>do { </li></ul><ul><li>ch = getchar(); </li></ul><ul><li>putc(ch,fp); </li></ul><ul><li>} while( ch != ‘$’); </li></ul><ul><li>fclose(fp); </li></ul><ul><li>} </li></ul>
  139. 139. <ul><ul><li>Exemplo 2: Programa DTOV, que apresenta em vídeo os </li></ul></ul><ul><ul><li>caracteres digitados via KTOD. </li></ul></ul><ul><li>#include “stdio.h” </li></ul><ul><li>main(argc,argv) </li></ul><ul><li>int argc; </li></ul><ul><li>char *argv[]; </li></ul><ul><li>{ </li></ul><ul><li>FILE *fp; </li></ul><ul><li>char ch; </li></ul><ul><li>if (arg != 2) { </li></ul><ul><li>printf(“Digite o Nome do Arquivon”); </li></ul><ul><li>exit(1); </li></ul><ul><li>} </li></ul><ul><li>if ((fp=fopen(argv[1],”r”)) == NULL) { </li></ul><ul><li>printf(“Arquivo não pode ser aberton”); </li></ul><ul><li>exit(1); </li></ul><ul><li>} </li></ul><ul><li>ch = getc(fp); </li></ul>
  140. 140. do { putchar(ch); ch=getc(fp); } while( ch != ‘$’); fclose(fp); }
  141. 141. Exemplo 3: Programa para copiar Arquivos. #include “stdio.h” main(argc,argv) int argc; char *argv[]; { FILE *in, *out; char ch; if (arg != 3) { printf(“Digite o Nome dos Arquivosn”); exit(1); } if ((in=fopen(argv[1],”rb”)) == NULL) { printf(“Arquivo origem não existen”); exit(1); } if ((out=fopen(argv[2],”wb”)) == NULL) { printf(“Arquivo destino não existen”); exit(1); } while (! feof(in)) putc(getc(in),out); /* esta é a cópia propriamente dita */ fclose(in); fclose(out); }
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×