sobre a Lísias

nosso e-mail

venda de produtos/serviços


Livro de Linguagem C

forma de venda

Preço nas livrarias:
R$ 35,00 ou compra pela internet direto da Lísias: R$ 29,00 (cobrança via boleto bancário. Você recebe o livro e o boleto pelo correio e depois paga em qualquer banco). Você também pode utilizar seu cartão de crédito.



ISBN: 85-87147-02-1

Formato: 15x21 cm

Páginas: 218

Colorido: sim

Todos os programas fontes dos exemplos e mais os fontes dos exercícios resolvidos, você os receberá gratuitamente pela internet, basta informar o número de série do seu livro

 

Veja o que Bill Gates disse na Folha de S. Paulo de 26/04/95, sobre programação: "Para a maioria das pessoas faz sentido aprender uma linguagem fácil como o Visual Basic. Mas se você quiser escrever programas profissionais, terá que aprender a linguagem de computação C".

Detalhe: sem saber programar em C, não tem como programar em C++.

Todos os exemplos do livro tem pouco código
Quando você procura aplicar na prática um determinado tópico em estudo, utilizando a linguagem C, você não deseja ficar analisando dezenas de linhas, para depois se perder em meio a esta análise. Você deseja um exemplo curto para poder entender como aquele tópico é aplicado. Observe a seguir que o livro da Lísias Editora não faz você perder tempo desnecessariamente.

Perceba os detalhes que não estão no código
Muitas informações de programação são passadas ao compilador de forma implícita, por exemplo, a posição ordinal ocupada por cada um dos argumentos é quem determina a formatação a ser executada. Veja no exemplo do link a seguir que o livro mostra este detalhe de forma clara utilizando-se da cor: o primeiro argumento (em vermelho) será formatado para a primeira base (também em vermelho) e assim sucessivamente.

Clique aqui para ver um exemplo de como são explicados os detalhes não escritos no código

No próximo exemplo você irá visualizar o contexto em que um tópico do livro está sendo utilizado na prática (no caso, operadores aritméticos unários: incremento/decremento) e além disso tem as explicações dos detalhes que não são descritos explicitamente pelo código programado.

Visualize graficamente a memória
Visualizando o que acontece na memória em termos de variáveis e ponteiros você terá mais facilidade em aprender a linguagem.

Saiba porque conhecer a memória é tão importante na linguagem C
Um dos pontos que tem dificultado o aprendizado na linguagem é o não esclarecimento da diferença entre endereço físico e endereço lógico e como estes detalhes afetam a programação. Entendendo estas diferenças você passará a perceber melhor como funciona a memória e então irá desenvolver o programa sabendo exatamente o que faz cada instrução quando esta estiver executando, por exemplo, tratamento de ponteiros. Na figura do tópico anterior já é possível começar a diferenciar endereço físico de endereço lógico.

Saiba porque strings não podem ser atribuídas à variáveis
Para aqueles que já programam em outras linguagens, é uma idéia intuitiva a de atribuir uma string a uma variável esperando que esta string seja recepcionada na área de memória disponibilizada à variavel. Porém, na linguagem C isto não ocorre pois não existe o tipo string definido no compilador. Este tipo de detalhe tem criado muita confusão e a maioria dos livros comuns não o explica com clareza. O Exemplo colocado no link a seguir demonstra que uma string é um conjunto de caracteres atribuídos a uma matriz do tipo caracter.

Saiba como programar com ponteiros
Com este livro você efetivamente aprende a trabalhar com ponteiros. Ponto nevrálgico da linguagem. Isto porque será ensinado como ler além da sintaxe de programação e também porque você irá visualizar os ponteiros acontecendo na memória. No final do livro você dirá: "ponteiros é moleza"

Entenda o porquê da alocação dinâmica de memória
Você irá perceber a importância da alocação dinâmica na construção de aplicativos competitivos e que não fazem somente o feijão-com-arroz pré-programado de outros compiladores/interpretadores.

Saiba porque estruturas são tão importantes
Você aprenderá que criar estruturas significa criar um novo tipo de dado e quais são as fantásticas implicações que advém deste fato.

Não sabendo programar em C, não há como programar em C++
A partir da década de noventa a linguagem C evoluiu e passou a incorporar a Orientação a Objetos. Preste atenção nestes dois detalhes: evoluiu e incorporou. Isto significa que todos os conceitos da linguagem C são válidos em C++ e que esta é basicamente um acréscimo em termos de Orientação a Objetos a linguagem C. Houve aperfeicoamentos sim, mas nada que permita a você dispensar o entendimento de C. De uma forma ou de outra você terá que aprender a linguagem C para aprender C++. E por que aprender C++? Existem muitos motivos para tal, porém, o motivo que irá convencê-lo é que a partir do início desta década somente foram construídos compiladores C++ e somente estes estão a venda.O que não impede que você compile programas C nestes compiladores C++

