Ir ao conteúdo
  • Cadastre-se

arfneto

Membro Pleno
  • Posts

    6.212
  • Cadastrado em

  • Última visita

Tudo que arfneto postou

  1. De qualquer forma, obrigado ! Bem, o que posso dizer é que ele está errado. Não coloque as funções antes. Para isso são os protótipos. E se vai colocar antes o que é aquilo no final do seu programa com os protótipos de novo? Num projeto comum as funções estão mesmo em outro arquivo. A cada passo no desenvolvimento você compila só o que está alterando e usa aqueles arquivos .h para incluir as declarações das funções. Entenda isso. É um conceito importante.
  2. void uniao(float elementosA[], float elementosB[], int conjA, int conjB); void intersecao(float elementosA[], float elementosB[], int conjA, int conjB); void diferenca(float elementosA[], float elementosB[], int conjA, int conjB); Acho que entendeu ao contrário a noção de protótipos. Essas linhas aí devem mostrar como são as funções que estão em uso em seu programa, e a PRIMEIRA função de seu programa é a tal main() claro. Isso é bom para você e mais ainda para alguém que vai tentar te ajudar, já que eu por exemplo não precisaria ficar procurando main() em seu programa se ele tivesse 1.000 linhas. Muitas vezes as funções estão em outro arquivo ou você sequer tem o código delas, como o caso de printf() por exemplo. Então você cria um arquivo só com as declarações delas e inclui em seu programa, como o #include "stdio.h" em seu programa. Algo assim serve void uniao(float[], float[], int , int ); void intersecao(float[], float[], int, int); void diferenca(float[], float [], int, int ); Não precisa repetir ou inventar nomes de variáveis porque você só vai estar informando o tipo. De volta ao programa: Ele não está nada bom. Por exemplo a diferença: porque o seu código abaixo funcionaria? Para cada elemento de A você vai imprimir uma linha com o elemento de A se ele não for igual ao de B? E isso é a diferença? void diferenca(float conjuntoA[], float conjuntoB[], int nelementosA, int nelementosB){ int i, j; for(i = 0; i < nelementosA; i++){ for(j = 0; j < nelementosB; j++){ if(conjuntoA[i] != conjuntoB[j]){ printf("%f\n", conjuntoA[i]); } } } } Então se o primeiro elemento de A for igual ao último de B e você leu mesmo os 29 vai imprimir 28 vezes o cara? Sério? Outra coisa: porque usou float? Eles são chatos para comparar por causa de erros de arredondamento. Não podia usar int que é mais seguro? Ex: 1.1 é igual a 1.10000001? Note que você pode declarar os caras e dar um valor para eles, todos ou uma parte a partir do início, e assim testar seu programa mais depressa sem ter que ficar lendo, certo? float a_de_teste[29] = { 1., 2., 3., 4., 5., 6., 1., 2., 3., 4., 5., 6. }; Bonus Abaixo seu programa com o texto reformatado para a ordem que eu te expliquei e um vetor preenchido para você poder recortar e colar... #include <stdio.h> #include <math.h> void diferenca(float [], float [], int , int ); void intersecao(float[], float[], int, int); void uniao(float[], float[], int, int); int main() { int conjA, conjB; float elementosA[29], elementosB[29]; float bonus[29] = { 1., 2., 3., 4., 5., 6., 7., 8., 1., 2., 3., 4., 5., 6., 7., 8., 1., 2., 3., 4., 5., 6., 7., 8., 1., 2., 3., 4., 5. }; scanf("%d", &conjA); for (int i = 0; i <= conjA; i++) { scanf("%f", &elementosA[i]); } scanf("%d", &conjB); for (int j = 0; j <= conjB; j++) { scanf("%f", &elementosB[j]); } return 0; }; void uniao(float conjuntoA[], float conjuntoB[], int nelementosA, int nelementosB) { int i, j; for (i = 0; i < nelementosA; i++) { for (j = 0; j < nelementosB; j++) { printf("%f %f \n", conjuntoA[i], conjuntoB[j]); } } }; void intersecao(float conjuntoA[], float conjuntoB[], int nelementosA, int nelementosB) { int i, j; for (i = 0; i < nelementosA; i++) { for (j = 0; j < nelementosB; j++) { if (conjuntoA[i] == conjuntoB[j]) { printf("%f\n", conjuntoA[i]); } } } }; void diferenca(float conjuntoA[], float conjuntoB[], int nelementosA, int nelementosB) { int i, j; for (i = 0; i < nelementosA; i++) { for (j = 0; j < nelementosB; j++) { if (conjuntoA[i] != conjuntoB[j]) { printf("%f\n", conjuntoA[i]); } } } };
  3. Olá! Progressos? Com o que está no enunciado como obrigatório você pode usar a função de está lá double sorteia_real() { return (double)rand() / RAND_MAX; }; Para calcular o tal sorteio com falha int sorteia_voto_com_falha(double f) { return (sorteia_real() < f); }; Entenda que em C ZERO é falso. Qualquer outro valor é verdadeiro. Em condições verdadeiro/falso você pode usar então expressões e é bem prático depois que se acostumar if(r == 0) // e a mesma coisa que if( !r ) // e if ( r != 0 ) // e a mesma coisa que if( r ) '!' é o operador NOT. "!=" significa diferente. Então a versão acima é o mesmo que essa abaixo int sorteia_voto_com_falha(double f) { if( sorteia_real() < f ) return 1; else return 0; };
  4. Você leu sobre rand() e srand()? Você não os usa juntos. int sorteia_voto_com_falha (double f); int i, N; srand(RAND_MAX); for(i = 1; i < n; i++) return(rand() % 1-f); Está certa sobre a precedência de '%' e '-'? Testou? Se não testou não acha que devia usar parenteses como rand() % (1-f) f é uma porcentagem? porque já não imprime os valores para se sentir mais segura? Usou um for com um return? isso quer dizer que vai rodar só uma vez, certo? já que vai retornar... E declarou int i e int N. Mas não tem nenhum valor. Como vai alimentar o for? declarou N mas não colocou nenhum valor. Seu for terminaria emi=n minúsculo que sequer está declarado....
  5. Não, não é possível retornar duas coisas ao mesmo tempo. Quando precisa retorna uma coisa que inclua as duas ou tantas quantas precisar, uma estrutura. Você n~~ao leu direito o que enunciado. .. Some f + (1-f) e vai ver que dá 1... Com probabilidade F retorna o inteiro.... É basicamente o exemplo que te mostrei ontem
  6. Que significa "enterrado"? Que faltou para resolver seu problema? Talvez não tenha entendido o princípio dessas coisas. Imagino que não possa usar as classes de lista da biblioteca mas talvez te ajudasse ler como elas funcionam antes de continuar com seu programa. http://www.cplusplus.com/reference/list/list/ Atente para a lista de métodos. O que você precisa é de uma classe Lista antes de tudo. E aí nas suas classes você declara Lista de vendas, de produtos ou de itens. Você está escrevendo tudo de novo e o propósito é justamente o contrário... adicionado 0 minutos depois Crie uma classe Lista antes de tudo
  7. Nào é. Você entendeu o que eu expliquei sobre os 75% de probabilidade? Acho que não. Esse é o conceito que você deve usar no seu problema.
  8. Não exatamente. Faça um programa pequeno e experimente com rand(). Você entendeu como manipular rand()? Leu no livro ou no site?
  9. Bem, você tem e não tem razão. Esse lance de sorteio é feito com a geração de números aleatórios. Na biblioteca padrão stdlib do C você tem uma função rand() e uma associada srand() que podem resolver isso. Veja em https://www.tutorialspoint.com/c_standard_library/c_function_rand.htm rand() retorna um valor inteiro entre 0 e um limite RAND_MAX. O que importa é que se você quer retornar um valor com 75% de probabilidade usa por exemplo (rand() %100) > 75 Porque? Se o número que veio é aleatório e inteiro e você pegar o resto da divisão dele por 100 vai dar quanto? Um número entre 0 e 99. Então em 75% das vezes ele será menor que 75, entre 0 e 74 e está feito o sorteio com probabilidade. srand(int) inicia uma nova sequência desses números, então pode usar algo como srand(20200504) e toda vez que iniciar seus testes vai reproduzir a mesma sequência...
  10. dirent funciona mais ou menos como está nese exemplo ai. Se está usando windows pode também usar _findfirst() / _findnext(). Estão documentadas em https://docs.microsoft.com/en-us/cpp/c-runtime-library/filename-search-functions?view=vs-2019 onde tem um programa exemplo que lista todos os arquivos .c no diretório corrente. Esse exemplo aqui: // crt_find.c // This program uses the 32-bit _find functions to print // a list of all files (and their attributes) with a .C extension // in the current directory. #include <stdio.h> #include <stdlib.h> #include <io.h> #include <time.h> int main( void ) { struct _finddata_t c_file; intptr_t hFile; // Find first .c file in current directory if( (hFile = _findfirst( "*.c", &c_file )) == -1L ) printf( "No *.c files in current directory!\n" ); else { printf( "Listing of .c files\n\n" ); printf( "RDO HID SYS ARC FILE DATE %25c SIZE\n", ' ' ); printf( "--- --- --- --- ---- ---- %25c ----\n", ' ' ); do { char buffer[30]; printf( ( c_file.attrib & _A_RDONLY ) ? " Y " : " N " ); printf( ( c_file.attrib & _A_HIDDEN ) ? " Y " : " N " ); printf( ( c_file.attrib & _A_SYSTEM ) ? " Y " : " N " ); printf( ( c_file.attrib & _A_ARCH ) ? " Y " : " N " ); ctime_s( buffer, _countof(buffer), &c_file.time_write ); printf( " %-12s %.24s %9ld\n", c_file.name, buffer, c_file.size ); } while( _findnext( hFile, &c_file ) == 0 ); _findclose( hFile ); } }
  11. acho que entendeu perfeitamente. atente para as diferenças nas declarações da função e os comandos return correspondentes. e comece a escrever alguma das funções de seu programa usando esse esqueleto de programa aí... E poste de volta usando o botão <> para abrir uma janela onde você insere o programa ...
  12. Você leu o trecho do livro que fala sobre funções? fez sentido pra você ou ficou com dúvidas? Esse é o resultado do programa que vem depois em main() vai chamar funcao a na funcao a em main() funcao_a() retornou 2 em main, vai chamar funcao b na funcao b parametros foram '128' e 'c' em main() funcao_b() retornou Eis o programa #include "stdio.h" int funcao_a() { printf("na funcao a\n"); return 2; }; // funcao_a() void funcao_b(int numero, char letra) { printf("na funcao b\n"); printf("parametros foram '%d' e '%c'\n", numero, letra); return; }; // funcao_a() int main(int argc, char** argv) { printf("em main() vai chamar funcao a\n"); int n = funcao_a(); printf("em main() funcao_a() retornou %d\n", n); printf("em main, vai chamar funcao b\n"); funcao_b(128,'c'); printf("em main() funcao_b() retornou\n"); return 0; } Ele cria e chama duas funções. Diga se isso é já natural pra você ou se tem alguma dúvida
  13. Sabe escrever um loop que continua rodando durante um fgets()? Sem multithread? Seria brilhante. Pode postar um?
  14. for, if e while são comandos e não funções. Seu curso tem um livro-texto? Qual é? Tem alguma apostila? Você tem algum livro? Já fez programas desse tipo? Conhece algo de estatística? O tal PDF tem 3 páginas apenas. Você poderia ter postado aqui não é?
  15. Pois é. Isso é o que estou tentando te explicar: Como não existe isso aqui o programa para no scanf() ou no getc(0 ou no fgets() ou no fread()... Entenda isso: um programa comum para no read. Fica esperando o usu;ario teclar algo. Posso chamar as variáveis de meu programa de qualquer coisa, inclusive de buffer, mas isso não vai fazer com que elas sejam um buffer de i/o, de stream como o buffer de teclado ou o de printf() que são controlados pelo sistema operacional e assim criar uma "solução brilhante" para limpar o lixo do buffer do teclado. É o sistema operacional que coloca o ENTER no buffer. E uma leitura no seu programa faz ele parar. Até ter algo no buffer do sistema para ele copiar para a variável buffer do seu programa. Mas é o contrário o que estou fazendo. Tentado explicar aos leitores o que é um buffer do sistema e uma variável buffer. E como é vantagem você só ler se sabe se tem algo pra ser lido. Exemplo: um jogo de 6 comandos sobe desce esquerda direita atira encerra Pergunta: Como você faz um jogo desses rodar sem parar pra ler o comando?... Resposta: Você roda o jogo e só lê depois do cara ter teclado algo. Assim o read é satisfeito imediatamente e o jogo continua. Sua variável buffer, com ou sem o ENTER, de nada serviria. por sorte você não tem o dia todo. Não vou julgar se eu tenho paciência ou me julgar de qualquer modo. Mas meu pessoal diz isso às vezes. Vou separar algo antigo que dê pra usar em "slides" e postar aqui qualquer hora
  16. dirent só vai te dar os nomes e a partir daí você chama suas coisas... Imagine uma função mágica que você chama assim char* proximo_arquivo(const char* Pasta); E uma função assim: int executa_acao(const char* arquivo); E a seguinte especificação: se você chama proximo_arquivo() com um valor diferente de "" é o nome da pasta e próximo arquivo vai preparar a lista de arquivos que tem nessa pasta e retornar digamos "12" se a pasta tiver 12 arquivos. E zero se não conseguir abrir a pasta. se você chama proximo_arquivo() com um valor "" então ela devolve o nome do proximo arquivo na pasta e aí você chama executa_acao() com o nome do tal arquivo e a fila anda. Notou que isso fecha o círculo? É só isso. Poda ser melhor, depois eu mostro um exemplo melhor. E você já pode testar isso com uma função fake que simula uma lsita de arquivos. Veja um exemplo: #include <stdio.h> #include <stdlib.h> #include <string.h> int executa_acao(const char*); const char* proximo_arquivo(const char*); int main(int argc, char** argv) { // testes const char* lista = proximo_arquivo(".\\teste"); if (lista == "") { printf("Nao conseguiu a lista de arquivos\n"); return 0; } printf("Lista retornou %s arquivos\n", lista); int N = atoi(lista); for (int i = 0; i < N; i += 1) { int res = executa_acao(proximo_arquivo("")); printf("acao() retornou %d\n", res); }; // for }; // main() const char* proximo_arquivo(const char* pasta) { static int N = -1; static const char testes[3][20] = { "a.txt", "b.txt", "c.txt" }; static const char* total = "3"; if (pasta == "") { N = N + 1; switch (N) { case 0: case 1: case 2: return testes[N]; break; default: return NULL; break; }; // switch() } else { printf("Montando lista para a pasta '%s'\n", pasta); N = -1; // aqui seria o caso de chamar // dirent e preencher uma lista // agora não preciso fazer nada exceto // marcar como iniciado }; // if() return total; } int executa_acao(const char* arquivo) { printf(" ==> executa acao para arquivo '%s'\n", arquivo); return 0; } Você pode criar uma pasta teste e colocar os arquivos lá e ir testando as ações enquanto não se entende com dirent. Confirme se entendeu. RODE esse programa. Entenda como pode ir progredindo... É tudo falso mas é tudo verdade. Por isso programação é interessante.
  17. Não tentei ler o programa, mas qual a ideia de ENTER 2 VEZES? Se está tentando isso com uma achamada a pressione ENTER não vai rolar. Sua ideia do menu esta confusa sem necessidade. Talvez pudesse simplesmente limpar a tela ao entrar no menu uma unica vez. Ler a opção, tratar, e voltar. Só isso. adicionado 46 minutos depois É estranho dizer que sua própria ideia é brilhante. O "buffer" de que está lendo é uma variável do seu programa. Você já leu do stream e, ao invés de usar fscanf() que leria do buffer do stream, você usa sscanf() que e lê de uma variável do seu programa que você sabiamente chamou de buffer. Para que eu preciso disso: Eu te mostrei um exemplo. Mas vou repetir o caso mais simples: imagine que você não quer ler enquanto não tenha nada pra ler. Entenda isso. É importante. Essencial às vezes se seu programa NÃO FOR MULTI-THREAD. O caso mais simples: seu programa está rodando e é um jogo de console. A tela esta rodando algum tipo de animação. O usuário tem uns comandos, tipo movimento e tiro. E você pode ler os clássicos E S D X para os movimentos e ESPAÇO para atirar. Se você escrever um fread(), um scanf(), um getc(), um fgets() o programa vai PARAR pra ler o comando até o cara digitar algo. Você só quer ler o comando depois que souber que o cara digitou. Entenda isso. Se não entendeu escreva explicando onde está a dúvida desta vez. É um conceito importante. Você não pode parar a execução e ficar esperando. Também não pode ler para o seu "brilhante" buffer o que ainda não foi digitado. Para isso precisa da colaboração do sistema operacional. No windows pode usar a rotina que te mostrei. No Unix usa algo como ioctl() e faz algo similar. Eu escrevi soluções assim para Unix muitas vezes, mas não me lembro dos detalhes, mas tem algo na estrutura dos buffer do terminal que dava essa informação de que tem algo a ser lido. Sinceramente não me lembro. Não adianta nada ler para a sua variável buffer. Espero que tenha entendido agora. São coisas que acontecem em tempo real. Não dá pra ler antes no buffer que está dentro do seu programa porque ninguém digitou ainda. Seu programa segue um loop de execução e se o usuário digitou algo você vai lá e lê. Não pode ler antes de ele ter digitado. Mas às vezes não pode simplesmente escrever um scanf() e ficar esperando... Seu tom parece não estar sendo de muita cortesia. Vou explicar isso de novo também: SE FOSSE MULTI-THREAD seu programa poderia ter um loop de execução e outro de leitura e aí o de leitura poderia ficar parado. Entendeu agora? Como o programa, o nosso exemplo aqui, é um programa comum com uma sequência de execução só, sabe o que acontece se você chama um read: o programa para. Talvez possa mudar o tom. Não tenho uma solução perfeita. E já te disse que não se trata de lixo. Não sei se existe tal coisa de solução perfeita. Eu te mostrei as DUAS opções que se usa na prática e até com detalhe: Ler caracteres via getc() ou linhas via gets() e tratar em seu programa. Até citei o que o runtime faz montando o vetor de argv antes de acionar seu programa em C. E quando precisar usar em Windows PeekConsoleInput() para ver se tem algo pra ler e só ler se tiver. E no Linux/Mac ver a outra solução de que falei e não me lembro. E te falei da existência de ungetc() em todas as plataformas. Já que estou escrevendo, vou te dar um exemplo de que me lembrei agora. Nos '90 eu trabalhava em um sistema grande em UNIX para automação bancária e tinha uma situação em que máquinas especiais eram ligadas como terminais do Unix e o sistema era controlado por dois terminais de uso dos operadores das máquinas. Sempre que a máquina terminava um certo processo uma mensagem indicativa aparecia na tela e o operador tinha que ir até a máquina retirar um lote de documentos e voltar ao terminal para autorizar o reinício. Durante meses o pessoal pedia uma maneira de escolher um tempo para reinício e voltar sózinho a ler A MENOS que eles usassem algum comando, ao invés de sempre parar e eles terem que voltar ao terminal nem que fosse para teclar um ENTER. Já imaginou o cenário certo? O sistema era escrito em COBOL e minha solução foi escrever um read em C que substituía a leitura do COBOL e depois do tempo que cada operador podia programar em seu turno voltava a acionar as máquinas a menos que o operador digitasse um comando. Entendeu a diferença? Só lia quando ele tinha digitado algo. Sinto por isso. Se não entendeu mesmo o que expliquei ou ainda acha que quero criar polêmica. Eu te mostrei vários exemplos.
  18. Então você conseguiu a explicação mas não conseguiu colocar em seu programa, certo? Vou ver se tenho um exemplo aqui
  19. Você leu o código reordenado? Entendeu as diferenças? O que é o tal campo "ativo"? Viu que eu inseri na estrutura? Vai usar essa estrutura? Entendeu as notas sobre pressioneEnter( e flush()?
  20. hey, reproduzir o enunciado não é uma pergunta objetiva. Objetivo é você dizer em que ponto disso tem um problema agora... Algo objetivo: void EliminarFuncionario(struct Funcionario funcionario[], int n); Esse trecho não está bom acabou de declarar i. Que acha que vai ter lá? ler um char com o especificador %d é quase certo de cancelar seu programa que é ativo? Não vi na declaração se não vai fazer nada se file == NULL retorne apenas. if (file == NULL) { printf("\n-->Nao foi possivel abrir o fecheiro\n\n"); return; } Pra que deslocar todo o seu programa pra direita? Dificultar a leitura? Considere declarar um typedef para struct Funcionario... Para que digitar isso toda hora? typedef struct { char categoria[20]; int Hora_Trabalhados; char nome[20]; char NIF[20]; float salario; } Funcionario; // Para não atrapalhar o bom funcionamento void menu(Funcionario funcionario[], int n); Essa construção é comum, mas devia ser evitada: Tudo isso é a mesma coisa. O prompt podia ser um parâmetro de pressioneEnter() não acha? Não seria original, já que o comum. E chamar flush(0 é supérfluo porque pressioneEnter() pode muito bem fazer isso. Limpar a tela e mostrar o menu novamente não sei... Precisaria ver o loop de execução de seu programa... Algo assim adicionado 16 minutos depois Considere seu programa assim: não mudei nada exceto o mínimo para compilar e aquele if() de que falei Coloquei um parametro em pressioneENTER() e um int ativo em Funcionario e mudei para um typedef. Mas não mudei nada da lógica. Parece um pouco confuso ainda. Considere as coisas que perguntei. Talvez prefira prosseguir com o programa assim como abaixo. Repito não mudei nada. Mas compila e as funções estão em ordem #include <conio.h> #include <locale.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> //Dados do funcionário typedef struct { int ativo; char categoria[20]; int Hora_Trabalhados; char nome[20]; char NIF[20]; float salario; } Funcionario; void EliminarFuncionario(Funcionario[], int); void flush(); void InserirFuncionario(Funcionario[], int); void menu(Funcionario[], int); void OrdenarFuncionario(Funcionario*, int); void pressioneEnter(const char*); int main() { setlocale(LC_ALL, "Portuguese"); Funcionario funcionario[100]; int n = 0; Funcionario* p = (Funcionario*) malloc(sizeof(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 2 vezes para iniciar->"); flush(); pressioneEnter(""); system("cls"); menu(funcionario, n); free(p); return 0; }; // main() void EliminarFuncionario(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"); return; } int i = 0; int nif; char resp; printf("\n\tInforme o NIF do funcionario a ser Eliminado: "); scanf(" %d", &nif); //while (funcionario[i].NIF == nif) so para compilar while (funcionario[i].NIF[0] == nif) { if (funcionario[i].ativo == 1) { printf("\n\tNome: %s", funcionario[i].nome); printf("\n\tNIF: %s", 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"); }; // while() fclose(file); pressioneEnter("\n\n\n\t\t\tPressione ENTER para Continuar->"); system("cls"); }; // EliminarFuncionario() void flush() { int c; /*Lê todos os caracteres até encontrar '\n' ou EOF:*/ while ((c = getchar()) != '\n' && c != EOF); }; // flush() void ImprimirFuncionarios(Funcionario funcionario[], int n) { FILE* file; file = fopen("C:\\Users\\alex\\Desktop\\ajuda\\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, " %s", 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: %s", 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"); } } pressioneEnter(""); system("cls"); fclose(file); }; // ImprimirFuncionarios() void InserirFuncionario(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); flush(); printf("\n\tDigite o NIF do funcionário: "); scanf(" %s", funcionario[i].NIF); printf("\n\tDigite o salario do funcionario: "); scanf(" %f", &funcionario[i].salario); flush(); 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 %s \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"); pressioneEnter("\n\n\n\t\t\tPressione ENTER para Continuar->"); system("cls"); menu(funcionario, y); } fclose(file); // para fechar o arquivo } void menu(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"); pressioneEnter("\tPressione ENTER para Sair->"); system("cls"); break; case 1: system("cls"); InserirFuncionario(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); } void OrdenarFuncionario(Funcionario* funcionario, int n) { int i, j; 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: %s", 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 pressioneEnter(const char* prompt) { char c; if(prompt != NULL) printf("%s", prompt); do { c = getc(stdin); } while (c != 13); }; // pressioneEnter() // fim
  21. Copiei seu programa. Pergunte algo objetivo e vou olhar logo mais
  22. Como está seu programa agora? Ainda precisa de algo? Isso foi o que eu perguntei. 3 vezes agora desde antes do almoço. Poste o programa como está agora e alguma dificuldade que tenha. Se se interessou por algo dessas "discussões meio paralelas" mas não compreendeu simplesmente como um ato de vingança "invada" a discussão paralela e pergunte algo
  23. Notou o que perguntei antes do almoço? Mas você tem razão se acha que seu tópico foi "invadido" por discussões meio estranhas. Vou parar. Escreva com a situação atual adicionado 0 minutos depois isso. @Andrah
  24. ? Fico em dúvida se está falando sério. Chamar uma variável local de buffer e usar scanf() para ler dela não mostra nada. O prefixo s é de storage, como deve saber, em sscanf() Você apenas leu tudo para uma área intermediária que aproveitou para chamar de buffer. O buffer de que se fala na literatura e é alvo de setvbuf() é uma área de armazenamento do sistema. Talvez pudesse falar de ungetc() que de fato existe e faz isso... PeekConsoleInput() é outro bicho BOOL WINAPI PeekConsoleInput( _In_ HANDLE hConsoleInput, _Out_ PINPUT_RECORD lpBuffer, _In_ DWORD nLength, _Out_ LPDWORD lpNumberOfEventsRead ); E permite inspecionar o buffer antes de ler. Não tem nenhum paralelo com o que está dizendo. Você usa isso na prática quando seu programa está fazendo algo em um loop. Seu programa single-thread, comum. E você precisa ler da entrada. Mas não pode ler da entrada porque vai parar o programa. Então você usa essa função para só ler quando sabe que tem algo. Pense em um game por exemplo. Ler tudo para uma variável local que você chamou de buffer é folclórico, mas é diferente. Acho que entendeu. Ou não? Só que você já leu. Aí vai apontar toda a leitura de seu programa para essa outra variável. Que até tem o nome de buffer. E criou uma nova camada com o mesmo problema. E se seu programa for multi-thread então pode ter consumido uma entrada que não era para o particular thread que leu o buffer. E aí vai ter que criar uma nova camada em seu programa para alimentar isso. Pense bem. Está mesmo falando sério ou só me testando...
  25. Se você sabe como imprimir os nomes, trata-se de uma ação. Apenas troque o código pela sua ação... Talvez devesse postar o código... Que explicação ficou faltando sobre dirent? Ela só vai te oferecer a lista de nomes dos arquivos mesmo. E se você já tem a tal ação não entendi o que falta.

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!