Ir ao conteúdo
  • Cadastre-se

C Linguagem C problema em resolver o código


Andrah

Posts recomendados

 /* É que eu não estou conseguindo resolver esse Programa :(  

1. Escreva uma função, que insira dados de N funcionários da Universidade Cabo Verde e envia-los para ficheiro como o nome 
funcionarios.txt (o programa deverá informar quantos funcionários deseja inserir no sistema?);

2. Escreva uma função, que imprima registos de todos os funcionários que se encontra no ficheiro com o nome funcionarios.txt, inserido 
anteriormente?

3. Escreva uma função, que imprima os funcionários por categoria.

4. Escreva uma função, que permite calcular quanto gasta a universidade com os funcionários por categoria?

5. Temos três tipos de categorias dos funcionários [Docente, Diretor e Técnico], sabendo que o funcionário que é Docente recebe 2500$ 
por cada hora, um Diretor recebe 3500$ por hora, e um Técnico recebe 1500$ por hora. Escreva uma função, que mostra o salário de 
um determinado funcionário dependendo do seu salário liquido por hora, sabendo que INPS é de 12%, IUR é de 20% e sindicato é de 
1%; 

6. Escreva uma função, que ordena os funcionários na ordem crescentes e envia-los para o ficheiro com o nome 
ordenar_funcionarios.txt;

7. Escreva uma função, que imprima todos os funcionários com salario maior que 75000$.

8. Escreva uma função, que dado nº de NIF permite eliminar todas as informações desse funcionário.  

*/


//bibliotecas
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
#include <conio.h>
#include <time.h>


//Dados do funcionário
struct Funcionario {
    char nome[20];
    int NIF[20];
    char categoria[20];
    float salario;
    int Hora_Trabalhados;
};

// Para não atrapalhar o bom funcionamento
void pressioneEnter() {
    char c;
    do {
        c = getch();
    } while (c != 13);
}



void IncerirFuncionario(struct Funcionario funcionario[],int n) {
    system("COLOR 0F");
    int i;
    FILE *file; // cria variável ponteiro para o arquivo
    file= fopen("funcionarios.txt", "w"); //abrindo o arquivo
    if(file == NULL) //testando se o arquivo foi realmente criado
        printf("\n-->Nao foi possivel abrir o fecheiro\n\n");
    else {
        printf ("\n\n\n\n\tUNICV \n\n");
        printf("\n\n\n\t\tDigite o numero de Funcionarios que pretende registrar: ");
        scanf("%i",&n);
        fflush(stdin);
        system("cls");
        static int i=0;
        int y=n+i;
        if(y>99)
            menu(funcionario,n);
        printf("\n\n\n\t\t-------- INSCRIÇÃO DE FUNCIONÁRIO --------\n\n");
        fprintf(file,"\n\n\t----- LISTA DOS FUNCIONÁRIOS ----\n\n");
        fprintf(file,"\tNome      NIF 	  Salário     Categoria  Horas\n\n");
        for(; i<y; i++) {
            system("COLOR 0B");
            // para obter dados e armazenar no arquivo
            printf("\n\tDigite o nome do funcionário: ");
            scanf(" %s",&funcionario[i].nome);
            printf("\n\tDigite o NIF do funcionário: ");
            scanf("%d",&funcionario[i].NIF);
            printf("\n\tDigite o salario do funcionario: ");
            scanf("%f", &funcionario[i].salario);
            printf("\n\tDigite a categoria do funcionário: ");
            scanf(" %s", &funcionario[i].categoria);
            printf("\n\tDigite a Hora trabalhados pelo funcionário: ");
            scanf("%d", &funcionario[i].Hora_Trabalhados);
            printf("\n\n");
            //A Escrevendo no arquivo
            fprintf(file,"\t%s \t %d \t %.1f \t %s\t %d\n",funcionario[i].nome,funcionario[i].NIF,funcionario[i].salario,funcionario[i].categoria,funcionario[i].Hora_Trabalhados);
        }
        printf("\n\t\t-------------------------<3--------------------------\n");
        printf("\n\t Incritos com sucesso! \n\n\t Registado no fecheiro -> funcionarios.txt\n\n");
        printf ("\n\n\n\t\t\tPressione ENTER para Continuar->");
        fflush(stdin);
        pressioneEnter();
        system("cls");
        menu(funcionario,y);
    }
    fclose(file); // para fechar o arquivo
}

void ImprimirFuncionarios(struct Funcionario funcionario[],int n) {
    FILE *file;

    file = fopen("C:\\Users\\alex\\Desktop\\teste4\\funcionarios.txt", "r");
    if(file == NULL)
        printf("\n-->Nao foi possivel abrir o fecheiro\n\n");

    else {
        int i;
        printf("\n\n\n\t\t------- LISTA DOS FUNCIONÁRIOS ------\n\n");
        for(i=0; i<n; i++) {
            system("COLOR 0F");
            fscanf(file,"%s",funcionario[i].nome);
            fscanf(file,"%d",funcionario[i].NIF);
            fscanf(file,"%.1f $00",funcionario[i].salario);
            fscanf(file,"%s",funcionario[i].categoria);
            fscanf(file,"%d horas",funcionario[i].Hora_Trabalhados);
            printf("\n\tNome: %s",funcionario[i].nome);
            printf("\n\tNIF: %d",funcionario[i].NIF);
            printf("\n\tSalario: %.1f $00", funcionario[i].salario);
            printf("\n\tCategoria: %s",funcionario[i].categoria);
            printf("\n\tHoras de trabalho: %d horas", funcionario[i].Hora_Trabalhados);
            printf("\n\n----------------------------------------------------------\n");
        }
    }

    printf ("\n\n\n\t\t\tPressione ENTER para Continuar->");
    fflush(stdin);
    pressioneEnter();
    system("cls");
    fclose(file);

}
void OrdenarFuncionario(struct Funcionario *funcionario,int n) {

    int i, j;
    struct Funcionario aux;

    for (i=1; i<n; i++) {
        aux = funcionario[i] ;

        for (j=i; (j>0)&&(aux.salario < funcionario[j-1].salario);j--) {
            funcionario[j]=funcionario[j-1];
            funcionario[j] = aux;
        }

    }
    printf("\n\n\n\t------- LISTA DOS FUNCIONÁRIOS POR ORDEM CRESCENTE ------\n\n");

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

        printf("\n\tNome: %s",funcionario[i].nome);
        printf("\n\tNIF: %d",funcionario[i].NIF);
        printf("\n\tSalario: %.1f $00", funcionario[i].salario);
        printf("\n\tCategoria: %s",funcionario[i].categoria);
        printf("\n\tHoras de trabalho: %d horas", funcionario[i].Hora_Trabalhados);
        printf("\n\n----------------------------------------------------------\n");

    }

    printf ("\n\n\n\t\t\tPressione ENTER para Continuar->");
    fflush(stdin);
    pressioneEnter();
    system("cls");
}