Por que aprender a criar programas na Linguagem C parece ser difícil?
Primeiro detalhe importante: para poder começar a programar em C, você deve ter aprendido como criar algoritmos. Se você ainda não aprendeu, veja o livro de Algoritmos da Lísias Editora.

O código de C, não é um código para ser lido e acompanhado logicamente linha a linha. Não que a lógica não seja linear. Nisto, C é indêntica a qualquer outra linguagem. Porém, o que a diferencia das demais é que muitos detalhes não estão escritos explicitamente. Quando Kernighan e Ritchie (Cientistas dos Laboratórios Bell e criadores da linguagem), 'pensaram o compilador', eles sabiam que o mesmo seria utilizada por programadores profissionais (os construtores do sistema operacional Unix). Estes programadores entendiam perfeitamente como funciona a memória, entre muitos outros detalhes. Portanto, eles criaram uma linguagem sem muitos comandos, que contivesse somente o essencial. E isto para que o compilador economizasse todo byte possível e a execução do seu código fosse extremamente veloz. Observe o seguinte: eles 'pensaram' um compilador para ser utilizado por "Profissionais de Desenvolvimento de Software". Portanto é necessário que você conheça pontos básicos de computação. O livro "Linguagem C" mostra muitos dos fundamentos com uma clareza que você jamais tinha visto.

Por que este livro é bom?
Porque a complexidade da linguagem é levada a você gradualmente. Ou seja, você começará pelos pontos básicos e que são faceis de entender e de implementar em pequenos programas. Não haverá nenhum tópico que fará uso de conceitos fundamentais quando estes ainda não tenham sido aprendidos. Você aprenderá conceitos isolados, porém na prática, aprenderá a aplicá-los em conjunto.

Além da qualidade gráfica da obra, você encontrara outras virtudes, quase todas únicas:
  • todos os tópicos tem exemplificação prática;


  • todos os exemplos primam pelo fator didático: são simples, claros e objetivos. Eles não querem provar quão engenhoso é o autor e sim ensinar;


  • você não terá que analisar dezenas e dezenas de linhas de código para entender um determinado tópico (ou assunto em estudo). Nenhum programa exemplo ultrapassa uma página. Nenhum programa tem mais de 42 linhas. Em média cada programa possui em torno de 18 linhas;


  • Todos os programas possuem destaques em vermelho que apontam diretamente, dentro destes, como um determinado assunto em estudo é aplicado na prática. Estes destaques demonstram como um tópico teórico se aplica em um contexto objetivo de programação.


Sumário do livro de Linguagem C

1. Tipos de dados

1.1 Tipos básicos

1.1.1 char

1.1.2 Int

1.1.3 float

1.1.4 double

1.1.5 void

1.2 Modificadores dos dados básicos

1.2.1 signed

1.2.2 unsigned

1.2.2.1 Como unsigned transforma um número para positivo

1.2.2.1.1 unsigned com números positivos

1.2.2.2 unsigned com números negativos

1.2.3 long

1.2.4 short

1.3 Combinação de dados básicos com modificadores

1.4 Abreviando a declaração de tipos de dados com typedef

1.5 Estourando a escala de valores de um tipo de dado

1.6 Variáveis

1.6.1 Nomenclatura Húngara

1.6.1.1 Variáveis começam com prefixo(s) minúsculo(s)

1.6.1.1.1 Descrição de prefixos de variáveis

1.6.1.1.1.1 Prefixo composto

1.6.1.2 Nome da variável propriamente dito

1.6.2 Declarando variáveis

1.6.3 Atribuição de valores à variáveis

1.6.4 Definindo uma variável como de conteúdo inalterável

1.6.5 Explicitando que a variável tem conteúdo modificável

1.7 Conversão de tipos (cast)

1.8 Constantes

1.9 Comentários

2. Definição de Função

2.1 Componentes de uma função

2.1.1 Tipo de dado a ser retornado pela função

2.1.2 Nome de função

2.1.3 Dados que serão recebidos pela função

2.1.4 Determinando o início e o final da função

2.2 Função main()

2.2.1 Estilos de escrita de main()

2.2.2 Função main() retornando void

2.3 Finalização de instrução

2.4 Delimitando blocos de instruções

3. Saída de dados

3.1 Função de saída formatada: printf()

3.1.1 Sintaxe

