quarta-feira, 25 de abril de 2018

Video 002 - Palestra de Pieter Levels


Neste video Pieter Levels fala um pouco de sua experiencia como desenvolvedor. Mesmo sem saber muito de programação, Pieter pos como meta fazer 12 startups em 12 meses. Assim, criou alguns "Minimal Viables Products" que lhe deram retorno financeiro enquanto ele aprendia a programar. Acredito que é muito interesse ouvir o que ele tem a dizer.

quinta-feira, 12 de abril de 2018

Resolução da Dinamica 003

Eis um dos possíveis códigos que implementam o algoritmo de Fisher-Yates em C. Acredito que esse ficou bem legalzinho :D

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int main(){
    int n, m, i, aux;

    srand(time(NULL));

    scanf("%d", &n);
    int vetor[n];

    printf("VETOR ORDENADO: ");
    for(i = 1; i <= n; i++){
        vetor[i - 1] = i;
        printf("%d ", vetor[i -1]);

    }
    printf("\n");
    m = n - 1;

    while(m){
        i = rand() % m;
        aux = vetor[i];
        vetor[i] = vetor[m];
        vetor[m] = aux;
        m--;
    }
    printf("VETOR EMBARALHADO: ");
    for(i = 0; i < n; i++){
        printf("%d ", vetor[i]);
    }

    return 0;

}

quarta-feira, 11 de abril de 2018

Dinamica 003 - Embaralhamento de um vetor

Em muitas aulas os alunos de programação tiveram que aprender algoritmos de ordenação. Porém poucos lugares se dedicam a fazer o contrario: algortimos de embaralhamento. Devido isso, muitos programas usam algoritmos ruins quando precisam embaralhar alguma coisa, como alguns jogos.

Nesta dinamica, vamos implementar o algoritmo de Fisher-Yates, um dos mais simples e eficientes para esta tarefa, para desordenar um vetor de inteiros.

O algoritmo é bom, mas desse jeito é mais estiloso


Etapa 1

Crie uma rotina que, ao usuário entrar com um número N, gere um vetor V de  1 até N. Por exemplo, se N = 8, V = [1, 2, 3, 4, 5, 6, 7, 8] . Isso já foi feito na Dinamica 001.
 
Etapa 2

Gere um número aleatorio K de 0 até N - 1 e faça a troca do último elemento do vetor V para a posição K, e o elemento da posição K para a última posição.
Por exemplo, se V = [1, 2, 3, 4] e K = 1, após a rotina será V = [1, 4, 3, 2]
 
Etapa 3

Coloque a troca feita na etapa anterior numa estrutura de repetição, e decremente a posição do último vetor, para que a troca seja feita e todos os elementos do vetor.
Por exemplo, se N = 5, V = [1, 2, 3, 4, 5].
No passo 1, se K = 2 V = [1, 2, 5,4, 3]
No passo 2, se K = 0, V =  [4, 2, 5, 1, 3]
e assim por diante


Etapa 4 

Finalmente crie o programa completo em C que una as etapas anteriores. Lembre-se de imprimir na tela o vetor original e o embaralhado.

 

terça-feira, 10 de abril de 2018

Resolução da Dinamica 002

O código que eu desenvolvi para fatorar um número em fatores primos segue abaixo. Como disse no post anterior muitas melhorias podem ser feitas, como por exemplo usar o Teorema de Miller para acelerar a verificação da primariedade dos números.

#include <stdio.h>


int verificaPrimo(int n){
    int i;
    if(n < 2){
        return 0;
    }
    else if(n == 2){
   
        return 1;
   
    }
    else{
     
        for(i = 2; i < n; i+=1){
            if(!(n % i))
                return 0;
            }
        return 1;

        }




    }





int n_esimo_primo(int n){

if( n == 1)
    return 2;

if (n == 2)
    return 3;



int i = 2;


while(n){
  if(verificaPrimo(i)){
        n--;
  }


 
    i+=1;
}
  return i - 1;

 }
int main(){
    int n, i, d;
    scanf("%d", &n);
    i = 1;
     while( n != 1){

        d = n_esimo_primo(i);
        while(!(n % d)){
            printf("%d ", d);
            n = n / d;
        }
        i++;
       
    

    }
}


segunda-feira, 9 de abril de 2018

Dinamica 002 - Fatoração em números primos

Segundo o Teorema Fundamental da Aritmética, todo número maior que 1 pode ser decomposto em um produto de números primos. O problema desta dinâmica é criar um programa que, dado um valor N entrado pelo usuário, este seja fatorado em números primos e estes números sejam impressos na tela.


"Dizia eu que a aritmética... "



