Ir ao conteúdo
  • Cadastre-se

C problema em achar o maior valor de um vetor


JVGS1111

Posts recomendados

Boa tarde, estou com um problema em desenvolver um código, é um programa de cadastro, preciso cadastrar pessoas em seguida mostrar algumas informações para o usuário. A informação que estou com problema em desenvolver é que tenho que mostrar ao usuário os dados da pessoas cadastrada que mais gastou KW isto dentre todos os cadastrados.

Eu consigo imprimir o valor só do maior KW dentro de um vetor, porém não consigo imprimir o nome desta pessoa que é necessário, estou tentando salvar a posição do vetor em que o valor maior foi encontrado com um loop de FOR mas mesmo assim não estou conseguindo, alguém consegue ajudar ?

 

 

ME REFIRO AO CASE 4 do meu codigo.

 

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


int main() {

    char nome[50][50];
    int ID[50], KW[50], escolha, cadastrar, cont, media, cont2, cont3 = 0;
    int sair = 2, maior = 0, posmaior = 0; 
    float total[200];
    static int linha = 0;
    

    while (sair == 2) {
        
        system("cls");
        printf("1- cadastro\n");
        printf("2- relatorio geral\n");
        printf("3- relatorio de consumo\n");
        printf("4- relatorio de consumidores\n");
        scanf("%d", &escolha);

        switch (escolha)
        {
        case 1: 
            system("cls");
            printf("quantos deseja cadastrar ?\n");
            scanf("%d", &cadastrar);
            for (cont = 0; cont < cadastrar; cont++) {

                printf("digite o nome: ");
                fflush(stdin);
                scanf("%[^\n]s", &nome[linha]);

                printf("digite o ID: ");
                fflush(stdin);
                scanf("%d", &ID[linha]);

                printf("digite o consumo de KW: ");
                fflush(stdin);
                scanf("%d", &KW[linha]);
                if (KW[linha] > 170){                
                cont2++;
            }
                total[linha] += (KW[linha] * 1.75);
                media += KW[linha];

                system("pause");
                linha++;
            }
        system ("cls");    
        break;
        
        case 2:
            system("cls");
            for (cont = 0; cont < cadastrar; cont++) {
            printf("nome: %s\nID: %d\nconsumo de KW: %d\ntotal a pagar:%.2f \n", nome[cont], ID[cont], KW[cont], total[cont]);
            system("pause");
            
            }
        system ("cls");    
        break;
            
        case 3:
            system("cls");
            printf("media de consumo da cidade: %d \n", media / linha);
            printf("numero de consumidores que consumiram mais de 170 KW: %d\n", cont2);
        system("pause");    
        break;
        
        case 4: 
        
        // identificaçao do maior (quem gastou mais)
        maior = KW[0];
        for (cont3 = 0; cont3 < cadastrar; cont3++) {
            if (KW[cont3] > maior){
                posmaior = cont3;
                printf("%s %d %d\n",nome[posmaior][posmaior], ID[posmaior], KW[posmaior]);
                
            }
            system("pause");
            break;
                
        }
        default:
            printf("valor invalido\n");
            system("pause");
            break;
        }
    }
}

 

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

@JVGS1111     isso mesmo que o  @Math.Pi   disse ,  assim que sair do loop imprima o nome de quem gastou mais que estarah no vetor nome , na posicao apontada pela variavel  posmaior ,  mas na hora de imprimir , no printf , coloque apenas hum abre fecha colchete , pois o vetor nome eh hum vetor e nao uma matriz .

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

por algum motivo nao consigo imprimir a informaçao correta pro usuario na hora de mostrar os cadastros(CASE 2:) se a variavel nome nao estiver como matriz, eu tiro o segundo [] e da um bug na hora de imprimir. Eu vou to tentando fazer as mudanças que me disseram assim que eu acabar retorno aqui.

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

Eu fiz as mudanças no código porém ainda esta quebrado:

 

Existe algum erro aparente agora ?

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

