Ir ao conteúdo
  • Cadastre-se

Dúvida na resolução de um exercício com função


Ronimar

Posts recomendados

Pessoal boa noite .Estou a resolver um exercício em C .segue ele em anexo ,
pensei em ordenar os valores atraves de função , mais não to conseguindo e para min calcular a moda de acordo com minha lógica preciso desses valores ordenados .Alguem me ajuda? Segue o Codigo o exercicio ta em anexo

#include <stdio.h>#include <stdlib.h> #include <conio.h> float ordenar (float *v[] ,float num_componentes ){	int i, j, temp;                                for(j = 0; j < num_componentes - 1; j++){             if(v[j] > v[j + 1]){                 temp = v[j];                 v[j] = v[j + 1];                 v[j + 1] = temp;             }         }     for(i = 0; i < num_componentes; i++)        printf("%f ", v[i]);} main(){    float *v,moda; //definindo o ponteiro v    int i, num_componentes;             printf("Informe o numero de componentes do vetor\n");    scanf("%d", &num_componentes);      v =  malloc(num_componentes * sizeof(float));          for (i = 0; i < num_componentes; i++)    {      printf("\nDigite o valor para a posicao %d do vetor: ", i+1);      scanf("%f",&v[i]);    }           ordenar(&v,num_componentes);   //getch();   return 0;}    

post-729888-0-14879400-1418519562_thumb.

Link para o comentário
Compartilhar em outros sites

Sua lógica tá correta, mas na sua função de ordenar você tá passando os argumentos errados.

Deveria ser:

float ordenar (float *v, int num_componentes ) { ... }
Além disso, sua função de ordenar parece ser uma versão simplificada do insertion sort. Mas pra fazer ela funcionar você precisa passar o algoritmo várias vezes.

Ex:

[4], 6, 1, 2, 7, 3, 5

4 é menor que 6? Sim.

4, [6], 1, 2, 7, 3, 5

6 é menor que 1? Não. Troca 6 com 1

4, 1, [6], 2, 7, 3, 5

...

A essa altura o algoritmo testa se 6 é menor que 2, depois passa pro próximo elemento e vai repetindo até o último elemento.

Mas note que o 4 tá como primeiro elemento ainda, mesmo sendo maior que 1.

Ou seja, pra deixar o vetor ordenado você precisa passar ele várias vezes. Você pode colocar teu FOR dentro de outro FOR, pra repetir tudo.

Ou então você usa uma versão melhorada, onde o algoritmo retrocede uma posição do vetor sempre que houver uma troca:

[4], 6, 1, 2, 7, 3, 5

4 menor que 6? Sim.

4, [6], 1, 2, 7, 3, 5

6 menor que 1? Não. Troca 6 por 1 e volta uma posição.

[4], 1, 6, 2, 7, 3, 5

4 menor que 1? não. Troca 4 por 1 e volta uma posição.

[1], 4, 6, 2, 7, 3, 5

1 menor que 4? sim

1, [4], 6, 2, 7, 3, 5

4 menor que 6? sim

1, 4, [6], 2, 7, 3, 5

6 menor que 2? não. troca 6 por 2 e volta uma casa.

...

Link para o comentário
Compartilhar em outros sites

Fiz as modificações mais ainda contem um bag na ordenação que é o seguinte se eu entrar com o seguintes numeros 

0

5

1

3

2

 

Ele coloca a seguinte ordem 

 

0

1

3

2

5

 

Segue o codigo 

#include <stdio.h>#include <stdlib.h> //necessário para usar as funções malloc() e free()#include <conio.h> void ordenar (float *v ,int num_componentes ){	int i, j, aux;            for (i = 0; i < num_componentes; i++)    {      printf("\nDigite o valor para a posicao %d do vetor: ", i+1);      scanf("%f",&v[i]);    }                    for (i=0;i<num_componentes; i++)	{			for(i=0; i<num_componentes-1; i++)		{					if(v[i]>v[i+1]){				aux=v[i];				v[i]=v[i+1];				v[i+1]=aux;			}     	}	}     for(i = 0; i < num_componentes; i++)       	   {	   	    printf("%f ",v[i]);	}} main(){    float *v,moda; //definindo o ponteiro v    int i, num_componentes;             printf("Informe o numero de componentes do vetor\n");    scanf("%d", &num_componentes);      v =  malloc(num_componentes * sizeof(float));      ordenar(&v,num_componentes);              //getch();   return 0;}    
Link para o comentário
Compartilhar em outros sites

