A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo V Comandos de Entrada e Saída.

Apresentações semelhantes


Apresentação em tema: "CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo V Comandos de Entrada e Saída."— Transcrição da apresentação:

1 CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo V Comandos de Entrada e Saída

2 Capítulo V – Comandos de Entrada e Saída 5.1 – Equipamentos de entrada e saída 5.2 – Saída no vídeo-texto 5.3 – Entrada pelo teclado 5.4 – Entrada e saída por arquivos em disco 5.5 – Controle do vídeo-texto 5.6 – Vídeo-gráfico

3 5.1 – Equipamentos de Entrada e Saída São os equipamentos responsáveis pela comunicação do computador com o mundo exterior São os equipamentos responsáveis pela comunicação do computador com o mundo exterior Equipamentos de entrada mais conhecidos: teclado e mouse Equipamentos de entrada mais conhecidos: teclado e mouse Teclado: muito usado para edição de documentos (programas, textos, arquivos de dados, etc.) Teclado: muito usado para edição de documentos (programas, textos, arquivos de dados, etc.) Mouse: para selecionar e executar tarefas sugeridas por botões e menus apresentados na tela Mouse: para selecionar e executar tarefas sugeridas por botões e menus apresentados na tela

4 Drive de disquetes: muito usado durante bom tempo para entrada e saída, mas já completamente substituído pelo drive de CD-DVD-ROM Drive de disquetes: muito usado durante bom tempo para entrada e saída, mas já completamente substituído pelo drive de CD-DVD-ROM Outros importantes dispositivos de entrada: Outros importantes dispositivos de entrada: - Microfone- Web-Cam - Scanner- Leitora óptica - Célula fotossensora- Pen-drive - Sensores para controle de processos industriais - Etc.

5 Equipamentos de saída mais conhecidos: Equipamentos de saída mais conhecidos:  Vídeo  Auto-falante  Impressoras (a jato de tinta, a laser, etc.)  Impressor de gráficos (plotter) Há vídeos para entrada de dados: Há vídeos para entrada de dados:  Substituem o mouse  A seleção de tarefas dos menus e botões pode ser feita por toque de dedo, caneta ou lápis apropriados

6 Equipamentos industriais controlados por computador: Equipamentos industriais controlados por computador:  Prensas  Tanques para banhos químicos  Robôs, etc. Eles são considerados unidades de saída de um computador Eles são considerados unidades de saída de um computador

7 HD’s e fitas magnéticas são considerados como: HD’s e fitas magnéticas são considerados como:  Memória secundária  Equipamentos de entrada e saída Este capítulo limita-se a apresentar entrada pelo teclado, saída pelo vídeo e entrada e saída por arquivos em disco Este capítulo limita-se a apresentar entrada pelo teclado, saída pelo vídeo e entrada e saída por arquivos em disco São usados dispositivos de programação da Linguagem C São usados dispositivos de programação da Linguagem C

8 Capítulo V – Comandos de Entrada e Saída 5.1 – Equipamentos de entrada e saída 5.2 – Saída no vídeo-texto 5.3 – Entrada pelo teclado 5.4 – Entrada e saída por arquivos em disco 5.5 – Controle do vídeo-texto 5.6 – Vídeo-gráfico

9 5.2 – Saída no Vídeo-Texto 5.2.1 – Vídeo-texto e vídeo-gráfico O vídeo de um computador é uma área retangular constituída por um conjunto de áreas minúsculas de tamanho uniforme denominadas pixels O vídeo de um computador é uma área retangular constituída por um conjunto de áreas minúsculas de tamanho uniforme denominadas pixels Cada pixel pode ter coloração e brilho distintos Cada pixel pode ter coloração e brilho distintos Essa área é dividida ortogonalmente em um conjunto de linhas e de colunas de pixels Essa área é dividida ortogonalmente em um conjunto de linhas e de colunas de pixels

10 Todas as linhas têm o mesmo número de pixels Todas as linhas têm o mesmo número de pixels Todas as colunas têm o mesmo número de pixels Todas as colunas têm o mesmo número de pixels As linhas e as colunas do vídeo são numeradas As linhas e as colunas do vídeo são numeradas Cada pixel pode ser identificado pelos números de sua coluna e de sua linha (coordenadas do pixel) Cada pixel pode ser identificado pelos números de sua coluna e de sua linha (coordenadas do pixel) Foram muito comuns vídeos com 640 x 480 pixels, mas hoje há vídeos com números bem maiores Foram muito comuns vídeos com 640 x 480 pixels, mas hoje há vídeos com números bem maiores

11 Para textos no vídeo, os caracteres costumam ocupar pequenos retângulos de pixels Para textos no vídeo, os caracteres costumam ocupar pequenos retângulos de pixels Em ambientes de programação, tipicamente um caractere ocupa uma área de 11x7 pixels Em ambientes de programação, tipicamente um caractere ocupa uma área de 11x7 pixels

