Saturday, November 12, 2011

A agenda oculta

Era uma quinta-feira, finalzinho de tarde, bem dizer já início do final de semana. Três bons malandros, garotos super inteligentes, mas com aquele quê de vagabundagem, resolveram comemorar as boas notas nas provas da faculdade fumando um baseado.

- E ae, Jão...
- E ae, Zé...
- E ae, Rogério regério regente de almeida prado...
- Hahahaha
- Hahahaha
- Hahahaha

Estavam assim, nesse papo cabeça, quando a polícia sentiu o cheiro da marola e resolveu atuar. Eram dois policiais naquela ronda. Um tinha acabado de receber uma ligação da filha de que a empresa de TV a cabo descobriu o gato e cortou o sinal. O outro tinha levado uma gelada da mulher na noite anterior, crises normais de qualquer casamento, mas com uma diferença: agora a mulher estava jogando duro mesmo, e greve de sexo deixa qualquer um em estado de nervos. Daí entende-se o jargão "agiu sob forte emoção".

Nesse estado de espírito, sem falar nada um com o outro, apenas aquele olhar vingativo foi suficiente para se entenderem de que dessa vez não iria ter "vista grossa". Pequena e boba agenda oculta de cada policial, que todos nós temos, e que influenciam na vida das pessoas. Na verdade, lei por lei, deveria ser sempre assim...

Levaram os três "maconheiros" presos. Rótulo forte, né? Como é fácil usar um rótulo para transformar estudantes inteligentes e de bem com a vida, comemorando uma semana produtiva com um baseado, em delinquentes sem nada na cabeça, que só pensam em fumar maconha e são um câncer na sociedade. Bom, fato é fato, interpretação é interpretação. Três maconheiros foram presos. Neste relato sem qualquer semelhança com a realidade, em caráter literário, peço licença poética para permitir jogar com fatos, com interpretações, e se possível entortar tudo de modo que quem vê a coisa de um jeito, seja de que jeito for, possa também ver de outro(s), seja lá como for o outro, para pior ou para melhor.

Um grupo de amigos desses caras, também eles maconheiros nas horas vagas, ficou indignado! Começaram a discutir, e tiveram uma idéia fantástica:

- Ei Mané...
- Fala Calu...
- Ozomi levaram o Jão...
- É... e o Zé...
- É... e o Rogério regério regente de almeida prado...
- Hahahahahaha
- Hahahahahaha

(mais um trago)

- E ae?
- O que?
- Hahahahahaha
- Hahahahahaha

(mais um trago...)

- Ae que se fuderam!
- Hahahahahaha
- Hahahahahaha

(Bolando ou baseado)

- Cara, mas e se pegam a gente também?
- Porra, não tinha pensado nisso...
- Pois é...
- Vamo fazê uma parada!
- Tráfico, tô fora!
- Não carai, to falando outra parada...
- Mas eu só tenho maconha.
- Porra bicho, vamo faze uma muvuca, tá ligado?
- Ah... saquei... Tipo, uma revolução...
- Isso...
- E o que a gente reivindica?
- Po...
- Sei lá...
- Hahahahahaha
- Hahahahahaha

(Acendendo o novo)

- Já sei!
- O que?
- A gente junta a galera, mas não explica nada.
- Nada?
- É porra! Se a gente explicar, sempre vai ter um contra e outro a favor...
- A gente perde 50% da galera
- Então... se a gente não falar do que é, cada um pensa no que quiser e se junta
- Po, saquei... Mas... E depois que a impressa cobrir, a gente fala o que?
- Ah, a gente assiste o que eles acham que dá mais ibope e diz que é aquilo lá.
- Po! Massa mesmo. Vai ser super inteligente a reivindicação, tá ligado!?
- Só...
- Hahahahahaha
- Hahahahahaha

Aí começa uma muvuca! Molecada invadindo a reitoria, tomando posse de tudo... Mas consciente, claro, sem quebrar nada...

Aí uns caras das ciências sociais aderem ao movimento, com a proposta de fora PM. Uns caras da filosofia já aderem com a idéia de discutir a autenticidade da autoridade do reitor com histórico de facista.

