Ir ao conteúdo
  • Cadastre-se

C Pegar valores de um vetor


Posts recomendados

E ai galera estou fazendo o projeto da faculdade do tema Problema da mochila de algoritmos gulosos e estou sem ideias de como resolver uma coisa. O usuário entrara com um numero para o tamanho da mochila e o numero de itens. Os itens terão o seu peso, seu valor e sua valoração (valoração = Valor/Peso). O algoritmo deve ver nos Valores quais são os números maiores, pegar o peso desse determinado item e diminuir o seu peso do tamanho da mochila.

Exemplo:

 

Tamanho da mochila = 15;

Numero de itens = 5;

 

Item  Valor    Peso       Vu

A         4         12         0,33  

B         2          2           1

C         1          1           1

D         2          1          2

E        10          4         2,5

 

Temos que ver quais são os maiores valores do vetor Vu e pegar o peso correspondente. Como no vetor Vu o maior valor é 2,5 pegamos o peso desse item que é 4 e descontamos da mochila 15-4 =11. Depois pegamos o próximo maior valor que seria o 2 do vetor Vu, e pegamos o peso desse item que é 1 e descontamos da mochila 11-1 = 10. E fazemos esses passos até onde a mochila suportar (mochila >= 0). O problema esta na parte em que eu tenho que pegar o peso do maior valor. Eu declarei vetores separados para o Valor, Peso e Vu. Quando eu acho o maior valor do vetor Vu (nesse exemplo seria o 2,5) como eu pego o seu peso no vetor Peso (que nesse exemplo seria 4)? É nisso que estou travado e não sei como resolver. Desde já agradeço.

 

#include <stdio.h>
#include <stdlib.h>

#define maxItens 200	//coloque aqui a quantidade maxima de itens 

int peso[maxItens];
int valor[maxItens];
float Vu[maxItens];

int main(){
	int capacidade, i, itens, aux, ItensMax=0;
  float maior=0;

  printf("Insira a capacidade da mochila e o numero de itens: ");
  scanf("%d %d", &capacidade, &itens);
  
	while(capacidade){ 
    
		//lendo os elementos:
		for(i = 0; i<itens; i++){
      printf("Insira o peso e valor do ITEM numero %d: \n", i+1);
			scanf("%d %d", &peso[i], &valor[i]); //peso do item, valor do objeto
		}

    //Fazer a divisaõ de valor/peso e armazena no Vu
    for(i=0;i<itens;i++){
      Vu[i] = (float)valor[i] / peso[i];
    }


    //vai achar o maior valor de todo o vetor Vu, mas o objetico é achar os maiores valores do vetor Vu
   //e pegar seus deteminados pesos e descontar da mochila
    for(i=0;i<itens;i++){
      if(Vu[i] > maior){
        maior = Vu[i];
      }
    }
    
    
    printf("Valor  Peso  Vu\n");
    for(i=0;i<itens;i++){
      printf("%d     %d      %f\n", valor[i], peso[i], Vu[i]);
    }

    printf("\n\nMaior valor de Vu: %f", maior);
  
  exit(0);
   
 }

  return 0;
}

 

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

@Emerson2156547384729849    o peso e o valor ocupam a mesma posicao , sendo cada qual no seu , e entao para pegar o peso do maior valor , voce pode usar um metodo de ordenacao de vetores ,  e usar nos dois vetores ao mesmo tempo , sssim os valores serao organizados e continuarao nas mesmas posições relativas um ao outro .

Link para o comentário
Compartilhar em outros sites

@devair1010  eu não entendi como eu deveria aplicar a ordenação nos dois vetores, já que se eu aplicar a ordenação nos vetores Peso e Vu eles perderiam seu correspondente.

Exemplo:

Item  Valor    Peso       Vu

A         4         12         0,33  

B         2          2           1

C         1          1           1

D         2          1          2

E        10          4         2,5

 

Se aplicarmos a ordenação no vetor Peso e vetor Vu vai ficar:

 

Item  Valor    Peso       Vu

A         4          1         0,33  

B         2          1           1

C         1          2           1

D         2          4          2

E        10        12         2,5

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

@Emerson2156547384729849    poderia ser assim 

#include <stdio.h>
#include <stdlib.h>

#define maxItens 200	//coloque aqui a quantidade maxima de itens

int   peso [maxItens] = {12,2,1,1,4};
int   valor[maxItens] = {4,2,1,2,10};
float Vu   [maxItens] = {0.33,1,1,2,2.5};

