1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Linguagem C - Linha

Discussão em 'Programação' iniciada por radicalboy, 30 de Março de 2009. (Respostas: 14; Visualizações: 1849)

  1. radicalboy

    radicalboy Power Member

    Boas...

    estou com um projecto de C para a faculdade e tenho a seguinte questao:

    Tenho um ficheiro de input e nele está contida informação, a qual tenho que interpretar..

    Uma delas é, saber qual a primeira linha onde aparece e a ultima e depois devolver algo como a 1 6 (activo desde a linha 1 a 6).

    O input é algo deste tipo:
    t = f - g
    y = h - i
    z = t - y

    Portanto teria t activo desde a linha 1 até à 3, f e g apenas activos na primeira linha, y desde a 2 até À 3...
    t 1 3
    f 1 1
    g 1 1
    y 2 3
    ....
     
  2. hYpe

    hYpe [email protected] Member

    Começas pelo primeiro caracter.

    Guardas num vector com o nome, p.e., 'verificado'.

    Guardas a linha em q estas a ler num vector chamado p.e. 'linhaInicio'.

    Vais passando as linhas a frente e encontras a ultima ocorrencia dessa letra.

    Guardas esse linha num vector chamado p.e. 'linhaFinal'.

    And so on.. O vector 'verificado' verificado serve precisamente para verificar se já trataste essa letra ou nao, portanto no inicio de cada iteração, tens que ver se a letra que apanhaste não está nesse vector.

    Boa sorte.

    EDIT:
    Dado o exemplo assim ias ter qq coisa deste tipo:
    Código:
    verificado[t][f][g][y]
    linhaInicio[1][1][1][2]
    linhaFinal[3][1][1][3]
    , de onde facilmente consegues fazer o output com um ciclo.
     
  3. Mach4_PT

    Mach4_PT Power Member

    Usando vectores ficas limitado a um numero de máximo de variáveis.
    Seria talvez melhor usares memória dinâmica.

    Deixa-me também dizer que essa metodologia de fazeres carater a carater é muito má.
    Seria melhor analisares logo o maximo de variaveis de uma vez e não apenas um carater.

    A minha ideia seria ler carater a carater e sempre que encontrares um novo criares uma nova estrutura em que metes o nome da variavel que encontras-te, a linha onde apareceu e a linha onde morreu.
    Da primeira vez que encontrasses uma variavel a linha onde apareceu e onde morreu seria a mesma.
    Depois ias correndo o texto, quando voltasses a encontrar a mesma variavel apenas modificavas a linha onde morreu para esse novo valor.

    Assim só tens de percorrer a lista uma unica vez.


    Cumps
     
    Última edição: 30 de Março de 2009
  4. radicalboy

    radicalboy Power Member

    Desde já obrigado..

    Como verificar logo o maior numero de variáveis?!
    Tenho uma estrutura assim:
    struct variaveis {
    char nome;
    int linhainicial;
    int linhafinal;
    }
    estara correcta?!
     
  5. Mach4_PT

    Mach4_PT Power Member

    A estrutura, se queres implementar numa lista de memoria dinâmica, não está correcta.
     
  6. Mimezz

    Mimezz Power Member

    Eu tenhd o mesmo projecto e a coisa não está fácil:
    Estou a tentar fazer a função que devolve o número máximo de variaveis vivas no input dado, sendo o output um número inteiro.
    A minha estratégia é analisar linha a linha e ir metendo numa lista o número de variáveis vivas nessa linha.
    Imaginemos:

    Vive Morre
    a 1 2
    c 1 6
    b 1 5
    d 1 9
    u 2 4
    v 3 4
    w 4 8
    y 6 7
    z 7 8

    na linha 1 estariam a b c d ------->4 variaveis vivas: lista ficaria (4)
    na linha 2 a b c d u ---------> 4 variaveis vivas: lista ficaria (4,4)
    na linha 3 a b c d u v ------> aqui seria a altura em que teria 5 variáveis e lista ficaria (4,4,5)
    ....
    até ao fim do programa

    e neste caso o máximo de variaveis vivas seria 5 e o programa devolveria 5.

    alguém me pode ajudar comm algumas funções ou ideias para fazer o trabalho? é que estou completamente bloqueado....
     
  7. Greenpower

    Greenpower Power Member

    pois é, tamos completamente lixado
     
  8. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    É assim que se vê quem é que é de [email protected] :D

    Vocês foram às teóricas? É que isto, no geral, nem tem muito que saber. Se resolverem a parte do algoritmo em si em papel e lápis antes de saltarem logo para o código, terão a vida bem mais facilitada, acreditem ;)

    O meu grupo dividiu o trabalho em partes:
    1) extracção das variáveis
    2) associação de um índice numérico a cada variável
    3) ciclo que cria uma "matriz" com duas colunas: a primeira dita a linha onde a variável ocorre pela primeira vez, e a segunda, dita onde a variável ocorre pela última vez. Cada linha corresponde ao índice numérico de cada variável
    4) contagem do número máximo de variáveis em simultâneo, iterando todas as linhas e todas as variáveis e verificando quando é que, num intervalo de uma linha, uma variável está "live" (se queremos saber quais são as variáveis activas no intervalo de linhas [4, 5], iteramos todas as variáveis, e quando primeira_ocorrencia <= 4 <= 5 <= última_ocorrencia da variável, então considera-se que ela está activa no intervalo).
    5) tradução dos índices numéricos em variáveis e escrita do output

    Porquê atribuir números a variáveis? Porque comparar nºs inteiros é BASTANTE melhor (em tudo) do que comparar strings. O algoritmo pode ficar bastante pesado se não simplificarem um pouco à partida.

    Já agora, o uso do Valgrind (ver) pode dar bastante jeito, nomeadamente no que toca a memory leaks. Os profs vão-se esticar bastante nos testes, portanto se tiverem memory leaks podem muito bem ultrapassar o limite de 128 MBs sem quaisquer problemas ;)
     
  9. Quase que parece que ele dá umas teóricas formidaveis.Quem não aprender fora, não é com ele que vai aprender. (Isto para IST Tagus) O homem deve ser das maiores nódoas do ensino do tagus.
     
  10. Mimezz

    Mimezz Power Member

    sim fui às teóricas.
    eu dei c em duas semanas...LOL o que não ajuda muito. Mas isso não é desculpa. A tua ideia parece-me boa. Tu aconselhas a usar listas? é que já várias pessoas me disseram que deveria usar vectores.

    Ele não deve ser do Tagus. Eu sou e acho que já desisti de tentar fazer o projecto...vamos a ver como corre as outras partes do projecto. É difícil ver 5 valores a voar da tua mão...
     
    Última edição pelo moderador: 2 de Abril de 2009
  11. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    Pois, sou da Alameda :x

    A nossa estrutura baseou-se em arrays de arrays. Desta forma, deu para simularmos tabelas de inteiros e usámo-las como tabela[linha][coluna]. Acho que ficou mais intuitivo assim.

    De qualquer forma, não desviem a conversa para o curso ou os campi, sff ;)
     
  12. É uma optima ideia, e assim evita que falhem muitos dos testes. Realmente comparação de inteiros é uma ideia formidável!

    Sorry off-topic.
     
  13. Mach4_PT

    Mach4_PT Power Member

    Eu fiz o projecto com uma lista dinamica de estruturas.
    Cada estrutura tinha um vector para o nome, e dois int um para ver quando primeiro aparecia e outro para ver quando morria.

    Para veres quantas tens vivas:

    Tens uma variavel com o valor da linha, vais correndo a lista/vector todo e comparas com as estruturas que têm o inicio de vida >= à linha em questao e o fim da vida < que a linha.
    Repetes isso para todas as linhas
    No fim de percorreres as linhas todas já tens o maximo de variaveis vivas durante o processo.
     
  14. Paos[CeRe4L]

    Paos[CeRe4L] Power Member

    LOOL

    Maus anos com AED e afins =P Terminei o curso de LEIC na Alameda o ano passado! Sei o que estão a passar! :P

    Só vos posso dizer: Esse esforço todo vai compensar! E muito! =)
     
  15. listas dinamicas é o mlhor para usar, depois fazes a funçao para obter a primeira letra, recursivamente, e fazes outra para obter o fim dessa mesma letra, recursivamente, ocupa-te mais memoria, mas é o mais simples e facil de usar, como estas a usar uma lista ligada, sempre que encontras uma letra nova so tens que fazer malloc da struct e instroduzir os valores, nao é dificil, apenas implica esforço, e raciocinio.
    Cumps

    LEI UM......=)
     

Partilhar esta Página