olimpíada brasileira de informáticarcosta62br.unifei.edu.br/obi/aula_02.pdf · este formato das...

95
Treinamento Olimpíada Brasileira de Olimpíada Brasileira de Informática Informática Universidade Federal de Itajubá Prof. Roberto Affonso da Costa Junior

Upload: votuyen

Post on 02-Jan-2019

220 views

Category:

Documents


0 download

TRANSCRIPT

TreinamentoOlimpíada Brasileira de Olimpíada Brasileira de

InformáticaInformática

Universidade Federal de Itajubá

Prof. Roberto Affonso da Costa Junior

AULA 02AULA 02

– Entrada e Saída de Dados– Exercícios

Saída de dadosSaída de dados

• Saída de dados compreende a operação de externar uma informação, ou seja, mostrar ao usuário o conteúdo de uma ou mais variáveis num programa.

• Os dispositivos disponíveis para a execução desta tarefa são: o monitor de vídeo, a impressora, um arquivo.

Entrada dos dadosEntrada dos dados

• Entrada de dados compreende a operação realizada pelo usuário do programa de fornecer o conteúdo de uma informação ao computador e este armazenar esta informação numa variável.

• Os dispositivos disponíveis para a execução desta tarefa são: o teclado, um arquivo.

Códigos de formatosCódigos de formatos

● Para cada variável do programa é necessário que se defina o formato correspondente ao tipo definido para ela;

● Este formato das variáveis é definido com os códigos de formato

Códigos de formatosCódigos de formatos

● Tipo inteiro: %[n]dn - significa o tamanho do campo, ou seja, quantos dígitos tem o numero incluindo o sinal ( positivo ou negativo )

o sinal [ ] significa que a informação é opcional

● Tipo flutuante: %[n.t]ft - significa o tamanho do campo decimal

n - significa o tamanho do campo, ou seja, quantos dígitos tem o numero incluindo o ponto decimal , o campo t e o sinal do numero

Códigos de formatosCódigos de formatos

● Tipo caracter: %c

● Tipo cadeia : %s

● Tipo Long Long int: %lld

● Tipo Double: %lf

Controle da impressãoControle da impressão

● Todas as linhas de saída necessitam do controle da impressão

● Isto é feito utilizando-se o caractere especial:

\n

Observar que isto só é válido para a impressão de dados e não para a entrada.

• Este caractere pode ser colocado:– No inicio do comando de saída;

– No meio

– No fim ;

• A colocação do caractere de controle de saída na instrução de impressão indica que a informação será impressa e em seguida o computador fica disponível para imprimir nova informação na linha seguinte à que acabou de ser impressa;

Controle da impressãoControle da impressão

● A não colocação do caractere de controle de impressão na instrução de saída indica que a próxima informação será impressa na mesma linha da impressão anterior;

● Numa instrução de saída, pode-se colocar quantos \n forem necessários;

● No URI e na OBI é importantíssimo

Controle da impressãoControle da impressão

Saída de dados 1Saída de dados 1

● Saída simples

em linguagem C:

printf ( “%d\n”, x );

Visualização da saídaVisualização da saída

● Suponha que na variável inteira x esteja armazenado o valor 569

● A saída terá a seguinte aparência:

569

Saída de dados 2Saída de dados 2

em linguagem C:

x = 569;

printf ( “x = %5d\n“, x );

Visualização da saídaVisualização da saída

A saída terá a seguinte aparência:

( a linha tracejada não aparece na saída, é só para guiá-la )

= = = = = = =

x = 5 6 9

Saída de dados 3Saída de dados 3#include <bits/stdc++.h>using namespace std;int main (){ int x, soma_valores; x = 569;

soma_valores = -5409; printf ( “ valor de x\n “ );

printf ( “x = %5d\n”, x );printf ( “valor da soma dos valores\n” );

printf ( “soma dos valores = %10d\n” , soma_valores ); return 0;

}

Visualização da saídaVisualização da saída

A saída terá a seguinte aparência:

valor de xx = 569 ( 2 espaços em branco antes do numero )

