Ir ao conteúdo
  • Cadastre-se

C erro nos printfs do algoritmo


Venus Guy
Ir à solução Resolvido por Mayrinck Bernardo,

Posts recomendados

podem me ajudar a encontrar o erro? começando da parte dos printfs de todos os salários até a soma dos salários

 

a pergunta é a seguinte: 

3) Faça um programa que tenha um registro com os campos nome, endereço, telefone,

e-mail, salário. O programa deve ler os dados de um conjunto indefinido de pessoas e

informar ao final o total dos salários, a média dos salários, o maior salário e a quem

pertence (nome) e o menor salário e a quem pertence (nome).

O programa deve perguntar ao usuário se deseja cadastrar uma nova pessoa e encerrar o

cadastro quando a resposta for não.

 

 

 

 

 

#include <stdio.h>
#include <string.h>
int main(){
    char resp[10] , nome [30] , endereco [30] , email [50];
    int telefone, i;
    float salario, media, maior, menor, total;
    
        while (strcmp(resp,"nao")!=0){
        
        
        printf("deseja cadastrar alguem? :");
            fflush (stdin);
        gets(resp);
  
        if (strcmp(resp,"nao")!=0){
        
                printf ("nome:");
                    fflush (stdin);
            gets (nome);
                printf ("endereco:");
                    fflush (stdin);
            gets (endereco);
            printf ("telefone:");
            scanf  ("%d", &telefone);
            printf ("email:");
            fflush (stdin);
            gets (email);
            printf ("salário:");
            scanf ("%f", &salario);
        
        
        
        }
        
    
    
        
    }
            salario++;
                printf ("todos os salarios:%f\n", salario);
                media = total/total;
                printf ("média dos salarios:%f\n", total);
                
        if (salario > maior){
            maior = salario;
                    printf ("o maior salário é: %f e pertence a %s:", salario, nome);
        }
            
            if (salario < menor || i == 1){
            menor = salario;
                    printf ("o menor salário é: %f e pertence a %s:", salario, nome);
        }        
    
        
    
    
     total += salario;
         printf ("Total: %f", total);
        }


 

Gerar numeros.txt

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

32 minutos atrás, Venus Guy disse:

podem me ajudar a encontrar o erro? começando da parte dos printfs de todos os salários até a soma dos salários

 

a pergunta é a seguinte: 

3) Faça um programa que tenha um registro com os campos nome, endereço, telefone,

e-mail, salário. O programa deve ler os dados de um conjunto indefinido de pessoas e

informar ao final o total dos salários, a média dos salários, o maior salário e a quem

pertence (nome) e o menor salário e a quem pertence (nome).

O programa deve perguntar ao usuário se deseja cadastrar uma nova pessoa e encerrar o

cadastro quando a resposta for não.

 

 

 

 

 


#include <stdio.h>
#include <string.h>
int main(){
    char resp[10] , nome [30] , endereco [30] , email [50];
    int telefone, i;
    float salario, media, maior, menor, total;
    
        while (strcmp(resp,"nao")!=0){
        
        
        printf("deseja cadastrar alguem? :");
            fflush (stdin);
        gets(resp);
  
        if (strcmp(resp,"nao")!=0){
        
                printf ("nome:");
                    fflush (stdin);
            gets (nome);
                printf ("endereco:");
                    fflush (stdin);
            gets (endereco);
            printf ("telefone:");
            scanf  ("%d", &telefone);
            printf ("email:");
            fflush (stdin);
            gets (email);
            printf ("salário:");
            scanf ("%f", &salario);
        
        
        
        }
        
    
    
        
    }
            salario++;
                printf ("todos os salarios:%f\n", salario);
                media = total/total;
                printf ("média dos salarios:%f\n", total);
                
        if (salario > maior){
            maior = salario;
                    printf ("o maior salário é: %f e pertence a %s:", salario, nome);
        }
            
            if (salario < menor || i == 1){
            menor = salario;
                    printf ("o menor salário é: %f e pertence a %s:", salario, nome);
        }        
    
        
    
    
     total += salario;
         printf ("Total: %f", total);
        }


 

Gerar numeros.txt 1 kB · 0 downloads

o problema pode esta no seu codeblocks alguma configuração dele

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

50 minutos atrás, Venus Guy disse:

@João Vitor Sacramento Rocha eu estou usando o falcon, o que está dando errado são os valores, não ta somando, e também não mostra o maior e menor valor corretos, nem a media e a soma dos salários porque não sei se coloquei no lugar correto

tira o i==1 e coloca um else antesno if

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

Boa tarde @Venus Guy

 

O seu código parece não fazer sentido com a questão, por exemplo, o que você está tentando fazer nesse trecho do código?

 

3 horas atrás, Venus Guy disse:

salario++;
printf ("todos os salarios:%f\n", salario);
media = total/total;
printf ("média dos salarios:%f\n", total);

 

 

Por que está somando mais um no salario que a pessoa informou?

 

Onde está a declaração do valor da variável total? Por que ela está dividindo ela mesma? 

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

 char resp[10] , nome [30] , endereco [30] , email [50]

ok aqui tem 4 string com capacidade de receber 10 digitos, 30 digitos , 30 digitos e 50 digitos.

ok mas depois que você armazenar essas informações voce vai resetar essas informações caso queiro salvar as novas informações?

voce precisa de vetor mano, a melhor ideia para isso é utilizar estrutura de de dados

onde essas strings char resp[10] , nome [30] , endereco [30] , email [50] ficarão armazenadas dentro de um vetor podendoas ser repetidas qtas vezes for necessario

 

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

12 minutos atrás, Venus Guy disse:

@Leonardo0308 sou iniciante ainda fico meio perdido nessa parte kk, pode me ajudar?

 

 

Se você está encontrando muita dificuldade nesse exercício tenta fazer algo um pouco mais fácil. Vamos começar com a base dele.

 

Consegue me escrever um programa que leia 10 salários e no final mostre a media deles? 

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

#include <stdio.h>
#include <string.h>
int main(){
char nome [50] , endereco [70] , email [50], maioral[50], telefone[12];
    float salario, media, maior,totalsalario;
    int qtd=0,c;

    
 			inicio:
            printf("nome:\n");
            fflush(stdin);
            gets(nome);
            
            printf("endereco:\n");
            gets(endereco);
            
            printf("telefone:\n");
            gets(telefone);
            
            printf("email:\n");
            gets(email);
            
            printf("salario:\n");
            scanf("%f",&salario);
            if (salario>maior){
            	maior = salario;
            	strcpy(maioral,nome);
			}
            totalsalario = totalsalario+salario;
            qtd = qtd +1;
            media = totalsalario;
            
         	printf("para cadastrar outro tecle 1 senao digite 2\n");
         	fflush(stdin);
  		 	scanf("%d",&c);
 		  	switch (c){
 		  	case 1:
  		 	goto inicio;
  		 	break;
  		 	case 2:
        	printf ("o total de salarios foi %.2f\n",totalsalario);
        	printf ("a media de salarios foi %.2f\n",media/qtd);
       	 	printf ("o maior salarios foi %.2f\n",maior);
        	printf ("o maior salarios foi de %s\n",maioral);
        	break;
 			  }
 	}
   		
         
        
    
    

 

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

6 minutos atrás, Mayrinck Bernardo disse:

maior, totalsalario

 

Recomendo declarar essas variáveis definindo o valor inicial delas, no caso 0.

 

9 minutos atrás, Mayrinck Bernardo disse:

media = totalsalario;

 

Você poderia só calcular a media no final, não tem necessidade a cada volta executar essa linha.

 

11 minutos atrás, Mayrinck Bernardo disse:

printf ("a media de salarios foi %.2f\n",media/qtd);

 

Existe uma possibilidade desse tipo declaração bugar, recomendo calcular a media antes do printf e depois exibi-la

 

media = totalsalario / qtd;
printf ("a media de salarios foi %.2f\n",media);

 

 

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

  • Solução

@Venus Guy

1 hora atrás, Venus Guy disse:

@Mayrinck Bernardo dessa forma ainda não aprendi, usando switch e o case, mas obrigado por tentar

