You are on page 1of 41

Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


1 2

Programação Estruturada
n A linguagem C é uma linguagem estruturada
em bloco simples. Uma característica
Curso de Linguagem C distintiva de uma linguagem estruturada em
bloco é a compartimentalização de seu
código e de seus dados, que é a habilidade
Rodolfo Jardim de Azevedo de uma linguagem tem de seccionar e
esconder do resto do programa todas as
Instituto de Computação instruções necessárias para a realização de
UNICAMP uma determinada tarefa.

Curso de Linguagem C Curso de Linguagem C


3 4

Declaração de variáveis Funções - Blocos de código


n Variáveis devem ser declaradas antes n Utilizando funções, é possível esconder
de serem usadas, permitindo assim, parte do código e variáveis, evitando
que o compilador saiba de antemão assim, que sejam gerados efeitos
informações como tipo e espaço gasto colaterais em outras partes do
em memória podendo fazer checagem programa. Desta forma, é necessário
durante o processo de compilação. saber apenas o que as rotinas fazem, e
não como elas fazem.

Curso de Linguagem C Curso de Linguagem C


5 6

Laços Testes de condições


n Os programas passam a maior parte do n Numa linguagem estruturada, os testes
tempo repetindo tarefas até que uma de condições são amplamente
condição seja satisfeita (ou um número utilizados, tanto como controle de laços,
fixo de vezes). Desta forma, fica mais quanto para execuções condicionais de
fácil a programação e eliminam-se os blocos de código.
inconvenientes gerados por vários
gotos espalhados pelo programa.

1
1
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


7 8
Linguagem feita para
A linguagem C programadores
n Surgiu nos anos 70 de uma linguagem chamada n Ao contrário do que possa parecer, nem
B. Criada por Dennis Ritchie. Embora todas as linguagens foram feitas para
houvessem poucas divergências entre as programadores. C é virtualmente única,
primeiras implementações em nível de código- porque ela foi criada, influenciada e testada
fonte, foi desenvolvido o padrão ANSI sendo em campo por programadores. Ela oferece
assim, qualquer programa C ANSI pode ser
ao programador exatamente o que ele quer:
compilado em qualquer compilador C ANSI não
poucas restrições e queixas, código rápido e
importando a máquina na qual o programa vá ser
executado. Por isso, quando se quer eficiência. Por isso ela é a linguagem mais
portabilidade, a escolha acaba recaindo sobre a popular entre os programadores profissionais
linguagem C. altamente qualificados.

Curso de Linguagem C Curso de Linguagem C


9 10

Sensível ao caso Programa exemplo


n A linguagem C é sensível ao caso, isto /* Este é o primeiro programa */
quer significa que letras maiúsculas e #include <stdio.h>
minúsculas são tratadas como main()
caracteres separados.
{
printf(“Alo mundo\n”);
}
n Este é um exemplo bem simples, mas que mostra
alguns componentes básicos que existem nos
programas feitos em C. Nele vemos:

Curso de Linguagem C Curso de Linguagem C


11 12

/* Este é o primeiro programa */ #include <stdio.h>


n Esta linha é um comentário. n Indica a inclusão de arquivos dentro do
programa atual (neste caso, o arquivo
stdio.h). Normalmente são arquivos
cabeçalhos contendo declarações de
tipos e protótipos de funções. Serão
vistos mais tarde.

2
2
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


13 14

main() {
n Todo programa em C tem que ter a n Inicia um bloco de código.
função main, é na primeira linha desta
função que o programa começa a ser
executado e quando a última linha for
executada, o programa será encerrado.

Curso de Linguagem C Curso de Linguagem C


15 16

printf(“Alo mundo\n”); }
n Chamada a uma função em C. A função n Encerra um bloco de código.
printf é utilizada para imprimir uma
mensagem na tela, neste caso, a
mensagem Alo mundo que é chamado
de parâmetro passado à função.

Curso de Linguagem C Curso de Linguagem C


17 18

Blocos de código Ponto e vírgula


n Por ser uma linguagem estruturada, a n O ponto e vírgula é um terminador de
linguagem C permite a criação de blocos de comandos, por isso, todos os
código. Um bloco de código é um grupo de comandos devem ser terminados por
comandos de programa conectados
logicamente que o computador trata como
um. Desta forma, podemos ter vários
uma unidade. Para criar um bloco de código, comandos numa mesma linha sendo
coloque uma seqüência de comandos entre cada um terminado com um ponto e
chaves, como pode ser visto no programa vírgula.
exemplo, as linhas 5, 6 e 7 representam um
bloco de código.

3
3
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


19 20

Chaves Comentários
n Todo bloco de código escrito em C n Na linguagem C, os comentários são
deve vir entre chaves. Não é necessário delimitados por /* e */ como pode ser
colocar um ponto e vírgula depois de visto na primeira linha do programa
fechar chaves pois cada comando anterior. Não é permitido colocar
dentro do bloco já possui o seu comentários aninhados. Os
terminador. comentários podem vir em qualquer
posição do programa e não apenas em
linhas separadas. Eles também podem
começar em uma linha e terminar em
outra.

Curso de Linguagem C Curso de Linguagem C


21 22

Palavras reservadas Palavras reservadas


n Como todas as outras linguagens de
programação, C consiste em palavras auto double int struct
reservadas e em regras de sintaxe que se break else long switch
aplicam a cada palavra reservada. Uma case enum register typedef
palavra reservada é essencialmente um char extern return union
comando, e na maioria das vezes, as
const float short unsigned
palavras reservadas de uma linguagem
continue for signed void
definem o que pode ser feito e como será
feito. O padrão ANSI C especifica as default goto sizeof volatile
seguintes palavras reservadas: do if static while

Curso de Linguagem C Curso de Linguagem C


23
Variáveis, constantes, 24

operadores e expressões Identificadores


n Por ser uma linguagem estruturada, em n Identificadores são nomes usados para
C, as variáveis devem ser declaradas se fazer referência a variáveis, funções,
antes de serem usadas, permitindo rótulos e vários outros objetos definidos
assim, que o compilador faça pelo usuário. Um identificador pode ter
checagens em tempo de compilação. de um a vários caracteres. O primeiro
deve ser uma letra ou um sublinhado, e
os caracteres subseqüentes deve serm
letras, números ou um sublinhado.

4
4
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


25 26

Tipos de dados Tipos de dados


n Em C, existem 5 tipos de dados Tipo Extensão Escala
básicos: caracter, inteiro, ponto em bits
flutuante, ponto flutuante de dupla
char 8 -128 a 127
precisão e sem valor. As palavras
reservadas para declarar variáveis
int 16 -31768 a 32767
destes tipos são char, int, float, double float 32 3.4E-38 a 3.4E+38
e void respectivamente. Veja na tabela double 64 1.7E-308 a 1.7E308
a seguir o espaço gasto por cada um void 0 sem valor
destes tipos assim como seus limites
em máquinas IBM PC compatíveis.

Curso de Linguagem C Curso de Linguagem C


27 28

Modificadores de tipo Modificadores de tipo


n Com exceção de void, os tipos de dados básicos Tipo Extensão em bits
têm vários modificadores que os precedem. O char 8
modificador é usado para alterar o significado do int 16
tipo-base para que ele se adapte da maneira short int 16
mais precisa às necessidades das várias
long int 32
situações. Eis aqui uma lista dos modificadores:
float 32
signed, unsigned, long, short. Os dois primeiros
short float 32
modificadores indicam a existência ou não de
long float 64
sinal enquanto os outros dois são relativos ao
double 64
tamanho de memória necessário para armazenar
o valor de um elemento deste tipo.
short double 64
long double 80

Curso de Linguagem C Curso de Linguagem C


29 30
Exemplos de declaração de
Declarando variáveis variável
n Uma declaração de variável deve seguir n int i, j, l;
a seguinte regra: n short int si;
n unsigned int ui;
tipo lista_variáveis;
n long inteiro_grande;
n double balanco, lucro, prejuizo;
n onde tipo deve ser um tipo válido em C
e lista_variáveis pode consistir em um
ou mais identificadores separados por
vírgula.

5
5
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


31 32

Onde declarar? Variável global


n Existem 3 lugares em um programa C n O primeiro lugar é fora de todas as
onde as variáveis podem ser funções, incluindo a função main(). A
declaradas. variável decalrada dessa maneira é
chamada variável global e pode ser
usada em qualquer parte do programa.

Curso de Linguagem C Curso de Linguagem C


33 34

Variável local Parâmetro (argumento)


