Ir para conteúdo
Fórum Script Brasil
  • 0

Segundo e quarto maior valor - linguagem C


Bruno Pacheco

Pergunta

Eu compilei o meu código, porém o meu compilador mostra uns erros. Eu queria saber como resolver esses erros para que o meu programa rode normal?

/* 4)  Construa  uma  função  que  receba  cinco  valores  e  determine 
(retorne  por  passagem  por referência) o 2º e o 4º maior valores dentre eles.
Construa  também um módulo principal para  ler tais valores,e imprimir o 
resultado obtido com a chamada da função. */

#include<stdio.h>

int seg_maior(int n,int vet[]);
int quart_maior(int n,int vet[]);
void ordem(int n,int vet[] ,int *segundo_maior, int *quarto_maior);

int main(){
  int vet[5],i=0,j=0,seg_maior,quart_maior,aux;

   //Recebendo 5 numeros 
    while(i<5){
         printf("Numero[%d]",i+1);
         scanf("%d",vet[i]);
         i++;
    }

    // Colocando em ordem crescente os numeros(do menor para o maior)
    for(i=0;i<5;i++){
        for(j=i+1;j<5;j++)
            if (vet[i]>vet[j]){
                                    aux=vet[i];
               vet[j]=vet[i];
               vet[j]=aux;
            }

i=5;    
//retornando o segundo maior valor e o quarto maior valor
ordem(n,vet, &seg_maior, &quart_maior);

printf("O segundo maior valor:%d ",seg_maior);
printf("O quarto maior valor:%d ",quart_maior);


}




int seg_maior(int n,int vet[]){
    
    //Descobrindo o segundo maior valor
    if (n)
        seg_maior(n-1,vet);
    else
        if (n=4){
            return vet[3];
        }

      
}        



int quart_maior(int n,int vet[]){
    // Descobrindo o quarto maior valor
    if (n)
        quart_maior(n-1,vet);
    else
        if (n=5){
            return vet[4];
        }

      
}

//Retornar por passagem por referêcnia
void ordem(int n,int vet[] ,int *segundo_maior, int *quarto_maior) {

 (*segundo_maior) = seg_maior(n,vet);
 (*quarto_maior) = quart_maior(n,vet);

}

Link para o comentário
Compartilhar em outros sites

13 respostass a esta questão

Posts Recomendados

  • 0

Boa tarde!

- Se eu fosse você eu criaria somente uma função que já me retorna-se os valores pedidos!

- Se eu fosse você eu usaria chaves mesmo em blocos que tem somente 1 instrução (fica mais claro)

Seu código não está compilando por causa disso:

//AQUI A MAIN TÁ ABERTA
    // Colocando em ordem crescente os numeros(do menor para o maior)
    for(i=0;i<5;i++){//você abriu a chave mais não fechou!
        for(j=i+1;j<5;j++)
            if (vet[i]>vet[j]){
                aux=vet[i];
                vet[j]=vet[i];
                vet[j]=aux;
            }
    }//FALTA FECHAR O FOR
    i=5;//Infelizmente não sei aonde você queria colocar isso (dentro ou fora do primeiro for)
    //retornando o segundo maior valor e o quarto maior valor
    ordem(n,vet, &seg_maior, &quart_maior);//a variavel n NÃO existe!
    //retornando o segundo maior valor e o quarto maior valor
    ordem(n,vet, &seg_maior, &quart_maior);

    printf("O segundo maior valor:%d ",seg_maior);
    printf("O quarto maior valor:%d ",quart_maior);
}

Eu NÃO olhei a lógica completa, se depois de conseguir compilar ainda der algum problema dá um toque aí!

Espero ter ajudado.

Link para o comentário
Compartilhar em outros sites

  • 0

Eu já consertei o meu código só que o compilador mostra umas mensagens abaixo e também o meu programa não é compilado. O que posso fazer para compilar normal então?

"1>c:\users\user\documents\visual studio 2008\projects\4\4\pol_cm.cpp(56) : warning C4715: 'seg_maior' : not all control paths return a value

1>c:\users\user\documents\visual studio 2008\projects\4\4\pol_cm.cpp(70) : warning C4715: 'quart_maior' : not all control paths return a value"

/* 4)  Construa  uma  função  que  receba  cinco  valores  e  determine 
(retorne  por  passagem  por referência) o 2º e o 4º maior valores dentre eles.
Construa  também um módulo principal para  ler tais valores,e imprimir o 
resultado obtido com a chamada da função. */

