EP3

EP3

by Bruno Padilha -
Number of replies: 78
Observei, testando a função isalpha(), que se houver um caracter acentuado, tipo "é","ã", etc ,ela devolve zero, como se eles não fossem alpha numericos.Tem jeito de resolver isso que não seja testando todos caracteres como ç,ã,é? Ou o EP3 só ira funcionar p/ textos em inglês, ou outra lingua que não tenha acentos ?
In reply to Bruno Padilha

Re: EP3

by Gregory De Bonis -
E '-' será delimitador de palavra (uma vez que '-' isnotalpha)?
In reply to Gregory De Bonis

Re: EP3

by Paulo Cheadi Haddad Filho -
Agora entendi o que você quis dizer!

Do tipo "guarda-chuva"? É uma palavra só, não?
In reply to Paulo Cheadi Haddad Filho

Re: EP3

by Gregory De Bonis -
Não por essa definição, pois a seqüência macimal que atende ao isalpha é "guarda", então "chuva" é a próxima palavra... Bizarro mesmo é quando vem acentuação. "Acentuação" se divide em duas palavras, "acentua" e "o"...

In reply to Bruno Padilha

Re: EP3

by Gregory De Bonis -
Eu gostaria de mais exemplos de entrada e saída, se possível. smile
Existe algum limite para o tamanho de cada palavra?
In reply to Gregory De Bonis

Re: EP3

by Lucas Guimarães Gassert -
O enunciado não diz nada quanto a isso, logo não existe tamanho máximo.

Isso é contornável...
In reply to Lucas Guimarães Gassert

Re: EP3

by Lucas Guimarães Gassert -
Na verdade, sendo rigoroso, o tamanho máximo de uma palavra é 10.000.000 de caracteres...

Mas isso você já sabia...=P
In reply to Lucas Guimarães Gassert

Re: EP3

by Gregory De Bonis -
A maior palavra em inglês que consta em um dicionário tem 45 caracteres... Posso supor que a entrada vai ser um texto "de gente", com palavras de até 100 caracteres? Ou o arquivo de teste vai conter todas as maldades possíveis?
In reply to Gregory De Bonis

Re: EP3

by Felipe Simionato Solferini -
A maior palavra da lingua portuguesa tem 46 letras. Eh Pneumoultramicroscopicossilicovulcanoconiótico.
In reply to Felipe Simionato Solferini

Re: EP3

by William Gnann -
Pneumoultramicroscopicossilicovulcanoconi, porque ó não conta. =P
In reply to William Gnann

Re: EP3

by Lucas Guimarães Gassert -
Se é pra ser chato, faz direito:

Se ó não conta, então a maior palavra (em portugues) que seu EP poderá pegar é Pneumoultramicroscopicossilicovulcanoconiose, que é o nome da doença...
In reply to Lucas Guimarães Gassert

Re: EP3

by Arnaldo Mandel -
Exceto se o texto for sobre um sujeito que morre de medo dessa doença, e sofre de Pneumoultramicroscopicossilicovulcanoconiosefobia; é claro que essa patologia dá medo em outros, gerando
Pneumoultramicroscopicossilicovulcanoconiosefobiafobia.
Por outro lado, o estudo dessa reação é a disciplina de Pneumoultramicroscopicossilicovulcanoconiosefobiafobialogia.
Etc.
In reply to Arnaldo Mandel

Re: EP3

by Gregory De Bonis -
Ei, isso é roubo!
Mas pensando bem acho que acabo de descobrir que tenho claustrofobiafobia, pois pessoas incomodadas no elevador me incomodam... Algum claustrofobiafobiólogo poderia confirmar isso para mim?
In reply to Gregory De Bonis

Re: EP3

by William Gnann -
Wine? O vinho? Ovinho?

Entonces, quanto à maldade do professor. Ela se estenderá até arquivos de tamanho superior a 10^7 bytes? [buscando algum tratamento de erro que foge à minha imaginação]

Ah! Lembrei! Não existe o link para o EP3 a partir da página da disciplina. [ok, não faz diferença alguma, mas fica bonitinho]
In reply to William Gnann

Re: EP3

by Arnaldo Mandel -
Ops - pronto, taí o link.

Quanto a maldades, o limite 10^7 foi colocado para facilitar a vida. Se alguém quiser fazer um programa que rode sem limitações, fique à vontade; vou preparar testes para esses também. Mas para satisfazer os requistos do EP, basta ficar dentro das limitações.
In reply to Lucas Guimarães Gassert

Re: EP3

by Felipe Torres -

Segundo o todo poderoso Google, essa é a maior palavra do mundo:

