Ir ao conteúdo
  • Cadastre-se

vangodp

Membro Pleno
  • Posts

    1.752
  • Cadastrado em

  • Última visita

Tudo que vangodp postou

  1. 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.
  2. //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; } 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. 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. >_<
  3. 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...
  4. 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
  5. 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 >_<
  6. 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 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: O usuario tem 20 NIFs?
  7. não tem problema... simplesmente edite e tudo certo. Logo aguarde que seja analisado o problema, fique atenta.
  8. por favor use o botão <> para postar códigos. Se não percebou, ao não usar o botão <> seu código foi alterado pois os caracteres fazem que a letra seja cursiva(tombada).
  9. você vai acabar me convencendo shuehsueh
  10. Pera ai... você tem algo em contra do codeblocks n é? >_<
  11. você não pode estar mais errado XD-> Code::Blocks Nightly Builds Uso codeblocks 20.03 com seu compilador incluído por default. Contei que era o 8.2 mas é o 8.1(Erro meu). Mas o erro da em todas as versões que provei. Levo provando versões desde 2011 mais ou menos, e lembro que naqueles tempos rodava as 4.X, e os long long int %lld sempre foi um incomodo, por isso acredito que não seja um erro si não algo que ignoro por completo, porque leva muitos anos igual e não acredito que sejam tão burros como eu. Por antanho ainda rodava o XP. >_< você falou que usa visual studio anteriormente, e em alguns casos outros ambientes/compiladores, então omiti essa pergunta, porque para mim é óbvio que nesse ambiente da Microsoft, n ta dando erro. não...! Não mudei uso codeblocks 20.03 com o compilador que traz por defaut(8.1). Confesso que é coisa temporal porque quase sempre enlaço codeblocks com o ultimo mingw-w64 disponível aqui->https://sourceforge.net/projects/mingw-w64/files/ Mas como você pode ver, codeblocks traz um compilador igual(mesma versão), então de momento estou com codeblocks 20.03 com compilador por default, que é o 8.1. Estou esperando se vai sair a versão 9, pois no tdm gcc ja traz, se demorar instalo o tdm gcc mesmo. Sei que o visual studio é mais aceitado no mundo empresarial, mas como só uso compiladores e esses tipos de programa a modo de estudo fico com codeblocks pois estou mais acostumado com ele. Um dia talvez migre porém n sei se vou para o visual studio. Isso porque você ainda n compilou seu programa com mingw né.
  12. Estou usando o ultimo codeblocks(oficial). Suponho que seja das ultimas versões de mingw. Sobre os flags de compilação são os normais: adicionado 8 minutos depois falha tanto com -std=c11 como -std=c99, mas funciona com o define -D__USE_MINGW_ANSI_STDIO=1 adicionado 9 minutos depois não sei que compiladores vcs tão usando mas com mingw isso gera avisos. adicionado 22 minutos depois Não sei o que dizer Rodar roda, são "apenas" avisos. Continuo sem saber o que lhe digo. Somente que uso codeblocks conjunto mingw(quase sempre a ultima versão). 8.2 é o que uso atualmente já que vem com codeblocks agora mesmo. gostos... questão de gostos Nem lhe aconselho... sei que em linux vai tudo como a seda. Boa hehe Com o -D__USE_MINGW_ANSI_STDIO=1 que me indicou o @isrnickfuncionou certinho. Mas sempre gosto de soluçoes mais ortodoxa >_< adicionado 27 minutos depois Solução do @isrnick
  13. Fica difícil lhe ajudar se você for soltando códigos a conta-gotas. Tenho que poder compilar seu código para poder ver os erros. Em fim. Boa sorte.
  14. Temo que se não mostrar tudo vai ficar sem facebug >_<
  15. adicionado 9 minutos depois A única forma de não dar avisos é usando %I64d no lugar de %+lld . Se não lembro mal no windows gcc faz uso das bibliotecas da microsoft para esse tema de long long, por isso quando usar lld que sim funciona em linux, em windows da avisos. Só não sei o que por no lugar de %llu pois da avisos nessa linha
  16. se o que você quer é algo como isso-> dd/mm/ano você pode ter uma data como essa->29/04/2020 de entrada. a coisa fica assim: quando o programa pedir uma data você digita 29/04/2020 e pulsa enter. 29->d //dia /->lixo //É descartada 04->m //mes /->lixo //É descartada 2020->a //ano entendeu?
  17. fprintf ( cliente, "%s", &paciente.nome ); leva & adiante das variaveis? Todos esses fprintf que levar & ta errado. & você só deve por em scanf, fscanf ou sscanf, e não com strings nem com ponteiros. O pior é que você tenha escrito todo esse código sem verificar isso? Arrume isso e tente imprimir na tela o que escreveu, depois você manda para o arquivo, por todos seus fprintf n estão funcionando. Quem é seu professor? É para não passar perto dele adicionado 4 minutos depois Da próxima vez pegue uma string, mostre ela na tela para estar seguro de que pegou os dados corretamente, e somente depois envie ao arquivo. volte a repetir o processo, pegue o dado, imprima, envie para o arquivo e verifique se escreveu. Nuca termine um programa antes de corrigir um bug, caso contrario você estará propenso a ter que reescrever tudo ou uma grande parte do seu programa.
  18. int d, m , a; char lixo; cin>>d>>lixo>>m>>lixo>>a; cout << d <<' ' << m << ' ' << a << endl; int d, m , a; char lixo; cin>>d>>lixo>>m>>lixo>>a; cout << d <<' ' << m << ' ' << a << endl; entre com 10/02/2010 por exemplo adicionado 3 minutos depois E uma dica... Não faça spam, simplesmente espere.
  19. Me parece perfeito para exercitar. Qual sua duvida?

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