12 Nos computadores mais antigos, os diversos programas só exibiam textos em sua tela de vídeo Nos computadores mais antigos, os diversos programas só exibiam textos em sua tela de vídeo Os caracteres ocupavam áreas de pixels de igual tamanho denominadas espaços para caracteres Os caracteres ocupavam áreas de pixels de igual tamanho denominadas espaços para caracteres A tela era dividida em 25 linhas e 80 colunas desses espaços A tela era dividida em 25 linhas e 80 colunas desses espaços Cada espaço tinha suas coordenadas na tela, que eram os números de sua linha e de sua coluna Cada espaço tinha suas coordenadas na tela, que eram os números de sua linha e de sua coluna

13 Os programas não acessavam os pixels individualmente, mas sim os espaços para caracteres Os programas não acessavam os pixels individualmente, mas sim os espaços para caracteres O nome dessa organização é vídeo-texto O nome dessa organização é vídeo-texto Em contraposição, a organização que permite o acesso individual aos pixels é denominada vídeo-gráfico Em contraposição, a organização que permite o acesso individual aos pixels é denominada vídeo-gráfico Até agora os programas só utilizaram o vídeo-texto Até agora os programas só utilizaram o vídeo-texto

14 A maioria dos ambientes de programação abrem, para a execução de um programa, uma tela que maximizada tem 80 colunas de espaços para caracteres (vídeo-texto) A maioria dos ambientes de programação abrem, para a execução de um programa, uma tela que maximizada tem 80 colunas de espaços para caracteres (vídeo-texto) As funções scanf e printf e outras produzem nela seus efeitos As funções scanf e printf e outras produzem nela seus efeitos Caso se deseje manipular o vídeo-gráfico, cada ambiente tem um conjunto de funções destinadas a esse fim Caso se deseje manipular o vídeo-gráfico, cada ambiente tem um conjunto de funções destinadas a esse fim Isso deve ser visto no Tópico 5.6 deste capítulo; antes dele, será estudado o vídeo-texto Isso deve ser visto no Tópico 5.6 deste capítulo; antes dele, será estudado o vídeo-texto

15 5.2.2 – Escrita de um só caractere A macro putchar, pertencente ao arquivo stdio.h, escreve no vídeo um caractere fornecido como argumento A macro putchar, pertencente ao arquivo stdio.h, escreve no vídeo um caractere fornecido como argumento Exemplo: pelos comandos Exemplo: pelos comandos c = ‘b’; putchar (c + ‘A’ – ‘a’); será escrito no vídeo o caractere ‘B’ c + ‘A’ - ‘a’ = ‘b’ + 65 - 97 = 98 - 32 = 66 = ‘B’

16 5.2.3 – Escrita de cadeias de caracteres e valores de expressões A função printf, pertencente ao arquivo stdio.h, destina-se a escrever no vídeo sequências de caracteres e valores de expressões A função printf, pertencente ao arquivo stdio.h, destina-se a escrever no vídeo sequências de caracteres e valores de expressões Forma geral: Forma geral: printf (CadeiaDeControle, OutrosArgumentos); CadeiaDeControle contém: CadeiaDeControle contém:  Caracteres a serem escritos  Caracteres com formatação para escrever os OutrosArgumentos

17 Exemplo: seja a seguinte chamada de printf printf (“A loja vende %d %s por R$%f”, 5, “cds”, 5*12.00); Cadeia de controle: “A loja vende %d %s por R$%f” Cadeia de controle: “A loja vende %d %s por R$%f” Outros argumentos: 5, “cds”, 5*12.00 Outros argumentos: 5, “cds”, 5*12.00 Saída no vídeo: A loja vende 5 cds por R$60.000000 Saída no vídeo: A loja vende 5 cds por R$60.000000 Todos os caracteres da cadeia de controle, inclusive os espaços, são escritos, exceto os formatos de escrita Todos os caracteres da cadeia de controle, inclusive os espaços, são escritos, exceto os formatos de escrita

18 printf (“A loja vende %d %s por R$%f”, 5, “cds”, 5*12.00); Saída no vídeo: A loja vende 5 cds por R$60.000000 %d: formato para escrever 5 em inteiro-decimal %d: formato para escrever 5 em inteiro-decimal %s: formato para escrever a cadeia de caracteres “cds” sem as aspas %s: formato para escrever a cadeia de caracteres “cds” sem as aspas %f: formato para escrever o valor da expressão 5*12.00 em real-decimal com 6 dígitos fracionários %f: formato para escrever o valor da expressão 5*12.00 em real-decimal com 6 dígitos fracionários Trocando-se %f por %d, ou 5*12.00 por 5*12, os resultados serão incorretos Trocando-se %f por %d, ou 5*12.00 por 5*12, os resultados serão incorretos

