====== Olimpíada Brasileira de Informática - OBI ====== A Olimpíada Brasileira de Informática é um evento promovido pela SBC (Sociedade Brasileira de Informática) e com a participação de escolas e universidades de todo o Brasil. No nível universitário (PS - programação sênior) podem se inscrever alunos do primeiro ano de faculdade apenas. {{ :logo_obi.png?150|}} A XXVI Edição realizada em 2024 foi a primeira participação da Escola Politécnica da Universidade de Pernambuco - POLI/UPE, com realização da Assessoria de Relações Internacionais - ARI/POLI e apoio da EComp (Eng. da Computação) e da ECA (Eng. de Controle e Automação). ===== Compilação e Testes Automáticos ===== ==== Compilação ==== Crie os exercícios na pasta **''rascunhos/obi''**, com os nomes indicados em cada exercício (por exemplo //idade.c//). Para compilar use: make idade.x Isso irá chamar o compilador ''GCC'' com as mesmas chaves obrigatórias da olimpíada, quais sejam: gcc -static -std=gnu17 -pipe -DEVAL -s -O2 -lm fonte.c -o fonte.x A chave ''-std=gnu17'' é assumida válida, mas não é obrigatória no regulamento da Olimpíada para a linguagem ''C''. Para a linguagem ''C++'', utilize o nome do fonte como //fonte.cpp// (exemplo: //idade.cpp//) e compile com make idade.out O ''makefile'' irá colocar as chaves obrigatórias do regulamento, que são: g++ -static -std=gnu++17 -pipe -DEVAL -s -O2 -lm fonte.cpp -o fonte.out A chave ''-std-gnu++17'' é dada como obrigatória pelo regulamento. Para ambas as linguagens, o ''makefile'' fornecido pelo professor também acrescenta as seguintes chaves para facilitar seu //debug// e padronização de saída do compilador, quais sejam: -Wall -Wextra -D$VERSION -D$BUILD -D$DEBUG -D$VARUSER -D_FORTIFY_SOURCE=$FORTIFY -Wl,-no-as-needed -Wl,--defsym,BUILD_$DEFSYM=0 ==== Teste ==== Estando ainda na pasta ''rascunhos/obi'', e tendo criado e compilado o //código fonte// com sucesso, para testar utilize o comando abaixo, dando o nome do exercício (no exemplo //idade//): checkobi.sh -f idade Este //script// irá rodar o seu programa uma vez para cada bloco de teste do exemplo, e comparar a saída do programa com a saída desejada. Para cada erro, será impressa uma linha indicando a diferença do que foi impresso e do que deveria ser impresso. Para testar com compilação em //C++// use: checkobi.sh -p -f idade Caso seu programa rode sem erros, será mostrada a mensagem: Saídas testadas com sucesso Se não conseguir a solução de primeira, volte a editar seu //código fonte// e repita o processo. ==== Debug ==== Caso precise //debugar// o seu programa, é útil colocar a chave de //debug// ''-g -Og'' (e desligar a otimização dada por ''-O2''). Para isso utilize o comando: make idade.x DEBUG=1 (ou, obviamente, o mesmo para ''C++'' com ''make idade.out DEBUG=1''). Utilize o ''gdb'' ou ''cgdb'' para fazer o //debug//. Não tenha economia em usar ''assert()'' no seu código e garantir as propriedades matemáticas e lógicas dos pontos cruciais do fluxograma e valores de variáveis assumidos. ===== Exercícios ===== Os exercícios dos anos anteriores podem ser acessados diretamente na página da OBI em https://olimpiada.ic.unicamp.br/pratique/ . Abaixo enumeramos alguns mais interessantes usados para praticar suas técnicas de programação. * [[:obi:ex:idade | Idade da Monica]] (trabalhos/obi/idade.c) * [[:obi:ex:figurinhas | Figurinhas da Copa]] (trabalhos/obi/figurinhas.c) * [[:obi:ex:camisetas | Camisetas da Olimpíada]] (trabalhos/obi/camisetas.c) * [[:obi:ex:zero | Zero para Cancelar]] (trabalhos/obi/zero.c) * [[:obi:ex:jogo | Jogo da Vida]] (trabalhos/obi/jogo.c) * [[:obi:ex:placas | Placas de Carros]] (trabalhos/obi/placas.c) * [[:obi:ex:ogro | Ogro]] (trabalhos/obi/ogro.c) * [[:obi:ex:concurso | Concurso]] (trabalhos/obi/concurso.c) * [[:obi:ex:arranhaceu | Arranha-céu]] (trabalhos/obi/arranhaceu.c) * [[:obi:ex:teclado | Teclado]] (trabalhos/obi/teclado.c)