Sorteador de amigo secreto

Amigo secreto é uma brincadeira bastante tradicional, que geralmente ocorre na época do Natal, e consiste em trocar presentes com outras pessoas, mas que estas não sabem quem lhes tirou e o que vão ganhar.

 

presenteÍndice

  • 1 Versão 0: Sorteador simplificado
    • 1.1 Importar
    • 1.2 Criar Estrutura
    • 1.3 Ler dados
    • 1.4 Alocar vetor
    • 1.5 Receber lista de amigos
    • 1.6 Desordenar o vetor
    • 1.7 Imprimir resultado
    • 1.8 Extra
  • 2 Versão 1: sem ter que recomeçar a distribuição de presentes
  • 3 Amigos mais próximos sorteiam entre si com maior chance ainda aleatório
  • 4 Versão 3

 

 

Versão 0: Sorteador simplificado

Na primeira versão de um programa para sortear amigo secreto queremos somente que cada pessoa seja indicada para quem ela vai dar um presente. Um sorteador de amigos secretos recebe uma lista de nomes e indica quem vai dar presente para quem. A primeira tarefa é pedir para o usuário que está administrando o amigo secreto o número de quantas pessoas está participando do amigo secreto. Para ler o número de pessoas veja aqui. Você precisa alocar um array de strings sendo que cada string pode ter até 60 caracteres, ou seja, 61 posições char para guardar o terminador de string. Para realizar aleitura user um loop do tipo for.

Entrada: lista de nomes

EntradaAmigo
Depois da inserção de todos os nomes, a saída a ser produzida da seguinte forma que significa por exemplo que João vai entregar um presente para Matheus:

Saída: lista de pares de nomes

SaidaAmigo

Importar

Comece fazendo a importação das bibliotecas necessárias: stdio, stdlib e time.h;

Criar Estrutura

Crie uma estrutura que tenha como variável nome que deve ser um char[50];

Ler dados

Utilizando printf e scanf receba o numero de amigos que serão sorteados.

Alocar vetor

Aloque um vetor do mesmo tipo da estrutura criada com o tamanho recebido no passo 3.

Receber lista de amigos

Crie um Loop do tipo Do While e nesse loop utilizando printf e scanf receba os nomes dos amigos, lembre-se de que para atribuir um nome no vetor alocado você deve fazer:

    gets(lista[i].nome); 

sendo i a posição do vetor, lista o nome dele e .nome a variável nome criada na estrutura. (Antes de cada inserção do nome utilize fflush(stdin) para que não haja problemas).

Desordenar o vetor

Agora inicia a parte realmente desafiante desse problema, vamos criar o sorteador em si, para isso utilizaremos o algoritmo de desordenação de Knuth:

    for (i = 0; i < n; i++) {
         int j = i + rand() % (n - i);
         Amigos temp = lista[i];	
         lista[i] = lista[j];
         lista[j] = temp;
    }

Ele movimenta um elemento por vez, sendo que todo o seu funcionamento está focado em trocar um elemento por um outro em posição aleatória, tente entender o código acima e depois aplique-o ao seu.

Imprimir resultado

Agora utilizando um laço for e a função print, imprima na tela o convidado e em seguida seu amigo (como descrito na saída do problema), lembre-se que se o convidado está na posição [i] o amigo está em [i+1] e no caso do último i utilize o i=0 para ser seu amigo. Fazendo isso o laço for deve iniciar em 1 e não em 0.

Extra

Perceba que você processa lista de amigos ímpares, o que deixará algum amigo de fora da brincadeira, pense em uma solução para que isso não ocorra, um caminho interessante é na inserção do número de amigos controlar se o número recebido foi par ou ímpar.

 

Versão 1: sem ter que recomeçar a distribuição de presentes

Um problema que pode acontecer na versão 0 é que a roda de entrega de presentes pode terminar antes de todos os presentes terem sido entregues.

 

Versão2: Amigos mais próximos sorteiam entre si com maior chance ainda aleatório

 

Versão 3

2) incluir uma maneira de enviar e-mails 3) fazer um aplicativo de celular 4) incluir propaganda para ganhar $ 5) incluir usar facebook para sugerir presentes 6) criar uma loja que auxilia nos amigos secretos
Algoritmo de desordenação de Knuth: slide 6 http://www.facom.ufu.br/~albertini/1sem2014/alg/aulas/aula04.pdf

Código final: Google Drive