EP3

EP3

por Bruno Padilha -
Número de respostas: 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 ?
Em resposta à Bruno Padilha

Re: EP3

por Gregory De Bonis -
E '-' será delimitador de palavra (uma vez que '-' isnotalpha)?
Em resposta à Gregory De Bonis

Re: EP3

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

Do tipo "guarda-chuva"? É uma palavra só, não?
Em resposta à Paulo Cheadi Haddad Filho

Re: EP3

por 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"...

Em resposta à Bruno Padilha

Re: EP3

por Gregory De Bonis -
Eu gostaria de mais exemplos de entrada e saída, se possível. sorriso
Existe algum limite para o tamanho de cada palavra?
Em resposta à Gregory De Bonis

Re: EP3

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

Isso é contornável...
Em resposta à Lucas Guimarães Gassert

Re: EP3

por 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
Em resposta à Lucas Guimarães Gassert

Re: EP3

por 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?
Em resposta à Gregory De Bonis

Re: EP3

por Felipe Simionato Solferini -
A maior palavra da lingua portuguesa tem 46 letras. Eh Pneumoultramicroscopicossilicovulcanoconiótico.
Em resposta à Felipe Simionato Solferini

Re: EP3

por William Gnann -
Pneumoultramicroscopicossilicovulcanoconi, porque ó não conta. =P
Em resposta à William Gnann

Re: EP3

por 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...
Em resposta à Lucas Guimarães Gassert

Re: EP3

por 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.
Em resposta à Arnaldo Mandel

Re: EP3

por 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?
Em resposta à Gregory De Bonis

Re: EP3

por 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]
Em resposta à William Gnann

Re: EP3

por 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.
Em resposta à Lucas Guimarães Gassert

Re: EP3

por 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!

Em resposta à Gregory De Bonis

Re: EP3

por Atol Fortin de Oliveira -
A entrada pode ser qualquer.
Em resposta à Atol Fortin de Oliveira

Re: EP3

por 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!"
Em resposta à Lucas Guimarães Gassert

Re: EP3

por 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.
Em resposta à Bruno Padilha

Re: EP3

por 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).
Em resposta à William Gnann

Re: EP3

por Paulo Cheadi Haddad Filho -
Incrementando a pergunta:

pode usar tolower(caracter)?
Em resposta à Paulo Cheadi Haddad Filho

Re: EP3

por 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...
Em resposta à Bruno Padilha

Re: EP3

por 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"???
Em resposta à Lucas Guimarães Gassert

Re: EP3

por Gregory De Bonis -
No countw a formatação parece ser "%3d -> %5d\n"... Devemos seguir essa referência?
Em resposta à Gregory De Bonis

Re: EP3

por 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.

Em resposta à Arnaldo Mandel

Re: EP3

por 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".
Em resposta à William Gnann

Re: EP3

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

Ta bom, num deu. Hehehe!
Em resposta à Paulo Cheadi Haddad Filho

Re: EP3

por Gregory De Bonis -
Claro que não! Todos sabem que só existe um vírus para Linux, e ele se chama "WINE".
Em resposta à Gregory De Bonis

Re: EP3

por 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!

Em resposta à Felipe Torres

Re: EP3

por 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
Em resposta à Bruno Padilha

Re: EP3

por 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?
Em resposta à Francisco Zigmund Sokol

Re: EP3

por 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é!
Em resposta à Bruno Padilha

Re: EP3

por 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??
Em resposta à Everton Topan da Silva

Re: EP3

por 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.
Em resposta à Bruno Padilha

Re: EP3

por 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;
}
Em resposta à Tobias Sena

Re: EP3

por 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.

Em resposta à Geraldo Alexandre Alves do Carmo

Re: EP3

por Tobias Sena -
Em resposta à Tobias Sena

Re: EP3

por Geraldo Alexandre Alves do Carmo -

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

Em resposta à Geraldo Alexandre Alves do Carmo

Re: EP3

por William Gnann -
Em resposta à William Gnann

Re: EP3

por William Gnann -
Ainda quanto à formatação.
Se fosse count --> k, as pessoas entenderiam a saída mais facilmente...
Em resposta à William Gnann

Re: EP3

por 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?
Em resposta à William Gnann

Re: EP3

por 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?
Em resposta à Arnaldo Mandel

Re: EP3

por 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
Em resposta à William Gnann

Re: EP3

por 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.
Em resposta à Arnaldo Mandel

Re: EP3

por 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á...)
Em resposta à Bruno Padilha

Re: EP3

por 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>)

Em resposta à Geraldo Alexandre Alves do Carmo

Re: EP3

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

Até!
Em resposta à Marcos de Azevedo Iriarte

Re: EP3

por 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.
Em resposta à Geraldo Alexandre Alves do Carmo

Re: EP3

por 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.
Em resposta à Arnaldo Mandel

Re: EP3

por 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ó?
Em resposta à Paulo Cheadi Haddad Filho

Re: EP3

por 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.
Em resposta à Paulo Cheadi Haddad Filho

Re: EP3

por 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.

Em resposta à Geraldo Alexandre Alves do Carmo

Re: EP3

por 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!
Em resposta à Paulo Cheadi Haddad Filho

Re: EP3

por 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.
Em resposta à Bruno Padilha

Re: EP3

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

Pode usar as funções do ctype.h além da isalpha?
Em resposta à Paulo Cheadi Haddad Filho

Re: EP3

por 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].
Em resposta à William Gnann

Re: EP3

por 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.
Em resposta à Bruno Padilha

Re: EP3

por 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
Em resposta à Nicoli G

Re: EP3

por 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.
Em resposta à Bruno Padilha

Re: EP3

por 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!
Em resposta à Paulo Cheadi Haddad Filho

Re: EP3

por Atol Fortin de Oliveira -
Não sei se entendi sua dúvida mas , a entrada é entrada padrao.
Em resposta à Atol Fortin de Oliveira

Re: EP3

por 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
Em resposta à Paulo Cheadi Haddad Filho

Re: EP3

por 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. ...
Em resposta à Paulo Cheadi Haddad Filho

Re: EP3

por 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.