void EliminarFuncionario(struct Funcionario funcionario[],int n) {
    FILE *file;

    //Abre o arquivo novamente para leitura
    file = fopen("funcionarios.txt", "r+");
    if(file == NULL)
        printf("\n-->Nao foi possivel abrir o fecheiro\n\n");

    else {
        int nif, i;
        char resp;
        printf("\n\tInforme o NIF do funcionario a ser Eliminado: ");
        scanf("%d",&nif);

        while( funcionario[i].NIF == nif ) {

            //if ( funcionario[i].ativo== 1 ) {

                printf("\n\tNome: %s",funcionario[i].nome);
                printf("\n\tNIF: %d",funcionario[i].NIF);
                printf("\n\tSalario: %.1f $00", funcionario[i].salario);
                printf("\n\tCategoria: %s",funcionario[i].categoria);
                printf("\n\tHoras de trabalho: %d horas", funcionario[i].Hora_Trabalhados);
                printf("\n\n----------------------------------------------------------\n");
           // }
            printf("\n\tDeseja realmente eliminar o Funcionário? S/N:");
            scanf("%c",&resp);

            if ( ( resp == 'S' ) || ( resp == 's' ) ) {
             //   funcionario[i].ativo=0;
                printf("\n\tFuncionário eliminado com sucesso\n");
                break;
            } else {
                if ( ( resp == 'N' ) || ( resp == 'n' ) ) {
                    printf("\tEliminação cancelada!\n");
                    break;
                }
            }
        }
        i++;

        if ( i > 99 )
            printf("\n\n\t\tNIF não encontrado\n");
    }
    fclose(file);
    printf ("\n\n\n\t\t\tPressione ENTER para Continuar->");
    fflush(stdin);
    pressioneEnter();
    system("cls");
}

void menu(struct Funcionario funcionario[],int n) {
    int op;
    do {
        system("COLOR 0F");  //Menu
        printf("\n\n\t\t\t\t---> SISTEMA DE REGISTO E CONTROLE DE FUNCIONÁRIO \n\n");
        printf("\n\t\t* 1 ------- INSERIR OS FUNCIONÁRIOS E ENVIA-LOS PARA O FICHEIRO ------------------------ *\n");
        printf("\n\t\t* 2 ------- IMPRIMIR A LISTA DOS FUNCIONÁRIOS DO FICHEIRO ------------------------------ *\n");
        printf("\n\t\t* 3 ------- IMPRIMIR OS FUNCIONÁRIOS POR CATEGORIA ------------------------------------- *\n");
        printf("\n\t\t* 4 ------- GASTO DA UNIVERSIDADE COM OS FUNCIONÁRIOS ---------------------------------- *\n");
        printf("\n\t\t* 5 ------- CALCULAR O SALÁRIO DE UM FUNCIONÁRIO X EM FUNÇÃO DO SEU SALÁRIO POR HORA --- *\n");
        printf("\n\t\t* 6 ------- ORDENAR FUNCIONÁRIO NA ORDEM CRESCENTE ------------------------------------- *\n");
        printf("\n\t\t* 7 ------- IMPRIMIR OS FUNCIONÁRIOS COM SALÁRIO MAIOR QUE 75000$ ---------------------- *\n");
        printf("\n\t\t* 8 ------- ELIMINAR UM FUNCIONÁRIO A PARTIR DO Nº DO NIF ------------------------------ *\n");
        printf("\n\t\t* 0 ------- Sair\n\n");
        printf("\n\tEscolha uma opcao: ");
        scanf("%d",&op);
        printf("\n");
        switch (op) {
        case 0:
            printf("\t\t\t\t\t\t\t\t\t\t-> Saindo... \n");
            printf ("\tPressione ENTER para Sair->");
            fflush(stdin);
            pressioneEnter();
            system("cls");
            break;
        case 1:
            system("cls");
            IncerirFuncionario(funcionario,n);
            break;
        case 2:
            system("cls");
            ImprimirFuncionarios(funcionario,n);
            break;
        case 6:
            system("cls");
            OrdenarFuncionario(funcionario,n);
            break;
        case 8:
            system("cls");
            EliminarFuncionario(funcionario,n);
            break;
        default:
            system("COLOR C0");
            printf("\n\t\t\t\t*-*-*-*-- ERRO --> Numero INVALIDO!\n\n");
            printf ("\n\tPressione ENTER para Tentar Novamente->");
            fflush(stdin);
            pressioneEnter();
            system("cls");
        }
    } while (op != 0);

}
int main() {
    setlocale(LC_ALL, "Portuguese");
    struct Funcionario funcionario[100];
    int n;
     int *p;
    p = (struct Funcionario *)malloc(sizeof(struct Funcionario));

    if (p == NULL) {
        printf("\n\t ERRO MEMÓRIA INSUFICIENTE!\n");
        exit(1);//Terminar o programa
    }
    system("COLOR F0"); //Abertura do programa
    printf("\n\n\n\n\n\t\t\t....................................................................\n");
    printf("\n\t\t\t\t----> SISTEMA DE REGISTO E CONTROLE DE FUNCIONÁRIO \n");
    printf("\n\t\t\t.....................................................................\n\n\n\n\n");
    printf ("\n\t\t\t                                                                      UNICV \n\n");
    printf ("\n\tPressione ENTER para iniciar->");
    fflush(stdin);
    pressioneEnter();
    system("cls");
    menu(funcionario,n);
     free(p);
    return 0;
}

 

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

você esqueceu por o prototipo da função menu antes de main. Em C/C++ tudo o que for usado deve estar declarado antes, a implementação você pode levar para outro lugar, incluindo outro arquivo.

continuo...
 

adicionado 4 minutos depois

ok... tem mais problemas. Um momento hehe

adicionado 5 minutos depois

na função IncerirFuncionario você chama ao menu, e antes de IncerirFuncionario não existe menu, somente ponha

void menu ( struct Funcionario funcionario[], int n )

antes da função

adicionado 6 minutos depois

Ja estudou sobre protótipos de funções? Lhe ajudará evitar esses "erros"

adicionado 8 minutos depois
Spoiler

Screenshot_6.png.fbc21880caa548d8f3a779967bf99a78.png

 

adicionado 12 minutos depois

se você for ler strings não ponha & adiante:

scanf ( " %s", &funcionario[i].nome ); //<- tire o &.


Regra de ouro... NUNCA POR & ADIANTE DE STRINGS OU PONTEIROS. Como ponteiros é muito raro que você use scanf para atribuir valor ao menos lembre de n por & adiante de strings... "NUNCA". 😆 Isso arruma um montão de avisos

Para ler o nome do funcionario basta:

scanf ( " %s", funcionario[i].nome );

 

adicionado 14 minutos depois

Aqui:
Screenshot_3.png.ffa3149938d98a54743104510187cd78.png

 

O usuario tem 20 NIFs?

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

32 minutos atrás, vangodp disse:

você esqueceu por o prototipo da função menu antes de main. Em C/C++ tudo o que for usado deve estar declarado antes, a implementação você pode levar para outro lugar, incluindo outro arquivo.

continuo...
 

//Obrigado :)
//Funções declarads antes do main:
void menu(struct Funcionario funcionario[],int n);
void IncerirFuncionario(struct Funcionario funcionario[],int n);
void ImprimirFuncionarios(struct Funcionario funcionario[],int n);
void ImprimirFuncionariosCategoria(struct Funcionario funcionario[],int n);
void GastoFuncionario( struct Funcionario funcionario[],int n);
void CalcularSalario( struct Funcionario funcionario[], int n);
void OrdenarFuncionario(struct Funcionario* funcionario, int n);
void ImprimirFuncionariosSalario(struct Funcionario funcionario[],int n);
void EliminarFuncionario( struct Funcionario funcionario[], int n);

 

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

porque aqui na hora de ler ta perguntando em qual dos 20 nifs fazer a inserção...

scanf ( "%d", &funcionario[i].NIF );

o programa pensa que são 20 nifs então você teria:

scanf ( "%d", &funcionario[0].NIF );

scanf ( "%d", &funcionario[1].NIF );

scanf ( "%d", &funcionario[2].NIF );
...
scanf ( "%d", &funcionario[19].NIF );

 

adicionado 0 minutos depois

@Andrah Correto...! Agora você pode chamar qualquer função desde qualquer função >_<

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

3 minutos atrás, vangodp disse:

