Jump to content

All Activity

This stream auto-updates     

  1. Today
  2. O Twitter baniu a conta de um grupo que supostamente vazou registro de 200 departamentos policiais. Segundo o The Verge, o grupo chamado Distributed Denial of Secrets (DDoSecrets) publicou recentemente quase 270 gigabytes de dados sob o título "BlueLeaks". O Twitter também adicionou uma página de aviso que aparece caso um usuário clique em um link existente direcionando ao conjunto de dados, alertando que o conteúdo foi identificado como "potencialmente prejudicial". O vazamento ocorreu após uma brecha na Netsential, uma empresa de desenvolvimento web que trabalhava com agências governamentais. O Twitter disse ao The Verge que o DDoSecrets violou as regras contra a publicação de materiais invadidos e foi suspenso permanentemente da rede. De acordo com um relatório obtido por Brian Krebs, o conjunto de dados do BlueLeaks continha algumas "informações altamente confidenciais", e-mails e outros materiais de departamentos de polícia de vários países. Aparentemente, os dados foram fornecidos por um suposto membro do Anonymous e, antes de divulgar, o DDoSecrets alega ter removido cerca de 50 gigabytes de dados, incluindo detalhes sobre vítimas de crimes e informações sobre saúde.
  3. Eu não verifiquei a lógica do merge sort. As modificações que eu fiz foram apenas na parte de leitura dos arquivos, e minha "investigação" do seu código passou por 4 etapas: 1. A formatação do arquivo CSV Como eu não sabia se seu arquivo CSV estava com os dados dispostos em linhas ou colunas, criei um arquivo CSV com os dados dispostos em cada formato para ver o que acontecia com seu código: - Se os dados estiverem dispostos em coluna, a primeira entrada será ignorada, e o programa processará o CSV a partir da segunda linha. Aí, o programa dá erro; - Se os dados estiverem dispostos em linha, a primeira linha será ignorada, e o programa processará o CSV a partir da segunda linha (como no caso acima). Se os dados estiverem todos na mesma linha, essa linha será ignorada, o loop de leitura dos dados se encerrará, e com ele, o programa. O que estava provocando isso tudo era esse trecho bem estranho: while (fgets(buf, 1024, fp)) { row_count++; if (row_count == 1) { continue; } ... } Na leitura da primeira linha, como row_count sempre ficara igual a 1, o código entra nesse if e executa o comando continue, que encerra a iteração atual do loop e passa diretamente para a próxima. Se o CSV tiver apenas uma linha, o comando dentro do while já terá chegado no final do arquivo, o que encerra o loop, fechando o arquivo em seguida, e fechando o programa, sem fazer nada. Mas esse não era o único problema do código, tampouco o mais crítico. 2. A leitura dos dados do arquivo para o programa A lógica de leitura do arquivo parecia bastante complicada. Aparentemente, a intenção do código era encontrar onde estavam as aspas do CSV para passar o conteúdo entre aspas para uma outra função que deveria passar os dados para uma estrutura chamada "dataset". Ocorre que C possui umas ferramentas bem legais para manipulação de strings. Deixei o loop de leitura do arquivo assim: while (fgets(buf, 1024, fp)) { field_count = 0; token = strtok(buf, ","); while (token != NULL) { remove_quotes(token_wq, token); process_field(field_count++, token_wq, i); token = strtok(NULL, sep); } i++; printf("\n"); if (i > TAMANHO) break; } Primeiro, strtok (em string.h) procurará por ocorrências de "," em buf. Por exemplo, se a linha do csv for "bla","ble","bli", a primeira ocorrência de strtok gerará a string "bla". As ocorrências seguintes, onde NULL aparece como argumento, irão, em sequência, gerar "ble" e "bli". Como não há "," depois do "bli", strtok retornará NULL no token, indicando que aquela linha não possui mais tokens. Outra função que aparece é a remove_quotes. Essa função eu criei para eliminar as aspas das strings: void remove_quotes(char* dst, char* src) { char* quote; int first_quote; int last_quote; int len; quote = strchr(src, '"'); first_quote = quote - src; while (quote != NULL) { quote = strchr(quote+1, '"'); if (quote) { last_quote = quote - src; } } len = last_quote - first_quote - 1; strncpy(dst, src+first_quote+1, len); dst[len] = '\0'; } Essa função utiliza a função strchr, que localiza a primeira ocorrência de um char (que nesse caso, é um char de aspas duplas) dentro da string iniciada pelo ponteiro indicado (que aqui eu chamei de src). Essa função encontrará as primeiras aspas da string, armazena sua posição relativa na string de origem, e vai encontrando, em seguida, aspas duplas até a função strchr retornar NULL. A posição relativa das últimas aspas duplas é armazenada. Depois de encontrar a posição relativa das primeiras e últimas aspas duplas na string de origem (src), o tamanho da string entre aspas é calculada (len). No final, strncpy copia exatamente o tamanho necessário (len) a partir do primeiro caractere depois das primeiras aspas duplas da origem na string de destino (dst) Como a função strncpy não termina a string de destino com um caractere nulo, ele é adicionado. (dst[len] = '\0). Caso precise, é bem fácil modificar essa função caso a origem (src) já não possua aspas duplas. 3. Passando os dados para a estrutura dataset Essa parte lida com a função process_field. Mais coisas foram retiradas de lá do que colocadas, mas as alterações feitas nela são importantes para entender como funcionam os tipos de dados em C. A função process_field ficou bem enxuta: void process_field(int field_count, char *value, int i) { if (field_count == 0) { vet[i].ano = atoi(value); printf("Ano:\t%d", vet[i].ano); } } A função que interpreta o valor da string em value é a atoi. Ela "transforma" uma string em um número inteiro. Essa função se faz necessária pois uma string é um vetor de chars, e não são podem ser imediatamente convertidas para o número que é lido ou informado pelo usuário humano. Sem levar isso em consideração, algumas linhas do código original estavam tentando fazer essa conversão direta, como por exemplo: vet[i].ano = value; vet.ano é um número inteiro, e value é um ponteiro de char. Quando se realiza esse comando, o computador entenderá que você quer armazenar o valor de endereço de memória armazenado em value no campo ano de vet. Ainda que value aponte para uma string do tipo "1234", o valor de value, em si, nada tem a ver com o número que está sendo representado naquela string. Outro caso onde houve essa confusão foi nessa linha: printf("vetor[i] %s", vet[i].ano); Nesse comando, você especificouum formato %s para algo do tipo int, quando se espera que o tipo seja char*. Essa inconsistência pode gerar vários tipos de comportamentos indefinidos, como tentar ler vet.ano como um endereço de memória de uma sequência de chars terminadas em \0, ou outras coisas que podem travar o programa ou sua máquina, a depender do quão bem seu sistema lida com esse tipo de exceção. Outras linhas que eu removi por razões práticas, e que não fazem sentido foram essas: int tam = sizeof(vet[i].ano)/sizeof(int); merge(vet[i].ano,0,tam-1); tam sempre será igual a 1, pois vet.ano é inteiro, e sizeof(int)/sizeof(int) = 1. A linha que chama a função merge também não faz sentido, pois assim vcê estará fazendo vários merge sort de um único inteiro. Caso a intenção fosse inserir o ano na estrutura de modo a já fazer o sort e ter um vetor já arrumado logo após a inserção, até poderia ser feito durante a leitura dos dados, porém, o merge sort não funcionará eficientemente. Caso essa seja uma das necessidades da sua solução, procure por heap sort. 4. Corrigindo a tipagem dos parâmetros das funções do merge sort Por fim, alterei os tipos dos parâmetros das funções de sort. Como você está lidando com um vetor de dataset, onde cada dataset contém um int, as funções devem recever ponteiros para dataset, e não ponteiros para inteiro. //void intercala(int *x, int inicio, int fim, int meio) { void intercala(dataset* x, int inicio, int fim, int meio) { ... } //void merge(int *x, int inicio, int fim) { void merge(dataset* x, int inicio, int fim) { ... } As linhas que se referiam aos valores de x, agora fazem para x.ano. No fim, após a leitura dos dados, chamei a função merge e imprimi na tela o resultado: #define TAMANHO 103 ... int main(int argc, char** argv) { ... // executa o sort merge(vet, 0, TAMANHO-1); // print na tela for (j = 0; j < TAMANHO; ++j) { printf("%d\n", vet[j].ano); } return 0; } O código com todas as modificações estão em anexo main.c
  4. Yesterday
  5. Após mais de um ano desde sua última atualização, saiu o hashcat 6.0.0 no último dia 16 de junho. A ferramenta de recuperação de senhas é de código aberto e contou com 1,8 mil commits desde o último lançamento (5.1.0). A nova versão vem com melhorias de desempenho (muito importante para uma ferramenta de quebra de hashes, né?), novos recursos e documentação detalhadas para usuários e desenvolvedores. Entre as principais funcionalidades da versão 6.0.0 estão: Nova interface para plug-ins - para modos de hash modulares Nova API para computação back-end - para adicionar APIs diferentes da OpenCL Inclusão do CUDA como uma nova API de computação back-end Guia abrangente para desenvolvedores de plug-ins Modo de emulação de GPU - para usar o código do kernel no host Melhor gerenciamento de memória de GPU e threads Tuning automático aprimorado com base nos recursos disponíveis Como se não bastasse, foi adicionado suporte a 51 novos algoritmos, incluindo os utilizados por ferramentas como Telegram e DiskCrypt. Já são 320 hashes suportados pelo hashcat! Acesse o changelog completo aqui. 😉
  6. Last week
  7. felipe lopes

    MergeSort

    Bom dia, adicionei o arquivo em anexo, eu consigo ler os valores e salvar em um vetor, mas não descobrir como passar esse vetor pra chamada do merge e depois receber os valores de volta e imprimir na tela main.c
  8. Além do detalhe apontado por @mandelacruz, você declarou 'dados' como 'int' na estrutura TLDE, o que fará um 'float' ser convertido para 'int' (se possível)...
  9. Não entendi muito bem aonde não aparece os números, você não especificou, mas, se estiver falando do output no console, é porque o printf(" %d", p->dados); está com '%d' e não '%f' ou '%lf'.
  10. TLDE* inverte(TLDE* l) { TLDE *p = l; TLDE *aux=NULL; p=l->prox; l->prox=NULL; while(p!=NULL) { aux=p->prox; p->prox=l; l=p; p=aux; } return l; }
  11. Pq ao executar o programa não aparece os números do tipo float e aparece somente como inteiro? #include<stdio.h> #include<stdlib.h> struct TLDE { int dados; struct TLDE* prox; }; TLDE* inserir_no_fim( TLDE*p , float elem) { TLDE *raiz = p; TLDE* pTemp = (struct TLDE*)malloc(sizeof(struct TLDE*)); pTemp->dados = elem; pTemp->prox = NULL; if(!raiz) return pTemp; else { TLDE* pPar = p; while(p->prox) { p=p->prox; } p->prox =pTemp; return raiz; } } void exibir(TLDE* p) { if(!p) printf("Lista vazia"); else { do { printf(" %d", p->dados); p=p->prox; } while(p); } } TLDE * inverte( TLDE *l) { TLDE*r =NULL; // r é o ponteiro para a lista invertida TLDE*s =NULL; //s é o ponteiro para o ultimo elemento da lista invertida while(l) { s=r; r=l; l=l->prox; r->prox=s; } return r; } int main() { TLDE *inicializa =NULL; inicializa = inserir_no_fim(inicializa,1056985466); inicializa = inserir_no_fim(inicializa,9); inicializa = inserir_no_fim(inicializa,6.5); inicializa = inserir_no_fim(inicializa,4.5); printf("\nLista normal: "); exibir(inicializa); inicializa = inverte(inicializa); printf("\nLista invertida: "); exibir(inicializa); }
  12. Não... Se espera ajuda num forum, deve ser público.
  13. felipe lopes

    MergeSort

    Boa noite, eu posso te enviar por e-mail ?
  14. O Google removeu 25 aplicativos Android da Google Play Store. Segundo o ZDNet, os apps foram pegos roubando credenciais do Facebook. Antes de serem retirados a loja, os aplicativos foram baixados mais de 2,34 milhões de vezes. Os aplicativos maliciosos foram desenvolvidos pelo mesmo grupo de cibercriminosos e, apesar de oferecerem recursos diferentes, todos funcionavam da mesma maneira. De acordo com um relatório da empresa francesa de cibersegurança Evina compartilhado com o ZDNet, os apps se apresentaram como contadores de passos, editores de imagem, editores de vídeo, aplicativos de papel de parede, aplicativos de lanterna, gerenciadores de arquivos e jogos para celular. Apesar de funcionalidade legítima, eles continham um código malicioso que, segundo os pesquisadores da Evina, detecta que o usuário abriu recentemente e possuía em primeiro plano. Se o aplicativo em primeiro plano do usuário fosse o Facebook, o app malicioso colocaria uma janela do navegador da Web em cima do aplicativo oficial do Facebook e carregaria uma página de login falsa da rede social. A lista completa de 25 aplicativos, seus nomes e o ID do pacote estão listados no site do ZDNet.
  15. Sem ver o código é meio difícil...
  16. felipe lopes

    MergeSort

    Óla, eu desenvolvendo um programa que le um arquivo do tipo .CSV e aplica a técnica do Mergesort para ler os dados, porem não estou conseguindo utilizar o MergeSort dentro do programa. Podem me auxiliar por favor?
  17. Ola, alguem poderia me ajudar? Tenho que fazer um projeto onde basicamente teria que criar um arquivo em C++ para cadastro/alteração de peças, e vendas tbm. Mas estou travada na parte da venda. Basicamente era pra por o codigo da peca e a quantidade e ela dar baixa no estoque da peça que tinha cadastrado anteriormente mas não vai. Vou por a baixo ate aonde foi feito e anexar de imagem oq é pedido, se alguem puder me ajuda em ficaria muito agradecida. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <conio.h> struct pecas { char nome[34]; int codigo; float valor; int e; int quantidade; } f; FILE *fptr; void cadastro(); void consulta(); void alteracao(); void vendas(); void exclusao_logica(); void exclusao_fisica(); void ordenacao(); void busca_binaria(); int main() { char opc; do { system("cls"); printf("\n 1 - Cadastro de peca"); printf("\n 2 - Consultar pecas"); printf("\n 3 - Alteracao de pecas"); printf("\n 4 - Vendas"); printf("\n 5 - Exclusao Logica"); printf("\n 6 - Exclusao Fisica"); printf("\n 7 - Ordenacao pelo nome"); printf("\n 8 - Busca Binaria"); printf("\n 9 - Sair "); printf("\n Opcao: "); opc=getche(); switch (opc) { case '1': cadastro(); break; case '2': consulta(); break; case '3': alteracao(); break; case '4': vendas(); break; case '5': exclusao_logica(); break; case '6': exclusao_fisica(); break; case '7': ordenacao(); break; case '8': busca_binaria(); break; case '9': printf("\n\nSaindo...\n"); break; default : printf("\n Opcao %c invalida", opc); getch(); break; } } while (opc!='9'); return 0; } /***********************************************************************/ void cadastro() { char op; if ((fptr=fopen("pecas.dados", "rb+"))==NULL) {if ((fptr=fopen("pecas.dados", "wb"))==NULL) { printf("\n Erro"); exit(1); } } do { printf("\n Entre com os dados para o cadastro de pecas \n"); printf("\n Nome: "); setbuf(stdin, NULL); scanf("%[^\n]",f.nome); printf("\n Codigo: "); scanf("%d",&f.codigo); printf("\n Valor: "); scanf("%f", &f.valor); printf("\n Quantidade: "); scanf("%d", &f.quantidade); f.e=0; fseek(fptr,0,2); fwrite(&f,sizeof(f),1,fptr); printf("\n Deseja cadastrar outro (S/N): "); op=getche(); } while ((op!= 'N') && (op!='n')); ((op=='S')||(op=='s')); fclose(fptr); } /**************************************************************************************/ void consulta() { if ((fptr=fopen("pecas.dados", "rb"))==NULL) { printf("\n Erro"); exit(1); } printf("\n Consulta de todos as pecas \n"); while (fread(&f,sizeof(f),1,fptr)) { if (f.e==0) {printf("\n\n Nome: %s", f.nome); printf("\n Codigo: %d", f.codigo); printf("\n Valor: %.2f",f.valor); printf("\n Quantidade: %d",f.quantidade); } } getch(); fclose(fptr); } /**************************************************************************************/ void alteracao() { char nome[40]; if ((fptr=fopen("pecas.dados", "rb+"))==NULL) { printf("\n Erro"); exit(1); } printf("\n Entre com o nome da pea a ser alterado o valor\n"); setbuf(stdin, NULL); scanf("%[^\n]",nome); while (fread(&f,sizeof(f),1,fptr)) { if (strcmp(f.nome,nome)==0) if (f.e==0) {fseek(fptr,ftell(fptr)-sizeof(f),0); // fseek(fptr,-sizeof(fptr),1); printf("\nNovo Valor "); scanf("%f",&f.valor); fwrite(&f,sizeof(f),1,fptr); fseek(fptr,0,2); } } fclose(fptr); } /******************************************************/ void vendas() { int codigovendas, quant; { if ((fptr=fopen("pecas.dados", "rb"))==NULL) { printf("\n Erro"); exit(1); } } printf("\n Vendas de pecas cadastradas \n"); printf("\n Digite o nome da peca que vai ser vendida \n"); scanf("%d", &codigovendas); printf("\n Digite a quantidade de pecas que seram vendidas"); scanf("%d", quant); if(codigovendas == f.codigo){ printf("\n venda concluida"); f.quantidade = f.quantidade-quant; } else printf("\n codigo n cadastrado"); getch(); fclose(fptr); } /**************************************************************************************/ void exclusao_logica() { char nome[40]; if ((fptr=fopen("pecas.dados", "rb+"))==NULL) { printf("\n Erro"); exit(1); } printf("\n Entre com o nome da peca a ser excluida logicamente\n"); setbuf(stdin, NULL); scanf("%[^\n]",nome); while (fread(&f,sizeof(f),1,fptr)) { if (strcmp(f.nome,nome)==0) if (f.e==0) { fseek(fptr,ftell(fptr)-sizeof(f),0); f.e=1; fwrite(&f,sizeof(f),1,fptr); fseek(fptr,0,2); } } getch(); fclose(fptr); } /**************************************************************************************/ void exclusao_fisica() { } /**************************************************************************************/ void ordenacao() { } /**************************************************************************************/ void busca_binaria() { }
  18. Linus Torvalds lançou o primeiro release candidate (uma versão pronta, com grandes chances de se tornar um lançamento) do Linux kernel 5.8 há duas semanas. Durante a janela de mesclagem de duas semanas para o próximo Linux kernel 5.8, ele recebeu um dos maiores números de contribuições, segundo o FossBytes. Com a versão 5.8-rc1, o Linux 5.8 possui 14.000 commits, 800.000 novas linhas de código e 14.000 mudanças em arquivos de código-fonte (cerca de 20% de todos os arquivos fonte na estrutura do kernel). A v5.8 inclui ainda limpezas de código, documentação e muito trabalho de desenvolvimento nos sistemas de arquivos. Além disso, há melhorias no suporte ao processador, novo suporte de hardware, aprimoramento de segurança e avanço do driver gráfico Intel/Radeon de código aberto. Veja as principais alterações feitas durante a janela de mesclagem do kernel 5.8 do Linux: Melhoria no driver gráfico AMD Radeon Otimizações do SELinux Fila geral de notificação Atualizações de gerenciamento de energia Suporte melhorado aos teclados da Apple (teclas Fn e Ctrl). Suporte para Intel Tiger Lake Thunderbolt Suporte do acelerador Habana Labs Gaudi Várias melhorias no sistema de arquivos Btrfs Limpeza e correção do sistema de arquivos EXT4 e exFAT Suporte inicial a processadores POWER10 Veja mais atualizações no blog Phoronix. Falando em Linux, já viu nossas dicas de shell? Esse vídeo é a primeira parte de uma sequência de dicas para trabalhar melhor no shell do Linux – com foco em Bash:
  19. Fernando Mercês

    MBLive v1

    Depois do sucesso da MBConf, teremos nossa primeira MBLive! hehe O objetivo é trocar uma ideia informal com nossa comunidade. Colá lá: https://www.instagram.com/mentebinaria_/ 🙂
  20. Criei esse jogo da velha em C, à priori para windows... Não sei se a função system("pause") funciona em outras plataformas... Enfim, caso identfiquem algo que poderia ser escrito de uma forma melhor, será bem vinda a sugestão. Sei que existem vários jogos da velha por ai, mas decidi fazer a minha versão, sendo meu segundo projeto na linguagem C. #include <stdio.h> #define MAX 3 void Menu(int mensagem);//Opções de jogar ou sair. int Controle(int posicoes[][MAX]);//Controla a vez de cada jogador, a verificação de vitória e empate. void Jogo(int posicoes[][MAX], int vez, int ganhou); void ZeraTabuleiro(int posicoes[][MAX]); void Clear(void); int VerificaPosicaoExistente(int linha, int coluna);//Verifica se a linha e coluna que o usuário escolheu, foram números entre 1 e 3. int VerificaPosicao(int posicoes[][MAX], int linha, int coluna);//Verifica se já existe 'X' ou 'O' na posição. int VerificaVitoria(int posicoes[][MAX]); void ErroMensagens(int mensagem); void printaLinha(char *chars, int linha);//Aloca na variável chars(função Jogo()), o respectivo caractere da variável linha(função Jogo()). int main() { int posicoes[MAX][MAX], jogardenovo; Menu(0); do{ jogardenovo = Controle(posicoes); }while(jogardenovo); return 0; } void Menu(int mensagem) { char strings[4][46] = {"Jogo da velha\n", "\nO jogador 1 ganhou. Deseja jogar novamente?\n", "\nO jogador 2 ganhou. Deseja jogar novamente?\n", "\nEMPATE! Deseja jogar novamente?\n"}; int opcao = -1; do{ printf("\t\t%s\n" "1. Jogar\n" "0. Sair\n" "Opcao: ", strings[mensagem]); scanf("%d", &opcao); while(getchar() != '\n')//Limpa stream de entrada. opcao = -1;//Se o usuário mandar, por exemplo, 1d como escolha de opção, não será permitido. if(opcao != 1 && opcao != 0) printf("Opcao invalida. Tente novamente!\n" "-----------------------------------------------------------------------\n"); }while(opcao != 1 && opcao != 0); if(!opcao) exit(1); } int Controle(int posicoes[][MAX]) { int vez, jogada, vv = 0; ZeraTabuleiro(posicoes); for(vez = 1, jogada = 1; ; vez++, jogada++) { Jogo(posicoes, vez, 0);//Chama a função jogo() e só retorna pra cá, quando o jogador da vez acabar a jogada. if(jogada >= 5 && jogada <= 9)//Entre as jogadas 5 e 9, verifica vitória. { if(vv = VerificaVitoria(posicoes)) { Jogo(posicoes, vez, 1); Menu(vv); return 1; } } if(jogada == 9)//Caso na jogada 9 não tenha vitória, chama função Menu() e avisa empate. { Jogo(posicoes, vez, 1); Menu(3); return 1; } if(vez == 2)//Controla o laço for e a vez de cada jogador. vez = 0; } } void Jogo(int posicoes[][MAX], int vez, int ganhou) { int linha = -1, coluna = -1; char strings1[2][8] = {"\t", "Linha:"}, strings2[2][7] = {"Linha", "Coluna"}, simbolos[2] = {'X', 'O'}, chars; for(int i = 1; i <= 2; i++) { Clear(); if(i == 1) chars = ' '; if(i == 2) printaLinha(&chars, linha); printf("\t\t\t\t\t c1 c2 c3\n" "\t\t\t\t\t *******************\n" "\t\t\t\t\tl1| %c | %c | %c |\n" "\t\t\t\t\t*********************\n" "\t\t\t\t\tl2| %c | %c | %c |\n" "\t\t\t\t\t*********************\n" "\t\tVez:Jogador %d\t\tl3| %c | %c | %c |\n" "\t\tsimbolo:'%c'\t\t *******************\n" "\t\t%s%c\t\t%s:", posicoes[0][0], posicoes[0][1], posicoes[0][2] , posicoes[1][0], posicoes[1][1], posicoes[1][2] , vez, posicoes[2][0], posicoes[2][1], posicoes[2][2] , simbolos[vez-1], strings1[i-1], chars, strings2[i-1]); if(ganhou == 1)//Se essa função(Jogo) for chamada passando 1 na variável ganhou, break; //apenas mostra as ultimas posições do jogo e retorna para a função Controle(). if(i == 1) { scanf("%d", &linha); while(getchar() != '\n')//Limpa stream de entrada. linha = -1;//Se o usuário mandar, por exemplo, 1d como escolha da linha, não será permitido. } if(i == 2) { scanf("%d", &coluna); while(getchar() != '\n')//Limpa stream de entrada. coluna = -1;//Se o usuário mandar, por exemplo, 2f como escolha da coluna, não será permitido. if(VerificaPosicaoExistente(linha, coluna)) { if(VerificaPosicao(posicoes, linha, coluna)) { ErroMensagens(1); system("pause"); linha = coluna = -1; i = 0; } else break; } else { ErroMensagens(0); system("pause"); linha = coluna = -1; i = 0; } } } if(vez == 1) posicoes[linha-1][coluna-1] = 'X'; if(vez == 2) posicoes[linha-1][coluna-1] = 'O'; } void ZeraTabuleiro(int posicoes[][MAX]) { for(int linha = 0; linha < MAX; linha++) for(int coluna = 0; coluna < MAX; coluna++) posicoes[linha][coluna] = ' '; } void Clear(void) { for(int i = 0; i < 100; i++) putchar('\n'); } int VerificaPosicaoExistente(int linha, int coluna) { if(linha >= 1 && linha <= MAX) { if(coluna >= 1 && coluna <= MAX) return 1; else return 0; } else return 0; } int VerificaPosicao(int posicoes[][MAX], int linha, int coluna) { if(posicoes[linha - 1][coluna - 1] == 'X' || posicoes[linha - 1][coluna - 1] == 'O') return 1; else return 0; } int VerificaVitoria(int posicoes[][MAX]) { int linha, coluna, j1 = 0, j2 = 0; //Verifica vitória na horizontal. for(linha = 0; linha < MAX; linha++) { for(coluna = 0; coluna < MAX; coluna++) { if(posicoes[linha][coluna] == 'X') j1++; if(posicoes[linha][coluna] == 'O') j2++; } if(j1 == 3) return 1; else j1 = 0; if(j2 == 3) return 2; else j2 = 0; } //Verifica vitória na vertical. for(coluna = 0; coluna < MAX; coluna++) { for(linha = 0; linha < MAX; linha++) { if(posicoes[linha][coluna] == 'X') j1++; if(posicoes[linha][coluna] == 'O') j2++; } if(j1 == 3) return 1; else j1 = 0; if(j2 == 3) return 2; else j2 = 0; } //Verifica 'X' na diagonal da esquerda para direita '\' if(posicoes[0][0] == 'X' && posicoes[1][1] == 'X' && posicoes[2][2] == 'X') return 1; //Verifica 'O' na diagonal da esquerda para direita '\' if(posicoes[0][0] == 'O' && posicoes[1][1] == 'O' && posicoes[2][2] == 'O') return 2; //Verifica 'X' na diagonal da direita para esquerda '/' if(posicoes[0][2] == 'X' && posicoes[1][1] == 'X' && posicoes[2][0] == 'X') return 1; //Verifica 'O' na diagonal da direita para esquerda '/' if(posicoes[0][2] == 'O' && posicoes[1][1] == 'O' && posicoes[2][0] == 'O') return 2; return 0; } void ErroMensagens(int mensagem) { char erromensagens[2][40] = {"Posicao inexistente. Tente novamente!!\n", "Posicao ocupada. Tente outra posicao!!\n"}; Clear(); printf("%s", erromensagens[mensagem]); } void printaLinha(char *chars, int linha) { switch(linha) { case 1: *chars = '1'; break; case 2: *chars = '2'; break; case 3: *chars = '3'; break; } }
  21. Sabe porquê a base numérica hexadecimal é usada em computadores?
  22. Boa noite, estou fazendo uma programação em linguagem para um projeto pessoal que usa números hexadecimais... Queria saber se existe alguma forma de separar os números por exemplo, se eu receber FF0000, queria separa lo e usar apenas FF 00 00... Alguém sabe me ajuda??
  23. Earlier
  24. O Ministério Público do Rio Grande do Sul cumpriu, na última quinta-feira, 25 de junho, 13 mandados de busca e apreensão para desarticular uma organização criminosa que burlou esquema de segurança digital de banco. A Operação Criptoshow apurou que os criminosos desviaram R$ 35 milhões de uma grande indústria e da bolsa de valores, fazendo lavagem de dinheiro com bitcoins. Os mandados estão sendo cumpridos na região metropolitana de Porto Alegre. Segundo apurado na investigação, nos dias 15 e 16 de abril foram desviados R$ 30 milhões da conta bancária de uma grande indústria por meio de 11 transferências eletrônicas. As TEDs foram feitas para seis empresas, localizadas em Porto Alegre, Cachoeirinha, São Paulo e Porto Velho. Conforme a investigação realizada pela Promotoria de Justiça Especializada Criminal e parceiros, o dinheiro foi desviado com auxílio de uma técnica sofisticada realizada por uma empresa com sede em Cachoeirinha, correntista do mesmo banco. Inicialmente, os criminosos tinham acesso normal à conta bancária, pelo Internet Banking. Eles programaram 11 transferências bancárias para seis destinatários, também pessoas jurídicas. Ao final da operação, por meio de uma manipulação fraudulenta da codificação do canal do Internet Banking, a conta indicada ao sistema para a efetuação do débito de R$ 30 milhões não foi a logada inicialmente, mas sim a conta da grande indústria. O promotor responsável pela investigação destaca que a fraude funcionou como se uma conta bancária corporativa tivesse invadido outra conta similar para emitir ordem de débito ao banco em favor de terceiros. Uma empresa de Porto Alegre recebeu o maior montante do furto, R$ 14 milhões. Três empresas sediadas no estado de Rondônia receberam juntas outros R$ 14 milhões. Além disso, uma empresa de São Paulo obteve R$ 1 milhão, mesmo valor recebido pela empresa de Cachoeirinha, que efetuou o desvio. O texto do MPRS ainda conta que uma nova operação de lavagem de capitais foi revelada durante as investigações. O vídeo abaixo também explica um pouco mais sobre como foi realizada a fraude:
  25. Quais são as características básicas que você citou?
  26. o link só carrega, carrega, e carrega, não tá funcionando
  27. o link está quebrado
  28. É meio difícil criar um algoritmo de compactação, e existem aos montes por ai: Huffman Encoding, zlib, Lempel-Zif-Welch, etc... Mas é tremendamente mais fácil criar rotinas que leiam um bitstream. Tenho lá minhas dúvidas sobre o que o Kleber tenha feito... Mesmo assim, tenho por política ajudar alguém que também ajuda os outros... Se o algoritmo é milagroso ou inovador, quero vê-lo antes... Curiosidade profissional.
  29. Prezados, Existe uma coisa que está me consumindo, pois eu já "fucei" muito na Internet procurando mas não acho nada. Eu preciso criar um processador fictício e não sei nem por onde começar. O Professor deu umas aulas iniciais a qual ninguém entendeu nada, depois começou a pandemia e daí foi que a coisa piorou. Se alguém puder me ajudar eu agradecerei imensamente e então eu passo aqui as características do processador, mas o que eu queria mesmo era um material inicial ("basicão mesmo!) que vá até um nível mais avançado sobre, como eu posso criar um processador e simular o funcionamento deste (32Bits). Porque eu "quero pescar, não o peixe já pescado". Eu gosto de estudar e ir descobrindo sozinho as coisas. Se por acaso alguém aqui tiver alguma indicação ou orientação para me dar, eu agradeço muitíssimo. Rubem Alves
  1. Load more activity
×
×
  • Create New...