Saber Programar

Este artigo pode ter ficado meio confuso… Acho que acabei me perdendo no meio… :S Deixe um comentário se quiser discutir. ;)


Lógica da Programação

Estava me perguntando hoje:
“O que é a lógica da programação?”
E não consegui obter nenhuma resposta
com exatidão.
Afinal, o que é esse negócio
que “todo programador tem que saber”
e que até cursos existem
para o profissional aprender?

Desculpem… Não pude resistir… Hehehe :D Escrevi algo parecido e coube direitinho, aí dei uma modificada pra ficar em forma de “poesia”. Mas vamos ao artigo…

Talvez minhas idéias sejam diferentes das de quem já fez curso e aprendeu formalmente esse conceito, mas hoje estava pensando e cheguei a conclusão de que a lógica da programação é a lógica da vida, nua e crua. É simplesmente a lógica matemática/filosófica que já conhecemos há tempo e que aprendemos com experiências na vida. Então pra que estudá-la como sendo algo novo?

Um exemplo de lógica da programação, no meu ponto de vista, poderia ser o seguinte:

Eu não gosto de quem mexe nas minhas coisas. E O meu irmão mexeu nas minhas coisas. Disso, deduzimos que eu não gosto do meu irmão. Não importa se é verdadeiro, é lógico. É assim que o computador pensa, não é mesmo? A lógica portanto, para mim, é uma relação entre duas ou mais coisas.

Lógica Matemática

Aí lembrei-me que da lógica matemática, algo que não aprendi formalmente, mas, bom… O Professor Vavá me mencionou no meio desse ano, num dos nossos encontros matemáticos. Ele, decepcionado, mencionou que estava ensinando “lógica” para uma turma de sexta série e passou uma prova com a seguinte questão: As duas afirmações a seguir são corretas: ‘Todo professor de matemática é bonito.’ e ‘O Fabiano é professor de matemática.’ Sabendo disso, o que podemos deduzir? E aí tinham opções como: O Fabiano é feio., O Fabiano é bonito, entre várias outras coisas. Bom… Como é possível alguém errar uma questão dessas?* E, é claro, um monte de gente errou!

Condições Compostas

Cheguei a conclusão de que isto é a lógica da programação. Que é a mesma coisa que a lógica matemática. Aí… Putz… Lembrei-me da semana passada, quando o Leandro Matos (nada contra ele, até tá certo postar artigos assim porque tem gente que consegue ter dificuldade numa coisa dessas!) postou em seu blog um artigo sobre condições compostas – conjunções. Eu, olhando um título como esses, pensei: “Puxa, que esplêndido! Do que será este artigo se trata?” e, antes até de tentar interpretar o título, inocentemente abri uma página para “aprender” sobre o uso do e em condicionais na programação. Realmente decepcionante…

Quer dizer… Poxa! Como é que é possível alguém não entender uma frase como:

n>4 e n<6

… só vai ser verdadeira se 4>n E n<6? Pô, não consigo entender. Já não tá tudo escrito? Não tem nem o que interpretar: basta ler! Então, cheguei a conclusão de que o errado é o que muitas pessoas aprendem como programação. Muitas pessoas não sabem programar. Desculpa se você é um dos caras que tem dificuldade com uma coisa como “condições compostas” (nome bonito, hein?), mas sinceramente, você não vai conseguir programar nada dessa maneira. Você não consegue transpôr um conceito básico da sua vida e das suas experiências pessoais para a programação. Cheguei a conclusão de que as pessoas não entendem o que significa o “verdadeiro” e o “falso” de um condicional, não entendem um ! (“não” no C e linguagens “derivadas”), não entendem que basta você “ler”/“interpretar” a programação. Pô… Olha só a tabela que o Leandro postou no site dele! Hehehe…

É por isso que a gente chama C, PHP e outras siglas de “linguagens”, porque elas não passam de uma maneira diferente de comunicar uma coisa, geralmente muito parecida com o nosso inglês… Aliás, muito parecida com tudo que a gente vê. Quem não entende é porque não tá acostumado com o que a gente vê todos os dias ou faz tanto parte da rotina que nem nota e nem aprende.

Nerds