int main() {

	char nome[200][50];
	int ID[50], KW[50], escolha, cadastrar, cont, media, cont2, cont3 = 0, cont4 = 0;
	int sair = 2, maior, posmaior, posmenor, menor; 
	float total[200];
	static int linha = 0;
	

	while (sair == 2) {
		
		system("cls");
		printf("1- cadastro\n");
		printf("2- relatorio geral\n");
		printf("3- relatorio de consumo\n");
		printf("4- relatorio de consumidores\n");
		scanf("%d", &escolha);

		switch (escolha)
		{
		case 1: 
			system("cls");
			printf("quantos deseja cadastrar ?\n");
			scanf("%d", &cadastrar);
			for (cont = 0; cont < cadastrar; cont++) {

				printf("digite o nome: ");
				fflush(stdin);
				scanf("%[^\n]s", &nome[linha]);

				printf("digite o ID: ");
				fflush(stdin);
				scanf("%d", &ID[linha]);

				printf("digite o consumo de KW: ");
				fflush(stdin);
				scanf("%d", &KW[linha]);
				if (KW[linha] > 170){				
				cont2++;
			}
				total[linha] += (KW[linha] * 1.75);
				media += KW[linha];

				system("pause");
				linha++;
			}
		system ("cls");	
		break;
		
		case 2:
			system("cls");
			for (cont = 0; cont < cadastrar; cont++) {
			printf("nome: %s\nID: %d\nconsumo de KW: %d\ntotal a pagar:%.2f \n", nome[cont], ID[cont], KW[cont], total[cont]);
			system("pause");
			
			}
		system ("cls");	
		break;
			
		case 3:
			system("cls");
			printf("media de consumo da cidade: %d \n", media / linha);
			printf("numero de consumidores que consumiram mais de 170 KW: %d\n", cont2);
		system("pause");	
		break;
		
		case 4: 
		
		// identificaçao do maior (quem gastou mais)
		maior = KW[0];
		for (cont3 = 0; cont3 < cadastrar; cont3++) {
			if (KW[cont3] > maior){
				posmaior = cont3;
		
			}	
		}
		menor = KW[0];
		for (cont4 = 0; cont4 < cadastrar; cont4++) {
			if (KW[cont4] < menor){
				posmenor = cont4;
			}	
		}
			printf("Consumidor que mais consumiu: \n");
			printf("nome:%s\nID:%d\nconsumo:%d\n",nome[posmaior], ID[posmaior], KW[posmaior]);
			printf("Consumidor que menos consumiu: \n");
			printf("nome:%s\nID:%d\nconsumo:%d\n",nome[posmenor], ID[posmenor], KW[posmenor]);
			system("pause");
			break;
			
		default:
			printf("valor invalido\n");
			system("pause");
			break;
		}
	}
}

 

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

@JVGS1111     está funcionando bem , só vi um erro que é a variável cont2 que precisa ser inicializada .  e uma melhor organização do código , que poderia ser assim  :

#include <stdio.h>
#include <stdlib.h>
int main(){
    char nome[200][50];
    int ID[50],KW[50],escolha,cadastrar,
        cont,media,cont2=0,cont3=0,cont4=0;/* cont2 precisa ser inicializado */
    int sair=2,maior,posmaior,posmenor,menor;
    float total[200];
    static int linha = 0;/* por que static ? */
    while(escolha != 5){
        system("cls");
        printf("1- cadastro\n");
        printf("2- relatorio geral\n");
        printf("3- relatorio de consumo\n");
        printf("4- relatorio de consumidores\n");
        printf("5- Sair Do Programa\n");
        printf("   escolha Opcao ");
        scanf("%d",&escolha);
        switch(escolha){
        case 1:
            system("cls");
            printf("quantos deseja cadastrar ? ");
            scanf("%d",&cadastrar);
            for(cont=0; cont<cadastrar; cont++){
                printf("digite o nome ----------: ");
                fflush(stdin);
                scanf("%[^\n]s",&nome[linha]);
                printf("digite o ID ------------: ");
                fflush(stdin);
                scanf("%d",&ID[linha]);
                printf("digite o consumo de KW -: ");
                fflush(stdin);
                scanf("%d",&KW[linha]);
                if (KW[linha] > 170){
                    cont2++;
                }
                total[linha] += (KW[linha] * 1.75);
                media += KW[linha];
                system("pause");
                linha++;
            }
            system("cls");
            break;
        case 2:
            system("cls");
            for(cont=0; cont<cadastrar; cont++)                {
                printf("nome ----------: %s\n"    , nome[cont]);
                printf("ID ------------: %d\n"    ,   ID[cont]);
                printf("consumo de KW -: %d\n"    ,   KW[cont]);
                printf("total a pagar -: %.2f\n\n",total[cont]);
                system("pause"                                );
                printf("\n");
            }
            system ("cls");
            break;
        case 3:
            system("cls"                                                                                );
            printf("media de consumo da cidade ---------------------------: %.2f\n",(float)media / linha);
            printf("numero de consumidores que consumiram mais de 170 KW -: %d\n\n", cont2               );
            system("pause"                                                                               );
            break;
        case 4:
            // identificaçao do maior (quem gastou mais)
            maior = KW[0];
            menor = KW[0];
            for(cont3 = 0; cont3 < cadastrar; cont3++){
                if (KW[cont3] > maior){
                    posmaior = cont3;
                }
                else
                    if(KW[cont3]<menor)
                        posmenor=cont3;
            }
            /*menor = KW[0];
            for(cont4 = 0; cont4 < cadastrar; cont4++){
                if (KW[cont4] < menor){
                    posmenor = cont4;
                }
            }*/
            printf("Consumidor que mais consumiu --:\n"                    );
            printf("nome --------------------------: %s\n"  ,nome[posmaior]);
            printf("ID ----------------------------: %d\n"  ,  ID[posmaior]);
            printf("consumo -----------------------: %d\n\n",  KW[posmaior]);
            printf("Consumidor que menos consumiu -:\n"                    );
            printf("nome --------------------------: %s\n"  ,nome[posmenor]);
            printf("ID ----------------------------: %d\n"  ,  ID[posmenor]);
            printf("consumo -----------------------: %d\n\n",  KW[posmenor]);
            system("pause"                                                 );
            break;
        case 5:
            printf("\nSaindo . . . !\n\n\n");;
            break;
        default:
            printf("valor invalido\n");
            system("pause");
            break;
        }
    }
    return 0;
}

 

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

