Ir ao conteúdo
  • Cadastre-se

C cadastro funcionários usando 3 funções


jpaulofsa

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
Link para o comentário
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
Link para o comentário
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
Link para o comentário
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...

 

 

Link para o comentário
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
Link para o comentário
Compartilhar em outros sites

  • 9 meses depois...

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