#include<stdio.h>

int seg_maior(int n,int vet[]);
int quart_maior(int n,int vet[]);
void ordem(int n,int vet[] ,int *segundo_maior, int *quarto_maior);

int main(){
  int vet[5],i=0,j=0,seg_maior,quart_maior,aux;

   //Recebendo 5 numeros 
    while(i<5){
         printf("Numero[%d]",i+1);
         scanf("%d",vet[i]);
         i++;
    }

    // Colocando em ordem crescente os numeros(do menor para o maior)
    for(i=0;i<5;i++){
        for(j=i+1;j<5;j++)
            if (vet[i]>vet[j]){
               aux=vet[i];
               vet[j]=vet[i];
               vet[j]=aux;
            }
    }

i=5;    
//retornando o segundo maior valor e o quarto maior valor
ordem(i,vet, &seg_maior, &quart_maior);

printf("O segundo maior valor:%d ",seg_maior);
printf("O quarto maior valor:%d ",quart_maior);


}




int seg_maior(int n,int vet[]){
    
    //Descobrindo o segundo maior valor
    if (n)
        seg_maior(n-1,vet);
    else
        if (n=4){
            return vet[3];
        }

      
}        



int quart_maior(int n,int vet[]){
    // Descobrindo o quarto maior valor
    if (n)
        quart_maior(n-1,vet);
    else
        if (n=5){
            return vet[4];
        }

      
}

//Retornar por passagem por referêcnia
void ordem(int n,int vet[] ,int *segundo_maior, int *quarto_maior) {

 (*segundo_maior) = seg_maior(n,vet);
 (*quarto_maior) = quart_maior(n,vet);

}

Editado por Bruno Pacheco
Link para o comentário
Compartilhar em outros sites

  • 0

O compilador está lhe avisando que as funções seg_maio e quart_maior não estão retornando nenhum valor. Embora você tenha colocado um return no else. Observe essa função:

int quart_maior(int n,int vet[]){
    // Descobrindo o quarto maior valor
    if (n)     
        quart_maior(n-1,vet);
    else
        if (n=5){        <= Não seria n == 5 ??
            return vet[4];
        }
}

Essa sua função tá confusa. No primeiro if sempre vai ser verdadeiro exceto quando n for 0. Quando for 0 vai pro else, mas no if dentro do else nunca vai ser verdadeiro uma vez que n é 0. Portanto nunca ira retornar vet[4]. Reveja essa função. Abraço.

Link para o comentário
Compartilhar em outros sites

  • 0

Eu consertei o meu código(as duas funções):

-> Mas o meu raciocínio seria fazer a função seg_maior retornar o segundo maior valor e fazer a função quart_maior retornar o quarto maior valor, ambas as duas por recursão.Minha dúvida é o que posso fazer no codigo postado ai embaixo para que ambas as funções retornem por recursão?

int seg_maior(int n,int vet[]){
    
    //Descobrindo o segundo maior valor
    if (n==4)
    return vet[3];
        
    else 
        seg_maior(n-1,vet);
            
        

}        

int quart_maior(int n,int vet[]){
    // Descobrindo o quarto maior valor
    if (n==2)
        return vet[1];
       else
        quart_maior(n-1,vet);
        
        
        
        
}

Editado por Bruno Pacheco
Link para o comentário
Compartilhar em outros sites

  • 0

No seu código você tem uma parte que põe em ordem crescente os números do vetor:

...
// Colocando em ordem crescente os numeros(do menor para o maior)
    for(i=0;i<5;i++){
        for(j=i+1;j<5;j++)
            if (vet[i]>vet[j]){
               aux=vet[i];
               vet[j]=vet[i];
               vet[j]=aux;
            }
    }
...

Então se o vetor já sai na ordem crescente, o segundo maior valor não seria vet[3] e o quarto maior valor não seria vet[1]?

Link para o comentário
Compartilhar em outros sites

  • 0

Tudo bem eu entendi isso porém a minha dúvida é porque as minhas duas funções recursivas não estão retornando valor nenhum? Já que uma função recursiva chama ela mesma, e essas chamadas vão se desempilhando até que n seja 4, dai ela vai empilhando até o começo. Voce postou isso que eu falei:Página que mostra um post falando de recursão

Editado por Bruno Pacheco
Link para o comentário
Compartilhar em outros sites

  • 0

O problema é que a sua função recursiva está retornando o valor mas você não está armazenando ele em lugar nenhum. Tinha que fazer pelo menos assim:

