Ir ao conteúdo
  • Cadastre-se

C Funções em C com esquema pré-definido


Posts recomendados

Olá a todos! Eu estou tentando pensar numa forma de resolver o problema que se encontra em anexo, porém não consigo pensar numa forma de fazê-lo.

Eu pensei em começar o programa pela função descrita como int sorteia_voto_com_falha (double f), mas por mais que eu estude videoaulas sobre funções em C, não consigo aplicar no problema. Tenho algum conhecimento em funções mais simples como for, if, while. 

Outra dúvida que eu tenho a respeito do programa, é sobre o cálculo de probabilidade nessa mesma função que eu devo criar. Enfim, estou um tanto perdida. Alguém poderia me dar alguma dica de por onde começar de maneira mais simples? Obrigada!

 

eleicao.pdf

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

5 horas atrás, Yasmin Martins disse:

Tenho algum conhecimento em funções mais simples como for, if, while

 

for, if e while são comandos e não funções.

 

Seu curso tem um livro-texto? Qual é? Tem alguma apostila? Você tem algum livro?

Já fez programas desse tipo? Conhece algo de estatística?

 

O tal PDF tem 3 páginas apenas. Você poderia ter postado aqui não é?

 

 

Link para o comentário
Compartilhar em outros sites

10 horas atrás, arfneto disse:

 

for, if e while são comandos e não funções.

 

Seu curso tem um livro-texto? Qual é? Tem alguma apostila? Você tem algum livro?

Já fez programas desse tipo? Conhece algo de estatística?

 

O tal PDF tem 3 páginas apenas. Você poderia ter postado aqui não é?

 

 

@arfneto Meu curso não tem um livro-texto. Não tem apostila. Tenho um pdf de um livro chamado C Completo e Total, que eu venho estudando conforme a disciplina avança. Nunca fiz programas desse tipo, nem de longe. Conheço o básico de estatística. 
Tentei ser o mais sucinta possível no anúncio do post. Obrigada. 

Link para o comentário
Compartilhar em outros sites

Você leu o trecho do livro que fala sobre funções? fez sentido pra você ou ficou com dúvidas?

 

Esse é o resultado do programa que vem depois

em main() vai chamar funcao a
na funcao a
em main() funcao_a() retornou 2
em main, vai chamar funcao b
na funcao b
parametros foram '128' e 'c'
em main() funcao_b() retornou

Eis o programa

#include "stdio.h"

int funcao_a()
{
	printf("na funcao a\n");
	return 2;
};	// funcao_a()

void funcao_b(int numero, char letra)
{
	printf("na funcao b\n");
	printf("parametros foram '%d' e '%c'\n",
		numero, letra);
	return;
};	// funcao_a()

int main(int argc, char** argv)
{
	printf("em main() vai chamar funcao a\n");
	int n = funcao_a();
	printf("em main() funcao_a() retornou %d\n", n);

	printf("em main, vai chamar funcao b\n");
	funcao_b(128,'c');
	printf("em main() funcao_b() retornou\n");

	return 0;
}

Ele cria e chama duas funções. Diga se isso é já natural pra você ou se tem alguma dúvida

 

Link para o comentário
Compartilhar em outros sites

@arfneto Não é natural pra mim, mas com um certo esforço eu consigo entender o que o código está fazendo. A main() começa com n recebendo o que está na função_a() e assim no printf retorna o valor que n recebeu, que é o numero 2 - retornado por função_a(). Em seguida, chama a função b, mas inserindo  os parâmetros (128 e c) e imprimindo na tela o que está dentro da função_b(). Em seguida o printf retorna apenas o texto, pois não há valor a retornar (como return 2 da função_a()) pois a função_b é declarada como void, que não retorna nada. É isso @arfneto? Obrigada!!!    

Link para o comentário
Compartilhar em outros sites

acho que entendeu perfeitamente. 
 

atente para as diferenças nas declarações da função e os comandos return correspondentes.

e comece a escrever alguma das funções de seu programa usando esse esqueleto de programa aí...

E poste de volta usando o botão <> para abrir uma janela onde você insere o programa ...

