Olimpíada Brasileira de Informáticarcosta62br.unifei.edu.br/OBI/aula_02.pdf · Este formato das...
Transcript of Olimpíada Brasileira de Informáticarcosta62br.unifei.edu.br/OBI/aula_02.pdf · Este formato das...
TreinamentoOlimpíada Brasileira de Olimpíada Brasileira de
InformáticaInformática
Universidade Federal de Itajubá
Prof. Roberto Affonso da Costa Junior
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
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
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 )
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
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
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
• É 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
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
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
● 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