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

Slides:



Advertisements
Apresentações semelhantes
Capítulo II – Algoritmos e Programas
Advertisements

WINDOWS Sistemas Operacionais PLATAFORMA TECNOLÓGICOS
Tecnologias da Informação e da Comunicação
Noções de Informática Prof. Eduardo
Programação II Estruturas de Dados Aula 01
Programação para Engenharia I
15 Introdução à Manipulação de Planilhas Eletrônicas Planilhas Eletrônicas são tabelas usadas para comunicar informações de forma clara, precisa e sucinta.
Prof. Luis Otavio Alvares
LINGUAGEM C.
Login na Rede ********* Nome do Usuário Senha
LINGUAGEM ESTRUTURADA TURBO C
Linguagem C Strings.
Vetores, Matrizes e Funções
Introdução à estrutura e funcionamento de um sistema informático
Estrutura do computador
Revisão da Linguagem C.
Introdução a Programação JAVA
Arquitetura Básica de um Computador
Programação I Caderno de Exercícios Nome.
Tecnologia da Informação
Arquitetura de Computadores
CLASSIFICAÇÃO DOS PERIFÉRICOS
INTRODUÇÃ A COMPUTAÇÃO ENG. CIVIL
Professor Felipe Monteiro Lima
Microsoft Office Excel
Tecnologias Especificas Informática
Rodrigo Cristiano Silva
Introdução a Computação e Cálculo Numérico
Luan Philipe Braz Thyago Victor de Andrade. Componentes de um Computador Periféricos Processador Dispositivos de armazenamento de dados Dispositivos de.
Ameliara Freire O comando de entrada de dados é utilizado quando desejamos fornecer um valor para um nosso programa. Os dispositivos.
Estrutura e Funcionamento de um Sistema Informático
PROGRAMAÇÃO ESTRUTURADA II
Avaliação Microsoft Word
9º ANO INTRODUÇÃO ÀS TECNOLOGIAS DA INFORMAÇÃO E COMUNICAÇÃO
Introdução a Linguagem de Programação C
Componentes de um computador
INICIAÇÃO À INFORMÁTICA. O que são as Tecnologias de Informação ?... As Tecnologias de Informação dizem respeito a processos de tratamento, controlo e.
DISPOSITIVOS DE ENTRADA E SAÍDA
Ana Duarte e Ana Marques 8ºB Nº1 e Nº2
PROGRAMAÇÃO I UNIDADE 2.
Fábio de Oliveira Borges
Programação em C++ Compiladores
Entrada e Saída (E/S ou I/O)
O que são, para que servem e onde podem ser utilizadas?
Técnicas de Programação I Prof:. Msc. Arimatéia Junior Fortaleza-2011.
Estruturas de Dados Aula 2: Estruturas Estáticas 07/04/2014.
Organização de Computadores
© 2004 by Pearson Education Computadores: Ferramentas para a Era da Informação Tema 0 PARTE A.
PROGRAMAÇÃO ou LINGUAGEM C?
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.
Capítulo 5 Entrada/Saída 5.1 Princípios do hardware de E/S
Algumas notas sobre a linguagem de programação C
Introdução à INFORMÁTICA
Introdução à Informática
Algoritmos e Estrutura de Dados I Jean Carlo Mendes
Workshop de Informática
Introdução à Informática
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013
Subsistema de Entrada e Saída do Kernel
CES-10 INTRODUÇÃO À COMPUTAÇÃO
Programação Computacional Aula 8: Entrada e Saída pelo Console Prof a. Madeleine Medrano
Programação Computacional Aula 9: Meu primeiro programa em C
Tecnologias da Informação e Comunicação
Introdução à Informática
Introdução a Informática
Informática e o Computador (Parte I)
Capítulo 5 Entrada/Saída 5.1 Princípios do hardware de E/S
Tecnologias da Informação e Comunicação
3) Unidades de Entrada e/ou Saída de Dados
Aline Oliveira Everton Godoy Gabriel Leoni Lenilton Rocha Nelson Deda.
Transcrição da apresentação:

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

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

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

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.

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

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

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

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

5.2 – Saída no Vídeo-Texto – 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

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

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

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

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

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

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’ = = 66 = ‘B’

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

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$ Saída no vídeo: A loja vende 5 cds por R$ 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

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$ %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

Tabela de formatos de escrita da Linguagem C:

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 = Formato g: x = Formato e: x = e+01 Resultado

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) Resultado: Colunas desalinhadas x, x 2, x 3, e x usam diferentes n os de dígitos para diferentes valores de x

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) %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

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)

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 = ; 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 = Formato g: x = Formato e: x = e+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

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: 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

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

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

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 ‘#’

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 Tabela para y = 10 + x 2 – 2x – 3 Resultado no vídeo

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

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

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;

/* 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;}

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$ Numero de caracteres escritos: 34 Resultado

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

5.3 – Entrada pelo Teclado – 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

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

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

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 (); }

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

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

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

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

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’

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 binário em complemento de 2 de 4 bytes  Esse valor será armazenado no local reservado para tal variável

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 em ponto-flutuante de 4 bytes  Esse valor será armazenado no local reservado para tal variável

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 ‘&’

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

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

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

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

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 &: Numero digitado: 37 Caractere digitado: & Para entrada 37---& ou 37--&--&: Numero digitado: 37 Caractere digitado: #

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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!

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

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

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); }

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