Tarsis Azevedo

  • Aleatório
  • Arquivo
  • RSS
  • Ask me anything

Aprendendo C - formatação do printf

Tweet

Recentemente 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]formato

Flags, 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!

    • #C
    • #programming
    • #formatacao printf
    • #aprendendo c
    • #tutorial
  • há 2 meses
  • Comments
  • Link permanente
  • Share
    Tweet

[dica rapida] syntax hightlight no seu blog com javascript

Tweet

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

    • #syntax highlight
    • #programming
    • #developer
    • #blog
    • #trick
  • há 2 meses
  • Comments
  • Link permanente
  • Share
    Tweet

Programming Highlight - 1

Tweet

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

http://css3test.com/

    • #programming
    • #html
    • #css
    • #twitter-bootstrap
    • #facebook
    • #restful
    • #highlights
  • há 3 meses
  • 13
  • Comments
  • Link permanente
  • Share
    Tweet

Testes em Javascript - Jasmine

Tweet

Testes 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

    • #jasmine
    • #programming
    • #javascript
    • #tdd
    • #bdd
  • há 3 meses
  • 13
  • Comments
  • Link permanente
  • Share
    Tweet

Palestra ministrada no FISL 12 em 2011 sobre TDD, Refactoring e boas praticas de programação!

Feedbacks sao bem vindos!

Até mais!

    • #tdd
    • #programming
    • #python
    • #fisl
    • #refactoring
  • há 3 meses
  • 11
  • Comments
  • Link permanente
  • Share
    Tweet

Sobre

Avatar Um blog sobre desenvolvimento e tudo mais.

Online

  • @tarsisazevedo on Twitter
  • Facebook Profile
  • Linkedin Profile
  • tarsis on github
  • RSS
  • Aleatório
  • Arquivo
  • Ask me anything
  • Celular

Effector Theme by Carlo Franco.

Desenvolvido por Tumblr