Link para o comentário
Compartilhar em outros sites

Olá @arfneto! Bem, eu pensei bastante aqui sobre o programa, e estou bastante empacada com a função que eu acredito que deveria ser a primeira a ser feita, que é sorteia_voto_com_falha. No pouco que consegui entender, acredito que devo iniciar f com 0,05 (5%) que no início do enunciado diz ser a porcentagem de falha (valor fixo) que ocorre nas urnas na computação de cada voto. Porém, devolver um inteiro f positivo com probabilidade f e devolver 0 (zero) com probabilidade 1-f (0 ≤ f ≤1) me deu um nó na cabeça. Acredito que nesse caso não deva usar nada de estatística, não? Pois a probabilidade já foi dada. Mas não entendo como " devolver zero com probabilidade 1-f" sendo que ao meu entender, a probabilidade é fixa, e também não entendo como utilizar essa informação, ou repassar essa informação na main(). Desculpe a amolação, mas você foi a única pessoa que me ajudou até aqui e não tenho pra quem perguntar. Vou deixar o código aqui a partir do que deve ser feito,  como me orientaste para que eu possa ir mexendo e assim você ver as alterações que fiz. Muito obrigada!

 

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Yasmin Martins disse:

Mas não entendo como " devolver zero com probabilidade 1-f" sendo que ao meu entender, a probabilidade é fixa, e também não entendo como utilizar essa informação, ou repassar essa informação na main(). Desculpe a amolação, mas você foi a única pessoa que me ajudou até aqui e não tenho pra quem perguntar

 

Bem, você tem e não tem razão.

 

Esse lance de sorteio é feito com a geração de números aleatórios. Na biblioteca padrão stdlib do C você tem uma função rand() e uma associada srand() que podem resolver isso. Veja em https://www.tutorialspoint.com/c_standard_library/c_function_rand.htm

 

rand() retorna um valor inteiro entre 0 e um limite RAND_MAX. O que importa é que se você quer retornar um valor com 75% de probabilidade usa por exemplo

        (rand() %100) > 75

Porque? Se o número que veio é aleatório e inteiro e você pegar o resto da divisão dele por 100 vai dar quanto? Um número entre 0 e 99. Então em 75% das vezes ele será menor que 75, entre 0 e 74 e está feito o sorteio com probabilidade.

 

srand(int) inicia uma nova sequência desses números, então pode usar algo como srand(20200504) e toda vez que iniciar seus testes vai reproduzir a mesma sequência...

 

 

Link para o comentário
Compartilhar em outros sites

@arfneto Então, a única coisa que eu tenho que fazer com a função sorteia_voto_com_falha(double f) é retornar rand()?Eu atualizei o código com alguns itens que foram dados que devem obrigatoriamente estar no inicio, e que estão no pdf, e acho que se referem exatamente ao que você está falando. 

Link para o comentário
Compartilhar em outros sites

3 minutos atrás, Yasmin Martins disse:

Então, a única coisa que eu tenho que fazer com a função sorteia_voto_com_falha(double f) é retornar rand()?Eu atualizei o código com alguns itens que foram dados que devem obrigatoriamente estar no inicio, e que estão no pdf, e acho que se referem exatamente ao que você está falando


Não exatamente. Faça um programa pequeno e experimente com rand(). Você entendeu como manipular rand()? Leu no livro ou no site?

 

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Yasmin Martins disse:

Ele gerou números aleatórios de 0 a 50 utilizando rand(). Mas não consigo visualizar como usar na função que preciso. O enunciado do meu trabalho é literalmente algo de outro mundo

 

Nào é. Você entendeu o que eu expliquei sobre os 75% de probabilidade? Acho que não. Esse é o conceito que você deve usar no seu problema.

Link para o comentário
Compartilhar em outros sites

@arfneto Boa tarde! Ao analisar as funções que me enviaste (rand() e srand()), sinto que estou quase entendendo como usa-las no meu problema. Porém, na descrição do que devo fazer:

 

int sorteia_voto_com_falha (double f): devolve um inteiro não nulo com probabilidade f, e devolve 0 com probabilidade 1 − f, onde 0 ≤ f ≤ 1.

 