valor da soma dos valoressoma dos valores = -5409 ( 5 espaços em branco antes do numero )

Tipo RealTipo Real

● Saída simples em linguagem C:

x = 569.26;printf ( “%f\n”, x );

Visualização da saídaVisualização da saída

● A saída terá a seguinte aparência:

569.260000

Outra alternativaOutra alternativa

printf ( “ valor de x = %10.4f\n”, x );

Visualização da saídaVisualização da saída

● A saída terá a seguinte aparência:

= = = = = = = = = = ( linha de referencia )

valor de x = 5 6 9 . 2 6 0 0

Tipo caracterTipo caracter

● Saída simples em linguagem C:

x = ‘g’;printf ( “%c\n”, x );

Visualização da saídaVisualização da saída

● A saída terá a seguinte aparência:

g

Outra alternativaOutra alternativa

// definicao das variaveischar letra_1, letra_2;

// atribuicao dos valoresletra_1 = ‘g’ ;letra_2 = ‘h’ ;

// saida dos resultadosprintf ( “ letra 1 = %c\n”, letra_1 );printf ( “ letra 2 = %c\n”, letra_2 );

Visualização da saídaVisualização da saída

● A saída terá a seguinte aparência:

letra 1 = g

letra 2 = h

Outra alternativaOutra alternativa

A mesma saída poderia ser obtida através da seguinte declaração:

printf ( “ letra 1 = %c\n letra 2 = %c\n”, letra_1 , letra_2 );

Visualização da saídaVisualização da saída

● A saída terá a seguinte aparência:

letra 1 = g

letra 2 = h

Tipo cadeiaTipo cadeia

● Saída simples em linguagem C:

strcpy ( x, “Unifei” );printf ( “%s\n”, x );

Visualização da saídaVisualização da saída

● A saída terá a seguinte aparência:

Unifei

Outra alternativaOutra alternativa

#include <bits/stdc++.h>using namespace std;int main ()

{// definicao das variaveis

char nome_1[20], nome_2[5], nome_3[30];

Outra alternativaOutra alternativa

// atribuicao dos dados

strcpy ( nome_1, “Universidade” );

strcpy ( nome_2, “EFEI” );

strcpy ( nome_3, nome_1 );

strcat ( nome_3, nome_2 );

// saida dos dados printf ( “ nome 1 = %s\n”, nome_1 ); printf ( “ nome 2 = %s\n”, nome_2 ); printf ( “ nome 3 = %s\n”, nome_3 );

return 0;}

Visualização da saídaVisualização da saída

● A saída terá a seguinte aparência:

nome 1 = Universidade

nome 2 = EFEI

nome 3 = UniversidadeEFEI

Entrada de DadosEntrada de Dados

● A entrada de dados pode ser feita de duas formas:– via teclado do computador

• Neste caso o usuário do programa digita os dados necessários ao programa no momento em que este os solicita ( programa interativo ); - assunto desta aula

– via arquivo de dados• Neste caso o usuário monta, através de editor de texto, um arquivo

contendo os dados necessários ao programa, que os lê diretamente sem a intervenção do usuário; - assunto de uma próxima aula

Entrada de dados via tecladoEntrada de dados via teclado

● entrada simples

em linguagem C:

scanf ( “%d”, &x );

ConsideraçõesConsiderações

● Aqui não é usado o caractere especial \n como na saída de dados;

● Observar a utilização dos códigos de formatos;

● É obrigatório para todos os tipos, exceto string, a utilização do sinal & antes do nome da variável de entrada;

Execução da entrada de dadosExecução da entrada de dados

scanf ( “%d”, &x );

Esta declaração indica ao programa que este deve esperar pela digitação pelo usuário, de um valor numérico inteiro que irá ser armazenado na variável x, logo após o usuário digitar o comando Enter do teclado, indicando assim o envio da informação ao computador;

Exemplo 1Exemplo 1#include <bits/stdc++.h>using namespace std;int main (){ // definicao das variaveis

int x;