porque aqui na hora de ler ta perguntando em qual dos 20 nifs fazer a inserção...


scanf ( "%d", &funcionario[i].NIF );

o programa pensa que são 20 nifs então você teria:


scanf ( "%d", &funcionario[0].NIF );

scanf ( "%d", &funcionario[1].NIF );

scanf ( "%d", &funcionario[2].NIF );
...
scanf ( "%d", &funcionario[19].NIF );

 

adicionado 0 minutos depois

@Andrah Correto...! Agora você pode chamar qualquer função desde qualquer função >_<

O nif não deveria ser um vector certo?

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

3 minutos atrás, vangodp disse:

Se você n tiver 20 nifs então mude de int NIF[20]; para int NIF;.
Um conselho.... somente use letras maiusculas para constantes tipo:
const int NIF;
ou
#define  numeroNIFs 20

Não são 20 NIFs kkkk

é int NIF. 

Ta bom Obrigado

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

ok... arrume isso então hehe, sobre tudo onde tiver lendo e imprimindo esses nifs

adicionado 0 minutos depois

talvez seja interessante guardar o nif em uma string

adicionado 3 minutos depois

assim você pode tomar os dados desse jeito"000.000.000-00"

adicionado 4 minutos depois

é só uma ideia hehe

adicionado 8 minutos depois

É preciso usar malloc para alocar uma única estrutura em main?

adicionado 8 minutos depois

Em todo caso o tipo do ponteiro deveria ser struct Funcionario * e n int

adicionado 9 minutos depois

se malloc retorna struct Funcionario * você precisa de um ponteiro igual(struct Funcionario* p)

 

adicionado 12 minutos depois

Dentro da função EliminarFuncionario...

printf ( "\n\tNome: %s", funcionario[i].nome );

 

O i, não tem valor inicial, essa chamada pode bugar seu programa. O correto é int nif, i=0;

adicionado 14 minutos depois

nessa mesma função EliminarFuncionario você recebe um int n por parâmetro porém n usa isso para nada, não é erro mas da um aviso.

adicionado 15 minutos depois

arrumando esses "errinhos" seu programa fica com quase zero avisos. Agora vou provar a parte lógica a ver si funciona como o devido...

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

11 minutos atrás, vangodp disse:

ok... arrume isso então hehe, sobre tudo onde tiver lendo e imprimindo esses nifs

adicionado 0 minutos depois

talvez seja interessante guardar o nif em uma string

adicionado 3 minutos depois

assim você pode tomar os dados desse jeito"000.000.000-00"

adicionado 4 minutos depois

é só uma ideia hehe

adicionado 8 minutos depois

É preciso usar malloc para alocar uma única estrutura em main?

adicionado 8 minutos depois

Em todo caso o tipo do ponteiro deveria ser struct Funcionario * e n int

sim fica mas fácil na hora de eliminar os funcionários por NIF

o malloc() não sabia como usar então coloquei no main mas eu tinha usado o colloc()  nas funções antes depois eu tirei e coloquei o malloc no main 

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

//bibliotecas
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
#include <conio.h>
#include <time.h>

//Dados do funcionário
struct Funcionario {
    char nome[20];
    int NIF;
    char categoria[20];
    float salario;
    int Hora_Trabalhados;
};

// Para não atrapalhar o bom funcionamento
void menu ( struct Funcionario funcionario[], int n );

void pressioneEnter() {
    char c;
    
    do {
        c = getch();
    } while ( c != 13 );
}



void IncerirFuncionario ( struct Funcionario funcionario[], int n ) {
    system ( "COLOR 0F" );
    FILE *file; // cria variável ponteiro para o arquivo
    file = fopen ( "funcionarios.txt", "w" ); //abrindo o arquivo
    
    if ( file == NULL ) //testando se o arquivo foi realmente criado
        printf ( "\n-->Nao foi possivel abrir o fecheiro\n\n" );
    else {
        printf ( "\n\n\n\n\tUNICV \n\n" );
        printf ( "\n\n\n\t\tDigite o numero de Funcionarios que pretende registrar: " );
        scanf ( "%i", &n );
        fflush ( stdin );
        system ( "cls" );
        static int i = 0;
        int y = n + i;
        
        if ( y > 99 )
            menu ( funcionario, n );
            
        printf ( "\n\n\n\t\t-------- INSCRIÇÃO DE FUNCIONÁRIO --------\n\n" );
        fprintf ( file, "\n\n\t----- LISTA DOS FUNCIONÁRIOS ----\n\n" );
        fprintf ( file, "\tNome      NIF 	  Salário     Categoria  Horas\n\n" );
        
        for ( ; i < y; i++ ) {
            system ( "COLOR 0B" );
            // para obter dados e armazenar no arquivo
            printf ( "\n\tDigite o nome do funcionário: " );
            scanf ( " %s", funcionario[i].nome );
            printf ( "\n\tDigite o NIF do funcionário: " );
            scanf ( "%d", &funcionario[i].NIF );
            printf ( "\n\tDigite o salario do funcionario: " );
            scanf ( "%f", &funcionario[i].salario );
            printf ( "\n\tDigite a categoria do funcionário: " );
            scanf ( " %s", funcionario[i].categoria );
            printf ( "\n\tDigite a Hora trabalhados pelo funcionário: " );
            scanf ( "%d", &funcionario[i].Hora_Trabalhados );
            printf ( "\n\n" );
            //A Escrevendo no arquivo
            fprintf ( file, "\t%s \t %d \t %.1f \t %s\t %d\n", funcionario[i].nome, funcionario[i].NIF, funcionario[i].salario, funcionario[i].categoria, funcionario[i].Hora_Trabalhados );
        }
        
        printf ( "\n\t\t-------------------------<3--------------------------\n" );
        printf ( "\n\t Incritos com sucesso! \n\n\t Registado no fecheiro -> funcionarios.txt\n\n" );
        printf ( "\n\n\n\t\t\tPressione ENTER para Continuar->" );
        fflush ( stdin );
        pressioneEnter();
        system ( "cls" );
        menu ( funcionario, y );
    }
    
    fclose ( file ); // para fechar o arquivo
}

void ImprimirFuncionarios ( struct Funcionario funcionario[], int n ) {
    FILE *file;
    
    file = fopen ( "C:\\Users\\alex\\Desktop\\teste4\\funcionarios.txt", "r" );
    
    if ( file == NULL )
        printf ( "\n-->Nao foi possivel abrir o fecheiro\n\n" );
        
    else {
        int i;
        printf ( "\n\n\n\t\t------- LISTA DOS FUNCIONÁRIOS ------\n\n" );
        
        for ( i = 0; i < n; i++ ) {
            system ( "COLOR 0F" );
            fscanf ( file, "%s", funcionario[i].nome );
            fscanf ( file, "%d", &funcionario[i].NIF );
            fscanf ( file, "%f", &funcionario[i].salario );
            fscanf ( file, "%s", funcionario[i].categoria );
            fscanf ( file, "%d horas", &funcionario[i].Hora_Trabalhados );
            printf ( "\n\tNome: %s", funcionario[i].nome );
            printf ( "\n\tNIF: %d", funcionario[i].NIF );
            printf ( "\n\tSalario: %.1f $00", funcionario[i].salario );
            printf ( "\n\tCategoria: %s", funcionario[i].categoria );
            printf ( "\n\tHoras de trabalho: %d horas", funcionario[i].Hora_Trabalhados );
            printf ( "\n\n----------------------------------------------------------\n" );
        }
    }
    
    printf ( "\n\n\n\t\t\tPressione ENTER para Continuar->" );
    fflush ( stdin );
    pressioneEnter();
    system ( "cls" );
    fclose ( file );
    
}
void OrdenarFuncionario ( struct Funcionario *funcionario, int n ) {

    int i, j;
    struct Funcionario aux;
    
    for ( i = 1; i < n; i++ ) {
        aux = funcionario[i] ;
        
        for ( j = i; ( j > 0 ) && ( aux.salario < funcionario[j - 1].salario ); j-- ) {
            funcionario[j] = funcionario[j - 1];
            funcionario[j] = aux;
        }
        
    }
    
    printf ( "\n\n\n\t------- LISTA DOS FUNCIONÁRIOS POR ORDEM CRESCENTE ------\n\n" );
    
    for ( i = 0; i < n; i++ ) {
    
        printf ( "\n\tNome: %s", funcionario[i].nome );
        printf ( "\n\tNIF: %d", funcionario[i].NIF );
        printf ( "\n\tSalario: %.1f $00", funcionario[i].salario );
        printf ( "\n\tCategoria: %s", funcionario[i].categoria );
        printf ( "\n\tHoras de trabalho: %d horas", funcionario[i].Hora_Trabalhados );
        printf ( "\n\n----------------------------------------------------------\n" );
        
    }
    
    printf ( "\n\n\n\t\t\tPressione ENTER para Continuar->" );
    fflush ( stdin );
    pressioneEnter();
    system ( "cls" );
}