n O segundo lugar é dentro de uma n O último lugar onde as variáveis podem
função. Estas variáveis são chamadas ser declaradas é na declaração dos
variáveis locais e podem ser usadas parâmetros formais de uma função,
somente pelos comandos que embora as variáveis aqui declaradas
estiverem na mesma função. sejam utilizadas para receber os
argumentos quando a função é
chamada, eles podem ser utilizados
como outra variávei qualquer.

Curso de Linguagem C Curso de Linguagem C


35 36

Programa exemplo: Função total()


/* soma os números de 0 a 9 */ /* acumula no total parcial */
int soma; /* Variável global */ total(x)
main()
int x; /* Parâmetro formal */
{
int cont; /* Variável local */
{
soma = 0; /* inicializa variável soma */ soma = x + soma;
for (cont = 0; cont < 10; cont ++) { }
total(cont);
display();
}
}

6
6
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


37 38

Função display() Comentários


display() n Neste exemplo, qualquer função do programa
{ pode acessar a variável global soma. Porém
total() não pode acessar diretamente a variável
int cont; /* Variável local */ local cont em main(), que deve passar cont como
/* esta variável cont é diferente um argumento. Isto é necessário porque uma
daquela declarada em main() */ variável local só pode ser usada pelo código que
está na mesma função na qual ela é declarada.
Observe que cont em display() é completamente
for(cont = 0; cont < 10; cont ++) printf(“-”); separada de cont em main(), novamente porque
printf(“A soma atual é %d”, soma); uma variável local é conhecida apenas pela
} função na qual ela é declarada.

Curso de Linguagem C Curso de Linguagem C


39 40

Inicialização de variáveis Constantes


n Nós vimos que em main() existe uma linha n Constantes são valores fixos que o
somente para inicializar a variável soma, esta programa não pode alterar.
linha poderia ser suprimida se a variável
fosse declarada

int soma = 0;

n Desta forma, podemos inicializar variáveis no


momento de sua declaração, o que facilita
muito a escrita do programa além de reduzir
o seu tamanho.

Curso de Linguagem C Curso de Linguagem C


41 42

Exemplos de Constantes Constantes hexadecimais e octais


n Podem ser declaradas constantes em
Tipo de dado Exemplo hexadecimal ou octal conforme o
char ‘a’ ‘n’ ‘9’ exemplo a seguir:
int 1 123 2100 -234 int hex = 0xFF; /* 255 em decimal */
long int 35000 -34 /* as constantes em hexadecimal devem
short int 10 -12 90 ser precedidas por 0x */
unsigned int 10000 987 40000 int oct = 011; /* 9 em decimal */
float 123.23 4.34E-3 /* as constantes em octal devem
double 123.23 12312333 -0.9876 ser precedidas por 0 */

7
7
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


43 44

Constantes strings Constantes com barras invertidas


n Uma string é um conjunto de caracteres n Existem alguns caracteres que não
entre aspas. Por exemplo, “esta é uma podem ser representados no texto
string” é uma string. Não confundir comum, as constantes com barra
strings com caracteres, ‘a’ é um invertida servem para representar estes
caracter enquanto “a” é uma string. caracteres.

Curso de Linguagem C Curso de Linguagem C


45 46

Constantes com barras invertidas Operadores


Código Significado n A linguagem C é muito rica em
\b retrocesso operadores. Os operadores são
\f avanço de página
divididos em 3 categorias gerais:
\n mudança de linha
\r retorno de carro aritméticos, de relação e lógicos e bit a
\t tab horizontal bit. Além desses, C tem operadores
\” aspas duplas especiais para tarefas particulares.
\’ aspas simples
\0 ASCII 0
\\ barra invertida
\v tab vertical
\a alerte (beep)
\x constante hexadecimal

Curso de Linguagem C Curso de Linguagem C


47 48

Operadores aritméticos Exemplo:


main()
Operador Ação {
- subtração, também menos unário int x = 10, y = 3;
+ adição printf(“%d\n”, x / y); /* exibirá 3 */
* multiplicação printf(“%d\n”, x % y);
/ divisão /* exibirá 1, o resto da divisão de inteiros */
x = 1;
% resto da divisão
y = 2;
-- decremento
printf(“%d %d\n”, x / y, x % y);
++ incremento
/* exibirá 0 e 1 */

8
8
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


49 50

Exemplo (continuação) Operadores de relação


x ++;
printf(“%d\n”, x); /* exibirá 2*/ Operador Ação
printf(“%d %d\n”, x++, ++y);/* exibirá 2 e 3 */ > maior que
/* neste caso, x só é incrementado depois que o
comando >= maior ou igual a
é executado enquando y é incrementado antes */ < menor que
} <= menor ou igual a
== igual a
!= não igual a

Curso de Linguagem C Curso de Linguagem C


51 52

Operadores lógicos Observação


n Em C, o número 0 representa falso e
Operador Ação qualquer número não-zero é
&& AND verdadeiro, assim, os operadores
|| OR anteriores retornam 1 para verdadeiro e
! NOT
0 para falso.

Curso de Linguagem C Curso de Linguagem C


53 54

Operador de atribuição Expressões


n O operador = é o operador de n Os operadores, as constantes e as
atribuição. Ao contrário de outras variáveis são os componentes das
linguagens, C permite que o operador expressões. Uma expressão em C é
de atribuição seja usado em qualquer combinação válida desses
expressões com outros operadores. componentes.
int a, b, c;
a = b = c = 1; /* atribui 1 às 3 variáveis */
((a = 2 * b) > c) /* a = 2 e a comparação
resulta em 1 */

9
9
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


55 56

Conversões de tipos Regra 1


n Quando você mistura constantes e n Todo char e short int é convertido para
variáveis de tipos diferentes em uma int. Todo float é convertido para double.
expressão, C as converte para o
mesmo tipo. O compilador C converterá
todos os operandos para o tipo do
maior operando, uma operação de cada
vez, conforme descrito nestas regras de
conversão de tipo:

Curso de Linguagem C Curso de Linguagem C


57 58

Regra 2 Type cast


n Para todos os pares de operandos, n Pode-se forçar o compilador a efetuar
ocorre o seguinte, em seqüência: se um determinada conversão utilizando-se
dos operandos for um long double, o um type cast que tem a seguinte forma:
outro será convertido para long double. (tipo) expressão
Se um dos operandos for double, o
outro será convertido para double. Se
um dos operandos for long, o outro será
convertido para long. Se um dos
operandos for unsigned, o outro será
convertido para unsigned.

Curso de Linguagem C Curso de Linguagem C


59 60

Exemplo: Modificadores de acesso


main() n Os modificadores de acesso informam
{ sobre como será feito o acesso à
int x = 3;
variável.
printf(“%f %f\n”, (float) x / 2, (float) (x / 2));
/* serão impressos na tela 1.5 e 1.0 pois no primeiro
caso, x é convertido para float e depois é dividido, já
no segundo, somente o resultado é convertido para
float */
}

10
10
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


61 62

Register Static
n Sempre que uma variável for declarada n Variáveis static são variáveis existem
do tipo register, o compilador fará o durante toda a execução do programa,
máximo possível para mante-la num mas só podem ser acessadas de dentro
dos registradores do microprocessador, do bloco que a declarou.
acelerando assim o acesso a seu valor.
É pratica comum, declarar as variáveis
de controle de loop como sendo
register.

Curso de Linguagem C Curso de Linguagem C


63 64

Exemplo: printf()
/* Exemplo de variável static */ n Rotina de finalidade geral para saída
main() pelo console
{
printf(“%d\n”, numero()); /* imprimirá 0 */ n A função printf() serve para mostrar
printf(“%d\n”, numero()); /* imprimirá 1 */ mensagens na tela. Sua forma geral é
}
numero() printf(“string de controle”, lista argumentos);
{
static valor = 0; /* atribuição só executada 1 vez */
return valor ++;
}

Curso de Linguagem C Curso de Linguagem C


65 66

“string de controle” Comandos de formatação


n A string de controle consiste em dois n Todos os comandos de formatação
tipos de itens: começam por % que é seguido pelo
Caracteres que a função imprimirá na tela código de formatação
Comandos de formatação n Deve haver exatamente o mesmo
número de argumentos quanto forem os
comandos de formatação e eles devem
coincidir em ordem

11
11
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


67 68

Comandos de formatação Comprimento mínimo do campo