int main()
{
	int   capacidade = 5;
	int   i          = 0;
	int   j          = 0;
	int   itens      = 8;
	int   ItensMax   = 0;
	float aux        = 0;
  float maior      = 0;

  printf("Insira a capacidade da mochila e o numero de itens: ");
  /// scanf("%d %d", &capacidade, &itens);
  capacidade = 5;
  itens = 5;
	while( capacidade )
  {
		//lendo os elementos:
		for(i = 0; i<itens; i++)
		{
      printf("Insira o peso e valor do ITEM numero %d: \n", i+1);
			/// scanf("%d %d", &peso[i], &valor[i]); //peso do item, valor do objeto
		}

    /// Fazer a divisaõ de valor/peso e armazena no Vu
    for(i=0;i<itens;i++)
    {
      Vu[i] = (float)valor[i] / peso[i];
    }
    /// vai achar o maior valor de todo o vetor Vu, mas o
    /// objetico é achar os maiores valores do vetor Vu
    /// e pegar seus deteminados pesos e descontar da mochila
    for(i=0;i<itens;i++)
    {
      if(Vu[i] > maior)
      {
        maior = Vu[i];
      }
    }

    for(  i=0;     i<itens; i++ )
      for(j=0;     j<itens; j++ )
      {
        if(valor[i] < valor[j]  )
        {
          aux       = valor[i]  ; /// organiza o vetor Dos vaLores
          valor[i]  = valor[j]  ;
          valor[j]  =     aux   ;

          aux       =    Vu[i]  ;
          Vu   [i]  =    Vu[j]  ; /// organiza o vetor Vu
          Vu   [j]  =     aux   ;

          aux       =  peso[i]  ;
          peso [i]  =  peso[j]  ; /// organiza o vetor Dos pesos
          peso [j]  =     aux   ;
        }
      }

    printf("\nIten   Valor    Peso      Vu\n\n");
    for(i=0;i<itens;i++)
    {
      printf(" %c     %3d     %3d      %5.2f\n",i+64+1, valor[i], peso[i], Vu[i]);
    }

    printf("\n\nMaior valor de Vu: %.2f", maior);
    exit(0);
  }
  return 0;
}

 

mas precisa fazer melhoria nesse código  pois mostra os números nas posições certas , mas se caso tenha 2 ou mais valores iGuais , precisa ver no outro vetor o que seja menor e deixar o outro maior para escrever depois abaixo desse ,  como nessa imagem

vetores2.jpg.53261d7dca168c315bb2ffe83a027c36.jpg

 

e esse vetor de valores seria melhor Que fosse do tiPo  float , , ,  ,,,

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

4 horas atrás, Emerson2156547384729849 disse:

eu não entendi como eu deveria aplicar a ordenação nos dois vetores, já que se eu aplicar a ordenação nos vetores Peso e Vu eles perderiam seu correspondente.

Exemplo:

Item  Valor    Peso       Vu

A         4         12         0,33  

B         2          2           1

C         1          1           1

D         2          1          2

E        10          4         2,5

 

Pois é. Do seu próprio exemplo está a razão do erro

 

Escreva em torno dos dados

 

Seu dado é o item. Não é o valor nem o peso nem o valor ponderado.

 

se quer mesmo usar vetores apenas classifique não o vetor mas sim os índices e dá tudo certo. No seu exemplo tem 5 itens. Classificando por VU um vetor { 0.33, 1, 1, 2, 2.5 } vai ficar com { 4, 3, 2, 1, 0 } onde antes era { 0, 1, 2, 3, 4 }.

 

A posição do maior valor é que está no vetor e então usa essa posição para acessar o valor o peso, o nome e o VU. Nada mais. Acessa pela posição nesse vetor e não pelo índice original. Só isso.

 

Mais legível é escrever em torno dos dados e considerar o que um item:

 

typedef struct
{
    char  nome[10];
    float valor;
    float peso;
    float vu;
} Item;

 

E isso é um só item e de pouco serve.

 

Imagine um balcão onde estão os pesos. O cara vai ao balção e enche a mochila. Não vai poder por na mochila nada que não estava no balcão, certo? Então o balcão e a mochila são a MESMA coisa: uma coleção. De Item.

 

Veja:

 

typedef struct
{
    unsigned limite[20];
    unsigned qtd;
    Item item[20];
} Colecao;

 

Não é mais simples?

 

Pode declarar

 

    Colecao balcao;
    Colecao mochila;

 

Não é mais expressivo? Afinal não vai encher a mochila com itens que estão no balcão?

 

Ou melhor ainda:

 

#include <stdio.h>

typedef struct
{
    char   nome[10];
    double valor;
    double peso;
    double vu;
} Item;

typedef struct
{
    unsigned limite[20];
    unsigned qtd;
    Item     item[20];
} Colecao;

int main(void)
{
    Colecao balcao = {
        .limite  = 20,
        .qtd     = 5,
        .item[0] = {"A", 4., 12., 0.33},
        .item[1] = {"B", 2., 2., 1.},
        .item[2] = {"C", 1., 1., 1.},
        .item[3] = {"D", 2., 1., 2.},
        .item[4] = {"E", 10., 4., 2.5}};

    Colecao mochila = {.limite = 20, .qtd = 0};  // vazia

    return 0;
}

 

Antes mesmo de começar o programa já tem algum resultado. É melhor escrever assim.

 

 

 

  • Curtir 1
  • Obrigado 1
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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!