Para ajudar a resolução do problema, divide-se o desenvolvimento do programa em 5 etapas:

Etapa 1

Crie uma função, dado um valor X, verifica-se se X é um numero primo.
Por exemplo, se o usuário entra com o valor X = 3, deve-se retornar 1, pois 3 é primo. Se o usuário entra com o valor X = 4, deve-se retornar 0, por 4 não é primo.

Etapa 2

Utilizando a primeira função, crie outra que retorna, dado o valor i, o i-ésimo numero primo, lembrando que 1 não é primo.
Por exemplo, se o usuário entra com o valor i = 1, deve-se retornar 2, pois o primeiro numero primo é 2. Se o usuário entrar com o valor i = 7, deve-se retornar 13, pois o sétimo numero primo é 13.

Etapa 3

Na função principal, crie uma rotina que divide o numero N entrado pelo usuário por 2 e atribui o resultado em N, até que N não seja mais divisivel por 2.
Por exemplo, se o usuário entra com o número N = 60, deve-se divide por 2 e atribuir o resultado em N ficando 30, em seguida, repete-se a divisão até que N = 15. Como 15 não é divisível por 2, neste momento para-se as divisões.

Etapa 4

Modifique a rotina criada na etapa anterior, colocando outra estrutura de repetição que incrementa P, de modo que quando N deixar de ser divisivel por P, P torna-se o próximo numero primo. Lembrando que P deve começar por 2, já que 2 é primo.
Por exemplo, quando N = 60, divide-se por 2 até que N = 15. Depois divide-se por 3 até que N = 5, e depois por 5 até que N = 1.

Etapa 5

Finalmente elabore um programa em C que resolva o problema enunciado ao topo.



Provavelmente o programa feito nessas etapas não será o mais eficiente possível para se resolver o problema, mas acredito que o processo ficou bem didático. Melhorias no código podem ser feitas depois.

domingo, 8 de abril de 2018

Resolução da Dinamica 001

Um dos possíveis códigos que resolvem o problema é esse:

#include <stdio.h>

int main()
{


// primeira etapa

    int n, i, j, achou;
    scanf("%d", &n);
    int v1[n];
    


    for(i = 1; i <= n; i++){
        v1[i - 1] = i;
        printf("%d ", v1[i - 1]);
    }
    printf("\n"); 



// segunda etapa


   int v2[n - 3];
    for(i = 0; i < n - 3; i++){
        scanf("%d", &v2[i]);
       
    }
  


     // terceira etapa


for(i = 0; i < n; i++){
        achou = 0;
        for(j = 0; j < n -3; j++){
            if(v1[i] == v2[j])
                achou = 1;
           
        }
        if(!achou){
            printf("%d ", v1[i]);
        }
       
    }
   
   
    return 0;
}

Dinamica 001 - Diferença de vetores

A primeira dinâmica da nossa equipe consiste em resolver o seguinte problema:

Dado um número N digitado pelo usuário, programa irá gerar um vetor V1 de 1 até N, depois o usuário entrará com um vetor V2 de tamanho N - 3. Supondo que o usuário sempre irá entrar com valores diferentes e menores ou iguais a N, o programa então deverá imprimir na tela os três valores diferentes.

"Sinto a mesma coisa quando o programa dá erro"



Para facilitar a resolução do problema, dividiu-se em quatro etapas:

Etapa 1 (papel)

A leitura do valor N e a geração do vetor V1 = [1, 2, 3, 4, ... , N - 2, N - 1, N], sendo que o conteúdo do vetor deve ser gerado automaticamente.
Por exemplo, se o usuário digitou o valor N = 6, o vetor V1 deve ser [1,2,3,4,5,6]. Lembrando que o valor 0 não deverá entrar como conteúdo de V1.

Etapa 2 (papel)

A leitura dos N - 3 valores digitados pelo usuário e seu armazenamento no vetor V2.
Por exemplo, se o valor de N for 6, o usuário deve entrar com 3 valores, neste caso 2, 4, 5 e estes devem ser armazenados em V2, sendo seu conteudo [2, 4, 5].
Espera-se que o usuário entre com valores menores ou iguais a N e todos diferentes, por isso não precisa fazer um tratamento disto.

Etapa 3 (papel)

Tendo os dois vetores V1 e V2 preenchidos, deve-se imprimir na tela os valores que estão em V1, mas não estão em V2, sendo a diferença desses vetores.
Por exemplo, se V1 = [1, 2, 3, 4, 5, 6] e v2 = [2, 4, 5] o que devera ser impresso na tela é "1 3 6"

Etapa 4 (computador)

Finalmente desenvolver um programa em C que una as três etapas anteriores e resolva o problema enunciado ao topo.