Ir ao conteúdo
  • Cadastre-se

C Progrmação C - Nã apresenta posição cadastrada


Vieira L.
Ir à solução Resolvido por isrnick,

Posts recomendados

 

 

 

Boa tarde!


Estou quebrando a cabeça para finalizar o projeto.
1- Preciso que no final do programa mostre a posição do VETOR cadastrada com o maior e menor RENDA.


2- Este comando >    if (((cliente.renda > 5000) && strcmp(cliente.escolaridade,"media")==0)){
Está apenas armazenando a escolaridade média, e não a renda acima de 5000 mil reais.

 

	#include <stdio.h>
	#include <stdlib.h>
	#include <string.h>
	
	#define NCLI 3
	
	struct cadastro{
		char nomes[30], escolaridade[30]; 
		float renda[10];
		
	}; 
	
	typedef struct cadastro TipoCliente;
	
	int Le_Vetores(TipoCliente cliente[NCLI])
	{
		int num=0;
		
		int i;
		
		for(i=0; i<NCLI; i++){
	
		printf("\nDigite o nome: ");
		fflush(stdin);
		gets(cliente[i].nomes);
		
		printf("\nDigite o nivel de escolaridade > 'fundamental', 'media' ou 'superior': ");
		fflush(stdin);
		gets(cliente[i].escolaridade);
		
		printf("\nDigite a renda mensal: ");
		scanf("%.2f", &cliente[i].renda);
		
		num++;
	}
	
		return (num);
	
	}
	
		int Renda_Superior_5000(TipoCliente cliente[NCLI], int num, char nomes_5mil[NCLI][30])
		{
		
		int cont=0;
		int i;
		
			
		for(i=0;i<num;i++){
		
		if (((cliente[i].renda > 5000) && strcmp(cliente[i].escolaridade,"media")==0)){
		strcpy(nomes_5mil[cont],cliente[i].nomes);
		cont++;
		}
	}
		return (cont);
	
	}
	void Exibe_Nomes(char nomes_5mil[NCLI][30], int cont){
		
		int j;		
			for(j=0;j<cont;j++){
				printf("\nO nome do cliente acima de 5mil e escolaridade media: %s", nomes_5mil[j]);
			}
	}
	
	void Maior_Menor_Renda(TipoCliente cliente[NCLI], int num, int *pos_maior, int *pos_menor)
			{
				int i;
				int maior = 0;
				int menor = 0;
				
				for(i=0; i<num; i++){
				if (cliente[i].renda > maior){
					maior = cliente[i].renda;
						*pos_maior = i;
				}
		}
				for(i=0; i<num; i++){
				if (cliente[i].renda < menor){
						maior = cliente[i].renda;
							*pos_maior = i;
			}
		}
		return 0;
	}
	
		int main(){
			
			TipoCliente cliente[NCLI];
			
			int numcli;
			int pos_maior, pos_menor;
			char nomes_5mil[NCLI][30];
			int cont;
			
			numcli = Le_Vetores(cliente);
			cont = Renda_Superior_5000(cliente, numcli, nomes_5mil);
			Exibe_Nomes(nomes_5mil, cont);
			Maior_Menor_Renda(cliente,numcli, &pos_maior, &pos_menor);
			
			printf("\nO numero de clientes cadastrados foram: %d", numcli);	
			printf("\nO numero de clientes com RENDA MAIOR que 5 MIL -- E ESCOLARIDADE MEDIA -- : %d",cont);
			printf("\n\nO maior salario e: [ %d ]  e o menor salario e: [ %d ]", pos_maior, pos_menor);			
}

     

 

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

O fórum sumiu com todos os [ i ] sem espaços do seu programa, pois para o fórum isso é a tag para deixar o texto em itálico (veja que seu texto está em itálico a partir do lugar onde estaria o primeiro [ i ]). Use o botão <> (Code) no topo do campo de respostas para postar código no fórum sem que ele sofra alterações.

adicionado 8 minutos depois

image.png.75a588033bf38c6084c36d7b9b02f5e7.png

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

Existem alguns pontos assenciais para serem tratados no seu código:

 

1º - A utilização de fflush e gets(), é considerada em desuso atualmente.

      Utilizar a função scanf("%s",) para ler strings é mais adequado e apresenta melhor performance de leitura na memória.

      a limpeza do buffer, nesse caso, pode ser feita utilizando " " (espaço) antes da leitura, de maneira a seguir:

scanf(" %s", variavel);

 

2° - Na função para achar as posições maior e menor, é conveniente utilizar a primeira posição do vetor para inicializar as variáveis (maior e menor). Sendo:   int maior = vetor[0]; (Assim como em 'menor').

3° - O seu problema principal, mencionado neste tópico, se diz respeito aos ponteiros passados por parâmetro "int *pos_maior, int *pos_menor". Ao atribuir valor às mesmas, não utilize o '*' antes de seu nome, pois assim você armazena o endereço de memória que 'i' se encontra e não o seu valor.
 

Link para o comentário
Compartilhar em outros sites

Ocorreu esta mensagem, baseada na minha função main

	#include <stdio.h>
	#include <string.h>
	
	#define NCLI 3
	
	struct cadastro{
		char nomes[30], escolaridade[30]; 
		float renda[10];
		
	}; 
	
	typedef struct cadastro TipoCliente;
	
	int Le_Vetores(TipoCliente cliente[NCLI])
	{
		int num=0;
		
		int i;
		
		for(i=0; i<NCLI; i++){
	
		printf("\nDigite o nome: ");
		fflush(stdin);
		scanf(" %s", cliente[i].nomes);
		
		printf("\nDigite o nivel de escolaridade > 'fundamental', 'media' ou 'superior': ");
		fflush(stdin);
		scanf(" %s", cliente[i].escolaridade);
		
		printf("\nDigite a renda mensal: ");
		scanf("%.2f", &cliente[i].renda);
		
		num++;
	}
	
		return (num);
	
	}
	
		int Renda_Superior_5000(TipoCliente cliente[NCLI], int num, char nomes_5mil[NCLI][30])
		{
		
		int cont=0;
		int i;
		
			
		for(i=0;i<num;i++){
		
		if (((cliente[i].renda > 5000) && strcmp(cliente[i].escolaridade,"media")==0)){
		strcpy(nomes_5mil[cont],cliente[i].nomes);
		cont++;
		}
	}
		return (cont);
	
	}
	void Exibe_Nomes(char nomes_5mil[NCLI][30], int cont){
		
		int j;		
			for(j=0;j<cont;j++){
				printf("\nO nome do cliente acima de 5mil e escolaridade media: %s", nomes_5mil[j]);
			}
	}
	
	void Maior_Menor_Renda(TipoCliente cliente[NCLI], int num, int pos_maior, int pos_menor)
			{
				int i;

				int maior = 0; 
				int menor = 0;
				
				int maior = cliente[0].renda;
				int menor = cliente[0].renda;

				
				for(i=0; i<num; i++){
				if (cliente[i].renda > maior){
					maior = cliente[i].renda;
						pos_maior = i;
				}
		}
				for(i=0; i<num; i++){
				if (cliente[i].renda < menor){
						maior = cliente[i].renda;
							pos_maior = i;
			}
		}
	}
	
		int main(){
			
			TipoCliente cliente[NCLI];
			
			int numcli;
			int pos_maior, pos_menor;
			char nomes_5mil[NCLI][30];
			int cont;
			
			numcli = Le_Vetores(cliente);
			cont = Renda_Superior_5000(cliente, numcli, nomes_5mil);
			Exibe_Nomes(nomes_5mil, cont);
			Maior_Menor_Renda(cliente,numcli, pos_maior, pos_menor);
			
			printf("\nO numero de clientes cadastrados foram: %d", numcli);	
			printf("\nO numero de clientes com RENDA MAIOR que 5 MIL -- E ESCOLARIDADE MEDIA -- : %d",cont);
			printf("\n\nO maior salario e: [ %d ]  e o menor salario e: [ %d ]", pos_maior, pos_menor);			
}

 

erro.JPG

main.JPG

adicionado 1 minuto depois

Se voce me ajudar nesta, vou te agradecer pessoalmente cara kkkkkkkkkkk (:

Link para o comentário
Compartilhar em outros sites

@Sidney Vieira  Então, vamos lá... Eu copiei seu código pra consegui ler melhor, após você ter atualizado, algumas coisas me passaram despercebido.

1 hora atrás, Sidney Vieira disse:

float renda[10];

 

Esse vetor de float é realmente necessário?

 

1 hora atrás, Sidney Vieira disse:

int maior = 0; int menor = 0; int maior = cliente[0].renda; int menor = cliente[0].renda;

 

Não precisa inicializar com 0, já que você está inicializando com os valores definidos logo abaixo.

 

1 hora atrás, Sidney Vieira disse:

fflush(stdin); scanf(" %s", cliente[i].escolaridade);

 

A função fflush(stdin) já não é mais necessária com a utilização do scanf. (para armazenar strings com espaço no scanf, utilize "%s[^\n]" )

 

Veja se resolve seu problema...

Link para o comentário
Compartilhar em outros sites

@Sidney Vieira

10 minutos atrás, Sidney Vieira disse:

sim, o problema é que o programa não está captando a renda.

 

E sim a média.

Nesta tag abaixo

 


 if (((cliente.renda > 5000) && strcmp(cliente.escolaridade,"media")==0)){

 

 

Não ficou muito claro pra mim qual é o objetivo desta função, considerando seu comentário.

Link para o comentário
Compartilhar em outros sites

@Sidney Vieira Nesse caso, seu vetor "nomes_5mil" pode ser uma matriz com n colunas que será igual à quantidade de dados que você quer armazenar por cliente. E se as codições seguirem a ordem como você mencionou na resposta anterior, você terá que aninhar as condições e não fazer as duas em uma só condição.

Link para o comentário
Compartilhar em outros sites

O problema é o "float renda[10];" dentro da struct cadastro, pois renda não deveria ser um vetor, mas sim uma variável normal "float renda;".

(Também incluí uma função para substituir fflush(), e limitei os números de caracteres lidos nos scanfs de strings)

 

#include <stdio.h>
#include <string.h>

#define NCLI 3

struct cadastro {
    char nomes[30], escolaridade[30];
    float renda;

};

typedef struct cadastro TipoCliente;

void flush_stdin(){
    int c;
    while((c = getchar()) != '\n' && c != EOF);
}

int Le_Vetores(TipoCliente cliente[NCLI])
{
    int num=0;

    int i;

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

        printf("\nDigite o nome: ");
        scanf("%30[^\n]", cliente[i].nomes);
        flush_stdin();

        printf("\nDigite o nivel de escolaridade > 'fundamental', 'media' ou 'superior': ");
        scanf("%30s", cliente[i].escolaridade);
        flush_stdin();

        printf("\nDigite a renda mensal: ");
        scanf("%f", &cliente[i].renda);
        flush_stdin();

        num++;
    }

    return (num);

}

int Renda_Superior_5000(TipoCliente cliente[NCLI], int num, char nomes_5mil[NCLI][30])
{

    int cont=0;
    int i;


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

        if (cliente[i].renda > 5000 && strcmp(cliente[i].escolaridade,"media")==0) {
            strcpy(nomes_5mil[cont],cliente[i].nomes);
            cont++;
        }
    }
    return (cont);

}
void Exibe_Nomes(char nomes_5mil[NCLI][30], int cont) {

    int j;
    for(j=0; j<cont; j++) {
        printf("\nO nome do cliente acima de 5mil e escolaridade media: %s", nomes_5mil[j]);
    }
}

void Maior_Menor_Renda(TipoCliente cliente[NCLI], int num, int pos_maior, int pos_menor)
{
    int i;

    int maior = 0;
    int menor = 0;

    maior = cliente[0].renda;
    menor = cliente[0].renda;


    for(i=0; i<num; i++) {
        if (cliente[i].renda > maior) {
            maior = cliente[i].renda;
            pos_maior = i;
        }
    }
    for(i=0; i<num; i++) {
        if (cliente[i].renda < menor) {
            maior = cliente[i].renda;
            pos_maior = i;
        }
    }
}

int main() {

    TipoCliente cliente[NCLI];

    int numcli;
    int pos_maior, pos_menor;
    char nomes_5mil[NCLI][30];
    int cont;

    numcli = Le_Vetores(cliente);
    cont = Renda_Superior_5000(cliente, numcli, nomes_5mil);
    Exibe_Nomes(nomes_5mil, cont);
    Maior_Menor_Renda(cliente,numcli, pos_maior, pos_menor);

    printf("\nO numero de clientes cadastrados foram: %d", numcli);
    printf("\nO numero de clientes com RENDA MAIOR que 5 MIL -- E ESCOLARIDADE MEDIA -- : %d",cont);
    printf("\n\nO maior salario e: [ %d ]  e o menor salario e: [ %d ]", pos_maior, pos_menor);
    
    return 0;
}

 

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

cara funcionou!

adicionado 1 minuto depois

parabéns!

adicionado 5 minutos depois

porém gostaria que funcionasse este ultimo tópico!

 

void Maior_Menor_Renda(TipoCliente cliente[NCLI], int num, int pos_maior, int pos_menor)
{
    int i;
    int j;

    int maior = 0;
    int menor = 0;

    maior = cliente[0].renda;
    menor = cliente[0].renda;


    for(i=0; i<num; i++) {
        if (cliente[i].renda > maior) {
            maior = cliente[i].renda;
            pos_maior = i;
        }
    }
    for(j=0; j<num; j++) {
        if (cliente[j].renda < menor) {
            maior = cliente[j].renda;
            pos_maior = j;
        }
    }
}


int main() { 


 printf("\n\nO posicao do maior salario e: [ %d ]  e a posicao do menor salario e: [ %d ]", pos_maior, pos_menor);
}

 

adicionado 6 minutos depois

não está exibindo a posição do vetor com a maior renda / menor renda

 

 

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

  • Solução
43 minutos atrás, Sidney Vieira disse:

não está exibindo a posição do vetor com a maior renda / menor renda

Use ponteiros nos parâmetros pos_maior e pos_menor da função, e passe as referências das variáveis no main() quando chamar esta função. Assim toda alteração que fizer dentro da função no local apontado pelos ponteiros vai estar modificando os valores das variáveis fora da função, no escopo onde a função foi chamada.

#include <stdio.h>
#include <string.h>

#define NCLI 3

struct cadastro {
    char nomes[30], escolaridade[30];
    float renda;
};

typedef struct cadastro TipoCliente;

void flush_stdin(){
    int c;
    while((c = getchar()) != '\n' && c != EOF);
}

int Le_Vetores(TipoCliente cliente[NCLI])
{
    int num=0;

    int i;

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

        printf("\nDigite o nome: ");
        scanf("%30[^\n]", cliente[i].nomes);
        flush_stdin();

        printf("\nDigite o nivel de escolaridade > 'fundamental', 'media' ou 'superior': ");
        scanf("%30s", cliente[i].escolaridade);
        flush_stdin();

        printf("\nDigite a renda mensal: ");
        scanf("%f", &cliente[i].renda);
        flush_stdin();

        num++;
    }

    return (num);

}