void EliminarFuncionario ( struct Funcionario funcionario[], int n ) {
    FILE *file;
    
    //Abre o arquivo novamente para leitura
    file = fopen ( "funcionarios.txt", "r+" );
    
    if ( file == NULL )
        printf ( "\n-->Nao foi possivel abrir o fecheiro\n\n" );
        
    else {
        int nif, i=0;
        char resp;
        printf ( "\n\tInforme o NIF do funcionario a ser Eliminado: " );
        scanf ( "%d", &nif );
        
        while ( funcionario[i].NIF == nif ) {
        
            //if ( funcionario[i].ativo== 1 ) {
            
            printf ( "\n\tNome: %s", funcionario[i].nome );
            printf ( "\n\tNIF: %d", funcionario[i].NIF );
            printf ( "\n\tSalario: %.1f $00", funcionario[i].salario );
            printf ( "\n\tCategoria: %s", funcionario[i].categoria );
            printf ( "\n\tHoras de trabalho: %d horas", funcionario[i].Hora_Trabalhados );
            printf ( "\n\n----------------------------------------------------------\n" );
            // }
            printf ( "\n\tDeseja realmente eliminar o Funcionário? S/N:" );
            scanf ( "%c", &resp );
            
            if ( ( resp == 'S' ) || ( resp == 's' ) ) {
                //   funcionario[i].ativo=0;
                printf ( "\n\tFuncionário eliminado com sucesso\n" );
                break;
            } else {
                if ( ( resp == 'N' ) || ( resp == 'n' ) ) {
                    printf ( "\tEliminação cancelada!\n" );
                    break;
                }
            }
        }
        
        i++;
        
        if ( i > 99 )
            printf ( "\n\n\t\tNIF não encontrado\n" );
    }
    
    fclose ( file );
    printf ( "\n\n\n\t\t\tPressione ENTER para Continuar->" );
    fflush ( stdin );
    pressioneEnter();
    system ( "cls" );
}

void menu ( struct Funcionario funcionario[], int n ) {
    int op;
    
    do {
        system ( "COLOR 0F" ); //Menu
        printf ( "\n\n\t\t\t\t---> SISTEMA DE REGISTO E CONTROLE DE FUNCIONÁRIO \n\n" );
        printf ( "\n\t\t* 1 ------- INSERIR OS FUNCIONÁRIOS E ENVIA-LOS PARA O FICHEIRO ------------------------ *\n" );
        printf ( "\n\t\t* 2 ------- IMPRIMIR A LISTA DOS FUNCIONÁRIOS DO FICHEIRO ------------------------------ *\n" );
        printf ( "\n\t\t* 3 ------- IMPRIMIR OS FUNCIONÁRIOS POR CATEGORIA ------------------------------------- *\n" );
        printf ( "\n\t\t* 4 ------- GASTO DA UNIVERSIDADE COM OS FUNCIONÁRIOS ---------------------------------- *\n" );
        printf ( "\n\t\t* 5 ------- CALCULAR O SALÁRIO DE UM FUNCIONÁRIO X EM FUNÇÃO DO SEU SALÁRIO POR HORA --- *\n" );
        printf ( "\n\t\t* 6 ------- ORDENAR FUNCIONÁRIO NA ORDEM CRESCENTE ------------------------------------- *\n" );
        printf ( "\n\t\t* 7 ------- IMPRIMIR OS FUNCIONÁRIOS COM SALÁRIO MAIOR QUE 75000$ ---------------------- *\n" );
        printf ( "\n\t\t* 8 ------- ELIMINAR UM FUNCIONÁRIO A PARTIR DO Nº DO NIF ------------------------------ *\n" );
        printf ( "\n\t\t* 0 ------- Sair\n\n" );
        printf ( "\n\tEscolha uma opcao: " );
        scanf ( "%d", &op );
        printf ( "\n" );
        
        switch ( op ) {
            case 0:
                printf ( "\t\t\t\t\t\t\t\t\t\t-> Saindo... \n" );
                printf ( "\tPressione ENTER para Sair->" );
                fflush ( stdin );
                pressioneEnter();
                system ( "cls" );
                break;
                
            case 1:
                system ( "cls" );
                IncerirFuncionario ( funcionario, n );
                break;
                
            case 2:
                system ( "cls" );
                ImprimirFuncionarios ( funcionario, n );
                break;
                
            case 6:
                system ( "cls" );
                OrdenarFuncionario ( funcionario, n );
                break;
                
            case 8:
                system ( "cls" );
                EliminarFuncionario ( funcionario, n );
                break;
                
            default:
                system ( "COLOR C0" );
                printf ( "\n\t\t\t\t*-*-*-*-- ERRO --> Numero INVALIDO!\n\n" );
                printf ( "\n\tPressione ENTER para Tentar Novamente->" );
                fflush ( stdin );
                pressioneEnter();
                system ( "cls" );
        }
    } while ( op != 0 );
    
}
int main() {
    setlocale ( LC_ALL, "Portuguese" );
    struct Funcionario funcionario[100];
    int n;
    struct Funcionario* p = ( struct Funcionario * ) malloc ( sizeof ( struct Funcionario ) );
    
    if ( p == NULL ) {
        printf ( "\n\t ERRO MEMÓRIA INSUFICIENTE!\n" );
        exit ( 1 ); //Terminar o programa
    }
    
    system ( "COLOR F0" ); //Abertura do programa
    printf ( "\n\n\n\n\n\t\t\t....................................................................\n" );
    printf ( "\n\t\t\t\t----> SISTEMA DE REGISTO E CONTROLE DE FUNCIONÁRIO \n" );
    printf ( "\n\t\t\t.....................................................................\n\n\n\n\n" );
    printf ( "\n\t\t\t                                                                      UNICV \n\n" );
    printf ( "\n\tPressione ENTER para iniciar->" );
    fflush ( stdin );
    pressioneEnter();
    system ( "cls" );
    menu ( funcionario, n );
    free ( p );
    return 0;
}
Spoiler

Screenshot_3.thumb.png.e4a431f38f25bd18685f86658f0f58fd.png

 

adicionado 1 minuto depois

Vou rodar ele e ver o que acontece.... Quero ver o arquivo gerado.

adicionado 3 minutos depois

Temos outro erro... mas agora é problema de sujeira na memória.
 

Spoiler