n Para especificar o comprimento mínimo que
Código Formato
%c um único caracter um campo poderá ter, basta colocar um
%d decimal inteiro entre o sinal % e o comando de
%i decimal
%e notação científica
formatação. Observe que este é o
%f ponto decimal flutuante comprimento mínimo e que o campo pode
%g usa %e ou %f - aquele que for menor
%o octal
ocupar um espaço maior.
%s string de caracteres
%u decimal sem sinal Exemplo Função
%x hexadecimal %3d inteiro com pelo menos 3 dígitos (preenchido
%% sinal % com espaços)
%p exibe um ponteiro %03d inteiro com pelo menos 3 dígitos (preenchido
%n o argumento associado será um ponteiro inteiro no com zeros)
qual será colocado o número de caracteres escritos %5s string com pelo menos 5 caracteres
até o momento

Curso de Linguagem C Curso de Linguagem C


69 70

Número de casas decimais Comprimento máximo


n Para especificar o número de casas n Quando o formato de casas decimais é
decimais, coloque um ponto decimal colocado em strings, o número de
após o especificador de largura mínima casas decimais passa a ser
do campo e depois dele, o número de considerado como comprimento
casas decimais que deverão ser máximo do campo.
exibidas.
Exemplo Função
Exemplo Função %5.7s string com no mínimo 5 e no
%7.2f Usar 2 casas decimais máximo 7 caracteres

Curso de Linguagem C Curso de Linguagem C


71 72

Número mínimo de dígitos Alinhamento


n Quando o formato de casas decimais é n Por padrão, todo resultado é alinhado à
aplicado em inteiros, o especificador de direita, para inverter este padrão, utilize
casas decimais será utilizado como um sinal de menos (-) antes de
número mínimo de dígitos especificar o tamanho.

Exemplo Função Exemplo Função


%7.6d 7 caracteres no mínimo e 6 %-5d 5 caracteres alinhados à
dígitos no mínimo esquerda
%-10s 10 caracteres alinhados à
esquerda

12
12
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


73 74

Modificadores de formatação Exemplos


n Podemos usar modificadores para
informar sobre a leitura de shorts Comando printf() Resultado
(modificador h) ou longs (modificador l) (“%-5.2f”, 123.234) 123.23
(“%5.2f”, 3.234) 3.23
(“%10s”, “alo”) alo
Exemplo Função (“%-10s”, “alo”) alo
%hd Imprime um short int (“%5.7s”, “123456789”) 1234567
%ld Imprime um long int (“%5.4d”, 123) 0123

Curso de Linguagem C Curso de Linguagem C


75 76

scanf() “string de controle”


n Rotina de finalidade geral para entrada n A string de controle consiste em três
pelo console classificações de caracteres:
n A função scanf() serve para ler Especificadores de formato
informações do teclado. Sua forma Caracteres brancos
geral é Caracteres não-brancos

scanf(“string de controle”, lista argumentos);

Curso de Linguagem C Curso de Linguagem C


77 78

Especificadores de formato Especificadores de formato


n Todos os especificadores de formato
Código Lê
começam por % que é seguido por um %c único caracter
caracter que indica o tipo de de dado %d decimal
%i decimal
que será lido %e número com ponto flutuante
n Deve haver exatamente o mesmo %f numero com ponto decimal flutuante
%o número octal
número de argumentos quanto forem os %s string de caracteres
especificadores de formato e eles %x hexadecimal
devem coincidir em ordem %p ponteiro
%n recebe um valor inteiro igual ao número de
caracteres lidos até o momento

13
13
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


79 80

Caracter branco Caracter não branco


n Um caracter branco na string de n Um caracter não branco na string de
controle faz com que scanf() passe por controle faz com que scanf() leia e
cima de um ou mais caracteres brancos desconsidere um caracter coincidente.
na string de entrada Se o computador não encontrar o
n Um caracter branco é um espaço, um caracter especificado, scanf terminará
tab ou um \n n O comando “%d,%d” fará com que
scanf leia um inteiro, depois leia e
desconsidere uma vírgula e finalmente,
leia um outro inteiro

Curso de Linguagem C Curso de Linguagem C


81 82

Como chamar scanf() Ignorar entrada


n Todas as variáveis usadas para receber n Colocar um * entre o % e o código de
valores através de scanf() devem ser formatação fará com que scanf() leia
passadas por seus endereços. Se dados do tipo especificado mas
quiser ler a variável cont, utilize suprimirá suas atribuições. Desta forma
scanf(“%d”, &cont); scanf(“%d%*c%d”, &x, &y)

n Como strings são representadas por n dada a entrada 10/20, coloca 10 em x,


vetores, NÃO deve ser colocado o & desconsidera o sinal de divisão e
antes do nome da variável coloca 20 em y

Curso de Linguagem C Curso de Linguagem C


83 84

Comprimento máximo do campo Espaços, tabs e \n


n Para especificar o comprimento máximo que
n Servem como separadores quando não
um campo poderá ter, basta colocar um
inteiro entre o sinal % e o comando de estiverem sendo lidos caracteres. São
formatação. Os caracteres que sobrarem lidos e atribuídos quando for pedido um
serão utilizados nas próximas chamadas a caracter de entrada. Caso o comando
scanf(). Caso não queira ler mais do que 20 scanf(“%c%c%c”, &a, &b, &c);
caracteres na string nome, utilize
n seja lido com a entrada
scanf(“%20s”, nome);
x y
n scanf retornará com x em a, espaço em
b e y em c

14
14
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


85 86

Comandos de controle de fluxo Comandos de testes de condições


n Os comandos de controle de fluxo são a n Estes comandos avaliam uma condição
base de qualquer linguagem. e executam um bloco de código de
n A maneira como eles são implementados acordo com o resultado. São eles:
afeta a personalidade e percepção da
• if
linguagem.
• switch
n C tem um conjunto muito rico e poderoso de
comandos de controle de fluxo.
n Eles se dividem em comandos de teste de
condições e comandos de controle de loop.

Curso de Linguagem C Curso de Linguagem C


87 88

if Exemplo
/* programa do número mágico */
n O comando if serve para executar #include <stdlib.h>
comandos de acordo com uma main()
determinada condição {
int magico, adivinhacao;
n A forma geral do comando if é
magico = rand() % 10; /* gerar um número */
if (condição) comando; printf(“Adivinhe o número: ”);
else comando; scanf(“%d”, &adivinhacao);
if (adivinhacao == magico)
n onde a parte else é opcional
printf(“** número certo **”);
else
printf(“-- número errado --”);
}

Curso de Linguagem C Curso de Linguagem C


89 90

if aninhados Exemplos
n C permite que sejam colocados if (x) if (x) {
comandos if dentro de outros comandos if (y) printf(“1”); if (y) printf(“1”);
else printf(“2”); }
if. A isto chamamos de if aninhados.
else printf(“2”);
n Quando se trata de if aninhados, o
comando else se refere ao if mais n Neste caso, o else n Neste caso, o else
próximo que não possui um comando pertence ao pertence ao primeiro
else. Tanto o if quanto o else devem segundo if. if.
estar dentro do mesmo bloco de código.

15
15
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


91 92

if-else-if Avaliação do if-else-if


n É muito comum encontrar programas n O computador avalia as expressões
que possuem uma “escada” if-else-if da condicionais de cima para baixo. Assim
seguinte forma: que encontra uma condição verdadeira,
if (condição) ele executa o comando associado a ela
comando; e passa por cima do resto da “escada”.
else if (condição) n Se nenhuma condição for verdadeira, o
comando; computador executará o else final.
else
comando;

Curso de Linguagem C Curso de Linguagem C


93 94

A expressão condicional switch


n Qualquer expressão válida em C pode n Embora o if-else-if possa executar vários
servir como expressão condicional. tipos de testes, o código pode ficar muito
Veja o exemplo: difícil de ser seguido.
/* dividir o primeiro número pelo segundo */ n C possui um comando de vários desvios
main() chamado switch.
{
n No switch, o computador testa uma variável
int a, b;
printf(“Digite dois números: “);
sucessivamente contra uma lista de
scanf(“%d %d”, &a, &b); constantes inteiras ou de caracteres e
if (b) printf(“%d\n”, a/b); executa um comando ou bloco de comandos
else printf(“não posso diridir por zero\n”); quando encontrar uma coincidência.
}

Curso de Linguagem C Curso de Linguagem C


95 96
O comando default dentro do
Forma geral do switch switch
switch (variável) { n O comando default será executado se
case constante1: não for encontrada nenhuma
seqüência de comandos
coincidência na lista de constantes.
break;
case constante2: n Caso não seja colocado um comando
seqüência de comandos default e não haja coincidência,
break; nenhum comando será executado.

default:
seqüência de comandos
}

16
16
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


97 98

O comando break Importante


