Baixe o app para aproveitar ainda mais
Prévia do material em texto
4ºAula Entrada e saída de dados Objetivos de aprendizagem Ao término desta aula, vocês serão capazes de: • ler e escrever na linguagem C; • ler e escrever na linguagem C++; • manipular dados de entrada; • manipular dados de saída. Prezados(as) alunos(as): Como foi visto na primeira aula o c e c++ são muitos similares sendo que o c++ foi uma evolução da linguagem tradicional C, mas isso não significa que na programação c++ possam conter elementos de sua antecessora. No capítulo anterior foram apresentadas duas funções criadas pela linguagem C, sendo uma para escrita e outra para leitura. Nesta aula vamos ver duas funções do C++ para escrita e leitura. Boa aula! Bons estudos! 24Linguagem da Programação I Seções de estudo 1 - Comando de saída de dados em C – printf() 1 - Comando de saída de dados em C – printf() 2 - Comentários 3 - Comando de entrada de dados scanf() 4 - Leitura e escrita em c++ comandos cout e cin Como vimos anteriormente o printf é utilizado para imprimir um resultado visual na tela, funciona em C. Como a função escreva em Portugol, ou seja, é através dessa função que imprimimos mensagens na tela, no entanto até agora imprimimos mensagens digitadas, mas se quisermos imprimir o valor de uma variável. Observe o código abaixo: O Código apresenta na linha 6 uma declaração de uma variável do tipo inteiro “int numero1;”. Em c/c++ uma variável sempre seguirá esse padrão de declaração, primeiro o tipo e em seguida o nome da variável, sempre seguido de um ponto e vírgula. Na próxima linha foi realizada uma atribuição a variável e a partir deste momento o valor dela passa a ser o 21. O nosso printf mudou um pouco do exemplo anterior, pois agora ele contém um texto entre aspas que contém um carácter % que não foi imprimido, e uma variável dentro, separado por uma vírgula. Para imprimir uma variável com o printf é preciso informar o tipo de variável que queremos imprimir. No nosso exemplo temos a função printf( ) utilizando o caractere de percentual (%), seguido de uma letra para identificar o formato de impressão o %d, pois estávamos imprimindo um número inteiro. Portanto, o %d foi colocado propositalmente para imprimir nossa variável inteira. Na tabela abaixo é apresentado os caracteres utilizado para cada tipo de variável tipo. Carácter Tipo de variável %d Usado quando a função for exibir um número inteiro (tipo int). %c Usado quando a função for exibir apenas um caractere (tipo char) s Usado quando a função for exibir uma cadeia de caracteres, ou seja, uma ou várias palavras. f Usado quando a função for exibir número com ponto fl utuante (tipo fl oat). Exemplo: 1.80 e, E Usado quando a função for exibir número com ponto fl utuante (tipo fl oat). g,G Usado quando a função for exibir número com ponto fl utuante (tipo fl oat). Exemplo: No exemplo apresentado foi declarado uma variável float e atribuído o valor 21 a ela. No entanto, o código imprimiu está variável com o carácter %d e logo após com %f. Podemos visualizar que algo estranho aconteceu no resultado, o primeiro valor saiu -1630283120 e o segundo o valor correto. Isso acontece porque o compilador está aguardando um tipo para imprimir e foi informado outro, no caso um float no lugar de um inteiro. Figura 22: impressão de números em C. Vale a pena tentar: modifique a declaração da variável pelos outros tipos apresentado nesta aula, para verificar o que acontece no código, logo após modifique a tag de impressão para o tipo de variável modicado. 1.1 - Indicando o Tamanho Quando é feita a saída do valor de uma variável, além de se especificar o tipo (formato) que deve ser mostrado, pode- se indicar o tamanho da saída. Para os números inteiros (int, short int, long int, unsigned int, unsigned short int e unsigned long int) a especificação do tamanho tem a seguinte sintaxe: % [tam].[qtd_dig]d Onde: o tam – Indica o tamanho mínimo que deve ser colocado na saída caso o número possua quantidade menor de dígitos. Se o número possuir quantidade de dígitos maior que o valor, o número não será truncado o qtd_dig – Quantidade de dígitos que deve ser mostrada. Caso o número possua quantidade menor que o indicado, serão colocados zeros à esquerda até se completar o tamanho indicado (JAMSA, 1999). Para os números reais (float e double), tem-se o seguinte formato: % [tam].[casa_dec]f Onde: o tam – É o mesmo que o descrito antes para os números inteiros. Vale completar que, neste tamanho, estão consideradas as casas decimais inclusive. o casa_dec – Número de casas decimais que devem ser mostradas. Caso o número possua número menor de decimais, o número será completado com zeros até o tamanho indicado. Se o número possuir um número de casas decimais maiores que o indicado, a saída será truncada para o tamanho indicado. Para as variáveis do tipo string, pode-se indicar o tamanho mínimo e máximo a ser mostrado através da seguinte sintaxe: %[tam].[tam_max]s Nesse caso, se a string possuir tamanho menor que o indicado a saída será completada com brancos à esquerda. Veja o exemplo: Espaço reservado de 8 caracteres (mínimo), preenchendo com zeros à esquerda até o máximo de 6 caracteres. 25 Preenche com zeros à esquerda até o máximo de 8 caracteres. Espaço reservado de 2 caracteres (mínimo), com 2 casas decimais (o número é arredondado). Espaço reservado de 10 caracteres (mínimo), com 2 casas decimais (o número é arredondado). Espaço reservado de 20 caracteres (mínimo), a quantidade de casas decimais é especificada pelo número a ser impresso. A quantidade de caracteres utilizados é especificada pelo número a ser impresso, com 2 casas decimais (o número é arredondado). Mínimo de 10 caracteres. Mínimo e máximo de 10 caracteres. Ocorre um truncamento do campo a ser impresso se este for maior que 10 caracteres. Resultado impresso pelos exemplos. | 000820| | 820| |00000820| |00000820| |1223.44| | 1223.44| | 1223.443200| |1223.44| |abcdefghijklmnopqrstuvxywz| |abcdefghij| | abcde| 2 - Comentários 3 - Comando de entrada de dados scanf() Quando desenvolvemos programas, devemos colocar textos que expliquem o raciocínio seguido durante seu desenvolvimento para que outras pessoas, ou nós mesmos, ao ler o programa mais tarde, não tenhamos dificuldades em entender sua lógica. Esses textos são chamados de comentários. Os comentários podem aparecer em qualquer lugar do programa. Em C/C++, há duas maneiras de realizar comentários: os comentários de linha e os comentários de bloco (CARVALHO, 2008). Os comentários de linha são identificados pelo uso de //. Assim, quando usamos // em uma linha, tudo o que estiver nessa linha depois do // são considerados comentários. Os comentários de bloco são iniciados por /* e finalizados por */. Tudo o que estiver entre esses dois símbolos são considerados comentários. Os comentários de bloco podem ocupar várias linhas. No código abaixo é representado um exemplo de código que foi comentado Dica No código podemos verificar as duas formas de inserir comentários. Os comentários são de extrema importância, pois no futuro você pode não lembrar o que havia codificado. Eles ajudarão a lembrar a funcionalidade de seu código, como também pode facilitar o entendimento a outra pessoa. Agora que sabemos escrever, vamos aprender a ler. Em C utilizamos o scanf para ler. O scanf( ) funciona em C como a função leia em Portugol, ou seja, é através dessa função que conseguimos interação com algo digitado pelo teclado, ou seja, sua função é receber as entradas de dados através do teclado. A exemplo do printf(), o scanf() também utiliza os códigos de formatação. Enquanto no printf() esses códigos eram utilizados para indicar o formato dos dados a serem escritos, no scanf() esses mesmos códigos indicam o formato dos dados a serem lidos. O quadro abaixo exibe os códigos de formatação utilizados no scanf(). Note a semelhança com os códigos do printf() (CARVALHO, 2008). Códigos de formato deleitura da função scanf() %c utilizado quando a função for armazenar um caractere (tipo char). %f utilizado quando a função for armazenar um número com ponto fl utuante, aquele valor com vírgula (tipo fl oat). %s utilizado quando a função for armazenar uma cadeia de caracteres, ou seja, uma ou várias palavras. %d utilizado quando a função for armazenar um número inteiro (tipo int). 26Linguagem da Programação I Abaixo é apresentado um código no qual é realizada a leitura de dois números através do scanf e mostrado na tela através do printf . No código podemos observar a declaração de duas variáveis uma inteira (int) e uma real (float), depois foi escrito um printf com o intuito de informar o usuário para digitar um número. Em seguida aparece nosso scanf que contém um %f entre aspas e após a vírgula o carácter & seguido da nossa variável. Sempre que utilizarmos o scanf para leitura, devemos manter esse padrão. Logo abaixo aparecem os mesmos passos para ler um valor inteiro. E, por fim, temos um printf diferente, pois agora as variáveis serão impressas no meio do texto e não no fim como era no exemplo anterior. No printf é possível imprimir no meio do texto, já que podemos definir o local dos caracteres que representam onde vão ser impressos os valores. No exemplo foi utilizado o %d e %f que gerou o seguinte resultado: Figura 23: Execução do código. Dica: Tente criar um projeto que leia dois números, efetue a soma e imprima os três valores. 4 - Leitura e escrita em c++ comandos cout e cin A linguagem C++ possui uma ótima biblioteca de classes relacionadas ao controle de entrada e saídas de dados, os comandos cout e cin. Como você deve ter percebido, a classe cout serve para exibir valores - seja o valor de uma variável ou uma frase – enquanto que cin serve para armazenar valores recebidos através do teclado em variáveis. Tínhamos na linguagem C as funções printf e scanf para executar estas mesmas funções. Na verdade, printf e scanf também estão presentes em C++ (assim como todas as funções padrões de C), e podemos utilizá-las caso desejemos. Porém, os comandos – ou, utilizando um termo mais tecnicamente apropriado, classes – cin e cout facilitam muito a vida do programador, por serem mais “inteligentes” que printf e scanf (DEITEL, 2012). Utilização de cout Como já dissemos, cout exibe valores na tela. A sintaxe utilizada é: Utilizamos cout em conjunto com o operador de inserção <<. Note que símbolo << também é utilizado pelo operador de bitwise shift para a esquerda (move bits de uma variável para a direção esquerda), entretanto não precisamos nos preocupar com isto: C++ sabe diferenciar quando estamos utilizando um operador ou o outro, através do contexto. O operador << indica ao comando cout que um dado deve ser exibido na tela, além de identificar automaticamente qual o tipo desse dado e como ele deve ser formatado para exibição na tela. Assim, não precisamos informar à cout que estamos enviando um inteiro, um real ou uma string, como fazíamos em C: o operador << se encarrega dessa identificação, bastando para o operador indicar o nome da variável (TREVELIN, 2007). Abaixo temos a lista de todos os tipos básicos de C++ reconhecidos pelo operador de inserção: •unsigned char •signed char •char •short •unsigned short •int •unsigned int •long •unsigned long •float •double •long double O operador de inserção também fornece facilidades para a exibição de strings. Além dos tipos básicos mostrados acima, o operador de inserção também reconhece os seguintes tipos de ponteiros: •const signed char * •const unsigned char * •const char * •void * Ponteiros serão explicados com maior propriedade na disciplina de Estrutura de dados, mas precisamos saber que C e C++ representam strings, utilizando ponteiros para o endereço de memória da string. Este ponteiro pode ser o nome de uma variável matriz de tipo char, um ponteiro de tipo char ou então uma frase entre aspas. O operador de inserção reconhece cada um destes casos e exibe na tela a string de texto. Por exemplo: 27 Essas 3 utilizações de cout exibem as strings de texto na tela. Veremos mais adiante que toda string possui um caractere de término, “\0”, que indica para o compilador que a string terminou. Nesses três casos, o operador de inserção orienta-se por este “\0” para terminar a exibição das strings. É importante ressaltar que o operador de inserção não reconhece automaticamente matrizes numéricas e não as exibe automaticamente na tela. Para fazer isso, precisaremos utilizar os métodos tradicionais envolvendo loops para mostrar cada membro da matriz de uma vez (TREVELIN, 2007). Esse assunto será discutido na aula 7, dedicado para matrizes. Overload do operador de inserção “Overload do operador de inserção” nada mais é do que utilizar o operador de inserção várias vezes na mesma chamada de cout. Por exemplo: A linha de comando acima exibe dois valores: a string “O valor da variável X é:” e a variável X. Note que utilizamos duas vezes o operador de inserção, sempre antes do valor a ser exibido. Podemos repetir o operador de inserção quantas vezes precisarmos na mesma linha de cout (TREVELIN, 2007). Agora vamos criar um projeto para verificar o comportamento do cin cout. A criação do projeto é idêntica da apresentada na aula 1, sendo que a única diferença é que ao invés de selecionar o C devemos selecionar o c++, conforme podemos visualizar a imagem abaixo. Observação: todos os comandos utilizados na linguagem C funcionam em C++, ou seja, é possível utilizar o printf e o scanf normalmente no C++. Agora vamos ver o código criado em C++, assim como no projeto criado anteriormente o codeblocks também cria um arquivo com a função main com a mensagem “hello world”. No exemplo abaixo foi realizado a declaração de um número do tipo float que recebe o valor 21 e logo abaixo é impresso ele através da função cout. Observe que não precisamos de caracteres para definir o tipo de variável a ser impressa, no final da mesma linha encontramos a tag endl que tem a finalidade de pular linha, mas nada impede a utilização do \n que vimos anteriormente. Formatação de exibição com cout Vimos anteriormente que a função printf fornecia múltiplas maneiras de formatar a exibição dos dados no computador. A classe cout também fornece as mesmas facilidades para os usuários de C++. Abaixo descreveremos como realizar formatação de dados utilizando cout. Escolhendo a Base Numérica Podemos escolher a base numérica que utilizaremos para representar números inteiros. Para isto, devemos utilizar os comandos: Após utilizar qualquer um desses comandos, sempre que pedirmos para cout exibir um número inteiro na tela, o comando automaticamente converterá o número para a base definida previamente. Por exemplo: A função cout não exibirá o número 10 como estamos esperando, mas sim a letra a, que representa 10 na base hexadecimal. Observe que podemos utilizar o operador de inserção duas vezes para deixar o código mais compacto o que não interfere no resultado: int número = 10; cout << hex << número; Não se esqueça de retornar para a base decimal com “cout << dec;”, após exibir valores na base hexadecimal ou octal! Formatação de números reais Podemos escolher também a notação utilizada para exibição de números reais. Com o comando: cout << fixed; Instruímos o programa a exibir valores reais usando a notação de ponto fixo (por exemplo, 3.1214). Da mesma forma, com o comando: cout << scientific; Instruímos o programa a utilizar a notação científica (por exemplo, 3.21E-2). Espaçamento de Texto O comando cout permite também escolher um número mínimo de caracteres para ser exibido na tela. Isso é feito utilizando o método: cout.width ( x ); Onde substituímos x pelo número mínimo de caracteres a ser exibido na tela. Após a utilização deste método, utilizamos o comando cout para exibir o valor desejado, como no exemplo abaixo:int variável = 10; cout.width ( 5 ); cout << variável; Nesse exemplo, foi especificado cout.width (5); e o valor a ser exibido é 10. Assim, cout precederá o valor 10 com três espaços em branco. Observe que o valor especifica o número mínimo de caracteres que a saída consumirá. Se o valor a ser exibido requer mais caracteres do que o especificado, será usado o número de caracteres necessários para exibir o valor corretamente. É importante observar também que o método cout. width só é válido para a próxima utilização de cout: após isso, o número mínimo de caracteres volta a ser zero. Podemos também determinar o caractere a ser utilizado para preencher os espaços em branco de um campo de exibição. Isso é feito com o seguinte método: cout.fill ( “caractere”); 28Linguagem da Programação I Onde substituímos “caractere” pelo caractere que será exibido. É necessário utilizar aspas entre o caractere, para indicar ao compilador que não se trata de uma variável. O exemplo abaixo mostra a utilização conjunta desses dois métodos: int variável = 10; cout.width ( 8 ); cout.fill (“0”); cout << variável; Esse exemplo fará a seguinte exibição na tela, preenchendo os espaços em branco determinados por cout. width com o caractere 0, determinado por cout.fill: 00000010 Precisão de Variáveis Reais O seguinte método é utilizado para fixar a precisão de variáveis reais, ou seja, o número mínimo de casas decimais a serem exibidas após a vírgula em um valor real: cout.precision ( valor ); Por default, C++ utiliza 6 casas decimais após a vírgula. Quando alteramos o valor da precisão, este novo valor vale para todas as utilizações futuras de cout. Alinhamento de Texto A escolha da direção de alinhamento de texto é feita da seguinte forma, utilizando cout: Alinhamento à direita: cout << right << <valor a ser exibido>; Alinhamento à esquerda: cout << left << <valor a ser exibido>; Por default, todos os valores exibidos em um programa são automaticamente alinhados à direita. Quando mudamos o modo do alinhamento de texto, ele permanecerá dessa forma até que o alteremos novamente. Utilização de cin Utilizamos o comando cin para obter valores do usuário através do teclado. A sintaxe utilizada é a seguinte: cin >> variável_destino; Assim como cout, cin utiliza um operador (nesse caso, o operador de extração >>) para identificar o tipo de variável onde o valor será armazenado e encontrar o endereço de memória correto. Ao contrário da função scanf, utilizada na linguagem C, não é preciso especificar qual o tipo de valor será enviado pelo teclado. Pois o operador de extração faz as conversões necessárias. Podemos utilizar cin para ler valores inteiros, reais e strings de caracteres. Na maioria dos casos, o comando cin cobre nossas necessidades de entrada de dados via teclado. Entretanto, quando precisamos ler strings com mais de uma palavra, como por exemplo frases ou nomes, cin apresenta certos “problemas”. Isso acontece por causa da maneira que C++ trata os espaços em branco em uma entrada via teclado. Espaços em branco são considerados fim de entrada pelo comando cin; ao invés de descartar os caracteres que vierem após o espaço em branco, C++ os guarda em um buffer (uma espécie de “reserva” ou pilha de dados). Quando cin for chamado novamente, antes de ler a nova entrada do teclado, o programa primeiro utiliza os dados que estão nesse buffer. Assim, temos a impressão que a nova entrada de dados foi descartada pelo programa, mas na verdade ela foi jogada no buffer, esperando uma nova chamada de cin. Para solucionar este problema, utilizamos o método de cin cin.getline. 4.6 - Método de cin: cin.getline O método cin.getline é muito útil para receber strings de caracteres com espaços, como frases. Esse método lê uma linha inteira, marcando o fim da entrada de dados pelo uso da tecla <ENTER> indicando a entrada de uma nova linha. Abaixo temos a sintaxe do método: cin.getline ( <matriz_destino>, <limite de caracteres>); O primeiro argumento é a matriz de caracteres para onde serão enviados os dados recebidos. É necessário declarar uma matriz de caracteres previamente ao uso desse método. O segundo argumento é o número máximo de caracteres que será lido pelo método, menos o caractere \0 indicando o fim da string. Assim, se especificarmos um número máximo igual a 20, esse comando lerá 19 caracteres e descartará os próximos caracteres entrados pelo usuário, até que a tecla <ENTER> seja pressionada. Um espaço será sempre utilizado para marcar o fim da string através do caractere \0. Um exemplo da utilização de cin.getline: char matriz[60]; cin.getline (matriz, 50); cout >> matriz; O método cin.getline lerá os próximos 49 caracteres (lembre-se: o espaço reservado para o caractere fim_de_string \0) que o usuário digitar através do teclado. A leitura continuará sendo realizada até que ele aperte a tecla <ENTER>. Caso o usuário entre com uma quantidade maior que 50 caracteres, os próximos serão descartados pelo programa. Retomando a aula Parece que estamos indo bem. Então, para encerrar essa aula, vamos recordar: Na quarta aula, vimos que todo sistema computacional necessita interagir com os usuários. Inicialmente apresentamos uma maneira de iteração simples para facilitar nosso entendimento na programação de computadores. Vimos que no C++ existem duas funções para receber dados vindos dos usuários através do teclado, o scanf da linguagem C e o cin>> do C++. Na primeira vimos que existem configurações para cada tipo de dado, enquanto na segunda a leitura é mais tranquila e existem ainda métodos como cin.getline, que nos possibilita configurar a entrada de caracteres. Também foram apresentados modelos de impressão em tela com o printf e cout, o printf, assim como o scanf necessita de tags de configuração para impressão de tipos específicos. Enquanto o cout torna essa tarefa bem mais fácil. 29 Stephen R Davis; Começando A Programar Em C++ Para Leigos; Alta Books; Edição: 1; 2012. MIZRAHI, Viviane Victorine Mizrahi; Treinamento em Linguagem C++ - Modulo 2; Pearson; Edição: 2; 2005. Disponível em: <http://homepages.dcc.ufmg. br/~rodolfo/aedsi-2-10/printf_scanf/printfscanf.html>. Acesso em: 24 de nov. 2017. Disponível em: <http://www.tiexpert.net/ programacao/c/cin.php>. Acesso em: 24 de nov. 2017. Vale a pena Vale a pena ler Vale a pena acessar Linguagem C - Como usar o comando printf e scanf. Disponível em: <https://www.youtube.com/ watch?v=a70VlhpIdoU>. Acesso em: 24 de nov. 2017. #1 Tutorial c++ - CIN e COUT. Disponível em: <https://www.youtube.com/watch?v=u2FUBdDAX5o>. Acesso em: 24 de nov. 2017. Vale a pena assistir Minhas anotações
Compartilhar