Screenshot_3.png.0396a34f4baee05b9b9829bfd0eb8818.png

 

adicionado 7 minutos depois

você precisa limpar o buffer antes de ler strings ou chars...
Deveria buscar alguns tutoriais de como limpar o buffer em C para aprender a faze-lo corretamente. A forma mais fácil é pondo o fflush(stdin) mas nao lhe recomendo fazer isso,tTem comportamento indefinido... pode sair um dragão na sua tela. >_<

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

10 minutos atrás, vangodp disse:

//bibliotecas
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
#include <conio.h>
#include <time.h>

//Dados do funcionário
struct Funcionario {
    char nome[20];
    int NIF;
    char categoria[20];
    float salario;
    int Hora_Trabalhados;
};

// Para não atrapalhar o bom funcionamento
void menu ( struct Funcionario funcionario[], int n );

void pressioneEnter() {
    char c;
    
    do {
        c = getch();
    } while ( c != 13 );
}



void IncerirFuncionario ( struct Funcionario funcionario[], int n ) {
    system ( "COLOR 0F" );
    FILE *file; // cria variável ponteiro para o arquivo
    file = fopen ( "funcionarios.txt", "w" ); //abrindo o arquivo
    
    if ( file == NULL ) //testando se o arquivo foi realmente criado
        printf ( "\n-->Nao foi possivel abrir o fecheiro\n\n" );
    else {
        printf ( "\n\n\n\n\tUNICV \n\n" );
        printf ( "\n\n\n\t\tDigite o numero de Funcionarios que pretende registrar: " );
        scanf ( "%i", &n );
        fflush ( stdin );
        system ( "cls" );
        static int i = 0;
        int y = n + i;
        
        if ( y > 99 )
            menu ( funcionario, n );
            
        printf ( "\n\n\n\t\t-------- INSCRIÇÃO DE FUNCIONÁRIO --------\n\n" );
        fprintf ( file, "\n\n\t----- LISTA DOS FUNCIONÁRIOS ----\n\n" );
        fprintf ( file, "\tNome      NIF 	  Salário     Categoria  Horas\n\n" );
        
        for ( ; i < y; i++ ) {
            system ( "COLOR 0B" );
            // para obter dados e armazenar no arquivo
            printf ( "\n\tDigite o nome do funcionário: " );
            scanf ( " %s", funcionario[i].nome );
            printf ( "\n\tDigite o NIF do funcionário: " );
            scanf ( "%d", &funcionario[i].NIF );
            printf ( "\n\tDigite o salario do funcionario: " );
            scanf ( "%f", &funcionario[i].salario );
            printf ( "\n\tDigite a categoria do funcionário: " );
            scanf ( " %s", funcionario[i].categoria );
            printf ( "\n\tDigite a Hora trabalhados pelo funcionário: " );
            scanf ( "%d", &funcionario[i].Hora_Trabalhados );
            printf ( "\n\n" );
            //A Escrevendo no arquivo
            fprintf ( file, "\t%s \t %d \t %.1f \t %s\t %d\n", funcionario[i].nome, funcionario[i].NIF, funcionario[i].salario, funcionario[i].categoria, funcionario[i].Hora_Trabalhados );
        }
        
        printf ( "\n\t\t-------------------------<3--------------------------\n" );
        printf ( "\n\t Incritos com sucesso! \n\n\t Registado no fecheiro -> funcionarios.txt\n\n" );
        printf ( "\n\n\n\t\t\tPressione ENTER para Continuar->" );
        fflush ( stdin );
        pressioneEnter();
        system ( "cls" );
        menu ( funcionario, y );
    }
    
    fclose ( file ); // para fechar o arquivo
}

void ImprimirFuncionarios ( struct Funcionario funcionario[], int n ) {
    FILE *file;
    
    file = fopen ( "C:\\Users\\alex\\Desktop\\teste4\\funcionarios.txt", "r" );
    
    if ( file == NULL )
        printf ( "\n-->Nao foi possivel abrir o fecheiro\n\n" );
        
    else {
        int i;
        printf ( "\n\n\n\t\t------- LISTA DOS FUNCIONÁRIOS ------\n\n" );
        
        for ( i = 0; i < n; i++ ) {
            system ( "COLOR 0F" );
            fscanf ( file, "%s", funcionario[i].nome );
            fscanf ( file, "%d", &funcionario[i].NIF );
            fscanf ( file, "%f", &funcionario[i].salario );
            fscanf ( file, "%s", funcionario[i].categoria );
            fscanf ( file, "%d horas", &funcionario[i].Hora_Trabalhados );
            printf ( "\n\tNome: %s", funcionario[i].nome );
            printf ( "\n\tNIF: %d", funcionario[i].NIF );
            printf ( "\n\tSalario: %.1f $00", funcionario[i].salario );
            printf ( "\n\tCategoria: %s", funcionario[i].categoria );
            printf ( "\n\tHoras de trabalho: %d horas", funcionario[i].Hora_Trabalhados );
            printf ( "\n\n----------------------------------------------------------\n" );
        }
    }
    
    printf ( "\n\n\n\t\t\tPressione ENTER para Continuar->" );
    fflush ( stdin );
    pressioneEnter();
    system ( "cls" );
    fclose ( file );
    
}
void OrdenarFuncionario ( struct Funcionario *funcionario, int n ) {

    int i, j;
    struct Funcionario aux;
    
    for ( i = 1; i < n; i++ ) {
        aux = funcionario[i] ;
        
        for ( j = i; ( j > 0 ) && ( aux.salario < funcionario[j - 1].salario ); j-- ) {
            funcionario[j] = funcionario[j - 1];
            funcionario[j] = aux;
        }
        
    }
    
    printf ( "\n\n\n\t------- LISTA DOS FUNCIONÁRIOS POR ORDEM CRESCENTE ------\n\n" );
    
    for ( i = 0; i < n; i++ ) {
    
        printf ( "\n\tNome: %s", funcionario[i].nome );
        printf ( "\n\tNIF: %d", funcionario[i].NIF );
        printf ( "\n\tSalario: %.1f $00", funcionario[i].salario );
        printf ( "\n\tCategoria: %s", funcionario[i].categoria );
        printf ( "\n\tHoras de trabalho: %d horas", funcionario[i].Hora_Trabalhados );
        printf ( "\n\n----------------------------------------------------------\n" );
        
    }
    
    printf ( "\n\n\n\t\t\tPressione ENTER para Continuar->" );
    fflush ( stdin );
    pressioneEnter();
    system ( "cls" );
}


void EliminarFuncionario ( struct Funcionario funcionario[], int n ) {
    FILE *file;
    
    //Abre o arquivo novamente para leitura
    file = fopen ( "funcionarios.txt", "r+" );
    
    if ( file == NULL )
        printf ( "\n-->Nao foi possivel abrir o fecheiro\n\n" );
        
    else {
        int nif, i=0;
        char resp;
        printf ( "\n\tInforme o NIF do funcionario a ser Eliminado: " );
        scanf ( "%d", &nif );
        
        while ( funcionario[i].NIF == nif ) {
        
            //if ( funcionario[i].ativo== 1 ) {
            
            printf ( "\n\tNome: %s", funcionario[i].nome );
            printf ( "\n\tNIF: %d", funcionario[i].NIF );
            printf ( "\n\tSalario: %.1f $00", funcionario[i].salario );
            printf ( "\n\tCategoria: %s", funcionario[i].categoria );
            printf ( "\n\tHoras de trabalho: %d horas", funcionario[i].Hora_Trabalhados );
            printf ( "\n\n----------------------------------------------------------\n" );
            // }
            printf ( "\n\tDeseja realmente eliminar o Funcionário? S/N:" );
            scanf ( "%c", &resp );
            
            if ( ( resp == 'S' ) || ( resp == 's' ) ) {
                //   funcionario[i].ativo=0;
                printf ( "\n\tFuncionário eliminado com sucesso\n" );
                break;
            } else {
                if ( ( resp == 'N' ) || ( resp == 'n' ) ) {
                    printf ( "\tEliminação cancelada!\n" );
                    break;
                }
            }
        }
        
        i++;
        
        if ( i > 99 )
            printf ( "\n\n\t\tNIF não encontrado\n" );
    }
    
    fclose ( file );
    printf ( "\n\n\n\t\t\tPressione ENTER para Continuar->" );
    fflush ( stdin );
    pressioneEnter();
    system ( "cls" );
}