"Devolver um inteiro não nulo com probabilidade f" é um evento separado de "devolve 0 com probabilidade 1-f"? Assim, eu deveria utilizar dois returns, um para cada evento? Isso é possível, uma função retornar duas coisas ao mesmo tempo?

 

Link para o comentário
Compartilhar em outros sites

41 minutos atrás, Yasmin Martins disse:

@arfneto Boa tarde! Ao analisar as funções que me enviaste (rand() e srand()), sinto que estou quase entendendo como usa-las no meu problema. Porém, na descrição do que devo fazer:

 

int sorteia_voto_com_falha (double f): devolve um inteiro não nulo com probabilidade f, e devolve 0 com probabilidade 1 − f, onde 0 ≤ f ≤ 1.

 

"Devolver um inteiro não nulo com probabilidade f" é um evento separado de "devolve 0 com probabilidade 1-f"? Assim, eu deveria utilizar dois returns, um para cada evento? Isso é possível, uma função retornar duas coisas ao mesmo tempo?

 

 

Não, não é possível retornar duas coisas ao mesmo tempo. Quando precisa retorna uma coisa que inclua as duas ou tantas quantas precisar, uma estrutura. Você n~~ao leu direito o que enunciado. .. Some f + (1-f) e vai ver que dá 1...

Com probabilidade F retorna o inteiro.... É basicamente o exemplo que te mostrei ontem

Link para o comentário
Compartilhar em outros sites

Você leu sobre rand() e srand()?

 

Você não os usa juntos.

 

int sorteia_voto_com_falha (double f);
	int i, N;
	
	srand(RAND_MAX);
	for(i = 1; i < n; i++)
		return(rand() % 1-f);

Está certa sobre a precedência de '%' e '-'? Testou? Se não testou não acha que devia usar parenteses  como 

    rand() % (1-f)

f é uma porcentagem? porque já não imprime os valores para se sentir mais segura? 

 

Usou um for com um return? isso quer dizer que vai rodar só uma vez, certo? já que vai retornar...

 

E declarou int i e int N. Mas não tem nenhum valor. Como vai alimentar o for? declarou N mas não colocou nenhum valor. Seu for terminaria emi=n minúsculo que sequer está declarado....

 

 

 

Link para o comentário
Compartilhar em outros sites

Olá!

Progressos?

 

Com o que está no enunciado como obrigatório você pode usar a função de está lá 

double sorteia_real()
{
	return (double)rand() / RAND_MAX;
};

Para calcular o tal sorteio com falha

int sorteia_voto_com_falha(double f)
{
	return (sorteia_real() < f);
};

Entenda que em C ZERO é falso. Qualquer outro valor é verdadeiro. Em condições verdadeiro/falso você pode usar então expressões e é bem prático depois que se acostumar

    if(r == 0) 

// e a mesma coisa que

    if( !r )

// e 

    if ( r != 0 )

// e a mesma coisa que

    if( r )

'!' é o operador NOT. "!=" significa diferente. Então a versão acima é o mesmo que essa abaixo

int sorteia_voto_com_falha(double f)
{
    if( sorteia_real() < f )
        return 1;
    else
        return 0;
};

 

Link para o comentário
Compartilhar em outros sites

@arfneto Boa tarde! Eu já havia jogado a toalha, mas após pensar muito de madrugada, cheguei a algumas conclusões. Comecei a pensar de maneira separada, quebrando o problema em várias partes. Porém, as funções se relacionam, e eu compreendi que:

 

A ideia é começar meio que de baixo pra cima, fazendo a função bissecta() primeiro, utilizando o modo da bissecção que é explicado. Pois bem, eu rabisquei no papel e fiz o modo da bissecção, onde inicialmente fa = 0 e fb = 1. É calculado a média entre esses dois valores, até que a diferença entre fa e fb seja menor que 10ˆ6(BISSEC_TOL), pra esse loop usei um for. 

Após esse bloco, essa diferença gerada alimenta a função prob_erro(), e após é feita uma comparação: se o erro q sai de prob_erro() for menor que tol, atualiza fa, caso contrário atualiza fb. 

 