Hum... alguns professores também tem uma agenda oculta... Será possível salvar esse movimento mal iniciado e reivindicar alguma coisa de útil para mudar o 'status quo'? Quem sabe exigir eleições diretas para reitor?

Outros não se interessam, estão satisfeitos com o 'status quo'. Entre eles, engenheiros, médicos, e muitos (a grande maioria) dos alunos.

O governador, requisitado pelo reitor, pensa lá com seus botões: a mídia foi contra o movimento... então é melhor eu também ser contra. Se associarmos o movimento ao consumo de drogas, a sociedade verá com bons olhos a tropa de choque invadindo... Então, dá a ordem: desce o cacete nos burguesinhos maconheiros!

Mas nessas horas, já não se vê os burguesinhos maconheiros. Dentro da reitoria pegam uma meia centena de devoradores de Marx, com um discurso um pouco vazio... Na TV entrevistam professores que tentam dizer que não é reivindicação o "Fora PM", e sim o processo democrático... E a gente lê as faixas dos alunos dizendo "PMaldita" e as palavras não casam às imagens... Os discursos, cada um tentando trazer o movimento para vender seu peixe, não casam com uma realidade retalhada... Não há união de idéias...

E os maconheiros burguesinhos?

- Cara, que irado né?! (bolando um lá no fim do campinho, atrás da jaqueira, longe dos holofotes)
- Vc viu só, mano!?
- Hahahahahaha
- Hahahahahaha
- Virou a maior onda!
- Hahahahahaha
- Hahahahahaha
- Tem neguinho pedindo até a saída do reitor!
- Hahahahahaha
- Hahahahahaha
- E aquele professor na TV cultura, que disse que não quer a PM fora?
- Hahahahahaha
- Hahahahahaha
- E a turma da sociologia? Vc viu?
- Hahahahahaha
- Hahahahahaha
- Sim, os caras falando que a PM não permite discurso político!
- Hahahahahaha
- Hahahahahaha
- Velho, que se foda tudo, desde que não me atrapalhem fumar meu baseado.
- Hahahahahaha
- Hahahahahaha
- É mesmo! Nóis é foda!


Wednesday, September 7, 2011

Estatística de Futebol

Se vocẽ gosta de acompanhar futebol, e tem seu time no CartolaFC, aqui um site que vai deixar você ligado nos resultados e na atuação de cada jogador:


É um site sobre estatísticas, com muitas informações! Vá lá e esprema o suco.

Monday, May 23, 2011

Friday, April 22, 2011

Afinar seu violão




A dificuldade do iniciante é que as cordas normalmente são contadas invertidas. Aqui vamos introduzir um novo conceito de nomenclatura de cordas de violão.

Para não confundirmos mais a nomenclatura, iremos chamar a nomenclatura antiga de inversa, e a nova de direta. A diferença se dá apenas na contagem da numeração das cordas. Então, na nomenclatura inversa você conta as cordas como 6ª, 5ª, 4ª, 3ª, 2ª e 1ª, de cima para baixo. Na nova nomenclatura, a direta, as cordas são contadas de cima para baixo como 1ª, 2ª, 3ª, 4ª, 5ª e 6ª. Vamos para a prática da afinação:
  1. 1ª corda (MI) ou Mizão: Pulamos a primeira no momento. Veja porque adiante.
  2. 2ª corda (): Para afinar seu violão, comece da 2ª corda (a segunda de cima para baixo). Ela precisa de uma referência externa, normalmente pode-se utilizar o som da chamada do telefone, que é de 440 hz. Uma vez afinada, vá para a terceira corda.
  3. 3ª corda (): Basta posicionar o dedo no 5º traste da 2ª corda, e equiparar os sons da 2ª corda com a 3ª corda solta. Quando os ouvidos indicarem que são similares, está afinada. Passa-se á quarta corda.
  4. 4ª corda (SOL): A 4ª corda deve ter som similar à 3ª corda () tocada no 5º traste.
  5. 5ª corda (SI): É similar em som à 4ª corda (SOL), no 4º traste.
  6. 6ª corda (MI): ou Mizinha, tocada solta tem o som da 5ª corda (SI) tocada presa no 5º traste.
  7. 1ª corda (MI): ou Mizão, é a corda inicial (ou superior) do violão. Tocada solta tem o som da última corda (a 6ª corda ou mizinho) porém uma oitava abaixo. Mesmo sem entender oitavas, o ouvido humano é capaz de identificar estes dois sons como "semelhantes"! Pronto, violão afinado!