19 Tabela de formatos de escrita da Linguagem C:

20 Exemplo: formatos para reais Seja o trecho de programa: Seja o trecho de programa: float x = 12.34; printf ("Formato f: x = %f\n", x); printf ("Formato g: x = %g\n", x); printf ("Formato e: x = %e", x); Formato f: x = 12.340000 Formato g: x = 12.34 Formato e: x = 1.234000e+01 Resultado

21 5.2.4 – Especificação do campo para escrita Seja o seguinte trecho de programa : Seja o seguinte trecho de programa : int x; printf (" x x^2 x^3 e^x log10(x)"); printf (“\n---------------------------------------------"); for (x = 1; x <= 10; x++) printf (“\n %d %d %d %f %f", x, x*x, x*x*x, exp(x), log10(x)); x x^2 x^3 e^x log10(x) --------------------------------------------- 1 1 1 2.718282 0.000000 2 4 8 7.389056 0.301030 3 9 27 20.085537 0.477121 4 16 64 54.598150 0.602060 5 25 125 148.413159 0.698970 6 36 216 403.428793 0.778151 7 49 343 1096.633158 0.845098 8 64 512 2980.957987 0.903090 9 81 729 8103.083928 0.954243 10 100 1000 22026.465795 1.000000 Resultado: Colunas desalinhadas x, x 2, x 3, e x usam diferentes n os de dígitos para diferentes valores de x

22 Trocando-se as chamadas de printf : Trocando-se as chamadas de printf : printf (" x x^2 x^3 e^x log10(x)\n"); printf (" %d %d %d %f %f\n", x, x*x, x*x*x, exp(x), log10(x)); respectivamente por: printf ("%4s%9s%9s%20s%11s","x", "x^2", "x^3", "e^x", "log10(x)"); printf ("\n%4d%9d%9d%20f%11f", x, x*x, x*x*x, exp(x), log10(x)); x x^2 x^3 e^x log10(x) ----------------------------------------------------- 1 1 1 2.718282 0.000000 2 4 8 7.389056 0.301030 3 9 27 20.085537 0.477121 4 16 64 54.598150 0.602060 5 25 125 148.413159 0.698970 6 36 216 403.428793 0.778151 7 49 343 1096.633158 0.845098 8 64 512 2980.957987 0.903090 9 81 729 8103.083928 0.954243 10 100 1000 22026.465795 1.000000 %20s escreve a cadeia “e^x” num espaço de 20 casas, justaposto à direita %20f escreve o valor de exp(x) num espaço de 20 casas, justaposto à direita

23 Para justapor à esquerda, usar o sinal ‘-’ (menos) : Para justapor à esquerda, usar o sinal ‘-’ (menos) : printf ("%-4s%-9s%-9s%20s%11s","x", "x^2", "x^3", "e^x", "log10(x)"); printf ("\n%-4d%-9d%-9d%20f%11f", x, x*x, x*x*x, exp(x), log10(x)); x x^2 x^3 e^x log10(x) ----------------------------------------------------- 1 1 1 2.718282 0.000000 2 4 8 7.389056 0.301030 3 9 27 20.085537 0.477121 4 16 64 54.598150 0.602060 5 25 125 148.413159 0.698970 6 36 216 403.428793 0.778151 7 49 343 1096.633158 0.845098 8 64 512 2980.957987 0.903090 9 81 729 8103.083928 0.954243 10 100 1000 22026.465795 1.000000

24 5.2.5 – Especificação da precisão para n os reais Seja o seguinte trecho de programa : Seja o seguinte trecho de programa : double x = 12.3456789012; printf ("Formato f: x = %15.7f\n", x); printf ("Formato g: x = %15.7g\n", x); printf ("Formato e: x = %15.7e", x); Formato f: x = 12.3456789 Formato g: x = 12.34568 Formato e: x = 1.2345679e+01 Resultado 2º número dentro do formato: Formatos %f e %e: n o de casas após o ponto Formato %g: n o total de dígitos a serem escritos

25 2 o número para outros formatos: Seja o seguinte trecho de programa : Seja o seguinte trecho de programa : printf ("Formato d: %10.7d\n", 1234); printf ("Formato c: %10.7c\n", 'B'); printf ("Formato s+: %10.5s\n", "ABCDEFGH"); printf ("Formato s-: %-10.5s", "ABCDEFGH"); Formato d: 0001234 Formato c: B Formato s+: ABCDE Formato s-: ABCDE Resultado Formato %d: acrescenta zeros à esquerda até chegar ao 2 o número Formato %c: sem utilidade Formato %s: número de caracteres escritos

