(Parte 1 de 10)

1. INTRODUÇÃO01
1.1. A Origem da Linguagem C01
1.2. O Ambiente Turbo C01
1.3. A Estrutura Básica dos Programas02
1.4. Tipos de Dados04
1.4.1. Tipos de Dados Modificados05
1.5. Entrada e Saída de Dados Formatada06
1.5.1. Formatação de Campos de Exibição07
1.6. Operadores Aritméticos08
2. COMANDOS DE DECISÃO09
2.1. Expressões Lógicas09
2.2. Decisão Simples10
2.2.1. Operador condicional13
2.2.2. Condicionais Aninhados e Encadeados14
2.3. Decisão Múltipla15
3. COMANDOS DE REPETIÇÃO18
3.1. Expressões Compactas18
3.1.1. Operadores Aritméticos de Atribuição18
3.1.2. Incremento e Decremento19
3.2. Repetição com Contador20
3.3. Repetição com Precondição23
3.3.1. Deixando rastros na Tela25
3.4. Repetição com Poscondição26
3.5. Interrompendo uma Repetição29
4. MACROS E FUNÇÕES31
4.1. Preprocessamento31
4.1.1. A diretiva #define31
4.2. Definição e Uso de Funções34
4.2.1. Funções que não Devolvem Resposta35
4.2.2. Funções que Devolvem Resposta38
4.3. Classes de Armazenamento40
4.4. Recursividade42
4.4.1. Funções Recursivas4
4.4.2. Procedimentos Recursivos46
5. VETORES, STRINGS E MATRIZES48
5.1. Vetores48
5.1.1. Inicialização de Vetores50
5.1.2. Parâmetros do Tipo Vetor52
5.2. Strings5
5.2.1. Inicialização de Strings56
5.2.2. Manipulação de Strings57
5.3. Matrizes60
5.3.1. Inicialização de Matrizes62
5.3.2. Passando Matrizes a Funções63
5.4. Métodos de Busca65
5.4.1. Busca Linear65
5.4.2. Busca Binária67
5.5. Métodos de Ordenação71
5.5.1. Ordenação por Trocas71
5.5.2. Ordenação por Seleção73
5.5.3. Ordenação por Inserção75
6. ESTRUTURAS E UNIÕES7
6.1. Estruturas7
6.1.1. Inicialização e Aninhamento79
6.1.2. Vetores de Estruturas81
6.1.3. Ordenação e Busca em Tabelas82
6.2. Uniões84
6.2.1. Uniões Etiquetadas84
6.3. Campos de Bits86
6.3.2. Economizando Espaço de Armazenamento89
7. PONTEIROS92
7.1. Definição e Uso92
7.1.1. Passagem por Referência94
7.1.2. Ponteiros para Ponteiros96
7.1.3. Aritmética de ponteiros97
7.2. Ponteiros e Vetores9
7.2.1. Vetores de Strings100
7.2.2. Argumentos da Linha de Comando101
7.3. Ponteiros e Funções103
7.3.1. Funções que Devolvem Ponteiros103
7.3.2. Ponteiros para Funções104
7.4. Ponteiros e Estruturas107
7.4.1. Alocação Dinâmica de Memória109
7.4.2. Listas Encadeadas112
7.4.3. Tratamento Recursivo de Listas115
8. ARQUIVOS119
8.1. Ponteiros de Arquivo119
8.2. Arquivos-Padrão120
8.2.1. Redirecionamento de E/S padrão121
8.3. Operações Básicas122
8.3.1. Abertura de Arquivo122
8.3.2. Fechamento de Arquivo123
8.3.3. Verificação de Final de Arquivo124
8.4. Modo Texto versus Modo Binário125
8.4.1. E/S caracter125
8.4.2. E/S Formatada127
8.4.3. E/S Binária128
TABELA ASCII130

1. INTRODUÇÃO

C é geralmente citada como uma linguagem que reúne características tais como expressividade, portabilidade e eficiência. Embora seja uma linguagem de uso geral, C é especialmente indicada para o desenvolvimento de software básico. Nesse capítulo apresentamos a estrutura básica dos programas em C, funções de E/S, tipos de dados e operadores.

1.1. A ORIGEM DA LINGUAGEM C

A linguagem C foi desenvolvida em 1972, nos Laboratórios Bell, por Dennis

Ritchie e implementada pela primeira vez num computador DEC PDP-1 que usava o sistema operacional UNIX. Ela é o resultado da evolução de uma linguagem de programação mais antiga, denominada BCPL, desenvolvida por

Martin Richards. Tendo sido desenvolvida por programadores, e para programadores, C tornou-se rapidamente uma ferramenta de programação bastante difundida entre os profissionais da área.

A popularidade da linguagem C deve-se, principalmente, ao fato dela ser uma linguagem flexível, portátil e eficiente. Sua flexibilidade lhe permite ser utilizada no desenvolvimento de diversos tipos de aplicação, desde simples jogos eletrônicos até poderosos controladores de satélites. Graças à sua por- tabilidade, os programas codificados em C podem ser executados em diversas plataformas, praticamente, sem nenhuma alteração. E, finalmente, sua eficiência proporciona alta velocidade de execução e economia de memória.

1.2. O AMBIENTE TURBO C

O Borland Turbo Cã é o ambiente no qual desenvolveremos nossos programas. Ele é composto por um editor de textos, um compilador e um linkeditor que, juntos, nos permitem criar programas executáveis a partir de textos escritos em C. Os recursos oferecidos nesse ambiente poderão ser explorados à medida que estivermos mais familiarizados com a linguagem C. Para começar, é suficiente saber que:

• F2 salva o código-fonte do programa num arquivo com extensão .c, • Ctrl+F9 compila, linkedita (gera arquivo .exe) e executa seu programa,