Então, afinal, quem é um nerd? O programador? Ora… O programador é um ser pensante, ele conhece A Lógica, porque ele tem experiências de vida. Quem não programa direito (não conhece “A Lógica”) é que é nerd, que não tem muitas experiências na vida e não consegue absorver uma mensagem e utilizá-la em outro local. E aí eu fui pensar bem e tentei lembrar-me do que eu considero “nerd”. Sempre me vem imagens de um cara que passa a noite num quarto escuro estourando sua placa aceleradora num jogo viciante e com um fone de ouvido. Nunca me vem a mente um laboratório arrumado, claro, com um programador escrevendo linhas de código.

O exemplo do “Tio Marcos”

E aí, pra completar esse laço gigantesco, lembrei-me do meu tio Marcos. É um cara bem power, o presidente do Conselho Nacional de Psicologia. A gente sempre comenta que o cara sabe “de tudo”. Tipo assim, eu comento sobre software livre, ele responde citando o Linux e com Mozilla. Se um marinheiro vai falar com ele sobre nós de marinheiro, ele sabe um monte sobre isso também! Meu irmão fala com ele sobre música erudita e ele sabe identificar os momentos históricos e qualidades de vários compositores. E a gente sempre chega a conclusão de que ele sabe tudo isso porque ele cria relações entre as coisas, relações adquiridas através de experiências pessoais. Ele já morou na Europa duas vezes (na França e na Espanha), fala essas duas línguas (francês e espanhol), além do português do inglês e vive viajando pelo mundo. Fala com gente de todos os estilos, freqüenta uns locais bem alternativos e dessa maneira é um cara que realmente sabe de “lógica”. Ele tem uma facilidade imensa para relacionar dois conteúdos e tenho certeza que ele não teria dificuldade nenhuma para programar.

Conclusão

E cheguei a conclusão portanto de que lógica é a capacidade que a pessoa tem de relacionar dois eventos. E a lógica é um dos valores mais importantes do homem. Não serve só para a programação, mas para a matemática, para a filosofia e para qualquer coisa que você vá fazer. A lógica não passa do seu raciocínio e do seu pensamento. Aliás, acho que a “inteligência” é uma função que recebe a “lógica” como argumento… ;) Para adquirir lógica, não adianta você ler um monte de coisa; saia do computador e vá conhecer pessoas e adquirir experiências! :D

Concorda? Não concorda? Comente!

* Importante observar que o Professor Vavá nunca elogiaria o seu “Professor Rival”… Na verdade, ele colocou um aviso bem grande na questão: “Deduções lógicas podem às vezes estar erradas, como acontece, por exemplo, nesse caso.” :)

O que é um algoritmo?

Um algoritmo é um procedimento computacional definido que recebe um ou mais valores (entrada) e produz um ou mais valores (saída). O algoritmo é aquela fórmula matemática, aquele pedaço de código, que fica ali no meio da entrada e da saída para transformar o primeiro no segundo.

Vamos supôr por exemplo que temos a função:

f(x)=x23f(x) = \frac{x^{2}}{3}

A sua entrada é o x e a sua saída é o y (ou f(x), o valor que a função retorna).

O algoritmo aqui seria o seginte:

  1. Entrada: Receber o valor X.
  2. Elevar X ao quadrado e guardar o número resultante como Z.
  3. Dividir Z por 3 e guardar o número resultante como Y.
  4. Saída: Imprimir o valor Y.

O algoritmo, portanto, é a lógica do nosso problema matemático, ou, informático. É a seqüência de passos que eu faço na minha cabeça (ou, quando é complexo, no papel) antes de escrever, em C, a função f:

int f(int x) {
   int z, y;
   z = pow(x, 2);
   y = z/3;
   return y;
}

Se formos pensar, veremos que tudo o que fazemos é um algoritmo, é um procedimento que recebe uma entrada e envia uma saída. Não só no computador, mas na vida. Quando eu falo com alguém, eu espero sua entrada (o que a pessoa fala pra mim), então penso e transformo essa entrada numa saída (a resposta que vou dar pra pessoa). E assim é com várias outras coisas. Podemos dizer também que acordar é um algoritmo, por exemplo:

  1. Entrada: Meu cérebro disse que eu estou acordado!
  2. Percebi que acordei, mas estou com sono. Espero um pouco.
  3. Saída: Abrir os olhos.
  4. Saída: Se espreguiçar.
  5. Saída: Tirar a coberta.
  6. Saída: Sentar na cama.
  7. Saída: Sair da cama.