for (i=0;i<num_componentes; i++) {    for(i=0; i<num_componentes-1; i++) {        if(v[i]>v[i+1]) {	    aux=v[i];	    v[i]=v[i+1];	    v[i+1]=aux;        }    }}

Você tá fazendo basicamente a mesma coisa de antes.

No segundo FOR, o i vai de 0 até 5, certo? (considerando que você digitou 5 pro tamanho do vetor)

Daí quando o segundo FOR terminar, i vai ser igual a 5.

O programa então volta pro começo do primeiro FOR e vai testar o valor de i "i < num_componentes", e vai dar falso, pois "5 < 5 == false".

Ou seja, você só tá executando o primeiro FOR uma única vez, independente do numero de componentes.

Pra corrigir isso, basta usar uma variável diferente pro primeiro FOR.

 

for (j=0;j < num_componentes; j++) {    for(i=0; i<num_componentes-1; i++) {        if(v[i]>v[i+1]) {	    aux=v[i];	    v[i]=v[i+1];	    v[i+1]=aux;        }    }}

Ou se quiser usar o insertion sort, é mais ou menos isso:

 

for(i=0; i<num_componentes-1; i++) {    if (v[i] > v[i+1]) {        aux = v[i];	v[i] = v[i+1];	v[i+1] = aux;	if (i > 0) i -= 2;    }}
Link para o comentário
Compartilhar em outros sites

Certo corrigi .agora minha próxima etapa é fazer na função a logica para calcular a moda .como poderia fazer?

#include <stdio.h>#include <stdlib.h> //necessário para usar as funções malloc() e free()#include <conio.h> void ordenar (float *v ,int num_componentes ){	int i, j, aux;            for (i = 0; i < num_componentes; i++)    {      printf("\nDigite o valor para a posicao %d do vetor: ", i+1);      scanf("%f",&v[i]);    }                   for (j=0;j < num_componentes; j++) {    for(i=0; i<num_componentes-1; i++) {        if(v[i]>v[i+1]) {	    aux=v[i];	    v[i]=v[i+1];	    v[i+1]=aux;        }    }} }int main(){    float *v,moda; //definindo o ponteiro v    int i, num_componentes;             printf("Informe o numero de componentes do vetor\n");    scanf("%d", &num_componentes);      v =  malloc(num_componentes * sizeof(float));      ordenar(&v,num_componentes);              system("PAUSE");}    
Link para o comentário
Compartilhar em outros sites

Eu não lembro de moda é aquele elemento que fica no meio do array, ou se é o que tem maior frequencia.

 

Se for aquele que fica no meio do array, então é fácil hein... depois de ordenar o vetor é só acessar a posição "vetor[tamanhoDoVetor / 2]".

 

Se for o elemento de maior frequencia, então você pode criar uma função simples que retorna a frequencia de um dado elemento no teu vetor, depois usar essa função pra percorrer o vetor e testar a frequencia de todos os elementos.

int frequencia(float* v, int size, float num) {    int freq = 0;     while (size--)        if (v[size] == num) freq++;     return freq;}

Agora é só fazer um FOR percorrendo os elementos, e testar a frequencia deles.

Começa assumindo que v[0] tem a maior frequencia.

 

maior_freq = 0;

 

Se frequencia(v, num_componentes, v[x]) for maior que frequencia(v, num_componentes, v[maior_freq]), então maior_freq = x;

 

No final "maior_freq" vai  guardar a posição no vetor do elemento com maior frequencia.

Link para o comentário
Compartilhar em outros sites

// v --> ponteiro pro vetor// size --> tamanho do vetor// num --> número que você quer calcular a frequencia int frequencia(float* v, int size, float num) {    int freq = 0;    while (size--)        if (v[size] == num) freq++;    return freq;} // freq --> frequencia de 'num'

 

Se v = { 1, 2, 2, 2, 3, 3, 4 }

 

frequencia(v, 7, v[0]) ---> frequencia de 1 ---> 1

frequencia(v, 7, v[1]) ---> frequencia de 2 ---> 3

frequencia(v, 7, v[2]) ---> frequencia de 2 ---> 3

frequencia(v, 7, v[3]) ---> frequencia de 2 ---> 3

frequencia(v, 7, v[4]) ---> frequencia de 3 ---> 2

frequencia(v, 7, v[5]) ---> frequencia de 3 ---> 2

frequencia(v, 7, v[6]) ---> frequencia de 4 ---> 1