#include <stdio.h>
#include <string.h>
int main(){
char nome [50] , endereco [70] , email [50], maioral[50], telefone[12];
    float salario, media, maior,totalsalario;
    int qtd=0,c;

    do{
            printf("nome:\n");
            fflush(stdin);
            gets(nome);
            
            printf("endereco:\n");
            gets(endereco);
            
            printf("telefone:\n");
            gets(telefone);
            
            printf("email:\n");
            gets(email);
            
            printf("salario:\n");
            scanf("%f",&salario);
            if (salario>maior){
            	maior = salario;
            	strcpy(maioral,nome);
			}
            totalsalario = totalsalario+salario;
            qtd = qtd +1;
            media = totalsalario;
            
         	printf("para cadastrar outro tecle 1 senao digite outro numero\n");
         	fflush(stdin);
  		 	scanf("%d",&c);
 		  	}while(c==1);
 		  	
 		  	printf ("o total de salarios foi %.2f\n",totalsalario);
        	printf ("a media de salarios foi %.2f\n",media/qtd);
       	 	printf ("o maior salarios foi %.2f\n",maior);
        	printf ("o maior salarios foi de %s\n",maioral);
 			  }
 	
   		
         
        
    
    

 

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

8 horas atrás, Venus Guy disse:

o que está dando errado são os valores, não ta somando, e também não mostra o maior e menor valor corretos, nem a media e a soma dos salários porque não sei se coloquei no lugar correto

 

Então pelo enunciado não funciona nadinha...

 

Entenda que o enunciado nada fala sobre um cadastro real. Nada. Você só precisa de informações sintéticas: maior, menor, média e soma. Só precisa mesmo de um "registro" e pode deixar mesmo tudo separado.

 

Mas você se esqueceu de salvar o nome dos caras que ganham mais ou menos.

 

Basta um loop. Você  lê um cara trata os valores e continua. Se terminou calcula a média, que é trivial porque o total você já tem que ter mesmo. E o número de caras você deve ir contando um a um. O maior e o menor e os nomes você vai acompanhando conforme entram. Como os salários são todos positivos basta começar por zero.

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

Também poderia ser feito assim:

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

#define limparTela system("clear")  // No Windows mude para "cls"
#define separador "------------------------------------------ \n"

typedef struct {
    char nome[255];
    char endereco[255];
    char telefone[255];
    char email[255];
    double salario;
} Funcionario_t;

int main() {
    const char FLAG_S[5] = "sim";
    const char FLAG_N[5] = "nao";
    char resposta[5] = "";

    const int maximo = 1000;
    int posicao = 0;

    double soma = 0.0;
    double media = 0.0;

    Funcionario_t funcionarios[maximo];
    Funcionario_t funcionarioMaiorSalario = {"", "", "", "", DBL_MIN};
    Funcionario_t funcionarioMenorSalario = {"", "", "", "", DBL_MAX};

    do {
        limparTela;
        printf("Cadastrar? [ sim / nao ]: ");
        scanf(" %s", resposta);

        if (strcmp(resposta, FLAG_S) == 0) {
            printf("Nome: ");
            scanf(" %[^\n]s", funcionarios[posicao].nome);
            printf("Endereço: ");
            scanf(" %[^\n]s", funcionarios[posicao].endereco);
            printf("Telefone: ");
            scanf(" %[^\n]s", funcionarios[posicao].telefone);
            printf("E-mail: ");
            scanf(" %[^\n]s", funcionarios[posicao].email);
            printf("Salário: ");
            scanf(" %lf", &funcionarios[posicao].salario);

            if (funcionarios[posicao].salario > funcionarioMaiorSalario.salario) {
                funcionarioMaiorSalario = funcionarios[posicao];
            }

            if (funcionarios[posicao].salario < funcionarioMenorSalario.salario) {
                funcionarioMenorSalario = funcionarios[posicao];
            }

            soma += funcionarios[posicao].salario;
            posicao += 1;
        }
    } while (strcmp(resposta, FLAG_N) != 0 && posicao < maximo);

    if (posicao > 0) {
        // Precisa ter ao menos um funcionário cadastrado.
        media = soma / posicao;

        limparTela;
        printf(separador);
        printf(" Soma: R$ %8.2f \n", soma);
        printf("Média: R$ %8.2f \n", media);
        printf("Maior: R$ %8.2f (%s) \n", funcionarioMaiorSalario.salario, funcionarioMaiorSalario.nome);
        printf("Menor: R$ %8.2f (%s) \n", funcionarioMenorSalario.salario, funcionarioMenorSalario.nome);
        printf(separador);
    }

    return 0;
}

 

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

