Clube de Programação UPF

Passo Fundo, 02 de março de 2017

Oficina 01: Introdução à Programação Competitiva

Introdução

Algoritmos e Programação?

Al-go-rit-mo:

Sequência finita de instruções bem definidas e não ambíguas

Al-go-rit-mo:

Sequência finita de instruções bem definidas e não ambíguas

PROGRAMA tomar_banho

INICIO
    entre no box
    abra o registro

    passe xampu nos cabelos
    lave
    enxague os cabelos
    
    passe o condicionador
    deixe agindo

    limpe o corpo com sabonete
    tire o sabonete do corpo
    tire o condicionador dos cabelos
    
    feche o registro
    seque-se com a toalha
FIM

Pro-gra-mar:

Ensinar as coisas mais legais do mundo para alguns pedaços de minérios.

Introdução

Competições de Programação

Olimpíada Brasileira de Informática

  • Público-alvo: estudantes de escolas e 1º ano de graduação
  • Competição individual
  • Cerca de ~5 problemas por prova
  • Duração de 5 horas
  • Sem consulta, nem digital nem impressa
  • Códigos são corrigidos somente após a prova
    • Pontuação por "tarefas" que seu código resolve

Maratona de Programação

  • Público-alvo: universitários (qualquer curso)
  • 10~13 problemas
  • 5 horas de prova
  • Equipes de 3 pessoas
  • 1 só computador, sem acesso à Internet
    • "Cinco horas de máquina, mas 15 horas de humano"
  • Pode levar material impresso para consulta
    • Cadernos, livros, códigos impressos, baralho, etc
  • Vence quem resolver mais problemas em menos tempo

"Ingredientes"

Por onde começamos?

Pelo começo! (NÃO ME DIGA?)

"Ingredientes"

  • Linguagem de programação
    • C(++)
    • Java
    • Python
  • Ambiente de programação
    • Editor de texto + terminal
    • IDE

Linguagem de programação

  • Linguagem:
    • Conjunto de símbolos e de regras para combinar esses símbolos de forma que faça algum sentido
       
  • Linguagem de programação
    • Pode ser "traduzida" para linguagem de máquina
    • Alto nível vs. baixo nível
    • Compilada vs. interpretada

Ambiente de programação

  • Editor de texto
    • Programa onde escrevemos nossos códigos-fonte
    • Geany, Sublime Text, Gedit, Vim, Emacs, Notepad++...
  • Terminal (linha de comando)​​
    • Compilação, execução, testes, etc.
       
  • Usaremos o sistema operacional GNU/Linux
    • Distribuição: Ubuntu 16.04

Nosso primeiro programa

  • Problema: Olá CodCad
    • codcad.com/problem/1
  • Veteranos: podem ir resolvendo os mais fáceis do URI
    • Sem compilar nem testar: perfectividade de código ;-)
  • Abra o terminal
  • Abra o seu editor de texto favorito
    • Eu sugiro o Geany ou Sublime Text :-)
  • O resto da demonstração é por minha conta \o/

Nosso primeiro programa

  • Solução
#include<iostream>

using namespace std;

int main(){
    cout << "Ola CodCad!" << endl;
    return 0;        // IMPORTANTE
}

Como funciona um programa?

  • Entrada​​
    • Leitura dos dados a serem processados pelo programa
  • Processamento
    • Execução das instruções que nós demos ao programa
  • Saída
    • Exibição da resposta (na tela, num arquivo texto, etc)

Como funciona um programa?

  • Variáveis​​
    • "Espacinhos" ou "caixinhas" na memória, onde guardamos valores
  • Tipos de variáveis
    • Inteiro: int
    • Real: float, double
    • Caractere: char
      • Sequência de caracteres: string
    • Lógico: bool(eano)

Tipos de variáveis

  • Inteiros
int       a = 20;         /* Normalmente usado, <= 10^9 */
long      b = 1000000009; /* Enganação pura             */
long long c = b*b;        /* Cabe até 10^18             */
int                a = 20;
unsigned int      ua = 20;         /* Não pode negativo */
long               b = 1000000009;
long long          c = b*b;
unsigned long long d = 2*c;        /* Mas cabe o dobro  */
  • Com e sem sinal
  • Reais
double pi  = 3.14159265;
double big = 1e9*3e9;

Tipos de variáveis

  • Caracteres
char a;
char mander = 'a';
char meleon = '@';
char izard = 'A'; 
  • Strings
string nome = "Fulano";
string str = "Clube de Programacao UPF";
  • Lógicos
bool basaur = true;
bool noCeuTemPao = false; // e morreu :(

Entrada e saída

  • Entrada
string nome;
int idade;
double altura; // em metros
cin >> nome >> idade >> altura;
  • Saída
cout << "Nome: " << nome << endl;
cout << idade << " ano(s)" << endl;
// tem que dar #include<iomanip>
cout << fixed << setprecision(2) << altura << " metro(s)" << endl; 

Nada de "conversar" com o usuário!

int num;
cout << "Insira um numero: ";
cin >> num;

Compilação

# Compilação simples: gera um executável com nome "a.out"
g++ codigo.cpp

# Nomeando nosso executável
g++ codigo.cpp -o nome_programa

# Warnings: avisam sobre possíveis erros no seu código
g++ codigo.cpp -Wall

# Carregar a biblioteca <cmath> (<math.h>)
g++ codigo.cpp -lm

# Otimização
g++ codigo.cpp -O2

Execução, entrada e saída

# Execução simples: lê do teclado e escreve na tela
./programa

# Redirecionando a entrada: lê de um arquivo texto
./programa < entrada.txt

# Redirecionando a saída: escreve num arquivo texto
./programa < entrada.txt > saida.txt

# Medindo em quanto tempo nosso programa roda
time ./programa < entrada.txt > saida.txt

# Comparando a resposta esperada com a resposta do programa
diff gabarito.txt saida.txt 

Exercícios (mão na massa!)

  • URI Online Judge → www.urionlinejudge.com.br
    • URI 1001 - Extremamente Fácil
    • URI 1002 - Área do Círculo
    • URI 1005 - Média 1
    • URI 1008 - Salário
    • URI 1011 - Esfera
  • Abra o terminal + seu editor de texto favorito
    • Tirem as dúvidas conosco =)

Não se assuste

Ir da ideia pro código não é nada natural.

Não se assuste

Ir da ideia pro código não é nada natural.

É por isso que a gente treina.

Não se assuste

Ir da ideia pro código não é nada natural.

É por isso que a gente treina.

É a grande coisa que a Maratona oferece :-)

Lição de casa

www.codcad.com/course/1

www.urionlinejudge.com.br/

Obrigado!

Passo Fundo, 02 de março de 2017

/maratonaUPF​

maratonaupf.github.io

constantin.leo@gmail.com

Made with Slides.com