26 5.2.6 – Variação no campo de escrita e na precisão Seja o seguinte esqueleto de chamada de printf : Seja o seguinte esqueleto de chamada de printf : printf (“Valor = %*.*f”, expressao1, expressao2, expressao3); Nesta chamada, será escrito o valor de expressao3: Nesta chamada, será escrito o valor de expressao3:  Num espaço dado pelo valor de expressao1  Com um número de dígitos após o ponto dado pelo valor de expressao2

27 Exemplo: seja o seguinte trecho de programa: double x = 337.3777337337; int n; for (n = 1; n<=7; n++) printf ("###%*.*f###\n", 8+n, n, x); printf ("###%*.*f###\n", 8+n, n, x); ### 337.4### ### 337.38### ### 337.378### ### 337.3777### ### 337.37773### ### 337.377734### ### 337.3777337### Resultado A cada repetição do comando for: A precisão e o tamanho do campo de escrita crescem de uma unidade

28 Exemplo: traçado da curva deitada de uma função: Seja a função y = x 2 – 2x – 3, no intervalo [-2, 4] Seja a função y = x 2 – 2x – 3, no intervalo [-2, 4] O eixo das ordenadas ficará na horizontal O eixo das ordenadas ficará na horizontal O eixo das abscissas ficará na vertical, na coluna 10 do vídeo-texto O eixo das abscissas ficará na vertical, na coluna 10 do vídeo-texto Assim a função muda para y = 10 + x 2 – 2x – 3 Assim a função muda para y = 10 + x 2 – 2x – 3 Os pontos da curva serão escritos com o caractere ‘#’ Os pontos da curva serão escritos com o caractere ‘#’

29 y = 10 + x 2 – 2x – 3, no intervalo [-2, 4] Seja o seguinte trecho de programa: Seja o seguinte trecho de programa: int x; for (x = -2; x<=4; x++) printf ("%*c\n", 10 + x*x - 2*x - 3, '#'); printf ("%*c\n", 10 + x*x - 2*x - 3, '#'); xy -215 10 07 16 27 3 415 Tabela para y = 10 + x 2 – 2x – 3 Resultado no vídeo

30 Exemplo: sofisticações no desenho da curva: Seja a função y = x 2 – 2x – 3, no intervalo [-5, 7] Seja a função y = x 2 – 2x – 3, no intervalo [-5, 7] O eixo das abscissas ficará na vertical, na coluna 5 do vídeo-texto O eixo das abscissas ficará na vertical, na coluna 5 do vídeo-texto Assim a função muda para y = 5 + x 2 – 2x – 3 Assim a função muda para y = 5 + x 2 – 2x – 3 Serão desenhados os dois eixos e uma régua Serão desenhados os dois eixos e uma régua

31 Resultado a ser obtido para y = x 2 – 2x – 3 em [-5, 7]

32 Programa: #include #include int main () { int x, j, func; /* Tracado da regua */ printf ("----|----|----|----|----|----|----|----|\n"); /* Calculo da funcao no intervalo [-5, +7] */ for (x=-5;x<=7;x++) { func = 5 + x*x - 2*x - 3;

