Ir para conteúdo
Fórum Script Brasil

Rafael Schouery (VidaGeek)

Membros
  • Total de itens

    34
  • Registro em

  • Última visita

Posts postados por Rafael Schouery (VidaGeek)

  1. if (esq=1)

    Não deveria ser if(esq==1) ?

    Duas dicas, primeiro use getchar que é padrão ansi, depois tente compilar seus programans no gcc

    com gcc -Wall -ansi -pedantic qsort.c -o qsort.exe (se estiver no Linux não precisa de .exe =) )

    o compilador irá te informar de possiveis erros no seu código.

    A linguagem permite if(esq=1), mas este é um valor sempre true e que altera a sua variável.

  2. O strlen faz na verdade uma coisa muito simples.

    As string em C, por padrão, terminam com o caracter ''. Isso acotnece por exemplo quando você faz um scanf("%s", string) e outros metodos de leitura.

    então basta fazer um while que começa na primeira posição e vai até encontrar um :

    int i  = 0;
    while(string[i] != '') 
      i++;
    return i;

    Garanta que suas strings tenham '' para não entrar em loop.

  3. Primeira coisa, você deve levar em consideração que em C e C++ uma string nada mais é do que um vetor de caracteres.

    Portanto se você souber ordenar um vetor através de algum método de ordenação isso poderá ser aplicado a sua string.

    Se você não sabe nenhum método de ordenação é uma boa dar uma olhada em:

    http://pt.wikipedia.org/wiki/Algoritmos_de...na%C3%A7%C3%A3o

    lá existe vários algoritmos, sendo que os mais fávocês de entender são provavelmente o Bubble Sort e o Insertion Sort.

    Nesse tópico, lá no final eu expliquei como ordenar usando o qsort que já vem na stdlib:

    http://scriptbrasil.com.br/forum/index.php?showtopic=100595

    Mas é possivelmente um pouco confuso. Mas a idéia neste tópico também é ordenar um sequência de caracteres, igual o que você quer.

  4. Não mexo muito com C++, mexo mais com C

    não seria:

    #include <iostream.h>

    #include <cmath.h>

    e alias, a e b não deveriam ser inteiros para que o probema faça sentido?

    maximo divisor comum só está definido para inteiros...

    Você pode ter problemas com a precisão do float fazendo algo genérico assim... mas depende da sua aplicação...

    se mudar para int (ou long long ou algo tipo) lembre que o operador de módulo é o %, ai você não precisa do #include <cmath.h>

  5. O mais fácil para ordernar é sem duvida o qsort da stdlib.h

    #include <stdlib.h>
    
    /*funcao de comparacao*/
    int compara(const void *a, const void *b)
    {
        char *aa = (char *)a;
        char *bb = (char *)b;
        return *a - *b;
    }
    
    ...
    qsort(palavra, strlen(palavra), sizeof(char), compara);
    ...

    o qsort recebe um vetor a ser ordenado, no caso um vetor de chars, a quantidade de elementos no vetor (strlen(palavra)), o tamanho de cada elemento (sizeof (char)) e uma funcao de comparacao.

    Normalmente o pessoal se perde um pouco nessa funcao, ela precisa obrigatoriamente retornar um inteiro e receber dois paramentros const void *.

    Isso porque o qsort não sabe qual é o tipo de dado que você está arrumando.

    Dentro da funcao, normalmente a primeira coisa que se faz é um cast explicito ( char *aa = (char *)a; ), mostrando ao compilador que a era um ponteiro para char. Não se esqueça de, quando ver a diferença fazer *aa para pegar o seu valor e não o ponteiro.

    Espero não ter ido longe de mais, mas aprenda o qsort, ele vai ser útil!

  6. Talvez o jeito mais fácil de fazer isso seja com o strtok, que devolve cadeias que estão delimitadas por algum caracter.

    por exemplo

    strtok(s, " \t")

    devolve a primeira palavra da string s.

    para as outras chamadas você não passa a string, apenas NULL, ou seja:

    strtok(NULL, " \t")

    isso vai devolver a segunda palavra. Se você chamar denovo vai devolver a terceira e dai por diante.

    Detalhes importantes:

    " \t" garante que os delimitadores são espaços ' ' e o tab.

    quando strtok devolver NULL significa que todas as palavras já foram devolvidas

    o strtok "estraga" a sua string, colocando onde encontra delimitadores portanto cuidado se for usar a frase original, qualquer coisa faça um strcpy(copia,s) e rode o strtok na copia

    não se esqueça de dar #include <string.h>

    Para resolver seu probema basta fazer algo do tipo

    int conta(char string[])
    {
      int i  = 1;
      if(strtok(string," \t") == NULL)
         return 0;
      while(strtok(NULL, " \t"))
           i++;
       return i;
    }

  7. O Conceito de Void é um pouco estranho para novos programadores em linguagens derivadas de C.

    Em Pascal temos Functions (funções matemáticas que levam um conjunto de valores em um outro valor) e Procedures (procedimentos que manipulam os dados).

    Em C, C++, Java e outras linguagens não existem Procedures, apenas Functions provavelmente por mera convenção da linguagem.

    Isso significa que voce precisa sempre ter um tipo de retorno, mesmo para funções que não deveriam retornar um valor, como funções que mudam uma variável ou imprimem algo.

    Para isso serve o void (na verdade, em C ele serve para outras coisas também).

    Ou seja, voce deve usar o void sempre que sua função não precisa retornar um valor, ela apenas executa uma coisa.

  8. Alias, se possivel utilize uma estrutura de dados mais robusta para as tabelas.

    Estamos acostumados a enxergar as relações em banco de dados como tabelas, mas essa é apenas a visão abstrata.

    Um Hash, por exemplo, pode ser mais efetivo permitindo a busca por um atributo indexado.

×
×
  • Criar Novo...