Ir ao conteúdo
  • Cadastre-se

ScreenBlack

Membro Pleno
  • Posts

    1.062
  • Cadastrado em

  • Última visita

Tudo que ScreenBlack postou

  1. Parece que você está usando um compilador muito defasado. Se conseguiu compilar esse código até o final, o compilador realmente está muitos problemas. Seu código está com dependência cíclica: Bibliotaca A <-> Biblioteca B Veja parte do resultado da minha compilação (pois tive de parar a compilação): In file included from X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:10:0, from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6, from X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:10, from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6, from X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:10, from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6, from X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:10, from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6, from X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:10, from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6, from X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:10, from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6, from X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:10, from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6, from X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:10, from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6, [...] Para evitar esse tipo de situação, utiliza-se controles de "#define" em cada biblioteca ("main.c" não precisa): #ifndef _LIB_A#define _LIB_A // Aqui vai o conteúdo da biblioteca...... #endif Agora aplicando o controle, parte do resultado foi esse: In file included from X:\Codigos_C\Arvore_AVL_e_Binaria\index_voo.c:6:0:X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c: In function 'proximo_b':X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:54:16: error: dereferencing pointer to incomplete type if( pai->entradas > 0 ) // apenas para assegurar que a arvore tem ^X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:59:33: error: dereferencing pointer to incomplete type for(pos=0; pos < pai->entradas-1; pos++) //percorre todos os filhos ^X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:65:32: error: dereferencing pointer to incomplete type if( strcmp( pai->voo[pos].chave, atual.chave ) == 0 ) ^X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:68:39: error: dereferencing pointer to incomplete type for(j=pos+1; j<pai->entradas; j++) // se encontrou, ^X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:76:31: error: dereferencing pointer to incomplete type if(pai->voo[j].chave[0] != '#') ^X:\Codigos_C\Arvore_AVL_e_Binaria\b_voo.c:78:39: error: dereferencing pointer to incomplete type return pai->voo[pos+1]; // retorna o próximo se Isso confirma que o compilador não conseguiu buscar a chamada para a função na biblioteca seguinte, fazendo com que o ponteiro não possuísse uma referência. E compilador que deixa isso passar, realmente vai dar erro de "Segmentation Fault". Estou utilizando interface gráfica Code::Blocks com compilador MinGW GCC 4.8.1.
  2. Entendi. Cara, manjo muito pouco de C++, mas vamos lá... Fiz um teste pra ver se a biblioteca validava as 3 teclas simultâneas, e o resultado foi que a leitura é sequencial: void AreAllKeysPressed2(void){ while (true) for ( int x = 0; x < 128; x++ ) for ( int y = 0; y < 128; y++ ) for ( int z = 0; z < 128; z++ ) if ( ( x != y ) && ( y != z ) && ( z != x ) ) if ( GetAsyncKeyState(x) & GetAsyncKeyState(y) & GetAsyncKeyState(z) & 0x8000 ) std::cout << "All" << std::endl; else if ( (GetAsyncKeyState(x) & GetAsyncKeyState(y) & 0x8000) || \ (GetAsyncKeyState(y) & GetAsyncKeyState(z) & 0x8000) || \ (GetAsyncKeyState(z) & GetAsyncKeyState(x) & 0x8000) \ ) std::cout << "Some" << std::endl;} Em nenhum momento ocorreu a leitura das 3 teclas simultâneas. Isso demonstra que a leitura sequencial prevalece sobre a paralela. Acredito que, para fazer o que você deseja, de maneira mais confiável, apenas usando threads. Sucessos aí!
  3. Faça a comparação das duas teclas ao mesmo tempo. Exemplo: if ( GetAsyncKeyState( VK_RIGHT ) & GetAsyncKeyState( VK_LEFT ) & 0x8000 )
  4. Não manjo muito de C++, mas sei que dá pra concatenar strings usando sinal de atribuição com adição. string str_1 = "palavra_1"; string str_2 = "palavra_2"; string saida = ""; saida = str_1 + " " + str_2;
  5. 1) Sim. Conforme o código retornado, você define a ação a ser tomada. 2) Sim. Basta trocar o nome atual da pasta por uma variável e fazer com que o programa solicite o nome ao usuário.
  6. Troque a sua mensagem de erro por esta: cout << "Codigo do erro: ( " << errno << " ) - Motivo: " << strerror(errno) << endl; Você verá qual o código retornado e assim saber qual o motivo para poder tratar.
  7. Parece que você cometeu um engano apenas na rotina de leitura dos dados. Coloquei o "while()" antes do menu, permitindo assim que seja mostrado a cada loop. Dessa forma não necessita do segundo menu, que não tem funcionalidade na forma como está e acaba confundindo. E a variável "i" que servia de controle para posicionar o vetor, foi trocada pelo "x" que possui o valor exato da quantidade de elementos no vetor. #include <stdlib.h>#include <stdio.h> struct info{ char nome[20]; char cargo[10]; int cod; int matricula; float salario;}; int main (void){ struct info funcionarios[20]; int ent = 0; int i = 0; int Tend = 0; int mat = 201400; int x = 0; for ( i = 0; i < 20; i++ ) funcionarios[i].matricula = mat++; while ( Tend == 0 ) { printf("\t\t\tBEM VINDO A E-commerce"); printf("\n\nSELECIONE UMA OPCAO:"); printf("\n1: PARA CADASTRAR FUNCIONARIOS."); printf("\n2: MOSTRAR RELATORIO DE FUNCIONARIOS."); printf("\n3: MOSTAR VALOR DA FOLHA DE PAGAMENTO."); printf("\n4: FINALIZAR E-commerce.\n"); scanf("%d", &ent); switch ( ent ) { case 1 : { system("cls"); printf("DIGITE OS DADOS DADOS FUNCIONARIO"); if ( x < 20 ) { system("cls"); printf("\nNOME DO FUNCIONARIO:"); scanf("%s", funcionarios[x].nome); printf("\nCODIGO DO CARGO:"); scanf("%d", &funcionarios[x].cod); switch (funcionarios[x].cod) { case 1 : funcionarios[x++].salario = 4300; break; case 2 : funcionarios[x++].salario= 3500; break; case 3 : funcionarios[x++].salario = 5600; break; case 4 : funcionarios[x++].salario = 8900; break; case 5 : funcionarios[x++].salario = 10250; break; default : printf("OPCAO DE CARGO NAO VALIDA POR FAVOR TENTE NOVAMENTE"); break; } } break; } case 2 : printf("\n\nRELATORIO DE FUNCIONARIOS:\n\n"); for ( i = 0; i < x ; i++ ) printf("NOME:%s\nMATRICULA:%d\nSALARIO:%.2f\n\n", funcionarios[i].nome, funcionarios[i].matricula, funcionarios[i].salario ); break; case 3: break; case 4 : Tend++; break; default: system("cls"); printf("OPCAO NAO VALIDA POR FAVOR TENTE NOVAMENTE"); break; } } return 0;}
  8. Bom, nesse caso, creio que a melhor forma seria trabalhar com versão de base de dados. Na hora de carregar os valores, verificar qual versão a base está e a partir daí usar a estrutura adequada. Os dados estão sendo salvos em binário ou texto?
  9. É atividade de aula? Quando se modifica o tamanho de uma struct, será necessário reajustar todos os elementos do arquivo. Caso contrário, uma struct irá sobrescrever a próxima. Como não é possível a criação de um novo arquivo para que seja feita a alteração uma a uma, então, terá de carregar todos os dados em memória para fazer as alterações. Já que terá de fazer esse carregamento, porque não fazer a migração como comentei no post anterior? Assim não ficará com parte do conteúdo numa variável e parte noutra.
  10. ScreenBlack

    Estudo C++

    Não é boa prática utilizar dois métodos de leitura para o mesmo tipo de entrada (teclado). A função "fflush()" está sendo usada de maneira errada. Ela é utilizada para buffer de saída e não de entrada. Portanto, ela não é portável e pode ter comportamento inesperado. O buffer fica "sujo" porque o caracter que representa a tecla ENTER ('\n') é mantido no próprio buffer e será lido na próxima próxima leitura. Usando a função "scanf()", dá pra ignorar esse caracter usando "%*c" após o "%s". Ajustei o código pra seguir um padrão: #include <stdlib.h>#include <stdio.h> int main(void){ char nome[50] = {'\0'}; int idade = 0; int faixaEtaria = 0; int qtdAcimaOitenta = 0; int opcao = 0; int opcaoWhile = 1; float peso = 0; float mediaIdadePeso = 0; while( opcaoWhile ) { printf("Escolha uma opção:\n1 - Inserir\n2 - Mostrar resultado\n3 - Sair\nOpcao: "); scanf("%d", &opcao ); printf("\n\n"); switch( opcao ) { case 1: /* Nome não está sendo usado */ printf("Nome: "); scanf("%s%*c", nome); // pega o nome; printf("Peso: "); scanf("%f", &peso); // pega o peso; printf("Ano: "); scanf ("%d", &idade); // pega o ano; idade = 2014 - idade; printf("\n\n"); if ( idade >= 20 && idade <= 30 ) // verifica a idade; faixaEtaria++; if ( peso > 80 ) // verifica o peso; mediaIdadePeso = ( ( mediaIdadePeso * qtdAcimaOitenta ) + idade ) / ++qtdAcimaOitenta; // Média incremental break; case 2: printf ("\n\nTotal de pessoas entre 20 e 30 anos: %d\n", faixaEtaria ); // mostra quantas pessoas possuem idade de 20 a 30 anos; printf ("Idade media das pessoas com mais de 80 kilos: %.2f\n\n\n", mediaIdadePeso ); // média da idade das pessoa com mais de 80 kg; break; case 3: default: opcaoWhile = 0; } } return 0;}
  11. Precisa fazer a migração dos dados. Carregar os dados na estrutura antiga, copiar os dados para a nova e salvar em arquivo novamente.
  12. 1) No seu "if()" tem: "(nota1 = 0) || (nota2 = 0)" Isso é atribuição de valor (comentário 2 em meu post anterior). É isso mesmo o que quer neste "if()"? 2) Também no "if()", a comparação que está sendo feita: (nota1 >= 0) OU (nota1 <= 0) OU (nota1 == 0) // Retorna sempre verdadeiro (nota2 >= 0) OU (nota2 <= 0) OU (nota2 == 0) // Retorna sempre verdadeiro 3) Não é necessário utilizar a lib "math.h" para operações simples. No mais, seu código está correto.. Validar se o conteúdo lido é realmente um inteiro, é preciso armazenar em char e depois validar com a tabela ASCII. Em C, todo valor char, internamente é um inteiro. Por exemplo: char letra = '2'; printf("valor char: %c\nvalor inteiro: %d\n", letra, letra); Saída: valor char: 2 valor inteiro: 50 Os valores numéricos em "char", vai do valor decimal 48 a 57. Conversão de "char" para "float", o princípio é o mesmo, apenas atentando para onde está a vírgula e poder fazer a separação das casas na hora da conversão.
  13. 1) Você está usando "%f" e "%d", que não são variáveis, mas sim, máscaras de formatação para definição de tipos em linguagem C. Por exemplo: int numero;scanf("%d", &numero); // Função que faz leitura da interface de entrada (teclado), tratando o conteúdo lido como sendo do tipo inteiro ("%d") e armazenando na variável "numero". Perceba os 3 pontos que precisam estar condizentes, ou seja, terem como base o mesmo tipo: - O valor informado pelo usuário, - A máscara de formatação, - O tipo da variável. Logo, para fazer comparações, é necessário, no mínimo, dois valores (conteúdos). Esse conteúdo pode ser através de uma variável ou definido diretamente no código (valor estático). Pode exemplo: while( numero != 0 ); Utilizei o valor contido na variável que recebeu o valor definido pelo usuário (exemplo anterior) e comparei com um valor estático (zero). Novamente, mantendo a mesma base de comparação, que neste caso é o tipo inteiro. O tipo "float": A linguagem C permitide que o valor recebido seja um inteiro e armazenado diretamente numa variável "float", porém, a forma como será armazenada na variável (que não visível ao programador, de maneira direta), será diferente. O contrário (converter de "float" para inteiro), daí a coisa complica um pouco. Não entrarei na explicação nesse momento, para não confundir. Exemplo sobre a explicação do "float": Valor digitado pelo usuário: 2 (número inteiro) Formato do valor armazenado numa variável do tipo inteiro: 2Formato do valor armazenado numa variável do tipo "float": 2.0 Em matemática, o "ponto zero" não faz diferença, mas na programação, sim. 2) Sinal de atribuição e comparação. Exemplo: valor2 = valor1; // Atribui (mesmo que copiar) conteúdo da variável "valor1" em "valor2" if ( valor2 == valor1 ); // Faz a comparação entre as variáveis e retorna o resultado dessa comparação (VERDADEIRO se forem iguais, caso contrário, FALSO)if ( valor2 != valor1 ); // É a inversão da comparação anterior (FALSO se forem iguais, caso contrário, VERDADEIRO) if ( valor2 >= valor1 ); // Compara se "valor2" é maior ou igual a "valor1"if ( ( valor2 > valor1 ) || ( valor2 == valor1 ) ); // Tem o mesmo resultado que a comparação anterior, porém, feito de uma maneira diferente. OBS: As explicações acima é para programação em nível inicial. Espero que ajude. Att
  14. Sobre sua primeira dúvida: Existe um elemento comum, que permite distinguir os campos. Que é o traço. A partir daí, basta fazer a leitura da variável de entrada e separar os valores. Sobre sua segunda dúvida: No segundo "scanf()" está faltando o identificador de tipo de conteúdo. ("%[^\n]s") No mais, a lógica parece estar correta.
  15. Qual sua dúvida? Qual erro está ocorrendo? Att
  16. Como por padrão a linguagem C é baseada na tabela ASCII, para cada caracter tem um valor decimal associado. Se reduzir o valor 32 de cada valor decimal das letras minúsculas, conseguirá converter todas para maiúsculas. Não pode esquecer de validar quais são os valores decimais de cada letra minúscula, antes de efetuar a conversão (subtração), para evitar de converter coisa que não deve. if( (variavel >= 97) && (variavel <= 122) ) variavel -= 32;
  17. ScreenBlack

    Letra

    Se for a codificação, você pode usar a função "setlocale()" em C.
  18. Você não está zerando a variável "c", depois que finaliza a linha. if( c == 51 ) { l++; c = 0; }
  19. Coloque o menu principal dentro do "while()", antes do "scanf()". E pode retirar o segundo menu.
  20. O erro está na assinatura da função "init_primos()" O parâmetro 'char' está aguardando apenas um caracter. void init_primos( char [], int );
  21. ScreenBlack

    Ranking

    É por isso o erro. As rotinas não estão sendo executadas de maneira ordenada. Tem subfunção chamando a função principal, fazendo com que as rotinas necessárias para contagem e gravação não sejam executadas. A função "funcaojogo()", está sendo chamada dentro das funções "continua()", "cadastro()" e "menu()". Se você concentrar a chamada "funcaojogo()" em apenas uma função (mais aconselhada, no seu codigo seria no "menu()"), você consegue ter um controle maior sobre o que está acontecendo, facilitando também o controle da contagem e armazenamento dos dados em arquivo. Outro erro no seu código, está na função "registro()". Está sendo gravado os mesmos dados nos dois arquivos. Att
  22. ScreenBlack

    DUVIDA EM C

    Troque os dois "for()" por esse abaixo: for (i = 1; i <= N; i++){ str1[strlen(str1) - i] = str[strlen(str) - i];} Acho que assim vai funcionar.
  23. 1) Torne a variável "numdamatriz" em duas. Uma sendo "numdalinha" e outra "numdacoluna". Pode também tornar a variável "numdamatriz" em um vetor de 2 posições. Fica a seu critério. 2) Dentro da função "tirarmedia()", crie duas variáveis. Por exemplo: "diferenca" e "diferencaMedia". - A variável "diferenca" será utilizada no lugar da atual "numdamatriz". - A variável "diferencaMedia" será para armazenar a menor diferença total. Sempre que a comparação for verdade, armazene as posições da matriz em suas respectivas variáveis ("numdalinha" e "numdacoluna"). A partir daí, é só mostrar o valor na tela utilizando as posições armazenadas para posicionar a matriz "matriz[][]". Espero ter ajudado. Att
  24. Utilize o método da torre de hanoi.
  25. Como saber em que posição do vetor o conteúdo deve ser armazenado, sendo que a variável 'i' está em branco?

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!