@JVGS1111 ✋Boa Noite!

 

    #️⃣ Só 5 pontos que notei que são interessantes 🙊:

  1. Percebeu que maior e posmaior são logicamente a mesma coisa, idem menor e posmenor ?
  2. A função scanf tem uma pequena correção para ela em seus argumentos: ("%[^\n]",nome[linha]).
  3. As variáveis cont,cont2,cont3,cont4 bem que podem ser todas em uma, vetor cont(4) ?
  4. Todas as variáveis declaradas no topo precisam ser inicializadas isso evita erros lógicos mais tarde. 
  5. A função principal main precisa de normalização, pois ela de outra maneira facilita testes e correções.

|

 

 

 

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

Eu estou no começo da faculdade, perdoem minha ignorância, fiz algumas mudanças porém em alguns casos a saída sai totalmente errada, segue como nas fotos. 

Anotação 2019-07-14 005647.png

Anotação 2019-07-14 005751.png

adicionado 5 minutos depois
3 horas atrás, AnsiC disse:

@JVGS1111 ✋Boa Noite!

 

    #️⃣ Só 5 pontos que notei que são interessantes 🙊:

  1. Percebeu que maior e posmaior são logicamente a mesma coisa, idem menor e posmenor ?
  2. A função scanf tem uma pequena correção para ela em seus argumentos: ("%[^\n]",nome[linha]).
  3. As variáveis cont,cont2,cont3,cont4 bem que podem ser todas em uma, vetor cont(4) ?
  4. Todas as variáveis declaradas no topo precisam ser inicializadas isso evita erros lógicos mais tarde. 
  5. A função principal main precisa de normalização, pois ela de outra maneira facilita testes e correções.

|

 

 

 

Obrigado pelas digas, estou refletindo.

as variáveis cont1,cont2,cont3.... estou usando como índice, eu tive problemas em usar uma apenas porque as entradas anteriores ficavam salvas e eu optei por fazer varias ao invés de zerar o valor dela. É uma questão de economia de tempo. 

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

Em 14/07/2019 às 01:06, JVGS1111 disse:

Eu estou no começo da faculdade, perdoem minha ignorância

Que isso 🙊! Precisa se preocupar não, todos nós aqui tivemos nosso começo. Só aprendi mais rápido quando tive paciência para usar funções, e agora não consigo programar de outro modo. 

 

image.png.5f6e6b5dde00e9099943789a7f06db12.png

 

Eu fiz essa da seguinte maneira:

  1. Uma função que localiza o índice do maior valor, e outra que faz o mesmo para menor valor de consumo 🤓
  2. Uma segunda função que dado dois índices verifica quem é o maior e quem é o menor valor, imprime junto ao sinal de > e < respectivamente, ainda se forem iguais imprime sinal de igualdade no RANK 😉

|

  • Curtir 2
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!