Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Vieira L.

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

Recommended Posts

Postado (editado)

 

 

 

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);			
}

     

 

Editado por Sidney Vieira
  • Curtir 1

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

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.
 

Editado por dsgeverton

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, fiz as alterações, mesmo assim não consegui resolver o erro.

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 minuto atrás, Sidney Vieira disse:

Ok, fiz as alterações, mesmo assim não consegui resolver o erro.

@Sidney Vieira  Desculpe, a resposta foi publicada antes de eu terminar de escrever. Mas já foi editada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Everton, as alterações este vetor[0], como declaro o mesmo?

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)
2 horas atrás, Sidney Vieira disse:

int maior = 0; int menor = 0;

 

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


Logicamente, nas comparações a seguir, você vai iniciar o índice na posição 1 e não mais na posição 0.

Editado por DiF

Compartilhar este post


Link para o post
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 (:

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

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

Editado por DiF
Botão CODE<>

Compartilhar este post


Link para o post
Compartilhar em outros sites
Postado (editado)

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)){

 

Editado por Sidney Vieira
Botão CODE <>

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
Compartilhar em outros sites

@dsgeverton O Objetivo desta função é:

1- Armazenar as rendas acima de 5 mil reais

2 - Armazenas a escolaridade que for == media.

 

3- armazenar esta 2 condições em uma variável.

Compartilhar este post


Link para o post
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.

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites
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;
}

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×