Ir ao conteúdo
  • Cadastre-se

Maior e Menor - Matriz e Vetor


robinhojjunior
Ir à solução Resolvido por ScreenBlack,

Posts recomendados

/*Construir um programa em C que leia o nome e o preco de 10 produtos e armazene esses dados em dois vetores,
um para o nome e um para o preco e imprima um relatorio com o nome, preco e novo preco dos produtos,
seguindo as regras a seguir:

Os produtos com preco abaixo de R$ 100,00 serao atualizados em 12% (1 ponto)
Os produtos com preco igual ou superior a R$ 100,00 serao atualizados em 15% (1 ponto)
Imprimir o nome do produto com maior preco atualizado (1,25 ponto)
Imprimir o nome do produto com menor preco atualizado (1,25 ponto)

Observacoes:
Nao permitir preco negativo ou zero (1 ponto)
Declaracao e leitura dos vetores (0,5 ponto)*/


#include <stdio.h>
#include <string.h>
 
main (){
    float preco[4],preco_at[4], maior, menor;
    char nome[4][25], maior_preco[1][25], menor_preco[1][25];
    int i;
     
    for (i = 0; i <= 3; i++){
        fflush(stdin);
        printf ("Informe o nome do produto  %d: ", i + 1 );
        gets (nome);
        printf ("\nInforme o valor do produto %d: R$ ", i + 1);
        scanf ("%f", &preco);
         
        while (preco <= 0){ //PRODUTO NÃO PODE CONTER VALOR NEGATIVO OU = 0
            printf ("\n******* Valor invalido!!! *******\n");
            printf ("\nInforme o valor do produto novamente %d: R$ ", i + 1);
            scanf ("%f", &preco);
        }
         
printf ("\n=========================================\n\n");
         
    }
        printf ("\nVALORES NAO ATUALIZADOS");// IMPRESSÃO DOS VALORES NÃO ATUALIZADOS
        printf ("\n=========================================\n\n");
         
    for (i = 0; i <= 3; i++){ //IMPRESSÃO DOS VALORES PUROS
            printf ("PRODUTO: %-10s - VALOR: R$ %.2f\n",nome, preco);
}
 
printf ("\n=========================================\n\n");
 
        printf ("\nVALORES ATUALIZADOS"); // IMPRESSÃO DOS VALORES ATUALIZADOS
        printf ("\n=========================================\n\n");
     
    for (i = 0; i <= 3; i++){    //Os produtos com preco abaixo de R$ 100,00 serao atualizados em 12%
        if (preco < 100){
            preco_at = (preco *1.12);
            printf ("PRODUTO: %-10s - VALOR: R$ %.2f\n",nome, preco_at);
        }
        else if (preco >= 100){
            preco_at = (preco * 1.15);
            printf ("PRODUTO: %-10s - VALOR: R$ %.2f\n",nome, preco_at);
        }
                 
 
}  
     
     maior = preco_at[0];
     menor = preco_at[0];
        
        
        for ( i = 0; i <= 3; ++i){ //AQUI ESTÁ PRONTO O MAIOR E O MENOR PRECO ATUALIZADOS
            if (preco >= maior)
                maior = preco_at;
            strcpy (maior_preco[0], nome);      
 
            if (preco <= menor)
                menor = preco_at;
            strcpy (menor_preco[0], nome);
    
}
 
        
        printf("\nPRODUTO COM MAIOR PRECO: %-10s R$ %.2f",maior_preco[0], maior);
        printf("\nPRODUTO COM MENOR PREcO: %-10s R$ %.2f",menor_preco[0], menor);  //ATÉ AQUI
        
     
     
    getch ();
}

Link para o comentário
Compartilhar em outros sites

Seu código não faz a busca para o maior e menor valor dos produtos.

Uma ideia para mostrar o maior e o menor valor, é armazenar numa variável a posição do vetor em que eles se encontram.

Dessa forma, você consegue facilmente buscar nas listas o nome e o valor.

Então meu caro!

É que eu retirei pensando que seria melhor de entender assim, mas rescrevi a parde do códido onde se pode definir o menor e o maior mas o problema é o seguinte:

 