War I - A segunda destruição dos exércitos brancos

Pois é... Eu e o Heck aqui na páscoa dos entediados, resolvemos criar algumas regras para se jogar war com apenas duas pessoas. Chegamos às seguintes condições:

  • Cada pessoa irá liderar duas cores
  • Cada cor terá seu próprio objetivo. O jogador ganha se (e quando) conquistar ambos AO MESMO TEMPO.
  • As peças de cores diferentes, chamadas aliadas, terão sua própria vez de jogar, sua contagem de peças é independente, e poderá atacar quem desejar, exceto as aliadas.
  • É possível, ao final da rodada, remanejar as peças por territórios aliados.
  • Territórios que contém ambas peças durante a contagem de territórios não são considerados.
  • Existem duas fases de remanejamento: ao início da rodada, apenas as peças que estão em territórios com duas cores podem ser movidas. Ao final da rodada, o remanejamento normal do war.
  • As cartas são ganhas para o jogador, não para a cor. O jogador guarda as cartas e decide quando realizar as trocas. Pode realizar as trocas no início da jogada de qualquer de suas duas cores.
  • Quando atacado, um território que possuir mais de duas cores pode escolher com qual cor quer se defender. O número de dados é independente e relativo àquela cor escolhida.

Para a alegria dos leitores, o Heck, novamente com suas peças brancas, e agora também com as azuis, teve seus objetivos assim delineados: destruir as peças pretas (hum... coitado...) e conquistar 24 territórios (porque ele tirou destruir as azuis, que já eram dele, e o objetivo alternativo foi acionado).

Meus dois objetivos, coincidência desta vez não atribuída a algum "camaço", era: 1- destruir o Heck (peças brancas) e 2- américa do sul, europa, e outro continente à sua escolha.

América do Sul, com poucas jogadas, foi dominada pelas pretas. América do Norte, com um pouco mais de trabalho, mas com a performance intocável de apenas uma jogada! (sim apenas uma), saiu na frente e foi conquistada.

A Europa foi atacada vinda da Groelandia, também tentando manter Moscou, e entrando da América do Sul, pela África, além do último suspiro, vindo de Vladvostok, até Moscou, para ajudar. Neste caminho, lógico, foi preferido territórios pelos quais estavam os brancos.

A África foi um caso à parte. Madagascar sobreviveu impotente a vários ataques, pecinha isolada, que nada tinha a ver com o objetivo e o caminho global. Ao final do jogo, se tornou ponto principal, pois ali estavam, no continente africano, quase dominando e ganhando suas peças, os brancos! Heck viu aquela pecinha isolada de Madagascar crescer e lhe impor a desesperada derrota.

A definitiva derrota ocorreu na última peça branca, na Polônia. A Polônia, além de ter a última peça branca, era também o último território a conquistar para cumprir o objetivo de ter domínio da América do Sul, Europa, e outro à sua escolha (no caso, a América do Norte).

Sendo assim, os poloneses viram sua destruição como o início de um novo mundo, dominado pelas peças pretas, um ditador insaciável e sanguinário, que não fosse o jogo acabar, teria seguido friamente para destruir as azuis até o fim da Austrália!

Momentos antes da batalha final da Polônia, é importante deixar registrado, o Oriente Médio manteve, com inicialmente 4 peças azuis e duas brancas, uma pequena resistência. Ao ser atacado, primeiro jogou 3 dados contra os invasores de Moscou, e perdeu três peças azuis. No segundo ataque, as peças brancas foram escolhidas, e o defensor jogou 2 dados amarelos. Perdendo as duas peças, sobrou somente uma azul no território. Ficou ele surpreso ao notar que o ataque de Moscou deixou o território com aquela única azul para se dirigir à Polônia e terminar o jogo! Foi ali que ele percebeu: a casa caiu para as brancas! Ahahahaha!