4 horas atrás, AdrianoSiqueira disse:

Também poderia ser feito assim

 

Sim, poderia.
Mas se for algo que valha nota certamente vai ser penalizado: está alocando nada menos que 1002 estruturas sendo que não precisa de nenhuma:

Veja o caso dos e-mail, endereços e telefones: está alocando, salvando e descartando esses valores todos.  Basta salvar o nome e salário para o maior e menor salário e manter atualizado conforme entram mais dados. E contando quantos leu e somando os salários.

Quando acabar você divide o total de salários pelo total de funcionários e mostra a média e todo o resto.

 

@AdrianoSiqueira Note que não precisa de fato de mais duas estruturas além das que já tem. Basta salvar o índice do maior e menor salário... De todo modo não é uma boa solução, como expliquei.

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

@arfneto Acho que entendi o que você quis dizer, eu só achei que poderia ser útil ir armazenando os dados. E que tal assim?

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

#define limparTela system("clear")  // No Windows mude para "cls"
#define separador "------------------------------------------ \n"

typedef struct {
    char nome[255];
    char endereco[255];
    char telefone[255];
    char email[255];
    double salario;
} Funcionario_t;

typedef struct {
    char nome[255];
    double salario;
} FuncionarioSimples_t;

int main() {
    const char FLAG_S[5] = "sim";
    const char FLAG_N[5] = "nao";
    char resposta[5] = "";

    int quantidade = 0;

    double soma = 0.0;
    double media = 0.0;

    Funcionario_t funcionario;
    FuncionarioSimples_t funcionarioMaiorSalario = {"", DBL_MIN};
    FuncionarioSimples_t funcionarioMenorSalario = {"", DBL_MAX};

    while (strcmp(resposta, FLAG_N) != 0) {
        limparTela;
        printf("Cadastrar? [ sim / nao ]: ");
        scanf(" %s", resposta);

        if (strcmp(resposta, FLAG_S) == 0) {
            printf("Nome: ");
            scanf(" %[^\n]s", funcionario.nome);
            printf("Endereço: ");
            scanf(" %[^\n]s", funcionario.endereco);
            printf("Telefone: ");
            scanf(" %[^\n]s", funcionario.telefone);
            printf("E-mail: ");
            scanf(" %[^\n]s", funcionario.email);
            printf("Salário: ");
            scanf(" %lf", &funcionario.salario);

            if (funcionario.salario > funcionarioMaiorSalario.salario) {
                strcpy(funcionarioMaiorSalario.nome, funcionario.nome);
                funcionarioMaiorSalario.salario = funcionario.salario;
            }

            if (funcionario.salario < funcionarioMenorSalario.salario) {
                strcpy(funcionarioMenorSalario.nome, funcionario.nome);
                funcionarioMenorSalario.salario = funcionario.salario;
            }

            soma += funcionario.salario;
            quantidade += 1;
        }
    }

    if (quantidade > 0) {
        media = soma / quantidade;

        limparTela;
        printf(separador);
        printf(" Soma: R$ %8.2f \n", soma);
        printf("Média: R$ %8.2f \n", media);
        printf("Maior: R$ %8.2f (%s) \n", funcionarioMaiorSalario.salario, funcionarioMaiorSalario.nome);
        printf("Menor: R$ %8.2f (%s) \n", funcionarioMenorSalario.salario, funcionarioMenorSalario.nome);
        printf(separador);
    }

    return 0;
}

Você disse que não precisava de nenhuma estrutura, mas acredito que elas aprimoram muito a legibilidade do código.

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

Em 17/12/2019 às 18:12, AdrianoSiqueira disse:

Você disse que não precisava de nenhuma estrutura, mas acredito que elas aprimoram muito a legibilidade do código

 

Tem razão. E ao juntar as variáveis sob um único nome também muitos problemas, como a passagem de parâmetros. E podendo tratar tudo por um único nome facilita muito a manutenção.

 

Só disse que não é necessário porque acho importante ver o enunciado como um contrato de serviço: você não precisa e muitas vezes não pode fazer mais do que está escrito lá. E alocar mil estruturas ou 1002 para ao final calcular a média e outros valores sintéticos é um caso desses de ir além do necessário.

adicionado 15 minutos depois

@Venus Guy conseguiu terminar o exercício?

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