33 /* Se x!=0, marcar o ponto da curva e um ponto do eixo das abscissas */ if (x != 0) { if (func < 5) printf ("%*c%*c", func, '*', 5-func, '|'); else if (func == 5) printf ("%*c", func, '*'); else printf ("%*c%*c", 5, '|', func-5, '*'); } /* Se x=0, tracar tambem o eixo das ordenadas */ else for (j=1; j<=40; j++) if (j == func) printf ("%c", '*'); else if (j == 5) printf ("%c", '|'); else printf ("%c", '-'); printf ("\n"); } printf ("\n\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;}

34 5.2.7 – Valor retornado por printf printf retorna o número de caracteres escritos pela execução de sua chamada printf retorna o número de caracteres escritos pela execução de sua chamada Esse valor não é muito usado em programas corriqueiros Esse valor não é muito usado em programas corriqueiros Exemplo: Seja o trecho de programa: Exemplo: Seja o trecho de programa: int i; i = printf ("A loja vende %d %s por R$%f", 5, "cds", 5*12.0); printf ("\n\nNumero de caracteres escritos: %d", i); A loja vende 5 cds por R$60.000000 Numero de caracteres escritos: 34 Resultado

35 Capítulo V – Comandos de Entrada e Saída 5.1 – Equipamentos de entrada e saída 5.2 – Saída no vídeo-texto 5.3 – Entrada pelo teclado 5.4 – Entrada e saída por arquivos em disco 5.5 – Controle do vídeo-texto 5.6 – Vídeo-gráfico

36 5.3 – Entrada pelo Teclado 5.3.1 – O teclado e seu buffer Algumas funções da biblioteca destinadas a fazer entrada de dados, retiram os dados do buffer do teclado Algumas funções da biblioteca destinadas a fazer entrada de dados, retiram os dados do buffer do teclado Caso ele esteja vazio, o computador fica aguardando o operador digitar uma sequência de caracteres encerrada pela tecla enter, enchendo-o Caso ele esteja vazio, o computador fica aguardando o operador digitar uma sequência de caracteres encerrada pela tecla enter, enchendo-o Então os dados são retirados dali Então os dados são retirados dali Caso contrário, não há necessidade de se digitar nada, pois já há dados a serem lidos Caso contrário, não há necessidade de se digitar nada, pois já há dados a serem lidos

37 Outras funções de entrada não utilizam tal buffer e ficam aguardando digitação Outras funções de entrada não utilizam tal buffer e ficam aguardando digitação A macro getchar e a função scanf usam esse buffer A macro getchar e a função scanf usam esse buffer As funções getch e getche não o utilizam As funções getch e getche não o utilizam getchar, getch e getche são vistas a seguir getchar, getch e getche são vistas a seguir

38 5.3.2 – Leitura de um só caractere Pode ser feita pela macro getchar ou pelas funções getch e getche Pode ser feita pela macro getchar ou pelas funções getch e getche Elas retornam o código ASCII do caractere digitado Elas retornam o código ASCII do caractere digitado A macro getchar localiza-se no arquivo stdio.h A macro getchar localiza-se no arquivo stdio.h Ela utiliza o buffer do teclado Ela utiliza o buffer do teclado

39 Exemplo: mesmo programa para reescrever as letras maiúsculas digitadas Trocou-se scanf por getchar e um dos printf’s por putchar Trocou-se scanf por getchar e um dos printf’s por putchar #include int main () { char c; printf ("Digite uma frase encerrada por enter:\n\n\t"); c = getchar(); printf ("\nLetras maiusculas digitadas:\n\n\t"); while (!iscntrl (c)) { if (isupper (c)) putchar(c); c = getchar(); } printf ("\n\n"); system ("pause"); getch (); }

40 As funções getch e getche localizam-se no arquivo conio.h As funções getch e getche localizam-se no arquivo conio.h Elas não utilizam o buffer do teclado Elas não utilizam o buffer do teclado Ficam aguardando o operador digitar uma tecla Ficam aguardando o operador digitar uma tecla getche dá eco no vídeo getche dá eco no vídeo getch não dá eco no vídeo getch não dá eco no vídeo

41 Exemplo: seja trecho de programa Resultado quando o operador digita ‘x’ e ‘8’: Resultado quando o operador digita ‘x’ e ‘8’: char c; printf ("Digite uma tecla: "); c = getch (); printf ("\n\nTecla digitada: %c", c); printf ("\n\nDigite uma tecla: "); c = getche (); printf ("\n\nTecla digitada: %c", c); Digite uma tecla: Tecla digitada: x Digite uma tecla: 8 Tecla digitada: 8

42 As funções getch e getche podem ser usadas para controlar o fechamento da tela de execução. Exemplo: As funções getch e getche podem ser usadas para controlar o fechamento da tela de execução. Exemplo: #include #include #include // Dispensado no CodeBlocks int main () { printf ("Teste de getch:"); printf ("\n\nDigite algo para encerrar: "); getch (); return 0; } Obs.: o valor retornado por getch, que é o código ASCII do caractere digitado, não é atribuído a nenhuma variável Obs.: o valor retornado por getch, que é o código ASCII do caractere digitado, não é atribuído a nenhuma variável

43 5.3.3 – Leitura de valores para várias variáveis A função scanf pertencente ao arquivo stdio.h destina-se a ler informações do buffer do teclado e armazená-las em variáveis especificadas A função scanf pertencente ao arquivo stdio.h destina-se a ler informações do buffer do teclado e armazená-las em variáveis especificadas Tais informações devem estar contidas em uma ou mais cadeias de caracteres encerradas por ‘enter’, fornecidas pelo operador, por meio do teclado Tais informações devem estar contidas em uma ou mais cadeias de caracteres encerradas por ‘enter’, fornecidas pelo operador, por meio do teclado Cada uma dessas cadeias, ao ser digitada, irá preencher o buffer Cada uma dessas cadeias, ao ser digitada, irá preencher o buffer

44 scanf vai lendo caracteres do buffer, para formar valores a serem armazenados nas variáveis especificadas scanf vai lendo caracteres do buffer, para formar valores a serem armazenados nas variáveis especificadas Cada caractere lido é eliminado do buffer Cada caractere lido é eliminado do buffer Caso o buffer fique vazio durante a execução de uma chamada de scanf e ainda haja valores a serem lidos na mesma chamada: Caso o buffer fique vazio durante a execução de uma chamada de scanf e ainda haja valores a serem lidos na mesma chamada:  O computador deve parar, esperando que o operador digite outra cadeia de caracteres encerrada por ‘enter’

45 Para a formação de valores de determinados tipos, há necessidade de converter os caracteres lidos em uma representação adequada de bits Para a formação de valores de determinados tipos, há necessidade de converter os caracteres lidos em uma representação adequada de bits Exemplo: seja a formação de um valor para uma variável do tipo int (formato %d) Exemplo: seja a formação de um valor para uma variável do tipo int (formato %d)  Supondo os seguintes caracteres lidos: ‘-’, ‘4’, ‘1’, ‘3’ e ‘7’.  Eles devem ser convertidos no número -4137 binário em complemento de 2 de 4 bytes  Esse valor será armazenado no local reservado para tal variável

46 Exemplo: seja a formação de um valor para uma variável do tipo float (formato %f) Exemplo: seja a formação de um valor para uma variável do tipo float (formato %f)  Supondo os seguintes caracteres lidos: ‘2’, ‘3’, ‘.’, ‘7’, ‘5’ e ‘2’  Eles devem ser convertidos no número binário mais próximo possível de 23.752 em ponto-flutuante de 4 bytes  Esse valor será armazenado no local reservado para tal variável

47 Forma geral das chamadas de scanf: Forma geral das chamadas de scanf: scanf (CadeiaDeControle, OutrosArgumentos); OutrosArgumentos: endereços das variáveis que receberão os valores lidos, convenientemente convertidos OutrosArgumentos: endereços das variáveis que receberão os valores lidos, convenientemente convertidos Operador de endereçamento: o caractere ‘&’ Operador de endereçamento: o caractere ‘&’

48 scanf (CadeiaDeControle, OutrosArgumentos); CadeiaDeControle: cadeia de caracteres para gerenciar todo o processo de leitura e conversão CadeiaDeControle: cadeia de caracteres para gerenciar todo o processo de leitura e conversão  Pode conter os mais variados tipos de caracteres  No entanto, seus elementos principais são os chamados formatos de leitura  Formatos de leitura: sub-cadeias iniciadas pelo caractere ‘%’  Os outros caracteres trazem informações sobre o tipo de conversão a ser realizada com os caracteres lidos

49 Exemplo: seja o seguinte trecho de programa char a, b; int n; float x; double y; scanf (“%c%c%d%f%lf”, &a, &b, &n, &x, &y); Cadeia de controle: “%c%c%d%f%lf” Outros argumentos: &a, &b, &n, &x, &y Formato %c: leitura de um caractere e sua conversão para ASCII Formato %c: leitura de um caractere e sua conversão para ASCII Formato %d: leitura de dígitos decimais e sua conversão para binário em complemento de 2 Formato %d: leitura de dígitos decimais e sua conversão para binário em complemento de 2 Formatos %f e %lf: leitura e conversão de números reais em forma decimal ou exponencial, para ponto-flutuante de 4 e 8 bytes respectivamente Formatos %f e %lf: leitura e conversão de números reais em forma decimal ou exponencial, para ponto-flutuante de 4 e 8 bytes respectivamente

50 Tabela de formatos de leitura da Linguagem C: O formato %s usado para leitura de cadeias de caracteres será estudado com detalhes no capítulo sobre variáveis indexadas O formato %s usado para leitura de cadeias de caracteres será estudado com detalhes no capítulo sobre variáveis indexadas

51 Caracteres fora de formatos de leitura: Na cadeia de controle de uma chamada da função scanf podem aparecer caracteres fora de formatos de leitura Na cadeia de controle de uma chamada da função scanf podem aparecer caracteres fora de formatos de leitura Nesse caso, tais caracteres também devem aparecer no buffer do teclado, senão a execução dessa chamada é interrompida Nesse caso, tais caracteres também devem aparecer no buffer do teclado, senão a execução dessa chamada é interrompida

52 Exemplo: seja o seguinte trecho de programa char c = '#'; int i; printf ("Digite um numero inteiro e um caractere:\n"); printf ("Digite um numero inteiro e um caractere:\n"); scanf ("%d-----%c", &i, &c); printf ("Numero digitado: %d", i); printf ("\nCaractere digitado: %c", c); Entre o número e o caractere pedidos devem ser digitados 5 caracteres ‘-’ Caso contrário, a execução será interrompida antes da leitura para a variável c c continuará com seu valor anterior Resultados: Para entrada 37-----&: Numero digitado: 37 Caractere digitado: & Para entrada 37---& ou 37--&--&: Numero digitado: 37 Caractere digitado: #

53 Caracteres fora de formatos de leitura: Caso os caracteres fora desses formatos sejam espaços em branco (‘ ’), as exigências para a cadeia digitada são menores Caso os caracteres fora desses formatos sejam espaços em branco (‘ ’), as exigências para a cadeia digitada são menores Havendo na cadeia de controle uma sequência de um ou mais espaços em branco, não é necessário introduzir na cadeia digitada uma sequência de espaços Havendo na cadeia de controle uma sequência de um ou mais espaços em branco, não é necessário introduzir na cadeia digitada uma sequência de espaços Caso isso aconteça, tal sequência não precisa ser do mesmo tamanho daquela da cadeia de controle Caso isso aconteça, tal sequência não precisa ser do mesmo tamanho daquela da cadeia de controle Esta característica pode ser usada para descartar espaços em branco e caracteres para a leitura de um caractere Esta característica pode ser usada para descartar espaços em branco e caracteres para a leitura de um caractere

54 Exemplo: eliminação da necessidade da variável lixo #include #include int main () { int n, q; char c; int n, q; char c; printf ("Quadrado de um numero (s/n)? "); printf ("Quadrado de um numero (s/n)? "); scanf ("%c", &c); scanf ("%c", &c); while (c == 's' || c == 'S') { while (c == 's' || c == 'S') { printf ("\n\tDigite o numero: "); printf ("\n\tDigite o numero: "); scanf ("%d", &n); scanf ("%d", &n); q = n * n; q = n * n; printf ("\n\tQuadrado (%d) = %d", n, q); printf ("\n\tQuadrado (%d) = %d", n, q); printf ("\n\nQuadrado de um numero (s/n)? "); printf ("\n\nQuadrado de um numero (s/n)? "); scanf (" %c", &c); scanf (" %c", &c); } printf ("\n\n"); system ("pause"); return 0; printf ("\n\n"); system ("pause"); return 0;} Antes de processar o %c, scanf lê e descarta todos os brancos e o do buffer do teclado Não há necessidade de jogar o no lixo

55 Caracteres incompatíveis com formatos de leitura: provocam o encerramento da execução de scanf Exemplo: seja o seguinte programa Exemplo: seja o seguinte programa char c; int a; printf ("Digite uma sequencia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); 123we x Entrada a ser digitada

56 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); Buffer do teclado Vídeo 123we x Entrada a ser digitada a c

57 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); 123we x Entrada a ser digitada Buffer do teclado Digite cadeia de caracteres: _ Vídeo a c

