Aprendendo C - formatação do printf
TweetRecentemente comecei a aprender C. Sim eu não sei C, não tive na faculdade e sempre senti falta de saber melhor como as coisas funionavam por dentro do computador, já que minha maior experiencia em programação é com python, que é uma linguagem de altissimo nivel.
Com C voce trabalha mais perto da maquina, direto com bytes, alocação de memoria, tem que fazer as estruturas de dados.
E pra aprender eu escolhi estudar pelo livro Learn C The Hard Way do Zed Shaw. É um livro que te instiga a estudar os conceitos por voce mesmo, ensina em cima de exemplos bem praticos e eficientes, te adiciona ao ecossistema da linguagem, apresentando ferramentas e tecnicas que vao te ajudar a pensar em C.
Uma das coisas que ele me instigou a estudar foi todos os possiveis formatos e suas variações para o printf, a função que escreve na saida padrão (o print do python).
#include <stdio.h>
int main() {
printf("%s\n", "Hello World!");
return 0;
}
#output
Hello World!
formatando a saida do printf
O printf recebe 2 parametros: uma string com os formatos mapeados e um minimo de valores igual ao mapeado.
#include <stdio.h>
int main() {
printf("%d %s\n", 1, "Hello again!");
return 0;
}
#output
1 Hello again!
Esta função é capaz de imprimir diferentes tipos de dados (char, string, int, float, octal, hexa, outros aqui) de acordo com a formatação que voce usar.
#include <stdio.h>
int main() {
printf("Char: %c %c \n", 'b', 65); // char pode receber um int referente a Tabela ASCII (http://www.asciitable.com/).
printf("Decimais: %d %ld\n", 1988, 650000L);
printf("Precedido com espaços em branco: %10d\n", 1988);
printf("Precedido com zeros: %010d\n", 1988);
printf("Numeros com base diferente: %d %x %o %#x %#o \n", 100, 100, 100, 100, 100);
printf("Floats: %4.2f %+.0e %E \n", 3.14554, 3.3214, 3.1234);
printf("Truque de tamanho: %*d\n", 5, 10);
printf("String simples %s\n", "Oi!");
return 0;
}
#output
Char: b A
Decimais: 1988 650000
Precedido com espaços em branco: 1988
Precedido com zeros: 0000001988
Numeros com base diferente: 100 64 144 0x64 0144
Floats: 3.15 +3e+00 3.123400E+00
Truque de tamanho: 10
String simples Oi!
Tabela de Formatos
Os formatos seguem o seguinte prototipo: %[
flags][tamanho][.precisao][quantidade]formatoFlags, largura, .precisão, tamanho são opcionais.
Formatos:
| Formato | Saida | Exemplo |
|---|---|---|
| c | char | a |
| d ou i | signed int | 1 |
| e | Notação Cientifica usando o caracter e | 3.9265e+2 |
| E | Notação Cientifica usando o caracter E | 3.9265E+2 |
| f | float | 3.4 |
| g | usa o menor numero possivel de f e e | 3.54 |
| G | usa o menor numero possivel de f e E | 3.54 |
| o | unsigned octal | 610 |
| s | string | Hello World |
| u | unsigned int | 2345 |
| x | unsigned hexa | 7fa |
| X | unsigned hexa com letras maiusculas | 7FA |
| p | ponteiro de endereço | B800:0000 |
| n | Nada impresso. O argumento deve ser um ponteiro para um int assinado, onde o número de caracteres escritos até então é armazenado. | |
| % | % seguido de outro % irá printar % na saida | % |
Flags
| Flag | Descrição |
|---|---|
| - | Alinhado a esquerda dentro do tamanho definido. Alinhamento a direita é o padrão (veja a tabela de formatação de tamanho). |
| + | Força a o resultado ser mostrado com um simbolo de + ou -. Por padrão, somente numeros negativos são mostrados com -. |
| # | Usado com o, x e X indica que o valor será precedido de 0, 0x ou 0X respectivamente, para valores diferentes de 0. Usado com e, E e f, força o output para mostrar um ponto decimal mesmo sem numeros depois dele. Por padrão, se nenhum numero estiver depois do ponto decimal ele nao é mostrado. Usado com g e G o resultado é mostrado com zeros a direita. |
| 0 | Numero 0 é printado ao invés de espaços em branco quando o tamanho é especificado. (veja a tabela de formatação de tamanho). |
Modificadores de Tamanho
| Tamanho | Descrição |
|---|---|
| (Numero) | Número minimo de caracteres a serem printados. Se o valor a ser printado for menor que o numero, será adicionado espaços em branco para atigir o numero limite. O valor nao é trucado caso seja maior que o limite. |
| * | O tamanho nao é especificado na formatação da string, mas é passado como argumento precedendo o argumento a ser formatado |
Modificadores de Precisão
| .precisão | Descrição |
|---|---|
| .numero | Para formatos inteiros (i, d, u, o, x, X): precisão especifica o numero minimo de digitos a serem mostrados. Se a quantidade de digitos for menor que o limite, entao serão acrescentados zeros ao final. O valor nao é truncado se a quantidade de digitos for maior que o limite. Precisão 0 significa que o nenhum valor é printado se o numero for 0. Para formatos e, E, f: é o numero de digitos que serão mostrados depois do ponto decimal. Para formatos g e G: é o numero maximo de digitos significantes a serem mostrados. Para s: é o numero maximo de caracteres a serem mostrados. Por padrão, todos os caracteres serão mostrados até o caracter nulo que finaliza uma string (por exemplo \n) Para c: não tem efeito. Quando nenhuma precisão é especificada, o padrão é 1. Se o periodo é especificado sem um valor explicito para precisão, 0 é assumido. |
| .* | A precisão nao é especificada na formatação da string, mas é passado como argumento precedendo o argumento a ser formatado. |
Modificadores de Quantidade
| quantidade | Descrição |
|---|---|
| h | O argumento é interpretado como um short int ou unsigned short int (só se aplica aos formatadores de inteiro: i, d, o, u, x, X). |
| l | O argumento é interpretado como um long int ou unsigned long int (só se aplica aos formatadores de inteiro: i, d, o, u, x, X) e como um caractere de largura ou cadeia de caracteres de largura para formatadores c e s. |
| L | O argumento é interpretado como um long double (somente para formatadores de float: e, E, f, g e G). |
O printf é muito poderoso, e espero ter ajudado a conhece-lo melhor.
Obrigado, até a proxima!
[dica rapida] syntax hightlight no seu blog com javascript
Tweetse voce tem um blog sobre programação, provavelmente voce postará snippets de codigo e provavelmente voce vai querer que esse snippet tenha syntax highlight como no seu editor de codigo preferido.
mas como faz?
é bem facil, basta voce usar um modulo JS e CSS chamado google code prettify.
para cofigura-lo na pagina. basta voce colocar esses 2 links no seu html.
<link href="prettify.css" type="text/css" rel="stylesheet" />
<script type="text/javascript" src="prettify.js"></script>
e depois chamar uma função no load da pagina.
$(function() {prettyPrint();});
obs: para chama-lo assim voce deve carregar o jquery na pagina.
obs 2: mais informaçoes de configuração, veja o readme. do projeto.
e agora?
basta voce colocar seu codigo dentro de uma tag code ou pre com a classe prettyprint e pronto, seu codigo vai ficar bonito na pagina!
um exemplo:
<code class="prettyprint">print "Hello World!</code>
é isso, até mais!
Programming Highlight - 1
Tweetuma compilação dos melhores links que li na semana.
- Lightning talk sensacional feita pelo Gary Bernhardt no CodeMash 2012 falando sobre as bizarrices das linguagens ruby e javascript:
https://www.destroyallsoftware.com/talks/wat
- O twitter lançou a versao 2.0 do seu bootstrap. Aqui tem uma palestra explicando as principais mudanças.
http://speakerdeck.com/u/mdo/p/bootstrap-2
- O “Hacker Way” do Facebook, segundo o Mark Zuckerberg. Vale a leitura! Documento original
http://www.startuplessonslearned.com/2012/02/hacker-way.html
- Tem duvida do que é REST, RESTful e tudo isso? Leia essa thread do stackoverflow.
http://stackoverflow.com/questions/671118/what-exactly-is-restful-programming
- Teste quais features de css3 seu browser suporta.
Testes em Javascript - Jasmine
TweetTestes automatizados emergiram como uma das boas praticas da engenharia de software, e seus resultados sao comprovadamente eficazes.
Eu utilizo bastante essas tecnicas quando programo em python/django com ferramentas como o splinter, unittest entre outras. Porem quando programava em javacript, eu sempre senti falta desses testes automatizados.
E o Jasmine?
tl;dr - Jasmine is a behavior-driven development framework for testing your JavaScript code. It does not depend on any other JavaScript frameworks. It does not require a DOM. And it has a clean, obvious syntax so that you can easily write tests.
Em setembro do ano passado (2011), comecei a trabalhar no projeto de cobertura de eventos na globo.com. E tinhamos como desafio principal, atualizar uma pagina em tempo real via streaming com fotos, videos e textos. Pra isso os componentes da pagina teriam que interagir muito, recebendo e tratando os dados enviados do streaming. Usamos muito js com o framework mootools, e pra testar usamos o jasmine, o que nos proporcionou uma segurança e qualidade de codigo excelentes!
Agora chega de falar!
Show me the code
Pra começar, vc descreve um cenario que vai testar.
Como exemplo, vamos fazer um fizzbuzz
describe("Fizz Buzz", function(){
it("numero igual a tres deve retornar fizz", function(){
expect(fizzbuzz(3)).toEqual("fizz");
});
});
Depois de escrever o teste, a gente escreve um codigo pra passar:
var fizzbuzz = function(numero) {
return "fizz";
}
Agora mais um cenario:
it("numero igual a cinco, deve retornar buzz",function() {
expect(fizzbuzz(5)).toEqual("buzz");
});
mais um pouco de codigo:
var fizzbuzz = function(numero) {
if (numero === 3) {
return "fizz";
}
return "buzz";
};
Bom ai vcs podem continuar a brincar e terminar o codigo.
E pra rodar?
Bom vc pode carregar os scripts(download aqui) do jasmine numa pagina html estatica e por ultimo carregar o seu teste. Um exemplo:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Jasmine Test Runner</title>
<link rel="stylesheet" type="text/css" href="lib/jasmine-1.0.2/jasmine.css">
<script type="text/javascript" src="lib/jasmine-1.1.0/jasmine.js"></script>
<script type="text/javascript" src="lib/jasmine-1.1.0/jasmine-html.js"></script>
<!-- include source files here... -->
<script type="text/javascript" src="aquivo/que/voce/quer/testar.js"></script>
<!-- include spec files here... -->
<script type="text/javascript" src="arquivo/de/teste.js"></script>
</head>
<body>
<script type="text/javascript">
jasmine.getEnv().addReporter(new jasmine.TrivialReporter());
jasmine.getEnv().execute();
</script>
</body>
</html>
Se vc tem um projeto em ruby com rails, vc pode usar uma gem pra rodar os testes.
Se vc tem um projeto em python, pode usar o jasmine-test-runner, feito pelo cobrateam.
Se vc tem um projeto em outra linguagem, veja aqui como rodar o jasmine.
Entao é isso!
Até a proxima, []’s
Palestra ministrada no FISL 12 em 2011 sobre TDD, Refactoring e boas praticas de programação!
Feedbacks sao bem vindos!
Até mais!