Mas agora eu não sei como fazer essa ponte entre os parâmetros das funções para jogar os dados lá e cá. Você poderia me ajudar?

 

 

 

Link para o comentário
Compartilhar em outros sites

Você entendeu o que eu expliquei? dessa vez e da anterior?

 

Do modo que você imaginou não vai funcionar/ BISSECTA simplesmente manipula valores para as chamadas às rotinas anteriores para manter o  erro dentro da tolerância. 

 

Você muda os parâmetros e vai simulando eleições até chegar ao valor certo via BISSECTA()

Link para o comentário
Compartilhar em outros sites

@arfneto Eu entendi o que você fez na vez anterior, sobre a função sorteia voto com falha. Mas agora que você disse que o modo que pensei nao vai funcionar, eu não consigo pensar numa saída. Nao consigo ainda relacionar as coisas. Você poderia pontuar o que está de errado no código pra que eu possa entender o caminho? 

Link para o comentário
Compartilhar em outros sites

16 minutos atrás, Yasmin Martins disse:

@arfneto Eu entendi o que você fez na vez anterior, sobre a função sorteia voto com falha. Mas agora que você disse que o modo que pensei nao vai funcionar, eu não consigo pensar numa saída. Nao consigo ainda relacionar as coisas. Você poderia pontuar o que está de errado no código pra que eu possa entender o caminho? 

 

Nem sei se está errado. E você pode escrever assim digamos de fora pra dentro. No entanto acho que é melhor o contrário e se preocupar em simular as eleições primeiro, depois de entender bem como simular cada voto.

 

E aí sim tentar usar bissecta() para identificar a margem ideal

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@arfneto Obrigada pelo seu tempo, por todas as dicas. Mas meu prazo está se encerrando e por mais que eu tente eu n consigo encontrar uma saída para o problema. Estou exausta. Espero que não pense que tomei seu tempo por nada. Aprendi bastante com todas as suas dicas. Sucesso pra ti por ajudar desconhecidos com tamanha boa vontade! Obrigada!

Link para o comentário
Compartilhar em outros sites

1 hora atrás, Yasmin Martins disse:

@arfneto Obrigada pelo seu tempo, por todas as dicas. Mas meu prazo está se encerrando e por mais que eu tente eu n consigo encontrar uma saída para o problema. Estou exausta. Espero que não pense que tomei seu tempo por nada. Aprendi bastante com todas as suas dicas. Sucesso pra ti por ajudar desconhecidos com tamanha boa vontade! Obrigada!

 

Sinto muito. É um problema chato mesmo. Mas talvez não tenha ainda familiaridade com a linguagem C para resolver isso. Já escreveu muitos programas?

 

Conseguiu simular uma eleição? Rodou em sua máquina o programa que escrevi pra você?

Link para o comentário
Compartilhar em outros sites

@arfneto Não tenho muita familiaridade não. Comecei a estudar no início desse semestre. Mas aí teve a paralisação, em seguida precisei me ausentar de casa por problemas familiares e não pude acompanhar as atividades online. A matéria andou e como existe um coeficiente alfa de honestidade que pode levar a nota do aluno à zero, os colegas de curso não conversam entre si sobre os trabalhos que devem ser entregues. Aí fiquei um tanto perdida sem ter com quem falar sobre. Na verdade só falei com você mesmo, rs.

 

Eu entendi que você me deu a função pronta, sorteia_voto_com_falha() e assim, como você disse, eu devo fazer a que simula a probabilidade de erro na eleição, que é a prob_erro(int N, double a, double f, int T). Inclusive sem essa, prob_erro(), a função bissecta() nao funciona, pois precisa dela pra comparar com o erro f. 

Eu devo criar a prob_erro() c os parâmetros dados, mas nao descobri uma forma de fazer isso, sei que devo usar um for pra rodar T vezes, com N votantes e porcentagem a, e que ela vai utilizar o parâmetro f da sorteia voto com falha pra calcular esse erro. Mas não consigo montar isso no código. 

Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...