58 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); 123we x Entrada a ser digitada Buffer do teclado Digite cadeia de caracteres: _ Vídeo a c Buffer vazio O operador digita a cadeia

59 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); 123we x Buffer do teclado Digite cadeia de caracteres: 123we x _ Vídeo a c Buffer vazio O operador digita a cadeia

60 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); 123we x Buffer do teclado Digite cadeia de caracteres: 123we x _ Vídeo a c scanf processa %d, percorrendo o buffer Elimina os 3 brancos Lê “123” e encontra ‘w’ que é incompatível e para Converte “123” para 123 binário e atribui à variável a

61 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); we x Buffer do teclado Digite cadeia de caracteres: 123we x _ Vídeo 123 a c scanf processa %d, percorrendo o buffer Elimina os 3 brancos Lê “123” e encontra ‘w’ que é incompatível e para Converte “123” para 123 binário e atribui à variável a

62 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); we x Buffer do teclado Digite cadeia de caracteres: 123we x _ Vídeo 123 a c scanf processa %c Encontra ‘w’ e o atribui à variável c

63 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); e x Buffer do teclado Digite cadeia de caracteres: 123we x _ Vídeo 123 a w c scanf processa %c Encontra ‘w’ e o atribui à variável c

64 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); e x Buffer do teclado Digite cadeia de caracteres: 123we x _ Vídeo 123 a w c