// entrada dos dados printf ( “entre com um valor numerico\n” );

scanf ( “%d”, &x );

// saida dos resultadosprintf ( “valor lido para x = %5d\n”, x );

return 0;}

ConsideraçõesConsiderações● Observar a necessidade de uma instrução que indica

a interação entre o usuário e o programa: printf ( “entre com um valor numerico\n” );

● Não deve ser usada na OBI ou Maratona.● Sem ela, o usuário não saberia o que fazer quando o

programa estivesse sendo executado;● O usuário é responsável pelo conhecimento

antecipado do tipo da variável que está sendo inserida, caso contrário, a inserção de variáveis diferentes dos tipos definidos para elas, causam erros na execução do programa;

● Deve-se formatar de forma mais simples possível os dados de entrada, caso contrário, o usuário terá muito trabalho digitando os dados num formato complexo.

● Uma vez armazenado na memória a informação é tratada normalmente como já visto anteriormente, quando foi apresentado a atribuição de valores;

● Desta forma, a impressão da variável pode ser feita conforme a necessidade do programa, independentemente da forma da entrada da mesma.

● Observe no exemplo anterior, que a variável x tem o formato %d na entrada e %5d na saída.

Exemplo 2Exemplo 2

int x, y;

float a, b, c;

char p;

scanf ( “%d %f %d %c”, &y, &b, &x, &p );

Antes do %c, sempretem espaço em branco

ConsideraçõesConsiderações1. Neste caso, são esperados 4 valores na entrada de

dados;

3. Portanto, o usuário deve digitar os dados na ordem em que eles são solicitados;

5. Observar que as variáveis devem corresponder aos respectivos formatos;

1. Os dados podem ser digitados na mesma linha, separados por um ou mais espaços em branco, e após a digitação dos mesmos, digita-se o comando Enter do teclado;

3. Os dados podem ser também fornecidos, na ordem solicitada, digitando-se separadamente cada um deles, seguidos do comando Enter do teclado;

AlternativaAlternativa

int x, y; float a, b, c; char p;

scanf ( “%d”, &y ); scanf ( “%f”, &b ); scanf ( “%d”, &x ); scanf ( “ %c”, &p );

Lembre-se de colocaro espaço em branco

ConsideraçõesConsiderações

● Aqui são válidas todas as considerações do exemplo anterior, exceto a quarta, pois como se tem 4 comandos de scanf, obrigatoriamente tem-se 4 entradas separadas.

● Ou seja, neste exemplo, obrigatoriamente a forma de entrada tem que ser aquela especificada na quinta consideração anterior.

Entrada de dados para StringEntrada de dados para String

char titulo[30];

scanf ( “%s”, titulo );

Observar que neste caso, o nome da variável não é antecedido pelo símbolo & como nos casos anteriores.

todas as observações anteriores são válidas para este caso;

● Neste caso é esperado que o usuário digite uma cadeia ( alfanumérica ) e após isto digite o comando Enter do teclado;

● Se tiver mais de uma variável no comando de entrada, os valores devem ser digitados da mesma forma que os casos anteriores, ou seja:– Se na mesma linha, os dados deverão ser separados por

um ou mais espaços em branco; no final do comando digitar Enter

– Se em linhas diferentes, cada dado é digitado na sua respectiva linha, e após o término da mesma, digitar o comando Enter

● Observar também que o código de formato %s na entrada de dados indica que o valor alfanumérico a ser digitado não tem espaços em branco.

● Portanto, no programa anterior são válidos os seguintes valores para a variável titulo:Efei

Casa

Universidade

● No entanto, se for necessário o armazena-mento de um valor alfanumérico que tenha espaços em branco em seu conteúdo, como por exemplo:

Universidade Federal de Itajuba

é necessário trocar-se o código de formato %s, na entrada de dados, pelo código %[^\n]

● na saída, independentemente da forma de entrada, uma cadeia só pode ser impressa, com o formato %s.

Exemplo 3Exemplo 3

char primeiro_nome[15], sobrenome[30];