n Quando o computador encontra alguma n O switch difere do if, já que o primeiro só
coincidência, ele executa os comandos pode testar igualdade e a expressão
associados àquele case até encontrar condicional if pode ser de qualquer tipo.
break ou o fim do comando switch. n Não pode haver duas constantes case com
valores iguais no mesmo switch.
n É um erro comum programadores
n Podem ser colocados comandos switch
esquecerem de colocar o break após os dentro de comandos switch.
comandos. n Pode ser deixado um case vazio quando
mais de uma condição usa o mesmo código.

Curso de Linguagem C Curso de Linguagem C


99 100

Comandos de controle de loops for


n Os comandos de controle de loops n O loop for em C é muito mais forte e
permitem que o computador repita um mais flexível que o da maioria das
conjunto de instruções até que alcance outras linguagens. Sua forma geral é
uma certa condição. Em C temos os for (inicialização; condição; incremento)
seguintes comandos de controle de comando;
loop: n Observe que as três partes do loop for
• for são separadas por ponto e vírgula.
• while
n Nenhuma destas partes precisa existir.
• do while

Curso de Linguagem C Curso de Linguagem C


101 102

Inicialização Condição
n Na forma mais simples, inicialização é n A condição é uma expressão de relação
um comando de atribuição que o que testa se a condição final desejada
compilador usa para estabelecer a pelo loop for ocorreu.
variável de controle de loop. n Aqui também pode ser colocado
n A inicialização pode conter qualquer qualquer comando válido em C.
comando válido em C.

17
17
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


103 104

Incremento Exemplo 1
n O incremento define a maneira como a /* imprimir os números de 1 a 100 */
variável de controle do loop será main()
alterada cada vez que o computador {
repetir o loop. int x;
n Também aqui, podemos colocar for (x = 1; x <= 100; x ++) printf(“%d ”, x);
qualquer comando válido em C. }

Curso de Linguagem C Curso de Linguagem C


105 106

Exemplo 2 Exemplo 3
/* imprimir os números de 100 a 1 */ /* imprimir os números de 0 a 100, 5 em 5 */
main() main()
{ {
int x; int x;
for (x = 100; x > 0; x --) printf(“%d ”, x); for (x = 0; x <= 100; x = x + 5)
} printf(“%d ”, x);
}

Curso de Linguagem C Curso de Linguagem C


107 108

Exemplo 4 Variações do loop for


/* executa um bloco de código 100 vezes */ n Podem ser executados mais de um
main() comando nas partes de inicialização e
{ de incremento. Veja que
int x; main()
for (x = 0; x < 100; x ++) { {
int x, y;
printf(“O valor de x é: %d ”, x);
for (x = 0, y = 0; x + y < 100; ++x, y++)
printf(“e o quadrado de x é: %d\n”, x * x); printf(“%d ”, x + y);
} }
} n Mostrará números de 0 a 98, 2 a 2.

18
18
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


109 110

Um uso diferente para for Loop infinito


main()
{ int t;
n Podemos fazer um comando for
for (prompt(); t=readnum(); prompt()) sqrnum(t); executar para sempre simplesmente
}
prompt()
não especificando sua parte
{ printf(“digite um inteiro:” ); condicional. Veja
}
readnum()
for (;;)
{ int t; printf(“este loop rodará para sempre\n”);
scanf(“%d”, &t);
return t;
}
sqrnum(int num)
{ printf(“%d\n”, num * num);
}

Curso de Linguagem C Curso de Linguagem C


111 112

Saindo de um loop Loops for sem nenhum corpo


n Podemos usar o comando break para n Podem ser utilizados loops sem corpo
encerrar um for a qualquer momento. para gerar retardo de tempo. Veja um
Veja um exemplo: exemplo:
main() for (a = 0; a < 1000; a ++);
{
int a;
for (a = 1; a < 100; a++)
if (a == 10) break;
}
n O loop só será executado 10 vezes.

Curso de Linguagem C Curso de Linguagem C


113 114

while Exemplo 1
n O while executa um comando (ou bloco pausa()
de comandos) enquanto uma condição {
for verdadeira. char tecla = ‘\0’;
n A forma geral do while é: printf(“Tecle ESPAÇO para continuar...”);
while (condição) while (tecla != ‘ ’)
comando; tecla = getche();
}

19
19
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


115 116

Exemplo 2 do while
n O exemplo anterior pode ser reescrito n Ao contrário do loop for e do loop while,
sem utilizar variável. Veja: que testam a condição no começo do
main() loop, o loop do while verifica a condição
{ somente no final. Desta forma, o loop
printf(“Tecle ESPAÇO para continuar...”); será executado pelo menos uma vez. A
while (getche() != ‘ ’); forma geral do loop do while é:
} do {
comando;
} while (condição);

Curso de Linguagem C Curso de Linguagem C


117 118

Exemplo Loops aninhados


/* Lê um número maior que 100 */ n Quando um loop está dentro do outro,
main() dizemos que o loop interior está
{ aninhado.
int num; n Loops aninhados permite que sejam
do { solucionados vários problemas de
printf(“Digite um número maior que 100”); programação.
scanf(“%d”, &num); n Em C podemos aninhar qualquer tipo
} while (num <= 100); de loop.
}

Curso de Linguagem C Curso de Linguagem C


119 120

Exemplo Interrupção de loops


/* exibir uma tabela de potências dos números de 1 a 9*/
n Quando precisamos encerrar um loop
main()
{ int i, j, k, temp; sem que sua condição de encerramento
printf(“\ti\ti^2\ti^3\ti^4\n”); esteja satisfeita, podemos utilizar o
for (i = 1; i < 10; i ++) { /* loop externo */
comando break.
for (j = 1; j < 5; j ++) { /* primeiro nível de aninhamento */
temp = 1; n O comando break é especialmente útil
for (k = 0; k < j; k ++) /* loop mais interior */ quando algum evento externo controle
temp = temp * i;
printf(“%8d”, temp); um loop.
}
}
}

20
20
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


121 122

Comando continue Exemplo


n O comando continue funciona de /* programa para imprimir os números pares
maneira parecida com o comando entre 0 e 98 */
break. Porém, em vez de forçar o main()
encerramento, continue força a próxima {
iteração do loop e pula o código que int x;
estiver no meio. for (x = 0; x < 100; x ++) {
if (x % 2) continue;
printf(“%d ”, x);
}
}

Curso de Linguagem C Curso de Linguagem C


123 124

Vetores Declarando vetores


n Vetores são uma coleção de variáveis n A forma geral da declaração de um
do mesmo tipo que são referenciadas vetor é:
pelo mesmo nome. tipo nome_var[tamanho];
n Em C, um vetor consiste em locações n Onde
contíguas de memória. • tipo é o tipo base do vetor e
n O elemento mais baixo corresponde ao
• tamanho é a quantidade de elementos que
o vetor conterá
primeiro elemento e o mais alto ao
último.
n O vetor mais utilizado é o de caracteres.

Curso de Linguagem C Curso de Linguagem C


125 126

Acessando um vetor Exemplo


n Os vetores são acessados através de main()
índices colocados entre colchetes. {
n O índice do primeiro elemento do vetor int x[10]; /* vetor com 10 elementos int */
é 0 (ZERO). int t;
int amostra[10]; /* vetor de 10 inteiros */
amostra[0] /* primeiro elemento */ for (t = 0; t < 10; t ++)
amostra[9] /* último elemento */ x [ t ] = t;
}

21
21
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


127 128

Limites dos vetores Strings


n C não faz checagem dos limites dos n Uma string é por definição, um vetor de
vetores, isto é responsabilidade do caracteres terminado em 0. Então, para
programador. Logo, o código a seguir declarar a string, devemos declarar
não causará nenhum erro. sempre um elemento a mais para o
int elementos[10]; terminador. Veja que
elementos[12] = 0; char mensagem[10] = “Exemplo”
elementos[10] = 0; n Ficará armazenado na memória como:

E x e m p l o \0

Curso de Linguagem C Curso de Linguagem C


129 130

Funções para manipular strings gets


Função Finalidade n Lê uma string do teclado.
gets Lê uma string do teclado n Forma geral:
puts Imprime uma string na tela gets(nome_string);
strcpy Copia uma string em outra
n Exemplo:
srtcat Concatena strings
main()
strcmp Compara strings
strlen Retorna o tamanho da string { char str[80];
gets(str);
printf(“%s”, str);
}

Curso de Linguagem C Curso de Linguagem C


131 132

puts strcpy
n Mostra uma string na tela. n Copia uma string em outra.
n Forma geral: n Forma geral:
puts(nome_string); strcpy(para, de);
n Exemplo: n Lembre-se que a string para deve ser
main() grande o suficiente para conter de.
{ main()
puts(“Esta é uma mensagem”); { char str[80];
} strcpy(str, “alo”);
}

