Clube de Programação UPF

Passo Fundo, 07 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

Pro-gra-mar:

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

Competições

Principais características

Maratona

  • Equipes de 3 pessoas
  • Cerca de 10~13 problemas
  • Resultados em "tempo real" 
  • Material de apoio
  • Tempo é levado em conta
  • Público-alvo: universitários
  • Balões :-)

OBI

  • Individual
  • Cerca de ~5 problemas
  • Resultados só depois
  • Sem consulta
  • Tempo não importa
  • Estudantes do EF e EM + 1º ano de graduação

Maratona e OBI têm em comum

  • 5 horas de duração
  • 1 só computador
    • Equipes da Maratona precisam administrar o tempo
  • 2 ou 3 problemas fáceis por prova
  • Conteúdos específicos de Computação
    • Grafos, Programação Dinâmica, Geometria, Strings, etc

Preparação faz a diferença

Ambiente de programação

  • Sistema: GNU/Linux
    • Ubuntu 16.04
  • Linguagens disponíveis:
    • C(++)
    • Java
    • Python
    • Pascal
    • JavaScript (só na OBI)
  • Editores de texto
    • Geany
    • Sublime Text
    • Gedit
    • Emacs
    • Vim
  • IDEs
    • Eclipse

Guias de Consulta Rápida

  • github.com/maratonaupf/materiais
    • Pasta: ImprimirELevar
      • Arquivo: ConsultaCpp11-ProfBrusso.pdf
      • Arquivo: ConsultaJava-ProfPavan-ProfJaqson.pdf
  • Sugestão: faça o que o nome da pasta diz e imprima o guia de consulta da sua linguagem, será muito útil
    • Se quiserem, posso dar um tempinho pra fazer isso :-)

Anatomia de um código C++

#include<iostream>

using namespace std;

int main(){
    int a, b;
    cin >> a >> b;
    cout << "X = " << a+b << endl;
    return 0;
}

Anatomia de um código Java

import java.util.Scanner;

class Main{
    public static void main(String args[]){
        int a, b;
        Scanner sc = new Scanner(System.in);
        a = sc.nextInt();
        b = sc.nextInt();
        System.out.println("X = " + (a+b));
    }
}

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 e testes

# 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 

Compilação e execução Java

# Compilação Java
javac Programa.java

# Execução Java
java Programa

# Redirecionando a entrada e a saída
java Programa < entrada.txt > saida.txt 

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

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

Mão na massa!

  • Abra o terminal + seu editor de texto favorito
  • Entre em uma dessas plataformas
  • Veteranos: podem ir resolvendo os mais fáceis
    • Sem compilar nem testar: perfectividade de código ;-)
  • O resto da demonstração é por minha conta \o/
  • Dúvidas? Só chegar =)

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

Exercícios e roteiros de estudo

Lição de casa

Leia a documentação da sua linguagem!

Obrigado!

Passo Fundo, 07 de março de 2017

/maratonaUPF​

maratonaupf.github.io

constantin.leo@gmail.com

Made with Slides.com