Podem existir vários algoritmos diferentes para resolver o mesmo problema. No caso de Acordar, cada um acorda de forma diferente, por exemplo. Foi até um exemplo meio estranho esse aí, mas outro algoritmo poderia dar outra saída, como por exemplo simplesmente abrir os olhos e cair da cama. Ou no caso acima da função matemática, poderíamos ter um algoritmo que fizesse a mesma coisa de maneira diferente também.

O algoritmo que usamos depende principalmente do tempo que ele demora pra ser executado e a memória que ele gasta no computador. Chamamos isso de custo. Quando começarmos a ver os algoritmos de ordenação de vetores (arrays), veremos que cada algoritmo faz uma coisa diferente, mas todos servem para o mesmo propósito: ordenar o vetor. Para uma entrada pequena, um pode ser mais rápido… Para uma maior, outro. Portanto, o algoritmo que queremos usar (o tempo que ele vai demorar pra ser executado e a memória que ele vai gastar no computador) depende principalmente do tamanho da entrada (que chamamos de n e no exemplo da função seria lá em cima seria a variável x).

Na maioria dos casos (e vai ser sempre assim aqui nos meus artigos), a entrada será o teclado (por exemplo, o usuário digita o X para a função) e a saída será a tela (por exemplo, o programa imprime o resultado da função, o Y, para a tela). Essas são a entrada e saída padrão (standard input output do C), que é usada nas olimpíadas e na maioria dos problemas que resolvemos no computador.

Em resumo, portanto, um algoritmo é a lógica de um programa computacional. Nos próximos artigos, isso deverá ser mais esclarecido e começaremos a ver algoritmos “de verdade” ;)

Qualquer dúvida, sugestão ou notificação de erro; poste um comentário ou me envie um e-mail (não só nesse, mas também nos próximos artigos). Espero que gostem.

Programação Orientada a Objetos

Estou finalmente começando a aprender orientação a objetos. É claro que o conceito eu já conhecia e até como usar “cin” e “cout” no C++, mas agora resolvi estudar a fundo a Programação Orientada a Objetos, porque vejo que ela está cada vez mais comum entre os programadores. Estou aproveitando pra aprender C++, o que pode ser bastante útil em olimpíadas, para ter strings com o tipo string, poder declarar variáveis no meio, além de programar orientado a objetos.

Hmmm… Eu estava lendo uns tutoriais de introdução a POO e agora vou tentar fazer algumas coisas em C++ e em PHP também (porque é uma linguagem que eu domino mais, fica mais fácil entender POO). Se alguém quiser estudar comigo, entre em contato (e a mesma coisa se alguém tiver uma apostila legal e está afim de ajudar).

XUL

Durante as aulas, estou estudando XUL. É uma linguagem de interface gráfica, tipo um HTML, mas que tem umas coisas bem interessantes. O único problema é que só roda em Mozilla… E também estou aumentando bastante meu conhecimento de JavaScript utilizando XUL e iniciando uma fase nova de tableless com DOM. :)

Meetweb, tableless

Semana passada eu peguei dois serviços da Meetweb. São serviços de converter um site para tableless e programá-lo em PHP usando banco de dados MySql (ou seja, minha especialidade). Por isso também, estou entrando nessa nova fase de tableless que citei no parágrafo acima.

Desvendando os segredos do C

É incrível que quando eu estudei C no início eu passei por alguns conceitos que na época eu achava complicados. Além dos operadores binários que o Paulo Matias me ensinou semana passada, ontem é que eu finalmente aprendi as funções de alocação dinâmica do C… E é tão simples! :D

Olimpíada Regional de Matemática

Ontem fiz a prova da segunda fase (final) da Olimpíada Regional (catarinense) de Matemática. Dos cinco problemas, resolvi quatro e acho que acertei três e meio. Um deles eu pensei certo, mas dei a resposta errada… Mas já que a prova era discursiva, acredito que eles dêem no mínimo metade dos 20 pontos do problema. Não sei se dá pra ganhar medalha, porque a prova tava bem fácil então mais gente deve ter ido bem.

