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