Link para o comentário
Compartilhar em outros sites

é porque a minha seguinte situação é o seguinte calcular a moda e retornar na função o numero que mais aparece que é a moda , não precisa de passar numero que desejo calcular a frequência

 

Tipo o usuário digita  

 

5

4

3

3

1

0

 preciso retornar a moda que é 3 e a media tambéme

 o exercicio me exige que eu retorne atraves de ponteiro isso numa unica função 

 

post-729888-0-41371100-1418574730_thumb.

Link para o comentário
Compartilhar em outros sites

Como eu disse antes, aquela função da frequencia é apenas pra ajudar você a achar a moda.

Pra achar a moda você precisa calcular a frequencia dos números de algum modo.

 

O usuário digita que quer um vetor com 5 componentes, daí ele digita:

5, 4, 3, 3, 1, 0.

 

Seu vetor vai ser:

v = { 5, 4, 3, 3, 1, 0 }

 

Quantas vezes o [5] aparece no vetor, ou seja, qual a frequencia de 5?

O número [5] aparece apenas UMA vez... a frequencia dele é 1.

 

frequencia(v, 6, v[0]) vai retortar 1.

 

Quantas vezes o [4] aparece no vetor, ou seja, qual a frequencia de 4?

O número [4] aparece apenas UMA vez... a frequencia dele é 1.

 

frequencia(v, 6, v[1]) vai retortar 1.

 

Quantas vezes o [3] aparece no vetor, ou seja, qual a frequencia de 3?

O número [3] aparece DUAS vezes... a frequencia dele é 2.

 

frequencia(v, 6, v[2]) vai retortar 2.

 

No final, depois de percorrer o vetor inteiro, o programa vai saber que [3] tem a frequencia maior que os outros números.

Então a moda do vetor é 3.

 

Existem outros modos de resolver esse exercício... eu só tinha mesmo dado essa função de frequencia pra dar uma ideia de como resolver. Mas você pode criar uma função diferente.

Link para o comentário
Compartilhar em outros sites

ta dando erro quando eu executo o size segue o codigo que consegui fazer até o momento 

#include <stdio.h>#include <stdlib.h> //necessário para usar as funções malloc() e free()#include <conio.h> char ordenar (float *v ,int num_componentes ){	int i, j, aux,cont=0,moda;            for (i = 0; i < num_componentes; i++)    {      printf("\nDigite o valor para a posicao %d do vetor: ", i+1);      scanf("%f",&v[i]);    }       for (j=0;j < num_componentes; j++) {    for(i=0; i<num_componentes-1; i++) {        if(v[i]>v[i+1]) {	    aux=v[i];	    v[i]=v[i+1];	    v[i+1]=aux;		}    }          }}int frequencia(float* v, float size, float num) {    int freq = 0;     while (size--)        if (v[size] == num) freq++;     return freq;}int main(){    float *v,moda; //definindo o ponteiro v    int i, num_componentes;             printf("Informe o numero de componentes do vetor\n");    scanf("%d", &num_componentes);      v =  malloc(num_componentes * sizeof(float));      ordenar(&v,num_componentes);        printf("A frequencia será %d ",frequencia(&v,num_componentes,&v)              system("PAUSE");}    
Link para o comentário
Compartilhar em outros sites

Cara, você ainda não entendeu... a função "frequencia" NÃO dá a moda do vetor... ela apenas dá a frequencia de UM ÚNICO elemento do vetor.

Pra pegar a moda, você precisa testar a frequencia de todos os elementos do vetor, um por um, depois ver qual deles tem a frequencia maior.

 

Eu até dei um exemplo lá em cima:

 

Digamos que o usuário digitou esses números aqui pro vetor:

 

Se v = { 1, 2, 2, 2, 3, 3, 4 }

 

frequencia (v, num_componentes, v[0]) ---> frequencia do elemento v[0] de v ---> frequencia do elemento [1], que vai ser igual a 1

frequencia (v, num_componentes, v[1]) ---> frequencia do elemento v[1] de v ---> frequencia do elemento [2], que vai ser igual a 3

...

 

Pra pegar a moda, você precisa percorrer o teu vetor v inteiro e testar as frequencias, até achar a maior frequencia, que será a moda.

 

Seria algo assim:

 

moda = 0; for (i=0; i < num_componentes; i++) {    if (frequencia(v, num_componentes, v[i]) > frequencia(v, num_componentes, moda))        moda = v[i];}
Link para o comentário
Compartilhar em outros sites