Problemas Lógicos

Estou meio parado quanto a solução de problemas lógicos, mas estou estudando bastante para resolvê-los de forma melhor. Por enquanto, nenhum código novo. Tenho uma lista de problemas da UVa para resolver e ainda falta o último problema do capítulo 1 do USACO Training Gateway (Checkers Challenge).

Desafios Lógicos e Sites

No Orkut, adicionei alguns caras que manjam de algoritmos, lógica, informática, Linux, ER, etc., como por exemplo Aurélio Marinho Jargas, Piter Punk (Roberto Freires Batista), Fábio Dias Moreira e Helder Suzuki. E com isso, pra minha felicidade total, recebi dois desafios lógicos! (destes últimos dois) :D

Permutação

O primeiro é sobre permutação. O Helder leu meu post sobre permutações e sugeriu a criação de um programa que, sem fazer as operações anteriores, determinasse o n-ésimo elemento de uma permutação. Ainda não fiz porque tô atolado de coisas pra fazer, mas pensei que posso descobrir cada letra a partir do seguinte…

Vou supôr que tenho uma cadeia ABC, tamanho=3, letras=3

As permutações seriam feitas na seguinte ordem:

  1. a a a
  2. a a b
  3. a a c
  4. a b a
  5. a b b
  6. a b c
  7. a c a
  8. a c b
  9. a c c
  10. b a a
  11. b a b
  12. b a c
  13. b b a
  14. b b b
  15. b b c
  16. b c a
  17. b c b
  18. b c c
  19. c a a
  20. c a b
  21. c a c
  22. c b a
  23. c b b
  24. c b c
  25. c c a
  26. c c b
  27. c c c

A primeira letra se alterna a cada 9 (3^2) vezes. A segunda a cada 3 (3^1). A terceira 1 (3^0). Portanto, eu acho que consigo descobrir cada uma das letras! Vamos supor que quero o décimo primeiro elemento.

11o. elemento

Está entre 10 e 18 – portanto a primeira letra é B

Está entre 10 e 12 – portanto a segunda letra é A

É 11 – A B C, A B C, A B C, A B!

BAB!

Sabendo disso fica fácil… Demorei pra pensar nisso, mas agora vou escrever o algoritmo, implementar e vencer o desafio! :)

Bom, e além do desafio, o Helder me falou uma coisa que eu achei muito legal! O vestibular do ITA só tem português, inglês, matemática, física e química. Ou seja, as matérias que mais precisaria estudar (biologia principalmente e história e geografia) não existem! emoticon Ultimamente, estive pensando em que universidade vou entrar. Estou na dúvida entre ITA e Unicamp, mas acho que prestarei vestibular para as duas.

MMC/MDC

O segundo desafio foi do Fábio Dias Moreira. Na verdade, não foi bem um desafio, foi uma idéia sobre o post do MMC.

E-mail dele

Eu li o seu post sobre cálculo de MMCs, e acho que você deveria tentar explorar as identidades a seguir:

  • mmc(x, y) * mdc(x, y) = x * y
  • mmc(mmc(x, y), z) = mmc(x, y, z)

Como calcular mdc é uma tarefa simples (já que mdc(x, y) = mdc(x, y % x)), que leva tempo O(log x), a conta mdc(x_1, x_2, …, x_n) deve levar tempo O(n log x).

Ainda não implementei tudo completamente, mas fiz alguns testes, que publiquei na seção de scripts.

Calcula o Máximo Divisor Comum (MDC) de vários termos

//MDC (Máximo Divisor Comum)
#include <stdio.h>
#include <values.h>

#define NMAX 101

int mdc(int *n, int tam) {
	int i, menor, desista, j;

	menor=MAXINT;
	for (i=0; i<tam; i++) {
		if (n[i]<menor) {
			menor=n[i];
		}
	}

	for (i=menor; i>=1; i--) {
		desista=0;
		for (j=0; j<tam; j++) {
			if (n[j]%i) {
				desista=1;
				j=tam;
			}
		}
		if (!desista) {
			return i;
		}
	}

}

