Ir ao conteúdo
  • Cadastre-se

isrnick

Membro Pleno
  • Posts

    1.550
  • Cadastrado em

  • Última visita

Tudo que isrnick postou

  1. @arfneto Ao dizer que é "lixo", não se esta dizendo que '\n' apareceu do nada ou indevidamente na stdin, claramente ele é acrescentado a string do stdin quando aperta Enter, exatamente como deveria. O sentido de dizer que '\n' e qualquer outra coisa que sobrou até o '\n' na stdin, depois do scanf ler a parte relevante para a entrada de dados, ser um "lixo", é o de implicar que o que sobrou não será usado pelo programa logo deve ser descartado, ou seja está de fato tratando o texto contido na stdin.
  2. Não sei ao certo quão correto é usar essa função setbuf para limpar stdin, mas se quiser usar no código basta trocar essa função flush: void flush(){ int c; /*Lê todos os caracteres até encontrar '\n' ou EOF:*/ while( (c = getchar()) != '\n' && c != EOF ); } Por isto: char buffer[BUFSIZ]; void flush(){ setbuf(stdin, buffer); } E não precisa mudar mais nada no código. @vangodp Sobre flush que postei originalmente (a primeira nesse post) as coisas que ele apontou a meu ver não são falhas, se você entende o que a função faz, também entende em que situação deve usar e quando não, ou seja só usa quando houver certeza de que pelo menos o caractere '\n' vai ficar sobrando no stdin. E usar para pausar a tela é uma vantagem, pois é melhor do que usar um único getchar() para pausar, pois vai limpar qualquer coisa que digitar se a pessoa não der Enter imediatamente. Outra coisa que eu não entendi é pra que ele quer limpar o stdin antes de fazer qualquer leitura do teclado? Se não tem nada para limpar? flush deve ser usada após os scanfs para limpar o que sobrou.
  3. @vangodp Você definiu char buffer com tamanho 100, mas deveria usar a constante BUFSIZ que é o tamanho ótimo de buffer estimado para um arquivo I/O. Usar a função setbuf(stream, buffer) é uma abreviação de usar setvbuf(stream, buffer, _IOFBF, BUFSIZ) , note que já é assumido o tamanho BUFSIZ para o buffer, se quiser usar um buffer com tamanho diferente terá que usar a função setvbuf() diretamente alterando o último parâmetro, ao invés de setbuf(). Outro problema é que você declarou o buffer dentro da função main, mas para stdin e stdout tem que ser declarado no escopo global, pois os streams de entrada só deve ser fechado quando o programa for finalizado, mas o buffer dentro do main será finalizado quando a função main acabar (e o stdin/stdout vai ficar sem buffer). Fonte: https://en.cppreference.com/w/c/io/setbuf
  4. 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; }
  5. O fórum alterou seu código, todos os [ i ] (sem espaços) sumiram do código, pois no fórum isso é a tag para deixar o texto em itálico, então metade do texto do seu tópico está em itálico. Leia minha assinatura abaixo para ver como postar código no fórum corretamente (e copie o código original que ainda tem os [ i ] para postar o código novamente). E também explique onde está tendo problema, ou quais as suas dúvidas.
  6. #include <stdio.h> main(){ int n; do{ printf("Digite numeros positivos (Para encerrar digite um numero negativo):\n"); scanf("%d", &n); printf("Numero digitado %d\n", n); }while(n > 0) }
  7. O número de versão 17.1 que mencionei é a versão mais recente da distro nuwen, não fiz referência alguma ao codeblocks...
  8. Eu pego a distribuição Nuwen: https://nuwen.net/mingw.html A versão atual da distro ( 17.1 ) já inclui GCC 9.2.0 e mingw-w64 7.0.0, e também inclui várias bibliotecas úteis em um único pacote, então não preciso baixar cada um separadamente, e já terei elas quando eu precisar.
  9. if(nota>4) { aluno[busca].av1 = 0; } else { aluno[busca].av1 = nota; } Aqui tudo funcionou corretamente como está programado, a única coisa que achei estranha que é para notas acima de 4 ele recebe nota 0?
  10. @vangodp No meu não deu nenhum warning, e eu até adicionei as flags de compilação para os warnings de formatação manualmente para ter certeza. Provavelmente é a versão do compilador que você está usando, ou alguma flag de compilação que está usando. Verifique que está com flag de versão da linguagem para C99 ou mais recente (ex: -std=c99 , ou -std=gnu11 , ou -std=c11 , etc), o meu está com -std=gnu11 . Se isso não resolver, então coloque a tag de compilação: -D__USE_MINGW_ANSI_STDIO=1 Ou então inclua no código (antes do stdio.h): #define __USE_MINGW_ANSI_STDIO 1 Para forçar a usar stdio.h padrão ao invés da versão da Microsoft.
  11. Modificado: #include <stdio.h> #include <limits.h> int main(int argc, char** argv) { printf("sizeof(long long int) = %lu bytes\n", sizeof(long long int)); printf(" 0 1 2 2\n"); printf(" 0 5 0 5 0 5\n"); printf("(8) v = %20u\n", UCHAR_MAX); printf("Hex v = %20X\n", UCHAR_MAX); printf("(16) v = %20u\n", USHRT_MAX); printf("Hex v = %20X\n", USHRT_MAX); printf("(32) v = %20u\n", UINT_MAX); printf("Hex v = %20X\n", UINT_MAX); printf("(32) v = %20lu\n", ULONG_MAX); printf("(32) v = %20lX\n", ULONG_MAX); printf("(64) v = %20llu\n", ULLONG_MAX); printf("Hex v = %20llX\n", ULLONG_MAX); return 0; } Versão com todos os limites de inteiros copiada do site https://en.cppreference.com/w/c/types/limits : #include <stdio.h> #include <limits.h> int main(void) { printf("CHAR_BIT = %d\n", CHAR_BIT); printf("MB_LEN_MAX = %d\n", MB_LEN_MAX); printf("\n"); printf("CHAR_MIN = %+d\n", CHAR_MIN); printf("CHAR_MAX = %+d\n", CHAR_MAX); printf("SCHAR_MIN = %+d\n", SCHAR_MIN); printf("SCHAR_MAX = %+d\n", SCHAR_MAX); printf("UCHAR_MAX = %u\n", UCHAR_MAX); printf("\n"); printf("SHRT_MIN = %+d\n", SHRT_MIN); printf("SHRT_MAX = %+d\n", SHRT_MAX); printf("USHRT_MAX = %u\n", USHRT_MAX); printf("\n"); printf("INT_MIN = %+d\n", INT_MIN); printf("INT_MAX = %+d\n", INT_MAX); printf("UINT_MAX = %u\n", UINT_MAX); printf("\n"); printf("LONG_MIN = %+ld\n", LONG_MIN); printf("LONG_MAX = %+ld\n", LONG_MAX); printf("ULONG_MAX = %lu\n", ULONG_MAX); printf("\n"); printf("LLONG_MIN = %+lld\n", LLONG_MIN); printf("LLONG_MAX = %+lld\n", LLONG_MAX); printf("ULLONG_MAX = %llu\n", ULLONG_MAX); printf("\n"); }
  12. É o trecho postado pela Julia Leite (a criadora do tópico), só peguei e o código e desenvolvi o resto. Sim, claro que seria mais eficiente fazer 1 lista só diretamente, mas está assim por que o enunciado especifica explicitamente que devem ser criadas 2 listas separadas, e depois uni-las e ordenar... Verdade, quebrei minhas próprias regras de sempre criar o free correspondente a cada malloc imediatamente toda vez que usar a função malloc, vou alterar. Segue: https://onlinegdb.com/r1DAelKKU
  13. É a mesma coisa: int inverteHex(int x){ int i=0; do{ i=i * 0x10 + (x % 0x10); x=x / 0x10; } while(x>0); return (i); } Só muda 10 para 0x10 (=16 em decimal). Poderia fazer assim também: int inverteHex(int x){ int i=0; do{ i=i * 16 + (x % 16); x=x / 16; } while(x>0); return (i); } Mas o primeiro representa melhor que está trabalhando com hexadecimais. E não deve solicitar para o usuário digitar um número, o enunciado está pedindo para testar todos os números entre 0 e 10000 e achar todos que sejam capicua tanto em decimal quanto em hexadecimal (e imprimir todos eles nos 2 formatos).
  14. Converter de uma linguagem para outra não é simples, apesar das pessoas assumirem que seja. Isso envolveria descobrir o que o código está fazendo (eventualmente até tendo que aprender scilab) para depois fazer um código inteiro em C que tenha uma lógica parecida. Provavelmente seria mais fácil fazer o programa do zero se explicasse o que deve fazer. Mas fazer programas pelos usuários é contra as regras do fórum, só tiramos dúvidas e ajudamos a corrigir códigos que postarem, então poste seu código em C para que possamos te ajudar.
  15. @Lobarinhas No seu main você está passando para a função quick os valores das variáveis esq e dir mas essas variáveis não receberam valor nenhum, então tá mandando algum valor lixo que já estava na memória quando o programa foi executado.
  16. @Matheus Maldi Você não considerou o último comando da imagem da entrada onde está escrito "cod" esse comando serve para dizer que deve ordenar pelo código (idade no seu caso), alternativamente ao invés de "cod" poderia escolher digitar "nome" e nesse caso indicaria para o programa ordenar por nome. Leia o enunciado completo postado pela Julia Leite: Note também que cod é um identificador único, então não terá 2 cods iguais (o que não é o caso de idade).
  17. @arfneto Eu penso na bolha de sabão e a direção muda dependendo do gás que põe dentro. E quem deu o nome foram os americanos que usam bolha (Bubble) cotidianamente para indicar isolamento, tem até uma expressão "living in a bubble" (vive numa bolha) para indicar alguém vivendo fora da realidade.
  18. @arfneto Uma bolha não necessariamente flutua para cima, bolhas também podem afundar, depende da diferença de densidade entre os 2 fluidos. A característica que define a existência de uma bolha é a separação/isolamento dos fluidos, ou seja o fato deles não se misturarem, e não importa a direção que se move ou se fica estática.
  19. isrnick

    Exercicio...

    @henriquex14 Crie um novo tópico com sua dúvida, e poste sua tentativa ou dúvidas para podermos te ajudar. (Você postou aqui e ressuscitou um tópico de 2009.)
  20. Tem mais de um jeito de interpretar o nome Bubble Sort . Pode considerar que os elementos maiores vão flutuando para o fim da lista a cada ciclo do loop. Ou também dá para considerar o fato de que somente 1 par de elementos adjacentes é considerada a cada operação de ordenação, ignorando o restante da lista, com se houvesse uma bolha isolando/destacando os 2 elementos adjacentes do resto da lista. Esse GIF até ilustra a suposta "bolha" em vermelho:
  21. Não é complicado, como sempre na programação faça por partes, e vá testando o programa a cada adição/alteração que fizer. Primeiro crie um vetor de 20 posições, e faça o código do loop que pede 20 vezes para o usuário digitar um valor e vai preenchendo o vetor. Faz o loop para imprimir os 20 valores do vetor. Depois faça a parte que usa um algoritmo de ordenação para ordenar os valores no vetor, basta pesquisar e vai achar vários algoritmos de ordenação, um algoritmo bem simples e muito usado por iniciantes é o Bubble Sort (ordenação por flutuação). E faz o loop para imprimir os 20 valores do vetor que devem estar ordenados. Se tiver problemas poste sua tentativa ou dúvidas para podermos ajudar.
  22. Essa função não indica se tem espaço para mais um elemento, ela só indica se está vazia, a função para checar se tem espaço é a que checa se está cheia. Na verdade ela seria usada quando estiver removendo elementos da lista, para indicar se ainda tem elementos para serem removidos. (E quando lista é NULL não tem items para serem removidos. hahahaha )
  23. @Mauro Britivaldo Não há dúvidas, o -1 na função do professor é para indicar VERDADEIRO. Afinal se fosse para indicar um erro então no escopo que chamou a função, teria que pegar o retorno da função e fazer um if else if para verificar se retornou -1, 0 ou 1, e se vai ter que fazer isso para que a função foi criada? Nesse caso seria melhor não usar a função e testar direto no escopo original se é NULL e se está vazia. A única vantagem dessa função é possibilitar fazer isso: if( lista_vazia(lista) ){ //faz algo } Então só tem uma possibilidade o -1 é para indicar VERDADEIRO.

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!