printf ( “entre com seu primeiro nome\n”);

scanf ( “%s”, primeiro_nome );

printf ( “entre com seu sobrenome completo \n “ );scanf ( “ %[^\n]”, sobrenome ); ( observar um espaço em branco

antes do sinal de % )

printf ( “nome completo: %s %s\n”, primeiro_nome,

sobrenome );

Exemplo de dadosExemplo de dados● Suponha que o usuário entre com os seguintes valores

respectivamente para as variáveis primeiro_nome e nome:

RONALDO

BUENO MARCONDES PORTELA

● Neste caso, a impressão teria o seguinte aspecto:

nome completo: RONALDO BUENO MARCONDES PORTELA

Operações AritméticasOperações Aritméticas

● Adição +

● Subtração -

● Multiplicação *

● Divisão /

● Resto da divisão %

Exemplos de expressões Exemplos de expressões aritméticasaritméticas

int x, y;float a, b, c;

x = 3 * 2 + 5;y = x % 2;

a = 45.67;b = 3.45 + a;c = b / a – 10.567;

Hierarquia dos operadoresHierarquia dos operadores

Qual é o resultado da seguinte operação:

X = 5 + 2 * 3 ;

21 ou 11 ?

Hierarquia dos operadoresHierarquia dos operadores

● A hierarquia dos operadores define a ordem em que uma expressão é calculada;

● Define-se a seguinte tabela de prioridade para os operadores:– Parênteses ( mais alta )– Multiplicação e divisão– Adição e subtração

● Operadores com mesma prioridade, a ordem de resolução é da esquerda para a direita.

● No exemplo anterior:X = 5 + 2 * 3 ;

tem-se uma adição e uma multiplicação;

teste caso a multiplicação é realizada em primeiro lugar e em seguida, o resultado é adicionado ao valor 5

portanto, o resultado da expressão será:

2 * 3 = 6

6 + 5 = 11

● Se for desejado trocar a prioridade de um operador, utiliza-se parênteses.

● Exemplo: X = ( 5 + 2 ) * 3 ;

● Neste caso, como o parênteses tem a maior prioridade, ele é resolvido na frente;

Desta forma, tem-se:

5 + 2 = 7

7 * 3 = 21

Exemplo 4Exemplo 4