65 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); e x Buffer do teclado Digite cadeia de caracteres: 123we x a = 123; c = w _ Vídeo 123 a w c

66 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); e x Buffer do teclado Digite cadeia de caracteres: 123we x a = 123; c = w _ Vídeo 123 a w c scanf processa %c Encontra ‘e’ e o atribui à variável c

67 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); x Buffer do teclado Digite cadeia de caracteres: 123we x a = 123; c = w _ Vídeo 123 a e c scanf processa %c Encontra ‘e’ e o atribui à variável c

68 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); x Buffer do teclado Digite cadeia de caracteres: 123we x a = 123; c = w _ Vídeo 123 a e c

69 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); x Buffer do teclado Digite cadeia de caracteres: 123we x a = 123; c = w a = 123; c = e _ Vídeo 123 a e c

70 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); x Buffer do teclado Digite cadeia de caracteres: 123we x a = 123; c = w a = 123; c = e _ Vídeo 123 a e c scanf processa %d, percorrendo o buffer Elimina os 3 brancos Encontra ‘x’ que é incompatível e para scanf encerra sua execução

71 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); x Buffer do teclado Digite cadeia de caracteres: 123we x a = 123; c = w a = 123; c = e _ Vídeo 123 a e c scanf processa %d, percorrendo o buffer Elimina os 3 brancos Encontra ‘x’ que é incompatível e para scanf encerra sua execução

