Ir ao conteúdo
  • Cadastre-se
jpaulofsa

C cadastro funcionários usando 3 funções

Posts recomendados

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

struct funcionario { //cria a struct funcionario 
	char nome[50]; //cria a variável nome 
	float salario; //cria a variável salario
};

typedef struct funcionario funcionario_t; 

void cadastra_funcionario ()
{
	//função que cadastra um novo funcionário
	funcionario_t lista_funcionarios[50];
	funcionario_t novo_funcionario;
	int tamanho_lista = 0;
	printf("Informe o nome do funcionario \n");
	scanf("\n%s", &novo_funcionario.nome);
	printf("Informe o salario do funcionario \n");
	scanf("\n%f", &novo_funcionario.salario);
	lista_funcionarios[tamanho_lista] = novo_funcionario;
	tamanho_lista++;
	//fim da função que cadastra um novo funcionário
}

funcionario_t maior_salario(funcionario_t lista_funcionarios[], int tamanho_lista)
{
	//função que encontra o funcionário com maior salário
	//int tamanho_lista = 0;
	if (tamanho_lista > 0) {
					int i, maior_indice;
					float maior_salario = 0;
					for (i = 0; i < tamanho_lista; i++) {
						if (lista_funcionarios[i].salario > maior_salario) {
					maior_salario = lista_funcionarios[i].salario;
					maior_indice = i;
				}
			printf("Nome: %s\n", lista_funcionarios[maior_indice]);
			printf("Maior salario: %f\n", maior_salario);
			}
	}
	//fim da função que encontra o funcionário com maior salário
}

int main(void) //função responsável por perguntar ao usuário se deseja cadastrar funciOnário ou saber o maior salário
{
	funcionario_t lista_funcionarios[50];
	int tamanho_lista = 0;
	int continuar = 1;
	char opcao;
	do {
		printf ("Digite C para cadastrar ou M  para saber o maior salario \n");
		scanf("\n\n%c", &opcao);
		switch (opcao) {
			case 'C':
				cadastra_funcionario(lista_funcionarios, tamanho_lista);
				tamanho_lista++;
				break;
			case 'M':
				maior_salario(lista_funcionarios, tamanho_lista);
				break;
			default:
				continuar = 0;
		}
	} while (continuar ==1); {
	//fim da função responsável por perguntar ao usuário se deseja cadastrar funcionário ou saber o maior salário
	system("pause");
	return 0;
	}
}

Boa noite, tentei criar um programa que cadastra funcionários e seus respectivos salários. Este se utiliza de 3 funções: main, cadastra_funcionario e maior_salario, acontece que quando o usuário solicita o maior salário, O PROGRAMA retorna (através do printf) o nome e o salário de todos os cadastrados e sem nenhum valor. outra coisa é que o programa só aceita como dado de entrada 'C' ou 'M' em maiúsculas para cadastrar ou saber o maior salário. Já quebrei a cabeça e nada, alguém poderia me ajudar?   

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Código fixado:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>         // Uso da função toupper

struct funcionario { //cria a struct funcionario 
    char nome[50]; //cria a variável nome 
    float salario; //cria a variável salario
};

funcionario lista_funcionarios[50]; // Precisa ser definida como global ou ser definida dentro da função main e passar ela como argumento para as outras funções

void cadastra_funcionario (int& tamanho_lista)
{
    //função que cadastra um novo funcionário
    printf("Informe o nome do funcionario \n");
    scanf("\n%s", &lista_funcionarios[tamanho_lista].nome);
    
    printf("Informe o salario do funcionario \n");
    scanf("\n%f", &lista_funcionarios[tamanho_lista].salario);
    tamanho_lista++;
    //fim da função que cadastra um novo funcionário
}

funcionario maior_salario(funcionario lista_funcionarios[], int tamanho_lista)
{
    //função que encontra o funcionário com maior salário
    //int tamanho_lista = 0;
    if (tamanho_lista > 0) 
    {
        int i, maior_indice;
        float maior_salario;
        for (i = 0; i < tamanho_lista; i++) 
        {
            if (lista_funcionarios[i].salario > maior_salario) 
            {
                maior_salario = lista_funcionarios[i].salario;
                maior_indice = i;
            }
        }
        printf("Nome: %s\n", lista_funcionarios[maior_indice].nome);
    	printf("Maior salario: %f\n", maior_salario);
    }
    //fim da função que encontra o funcionário com maior salário
}