● A expressão algébrica:

]3[*

]3[

]3*[

bbaba

a

ababa

• É representada em linguagem C como:

( (a – b) / (a + b) - (a * 3) ) /

( (3 – a) + a * b / (a – b) – (3 + b) )

• ordem da execução dos operadores

( (a – b) / (a + b) - (a * 3) ) /

( (3 – a) + a * b / (a – b) – (3 + b) )

B

1 2 3

A

4

5

6 9 7 8

10

11

12

Operação finalOperação final

A / B

13

Expressões inteirasExpressões inteiras● Constituídas de variáveis e constantes inteiras

● Resultado é sempre inteiro

● Exemplo: a expressão:

5 * 2 / 3

Resulta no valor 3

● Já a expressão: 2 / 3 * 5

Resulta no valor 0

● E a expressão: 3 / 2 * 5

Resulta no valor 5

Expressões flutuantesExpressões flutuantes

● Constituídas de variáveis e constantes flutuantes

● Resultado é sempre flutuante

● Exemplo: a expressão:

5.0 * 2.0 / 3.0

Resulta no valor 3.33

Expressões mistasExpressões mistas

● Constituídas de variáveis e constantes flutuantes e inteiras

● Resultado é sempre flutuante

● Exemplo: a expressão:

5.0 * 2 / 3.0

Resulta no valor 3.33

● Já a expressão: 2.0 / 5 * 3

Resulta no valor 1.20

● E a expressão: 5 / 2 * 3.0

Resulta no valor 6.0

CUIDADO!!!

Casting tiposCasting tipos

● Pode-se forçar temporariamente, a mudança do tipo de uma variável, através do casting do tipo, que consiste em se anteceder o nome da variável com o novo tipo, entre parênteses.

Exemplo 5Exemplo 5int a, b;

float c;

c = 2.5;

a = 3;

b = (int)c * a;

Que resulta em 6 o valor armazenado em b

Exemplo 6Exemplo 6int a, b;

float c;

c = 2.5;

a = 3;

b = (int)(c * a);

Que resulta em 7 o valor armazenado em b

Atribuições inteirasAtribuições inteiras

int a, b;

a = 34;

b = a * 2;

Em b estará armazenado o valor 68

Atribuição FlutuanteAtribuição Flutuante

float a, b;

a = 34.56;

b = a * 2;

Em b estará armazenado o valor : 69.12

Atribuição mistaAtribuição mistaint a, b;float c, d;

a = 10;c = 20.20;

b = 2 * c; // inteiro recebendo flutuanted = a * 2; // flutuante recebendo inteiro

b tem valor 40 d tem valor 20.0

Operadores EspeciaisOperadores Especiais

● Adição ++

● Subtração --

● Atribuição com operação += -= /= *=

AdiçãoAdição

● Sejam as operações: x = 35; x = x + 10;

Como mostrado anteriormente, na variável x é armazenado o valor atual dela ( 35 ) adicionado à constante 10, o que resulta no valor 45.

● Uma outra forma de se escrever as mesmas instruções é utilizando-se o operador especial +=, da seguinte forma:

x = 35;

x += 10;

Ou seja, a expressão do lado direito ao sinal de igual é operada com a variável do lado esquerdo e o resultado é armazenado nesta mesma variável.

● Isto é também válido para os outros opera-dores, como mostrado no exemplo:

a = 23;

a *= 2;

significa que na variável a vai estar armazenado o valor 46, pois corresponde à operação:

a = a * 2

Exemplo 7Exemplo 7

int a, b;

a = 10;

b = 2;

a += b + 3;

printf ( “ a = %d\n”, a );

resultado

Neste caso, a saída seria:

a = 15

Exemplo 8Exemplo 8

int a, b;

a = 10;

b = 2;

a += a* (b + 3);

printf ( “ a = %d\n”, a );

Resultado

Neste caso, a saída seria:

a = 60

● Para as operações de adição e subtração, existem mais dois operadores especiais.

● São eles: ++ e -- respectivamente.

● Sejam por exemplo, as seguintes operações:

x = 30;

x = x + 1;

como mostrado anteriormente, a ultima operação pode ser também escrita como:

x += 1;

ou ainda:

x++;

o que resulta no valor 31 armazenado na variável x , em todos os exemplos.

● O operador ++ é utilizado quando o conteúdo de uma variável é adicionado de uma unidade, e da mesma forma, o operador -- é utilizado quando o conteúdo de uma variável é subtraído de uma unidade.

● Sejam por exemplo, as seguintes operações:

x = 30;

x = x - 1;

como mostrado anteriormente, a ultima operação pode ser também escrita como:

x -= 1;

ou ainda:

x--;

o que resulta no valor 29 armazenado na variável x, em todos os exemplos.

Exemplo 1Exemplo 1➢ Dados 4 números, calcule a média aritmética deles.

Programa em C++: Programa em C++: (exemplo1.cpp)(exemplo1.cpp)

#include <bits/stdc++.h>#include <bits/stdc++.h> using namespace std;using namespace std; int mainint main()() {{ // declaração das variáveis// declaração das variáveis float n1, n2, n3, n4, soma, media;

Exemplo 1Exemplo 1 // entrada de dados// entrada de dados

printf ( “entre com o valor de n1 = “ );scanf ( “%f”,&n1 );printf ( “entre com o valor de n2 = “ );scanf ( “%f”,&n2 );printf ( “entre com o valor de n3 = “ );scanf ( “%f”,&n3 );printf ( “entre com o valor de n4 = “ );scanf ( “%f”,&n4 );

Exemplo 1Exemplo 1 // Somando todos os valores// Somando todos os valores

soma = n1 + n2 + n3 + n4;

// Calculando a média// Calculando a médiamedia = soma / 4;

// saída de dados// saída de dados printf ( “A média dos 4 números é: %.2f “, media );

}}