lopadotemamachoselachogaleokranioleipsanodrimhypotirmmatosilphio
paraomelitokatakechymenokichlepicossyphophattoperisteralektryonopte
kephalliokigklopeleiolagoiosiraiobaphetraganopterygon.

Tem 182 caracteres e é o nome de UMA COMIDA grega!

... pensei em você, Lucas... hauhauahuahauhauhauha...

Abraço!

In reply to Gregory De Bonis

Re: EP3

by Atol Fortin de Oliveira -
A entrada pode ser qualquer.
In reply to Atol Fortin de Oliveira

Re: EP3

by Lucas Guimarães Gassert -
Basicamente, você DEVE ter em mente que:
1) O usuário não sabe a localização da barra de espaço, nem vai digitar nenhum caractere não-numérico ou
2) O usuário é o nosso querido amigo Felipe Solferini, sempre disposto a buscar entradas que literalmente destruam os nossos programas.

"Debug is on the table!"
In reply to Lucas Guimarães Gassert

Re: EP3

by Felipe Simionato Solferini -
AUHhauhuauhAUAUHA!! Ah mano!! Odeio ficar triste e ficar semanas longe da paquinha linda (q ainda tah no armario da sala 4 = P)

Eu não sou tão bom assim em criar entradas caóticas, mas pretendo ser. Me disseram que se voce digitar Santiago na rede linux ela trava.
In reply to Bruno Padilha

Re: EP3

by William Gnann -
Qual codificação será utilizada para os caracteres que não são letras maiúsculas e que retornam 1 no isalpha?

Experimentei-a com alguns caracteres não-ascii (char c, com 127 < c < 255) e ela também retornou 1.

Nota: usei o GCC 3.4.2 (mingw-special).
In reply to William Gnann

Re: EP3

by Paulo Cheadi Haddad Filho -
Incrementando a pergunta:

pode usar tolower(caracter)?
In reply to Paulo Cheadi Haddad Filho

Re: EP3

by Gregory De Bonis -
Creio que sim, já que "O resto da biblioteca libc está liberado, incluindo funções sobre strings."
Senão é só improvisar um
#define tolower(x) ((x)-'A'+'a')
e já era...
In reply to Bruno Padilha

Re: EP3

by Lucas Guimarães Gassert -
A saída tem que ter alguma formatação mais complexa, que envolva mesmo tamanho de colunas, ou pode ser algo simples como:

"k(espaço)-->(espaço)count"???
In reply to Lucas Guimarães Gassert

Re: EP3

by Gregory De Bonis -
No countw a formatação parece ser "%3d -> %5d\n"... Devemos seguir essa referência?
In reply to Gregory De Bonis

Re: EP3

by Arnaldo Mandel -
O countw foi escrito sobre os fêmurs, e o formato de saída não foi caprichado. Acho melhor dar espaço para 10000000 caber de cada lado.

In reply to Arnaldo Mandel

Re: EP3

by William Gnann -
Quando eu rodo o "countw" aqui em casa [Ubuntu 8.04], aparece: "Killed" logo abaixo...
Tentei executá-lo com o sudo e também retornou "Killed".
In reply to William Gnann

Re: EP3

by Paulo Cheadi Haddad Filho -
O arquivo de entrada era virus. Ele pegou e morreu.

Ta bom, num deu. Hehehe!
In reply to Paulo Cheadi Haddad Filho

Re: EP3

by Gregory De Bonis -
Claro que não! Todos sabem que só existe um vírus para Linux, e ele se chama "WINE".
In reply to Gregory De Bonis

Re: EP3

by Felipe Torres -

Analisando bem, eu conheço outro vírus.

Dado que alguns vírus contaminam outros computadores, enxem a capacidade de armazenamento do pc hospedeiro e tornam o sistema instável, o Santiago é um vírus. =P

Abraço!

In reply to Felipe Torres

Re: EP3

by Felipe Simionato Solferini -
Santiago? Eh akele ser q apareceu no primeiro semestre e dps se transformou em peixe e começou a habitar o aquario 24h por dia? (Dizem q ele fica baixando torrents de anime gls por lah =P) AUHuhauhauhA
=P
In reply to Bruno Padilha

Re: EP3

by Francisco Zigmund Sokol -
Porque quando se declara um vetor muito grande (tipo 10^7) no main dá falha de segmentação mas se eu declaro ele como uma variável global isso não acontece?
In reply to Francisco Zigmund Sokol

Re: EP3