War I - A estréia

Compramos um jogo de war em 3 amigos. No jogo de estréia, um deles não estava presente e mandou um representante, o cientista pinel. Heck, presente, jogou com as brancas, oficialmente suas peças. Eu, com as pretas.


Objetivos: tenho que confessar que não resisti e fiz um "camaço" de modo que os objetivos ficassem mais interessantes. Eu peguei destruir as brancas; Heck, destruir as vermelhas; Pinel, destruir as pretas. A sorte estava lançada... Ahahaha!

Ao final do jogo, repare na peça branca no japão, sendo ameaçada por uma invasão vinda de Vladivostok, que começou lá em Otawa, passou 3 peças para o Alaska, passou duas para Vlad, e uma única legião atacou e dizimou o Alaska, varrendo do mapa a ameaça branca!

Ahahaha!

Tuesday, April 19, 2011

Felicidade

" Como todos sabem
o animal mais inteligente
que existe é o cachalote.
Ele não vai à lua porque
apenas quer ser feliz
e também (confesso) não tem
o dedo polegar.
Mas basta ouvir uma só vez
a Nona de Beethoven,
ou as obras completas de Lennon &
McCartney,
ou o Ulisses,
ou os Elementos de bibliologia,
que sua mente computaplexa
armazena tudo e reproduz nota por
nota, palavra por
palavra, a qualquer momento,
pelo resto da vida."
(Âmbar gris, Rubens Fonseca)

Thursday, April 7, 2011

BrainForce

A definição da linguagem:

Acabo de criar uma linguagem, chamada de BrainForce, desenvolvida baseada nas definições da linguagem de Urban Muller.

A linguagem basicamente tem 8 comandos:

  1. '+' : adiciona um à célula na posição do ponteiro
  2. '-' : subtrai um da céluna na posição do ponteiro
  3. '>' : move o ponteiro para a direita uma casa
  4. '<' : move o ponteiro para a esquerda uma casa
  5. '[' : inicia um laço se o valor na posição do ponteiro for diferente de zero, pula o laço caso contrário
  6. ']' : fecha o laço, retornando o controle para o colchete respectivo que o abriu
  7. '.' : imprime um valor na saída padrão
  8. ',' : lê um valor da entrada padrão
Além desses comandos, é possível utilizar um comando de debug '#' que permite imprimir de uma só vez o valor de cada uma das dez primeiras células (na versão 2.0, isso será variável, imprimindo os 11 valores centrados no ponteiro, 5 a sua esquerda e 5 a sua direita, além do próprio).

Nos comentários do arquivo de definição do analisador léxico se encontram essas explicações (o programa foi todo codificado em inglês, para melhor aceitação da comunidade internacional, incluindo comentários e nomes de variáveis):
/*
BrainForce Compiler v.1.0, An esoteric programming language
Author: Ruben Carlo Benante (Dr. Beco)
Email: rcb [at] beco.cc
Creation date: 05/Apr/2011
Project based on the ideas of Urban Muller (http://fi.aminet.net/dev/lang)
WebPage: www.beco.cc/compiler/brainforce
License: CC-3.0 http://creativecommons.org/licenses/by-nc-sa/3.0/

Usage:
./brainforce input_file [-o output_file] [options]

input_file : a input file with source code in BrainForce language (.bf)
output_file : a generated C source code from the input file (.c)

Options:
-zn :
n=0 default behavior
n=1 set zero = '0' for pretty print of chars
n=2 set cells to read/write integers
-d : print the syntax tree of the input_file
-v : verbosity mode. Can pile up till level 10
-q : quiety mode
-E : stop after preprocessor and write output_file.i (not implemented)
-S : stop after assembler and write output_file.s (not implemented)
-C : stop after C generator and write output_file.c (default)
-o file : output file name (default .c)
-h : print this help

BrainForce Source File:
Command Meaning
> increment the data pointer (to point to the next cell to the right).
< decrement the data pointer (to point to the next cell to the left).
+ increment (increase by one) the byte at the data pointer.
- decrement (decrease by one) the byte at the data pointer.
. output a character, the ASCII value of which being the byte at the data pointer.
, accept one byte of input, storing its value in the byte at the data pointer.
[ if the byte at the data pointer is zero, then jump forward to the command after the matching ] command.
] if the byte at the data pointer is nonzero, then jump back to the command after the matching [ command.
# debug: print the first 10 cells
*/


