C virando com C

nathan@vieiraproenca.com

 

"Roteiro"

Quebrar o gelo

Guardar informação

Condicionais e repetições

Informações - Dados

Condicionais/loops - Algoritmo

Informações - Dados

Condicionais/loops - Algoritmo

Estrutura de dados e algoritmos 0

Tudo é finito

Quantos números existem com no máximo 3 dígitos?

E com 4?

Inteiros

int       a = 20;
long      b = 1000000009;
long long c = b*b;

Inteiros

int       a = 20;         /* Normalmente usado, <= 10^9 */
long      b = 1000000009; /* Enganação pura             */
long long c = b*b;        /* Cabe até 10^18             */

Inteiros

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  */

Inteiros

int a;                scanf(" %d", &a);
unsigned int ua = 20; scanf(" %u", &ua);
long               b; scanf(" %d", &b);
long long          c; scanf(" %lld", &c);
unsigned long long d; scanf(" %llu", &d)

Números reais

double pi  = 3.14159265;
double big = 1e9*3e9;
double in;
scanf(" %lf", &in);

Números reais

Como se escreve 1/3 em número decimal?

Números reais

Notação científica

Erro de precisão!

Fique com inteiros, sempre que possível

Números reais

double pi = 3.14159265;
int a = pi;
printf("%d\n", (int)pi);
int b = 1000000009;
long long c = (long long)b*(long long)b;

Nome são difíceis

Né não, Victor?

Meu aquário

  • Nemo
  • Nemo 2
  • Nemo 3

Meu aquário

  • Nemo 0
  • Nemo 1
  • Nemo 2
  • ...
  • Nemo 199

Meu aquário

int nemo[200];
nemo[0];
nemo[1];
...
nemo[199];

É verdade que o nemo é gordo?

if(nemo[0] > 20)
{
  printf("SIM!\n");
}
else
{
  printf("Naaao\n");
}

Computador, não filósofo

int in;
scanf(" %d", &in);
if(in)
{
  printf("Verdade!\n");
}
else
{
  printf("Mentira!\n");
}

Dieta no aquário

if(nemo[0] > 20)
{
  printf("Ninguém virou jantar, tá de dieta\n");
}
else if(nemo[0] >= 10)
{
  printf("Logo logo vou falar contigo em baleiês\n");
}
else
{
  printf("Mas tu é um peixe ou um passarinho?\n");
}

Dieta no aquário

if(nemo[0] >= 10)
{
  printf("Logo logo vou falar contigo em baleiês\n");
}
else if(nemo[0] > 20)
{
  printf("Ninguém virou jantar, tá de dieta\n");
}
else
{
  printf("Mas tu é um peixe ou um passarinho?\n");
}

O segundo condicional nunca será executado!

Batismo e igualdade

a = 20;
a == 20;
a != 20;

Meu aquário

int nemo[200];
printf("%d\n", nemo[0]);
printf("%d\n", nemo[1]);
...
printf("%d\n", nemo[199]);

O computador entende ...?

int nemo[200];
int i = 0;
while(i < 200)
{
  printf("%d\n", nemo[i]);
  i++;
}

Muito versátil

int cnt;
scanf(" %d", &cnt);
while(cnt >= 0)
{
  printf("Auto destruição em %d...\n", cnt);
  cnt--;
}

Muito versátil

int cnt;
scanf(" %d", &cnt);
while(cnt%7)
{
  printf("Parece que %d não é múltiplo de 7\n", cnt);
  cnt++;
}
printf("Finalmente! %d é múltiplo de 7!\n", cnt);

Muito versátil

int cnt;
scanf(" %d", &cnt);
while(42)
{
  if(cnt%7 == 0) break;
  printf("Parece que %d não é múltiplo de 7\n", cnt);
  cnt++;
}
printf("Finalmente! %d é múltiplo de 7!\n", cnt);

Muito versátil

int lo, hi;
scanf(" %d%d", &lo, &hi);
while(lo < hi)
{
  if(lo%7 == 0) continue; // a nadar
  printf("%d não é múltiplo de 7\n");
  lo++;
}

Loop infinito!

o lo nunca irá mudar quando for uma potência de 7

Qual o nemo caçula?

int k, i, n;
k = 0; i = 1;
while(i < n)
{
  if(nemo[i] < nemo[k])
  {
    k = i;
  }
  i++;
}

Qual o nemo caçula?

int k, i, n;
k = 0;
for(i = 1;i < n;i++)
{
  if(nemo[i] < nemo[k])
  {
    k = i;
  }
}

Como trocar os nemos?

nemo[0] = 20;
nemo[1] = 10;
nemo[0] = nemo[1];

Como trocar os nemos?

int aux;
nemo[0] = 20;
nemo[1] = 10;
aux = nemo[0];
nemo[1] = nemo[0];
nemo[1] = aux;

Como trocar os nemos?

#include <cstdio>
#include <algorithms>

int main()
{
  int nemo[200];
  nemo[0] = 20;
  nemo[1] = 10;
  std::swap(nemo[0], nemo[1]);
}

Como trocar os nemos?

#include <cstdio>
#include <algorithms>
using namespace std;

int main()
{
  int nemo[200];
  nemo[0] = 20;
  nemo[1] = 10;
  swap(nemo[0], nemo[1]);
}

Como trocar os nemos?

#include <bits/stdc++.h>
using namespace std;

int main()
{
  int nemo[200];
  nemo[0] = 20;
  nemo[1] = 10;
  swap(nemo[0], nemo[1]);
}

Como trocar os nemos?

#include <bits/stdc++.h>
using namespace std;
int main()
{
  int nemo[200];
  int k, i, n;
  scanf(" %d", &n);
  for(i=0;i < n;i++)
  {
    scanf(" %d", &nemo[i]);
  }
  k = 0;
  for(i=1;i < n;i++)
  {
    if(nemo[i] < nemo[k])
    {
      k = i;
    }
  }
}

Como trocar os nemos?

#include <bits/stdc++.h>
using namespace std;
int main()
{
  int nemo[200];
  int k, i, n;
  scanf(" %d", &n);
  for(i=0;i < n;i++)
    scanf(" %d", &nemo[i]);
  k = 0;
  for(i=1;i < n;i++)
  {
    if(nemo[i] < nemo[k]) k = i;
  }
  swap(nemo[0], nemo[k]);
}

E o segundo caçula?

int i, k, n;
k = 0;
for(i=1;i<n;i++)
{
  if(nemo[i] < nemo[k]) k = i;
}
swap(nemo[0], nemo[k]);
k = 1;
for(i=2;i<n;i++)
{
  if(nemo[i] < nemo[k]) k = i;
}
swap(nemo[1], nemo[k]);

E o j-ésimo caçula?

for(int j=0;j<n;j++)
{
  k = j;
  for(int i=j+1;i<n;i++)
    if(nemo[i] < nemo[k]) k = i;
  swap(nemo[k], nemo[j]);
}

O que houve com os nemos?

  • Nemo 0 é o menor
  • Nemo 1 é o segundo menor
  • Nemo 2 é o terceiro menor
  • ...
  • Nemo 199 é o maior

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

http://olimpiada.ic.unicamp.br/tobi

http://www.cplusplus.com/doc/tutorial/

http://www.ime.usp.br/~hitoshi/introducao/

http://www.ime.usp.br/~maratona

C virando com C

By Nathan Proença

C virando com C

  • 1,240