int Renda_Superior_5000(TipoCliente cliente[NCLI], int num, char nomes_5mil[NCLI][30])
{

    int cont=0;
    int i;


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

        if (cliente[i].renda > 5000 && strcmp(cliente[i].escolaridade,"media")==0) {
            strcpy(nomes_5mil[cont],cliente[i].nomes);
            cont++;
        }
    }
    return (cont);

}
void Exibe_Nomes(char nomes_5mil[NCLI][30], int cont) {

    int j;
    for(j=0; j<cont; j++) {
        printf("\nO nome do cliente acima de 5mil e escolaridade media: %s", nomes_5mil[j]);
    }
}

void Maior_Menor_Renda(TipoCliente cliente[NCLI], int num, int *pos_maior, int *pos_menor)
{
    int i;

    int maior = 0;
    int menor = 0;

    maior = cliente[0].renda;
    menor = cliente[0].renda;


    for(i=0; i<num; i++) {
        if (cliente[i].renda > maior) {
            maior = cliente[i].renda;
            *pos_maior = i;
        }
    }
    for(i=0; i<num; i++) {
        if (cliente[i].renda < menor) {
            maior = cliente[i].renda;
            *pos_maior = i;
        }
    }
}

int main() {

    TipoCliente cliente[NCLI];

    int numcli;
    int pos_maior, pos_menor;
    char nomes_5mil[NCLI][30];
    int cont;

    numcli = Le_Vetores(cliente);
    cont = Renda_Superior_5000(cliente, numcli, nomes_5mil);
    Exibe_Nomes(nomes_5mil, cont);
    Maior_Menor_Renda(cliente,numcli, &pos_maior, &pos_menor);

    printf("\nO numero de clientes cadastrados foram: %d", numcli);
    printf("\nO numero de clientes com RENDA MAIOR que 5 MIL -- E ESCOLARIDADE MEDIA -- : %d",cont);
    printf("\n\nO maior salario e: [ %d ]  e o menor salario e: [ %d ]", pos_maior, pos_menor);
    
    return 0;
}

 

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