A linha de comando:

O compilador chamado de
 brainforce
é chamado na linha de comando com a syntaxe e opção dos seguintes argumentos:

uso:

$./brainforce arquivoentrada.bf [-o arquivosaida.c] [opções]


As opções disponíveis são:

-zn :
n=0 comportamento padrão compatível com a definição da linguagem original
n=1 faz o zero = '0', valor ASCII 48, para imprimir caracteres de modo mais legível
n=2 usa inteiros nos comandos de ler ',' e imprimir '.'
-d : imprime a árvore de sintaxe gerada pelo compilador
-v : aumenta a saída de mensagens de compilação. Pode ser usada de 1 a 10 vezes
-q : ativa o modo silencioso, diminuindo as mensagens de compilação
-E : roda apenas o preprocessador com arquivo de saída arquivo.i (não implementado)
-S : roda apenas o assembler, dando saída ao código assembly arquivo.s (não implementado)
-C : traduz o código do Brain Force para linguagem C na saída arquivo.c (é o modo padrão)
-o nome_arquivo : nome do arquivo de saída (sem definir, imprime na saída padrão,
-h : imprime esta ajuda


Como se pode ver, são muitas opções. Mas o mais impressionante é que esta pequena linguagem é Turing-Completa. Ou seja, é capaz de fazer qualquer coisa que as atuais linguagens mais poderosas do existentes, basta você ter muito tempo, e não ter vida social nenhuma.

Sunday, April 3, 2011

Mini Cliente em C

Este é um exemplo de código para um cliente mínimo, que envia um byte (letra C) para o servidor, e lê outro byte do servidor, pela internet. As tarefas para se conseguir isso são realizadas na ordem:

  1. Creating socket... done!
  2. Connecting... done!
  3. Writing "C"... done!
  4. Reading... "S" done!
Abaixo o código:

/*
Program: mincli.c
Author: Dr Beco
Date: 2001-04-03
Objective:
show a minimum client program that can
connect to a network, write a byte, read a byte, disconnect
*/

#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netdb.h>

#define BUFFER 2

int main(void)
{
printf("Configuring environment... ");

char data[BUFFER];
const char *host_server="localhost";
struct sockaddr_in dir;
struct hostent *host;
int aux, id, p=3333; //port

dir.sin_port = p;
dir.sin_family = AF_INET;
host = gethostbyname(host_server);
if(host == NULL)
return -1;
dir.sin_addr.s_addr = ((struct in_addr *)(host->h_addr))->s_addr;
printf("done!\n");

printf("Creating socket... ");
id = socket(AF_INET, SOCK_STREAM, 0);
if(id == -1)
return -1;
printf("done!\n");

printf("Connecting... ");
if(connect(id, (struct sockaddr *)&dir, sizeof(dir)) == -1)
return -1;
printf("done!\n");

printf("Writing \"C\"... ");
aux = send(id, "C", 1, MSG_NOSIGNAL);
if(aux < 0)
return -1;
printf("done!\n");

printf("Reading... ");
aux = read(id, data , 1);
if(aux!=1)
return -1;
printf("\"%c\"", data[0]);
printf(" done!\n");
return 0;
}

Mini Servidor em C

Este é um exemplo de código para um servidor mínimo, que lê um byte (letra) e envia outro byte (letra S) pela internet. As tarefas para se conseguir isso são realizadas na ordem:

  1. Configuring environment... done!
  2. Creating socket... done!
  3. Configuring socket... done!
  4. Binding... done!
  5. Listening... done!
  6. Accepting... done!
  7. Reading... "C"done!
  8. Writing "S"... done!

Abaixo o código:
/*
Program: minser.c
Author: Dr Beco
Date: 2001-04-03
Objective:
show a minimum server program that can
create a socket, accept a client, read a byte, write a byte, disconnect
*/

#include <stdio.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/un.h>

#define BUFFER 2

int main(void)
{
printf("Configuring environment... ");

int p = 3333; // port
char data[BUFFER];
struct sockaddr_in dir;
struct sockaddr client;
socklen_t long_client;
int id, idReuse=1, son, aux;

memset(&dir,0,sizeof(dir));
dir.sin_port = p;
dir.sin_family = AF_INET;
dir.sin_addr.s_addr = INADDR_ANY;
printf("done!\n");

printf("Creating socket... ");
id = socket(AF_INET, SOCK_STREAM, 0);
if (id == -1)
return -1;
printf("done!\n");

printf("Configuring socket... ");
if(setsockopt(id,SOL_SOCKET,SO_REUSEADDR,&idReuse,sizeof(idReuse))==-1)
return -1;
printf("done!\n");

printf("Binding... ");
if(bind(id, (struct sockaddr *)&dir, sizeof(dir)) == -1)
{
close (id);
return -1;
}
printf("done!\n");

printf("Listening... ");
if (listen(id , 1) == -1)
{
close(id);
return -1;
}
printf("done!\n");

printf("Accepting... ");
long_client = sizeof (client);
son = accept(id, &client, &long_client);
if (son == -1)
return -1;
printf("done!\n");

printf("Reading... ");
aux = read(son, data , 1);
if(aux!=1)
return -1;
printf("\"%c\" ", data[0]);
printf("done!\n");

printf("Writing \"S\"... ");
aux = send(son, "S", 1, MSG_NOSIGNAL);
if(aux < 0)
return -1;
printf("done!\n");

return 0;
}

Wednesday, March 30, 2011

Acabo de instalar o Firefox 4 no UBUNTU 10.04


Muito bom! Muito mais rápido, e com visual mais clean. Para instalar você precisa seguir esses passos:
  1. Vá no menu Applications e clique em Ubuntu Software Center.
  2. Clique em Edit e em Software Sources.
  3. Clique na guia Other Software, e em Add.
  4. Em APT Line adicione a linha: ppa:mozillateam/firefox-stable
  5. Aguarde um pouco o update acontecer e pode fechar a janela.
  6. Vá em System, em Administration e chame o Update Manager.
  7. Feche o seu navegador firefox. Antes, leia o passo 8. :)
  8. Clique em Check e depois do gerenciador achar as atualizações, clique em Install Updates.