Ai vemos 2 impressões 1º com os valores originais e a 2º com os valores atualizados, pois bem, o valor a ser comparado tem que ser os atualizados e também tem que conter o nome dos produtos que contem o valor impresso.

 

Resumindo não estou sonseguindo imprimir o manor e o maior valor (ATUALIZADO) e sem o nome deles, eu até consegui imprimir o nome mas sem sai com problemas ou errado.

A seguinte edição deu certo com os valores mas ainda sim não consigo imprimir os nomes: 

 

for (i = 0; i <= 3; i++){    //Os produtos com preco abaixo de R$ 100,00 serao atualizados em 12%

        if (preco < 100){

             preco_at = (preco *1.12); 

            printf ("PRODUTO: %-10s - VALOR: R$ %.2f\n",nome, preco_at);

        }

        else if (preco >= 100){

             preco_at = (preco * 1.15);

            printf ("PRODUTO: %-10s - VALOR: R$ %.2f\n",nome, preco_at);

        }

                

}    

    

     maior = preco_at[1];

     menor = preco_at[1];

       

       

        for ( i = 0; i <= 3; ++i){

            if (preco > maior)

                maior = preco_at;

            if (preco < menor)

                menor = preco_at;

        }

       

        printf("\nMaior: R$ %f" ,maior);

        printf("\nMenor: R$ %f" ,menor);

       

         

    

    

    getch ();

}

Link para o comentário
Compartilhar em outros sites

Usemos a questão matemática a nosso favor.

Como o valor de correção é menor para valores mais baixos, logo, nunca ocorrerá de um valor menor, após a atualização, ser maior que um de maior valor, também após a atualização.

Dessa forma, tanto fazer buscar o menor e o maior antes ou depois da atualização.

Basta encontrar o menor e o maior valor a partir da lista original e depois aplicar a atualização no momento de mostra-los na tela.

Para fazer a busca do menor e maior valor, inicie as duas variáveis, que armazenarão esses valores, com o primeiro valor contido na lista principal e, a partir daí, sair comparando com os demais da lista.

Obs no código:

     maior = preco_at[0];     menor = preco_at[0];
Comece sempre na posição zero, para buscar o primeiro elemento da lista.
Link para o comentário
Compartilhar em outros sites

OK!

Tive dificuldade de entender esse conceito no começo, e me explicaram como abaixo;

int num[ 10]; //> nesta caso será disponibilizado sequencia de 10 inteiros;/* mais a pegunta é! Como acessar os 10 inteiros              *//* quando se trata de C o nome do vetor e o elemento número 1 *//* então num é o primeiro elemento;                           *//* como se faz para acessar o 2 elemento ?                    */ /* faz assim: num + 1 = 2 elemento, que em C se escreve num[ 1] = 2 elemento *//* conclui-se que; Sendo é num[ 0] = 1, num[ 1] = 2 ... num[ 9] = 10 elemento*/

Com base nesse conteúdo posso produzir algo como:

#include <stdio.h>#include <stdlib.h>int i_MenosOuMaio(int n, int num[], char ch){    int i,   i_tmp;    if(ch) ch = -1; //Se for 0 retorna o Maior                    //se for diferente retorna menor;    for (i_tmp = i = 0; i < n; i++)    if  (ch + (num[i_tmp] < num[i]))         i_tmp = i;    return (i_tmp);// O índice com maior valor ou menor;}int main(void){    int num[5] = {1,2,3,4,5};    printf("o maior valor e: %d\n", num[ i_MenosOuMaio(5, num, 0/*Maior*/) ]);    printf("o menor valor e: %d\n", num[ i_MenosOuMaio(5, num, 1/*Menor*/) ]);        return (0);}
Link para o comentário
Compartilhar em outros sites

Se está armazenando os índices para guardar a posição do maior e menor valor, porém, está informando errado o produto, então, reveja a rotina de busca dos valores.

Experimente fazer um teste de mesa em conjunto com a depuração (execução em modo "DEBUG") do programa. É 99,99% de chances em encontrar facilmente o erro.

Link para o comentário
Compartilhar em outros sites