void menu ( struct Funcionario funcionario[], int n ) {
    int op;
    
    do {
        system ( "COLOR 0F" ); //Menu
        printf ( "\n\n\t\t\t\t---> SISTEMA DE REGISTO E CONTROLE DE FUNCIONÁRIO \n\n" );
        printf ( "\n\t\t* 1 ------- INSERIR OS FUNCIONÁRIOS E ENVIA-LOS PARA O FICHEIRO ------------------------ *\n" );
        printf ( "\n\t\t* 2 ------- IMPRIMIR A LISTA DOS FUNCIONÁRIOS DO FICHEIRO ------------------------------ *\n" );
        printf ( "\n\t\t* 3 ------- IMPRIMIR OS FUNCIONÁRIOS POR CATEGORIA ------------------------------------- *\n" );
        printf ( "\n\t\t* 4 ------- GASTO DA UNIVERSIDADE COM OS FUNCIONÁRIOS ---------------------------------- *\n" );
        printf ( "\n\t\t* 5 ------- CALCULAR O SALÁRIO DE UM FUNCIONÁRIO X EM FUNÇÃO DO SEU SALÁRIO POR HORA --- *\n" );
        printf ( "\n\t\t* 6 ------- ORDENAR FUNCIONÁRIO NA ORDEM CRESCENTE ------------------------------------- *\n" );
        printf ( "\n\t\t* 7 ------- IMPRIMIR OS FUNCIONÁRIOS COM SALÁRIO MAIOR QUE 75000$ ---------------------- *\n" );
        printf ( "\n\t\t* 8 ------- ELIMINAR UM FUNCIONÁRIO A PARTIR DO Nº DO NIF ------------------------------ *\n" );
        printf ( "\n\t\t* 0 ------- Sair\n\n" );
        printf ( "\n\tEscolha uma opcao: " );
        scanf ( "%d", &op );
        printf ( "\n" );
        
        switch ( op ) {
            case 0:
                printf ( "\t\t\t\t\t\t\t\t\t\t-> Saindo... \n" );
                printf ( "\tPressione ENTER para Sair->" );
                fflush ( stdin );
                pressioneEnter();
                system ( "cls" );
                break;
                
            case 1:
                system ( "cls" );
                IncerirFuncionario ( funcionario, n );
                break;
                
            case 2:
                system ( "cls" );
                ImprimirFuncionarios ( funcionario, n );
                break;
                
            case 6:
                system ( "cls" );
                OrdenarFuncionario ( funcionario, n );
                break;
                
            case 8:
                system ( "cls" );
                EliminarFuncionario ( funcionario, n );
                break;
                
            default:
                system ( "COLOR C0" );
                printf ( "\n\t\t\t\t*-*-*-*-- ERRO --> Numero INVALIDO!\n\n" );
                printf ( "\n\tPressione ENTER para Tentar Novamente->" );
                fflush ( stdin );
                pressioneEnter();
                system ( "cls" );
        }
    } while ( op != 0 );
    
}
int main() {
    setlocale ( LC_ALL, "Portuguese" );
    struct Funcionario funcionario[100];
    int n;
    struct Funcionario* p = ( struct Funcionario * ) malloc ( sizeof ( struct Funcionario ) );
    
    if ( p == NULL ) {
        printf ( "\n\t ERRO MEMÓRIA INSUFICIENTE!\n" );
        exit ( 1 ); //Terminar o programa
    }
    
    system ( "COLOR F0" ); //Abertura do programa
    printf ( "\n\n\n\n\n\t\t\t....................................................................\n" );
    printf ( "\n\t\t\t\t----> SISTEMA DE REGISTO E CONTROLE DE FUNCIONÁRIO \n" );
    printf ( "\n\t\t\t.....................................................................\n\n\n\n\n" );
    printf ( "\n\t\t\t                                                                      UNICV \n\n" );
    printf ( "\n\tPressione ENTER para iniciar->" );
    fflush ( stdin );
    pressioneEnter();
    system ( "cls" );
    menu ( funcionario, n );
    free ( p );
    return 0;
}
  Mostrar conteúdo oculto

Screenshot_3.thumb.png.e4a431f38f25bd18685f86658f0f58fd.png

 

adicionado 1 minuto depois

Vou rodar ele e ver o que acontece.... Quero ver o arquivo gerado.

adicionado 3 minutos depois

Temos outro erro... mas agora é problema de sujeira na memória.
 

  Mostrar conteúdo oculto

Screenshot_3.png.0396a34f4baee05b9b9829bfd0eb8818.png

 

adicionado 7 minutos depois

você precisa limpar o buffer antes de ler strings ou chars...
Deveria buscar alguns tutoriais de como limpar o buffer em C para aprender a faze-lo corretamente. A forma mais fácil é pondo o fflush(stdin) mas nao lhe recomendo fazer isso,tTem comportamento indefinido... pode sair um dragão na sua tela. >_<

o  fflush(stdin);  faz isso ele limpa o lixo de  memoria 

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

limpar limpa mas ninguem deveria usala:
aqui tem um amplo tema que foi debatido uma vez com conselhos de varios usuarios de outro forum. https://forum.imasters.com.br/topic/336835-tutorial-systempause-e-fflushstdin/

 

São conselhos para iniciantes, acho que você deveria dar uma olhada.
 

adicionado 0 minutos depois

De momento você pode usar o fflush mas quanto antes você deixa-lo melhor.

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

Adicionei a função flush e troquei todos os fflush(stdin) pela função flush(), não testei mas deve funcionar normalmente:

//bibliotecas
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <string.h>
#include <conio.h>
#include <time.h>

//Dados do funcionário
struct Funcionario {
    char nome[20];
    int NIF;
    char categoria[20];
    float salario;
    int Hora_Trabalhados;
};

// Para não atrapalhar o bom funcionamento
void menu ( struct Funcionario funcionario[], int n );

void pressioneEnter() {
    char c;
    
    do {
        c = getch();
    } while ( c != 13 );
}

void flush(){
    int c;
    /*Lê todos os caracteres até encontrar '\n' ou EOF:*/
    while( (c = getchar()) != '\n' && c != EOF );
}