by Marcos de Azevedo Iriarte -
O gcc tem problemas em deixar alocar muita memória estaticamente em funções - main ainda é uma função - . A causa disso é a quantidade de ataques a Stack, causando corrupção de memória tanto da própria aplicação quanto de memória alheia. Então apartir da versão 4.1 do gcc, uma proteção foi colocada - em algumas distros habilitada por padrão - que faz com que toda vez que uma aplicação compilada com o gcc tente alocar mais memória do que o disponível, ele gera uma falha de segmentação.
Quando esse tipo de variável precisa alocar um tamanho muito grande de memória, usá-la como variável global não compromete a stack e assim não causando um segfault na sua cara. Caso você queira ainda deixar seu vetor dentro do main, uma solução técnica alternativa é usar nos parâmetros de compilação -OX, onde X é inteiro e 0<X<5 , que eles identificam trechos que podem comprometer a stack e retiram em algum passo da compilação essa variável de dentro da função e coloca-a como variável global.
Outra solução é aumentar o tamanho alocado para a stack. No linux, você pode ver o tamanho da sua stack usando o comando 'ulimit -a' e mudando o valor usando 'ulimit -s <tamanho em kbytes>', mas não recomendado caso você não saiba o que está fazendo. Como para o EP não vai ser possível essa solução, aconselho a só tomar como cultura adicional.

Mais informações:
procurar por stack, stack overflow, stack smashing, buffer overflow, propolice, ulimit.

Links:
http://en.wikipedia.org/wiki/Stack-smashing_protection#GCC_Stack-Smashing_Protector_.28ProPolice.29
http://en.wikipedia.org/wiki/Buffer_overflow#Stack-based_exploitation
http://www.trl.ibm.com/projects/security/ssp/
http://doc.bughunter.net/buffer-overflow/smash-stack.html


Até!
In reply to Bruno Padilha

Re: EP3

by Everton Topan da Silva -
Aconteceu uma coisa estranha no meu EP (pra varia)

eu estava usando uma string pra guardar palavras em um loop, então no fim do loop eu dava free(), só que quando eu mallocava essa mesma string denovo ela vinha com caracteres a mais de outras vezes que ela foi usada
demorei pra descubrir o erro mas só tirei o free() e ta funcionando....

alguem sabe o pq disso??
In reply to Everton Topan da Silva

Re: EP3

by Gregory De Bonis -
Toda vez que usei free() meu programa dava uns bugs loucos, e tirar o free() sempre resolveu...
Acho que não sei usar essa função direito.
In reply to Bruno Padilha

Re: EP3

by Tobias Sena -
Porque esse programa para testar a função isalpha da SF?

#include <stdio.h>
#include <ctype.h>

int main() {
int estado;
estado = isalpha ("1");
printf ("%d\n", isalpha);
return 0;
}
In reply to Tobias Sena

Re: EP3

by Paulo Cheadi Haddad Filho -
Não seria printf ("%d\n", estado) ?
In reply to Paulo Cheadi Haddad Filho

Re: EP3

by Tobias Sena -
Corrigindo:
#include <stdio.h>
#include <ctype.h>

int main() {
int estado;
estado = isalpha ("1");
printf ("%d\n", estado);
return 0;
}

continua no SF
In reply to Tobias Sena

Re: EP3

by Geraldo Alexandre Alves do Carmo -

isalpha recebe um caractere, não uma string, este é o motivo do SF.

Se você colocar o nome da função como argumento de printf, sairá na tela o endereço que isalpha tomou no seu programa sem resultar num SF.

In reply to Geraldo Alexandre Alves do Carmo

Re: EP3

by Tobias Sena -
In reply to Tobias Sena

Re: EP3

by Geraldo Alexandre Alves do Carmo -

Você roda seu programa com aspa dupla no argumento de isalpha? Se for isto está errado, é com aspa simples.

In reply to Geraldo Alexandre Alves do Carmo

Re: EP3

by William Gnann -
In reply to William Gnann

Re: EP3

by William Gnann -
Ainda quanto à formatação.
Se fosse count --> k, as pessoas entenderiam a saída mais facilmente...
In reply to William Gnann

Re: EP3

by William Gnann -
Notei que o programa exemplo (assim como o wc) e assim como meu programa não consideram a última palavra (caso ela não tenha um espaço delimitando seu fim).
Isso é um erro?
In reply to William Gnann

Re: EP3

by Arnaldo Mandel -
Estou meio surpreso com isso; esse comportamento é um erro. Certamente o programa exemplo foi feito sem esse erro, e passa pelos meus testes. Você poderia me enviar um arquivo teste que demonstra isso que você afirmou?
In reply to Arnaldo Mandel