Prontinho! Pode reiniciar o firefox novo! O bom é que a partir de agora você terá cadastrado o site do firefox no seu source lists e terá sempre a última versão nos updates.

Na foto, além de conferir o visual do Firefox 4, a janela about com a versão, e o draft deste post, note um círculo verde no botão HTML ENCODE SELECTION. Este é o botão que é instalado pelo passo 3.2 do post Como postar código fonte no blog (26/mar/2011).

Referência
[1] Firefox 4 PPA

Contar palavras em uma frase

Um amigo meu na USP esta iniciando o curso de TI, e aprendendo a programar em C. Fez como desafio uma função Conta_Ocorrs() para contar o número de ocorrência de uma palavra em uma dada frase. Aproveitei seu algoritmo para ensinar algumas práticas melhores, comentei seus erros, corrigi, e também sugeri uma nova função contaoc().

Na nova função, discuti se vale a pena incluir um break para sair da função, ou se é melhor deixar o laço acabar por exaustão.

Abaixo a solução:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX 80

//funcao Conta_Ocorrs antes do main
//evita ter que escrever o prototipo
//int Conta_Ocorrs(char *pal, char *fra); //<= repare o ponto-e-virgula no prototipo

int Conta_Ocorrs(char *pal, char *fra)
{
int k; //conta as buscas da palavra na frase
int r; //conta as ocorrencias de caracteres de palavra em frase
int o=0; //conta as ocorrencias aqui!
int n, m;

//n=sizeof(fra); Este operador da o tamanho do "tipo" de variavel (int eh 2 bytes, char eh 1 byte, etc).
//m=sizeof(pal); Nao da o tamanho da string. Para isso, use:
n=strlen(fra);
m=strlen(pal);
printf("Tamanhos: frase: %d, palavra: %d\n", n, m);

for (k=m;k<=n;k++)
{
r=1; //r eh zerado em cada pesquisa -- os indices comecam em zero
while (r<=m && pal[m-r]==fra[k-r]) //r<=m para dar zero
r++;
if (r>=m)
o++;
}
return o;
}