3.1.1.1 Expressão de Controle

3.1.1.1.1 Tabela de manipuladores de controle

3.1.1.1.2 Tabela de especificação de formatação de tipo

3.1.1.2 Lista de Argumentos

3.1.2 Demonstrando a saída de dados na prática

3.1.2.1 Saída de valores literais e de variáveis

3.1.2.2 Quantidade de caracteres, casas decimais e alinhamento

3.1.2.3 Definindo a quantidade de casas a exibir e o alinhamento

3.1.2.4 Exibir os valores ASCII de um caracter

3.1.2.5 Exibindo o endereço de uma variável

3.2 Saída de dados com a função putchar()

4. Entrada de dados

4.1 Função de entrada formatada: scanf()

4.1.1 Sintaxe

4.1.2 Entrada de dados (leitura) de um caracter

4.1.2.1 Lendo um caracter sem exibí-lo na saída default: getch()

4.1.2.2 Lendo um caracter e exibindo-o na saída default: getche()

4.1.2.3 Lendo um caracter e efetivando a entrada com [Enter]: getchar()

5. Operadores

5.1 Operadores aritméticos (binários)

5.2 Operadores aritméticos unários: incremento/decremento

5.3 Operadores aritméticos binários de atribuição composta

5.4 Operadores relacionais

5.5 Prioridade de avaliação dos operadores aritméticos

6. Comandos de Seleção única

6.1 Avaliação de uma expressão sem alternativa: if

6.1.1 Sintaxe

6.1.2 Exemplo

6.2 Avaliação de uma expressão com alternativa: if-else

6.2.1 Sintaxe

6.2.2 Exemplo

6.3 Avaliação de mais de uma expressão de teste: if-else-if

6.3.1 Sintaxe

6.3.2 Exemplo

6.4 Seleção única com operador ternário: ? :

6.4.1 Sintaxe

6.4.2 Exemplo

7. Comando de Seleção múltipla

7.1 Seleção múltipla com o comando switch...case

7.1.1 Sintaxe

7.1.2 Exemplo

8. Comandos de repetição de blocos

8.1 Repetir blocos conhecendo quantas vezes: for

8.1.1 Sintaxe

8.1.2 Exemplos

8.1.2.1 O comando for na sua utilização mais comum

8.1.2.2 Comando for com mais de uma instrução no bloco subordinado

8.1.2.3 Comando for com duas instruções no corpo de definição

8.1.2.4 Comandos for aninhados

8.1.2.5 Comando for com tipos caracter no corpo de definição

8.1.2.6 Comando for com função e omissão de expressão

8.2 Repetir blocos sem conhecer quantas vezes

8.2.1 Repetir um bloco testando antes do início do bloco: while

8.2.1.1 Exemplos

8.2.1.1.1 while com expressão condicional mais comum

8.2.1.1.2 while com função na expressão condicional

8.2.2 Repetir um bloco testando no final do bloco: do...while

8.2.2.1 Sintaxe

8.2.3 Comandos de desvios de execução

8.2.4 Exemplos

8.2.4.1 Desviando com o comando break e continue

8.2.4.2 Comando continue com for

8.2.4.3 Comando de desvio de aninhamento: goto

9. Encerrar e voltar ao sistema operacional

10. Operadores lógicos

10.1 Exemplos

10.1.1 Utilizando o operador E lógico: &&

10.1.2 Utilizando o operador OU lógico: ||

10.1.3 Utilizando o operador NãO lógico: !

11. Definição de função do usuário

11.1 Protótipos de função

11.1.1 Sintaxe

11.2 Retornando um valor para a função chamadora: return

11.3 Exemplo de funções de usuário

11.3.1 Criando e chamando funções dentro de um arquivo fonte

11.4 Variáveis locais

11.5 Variáveis globais

11.5.1 Exemplo da utilização de variável global

11.6 Definindo classes de armazenamento de variáveis

11.6.1 extern

11.6.2 Variáveis static

11.6.2.1 Variáveis estáticas locais

11.6.2.1.1 Exemplo de utilização de variável estática local

11.6.2.2 Variáveis estáticas globais

11.6.2.2.1 Exemplo de utilização de variável estática global

11.6.3 Variável auto

11.6.4 Variável register

11.7 Funções recursivas

11.7.1 Exemplo de função recursiva

11.8 Função com quantidade variável de parâmetros

11.8.1 Sintaxe

11.8.2 Exemplo de função com parâmetros variáveis

12. Pré-processador

12.1 Diretiva #define

12.1.1 Exemplo de utilização da diretiva #define

12.1.2 Exemplo de #define como pseudo-função