Re: EP3

by William Gnann -
O que acontece é que a saída correta deveria conter uma palavra repetida.
(pois, há dois caracteres 'D' como palavras).
No entanto, como D é o último caractere antes do EOF, ele me parece contar " D[EOF]" como uma palavra diferente de " D " (mas pelo critério do isalpha, isso não deveria acontecer).

Quanto ao wc, foi falha minha, ele retornou corretamente.

Enfim:
arquivo: out
saída esperada:
1 -> 1745874
2 -> 1

saída obtida:
1 -> 1745875

(testes realizados no zillertal)

Por motivos de força maior (do Paca), tive de colocá-lo em minha página pessoal:
http://www.linux.ime.usp.br/~gnann/out.zip
In reply to William Gnann

Re: EP3

by Arnaldo Mandel -
Fez bem de colocar na página pessoal, não tem sentido coocar arquivos grandes no fórum.

Aqui vai o resultado de processar seu arquivo:

progs] > time countw <out
1 -> 1745874
2 -> 1

real 0m2.647s
user 0m2.380s
sys 0m0.036s

Vou verificar se o executável que coloquei na página está bugado; eu fiz umas alterações no programa de pois de postar, mas acho que o código que garante que esse bug não ocorra está lá desde o começo.
In reply to Arnaldo Mandel

Re: EP3

by William Gnann -
É verdade, fiz umas besteiras com arquivos de entrada. Isso que dá ficar alterando arquivos em diversos computadores... [vou apagá-lo de lá]

(Na realidade, eu só não sei porque deu diferença entre compilar cá e lá...)
In reply to Bruno Padilha

Re: EP3

by Geraldo Alexandre Alves do Carmo -

Posso usar a função setlocale para resolver o problema da acentuação?(setlocale é ANSI e está definido em <locale.h>)

In reply to Geraldo Alexandre Alves do Carmo

Re: EP3

by Marcos de Azevedo Iriarte -
Pela descrição do EP, só precisa ler o começo do tópico.

Até!
In reply to Marcos de Azevedo Iriarte

Re: EP3

by Geraldo Alexandre Alves do Carmo -
O motivo de usar setlocale com pt_BR.iso88591 que é o default do zillertal é que o ctype retorna diferente de 1 para todos os caracteres acentuados, exceto o caracter ÿ que é bem raro de acontecer, exceto nesta mensagem que escrevi e no curso de cálculo.
In reply to Geraldo Alexandre Alves do Carmo

Re: EP3

by Arnaldo Mandel -
O uso do setlocale é opcional, mas quem usar, chame assim:

setlocale(LC_ALL, "");

Assim, quem manda é o ambiente, e o monitor, ao corrigir, pode forçar a barra para o progama se comportar de um jeito pré-fixado.
In reply to Arnaldo Mandel

Re: EP3

by Paulo Cheadi Haddad Filho -
Então isso quer dizer que não tem jeito de fazer um programa do EP para todos os grupos de caracteres de uma vez só?
In reply to Paulo Cheadi Haddad Filho

Re: EP3

by Arnaldo Mandel -
O que você quer dizer com "todos os grupos de caracteres ao mesmo tempo"?

Dá para fazer de forma simples um programa que presume que todo caractere ocupa um byte. É o que foi pedido. Sem muito trabalho, é possível tornar o programa sensível à localização - desde que ainda 1 byte/caractere. Por exemplo, todos os locales iso-8859-x. Agora, se for para lidar com caracteres de tamanho variável, como utf-8 e Unicode, é preciso usar toda uma biblioteca diferente para tratamento dos caracteres.
In reply to Paulo Cheadi Haddad Filho

Re: EP3

by Geraldo Alexandre Alves do Carmo -

Corrigindo: isalpha retorna um valor diferente de 0 para todos os caracteres acentuados, exceto o ÿ.

Usando o setlocale do modo que o professor escreveu, isalpha retorna diferente de 0 para um conjunto de caracteres maior que o [a-z] e [A-Z] pois o zillertal esta configurado como pt_BR.iso88591 o que ajuda muito.

In reply to Geraldo Alexandre Alves do Carmo

Re: EP3

by Paulo Cheadi Haddad Filho -
Ah, tá! Melhor!

Professor, tinha me referido com "grupos de caracteres" às listas de caracteres de cada locale (o nome certo é 'collation'?).

Quanto à mensagem do Geraldo, tinha me gerado a dúvida e depois eu vi a resposta do professor e embolou tudo...

Vou usar o setlocale mesmo. Acho que se pegar para os textos em português só texto em japonês vai dar problema! Hahaha!
In reply to Paulo Cheadi Haddad Filho