se ambas matrizes com mesmo índice, isso não tem que acontecer, eu acho que a função que grava os dados é quem possuí o erro.

Atualizei o código lá em cima, mas ainda continua o erro os nomes ainda saem trocados.

 

Então amigo, eu criei 2 matrizes diferêntes.

 

 

maior = preco_at[0];  

     menor = preco_at[0];

       

       

        for ( i = 0; i <= 3; ++i){ //AQUI ESTÁ PRONTO O MAIOR E O MENOR PRECO ATUALIZADOS

            if (preco >= maior)

                maior = preco_at;

            strcpy (maior_preco[0], nome);        

    }

        for (i = 0; i <= 3; i++){

            if (preco <= menor){

                menor = preco_at;

            strcpy (menor_preco[0], nome);

    }

}

Link para o comentário
Compartilhar em outros sites

Acredito que não entendeu a ideia que eu e o amigo @ tentamos apresentar.

Utilizar o índice para identificar as posições para buscar o conteúdo com maior e menor valor.

Exemplo:

    int maior = 0;    int menor = 0;    for ( i = 1; i <= 3; i++ )    {        if ( preco[i] > preco[maior] )            maior = i;        if ( preco[i] < preco[menor] )            menor = i;    }    printf("\nPRODUTO COM MAIOR PRECO: %-10s R$ %.2f", nome[maior], preco_at[maior] );    printf("\nPRODUTO COM MENOR PREcO: %-10s R$ %.2f", nome[menor], preco_at[menor] );
Link para o comentário
Compartilhar em outros sites

  • Solução

Entendi o que você quis dizer.

Mas acredito que você ainda não entendeu o que tentamos explicar.

Se você conseguiu encontrar o maior e o menor valor, então, você também encontrou a posição do vetor em que esses valores se encontram.

É essa posição que utilizo para também fazer a busca do nome.

Vou tentar demonstrar em exemplo.

Caso o maior valor esteja na posição 3 (índice 2) do vetor:

char *nome[] = { "lapis", "caneta", "caderno" };float preco[] = { 1.0, 2.0, 8.0 };int maior_valor = 2; // índice do vetor que possui o produto com o maior valorprintf("Produto: %s - Valor: %f\n", nome[maior_valor], preco[maior_valor] );
Trabalhando da forma apresentada acima, o valor do índice serve para posicionar todos os vetores.

Assim, não precisa ficar copiando nomes e atualizando valores nos vetores.

Independente da ideia que apresentei anteriormente, apresentarei o erro que está ocorrendo utilizando sua lógica:

    for ( i = 0; i <= 3; ++i)  //AQUI ESTÁ PRONTO O MAIOR E O MENOR PRECO ATUALIZADOS    {        if (preco[i] >= maior)        {            maior = preco_at[i];            strcpy (maior_preco[0], nome[i]);        }    }
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Pessoal um amigo me ajudou e o código funcionou, um amigo que trabalha na Divisão de Tecnologia da Universidade me ajudou.

 

Obrigado a todos pela a ajuda e pelo o empenho de vocês, desculpem também qualquer coisa sou novo no mundo da programação e ainda tenho muita coisa pra aprender. Obrigado ai a todo!

 

http://imageshack.com/a/img905/2590/yRgUAZ.jpg

 

O problema está aqui:

 

ANTES

 

for ( i = 0; i <= 3; ++i){ //AQUI ESTÁ PRONTO O MAIOR E O MENOR PRECO ATUALIZADOS
            if (preco >= maior)
                maior = preco_at;
            strcpy (maior_preco[0], nome);      
 
            if (preco <= menor)
                menor = preco_at;
            strcpy (menor_preco[0], nome);
    
}

 

 

DEPOIS

 

 

 

for ( i = 0; i <= 3; ++i){ //AQUI ESTÁ PRONTO O MAIOR E O MENOR PRECO ATUALIZADOS
            if (preco >= maior){
                maior = preco_at;
            strcpy (maior_preco[0], nome);      
    }
            if (preco <= menor) {
                menor = preco_at;
            strcpy (menor_preco[0], nome);
    }
}

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