int main(void) //função responsável por perguntar ao usuário se deseja cadastrar funciOnário ou saber o maior salário
{
    int tamanho_lista = 0;
    int continuar = 1;
    char opcao;
    do {
        printf ("Digite C para cadastrar ou M  para saber o maior salario \n");
        scanf("\n\n%c", &opcao);
        opcao = toupper(opcao); // A linguagem C é uma linguagem case sensitive, então precisa converter para maiusculo nesse caso
        switch (opcao) {
            case 'C':
                cadastra_funcionario(tamanho_lista);
                break;
            case 'M':
                maior_salario(lista_funcionarios, tamanho_lista);
                break;
            default:
                continuar = 0;
        }
    } while (continuar ==1); {
    //fim da função responsável por perguntar ao usuário se deseja cadastrar funcionário ou saber o maior salário
    system("pause");
    return 0;
    }
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem vários erros. De uma estudada no código, se tiver problemas para entender alguma parte pergunte.
 

#include <stdio.h>
#include <ctype.h>         // Uso da função toupper

struct funcionario {
    char nome[50];
    float salario;
};

struct funcionario lista_funcionarios[50];

void cadastra_funcionario (int* tamanho_lista) {

    printf("Informe o nome do funcionario \n");
    scanf("%s[^\n]%*c", lista_funcionarios[*tamanho_lista].nome);

    printf("Informe o salario do funcionario \n");
    scanf("%f%*c", &lista_funcionarios[*tamanho_lista].salario);
    (*tamanho_lista)++;
}

void maior_salario( struct funcionario lista_funcionarios[], int* tamanho_lista) {
    if (*tamanho_lista > 0) {
        int i, maior_indice = 0;
        float maior_salario = 0;
        for (i = 0; i < *tamanho_lista; i++) {
            if (lista_funcionarios[i].salario > maior_salario) {
                maior_salario = lista_funcionarios[i].salario;
                maior_indice = i;
            }
        }
        printf("Nome: %s\n", lista_funcionarios[maior_indice].nome);
        printf("Maior salario: %f\n", maior_salario);
    }

}

int main(void) {
    int tamanho_lista = 0;
    int continuar = 1;
    char opcao;
    do {
        printf ("Digite C para cadastrar ou M  para saber o maior salario \n");
        scanf("%c%*c", &opcao);
        opcao = toupper(opcao);
        switch (opcao) {
        case 'C':
            cadastra_funcionario( &tamanho_lista);
            break;
        case 'M':
            maior_salario( lista_funcionarios, &tamanho_lista);
            break;
        default:
            continuar = 0;
        }
    } while (continuar ==1);


    getchar();
    return 0;
}

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 08/01/2018 às 23:32, cyer disse:

Código fixado:


#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>         // Uso da função toupper

struct funcionario { //cria a struct funcionario 
    char nome[50]; //cria a variável nome 
    float salario; //cria a variável salario
};

funcionario lista_funcionarios[50]; // Precisa ser definida como global ou ser definida dentro da função main e passar ela como argumento para as outras funções

void cadastra_funcionario (int& tamanho_lista)
{
    //função que cadastra um novo funcionário
    printf("Informe o nome do funcionario \n");
    scanf("\n%s", &lista_funcionarios[tamanho_lista].nome);
    
    printf("Informe o salario do funcionario \n");
    scanf("\n%f", &lista_funcionarios[tamanho_lista].salario);
    tamanho_lista++;
    //fim da função que cadastra um novo funcionário
}

funcionario maior_salario(funcionario lista_funcionarios[], int tamanho_lista)
{
    //função que encontra o funcionário com maior salário
    //int tamanho_lista = 0;
    if (tamanho_lista > 0) 
    {
        int i, maior_indice;
        float maior_salario;
        for (i = 0; i < tamanho_lista; i++) 
        {
            if (lista_funcionarios[i].salario > maior_salario) 
            {
                maior_salario = lista_funcionarios[i].salario;
                maior_indice = i;
            }
        }
        printf("Nome: %s\n", lista_funcionarios[maior_indice].nome);
    	printf("Maior salario: %f\n", maior_salario);
    }
    //fim da função que encontra o funcionário com maior salário
}

int main(void) //função responsável por perguntar ao usuário se deseja cadastrar funciOnário ou saber o maior salário
{
    int tamanho_lista = 0;
    int continuar = 1;
    char opcao;
    do {
        printf ("Digite C para cadastrar ou M  para saber o maior salario \n");
        scanf("\n\n%c", &opcao);
        opcao = toupper(opcao); // A linguagem C é uma linguagem case sensitive, então precisa converter para maiusculo nesse caso
        switch (opcao) {
            case 'C':
                cadastra_funcionario(tamanho_lista);
                break;
            case 'M':
                maior_salario(lista_funcionarios, tamanho_lista);
                break;
            default:
                continuar = 0;
        }
    } while (continuar ==1); {
    //fim da função responsável por perguntar ao usuário se deseja cadastrar funcionário ou saber o maior salário
    system("pause");
    return 0;
    }
}

 

muito obrigado

adicionado 8 minutos depois

@cyer muito obrigado.

adicionado 21 minutos depois

@vangodp muito obrigado. Não conhecia essa biblioteca: #include <ctype.h>.

Minha dúvida é:

    printf("Informe o nome do funcionario \n");
    scanf("%s[^\n]%*c", lista_funcionarios[*tamanho_lista].nome);

    printf("Informe o salario do funcionario \n");
    scanf("%f%*c", &lista_funcionarios[*tamanho_lista].salario);

1. Porque o segundo scanf armazena o salário do funcionário (através do &) e o primeiro scanf não?

2. qual o objetivo  do primeiro comando scanf percorrer os caracteres ([^\n])?

3. qual o objetivo do getchar() no final do programa?

Fico muito grato se puder esclarecer-me essas dúvidas, tenho outras dificuldades, mas acredito que é por estar tendo os primeiro contatos e logo logo serão sanadas...

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
37 minutos atrás, jpaulofsa disse:

1. Porque o segundo scanf armazena o salário do funcionário (através do &) e o primeiro scanf não?

Não devemos por & adiante de strings e nem de ponteiros. O motivo no caso do string, é que um string, na verdade não passa de um conjunto de chars apontado por um ponteiro na sua primeira casa, então na realidade não colocamos & adiante de ponteiros, porém como uma string, como ja falei, é apontada por um ponteiro na sua primeira casa.

Um scanf, no caso de ler uma string, somente precisa saber a partir de onde precisa ser inserido o primeiro caractere, passar lista_funcionarios[*tamanho_lista].nome para o scanf, é exatamente o mesmo que &lista_funcionarios[*tamanho_lista].nome[0], mas note que desta vez sim indico que quero escrever desde a primeira posição do vetor de forma implícita, e que desta vez sim insiro o operador & adiante. Agora acho que da para meio que entender o problema, incluir o & adiante de lista_funcionarios[*tamanho_lista].nome, é a mesma coisa que fazer &&lista_funcionarios[*tamanho_lista].nome[0], ou seja, por um & adiante de outro(2). Lembre que quando eu ponho & adiante de uma variável eu me refiro a sua direção, então por duas vezes o && adiante, é erro certo, o que eu quero é passar a direção do primeiro char do vetor, mesmo assim que poderia passar qualquer outra posição. Em outras palavras, o lista_funcionarios[*tamanho_lista].nome é a mesma coisa que &lista_funcionarios[*tamanho_lista].nome[0], e por isso não preciso por & adiante, é mais fácil de escrever da primeira forma, porém da segunda, posso indicar que quero começar a escrever desde qualquer outra posição, tipo &lista_funcionarios[*tamanho_lista].nome[5], ou &lista_funcionarios[*tamanho_lista].nome[10] ou &lista_funcionarios[*tamanho_lista].nome[45], por exemplo, mas se faço lista_funcionarios[*tamanho_lista].nome, sem o &, e sem o índice, quer dizer que me refiro ao inicio do vetor.

Ufa! Espero ter explicado bem, se não entender posso mostrar-lhe alguns exemplos para ilustrar.

 

54 minutos atrás, jpaulofsa disse:

2. qual o objetivo  do primeiro comando scanf percorrer os caracteres ([^\n])?

Percorrer? Como assim?
A explicação para %s[^\n]%*c" é que
%s lê um scanf
[^\n] sem importar o que, aceitando espaços, coisa que sem isso, é impossível. Tente ler "banana nanica" com %s e você vai entender.
%*c ignora o enter evitando que entre no buffer e cause erros. E também usar o fflush junto com stdin
 

adicionado 1 minuto depois
1 hora atrás, jpaulofsa disse:

3. qual o objetivo do getchar() no final do programa?

Pausar o programa em vez de fazer uma chamada ao system. Isso evita você precisar incluir uma biblioteca como stdlib só para pausar seu programa, fazendo ele ficar mais ligeiro.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@vangodp obrigado! excelente explicação, ajudou-me muito.

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

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

×
×
  • Criar novo...

Aprenda_a_Ler_Resistores_e_Capacitores-capa-3d-newsletter.jpg

ebook grátis "Aprenda a ler resistores e capacitores", de Gabriel Torres

GRÁTIS! BAIXE AGORA MESMO!