Exemplo 2Exemplo 2➢ Elabore um programa que leia um valor de temperatura em graus Celsius, calcule e exiba a temperatura equivalente em graus Kelvin, sabendo que K = C + 273.

Programa em C++: Programa em C++: (exemplo2.cpp)(exemplo2.cpp)

#include <bits/stdc++.h>#include <bits/stdc++.h> using namespace std;using namespace std; int mainint main()() {{

// declaração das variáveis// declaração das variáveis float K, C;

Exemplo 2Exemplo 2 // entrada de dados// entrada de dados

printf ( “entre com a temperatura em Celsius = “ );scanf ( “%f”,&C );

// Calculando a temperatura em Kelvin// Calculando a temperatura em KelvinK = C + 273;

// saída de dados// saída de dados printf ( “A temperatura em Kelvin é: %.2f “, K );

}}

Exemplo 3Exemplo 3➢ Ler o nome de um cliente de fast food e a quantidade de cada item do menu que ele vai pedir. Exiba o nome do cliente e o total da compra.

MENU

Hot dog R$ 2,50

Hambúrguer R$ 4,00

Cheeseburguer R$ 4,50

Refrigerante R$ 2,00

Batatas fritas R$ 3,50

Exemplo 3Exemplo 3Programa em C: Programa em C: (exemplo3.cpp)(exemplo3.cpp)

#include <bits/stdc++.h>#include <bits/stdc++.h> using namespace std;using namespace std; int mainint main()() {{ // declaração das variáveis// declaração das variáveis char nome[30]; int qhd, qha, qch, qre, qbf; float pthd, ptha, ptch, ptre, ptbf, ptf; // entrada de dados// entrada de dados printf ( “entre com o nome do cliente: “ ) scanf ( “ %[^\n]”, nome)

Exemplo 3Exemplo 3 printfprintf ( “entre com a quantidade de hot dog: “ ) ( “entre com a quantidade de hot dog: “ ) scanf ( “%d”,&qhd ); printfprintf ( “entre com a quantidade de hambúrguer: “ ) ( “entre com a quantidade de hambúrguer: “ ) scanf ( “%d”,&qha ); printfprintf ( “entre com a quantidade de cheeseburguer: “ ) scanf ( “%d”,&qch ); printfprintf ( “entre com a quantidade de refrigerante: “ ) scanf ( “%d”,&qre ); printfprintf ( “entre com a quantidade de batatas fritas: “ ) scanf ( “%d”,&qbf );

Exemplo 3Exemplo 3 // Calculando o total a pagar// Calculando o total a pagar pthd = qhd * 2.5; ptha = qha * 4.0; ptch = qch * 4.5; ptre = qre * 2.0; ptbf = qbf * 3.5; ptf = qhd + qha + qch + qre + qbf; // saída de dados// saída de dados printf ( “ Cliente: %s\n“, nome); printf ( “ O valor devido é: R$ %.2f\n“, ptf); }

InformationInformation

Para alguns exercícios somos obrigado a ler todos os dados de um arquivo, para isso precisamos verificar o fim do arquivo, pois vamos ler até o ultimo dado. O código do programa fica:

InformationInformation #include <bits/stdc++.h>#include <bits/stdc++.h> using namespace std;using namespace std; int main()int main() {{ // declaração das variáveis// declaração das variáveis while (scanf("%d", &n) != EOF)while (scanf("%d", &n) != EOF) {{

// corpo do programa// corpo do programa }} return 0;return 0; }}

DUVIDAS: http://acm.timus.ru/help.aspx?topic=cpp

ExerciseExercise

Faça os exercícios do URI:Faça os exercícios do URI: http://www.urionlinejudge.com.br/

1001 a 1021

Faça o exercício:Faça o exercício:http://br.spoj.com/problems/QUADRAD2/

http://br.spoj.com/problems/TOMADA13/

Faça o exercício:Faça o exercício:http://acm.timus.ru/problem.aspx?space=1&num=1000