Ir ao conteúdo
  • Cadastre-se

Edmorte

Membro Pleno
  • Posts

    172
  • Cadastrado em

  • Última visita

Tudo que Edmorte postou

  1. Senhores, feliz ano novo a todos. Deixarei um presente para aqueles que sempre perguntam como fazer algo e a qualquer momento receber uma entrada do usuário informando que não quer mais ou qualquer outra coisa. O código é simples, mas requer um conhecimento de C++, aproveitando o C++11 e que venham o 14 e o 17 para fazermos coisas melhores. Aqui simulei um trabalho (sleep 10s) se o usuário digitar 0 e enter, o programa termina antes, senão ele termina após os 10s. Esse problema é normalmente perguntado por novatos em C que querem fazer coisas mais interativas, mas não conseguem porque entrada de dados é uma operação com bloqueio. Aproveitem para ver como o C++ é muito melhor de programar do que o C puro. O mesmo pode ser feito em C com threads, mas eu não irei fazer. Também é possível fazer o mesmo em C#, mas nem vale a pena, qualquer janela de Windows Forms já é superior. No mais evitem threads puras, foquem nas tasks e assincronias do C++/C#. #include <future>#include <iostream>#include <chrono>#include <thread>namespace ExemploAssincrono{ using namespace std; void LerEntrada() { int n; cin >> n; if (!n) { cout << "Terminando programa antecipadamente\n"; exit(EXIT_SUCCESS); } }}int main(){ std::async(std::launch::async, []{ ExemploAssincrono::LerEntrada(); }); std::cout << "Simulando trabalho por 10s\n"; std::this_thread::sleep_for(std::chrono::milliseconds(10000)); std::cout << "Terminado normalmente\n"; return 0;}
  2. Porque elas são referências. Esqueci que em C não tem referência, como eu disse quis simular um tail-call, o compilador do C não deve saber otimizar, mas quis passar o conceito. Acredito que substituindo por ponteiros e fazendo ajustes não deve trazer problemas. Corrigi para ficar 100% C: http://coliru.stacked-crooked.com/a/26733ec99659c056 Se estivessemos programando uma linguagem funcional resolveriamos usando TUPLA, mas no C melhor usar o argumento como retorno, por isso usei PONTEIRO/REFERENCIA.
  3. Fácil demais man, vai estudar né. Para dar emoção, usando Linq: int[] xpto = new int[] { -9, 8, -7, 6, -5, 4, -3, 2 };int qtde = xpto.Count(n => n < 0);
  4. Faz tempo que eu não entro no site, mas como recebi um email vim verificar, estava cansado de ninguém avaliar as respostas, mas curiosamente o usuário tinha voltado para agradecer, recebi um email e voltei. Também não resolvo programa para os outros, mas quando a complexidade é alta eu coloco um código para servir de plataforma para os iniciantes. Segue abaixo: #include <stdio.h>void minmaxrec(int* array, int length, int& min, int& max){ if(!length) return; if(array[length - 1] > max) max = array[length - 1]; if(array[length - 1] < min) min = array[length - 1]; minmaxrec(array, length - 1, min, max);}int main(int argc, char **argv) { int array[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; int min = 100, max = 0; minmaxrec(array, 10, min, max); printf("min: %d, max: %d", min, max); return 0;} Eu não sei se eu alcancei a técnica TAIL recursion, mas tentei exemplificar ela. Rodando em: http://coliru.stacked-crooked.com/a/e092efe4501ad012
  5. Edmorte

    como fazer

    NUNCA, MAS NUNCA, FAÇA ISSO. JAMAIS! PÉSSIMO, HORROR, AAAAAARGH. MORRI.
  6. Você declarou as strings como char. Declare uma em cada linha. Boa sorte.
  7. a chamada de loop está sem ; você deixou um { sobrando no código. Um deles depois do void loop sem ; e o outro antes do digitalWrite (led, HIGH); //Ligar Tem um if no final sem condição. Bem sinistro esse código.
  8. fread(&B, sizeof(Banda), 1, banda);while (!feof(banda)){ if (strcmp(B.nome, nome)==0){ cod_banda = B.cod_banda; } fread(&B, sizeof(Banda), 1, banda);}// Alteradorewind(album);fread(&A, sizeof(Album), 1, album);while (!feof(album)){ if (A.cod_banda2==cod_banda){ cod_cd=A.cod_cd; // Para cada album da banda rewind(musica); fread(&M, sizeof(Musica), 1, musica); while(!feof(musica)){ if (M.cod_cd2==cod_cd){ printf ("\n\tCodigo da Musica: %d\n", M.cod_musica); printf ("\tCodigo do CD: %d\n", M.cod_cd2); printf ("\tMusica: %s", M.musica); printf ("\tDuracao: %d\n", M.duracao); printf ("\tClassicacao: %d\n", M.estrelas); } fread(&M, sizeof(Musica), 1, musica); } } fread(&A, sizeof(Album), 1, album);} Desculpa a formatação ruim, conflito de editores. Acho que esse ajuste deve funcionar, fiz de cabeça aqui. Para cada album da banda, devemos ler suas músicas e imprimi-las. Coloquei o código dentro do IF, se o album é da banda faça, repita para o próximo album. Se não funcionar, upa os bin carregados que eu testo.
  9. Veja bem, você pode aplicar uma visão simplista: - Subtraia apenas os dias; - Converta isso pra segundos; - Retire do total a quantidade de segundos (conversão) do primeiro dia; - Calcule quantos segundos (de novo converta) o quanto de horas não foram usados do dia fim (24h - hora especificada). Não se esqueça, trabalhe apenas com segundos. Esse tipo de abordagem não leva em conta datas que cruzam o mês. Agora, você precisa retirar as horas já gastas do 1º dia e as horas não usadas do 2º dia. Exemplo: 1° Dia começou as 10h, você subtrai 10 * 60 * 60 do total. Porque essas horas não foram usadas pelo dia da festa. 2º Dia terminou as 22h, você subtrau (24 - 22) * 60 * 60. Pois o resto do dia não foi usado pela festa. Depois do valor em segundos, recupere os valores usando resto (%) e divisão inteira (/). Exemplo de como desfazer: 100.000 segundos são: - 100000 / 24 * 60 * 60 = 1 dia - O resto (13600) conseguido com %, dividida por 60 * 60 = 3 horas. - O resto (40) / 60 = 0 minutos. - O resto do acima = 40 segundos. Acho que é o modelo mais fácil para iniciantes. Atente para o fato (Dia Final - Dia inicial) + 1 = quantidade de dias.
  10. Nesse caso aí, tem que estudar matemática... Quando você tiver o código posta aí que nois ajuda, mas sinceramente se você entender a matemática da coisa você resolve.
  11. 1° Dica, esquece esse papo de festa, é pura distração do problema real. 2° Tem que manjar de data, quem manja de data sabe que o computador tem uma representação numérica para data, se você quiser pode fazer manualmente, vai ficar ruim. Ou, leia esse link. http://www.cplusplus.com/reference/ctime/time/ E faça ez mode.
  12. Cara, //processamento Isso não é comentário, é perda de tempo. // Processa do indice 0 ao 4, insere caracteres aleatórios. Isso é um comentário. Agora, for (coluna = 'a'; coluna <= 'z'; coluna++) Não faz nenhum sentido, você está confundindo o que você QUER fazer, com o que você PODE fazer. Coluna só só pode ir de 0 a 4, foi o espaço que você reservou, se você acessar o espaço 5+, no caso do 'A' você está acessando o 49 (não lembro), é uma operação ilegal.
  13. Pode deixar, to fazendo aqui... Aguarde.
  14. @arsenium Foi mal cara, falei o nome da função errada. Abaixo um pequeno código para te mostrar como funciona. Pouco complexo, precisa entender de memória. É apenas um exemplo, use strcpy pra copiar a memória para onde você precisar, não use dessa forma. #include <stdio.h>#include <string.h>using namespace std;// Texto que você está dando parsechar phrase[] = "Aqui mora <boom>xpto</boom> master";void print_tag_content(char* open_tag, char* close_tag){ /* Aqui nós encontramos o começo da tag e deslocamos para o começo do conteúdo. ponteiro value é usado para manter a posição inicial do conteúdo, pois vamos mover open_tag */ char* value = open_tag = strstr (phrase, open_tag) + strlen(open_tag); /* Precisamos saber qual a posição de close_tag na memória! Senão o loop abaixo falha. */ close_tag = strstr (phrase, close_tag); /* Move-se open_tag até que ele chegue no close_tag, ficamos com o tamanho do conteúdo dentro de i */ // Otimização int i = close_tag - open_tag; //int i = 0; //while(open_tag++ != close_tag) ++i; //Sabendo o tamanho do conteúdo, finalizamos com fim de string e matamos o resto da string. value[i] = '\0'; printf(value);}int main() { // Tag de abertura e fim do elemento a ser procurado char open_tag[] = "<boom>"; char close_tag[] = "</boom>"; print_tag_content(open_tag, close_tag); // Perceba que alteramos o conteúdo original printf("\n"); printf(phrase); return 0;}
  15. Edmorte

    Pilha c++

    Tenho que terminar com '!' porque se o que eu estiver procurando não estiver procurando Olha essa frase, como uma pessoa pode entender algo que afirma e depois nega?
  16. Edmorte

    Pilha c++

    Cara acho melhor você separar os comandos do seu parser em uma LISTA e deixar a PILHA apenas para entrada. Esse estado também me parece gambiarra, tem lógica melhor. Se você separar as coisas a lógica aparece. A questão do !, que é o seu pedido de ajuda. Não tem muito o que fazer champ, você vai ter que escrever uma função que analisa cada entrada procurando por ele, isso claro sem perder o comando. O que você fez está incompleto, por isso não está funcionando. STRCMP não faz milagre, alias C é o mais difícil de se usar, vai fazer muito trabalho manual ainda. E mais, não tem como te ajudar, porque você documentou muito mal o que quer fazer, tenha mais atenção ao descrever seu programa, eu mal consegui entender o que você escreveu.
  17. Edmorte

    Erro misterioso

    Cara, o simbolo '\0' é um char, só se aplica a cadeia de chars. Guardar o CPF como int seria algo meio sinistro não? Acho que nem caberia em 32bits. Seria o maior desperdício de memória.
  18. Estava quase certo, então eu dei uma corrigida. Faça um teste de mesa que você vai entender. Você esqueceu de colocar o fim de string na nova string que você estava montando e esqueceu de tratar o espaço em branco. No mais foi um erro no loop, o primeiro loop anda 1 posição da palavra original, e para cada iteração dessa ele testa todas as outras do array alfabeto. O break otimiza o laço, terminando o laço interno, para prosseguir mais rápido. Afinal já encontramos o item, não há porque continuar procurando. #include <stdio.h>#include <stdlib.h>#include <string.h>int main() { char vetor_alfabeto[27]="abcdefghijklmnopqrstuvwxyz"; char vetor_matriz [27]="jdjnvjnjfgkfmldmknkbnkmvkk"; char vetor_analise[31]="meu nome completo"; char vetor_resultado[31]; int i, k; int tamanho = strlen(vetor_analise); for (k = 0; k < tamanho; k++) { for (i = 0; i < 27; i++) { if(vetor_analise[k] == vetor_alfabeto[i]) { vetor_resultado[k] = vetor_matriz[i]; break; } else if (vetor_analise[k] == ' ') { vetor_resultado[k] = ' '; break; } } } vetor_resultado[tamanho] = '\0'; printf("Resultado: %s\n", vetor_resultado); }
  19. Não man. Você coloca seu programa em um loop que só termina quando o usuário diz opção "sair". Você sabe o que fazer, mas não sabe como chegar lá. Existem 2 pontos no seu programa. 1° Operar matematicamente sobre o array. 2° Oferecer um menu para o usuário escolher o que quer fazer, e continuar assim até que ele queira sair. Você só alcançou o número 1. Existem vários posts por aí com esse menu, só procurar que você vai entender.
  20. Cara, não sei como falar de outra forma, então vou ter que ser curto e grosso. Você não entendeu o problema. Está errado a sua compreensão sobre como os dados são inseridos. Se o usuário quiser colocar os 50 números, ele vai escolher a opção inserir 50x. É assim que aplicações console funcionam, por isso que ninguém usa isso profissionalmente. Você pode otimizar esse processo, mas aí vai inserir uma complexidade desnecessária em algo puramente didático.
  21. Não você está fazendo uma leitura incorreta do problema. A operação de inserir, insere APENAS 1 POR VEZ no final da FILA (já até identificaram o tipo de estrutura para você). Ou seja, Primeiro a entrar, primeiro a sair. Sempre insere os novos no final.
  22. O exercício é bem simples, ler, armazenar e calcular. Esse negócio de ler vazio é coisa da sua mente. A sua dúvida pode vir a ser, como sei qual a quantidade de itens do array se ele tem tamanho fixo 50 na memória, simples controle a quantidade de itens dele com um contador. O usuário digita um item por vez. Esse programa é uma simples implementação de fila, nem precisa alocar memória, pois o exercício já diz que o tamanho máximo é 50. O usuário não é obrigado a preencher tudo.

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!