int seg_maior(int n,int vet[]){
   int a;

    //Descobrindo o segundo maior valor
    if (n==4)
    return vet[3];
        
       else
               a = seg_maior(n-1,vet);

return a;
}

Agora não entendi a utilidade dessa função recursiva. Ela vai retornar simplesmente o valor de vet[3].

Mas testa agora se dá certo e dá um retorno. Abraço.

Link para o comentário
Compartilhar em outros sites

  • 0

Meu código continua a não compilar: :wacko: o que faço?

/* 4)  Construa  uma  função  que  receba  cinco  valores  e  determine 
(retorne  por  passagem  por referência) o 2º e o 4º maior valores dentre eles.
Construa  também um módulo principal para  ler tais valores,e imprimir o 
resultado obtido com a chamada da função. */

#include<stdio.h>

int seg_maior(int n,int vet[]);
int quart_maior(int n,int vet[]);
void ordem(int n,int vet[] ,int *segundo_maior, int *quarto_maior);

int main(){
  int vet[5],i=0,j=0,seg_maior,quart_maior,aux;

   //Recebendo 5 numeros 
    while(i<5){
         printf("Numero[%d]",i+1);
         scanf("%d",vet[i]);
         i++;
    }

    // Colocando em ordem crescente os numeros(do menor para o maior)
    for(i=0;i<5;i++){
        for(j=i+1;j<5;j++)
            if (vet[i]>vet[j]){
               aux=vet[i];
               vet[j]=vet[i];
               vet[j]=aux;
            }
    }

i=5;    
//retornando o segundo maior valor e o quarto maior valor
ordem(i,vet, &seg_maior, &quart_maior);

printf("O segundo maior valor:%d ",seg_maior);
printf("O quarto maior valor:%d ",quart_maior);


}




int seg_maior(int n,int vet[]){
    int b;
    //Descobrindo o segundo maior valor
        if (n==4)
            return vet[3];
            
        else
        b=seg_maior(n-1,vet);
return b;
      
}        


int quart_maior(int n,int vet[]){
    int a;
    // Descobrindo o quarto maior valor
    if (n==2)
        return vet[1];
    else
        a=quart_maior(n-1,vet);
        
return a;
      
}

//Retornar por passagem por referêcnia
void ordem(int n,int vet[] ,int *segundo_maior, int *quarto_maior) {

 (*segundo_maior) = seg_maior(n,vet);
 (*quarto_maior) = quart_maior(n,vet);

}

Link para o comentário
Compartilhar em outros sites

  • 0

Boa noite!

Você poderia postar o erro!?

Mais ainda sim, acho que tem algum problema aí!

Essa função seria para descobrir o segundo maior número?

int seg_maior(int n,int vet[]){
    int b;
    //Descobrindo o segundo maior valor
    if (n==4)
            return vet[3];            
     else
         b=seg_maior(n-1,vet);
     return b;      
}
Vou tentar clarear um pouco: Uma função recursiva realmente chama a sí própria, para isso ela tem que ter uma situação final(claro, se não ela vai ficar rodando pra sempre). No seu caso, teoricamente, a situação final seria (n==4), que é muiito vago! Por exemplo, você chamar sua função passando: n=3, sua função vai ficar rodando para todo o sempre, porque nunca a comparação n==4 vai ser verdadeira! Não sei porque você quer usar recursão nesse caso, vou dar um exemplo simples:
//Vou fazer uma função para descobrir o maior número de um vetor
int maiorNumeroVetor( int *vetor , int posicao , int maiorNumero ){
    if( posicao < 0 ){//Verifica se chegou no final do vetor, caso tenha chegado retorna o maior número até o momento
        return maiorNumero;
    }
    if( vetor[posicao] > maiorNumero ){//Verifica se o valor da posição atual é maior que o maior número encontrado até agora, se for maior, atribui como o maior número encontrado
        maiorNumero = vetor[posicao];
    }
    return maiorNumeroVetor( vetor , posicao-1 , maiorNumero );//Chama a função para comparar o próximo elemento do vetor
}

PS: Não compilei o código

Link para o comentário
Compartilhar em outros sites

  • 0

Como eu disse a ele essa função recursiva não é necessária. Se o objetivo do programa é mostrar o segundo e quarto maior valor da lista, basta ele usar a parte do código dele que organiza os valores em ordem crescente e mostrar a segunda e quarta posição do vetor. Só isso. Bom se escolher continuar usando essas funções então posta o erro que o compilador mostra que vamos tentar te ajudar. Abraço.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...