12.2 Diretiva #include

12.2.1 Exemplo de utilização da diretiva #include

12.2.2 Incluindo protótipos de funções

12.3 Compilação condicional

12.3.1 Diretivas de compilação condicional #if, #else, #elif e #endif

12.3.1.1 Exemplo de utilização das diretivas #if e #endif

12.3.1.2 Exemplo de compilação condicional com alternativa: #else

12.3.1.3 Exemplo de compilação condicional com alternativas: #elif

12.3.2 Diretivas de compilação condicional #ifdef e #ifndef

12.3.2.1 Exemplo de compilação condicional com #ifdef

12.3.3 Diretiva de compilação condicional #undef

12.3.3.1 Exemplo de utilização da diretiva #undef

12.4 Diretiva #error

12.4.1 Exemplo de utilização da diretiva #error

12.5 Nomes de constantes pré-definidas

12.5.1 Exemplo de utilização de constantes de macro pré definidas

12.6 Diretiva #line

12.6.1 Exemplo de utilização da diretiva #line

12.7 Diretiva #pragma

13. Matrizes

13.1 Matrizes unidimensionais

13.1.1 Exemplos de matrizes unidimensionais

13.1.1.1 Definindo e percorrendo uma matriz unidimensional

13.1.1.2 Matriz unidimensional literal

13.2 Matrizes bidimensionais

13.2.1 Exemplo de matriz bidimensional

13.3 Matrizes tridimensionais

13.3.1 Exemplos de matrizes tridimensionais

13.3.1.1 Declarando e acessando uma matriz tridimensional

13.3.1.2 Matriz tridimensional literal

13.4 Enviando uma matriz a uma função

13.4.1 Exemplos de envio de matrizes a funções

13.4.1.1 Passando uma matriz unidimensional a uma função

13.4.1.2 Passando uma Matriz multidimensional a uma função

13.5 Acessando matriz multidimensional como unidimensional

13.6 Duplicando matrizes

14. Cadeias de caracteres (strings)

14.1 Exemplo de declaração e atribuição de caracteres

14.2 String literal

14.2.1 Exemplo de tratamento de string literal

14.3 Leitura de strings

14.3.1 Exemplo de leitura de string

14.4 Obtendo o tamanho da string

14.4.1 Exemplo de determinação de tamanho de string

14.5 Concatenando strings

14.5.1 Exemplo de concatenação de strings

14.6 Copiando uma string

14.6.1 Exemplo de cópia de string

14.7 Comparando igualdade de strings

14.7.1 Exemplo de comparação entre strings

14.8 Definindo e percorrendo uma matriz de strings

14.8.1 Exemplo de como definir e percorrer uma matriz de strings

15. Ponteiros

15.1 O que são ponteiros

15.2 Declaração de ponteiros

15.3 Significado do operador * em contextos diversos

15.3.1 Operador * em uma declaração de variável

15.3.2 Operador * posicionado antes do operador de atribuição ‘=’

15.3.2.1 Exemplo de operador * posicionado antes do ‘=’

15.3.3 Operador * posicionado após o operador de atribuição ‘=’

15.3.3.1 Exemplo do operador * posicionado após o operador =’

15.4 Passando a referência de uma variável a uma função

15.4.1 Exemplo de passagem de dados por referência

15.5 Operações aritméticas com ponteiros

15.5.1 Exemplo de aritmética com ponteiros

15.6 Ponteiros em expressões relacionais

15.6.1 Exemplo de ponteiros em expressões relacionais

15.7 Tratando matrizes com ponteiros

15.7.1 Exemplo de tratamento de matriz com ponteiros

15.7.2 Incremento em endereços para percorrer matriz

15.8 Matriz de ponteiros

15.8.1 Exemplo de uma matriz de ponteiros

15.9 Tratamento de strings com ponteiros

15.9.1 Exemplo de tratamento de string com ponteiros

15.9.2 Exemplo de atribuição direta de string à variável ponteiro

15.9.3 Atribuindo conteúdos de strings ponteiros

15.9.4 Exemplo de tratamento de matriz com string e ponteiros

15.9.5 Matriz Bidimensional e ponteiros

15.10 Ponteiros apontando para ponteiros

15.10.1 Exemplo de definição de ponteiros para ponteiros

15.10.2 Exemplo de indireção múltipla com matriz bidimensional

15.11 Recebendo parâmetros (ponteiros) em main()

15.11.1 Exemplo de recebimento de parâmetros em main()

15.11.2 Criando uma função gets melhorada utilizando ponteiros

15.12 Ponteiros para funções