void IncerirFuncionario ( struct Funcionario funcionario[], int n ) {
    system ( "COLOR 0F" );
    FILE *file; // cria variável ponteiro para o arquivo
    file = fopen ( "funcionarios.txt", "w" ); //abrindo o arquivo
    
    if ( file == NULL ) //testando se o arquivo foi realmente criado
        printf ( "\n-->Nao foi possivel abrir o fecheiro\n\n" );
    else {
        printf ( "\n\n\n\n\tUNICV \n\n" );
        printf ( "\n\n\n\t\tDigite o numero de Funcionarios que pretende registrar: " );
        scanf ( " %i", &n );
        flush ();
        system ( "cls" );
        static int i = 0;
        int y = n + i;
        
        if ( y > 99 )
            menu ( funcionario, n );
            
        printf ( "\n\n\n\t\t-------- INSCRIÇÃO DE FUNCIONÁRIO --------\n\n" );
        fprintf ( file, "\n\n\t----- LISTA DOS FUNCIONÁRIOS ----\n\n" );
        fprintf ( file, "\tNome      NIF 	  Salário     Categoria  Horas\n\n" );
        
        for ( ; i < y; i++ ) {
            system ( "COLOR 0B" );
            // para obter dados e armazenar no arquivo
            printf ( "\n\tDigite o nome do funcionário: " );
            scanf ( " %s", funcionario[i].nome );
            printf ( "\n\tDigite o NIF do funcionário: " );
            scanf ( " %d", &funcionario[i].NIF );
            printf ( "\n\tDigite o salario do funcionario: " );
            scanf ( " %f", &funcionario[i].salario );
            printf ( "\n\tDigite a categoria do funcionário: " );
            scanf ( " %s", funcionario[i].categoria );
            printf ( "\n\tDigite a Hora trabalhados pelo funcionário: " );
            scanf ( " %d", &funcionario[i].Hora_Trabalhados );
            printf ( "\n\n" );
            //A Escrevendo no arquivo
            fprintf ( file, "\t%s \t %d \t %.1f \t %s\t %d\n", funcionario[i].nome, funcionario[i].NIF, funcionario[i].salario, funcionario[i].categoria, funcionario[i].Hora_Trabalhados );
        }
        
        printf ( "\n\t\t-------------------------<3--------------------------\n" );
        printf ( "\n\t Incritos com sucesso! \n\n\t Registado no fecheiro -> funcionarios.txt\n\n" );
        printf ( "\n\n\n\t\t\tPressione ENTER para Continuar->" );
        flush ();
        pressioneEnter();
        system ( "cls" );
        menu ( funcionario, y );
    }
    
    fclose ( file ); // para fechar o arquivo
}

void ImprimirFuncionarios ( struct Funcionario funcionario[], int n ) {
    FILE *file;
    
    file = fopen ( "C:\\Users\\alex\\Desktop\\teste4\\funcionarios.txt", "r" );
    
    if ( file == NULL )
        printf ( "\n-->Nao foi possivel abrir o fecheiro\n\n" );
        
    else {
        int i;
        printf ( "\n\n\n\t\t------- LISTA DOS FUNCIONÁRIOS ------\n\n" );
        
        for ( i = 0; i < n; i++ ) {
            system ( "COLOR 0F" );
            fscanf ( file, " %s", funcionario[i].nome );
            fscanf ( file, " %d", &funcionario[i].NIF );
            fscanf ( file, " %f", &funcionario[i].salario );
            fscanf ( file, " %s", funcionario[i].categoria );
            fscanf ( file, " %d horas", &funcionario[i].Hora_Trabalhados );
            printf ( "\n\tNome: %s", funcionario[i].nome );
            printf ( "\n\tNIF: %d", funcionario[i].NIF );
            printf ( "\n\tSalario: %.1f $00", funcionario[i].salario );
            printf ( "\n\tCategoria: %s", funcionario[i].categoria );
            printf ( "\n\tHoras de trabalho: %d horas", funcionario[i].Hora_Trabalhados );
            printf ( "\n\n----------------------------------------------------------\n" );
        }
    }
    
    printf ( "\n\n\n\t\t\tPressione ENTER para Continuar->" );
    flush ();
    pressioneEnter();
    system ( "cls" );
    fclose ( file );
    
}
void OrdenarFuncionario ( struct Funcionario *funcionario, int n ) {

    int i, j;
    struct Funcionario aux;
    
    for ( i = 1; i < n; i++ ) {
        aux = funcionario[i] ;
        
        for ( j = i; ( j > 0 ) && ( aux.salario < funcionario[j - 1].salario ); j-- ) {
            funcionario[j] = funcionario[j - 1];
            funcionario[j] = aux;
        }
        
    }
    
    printf ( "\n\n\n\t------- LISTA DOS FUNCIONÁRIOS POR ORDEM CRESCENTE ------\n\n" );
    
    for ( i = 0; i < n; i++ ) {
    
        printf ( "\n\tNome: %s", funcionario[i].nome );
        printf ( "\n\tNIF: %d", funcionario[i].NIF );
        printf ( "\n\tSalario: %.1f $00", funcionario[i].salario );
        printf ( "\n\tCategoria: %s", funcionario[i].categoria );
        printf ( "\n\tHoras de trabalho: %d horas", funcionario[i].Hora_Trabalhados );
        printf ( "\n\n----------------------------------------------------------\n" );
        
    }
    
    printf ( "\n\n\n\t\t\tPressione ENTER para Continuar->" );
    flush ();
    pressioneEnter();
    system ( "cls" );
}


void EliminarFuncionario ( struct Funcionario funcionario[], int n ) {
    FILE *file;
    
    //Abre o arquivo novamente para leitura
    file = fopen ( "funcionarios.txt", "r+" );
    
    if ( file == NULL )
        printf ( "\n-->Nao foi possivel abrir o fecheiro\n\n" );
        
    else {
        int nif, i=0;
        char resp;
        printf ( "\n\tInforme o NIF do funcionario a ser Eliminado: " );
        scanf ( " %d", &nif );
        
        while ( funcionario[i].NIF == nif ) {
        
            //if ( funcionario[i].ativo== 1 ) {
            
            printf ( "\n\tNome: %s", funcionario[i].nome );
            printf ( "\n\tNIF: %d", funcionario[i].NIF );
            printf ( "\n\tSalario: %.1f $00", funcionario[i].salario );
            printf ( "\n\tCategoria: %s", funcionario[i].categoria );
            printf ( "\n\tHoras de trabalho: %d horas", funcionario[i].Hora_Trabalhados );
            printf ( "\n\n----------------------------------------------------------\n" );
            // }
            printf ( "\n\tDeseja realmente eliminar o Funcionário? S/N:" );
            scanf ( " %c", &resp );
            
            if ( ( resp == 'S' ) || ( resp == 's' ) ) {
                //   funcionario[i].ativo=0;
                printf ( "\n\tFuncionário eliminado com sucesso\n" );
                break;
            } else {
                if ( ( resp == 'N' ) || ( resp == 'n' ) ) {
                    printf ( "\tEliminação cancelada!\n" );
                    break;
                }
            }
        }
        
        i++;
        
        if ( i > 99 )
            printf ( "\n\n\t\tNIF não encontrado\n" );
    }
    
    fclose ( file );
    printf ( "\n\n\n\t\t\tPressione ENTER para Continuar->" );
    flush ();
    pressioneEnter();
    system ( "cls" );
}