//a funcao acima conta comparando indices de tras para frente, o que afeta o desempenho
//o melhor eh comparar os indices na direcao da memoria, para deixar o compilador otimizar melhor o codigo
//descomente os printfs abaixo para ver os indices.
//testei com as frases
//teste 1: frase: "a casa bonita casa". palavra: "casa"
//teste 2: frase: "mamama". palavra: "mama"
//teste 3: frase: "a casa bonita cas". palavra: "casa"
int contaoc(char *pal, char *fra)
{

int p=0; //indice da palavra
int f=0; //indice da frase
int o=0; //ocorrencias
// int tfra, tpal; //use nomes melhores para lembrar do que se trata

// tfra=strlen(fra); //sera que vale a pena conferir?
// tpal=strlen(pal); //veja resposta abaixo

//aproveito que se sabe que ao final de uma string sempre tem o caracter nulo '/0'
while(fra[f+p]!='\0')
{
// printf("outside p:%d, f:%d, o:%d\n", p, f, o);
while(pal[p]!='\0' && fra[f+p]!='\0' && pal[p]==fra[f+p])
// {
// printf("inside p:%d, f:%d, o:%d\n", p, f, o);
p++;
// }
if(pal[p]=='\0') //o pal[p] foi ate o fim, entao encontrou ocorrencia, caso contrario, acabou a frase ou sao diferentes
o++;

//evita calcular o restinho da frase menor que a palavra
// if(f+tpal > tfra)
// {
// printf("strlen p:%d, f:%d, o:%d\n", p, f, o);
// break;
// }
//talvez nao valha a pena. Vejamos:
//A frase "a casa bonita casa" tem 18 letras. A palavra "casa" tem 4. Somente quando f=15, as ultimas 3 letras da frase
//teremos o break. Isso vai evitar 3 giradas do laco externo (e talvez do interno se a frase fosse "a casa bonita cas")
//estamos falando de evitar entao:
// 3 whiles externos e no pior caso, 3+2+1 whiles internos com seus respectivos p++, mais 3 if(pal[p]=='\0')
// mais 3 p=0 e f++
// TOTAL de 24 operacoes
// Incluindo o if(t+tpal>tfra) e seu break, eliminamos 24 operacoes, mas inserimos:
// 2 strlen() no inicio
// para casa laco externo antes dos 3 ultimos (ou seja, 15 lacos): um if(t+tpal..., e a adicao em si do t+tpal
// TOTAL de 30 operacoes!!!
// Caso geral: supoe-se que frases podem ser maiores, mas as palavras acabam por ter um tamanho limitado
// Portanto, em um caso geral, a frase maior e uma palavra de tamanho limitado
// no algoritmo com break: aumenta o total de operacoes do if do break, e nao diminui consideravelmente os lacos
// no algoritmo sem break: o restinho do laco continua sendo executado sem necessidade, mas o numero de operacoes permanece pequeno
// Conclusao: melhor deixar o laco sem teste de break

p=0;
f++;
}
// printf("return p:%d, f:%d, o:%d\n", p, f, o);
return o;
}


// Função principal