15.12.1 Exemplo de ponteiro para função

15.12.2 Exemplo de matriz de ponteiros para funções

15.13 Ponteiros void

15.13.1 Exemplo de ponteiros void

16. Alocação dinâmica de memória

16.1 Função malloc()

16.1.1 Sintaxe da função malloc()

16.2 Função free()

16.2.1 Sintaxe da função free()

16.3 Exemplos de utilização de malloc() e free()

16.4 Função calloc()

16.4.1 Sintaxe da função calloc()

16.4.2 Exemplo de alocação de memória com calloc()

16.5 Alocando memória da pilha com alloca()

16.5.1 Sintaxe da função alloca

16.5.2 Exemplo de utilização da função alloca()

16.6 Redefinindo o tamanho alocado com realloc()

16.6.1 Sintaxe da função realloc()

16.6.2 Exemplo de utilização da função realloc()

16.7 Alocando memória de um heap fora do segmento atual

16.7.1 Modelos de memória

16.7.1.1 Memória Tiny

16.7.1.2 Memória Small

16.7.1.3 Memória Medium

16.7.1.4 Modelo Compact

16.7.1.5 Modelo Large

16.7.1.6 Modelo Huge

16.7.2 Funções para alocar memória fora do heap atual

16.7.2.1 Sintaxe da função farmalloc()

16.7.2.2 Sintaxe da função farcalloc()

16.7.3 Função para liberar a memória alocada fora do heap atual

16.7.3.1 Sintaxe da função farfree()

16.7.4 Exemplo de alocação no heap far

17. Estruturas

17.1 Sintaxe de definição de uma estrutura

17.2 Exemplo de definição e utilização de uma estrutura

17.3 Definindo instâncias quando da declaração da estrutura

17.3.1 Exemplo de instanciamento na declaração da estrutura

17.4 Evitando a declaração struct na criação de instâncias

17.4.1 Exemplo de declaração de instâncias sem a palavra struct

17.5 Criando estrutura literal e atribuição entre estruturas

17.5.1 Exemplo de definição de estrutura literal e atribuição

17.6 Estruturas aninhadas

17.6.1 Exemplo de estruturas aninhadas

17.7 Enviando estruturas para funções

17.7.1 Exemplo de envio de uma estrutura a uma função

17.8 Matriz de estrutura

17.8.1 Exemplo de uma matriz de estrutura

17.9 Ponteiros para estruturas

17.9.1 Sintaxe de ponteiro para estrutura

17.9.2 Exemplo de ponteiro para estrutura matricial

17.9.3 Acesso a membro com "pointer member"

17.9.3.1 Exemplo de acesso com "pointer member"

17.9.4 Enviando uma estrutura por referência à funções

17.9.4.1 Exemplo de envio de estrutura por referência

17.10 Utilizando uma estrutura para definir um campo de bits

17.10.1 Sintaxe de definição de campo de bits

17.10.2 Exemplo de definição e utilização de campo de bits

17.10.3 Restrições a campos de bits

18. Uniões

18.1 Sintaxe de uniões

18.1.1 Exemplo de definição e utilização de uma união

18.1.2 Exemplo de união de estrutura com dado comum

18.1.3 Exemplo de uma estrutura com os seus membros unidos

19. Lista enumerada

19.1 Sintaxe de definição de lista enumerada

19.2 Exemplo de definição e utilização de lista enumerada.

20. Operadores bit a bit

20.1 Lista de operadores bit a bit

20.1.1 Operador bit a bit & (E)

20.1.1.1 Exemplo de utilização de ‘&’ para desligar bits

20.1.2 Operador bit a bit | (OU)

20.1.3 Exemplo de utilização de ‘|’ para ligar bits

20.1.4 Operador bit a bit ^ (OU exclusivo)

20.1.5 Exemplo de utilização de ‘^’ para ligar bits diferentes

20.1.6 Operador bit a bit ~ (NãO) ou complementar de um

20.1.7 Exemplo de utilização de ‘~’ para inverter bits

20.1.8 Deslocando bits à esquerda com ‘<<‘

20.1.8.1 Exemplo de deslocamento a esquerda com operador ‘<<‘

20.1.9 Deslocando bits à direita com ‘>>‘

20.1.9.1 Exemplo de deslocamento à direita com operador ‘>>’

21. Entrada e Saída de dados em arquivos

21.1 Funções para manipulação de arquivos

21.2 Criando um ponteiro para um arquivo

21.3 Criando e gravando dados em a um arquivo

21.4 Lendo dados de um arquivo

21.5 Indicador de posição de arquivo

21.6 Removendo um arquivo de disco