void menu ( struct Funcionario funcionario[], int n ) {
    int op;
    
    do {
        system ( "COLOR 0F" ); //Menu
        printf ( "\n\n\t\t\t\t---> SISTEMA DE REGISTO E CONTROLE DE FUNCIONÁRIO \n\n" );
        printf ( "\n\t\t* 1 ------- INSERIR OS FUNCIONÁRIOS E ENVIA-LOS PARA O FICHEIRO ------------------------ *\n" );
        printf ( "\n\t\t* 2 ------- IMPRIMIR A LISTA DOS FUNCIONÁRIOS DO FICHEIRO ------------------------------ *\n" );
        printf ( "\n\t\t* 3 ------- IMPRIMIR OS FUNCIONÁRIOS POR CATEGORIA ------------------------------------- *\n" );
        printf ( "\n\t\t* 4 ------- GASTO DA UNIVERSIDADE COM OS FUNCIONÁRIOS ---------------------------------- *\n" );
        printf ( "\n\t\t* 5 ------- CALCULAR O SALÁRIO DE UM FUNCIONÁRIO X EM FUNÇÃO DO SEU SALÁRIO POR HORA --- *\n" );
        printf ( "\n\t\t* 6 ------- ORDENAR FUNCIONÁRIO NA ORDEM CRESCENTE ------------------------------------- *\n" );
        printf ( "\n\t\t* 7 ------- IMPRIMIR OS FUNCIONÁRIOS COM SALÁRIO MAIOR QUE 75000$ ---------------------- *\n" );
        printf ( "\n\t\t* 8 ------- ELIMINAR UM FUNCIONÁRIO A PARTIR DO Nº DO NIF ------------------------------ *\n" );
        printf ( "\n\t\t* 0 ------- Sair\n\n" );
        printf ( "\n\tEscolha uma opcao: " );
        scanf ( " %d", &op );
        printf ( "\n" );
        
        switch ( op ) {
            case 0:
                printf ( "\t\t\t\t\t\t\t\t\t\t-> Saindo... \n" );
                printf ( "\tPressione ENTER para Sair->" );
                flush ();
                pressioneEnter();
                system ( "cls" );
                break;
                
            case 1:
                system ( "cls" );
                IncerirFuncionario ( funcionario, n );
                break;
                
            case 2:
                system ( "cls" );
                ImprimirFuncionarios ( funcionario, n );
                break;
                
            case 6:
                system ( "cls" );
                OrdenarFuncionario ( funcionario, n );
                break;
                
            case 8:
                system ( "cls" );
                EliminarFuncionario ( funcionario, n );
                break;
                
            default:
                system ( "COLOR C0" );
                printf ( "\n\t\t\t\t*-*-*-*-- ERRO --> Numero INVALIDO!\n\n" );
                printf ( "\n\tPressione ENTER para Tentar Novamente->" );
                flush ();
                pressioneEnter();
                system ( "cls" );
        }
    } while ( op != 0 );
    
}
int main() {
    setlocale ( LC_ALL, "Portuguese" );
    struct Funcionario funcionario[100];
    int n;
    struct Funcionario* p = ( struct Funcionario * ) malloc ( sizeof ( struct Funcionario ) );
    
    if ( p == NULL ) {
        printf ( "\n\t ERRO MEMÓRIA INSUFICIENTE!\n" );
        exit ( 1 ); //Terminar o programa
    }
    
    system ( "COLOR F0" ); //Abertura do programa
    printf ( "\n\n\n\n\n\t\t\t....................................................................\n" );
    printf ( "\n\t\t\t\t----> SISTEMA DE REGISTO E CONTROLE DE FUNCIONÁRIO \n" );
    printf ( "\n\t\t\t.....................................................................\n\n\n\n\n" );
    printf ( "\n\t\t\t                                                                      UNICV \n\n" );
    printf ( "\n\tPressione ENTER para iniciar->" );
    flush ();
    pressioneEnter();
    system ( "cls" );
    menu ( funcionario, n );
    free ( p );
    return 0;
}

 

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

22 minutos atrás, Andrah disse:

o  fflush(stdin);  faz isso ele limpa o lixo de  memoria 

 

Não é uma boa definição.  E não funciona para stdin. Alguns compiladores fazem isso mas o padrão da linguagem estabelece claramente que fflush() só está defindo para fluxos --- streams --- de saída e que o comportamento para o caso de streams de entrada é indefinido. O propósito de fflush() não é limpar nada: é enviar as coisas que estão esperando para ser enviadas. 
 

Isso acontece porque o sistema, por razões de eficiência, usa buffers e armazena valores em buffers para enviar quando achar que é hora. E às vezes você quer que descarregue --- flush --- numa certa hora ao invés de ficar esperando. E aí usa fflush() que não vai limpar nada. Vai transmitir. Como um printf() por exemplo. Se não entendeu pergunte de novo e mostro um exemplo mais elaborado.

 

E no caso de stdin --- o fluxo padrão de entrada --- não se está falando nem de memória nem de "lixo". O que você quer fazer é ler e desprezar o que tem no buffer de teclado PORQUE ALGUÉM TECLOU e descartar.

 

Em geral o que você quer é apenas ler e descartar o '\n' que encerrou a última leitura. E talvez alguma bobagem que o usuário digitou num scanf() para ler um número. Mais uma vez, se não entendeu pergunte de novo e mostro um exemplo mais elaborado.

 

Uma rotina como essa abaixo teria o efeito que você quer e não dependeria de estar usando um certo compilador

void    flush()
{
    int ch = 0;
    do { ch = getc(stdin); } while ((ch != '\n') && (ch != EOF));
};	// flush()

scanf() é

int scanf(const char *format, ...)

scanf() retorna um int com o número de itens lidos. Use. É melhor para você e leva a programas mais sólidos... scanf() é uma rotina "ativa" que pode "comer" linhas e linhas de sua entrada por exemplo.

E na verdade não escrita para ler valores do teclado. Foi escrita por um grande programador e para ler entrada formatada. scan formatted input era o objetivo e deu o nome a ela

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

até que você aprenda a limpar o buffer corretamente ponha um fflush antes de ler qualquer string

adicionado 0 minutos depois

            fflush ( stdin );
            scanf ( "%s%*c", funcionario.categoria );

adicionado 2 minutos depois

Mas realmente sou totalmente contra de fflush, e nunca recomendo isso. Termine seu programa e depois tente usar qualquer outra forma... você ja viu que alguns companheiros indicaram algumas formas, e qualquer delas é melhor que fflush. Se seu professor está recomendando isso talvez não seja um bom tutor.

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

22 minutos atrás, vangodp disse:

também n aconselho muito o uso desse flush @isrnick >_<. O porque você pode ver aqui:

 

 

Tenho feito uma campanha aqui para explicar isso em meio milhão de tópicos.

 

Não se trata de sujeira. E não é lixo de memória. São valores que foram digitados.


Em geral tudo começa --- e muitas vezes termina --- pelo '\n' que encerrou a última leitura se você usa scanf().

 

Entenda que se o usuário entrou com 1234>ENTER> para entrar com um int e você usou scanf() para ler, quando você ler isso vai ter o seu int com 1234 e no buffer de entrada vai estar lá o solitário <ENTER> ou '\n' esperando para ser consumido. E é esse valor dependendo da máscara que usou em scanf() numa próxima leitura, que vai zoar toda a entrada: scanf() vai pegar esse <ENTER> e dar por resolvida a próxima leitura, Só que não leu nada e como parece que tem uma lei que impede tratar o retorno de scanf() ou usar outra rotina para ler do teclado --- a confusão está feita. Se você vai ler vários campos então vai zoar tudo....

 

scanf() não foi escrita para isso. E o valor de retorno é para ser usado.

 

Se não fez sentido o que eu expliquei, experimente no Windows usar 
 

    PeekConsoleInput()

que mostra o que tem no buffer da console ANTES de você ler, ou pergunte e tento mostrar um exemplo melhor.

 

 

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

 

4 minutos atrás, arfneto disse:

que mostra o que tem no buffer da console ANTES de você ler, ou pergunte e tento mostrar um exemplo melhor.

Eu não tenho problemas com buffer... Quem precisa é @Andrah Sinta-se livre de fazer um bonito tutorial desses que você tem paciência para fazer... Ja que você entrou em tecnicismos agora n vai ficar no meio n é? 🤣

adicionado 0 minutos depois

Isso pode ajudar a muita gente, e de passo, talvez, seja possivel aprender algo novo hoje.

adicionado 1 minuto depois

E uma coisa... \n no buffer para mim é lixo, diga o que diga.

  • Amei 1
  • Haha 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...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!