1. INTRODUÇÃO 2

Figura 1.1 - A tela do ambiente integrado Turbo C

1.3. A ESTRUTURA BÁSICA DOS PROGRAMAS

Um programa C consiste de funções sendo que, necessariamente, uma delas deve ser denominada main. Essa é a função principal, por onde inicia-se a execução do programa, e sem ela o programa não pode ser executado.

Exemplo 1.1. Uma pessoa é obesa se seu índice de massa corpórea é superior a 30, tal índice é a razão entre seu peso e o quadrado da sua altura.

/* OBESO.C – informa se uma pessoa está ou não obesa */

#include <stdio.h> #include <conio.h>

#include <math.h>

#define LIMITE 30

float peso, altura, imc;

main() { clrscr(); printf(“\nQual o seu peso e altura? ”); scanf(“%f %f”, &peso, &altura); imc = peso/pow(altura,2); printf(“\nSeu i.m.c. é %.1f”, imc);

elseprintf(“\nVocê está obeso!”);

if( imc <= LIMITE ) printf(“\nVocê não está obeso!”); getch(); }

1. INTRODUÇÃO 3

Como esse programa é muito simples, ele consiste de uma única função: main. Essa função solicita os dados da pessoa, calcula o seu índice de massa

corpórea e informa se ela está obesa ou nãoþ

Alguns pontos desse primeiro exemplo devem ser ressaltados:

· Todo texto delimitado por /* e */ é considerado como comentário, isto é, serve apenas para esclarecer algum ponto específico do programa.

• A diretiva #include causa a inclusão de arquivos de cabeçalho contendo declarações necessárias à compilação. Os arquivos stdio.h, conio.h e math.h declaram, respectivamente, comandos de E/S padrão, E/S console e funções matemáticas. A diretiva #define declara constantes simbólicas.

• Os parênteses após o nome de uma função, como em main(), são obriga- tórios. Além disso, o compilador distingue maiúsculas e minúsculas e, portanto, o nome main é reservado, mas Main não o é.

• A função clrscr() serve para limpar a tela e as funções scanf() e printf() realizam entrada e saída de dados padrão.

• A função getch() aguarda que uma tecla seja pressionada para que a execução do programa seja concluída. Isso permite que o usuário veja a saída do programa, antes de voltar à tela do ambiente integrado.

Exercício 1.1. Execute o programa obeso.c usando o Borland Turbo C.

Exercício 1.2. Descubra os erros no programa a seguir:

/* PERIM.C - informa o perímetro de uma circunferência /* #include <studio.h>

#define PI = 3.1415

Main() { float raio;

printf("\n Qual a medida do raio? ");/* solicita o raio
scanf("%f", &raio);da circunferência */

clrscr; float perim; /* calcula o seu

perim := 2*PI*raio;perímetro */

1. INTRODUÇÃO 4 printf("\n O perímetro é %f", perim);

}

getch;

1.4. TIPOS DE DADOS

Programas servem essencialmente para manipular dados: ao executarmos um programa, fornecemo-lhes dados e esperamos que ele faça alguma coisa com eles. Os dados podem se apresentar em duas formas distintas: como constantes ou variáveis. No programa do exemplo 1.1, o número 30 é um dado constante, enquanto o peso e a altura da pessoa são dados variáveis, isto é, são dados cujos valores variam de uma execução para outra. Além da distinção entre as formas em que os dados podem se apresentar, existe também uma distinção entre os tipos de dados que o computador é capaz de manipular; como, por exemplo, números, letras, palavras, etc.

A linguagem C oferece cinco tipos de dados básicos:

Tipo Espaço Escala

Em C não existe muita distinção entre a representação gráfica de um caracter e o seu código ASCII. Como sabemos, o computador somente é capaz de manipular números. Então, quando atribuímos um caracter a uma variável, estamos na verdade armazenando o seu código ASCII (que na tabela padrão varia de 0 a 127). É por este motivo que a escala de valores do tipo char varia

As variáveis do tipo int podem armazenar números maiores que as variáveis do tipo char, mas também gastam mais espaço de memória. Valores fracionários podem ser armazenados em variáveis do tipo float ou double, confor- me a necessidade. Já o tipo void é um tipo especial, que tem aplicação mais avançada, e seu uso será visto mais adiante.

A declaração de uma variável consiste em um tipo e um identificador. O tipo determina o espaço de memória que deverá ser alocado para ela e o identifi- cador permitirá que ela seja referenciada no restante do programa.

1. INTRODUÇÃO 5

Exemplo 1.2. Declaração de variáveis.

char tecla, opcao; int x, y, z;

float comissao, desconto, salario;þ

1.4.1. TIPOS DE DADOS MODIFICADOS Além dos tipos básicos, C oferece também alguns tipos de dados modificados:

Tipo Espaço Escala unsigned int 2 bytes 0 a 65535 long int 4 bytes -2 147 483 648 a +2 147 483 647

O bit mais à esquerda em uma variável do tipo char ou int, denominado bit de sinal, é normalmente utilizado pelo computador para distinguir entre va- lores positivos e negativos: se esse bit é zero, então o valor é positivo; caso contrário, ele é negativo. Usando o modificador unsigned, estamos informando ao compilador que somente valores sem sinal serão usados e que, portan- to, não é necessário ter um bit de sinal. Com isso, podemos usar esse bit para representar valores e, conseqüentemente, a escala de valores dobra. Há também o modificador signed, que indica que os valores devem ser sinalizados; mas, como este é o caso normal, raramente ele é utilizado. Se a palavra unsigned (ou signed) é usada isoladamente, o compilador assume o tipo int.

(Parte 1 de 10)

Comentários