Re: EP3

by Arnaldo Mandel -
Collation é a ordem alfabética. No locale C, ela é dada pelo valor do código numérico, assim todas as maiúsculas vem na frente de todas as minúsculas. Já no pt_BR, todos os tipos de a, maiúsculo, minúsculo, com e sem acento, ficam na frente do b's, e assim por diante. Isso afeta algumas funções da libc.

man 7 locale

é o ponto de partida para mais informação.
In reply to Bruno Padilha

Re: EP3

by Paulo Cheadi Haddad Filho -
Não sei se já perguntaram...

Pode usar as funções do ctype.h além da isalpha?
In reply to Paulo Cheadi Haddad Filho

Re: EP3

by William Gnann -
Até onde sei, o que não pode é usar funções de ordenação [a não ser que você as faça].
In reply to William Gnann

Re: EP3

by Arnaldo Mandel -
O William entendeu certo. Além disso, se você usar setlocale, deve usar as funções do ctype para as suas finalidades, e não macros ad hoc, senão dá uma baita confusão.
In reply to Bruno Padilha

Re: EP3

by Nicoli G -
Eu tô no Windows e o isalpha tá reconhecendo o ú de anguústia, então conta como uma palavra só, ele reconhece caracteres acentuados com '~'. Mas por alguma razão ele corta o é.

Pela contagem do exemplo isso não deveria acontecer. u.u
In reply to Nicoli G

Re: EP3

by William Gnann -
Depende de como você está vendo o isalpha, eu tive esse problema sob Windows [bos]vista...

Troquei == 1 por != 0 e funcionou (e eu não sei explicar o porquê).
Ah é, sem contar que o windows b retornava 1024 para caracteres pequenos e não 1.
In reply to Bruno Padilha

Re: EP3

by Paulo Cheadi Haddad Filho -
Pergunta noob:

eu tenho que tratar o caso de nenhum arquivo ser passado via pipe?

Porque, por exemplo no meu caso, getc lê como scanf se isso acontece. Sei lá, fica estranho. Pelo menos, fica como curiosidade.

Seria bom se tivesse um "!stdin", hahaha!
In reply to Paulo Cheadi Haddad Filho

Re: EP3

by Atol Fortin de Oliveira -
Não sei se entendi sua dúvida mas , a entrada é entrada padrao.
In reply to Atol Fortin de Oliveira

Re: EP3

by Paulo Cheadi Haddad Filho -
Agora tenho duas dúvidas:

1- a atual
A gente não vai usar, na linha de comando, "programa < arquivo.txt" ? Isso faz o arquivo entrar pela stdin, não?

Mas no caso em que usemos só "programa", não tem arquivo! E aí? O programa vai ter que rodar ou a gente dá printf("Dá um arquivo pra eu ler")?


2 - a nova
Tô fazendo o meu EP pra funcionar para o set da ISO-8859-1. Vou cumprir o objetivo do EP? Aliás, percebi que ele vai dar um bom tradutor de miguxês, ahahaha!


Valeu! =D
In reply to Paulo Cheadi Haddad Filho

Re: EP3

by Atol Fortin de Oliveira -
1.Acho que voce está confundindo as coisas.
Ao usar o '<' voce redireciona um arquivo para a entrada padrao, entao se tenho um arquivo assim :
teste 1

ao fazer programa < arquivo ,
é o mesmo que fazer :
programa ( enter )
teste 1 ( enter )

ou seja, seu programa fica esperando voce digitar até que acabem as entradas que ele esperava, caso voce queira enviar um EOF, basta digitar (CTRL+d) .

2. ...
In reply to Paulo Cheadi Haddad Filho

Re: EP3

by Arnaldo Mandel -
No enunciado do EP foi definida "palavra" de uma forma feia porém precisa, justamente para evitar dúvidas e evitar complicação por um lado que não interessa. Assim, se você quer tratar ISO-8859-1 no seu programa, trate direito, ou seja, usando locale. Não force seu programa trabalhar com um local específico.

No linux, pode-se alterar o ambiente de um programa com o comando env. Assim, se seu programa for sensível ao local, as chamadas

env LC_ALL=pt_BR countw

env LC_ALL=C countw

terão "opiniões" diferentes sobre o que é palavra, mas vai ser tudo por conta do isalpha.

Troquei o programa-exemplo que estava na página do enunciado por um sensível ao local. A única modificação no programa-fonte foi a inclusão de duas linhas de código

#include <locale.h>

setlocale(LC_ALL, "");

nos lugares apropriados.