Í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
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
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