int main() {
	int n[NMAX], tam, i;

	printf("Digite o número de termos: ");
	scanf("%d", &tam);
	for (i=0; i<tam; i++) {
		printf("%do. número: ", i+1);
		scanf("%d", &n[i]);
	}

	printf("MDC = %d\n", mdc(n,tam));
}

Calcula o Máximo Divisor Comum (MDC) entre 2 termos

//MDC (Máximo Divisor Comum) entre dois números
#include <stdio.h>

int mdc(int x, int y) {
	int i, menor;

	if (x<y) {
		menor=x;
	} else {
		menor=y;
	}

	for (i=menor; i>=1; i--) {
		if (!(x%i)&&!(y%i)) {
			return i;
		}
	}

	return 0;
}

int main() {
	int x, y;

	printf("Digite o primeiro número: ");
	scanf("%d", &x);
	printf("Digite o segundo número: ");
	scanf("%d", &y);

	printf("MDC ( %d , %d ) = %d\n", x, y, mdc(x,y));
}

Calcula o Mínimo Múltiplo Comum (MMC) entre 2 termos

//MMC - Mínimo Múltiplo Comum, para dois números

int mdc(int x, int y) {
	int i, menor;

	if (x<y) {
		menor=x;
	} else {
		menor=y;
	}

	for (i=menor; i>=1; i--) {
		if (!(x%i)&&!(y%i)) {
			return i;
		}
	}

	return 0;
}

int mmc(int x, int y) {
	return x*y/mdc(x,y);
}

int main() {
	int x, y;

	printf("Primeiro número: ");
	scanf("%d", &x);
	printf("Segundo número: ");
	scanf("%d", &y);

	printf("MMC (%d, %d): %d\n", x, y, mmc(x,y));
}

Tô chegando lá… Só falta fazer uma função que calcule o MMC dividindo em várias partes e fazendo vários MDCs. :p

Frações Egípcias

Bom, pra fazer eu pensar mais ainda, uma garota de 19 anos chamada Tatiane, que também leu o script do MMC, me enviou alguns e-mails sobre um algoritmo pra transformar frações próprias em frações egípcias. Só que o problema é que não pode usar funções, vetores, quase nada! Só pode usar os tipos char e int, e tem bastante regras que não deixam a pessoa sonhar muito. No fim, não consegui fazer, mas ela fez e parece que funcionou tudo certo. Em outro post, falarei mais sobre isso (depois que entender o algoritmo dela).

Meetweb

Hmmm… Uma empresa de construção de sites chamada MeetWeb me contratou pra programar para um site com um design já construído no Dreamwaver. Estou programando (PHP + Banco de dados MySql) e pretendo acabar em menos de 20 dias. Achei uma boa oferta, mesmo com uma pequena falta de tempo e o site exigir bastante coisinha de JavaScript (que eu não gosto muito - mas tô aproveitando pra aprender mais) e muita coisa repetida (o site é 100% administrável). É sempre bom pegar sites pra fazer, sempre acabo aprendendo mais alguma coisinha e um dinheirinho a mais sempre é bom também!

Site novo do Colégio

Esta semana comecei a fazer um site novo para o Colégio (o Salesiano, onde que eu estudo e trabalho), totalmente administrável também, com código válido e tableless, Flash… Uma coisa bem linda, leve e simples de administrar.

SOSPHP

Pra finalizar, o “meu” fórum, a SOSPHP tá com um movimento um pouco baixo e por isso tô fazendo um movimento para reanimá-lo. Então participem também! Entrem em www.sosphp.com.br e ajudem o fórum a crescer! Estou mandando mensagens para moderadores que estão sem visitar ultimamente, chamando mais gente e pedindo opiniões dos membros para melhorar o fórum (e é claro, pondo as opiniões em prática).

O Jogo do Sete

Meu professor de matemática Vavá (não é o Fabiano, que me dá aula de manhã e também é muito bom mas explica as coisas muito devagar para toda a sala entender; mas o que eu me refiro é o que me ajuda a aprender coisas lógicas e quem geralmente me ensina coisas mais interessantes como números binários e números complexos no treinamento para olimpíadas de matemática – e, consequentemente, de informática) me passou dois desafios lógicos pelo MSN. Um deles é um problema muito interessante que, depois de entender a lógica (o algoritmo), resolvi implementar num programa em C (as cores só funcionam em bash :) E, pelo amor de Deus, espero que alguém que programe e se interesse por isso use Linux!).