printf("A frequencia será %d ",frequencia(&v,num_componentes,&v));
 

O primeiro argumento da função frequencia é o vetor onde você vai percorrer os números.

Como você vai apenas ler os números do vetor, e não alterar o endereço do vetor em si, então não precisa passar o endereço dele, pode passar apenas "v".

 

O segundo argumento da função é o tamanho.

É  "num_componentes" mesmo.

 

O terceiro argumento é o valor que você quer procurar a frequencia.

frequencia(v, num_componentes, v[0]) pega o valor da frequencia do número v[0].

Então alí em  vez de passar o endereço de v, você deveria estar passando um elemento de v.

 

E como eu disse antes, a função frequencia testa a frequencia de UM ÚNICO número.

Você precisa usar ela dentro de um FOR ou algo assim pra testar a frequencia de todos os números de "v" e ver qual tem a maior frequencia.

Link para o comentário
Compartilhar em outros sites

Posta o codigo da função com o for completa da frequencia 


Segue o que fiz até o momento não estou conseguindo executar esta dando erro .Corrigem para min o código completo 

#include <stdio.h>#include <stdlib.h> //necessário para usar as funções malloc() e free()#include <conio.h> int ordenar (float *v ,int num_componentes ){	int i, j, aux,cont=0,moda;            for (i = 0; i < num_componentes; i++)    {      printf("\nDigite o valor para a posicao %d do vetor: ", i+1);      scanf("%f",&v[i]);    }       for (j=0;j < num_componentes; j++) {    for(i=0; i<num_componentes-1; i++) {        if(v[i]>v[i+1]) {	    aux=v[i];	    v[i]=v[i+1];	    v[i+1]=aux;		}    } }	moda = 0; for (i=0; i < num_componentes; i++) {    if (frequencia(v, num_componentes, v[i]) > frequencia(v, num_componentes, moda))        moda = v[i];}}int frequencia(float* v, float size, float num) {    int freq = 0;      while (size--)        if (v[size] == num) freq++;     return freq;}int main(){    float *v,moda; //definindo o ponteiro v    int i, num_componentes;             printf("Informe o numero de componentes do vetor\n");    scanf("%d", &num_componentes);      v =  malloc(num_componentes * sizeof(float));          frequencia(v,num_componentes,v);    ordenar(&v,num_componentes);  //printf("A frequencia será %d ",frequencia(v,num_componentes,v));           system("PAUSE");}    

tem como você fazer o gabarito desta questão para min . já não consigo mais desenvolver 

 

segue a questão 

post-729888-0-41371100-1418574730_thumb.
Link para o comentário
Compartilhar em outros sites

@Ronimar

Ué, mas eu já resolvi a questão inteira pra você.

O problema é que você quer fazer um programa em C sem saber a sintaxe do C. Então qualquer coisa que eu diga não vai adiantar nada pois você não vai entender. Mesmo com a questão inteira pronta na frente dos seus olhos você ainda não conseguiu entender as coisas que eu disse.

Se você for no google e perder algumas horas estudando a sintaxe do C, o que é uma função, como chamar uma função e tal, vai conseguir entender o que eu disse.

Se quiser que eu entregue o exercício pronto mesmo sem você entender nada dele, daí isso eu não posso fazer pois minha religião não permite. E toda vez que eu faço isso um moderador me dá bronca por mensagem privada e xinga minha mãe.

Link para o comentário
Compartilhar em outros sites

Ok 

dontpanic Vou tentar resolver 

E agora como ficou 

#include <stdio.h>#include <stdlib.h> //necessário para usar as funções malloc() e free()#include <conio.h> void ordenar (float *v ,int num_componentes ){	int i, j, aux,cont=0,moda;            for (i = 0; i < num_componentes; i++)    {      printf("\nDigite o valor para a posicao %d do vetor: ", i+1);      scanf("%f",&v[i]);    }       for (j=0;j < num_componentes; j++) {    for(i=0; i<num_componentes-1; i++) {        if(v[i]>v[i+1]) {	    aux=v[i];	    v[i]=v[i+1];	    v[i+1]=aux;		}    } }}int frequencia(float* v, int size, float num) {    int freq = 0;    while (size--)        if (v[size] == num)		{				 freq++; 		}    return freq;}float media (float *v, int num_componentes){	float soma;	int i;	    for (i = 0; i < num_componentes; i++)    {      soma = soma + v[i];    }		return soma /num_componentes;}int moda (int num_componentes){	int	moda = 0,i; for (i=0; i < num_componentes; i++) {    if (frequencia(v, num_componentes, v[i]) > frequencia(v, num_componentes, moda))        moda = v[i];        return moda;}	}void main(){    float *v,moda; //definindo o ponteiro v    int i,num_componentes;             printf("Informe o numero de componentes do vetor\n");    scanf("%d", &num_componentes);      v =  malloc(num_componentes * sizeof(float));      ordenar(&v,num_componentes);    frequencia(v,num_componentes,v);	printf("A média será %f",media(&v,num_componentes));	moda(num_componentes);      //printf("A frequencia será %d ",frequencia(v,num_componentes,v));          system("PAUSE");}

