Ir ao conteúdo
  • Cadastre-se

Matheus Maldi

Membro Pleno
  • Posts

    544
  • Cadastrado em

  • Última visita

Tópicos solucionados

  1. O post de Matheus Maldi em Depurador não funciona ao usar biblioteca <math.h>. foi marcado como solução   
    No linux para user math.h você precisa adicionar a flag -lm
     
    gcc main.c -lm  
    No meu VSCode ele gerou um arquivo ./vscode/tasks.json assim
     
    { "tasks": [ { "type": "cppbuild", "label": "C/C++: g++ build active file", "command": "/usr/bin/g++", "args": [ "-fdiagnostics-color=always", "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "options": { "cwd": "${fileDirname}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "Task generated by Debugger." } ], "version": "2.0.0" }  
  2. O post de Matheus Maldi em Como incrementar um decimal no for foi marcado como solução   
    for (float f = 0.25; f < 3.99; f += 0.25) printf("%.2f\t", f);  
    Veja se isso resolve
  3. O post de Matheus Maldi em Jogo de Cartas Buraco foi marcado como solução   
    Verifique esse código, ele é bem simples, e imprime um baralho:
     
    #include <stdio.h> #include <stdint.h> #include <assert.h> void carta_display(uint8_t id) { assert(id < 52); const char* naipe[4] = { "Paus", "Ouros", "Copas", "Espadas" }; const char* numeros[13] = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "Valete", "Dama", "Rei" }; printf("%s %s\n", numeros[id % 13], naipe[id / 13]); } int main() { for (int i = 0; i < 52; i++) carta_display(i); return 0; }  
  4. O post de Matheus Maldi em Recursiva- transformar minusculo em maiusculo e retornar qtas alterações feitas foi marcado como solução   
    Você está tentando alterar uma string constante.
     
    char *str = "Cachorro VErdE"; // Está NAO pode alterar char str[] = "Cachorro VErdE"; // Está pode alterar  
     
  5. O post de Matheus Maldi em Recursiva- transformar minusculo em maiusculo e retornar qtas alterações feitas foi marcado como solução   
    Você está tentando alterar uma string constante.
     
    char *str = "Cachorro VErdE"; // Está NAO pode alterar char str[] = "Cachorro VErdE"; // Está pode alterar  
     
  6. O post de Matheus Maldi em QuickSort com resultado errado! foi marcado como solução   
    Primeiro faça o teste com hardded code em vez de ficar fazendo scanf, isso vai acelerar o teste
     
    int main() { int vet[5] = { 5, 4, 3, 2, 1 }; seu_quick_sort(vet, 0, 4); // faça um for para printar o loop return 0; }  
     
    adicionado 14 minutos depois Segue um codigo simples do quick sort para int:
     
    void quick_sort_int (int* array, int i_lo, int i_hi) { int lo = i_lo, hi = i_hi; int mid = array[((lo + hi) >> 1)]; do { while (array[lo] < mid) ++lo; while (array[hi] > mid) --hi; if (lo <= hi) { int temp = array[lo]; array[lo] = array[hi]; array[hi] = temp; lo++; hi--; } } while (lo < hi); if (hi > i_lo) quick_sort_int (array, i_lo, hi); if (lo < i_hi) quick_sort_int (array, lo, i_hi); } e agora um código extremamente complexo de quicksort genérico, este codigo faz:
    Usa insertion_sort caso o range a ser ordenado é menor que 128 (ganha um pouco de perforçance)
    Seleciona entre index menor, meio e maior, qual será o pivo.
    Consegue evitar varias chamadas recursivas.
     
    static inline void swap (void* l, void* r, size_t size) { if (size == sizeof(__int64_t)) { __int64_t temp = *(__int64_t*)l; *(__int64_t*)l = *(__int64_t*)r; *(__int64_t*)r = temp; } else if (size == sizeof(__int32_t)) { __int32_t temp = *(__int32_t*)l; *(__int32_t*)l = *(__int32_t*)r; *(__int32_t*)r = temp; } else if (size == sizeof(__int16_t)) { __int16_t temp = *(__int16_t*)l; *(__int16_t*)l = *(__int16_t*)r; *(__int16_t*)r = temp; } else if (size == sizeof(__int8_t)) { __int8_t temp = *(__int8_t*)l; *(__int8_t*)l = *(__int8_t*)r; *(__int8_t*)r = temp; } else { char *l_ptr = l, *r_ptr = r; do { char tmp = *l_ptr; *l_ptr++ = *r_ptr; *r_ptr++ = tmp; } while (--size > 0); } } static inline void insertion_sort (void* a_lo, void* a_hi, const size_t size_of_element, int (*cmp)(const void*, const void*)) { for (void* i = a_lo + size_of_element; i <= a_hi; i += size_of_element) { for (void* key = i; key > a_lo && cmp (key - size_of_element, key) > 0; key -= size_of_element) swap(key, key - size_of_element, size_of_element); } } static inline void sort_3 (void* left, void* mid, void* right, const size_t size_of_element, int (*cmp)(const void*, const void*)) { if (cmp (mid, left) < 0) swap (left, mid, size_of_element); if (cmp (right, mid) < 0) swap (right, mid, size_of_element); else return; if (cmp (mid, left) < 0) swap (left, mid, size_of_element); } void quick_sort_g (void* restrict address_lo, void* restrict address_hi, const size_t size_of_element, int (*cmp)(const void*, const void*)) { skip_recursive_call:; // real len is (address_hi - address_lo) / size_of_element + size_of_element; // but is not important here; size_t len = (address_hi - address_lo) / size_of_element; if (len <= 128) { insertion_sort (address_lo, address_hi, size_of_element, cmp); return; } register void* a_lo = address_lo; register void* a_hi = address_hi; register void* mid = address_lo + (len >> 1) * size_of_element; sort_3 (a_lo, mid, a_hi, size_of_element, cmp); a_lo += size_of_element; a_hi -= size_of_element; do { while (cmp (a_lo, mid) < 0) a_lo += size_of_element; while (cmp (a_hi, mid) > 0) a_hi -= size_of_element; if (a_lo <= a_hi) { swap (a_lo, a_hi, size_of_element); if (mid == a_lo) mid = a_hi; else if (mid == a_hi) mid = a_lo; a_lo += size_of_element; a_hi -= size_of_element; } } while (a_lo < a_hi); if (a_hi > address_lo) { if (a_lo < address_hi) { quick_sort_g (address_lo, a_hi, size_of_element, cmp); address_lo = a_lo; goto skip_recursive_call; } else { address_hi = a_hi; goto skip_recursive_call; } } else if (a_lo < address_hi) { address_lo = a_lo; goto skip_recursive_call; } } void quick_sort (const void * pbase, size_t total_elems, size_t size, int (*cmp)(const void*, const void*)) { void *first = (void*)pbase; void* last = first + (total_elems - 1) * size; quick_sort_g (first, last, sizeof(int), cmp); } int intvoidcmp (const void* l, const void* r) { int l_int = *(int*)l; int r_int = *(int*)r; if (l_int > r_int) return 1; if (l_int < r_int) return -1; return 0; } int main () { int array_length = 1024 * 1024 * 10; int *array = (int*)calloc (array_length, sizeof(int)); srand (1024); for (int i = 0; i < array_length; i++) array[i] = rand(); quick_sort (array, array_length, sizeof(int), intvoidcmp); for (int i = 1; i < array_length; i++) if (array[i - 1] > array[i]) printf ("Fail %p -> %d\n", &array[i], array[i]); return 0; }  

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!