//Jogo do 7

#include <stdio.h>

int main() {
	int total, total2, recebido, enviado, i;

	total=0;
	i=1;
	printf("\n*** info: Jogo do Sete\n");
	printf("*** info: Desafio sugerido por Vavá.\n");
	printf("*** info: Algoritmo criado/implementado por Tiago Madeira.\n\n");
	printf("*** info: REGRAS DO JOGO\n");
	printf("1. Na primeira jogada, o primeiro jogador escolhe um número no conjunto A={1,2,3,4,5,6,7} e diz.\n");
	printf("2. As pessoas jogam alternadamente.\n");
	printf("3. Cada pessoa ao jogar, escolhe um elemento de A, soma-o ao número dito pela pessoa anterior e diz.\n");
	printf("4. Ganha quem disser o número 63.\n\n");
	printf("Tiago fala: Você pode começar, mas se fizer besteira pode ter certeza de que eu ganharei! =)\n");
	printf("\n*** info: Início de jogo.\n");
	while (total<63) {
		printf("Você fala: ");
		scanf("%d", &total2);
		recebido=total2-total;
		if (recebido>7||recebido<1) {
			printf("Tiago fala: Seu ladrão! Não quero mais jogar com você! =(\n");
			break;
		}
		total=total2;
		if (total==63) {
			printf("*** info: Fim de jogo.\n*** info: Você ganhou.\n");
			printf("\nTiago fala: Muito bem. Apelou pois contra meu algoritmo é necessário, mas\nTiago fala: pelo menos parece ter entendido a lógica do jogo.\n");
			break;
		} else {
			enviado=(total+1)%8;
			if (enviado!=0) {
				total+=8-enviado;
			} else {
				if (i>7) {
					i=1;
				}
				total+=i;
				i+=2;
			}
			printf("Tiago fala: %d\n", total);
			if (total==63) {
				printf("*** info: Fim de jogo.\n*** info: Você perdeu.\n");
				printf("\nTiago fala: Eu já sabia... =D\n");
			}
		}
	}
	printf("\n");
}

Hmmm… O robô que joga contra a pessoa (Tiago) é como eu jogaria contra alguém que tivesse que ganhar. Se o cara vacilar, o Tiago ganha; mas se o cara entender a lógica (na verdade, dá pra não entender a lógica e ir somente indo de 8 em 8, mas vale a pena perder um tempinho entendendo a lógica) ele ganha facilmente pois é ele que começa. Assim como existe esse “Jogo do Sete”, estive pensando que pode dar certo com todos os números (alterando algumas coisas, é claro). Não vou explicar tudo aqui, mas não é muito difícil de entender; aliás, é bem simples. No começo tem as regras.

Google

Tenho olhado as estatísticas do site e tem cada vez mais pessoas entrando no Google (graças a Deus ele indexou minhas páginas internas – mas ainda não meus scripts lógicos), mas geralmente de assuntos que meu site não trata! Tipo, tem umas coisas que até tudo bem, como “problemas lógicos” (meu site é o primeiro da lista ao procurar por essas palavras – E, aliás, se você tá aqui por causa disso, sugiro a lista maratona do YahooGrupos!), mas algumas que aparecem porque possuem as palavras soltas no texto, como:

  • símbolo anéis de formatura – Aparece meu site porque tem um post que tem “Senhor dos Anéis”, “Formatura” (da minha oitava série) e “Símbolos Matemáticos”
  • winrar código livre – Hmmm… Código livre eu já citei várias vezes e Winrar eu falei para quem quiser descompactar o zip do Shortstat.
  • biografia de kevin mitnick – Porque na minha biografia eu cito Kevin Mitnick

Início das Aulas

Hoje as aulas começaram. Minha banda tocou e foi legal (aula sem ter aula é legal! :D). Vou colocar umas fotos no Flickr…

© 2005–2020 Tiago Madeira