22
22
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


133 134

strcat strcmp
n Adiciona uma string em outra. n Compara 2 strings.
n Forma geral: n Forma geral:
strcat(s1, s2); strcmp(s1, s2)
n s2 será anexada ao final de s1. n A função retorna:
main()
{ char primeiro[20], segundo[10]; 0 se s1 igual a s2
strcpy(primeiro, “bom”); >0 se s1 > s2
strcpy(segundo, “ dia”); <0 se s2 > s1
strcat(primeiro, segundo);
printf(“%s\n”, primeiro);
}

Curso de Linguagem C Curso de Linguagem C


135 136

strlen Matrizes bidimensionais


n Retorna o tamanho da string n C permite que sejam declaradas
n Forma geral: matrizes bidimensionais.
strlen(str); n Forma da declaração:

n Exemplo: tipo nome_var[dimensão1][dimensão2];


main() n Exemplo:
{ char str[80]; char tabela[5][5];
printf(“Digite uma string: ”);
gets(str);
printf(“Tamanho: %d\n”, strlen(str));
}

Curso de Linguagem C Curso de Linguagem C


137 138
Acessando os elementos das
Matrizes multidimensionais matrizes multidimensionais
n De forma semelhante as matrizes main()
bidimensionais, declaramos as {
multidimensionais. Veja por exemplo int numeros[4][3], i, j;
uma matriz de 4 dimensões: for (i = 0; i < 4; i ++)
int matriz[5][7][3][8]; for (j = 0; j < 3; j++)
numeros[ i ][ j ] = i * j;
}

23
23
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


139 140

Matrizes de strings Inicialização de matrizes