72 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); x Buffer do teclado Digite cadeia de caracteres: 123we x a = 123; c = w a = 123; c = e _ Vídeo 123 a e c

73 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); x Buffer do teclado Digite cadeia de caracteres: 123we x a = 123; c = w a = 123; c = e _ Vídeo 123 a e c

74 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); x Buffer do teclado Digite cadeia de caracteres: 123we x a = 123; c = w a = 123; c = e _ Vídeo 123 a e c scanf processa %c Encontra ‘x’ e o atribui à variável c

75 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); Buffer do teclado Digite cadeia de caracteres: 123we x a = 123; c = w a = 123; c = e _ Vídeo 123 a x c scanf processa %c Encontra ‘x’ e o atribui à variável c

76 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); Buffer do teclado Digite cadeia de caracteres: 123we x a = 123; c = w a = 123; c = e _ Vídeo 123 a x c

77 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); Buffer do teclado Digite cadeia de caracteres: 123we x a = 123; c = w a = 123; c = e a = 123; c = x_ Vídeo 123 a x c

78 char c; int a; printf ("Digite cadeia de caracteres:\n"); scanf ("%d%c", &a, &c); printf ("\na = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c\n", a, c); scanf ("%d%c", &a, &c); printf ("a = %d; c = %c\n", a, c); scanf ("%c", &c); printf ("a = %d; c = %c", a, c); Buffer do teclado Digite cadeia de caracteres: 123we x a = 123; c = w a = 123; c = e a = 123; c = x_ Vídeo 123 a x c A execução continua!

79 5.3.4 – Limpeza do buffer do teclado Muitas vezes é desejável esvaziar o buffer do teclado, antes da chamada de uma função que o utiliza Muitas vezes é desejável esvaziar o buffer do teclado, antes da chamada de uma função que o utiliza Retomando o exemplo dos quadrados: Retomando o exemplo dos quadrados: int n, q; char c; printf ("Quadrado de um numero (s/n)? "); scanf ("%c", &c); while (c == 's' || c == 'S') { printf ("Digite o numero: "); scanf ("%d", &n); q = n * n; printf ("Quadrado (%d) = %d", n, q); printf ("\n\nQuadrado de um numero (s/n)? "); scanf ("%c", &c); } O permanece no buffer e será lido para a variável c

80 Poder-se-ia usar getche em vez de scanf, ou usar a cadeia de controle “ %c” mas há situações em que isso não é possível Poder-se-ia usar getche em vez de scanf, ou usar a cadeia de controle “ %c” mas há situações em que isso não é possível A função setbuf do stdio.h esvazia seu primeiro argumento, caso o segundo argumento seja a constante NULL A função setbuf do stdio.h esvazia seu primeiro argumento, caso o segundo argumento seja a constante NULL int n, q; char c; printf ("Quadrado de um numero (s/n)? "); scanf ("%c", &c); while (c == 's' || c == 'S') { printf ("Digite o numero: "); scanf ("%d", &n); q = n * n; printf ("Quadrado (%d) = %d", n, q); printf ("\n\nQuadrado de um numero (s/n)? "); setbuf (stdin, NULL); scanf ("%c", &c); } stdin é o buffer do teclado

81 Há também o método força bruta, que lê todos os caracteres do buffer do teclado até encontrar o : Há também o método força bruta, que lê todos os caracteres do buffer do teclado até encontrar o : A necessidade desse esvaziamento é grande, na leitura de cadeias de caracteres (função gets) A necessidade desse esvaziamento é grande, na leitura de cadeias de caracteres (função gets) int n, q; char c; printf ("Quadrado de um numero (s/n)? "); scanf ("%c", &c); while (c == 's' || c == 'S') { printf ("Digite o numero: "); scanf ("%d", &n); q = n * n; printf ("Quadrado (%d) = %d", n, q); printf ("\n\nQuadrado de um numero (s/n)? "); while (getchar() != '\n'); scanf ("%c", &c); }

82 5.3.5 – Valor retornado por scanf scanf retorna o número de conversões bem sucedidas pela execução de sua chamada scanf retorna o número de conversões bem sucedidas pela execução de sua chamada Exemplo: Seja o trecho de programa: Exemplo: Seja o trecho de programa: int a = 1, b = 1, i; printf ("Digite 2 numeros inteiros: "); i = scanf ("%d%d", &a, &b); printf ("\n\ta = %d; b = %d\n", a, b); printf ("\n\tNumero de leituras: %d\n", i); Resultados de 3 execuções


Carregar ppt "CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo V Comandos de Entrada e Saída."

Apresentações semelhantes


Anúncios Google