Ta dando erro ao executar a linha 58

Link para o comentário
Compartilhar em outros sites

"OLÁ MUNDO!"  }

parece que você ainda está atolado com a programação desse moda;

 

Dica:

Você precisa, juntar na seu algoritmo atual (moda) a essas variáveis, você vai descobrir sozinho

como, mas acredito que com estas variáveis auxiliadoras sua  moda vai sair;

int max_ocorrencia   =  1;// maior valor retornado pela função frequenciaint atual_ocorrencia =  0;// valor atual retornado pela função frequenciaint i_max_ocorrencia = -1;// dentro da estrutura if, essa salva índice do retorno de maior valor

Só mais um coisa, você tem que testar as funções individualmente, eu acho que escrever todo código por menor que seja e depurar, copilar em fim tudo fica mais difícil na hora de encontrar os erros.]

Procure testar individualmente.

E minha opinião, e segue exemplos para ilustrar:

programa_c_mauro_britivaldo_index.png

 

programa_c_mauro_britivaldo_x_Ocorrencia

Link para o comentário
Compartilhar em outros sites

Meu erro agora está na chamada da função 

#include <stdio.h>#include <stdlib.h> //necessário para usar as funções malloc() e free()#include <conio.h> int ordenar (float *v ,int num_componentes ){	int i, j, aux,cont=0,moda;            for (i = 0; i < num_componentes; i++)    {      printf("\nDigite o valor para a posicao %d do vetor: ", i+1);      scanf("%f",&v[i]);    }       for (j=0;j < num_componentes; j++) {    for(i=0; i<num_componentes-1; i++) {        if(v[i]>v[i+1]) {	    aux=v[i];	    v[i]=v[i+1];	    v[i+1]=aux;		}    } }return 0;}float media (float *v, int num_componentes){	float soma;	int i;	    for (i = 0; i < num_componentes; i++)    {      soma = soma + v[i];    }		return soma /num_componentes;}int fn_x_Ocorrencia(float *v, int num_componentes, float x){	int	xcont = 0,i; for (i=0; i < num_componentes; i++) {    if(v[i] ==x)    xcont++;    else    	{    		if(v[i] > x )    		return xcont;    		    	}        }return xcont;	}int main(){    float *v,moda; //definindo o ponteiro v    int i,num_componentes;             printf("Informe o numero de componentes do vetor\n");    scanf("%d", &num_componentes);      v =  malloc(num_componentes * sizeof(float));      ordenar(&v,num_componentes);    printf("A moda será %d ",fn_x_Ocorrencia(v,num_componentes,v));   getch();   return 0;}
Link para o comentário
Compartilhar em outros sites

Como nos diria Chico Picadinho

"Vamos por partes";

int ordenar (float *v ,int num_componentes ){	int i, j, aux,cont=0,moda;            for (i = 0; i < num_componentes; i++)    {      printf("\nDigite o valor para a posicao %d do vetor: ", i+1);      scanf("%f",&v[i]);    }       for (j=0;j < num_componentes; j++) {    for(i=0; i<num_componentes-1; i++) {        if(v[i]>v[i+1]) {	    aux=v[i];	    v[i]=v[i+1];	    v[i+1]=aux;		}    } }return 0;}

Vamos trabalhar só essa função, por enquanto;

Quem é ? float *v?

RE: é o ponteiro que aponta para o endereço de V

Cara isso é ruim, você sabe quem é v, por que o código é seu, você tem que dar nomes

compreensíveis a todos nós. O mais curioso é que representou um variável com uma letra

e logo depois fez isso: num_componentes kkkkk, sem explicação para isso né, ou será que

economizou para usar tudo na ultima.

Por curiosidade vou refazer do meu jeito essa função:

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

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