int main(void)
{
char palavra[MAX], frase[MAX]; //ponteiros nao sao vetores! Eh preciso alocar o espaco para guardar dados, e isso eh feito com vetor
// contadores mudaram para dentro da funcao int m,n; //Definicao dos contadores
// nao estava sendo utilizada int o; //Definicao do valor de retorno da funcao

//Entrada de dados (inverti a ordem para melhor clareza)
printf("Entre com a frase (max %d letras pois 1 fica reservado para o caracter nulo): ", MAX-1);
//scanf("%s",frase); //nao se usa operador endereco & em ponteiros ou vetores
fgets(frase, MAX-1, stdin); //scanf para de ler ao ver espaco. use fgets(). fgets inclui o ENTER ao final. Elimine-o se nao quiser
frase[strlen(frase)-1]='\0'; //eliminando o ENTER final. Veja explicacao do strlen na funcao acima
printf("Entre com a palavra (max %d letras pois 1 fica reservado para o caracter nulo): ", MAX-1);
scanf("%s",palavra); //nao se usa operador endereco & em ponteiros ou vetores

//Inicializacao dos contadores pode ser feita na funcao, para diminuir numero de parametros
//m=sizeof(palavra);
//n=sizeof(frase);

//Saida de dados
printf("A palavra %s ocorre %d vez(es) na frase\n",palavra, Conta_Ocorrs(palavra, frase));
printf("Funcao contaoc(pal,fra): ocorrencias %d\n", contaoc(palavra, frase));

//Fim
//Nunca use isto. Seu algoritmo nao depende de sistema operacional. system("pause");
//Se precisa dar um tempo antes de retornar, use:
//getchar();
//mas o melhor eh aprender a executar o programa na linha de comando do prompt (shell)
}

Saturday, March 26, 2011

Como postar código fonte no blog

Não sem dificuldade, pesquisei e instalei o necessário para poder colocar no blog código fonte. Para que isso seja possível, com os simples 4 passos:

1- Colar o código no post, na janela de edit HTML
2- Selecioná-lo
3- Transformá-lo em HTML clicando no botão HTML ENCODE SELECTION
4- Colocar o código entre as tags <pre class="prettyprint"> e </pre>

É preciso antes configurar algumas coisas:

O item 3- O botão do item 3 não vem instalado por default. Para conseguí-lo é preciso:
3.1- instalar o add-on do firefox chamado greasemonkey, disponível na página GreaseMonkey Add-on
3.2- instalar o script que o greasemonkey usa para incluir o botão HTML ENCODE SELECTION. Para isso, após instalado, clique em: Script HTML ENCODE SELECTION
O greasemonkey deve aparecer na tela confirmando se quer instalar o script.

O item 4- As tags <pre class="prettyprint"> e </pre> não estão prontas para serem usadas. Para instalá-las é preciso:
4.1- Vá para as configurações do seu blog e edite o HTML Template
4.2- Faça um backup do código HTML antes de alterá-lo
4.3- Adicione na tag "head" o código (este é para o google-prettify, mas podem ser usados outros como o SyntaxHighlighter).

<link href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" rel="stylesheet" type="text/css"/>
<script src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js" type="text/javascript"/>


4.4- Crie a tag "pre" adicionando o código:

pre {
margin: 5px 20px;
border: 1px dashed #666;
padding: 5px;
background: #f8f8f8;
white-space: pre-wrap; /* css-3 */
white-space: -moz-pre-wrap; /* Mozilla, since 1999 */
white-space: -pre-wrap; /* Opera 4-6 */
white-space: -o-pre-wrap; /* Opera 7 */
word-wrap: break-word; /* Internet Explorer 5.5+ */
}


4.5- Adicione dentro da tag "body" o código:

- <body>
+ <body onload='prettyPrint()'>


4.6- Salve o novo template. Agora sim você pode inserir código fonte de modo fácil, como descrito acima.

Referências

References:
1. Vivian's Tech Blog
2. How to publish source code in Blogger.com
3. Posting source code on Blogger
4. HTML TO ENCODE SELECTION

Finalmente em casa

Muito bom! O blog foi transportado para o domínio beco.cc
(Marco: 2011-03-26)