n Uma matriz bidimensional de caracteres n C permite que as matrizes globais
pode ser interpretada como uma matriz sejam inicializadas.
de strings. n A forma geral é:
main() tipo nome_matriz[tam1]...[tamN] = {lista de
{ char strings[5][20]; /* 5 strings */ valores}
int i; n Exemplo:
for (i = 0; i < 5; i ++) int i[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
gets(strings[ i ]);
}

Curso de Linguagem C Curso de Linguagem C


141 142

Exemplo Declarando vetores sem tamanho


int quadrados[5][2] = { n Podem ser declarados vetores sem
1, 1, especificar explicitamente seus
2, 4, tamanhos. Os vetores devem ser
3, 9, inicializados na declaração. O tamanho
4, 16, será definido na inicialização.
5, 25}; n Exemplo:
1 1
2 4 char mensagem[ ] = “Esta é uma string”;
quadrados = 3 9
4 16
5 25

Curso de Linguagem C Curso de Linguagem C


143 144

Exercícios Modelos de memória


n Faça um programa que leia 3 nomes n A definição de modelos de memória foi
com suas respectivas idades e mostre o a forma utilizada para contornar as
maior e o menor. limitações de segmentos em
n Faça um programa que leia 5 números computadores IBM PC.
e imprima “Números altos” se mais do Modelo Código Dados
que 3 deles forem maiores que 5, caso Tiny 1
contrário, imprima “Números baixos”. Small 1 1
Medium mais de 1 1
Compact 1 mais de 1
Large mais de 1 mais de 1
Huge mais de 1 mais de 1

24
24
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


145 146

Ponteiros Motivos para usar ponteiros


n Entender e usar corretamente os n Os ponteiros fornecem maneiras pelas
ponteiros são pontos cruciais para quais as funções podem modificar os
criação de programas bem-sucedidos argumentos recebidos.
em C. n Dão apoio às rotinas de alocação
n Além dos ponteiros serem uma das dinâmica.
características mais fortes em C, n Podem substituir o uso vetores em
também é a mais perigosa. muitas situações para aumentar a
n É muito fácil usar ponteiros eficiência.
incorretamente causando erros difíceis
de serem encontrados.

Curso de Linguagem C Curso de Linguagem C


147 148

Ponteiros são endereços Ilustração de poteiros


n Um ponteiro é uma variável que contém Endereçamento Variável na
um endereço de memória. Isto é, eles de memória memória
possuem armazenam a localização de 1000 1003
outra variável dentro da memória do 1001
computador. 1002
n Então dizemos que um ponteiro aponta 1003
para esta variável. 1004
1005

Curso de Linguagem C Curso de Linguagem C


149 150

Variáveis ponteiros - declaração Os operadores de ponteiros


n A declaração de variáveis ponteiros, n Existem 2 operadores especiais de
segue a seguinte regra geral: ponteiros: & e *.
tipo *nome_var; n O operador & devolve o endereço da
n onde tipo é o tipo do elemento para o variável. É utilizado para fazer um
qual o ponteiro apontará. ponteiro apontar para ela.
n Exemplo: n O operador * devolve o valor
char *p; armazenado no endereço apontado
int *temp, *valor; pelo ponteiro.

25
25
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


151 152

Exemplo Expressões com ponteiros


main() n C permite que sejam feitas expressões
{ int numero = 5, *p; com ponteiros e elas seguem as
p = &numero; mesmas regras das outras expressões
printf(“%d %d\n”, numero, *p); em C.
*p = 3; n Quando se compara um ponteiro com
printf(“%d %d\n”, numero, *p); outro, estamos comparando seus
numero = 7; endereços. Isto é útil quando ambos os
printf(“%d %d\n”, numero, *p); ponteiros apontam para elementos de
} um vetor.

Curso de Linguagem C Curso de Linguagem C


153 154

Ponteiros e vetores Exemplo


n Existe um relacionamento muito n Após a definição:
próximo entre os ponteiros e os vetores. char str[80], *p;
Veja o código: p = str;
char str[80], *p; n são equivalentes os acessos ao quinto
p = str; elemento de str:
n Este código faz com que p aponte para str[4]
o primero elemento do vetor, pois um *(p + 4)
vetor sem o índice se comporta como p[4]
um ponteiro para seu primeiro
elemento.

Curso de Linguagem C Curso de Linguagem C


155 156

Problemas com ponteiros Dois erros comuns


n É muito fácil errar quando se trabalha /* este programa está /* este programa está
errado */ errado */
com ponteiros em C.
n Algumas vezes, os erros com ponteiros main() main()
só aparecem quando o programa { {
cresce. int x, *p; int x, *p;
x = 10; x = 10;
n Ponteiros que não foram inicializados,
*p = x; p = x;
apontam para um lugar desconhecido
} printf(“%d”, *p);
na memória, que pode ser inclusive o }
código do programa.

26
26
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


157 158

Alocação dinâmica de memória Funções de alocação dinâmica


n A linguagem C permite que seja feita n Alocar um bloco de memória
alocação dinâmica de memória, isto é, void *malloc(int número_de_bytes);
solicitar memória a medida que ela for void *calloc(unsigned num, unsigned tam);
sendo necessária. n Liberar um bloco de memória
n Programas que utilizam listas, pilhas, e void free(void *p);
outros tipos de dados complexos cuja n Alterar o tamanho de um bloco de
quantidade máxima não é definida memória
durante a compilação, trabalham com
void *realloc(void *p, unsigned tam);
alocação dinâmica de memória.

Curso de Linguagem C Curso de Linguagem C


159 160

Exemplo 1 Exemplo 2
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
main() main()
{ char *str; { float *p;
str = (char *) malloc(101 * sizeof(char)); p = (float *) calloc(100, sizeof(float));
if (str) { if (!p) {
strcpy(str, “Isto é um teste”); printf(“alocação fracassada - abortado”);
printf(“%s”, str); exit(1);
free(str); }
} free(p);
} }

Curso de Linguagem C Curso de Linguagem C


161 162

Funções Forma geral


n Funções são os blocos de contrução n A forma geral da declaração de uma
em que ocorrem todas as atividades do função é:
programas. tipo nome_função(lista_parâmetros)
n Programar utilizando funções é reduzir declaração de parâmetros
a complexidade do código e simplificar {
sua escrita. corpo da função
}
n Caso não seja especificado o tipo da
função, ela será do tipo int.

27
27
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


163 164

Comando return Exemplo


n O comando return possui duas /* retorna 1 se o parâmetro > 10 */
utilidades básicas: int maior_que_dez(int x)
• Causar a saída imediata da função na qual {
ele se encontra, retornando para o código return (x > 10);
de chamada. }
• Devolver um valor para a função
chamadora.

Curso de Linguagem C Curso de Linguagem C


165 166
Chamadas por valor e por
Argumentos referência
n Quando é necessário passar alguma n Existem duas formas de se passar um
informação extra para uma função, esta parâmetro para uma função, utilizando
informação será passada através de chamadas por valor ou por referência.
argumentos. n Quando um parâmetro é passado por valor,
n Para chamar uma função com argumentos, as alterações efetuadas na função não
eles devem ser colocados entre parênteses afetarão a variável da função chamadora.
após o identificador da função. Veja: n Quando um parâmetro é passado por
puts(“Atenção”); referência, qualquer alteração efetuada pela
n a string “Atenção” é o argumento função afetará a variável da função
passado para a função puts. chamadora.

Curso de Linguagem C Curso de Linguagem C


167 168

Exemplo Observações
main() n Vetores são passados por referência.
{ int x = 3, y = 4;
printf(“%d %d\n”, x, y);
n Quando uma função é feita para
processa(x, &y); receber um parâmetro por referência, o
printf(“%d %d\n”, x, y); parâmetro deve ser declarado como um
} ponteiro na lista de argumentos da
função.
int processa(int a, int *b) n Para conjuntos grandes de dados, a
{ a = 6;
passagem de parâmetros por referência
b = 7;
}
é mais rápida.

28
28
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


169
Argumentos argc e argv para 170

main() Exemplo
n A função main também recebe /* Função para imprimir os parâmetros */
argumentos. Eles são os parâmetros da main(int argc, char *argv[ ])
linha de comando passados ao {
programa. Os dois parâmetros são argc int i;
e argv. Veja como eles devem ser for (i = 0; i < argc; i ++)
declarados: printf(“argv[%d]: %s\n”, i, argv[i]);
main(int argc, char *argv[ ]) }
n Argc conterá o número de parâmetros
passados e argv conterá os
parâmetros.

Curso de Linguagem C Curso de Linguagem C


171
Funções que devolvem não 172

inteiros Protótipos
n Quando o tipo de uma função não é n Como vimos, as funções que não
declarado, por default, ele será int. retornam int, devem ser identificadas
n Se for necessário definir uma função que antes de serem referenciadas, para
retorna valores de outros tipos, o tipo deve isto, deve ser definido um protótipo para
ser especificado.
a função.
n Quando a função não é do tipo int, ela deve
n Forma geral
ser identificada antes de ser chamada da
primeira vez. Assim, o compilador poderá tipo nome_função(tipo_parâmetros);
gerar um código correto para a chamada à
função.

Curso de Linguagem C Curso de Linguagem C


173 174

Exemplo Recursividade
float metade(float); n A linguagem C permite que as próprias
main() funções se chamem. A esta
{ característica damos o nome de
printf(“%f\n”, metade(3)); recursividade.
} n Existem muitos problemas que se
float metade(float numero) tornariam extremamente difíceis de
{ serem implementados sem a
return (numero / 2); recursividade.
}

29
29
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


175 176

Preprocessador #define
n Antes do programa ser compilado, ele é n O comando define serve para definir um
submetido ao preprocessador. Esta identificador e uma string. O compilador
característica é muito útil. substituirá o identificador pela string
n Todos os comandos do preprocessador toda vez que for encontrado no arquivo-
são iniciados por um sinal #, sendo os fonte. O identificador é chamado de
dois mais usados: nome de macro, e o processo de
• #define substituição é chamado de substituição
• #include de macro.
#define indentificador string

Curso de Linguagem C Curso de Linguagem C


177 178

Exemplo #include
#define mensagem “Isto é um teste.\n” n Instrui o compilador a incluir um outro arquivo
#define verdadeiro 1 fonte com aquele que contém o comando
#include. O nome do arquivo a ser incluído deve
#define falso !verdadeiro estar entre aspas ou entre o sinal de maior e
menor.
main() n Se o nome do arquivo for colocado entre aspas,
{ o compilador procurará pelo arquivo na seguinte
seqüência: diretório atual, diretórios configurados
if (verdadeiro) printf(mensagem); no compilador e diretórios padrões. Caso o nome
if (falso) printf(mensagem); do arquivo esteja entre < >, não será procurado
} no diretório atual.

Curso de Linguagem C Curso de Linguagem C


179 180

Entrada e saída Arquivo cabeçalho stdio.h


n A entrada e saída em C é feita n Muitas bibliotecas em C exigem que
utilizando-se funções da biblioteca do certos tipos de dados ou outras
compilador, não existe nenhuma informações sejam partes dos
palavra reservada para esta finalidade. programas que as usam. Para isto, é
n Existem dois sistemas de entrada e necessário utilizar o comando #include
saída em C: e incluir arquivos cabeçalho com estas
• Bufferizado definições nos programas.
• Não bufferizado #include <stdio.h>
n O padrão ANSI só define o primeiro.

30
30
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


181 182

Filas de bytes Arquivos


n O sistema de arquivo bufferizado n Em C, um arquivo é um conceito lógico
destina-se a trabalhar com uma que o sistema pode aplicar a qualquer
variedade de dispositivos, que inclui coisa, desde arquivos em disco até
terminais, acionadores de disco e terminais.
acionadores de fita. n Para associar uma fila de bytes a um
n Embora cada dispositivo seja diferente, determinado arquivo, basta realizar
o sistema de arquivo bufferizado uma operação de abertura.
transforma cada um em um dispositivo n Todas as filas de bytes são iguais.
lógico chamado fila de bytes. n Nem todos os arquivos são iguais.

Curso de Linguagem C Curso de Linguagem C


183
Sistema de entrada e saída 184

buferizado O ponteiro do arquivo


n O sistema de entrada e saída n É o que mantém unido o sistema de
bufferizado é composto de várias entrada e saída bufferizado.
funções relacionadas. n É um ponteiro para a informação que
n Para utiliza-las, é necessário incluir o define vários aspectos do arquivo,
arquivo-cabeçalho stdio.h no programa. incluindo nome, status e posição
corrente.
n Um ponteiro de arquivo é uma variável
de ponteiro do tipo FILE, que é definida
em stdio.h.

Curso de Linguagem C Curso de Linguagem C


185 186

Algumas funções fopen()


Nome Função
n Abre uma fila de bytes para ser usada e liga
fopen() abre uma fila um arquivo a esta fila.
fclose() fecha uma fila n Protótipo:
putc() grava um caracter na fila FILE *fopen(char *nome_arq, char *modo);
getc() lê um caracter na fila
fseek() ajusta a posição atual no arquivo
n onde modo é uma string que contém o status
fprintf() printf para a fila de abertura desejado.
fscanf() scanf para a fila n nome_arq é uma string com um nome de
feof() indica se a marca EOF foi encontrada arquivo válido para o sistema operacional,
ferror() indica se ocorreu um erro podendo incluir drive e diretório.
rewind() reposiciona no início do arquivo
remove apaga um arquivo n Retorna NULL ( = 0 ) se a função falhar.

31
31
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


187 188

Valores legais de modo fclose()


Modo Significado
r abre um arquivo-texto para leitura n Fecha uma fila que foi aberta com
w cria um arquivo-texto para gravação
a anexa a um arquivo-texto fopen().
rb abre um arquivo binário para leitura
wb cria um arquivo binário para gravação n Todas as filas devem ser fechadas
ab anexa a um arquivo binário
r+ abre um arquivo-texto para leitura/gravação antes que o programa termine.
w+ cria um arquivo-texto para leitura/gravação
a+ abre ou cria um arquivo-texto para leitura/gravação n Protótipo:
r+b abre um arquivo binário para leitura/gravação
w+b cria um arquivo binário para leitura/gravação int fclose(FILE *arquivo);
a+b abre um arquivo binário para leitura/gravação
rt abre um arquivo-texto para leitura
wt cria um arquivo-texto para gravação
at anexa a um arquivo-texto
r+t abre um arquivo-texto para leitura/gravação
w+t cria um arquivo-texto para leitura/gravação
a+t abre ou cria um arquivo-texto para leitura/gravação

Curso de Linguagem C Curso de Linguagem C


189 190

ferror() e rewind() getc() e putc()


n ferror() determina se a última operação n São utilizados para ler e gravar caracteres
com arquivos produziu um erro numa fila previamente aberta.
(devolvendo 1 caso tenha ocorrido). n Protótipo:
int putc(int caracter, FILE *arquivo);
n rewind() reposiciona no início do
int getc(FILE *arquivo);
arquivo.
n putc devolve o caracter gravado em caso de
n Protótipos: sucesso, em caso de erro EOF(definido em
int ferror(FILE *arquivo); stdio.h) será devolvido.
void rewind(FILE *arquivo); n getc devolve um inteiro mas com o byte
superior zero. Ele devolve EOF quando
alcançar o fim do arquivo.

Curso de Linguagem C Curso de Linguagem C


191 192

fprintf() e fscanf() fgets() e fputs()


n São os correspondentes a printf e scanf n São as correspondentes a gets e puts
do sistema de entrada e saída do para arquivos.
console. A diferença é que o primeiro n Protótipos:
parâmetro é um ponteiro de arquivo.
char *fputs(char *str, FILE *arquivo);
n Protótipos: char *fgets(char *str, int comprimento, FILE
int fprintf(FILE *arq, const char *controle, ...); *arquivo);
int fscanf(FILE *arq, const char *controle, ...); n Observe que em fgets pode ser
especificado o comprimento máximo da
string e, ao contrário do gets, o \n final é
colocado na string.

32
32
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


193 194

getw() e putw() fread() e fwrite()


n São utilizadas para ler e gravar inteiros. n São funções utilizadas para ler e gravar blocos de
dados nos arquivos.
n Elas trabalham exatamente como getc n Protótipos:
e putc com exceção de gravarem int fread(void *buffer, int tamanho, int quantidade, FILE
*arquivo);
inteiros. int fwrite(void *buffer, int tamanho, int quantidade, FILE
n Protótipos: *arquivo);
n buffer é um ponteiro para a região da memória que
int getw(FILE *arquivo);
possui os dados, tamanho é o tamanho em bytes de
int putw(int numero, FILE *arquivo); cada unidade, quantidade determina quantos itens
(cada um contendo tamanho bytes) serão lidos ou
gravados e arquivo é um ponteiro de arquivo para
uma fila previamente aberta.

Curso de Linguagem C Curso de Linguagem C


195 196
As filas de bytes stdin, stdout e
fseek() stderr
n É utilizado para efetuar operações de leitura e n Existem 3 filas de bytes especiais que
gravação aleatórias sob o sistema de entrada e
saída bufferizado. são abertas automaticamente quando o
n Protótipo: programa é inicializado:
int fseek(FILE *arquivo, long int num_bytes, int origem); • stdin entrada padrão
n fseek retorna zero em caso de sucesso. • sdtout saída padrão
n Arquivo é o ponteiro de arquivo, num_bytes é o
• stderr erro padrão
número de bytes desde origem até chegar a nova
posição e origem é um dos seguintes macros: n Elas podem ser usadas para efetuar
Origem Nome operações de entrada e saída no
início do arquivo SEEK_SET
posição corrente SEEK_CUR console.
fim do arquivo SEEK_END

Curso de Linguagem C Curso de Linguagem C


197 198

Exemplo Exemplo (continuação)


#include <stdio.h> if (!(saida = fopen(argv[2], “wb”)) {
main(int argc, char *argv[ ]) printf(“Arquivo destino não pode ser aberto.\n”);
{ FILE *entrada, *saida; exit(1);
char ch; }
if (argc != 3) { /* esta é a linha que copia o arquivo */
printf(“Não foi digitado o nome da origem.\n”); while (!feof(entrada)) putc(getc(entrada), saida);
exit(1); fclose(entrada);
} fclose(saida);
if (!(entrada = fopen(argv[1], “rb”)) { }
printf(“arquivo de origem não achado.\n”);
exit(1);
}

33
33
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


199
Tipos de dados definidos pelos 200

usuários Estruturas
n Em C podem ser criados 5 tipos n Em C, uma estrutura é uma coleção de
diferentes de dados personalizados: variáveis que são referenciadas pelo mesmo
nome.
• estrutura
n É uma forma conveniente de manter juntas
• campo de bit
informações relacionadas.
• união
n Forma geral:
• enumeração struct nome_estrutura {
• typedef tipo1 var1;
n O uso de tipos definido pelo usuário tipo2 var2;
facilita a programação e dá maior poder } var_estrutura;
ao programador.

Curso de Linguagem C Curso de Linguagem C


201
Declarando variáveis do tipo 202
Acessando variáveis do tipo
estrutura estrutura
n Além de poder declarar variáveis do n Para acessar variáveis do tipo
tipo da estrutura durante a definição da estrutura, utiliza-se o operador . (ponto).
estrutura, elas podem ser declaradas n Forma geral:
da seguinte forma: nome_variavel.nome_elemento;
struct nome_estrutura nome_variável;

Curso de Linguagem C Curso de Linguagem C


203 204

Exemplo Vetores e matrizes de estruturas


struct pessoa { n Podem ser declarados vetores e
char nome[21]; matrizes de estruturas, para isto,
int idade; usamos a forma geral:
} primeiro; struct nome_estrutura nome_var[t1][t2]...[tn];
main() { n Exemplo:
struct pessoa segundo; struct pessoa pessoas[5];
strcpy(primeiro.nome, “José”);
primeiro.idade = 20;
segundo = primeiro;
}

34
34
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


205 206
Vantagens de se usar ponteiros
Ponteiros para estruturas para estruturas
n Em C, podem ser declarados ponteiros n Fazer chamada por referência para
para estruturas. uma função;
n Forma geral: n Criar listas ligadas com estruturas
struct pessoa *primeiro; dinâmicas de dados usando o sistema
de alocação.
n É mais rápido passar estruturas
grandes por referência (usando
ponteiros) do que por valor, pois
estamos passando apenas um
endereço.

Curso de Linguagem C Curso de Linguagem C


207
Acessando os elementos usando 208
Vetores, matrizes e estruturas
ponteiros para estruturas dentro de estruturas
n Veja a declaração: n Os elementos das estruturas podem ser
struct pessoa *primeiro, segundo; simples ou complexos, assim, podemos
strcpy(segundo.nome, “José”); colocar vetores, matrizes e até
segundo.idade = 10; estruturas dentro das estruturas. Veja:
primeiro = &segundo; struct complexa {
n Para acessar o campo idade de char setor[21];
primeiro: struct pessoa funcionarios[50];
(*primeiro).idade }
primeiro -> idade

Curso de Linguagem C Curso de Linguagem C


209 210

Campos de bit Como declarar campos de bit


n C possui metodos para acessar n Os campos de bit só podem ser
somente um bit dentro de um byte. Isto declarados dentro de estruturas.
é útil para: n Forma geral:
• Economizar memória declarando várias struct nome_estrutura {
variáveis booleanas num só byte tipo1 var1 : comprimento;
• Comunicar com dispositivos que tipo2 var2 : comprimento;
transmitem informações diversas
} nome_var ;
codificadas em bytes
• Rotinas de codificação que precisam n Os tipos podem ser: int, signed e
acessar bits dos bytes unsigned. Quando o tamanho é 1, ele
deve ser obrigatoriamente unsigned.

35
35
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


211 212

Exemplo Uniões
struct dispositivo { n Em C, uma união é uma localização de
unsigned ativo : 1; memória que é usada por muitas
unsigned pronto : 1; variáveis diferentes, que podem ser de
unsignet erro : 1; tipos diferentes.
unsigned : 2; n A declaração e o acesso a uma união é
unsigned ultimo_erro : 3; feita de forma semelhante as
} estruturas, só que usando a palavra
reservada union no lugar de struct.

Curso de Linguagem C Curso de Linguagem C


213 214

Exemplo Enumerações
union dois_bytes { n Enumeração é um conjunto de
int inteiro; constantes inteiras com nome e e
char caracter[2]; especifica todos os valores legais que
} valor; uma variável daquele tipo pode ter.
main() n Para declarar:
{ enum nome_tipo { lista de constantes }
valor.inteiro = ‘A’ * 256 + ‘B’; nome_var;
printf(“%c %c”, valor.caracter[0], n Todas as constantes receberão valores
valor.caracter[1]); inteiros a começar por zero, a não ser
} que seja especificado o contrário.

Curso de Linguagem C Curso de Linguagem C


215 216

Exemplo sizeof
enum tamanhos {pequeno, medio, grande = n Como estamos trabalhando só com
5} tamanho; computadores IBM PC, até agora, não nos
main() preocupamos com os tamanhos das
{ variáveis pois já sabemos seus valores.
tamanho = pequeno; printf(“%d”, tamanho); n C possui o operador sizeof com a finalidade
de garantir a portabilidade dos programas
tamanho = medio; printf(“%d”, tamanho); entre ambientes cujos tamanhos das
tamanho = grande; printf(“%d”, tamanho); variáveis sejam diferentes.
} n sizeof retorna a quantidade de bytes que
uma variável ocupa na memória.

36
36
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


217 218

Exemplos typedef
n Alocar memória para 10 floats: n C permite que sejam definidos
float *numeros; explicitamente novos tipos de dados
numeros = (float *) calloc(10, sizeof(float)); usando a palavra reservada typedef.
n Imprimir o tamanho gasto por uma n typedef não cria realmente uma nova
variável inteira: classe de dados, mas sim define um
printf(“%d”, sizeof(int)); novo nome para uma tipo já existente.
n O uso do typedef torna os programas
em C mais legíveis e mais portáteis
pois bastará alterar a definição do
typedef quando trocar de ambiente.

Curso de Linguagem C Curso de Linguagem C


219 220

Exemplo Operadores avançados


n Após as definições: n C possui vários operadores especiais
typedef float balanco; que aumentam em muito sua força e
typedef char string[21]; flexibilidade - especialmente na
typedef struct pessoa tipo_pessoa; programação a nível de sistema.
n As seguintes declarações serão
equivalentes:
balanco valor; float valor;
string frase; char frase[21];
tipo_pessoa aluno; struct pessoa aluno;

Curso de Linguagem C Curso de Linguagem C


221 222

Operadores bit a bit Tabela dos operadores bit a bit


n Como C foi projetada para substituir a
linguagem assembly na maioria das Operador Ação
tarefas de programação, ela possui um & E
| OU
completo arsenal de operadores bit a
^ OU exclusivo (XOR)
bit.
~ Complemento de um (NOT)
n Os operadores bit a bit só podem ser >> Deslocar para direita
usados nos tipos char e int. << Deslocar para esquerda

37
37
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


223 224

Operador ? Exemplo
n O operador ? pode ser usado para n A seqüência de comandos:
substituir comandos if / else que x = 10;
tenham a forma geral: if (x > 9) y = 100;
if (condição) else y = 200;
expressão1; n pode ser substituída por:
else x = 10;
expressão2; y = x > 9 ? 100 : 200;
n Forma geral:
condição ? expressão1 : expressão 2;

Curso de Linguagem C Curso de Linguagem C


225 226

Formas abreviadas Operador vírgula


n C permite que sejam escritas formas n O operador vírgula é usado para juntar
abreviadas dos comandos de várias expressões. O compilador
atribuição. Os comandos: sempre avalia o lado esquerdo da
x = x + 10; vírgula como void. Assim, a expressão
y = y * 20; do lado direito ficará sendo o valor de
z = z - 5; toda expressão separada por vírgula.
n podem ser reescritos da forma: n Por exemplo:
x += 10; x = (y = 3, y + 1);
y *= 20; n Atribuirá 3 a y e 4 a x.
z -= 5;

Curso de Linguagem C Curso de Linguagem C


227 228

Parênteses e colchetes Resumo de precedência


Maior ( ) [ ] ->
n C considera os parênteses e os ! ~ ++ -- - (type cast) * & sizeof
colchetes como operadores. */%
+-
n Os parênteses executam a tarefa << >>
esperada de aumentar a precedência < <= >=
== !=
dos operadores que estão dentro deles. &
^
n Os colchetes executam a indexação de |
vetores e matrizes. &&
||
?
= += -= *= /=
Menor ,

38
38
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


229 230

Funções comuns Funções matemáticas


n A biblioteca padrão de funções da n Os protótipos das funções matemáticas ficam
linguagem C é muito ampla. no arquivo math.h. Veja alguns protótipos:
double sin(double arg);
n Os programas em C fazem uso intenso
double cos(double arg);
das funções da biblioteca. double tan(double arg)
n Os programadores iniciantes tendem a double exp(double arg);
reescrever funções já existentes nas double log(double num);
bibliotecas. double log10(double num);
double pow(double base, double exp);
double sqrt(double num);

Curso de Linguagem C Curso de Linguagem C


231
Alguns erros comuns de 232
Erros de ordem de
programação processamento
n Por ser uma linguagem que dá muito n Os operadores de incremento e
poder ao programador, também é muito decremento são usados na maioria dos
fácil de errar em C. programas em C, e a ordem de
n Como o compilador aceita praticamente ocorrência da operação é afetada pelo
tudo o que se escreve, o programador fato de esses operadores precederem
deve ter atenção redobrada na hora de ou sucederem a variável. Logo, se y=10
programar. x = y++;
n será diferente de
x = ++y;

Curso de Linguagem C Curso de Linguagem C


233 234

Problemas com ponteiros Redefinindo funções


n O mau-uso de ponteiros em C pode n É possível, mas não recomendado, que seja
criada uma função com o mesmo nome de
causar muitos problemas. Veja os dois
uma existente na biblioteca de C. Isto fará
exemplos ERRADOS abaixo: com que qualquer chamada a esta função
int *x; seja direcionada para a nova.
char *p; n A pior parte é que, mesmo o nosso programa
*p = malloc(100); não referenciando uma função da biblioteca,
*x = 10; as próprias funções da biblioteca podem
estar se referenciando, o que causará
problemas da mesma forma. Por exemplo, o
programador reescreveu a função getc mas
esqueceu-se que a função scanf a chama.

39
39
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


235 236

Erros por um Erros de limite


n Todos os índices dos vetores e n Muitas funções em C (inclusive as das
matrizes em C começam em 0. Logo, o bibliotecas) não possuem (ou possuem
programa abaixo está errado. pouca) verificação de limites. Assim, a
main() chamada a gets abaixo pode gerar um
{ problema caso o usuário digite mais
int x, num[100]; que 20 caracteres.
for (x = 1; x <= 100; x ++) main()
num[x] = x; { char texto[21];
} gets(texto);
}

Curso de Linguagem C Curso de Linguagem C


237
Omissões de declaração de 238

função Erros de argumentos de chamada


n Esquecer de definir o protótipo de uma n Os argumentos passados a uma função
função pode causar erro pois o devem ser do mesmo tipo do esperado
compilador estará esperando sempre por elas. O programa abaixo está
que as funções não declaradas errado:
retornem um inteiro. O mesmo main()
problema ocorre também com os {
parâmetros. int x;
char string[10];
scanf(“%d%s”, x, string);
}

Curso de Linguagem C Curso de Linguagem C


239 240

Exercício (parte 1) Exercício (parte 2)


n Faça um programa que leia 5 nomes n Vamos definir a função mais_velho que
com suas respectivas idades e mostre o recebe 2 ponteiros do tipo pessoa e
maior e o menor. retorna um ponteiro para a pessoa mais
n Vamos dividir o problema em partes, velha:
primeiro vamos definir uma estrutura pessoa *mais_velho(pessoa *p1, pessoa
contendo um campo nome e um campo *p2);
idade: {
typedef struct { if (p1 -> idade < p2 -> idade) return p2;
char nome[21]; else return p1;
int idade; } pessoa; }

40
40
Curso de Linguagem C

Curso de Linguagem C Curso de Linguagem C


241 242

Exercício (parte 3) Exercício (parte 4)


n Vamos definir a função mais_novo que n Vamos definir a função le_pessoa que
recebe 2 ponteiros do tipo pessoa e recebe um ponteiro do tipo pessoa e faz
retorna um ponteiro para a pessoa mais a leitura do teclado:
nova: void le_pessoa(pessoa *p)
pessoa *mais_novo(pessoa *p1, pessoa {
*p2); printf(“Nome: ”);
{ gets(p -> nome);
if (p1 -> idade > p2 -> idade) return p2; printf(“Idade: ”);
else return p1; scanf(“%d”, p -> idade);
} }

Curso de Linguagem C Curso de Linguagem C


243 244

Exercício (parte 5) Exercício (parte 6)


n Vamos definir a função mostra_pessoa n Agora só falta declarar as variáveis e
que recebe um ponteiro para uma definir o programa principal, que será
pessoa e mostra seus dados na tela. composto por um loop de entrada, um
void mostra_pessoa(pessoa *p) loop de pesquisa e a apresentação dos
{ resultados.
printf(“Nome: %s\nIdade: %d\n”, p->nome, n Dividindo o código do programa, fica
p->idade); mais fácil resolver os problemas e
} verificar os erros que possam ocorrer.

Curso de Linguagem C
245

Exercício (parte 7)
main()
{ pessoa pessoas[5], *velho, *novo;
int i;
for(i = 0; i < 5; i++) le_pessoa(&pessoas[i]);
velho = novo = pessoas;
for(i = 1; i < 5; i++) {
velho = mais_velho(velho, &pessoas[i]);
novo = mais_novo(novo, &pessoas[i]);
}
puts(“O mais novo é\n”); mostra_pessoa(novo);
puts(“O mais velho é\n”); mostra_pessoa(velho);
}

41
41

You might also like