Treinamento em
Desenvolvimento de
Aplicativos para Sistemas
Embarcados
Linguagem C
Linguagem C
1
Bibliografia
• Shildt, Herbert , C Completo e Total, Editora
Linguagem C
Makron Books, 3ªedição, São Paulo, 1997.
• Manzano, José augusto, Estudo Dirigido de
Linguagem C, Editora Érika, São Paulo,
1997.
2
Ementa
• Introdução
Linguagem C
• Operadores e Expressões
• Funções de E/S
• Estruturas de Controle
• Vetores e Matrizes
• Strings
• Ponteiros
• Funções
• Estruturas
• Alocação Dinâmica de Memória
• Arquivos
3
Introdução
• Histórico
Linguagem C
• C é resultado de um processo iniciado com a
linguagem BCPL. BCPL influenciou a linguagem
de nome B, que evoluiu posteriormente para C.
• Projetada em 1972, nos laboratórios da BELL
(empresa de desenvolvimento de software
básico), por Brian Kerninghan e Dennis Ritchie
para o UNIX do PDP-11.
• A simplicidade de sua implementação permitiu a
extensão da linguagem e a criação de compila-
dores C para praticamente todas as plataformas
de hardware e sistemas operacionais.
• Em 1983 estabeleceu-se o padrão ANSI.
4
Introdução
• Características
Linguagem C
• Portabilidade
• Linguagem estruturada e modular
• Geração de código eficiente
• Simplicidade
• Possui apenas 32 palavras chaves
• Uso de biblioteca de funções que implementam
os recursos de alto nível para o programador
• Linguagem de médio nível
• Combina facilidades de uma linguagem de alto nível com a
versatilidade e potencialidade do Assembly.
• Não efetua verificações em tempo de execução.
5
Introdução
• Aplicação
Linguagem C
– Sistemas Operacionais
– Compiladores
– Planilhas Eletrônicas
– Editores de Texto
– Banco de Dados
6
Introdução
• Linguagem de máquina: única linguagem que o
computador entende, ou seja, que pode ser
Linguagem C
diretamente executada pelo hardware. Ela é formada
por códigos binários que representam as instruções e
dados. Tem uso difícil e tedioso. Pode-se dizer que,
para se programar em linguagem de máquina é
necessário um amplo conhecimento do hardware
utilizado.
• Linguagem de alto nível: conjunto de instruções
mais compatíveis com a linguagem humana e com o
modo do ser humano pensar. Estas linguagens, na
sua maioria, são de uso genérico e não é necessário
ter conhecimento do hardware utilizado.
7
Introdução
• Todo programa escrito em linguagem de alto nível é
chamado de programa-fonte ou código fonte.
Linguagem C
• O programa em linguagem de máquina, escrito ou
resultante, é chamado de programa-objeto ou
código objeto.
• Todo o programa-fonte, para ser executado, deve
obrigatoriamente, de alguma forma, ser traduzido para
programa-objeto. Neste momento é que são
utilizados os compiladores e/ou interpretadores.
8
Introdução
•Interpretador: lê o código-fonte linha-a-linha,
Linguagem C
faz uma consistência de sua sintaxe e se não
houver erro, converte-a para linguagem de
máquina para executá-la. Este processo é
realizado até que a última linha seja
executada ou a consistência apresente algum
erro. O interpretador precisa estar presente
todas as vezes que vamos executar o nosso
programa e o trabalho de checagem da
sintaxe deverá ser repetido.
9
Introdução
• Compilador: lê o programa inteiro, faz uma
consistência de sua sintaxe e se não houver erro,
Linguagem C
gera o código-objeto em disco com a extensão .OBJ.
Este programa não pode ser executado até que
sejam agregadas a ele rotinas em linguagem de
máquina (biblioteca da linguagem) que lhe permitirão
a sua execução. Este trabalho é feito por um
programa chamado linkeditor, que cria o código-
executável final em disco com a extensão .EXE.
Neste momento não é mais necessária a presença
do compilador, pois todo o programa já esta
traduzido para linguagem de máquina e armazenado
em disco, basta rodá-lo.
10
Introdução
• C é uma linguagem compilada
Linguagem C
Executável
Fontes C
Compilação Ligação
+
Arquivos OBJ Bibliotecas
11
Estrutura de um programa em C
• Declaração das bibliotecas de funções (#include)
Linguagem C
• Declarações de constantes e seus valores (#define)
• Declaração das variáveis globais (públicas)
• Declaração das funções
• Única função obrigatória e primeira a ser executada
é a função main()
• O corpo das funções fica entre { }
main() /* função obrigatória */
{
printf(“Hello World”);
}
12
Estrutura de um programa em C
/* declaração dos arquivos de cabeçalho e definições */
#include <stdio.h>
Linguagem C
#define PI 3.1415
/* definição das variáveis globais */
/* função principal do programa */
void main()
{
/* definição das variáveis locais */
printf (“Hello World”);
}
13
Tipos básicos de dados
TIPO BITs BYTEs DESCRIÇÃO DOMÍNIO
Linguagem C
void 0 0 sem argumento e não retorna Sem valor
valor
char 8 1 caractere isolado -128 a 127
int 16 2 valor inteiro -32.768 a 32.767
float 32 4 número ponto-flutuante (no 3.4E-38 a 3.4E+38
contendo um ponto decimal
e/ou um expoente)
double 64 8 número ponto-flutuante de 1.7E-308 a
dupla precisão (mais 1.7E+308
algarismos significativos e um
expoente que pode ter mais
magnitude)
15
Modificadores de tipos básicos
signed char -128 a 127
Linguagem C
signed int -32.768 a 32.767
unsigned char 0 a 255
unsigned int 0 a 65.535
short int = int -32.768 a 32.767
unsigned short int = unsigned int 0 a 65.535
long int -2.147.483.648 a 2.147.483.647 (quatro bytes)
unsigned long int 0 a 4.294.967.295
long float = double (padrão ANSI)
long double dez dígitos de precisão (≅ 80 bits)
16
Identificadores
Identificadores são os nomes das variáreis,
Linguagem C
funções, rótulos e outros objetos definidos
pelo usuário.
• O primeiro caracter deve ser uma letra ou sublinhado
• Apenas os 32 primeiros caracteres são significativos
• É case sensitive, ou seja, maiúsculas se diferem das
minúsculas
• int x; /* é diferente de int X; */
• As instruções terminam com “;”
• Comentários devem ficar entre /* e */
• Palavras-chave são minúsculas
17
Declaração
int i;
Linguagem C
float f;
unsigned int inteiro_sem_sinal;
char ch;
double balanco, lucro, prejuizo;
int i, j, k;
int _exemplo_de_um_nome_longo;
long int A5k;
18
Primeiro Programa
1. Use o IDE Dev C++ para editar,
Linguagem C
compilar, linkar e executar o
programa Hello.c
2. Qual o tamanho dos arquivos C, OBJ
e EXE do programa Hello.c ?
3. Que conclusões você tira da
resposta da questão 2?
19
Ementa
• Introdução
Linguagem C
• Operadores e Expressões
• Funções de E/S
• Estruturas de Controle
• Vetores e Matrizes
• Strings
• Ponteiros
• Funções
• Estruturas
• Alocação Dinâmica de Memória
• Arquivos
20
Operadores
• Operador de Atribuição
Linguagem C
• Em C o operador de atribuição é o sinal de igual “=”.
• É erro comum em programadores iniciantes confundir
o “=” com o operador relacional de igualdade “==”.
• Exemplos:
a = 1;
delta = b * b – 4 * a * c;
i = j;
• O operando esquerdo deve ser um identificador de
variável, isto é, não pode ser uma constante ou
expressão. São atribuições inválidas:
1 = a; // constante!
b + 1 = a; // expressão!
21
Conversões de tipos
• Se os dois operandos de uma atribuição não são do
mesmo tipo, o valor da expressão ou operador da direita
Linguagem C
será convertido para o tipo do identificador da esquerda.
• Exemplo 1:
int i;
float r;
i = 5; // valor de i: 5
r = i; // valor de r: 5.0
• Exemplo 2:
int i;
float r = 654.321;
i = r; // i será truncado para 654
22
Conversões de tipos
• Pode-se dizer que as conversões potencialmente perigo-
Linguagem C
sas (onde há possibilidade de perda de informação) são:
char int float double
• Observe que o compilador C ao encontrar esta operação
não gera nenhum aviso de atenção para o programador.
Assim este detalhe pode gerar um erro de programação
(bug) que passe desapercebido ao programador
inexperiente. É possível dizer que a linguagem C possui
tipos ”macios” (soft types) pois a operação com variáveis
de tipos diferentes é perfeitamente possível. Esta
característica do C se contrapõe a algumas linguagens em
que isto não é possível. Estas linguagens possuem tipos
“duros” (hard types).
23
Operadores
• Atribuição Múltipla
Linguagem C
É possível atribuir um valor a muitas variáveis em
uma única instrução.
int i, j, k;
double max, min;
i = j = k = 1;
max = min = 0.0;
• Operadores Aritméticos
Operador Operação
+ adição
- subtração
* multiplicação
/ divisão
% módulo (resto da divisão inteira)
24
Conversão de tipo (casting)
• O operador cast permite forçar uma expressão a
ser de determinado tipo:
Linguagem C
int num;
float valor = 13.0;
num = valor % 2; // inválido
num =(int) valor % 2; // válido
A conversão de tipo é usada para que o dado
armazenado em valor fosse transformado no
tipo int assim a operação módulo pode ser
efetuada.
• Regra geral de conversão de tipos:
char int float double
25
Incremento/Decremento
Utilizados para incrementar e/ou decrementar em uma
unidade o valor de uma variável. Eles podem ser
Linguagem C
utilizados antes (prefixo) ou após (posfixo) a variável,
dando resultados ligeiramente diferentes.
Ex.:
Y = X ++; “Y recebe o valor de X e depois X é incrementado”
Y = X --; “Y recebe o valor de X e depois X é decrementado”
Y = ++ X; “X é incrementado e depois Y recebe o valor de X”
Y = -- X; “X é decrementado e depois Y recebe o valor de X”
26
Operadores Relacionais
• As expressões compostas com operadores
Linguagem C
relacionais comparam dois valores e
retornam 0 em caso de expressões falsas e
1 se forem verdadeiras.
Operador Operação
< Menor que
> Maior que
<= Menor que ou igual a
>= Maior que ou igual a
== Igual a
!= Diferente de
27
Operadores Lógicos
• Os operadores lógicos comparam duas expressões
Linguagem C
e retornam o valor 0 (falso) ou 1 (verdadeiro).
Operador Operação
&& AND (E)
|| OR (OU)
! NOT (NÃO)
• O operador unário ! tem maior precedência, seguido
do operador E lógico. O operador OU lógico tem a
menor precedência dentre os operadores lógicos.
28
Operadores Bit a Bit
• Os operadores de bit só podem ser
Linguagem C
utilizados com valores do tipo
caracter ou inteiro.
Operador Operação
<< Deslocamento à esquerda
>> Deslocamento à direita
& E bit a bit
| OU bit a bit
^ XOU bit a bit
~ Não bit a bit (complemento de um)
29
Operador Condicional (Ternário)
• O operador condicional (ou ternário) consiste de um
Linguagem C
ponto de interrogação (?) e um dois pontos (:)
usados juntos e requer três operandos.
V
resultado = modo > 0 ? 1 : 0;
F
a variável resultado receberá valor 1 se modo for
maior que 0, caso contrário receberá 0.
31
Expressões Reduzidas
Expressão normal Expressão reduzida
Linguagem C
soma = soma + cont; soma += cont;
d = d – 3; d-= 3;
y = y * (z+1); y*= z+1;
i = i / j; i/= j;
a = a & b; a &= b;
a = a << 3; a <<= 3;
32
Precedência dos Operadores
Maior ( ) [ ] ->
! ~ ++ -- - (tipo) * & sizeof
Linguagem C
* / %
+ -
<< >>
< <= > >=
== !=
&
^
|
&&
||
?:
= += -= *= /= etc.
Menor ,
33
Problemas
1. Escreva quatro instruções diferentes em C, cada uma subtraindo
1 da variável n.
Linguagem C
2. Escreva um bloco de código C que tem o mesmo efeito da
instrução
n = 100 + m++;
sem utilizar o operador de pós-incremento
3. Escreva um bloco de código C que tem o mesmo efeito da
instrução
n = 100 + ++m;
sem utilizar o operador de pré-incremento
4. Escreva uma instrução única em C que subtraia de z a soma de
x e y e depois incremente y.
5. Se m=5 e n=2, quais serão os valores de m e n após cada uma
das expressões:
a. m *= n++;
b. m += --n;
Instituto CERTI Amazônia. Treinamento para Sistemas Embarcados 34
Ementa
• Introdução
Linguagem C
• Operadores e Expressões
• Funções de E/S
• Estruturas de Controle
• Vetores e Matrizes
• Strings
• Ponteiros
• Funções
• Estruturas
• Alocação Dinâmica de Memória
• Arquivos
35
E/S pelo console
FUNÇÃO printf():
Linguagem C
A função printf() é utilizada para escrever na
tela. O protótipo desta função está descrito no
arquivo de cabeçalho <stdio.h>.
printf("string de controle", lista de argumentos);
A string de controle contém caracteres que
serão exibidos na tela, comandos de
formatação que dizem a printf() como exibir
os argumentos restantes ou ambos. Quando
encontra um comando de formatação, a
função liga os comandos aos argumentos.
36
E/S pelo console
Código Significado
%d Exibe um inteiro no formato decimal com
Linguagem C
sinal
%uExibe um inteiro no formato decimal sem sinal
%f Exibe um tipo float no formato decimal
%c Exibe um caractere
%s Exibe uma string
%oExibe um número octal sem sinal
%x Exibe um número hexadecimal sem sinal (letras
minúsculas)
%X Exibe um número hexadecimal sem sinal (letras
maiúsculas)
37
E/S pelo console
Exemplos:
printf("%s %d", "Esta é uma string ", 100);
Linguagem C
exibe:
Esta é uma string 100
printf("esta é uma string %d", 100);
exibe:
esta é uma string 100
printf("o número %d é decimal, %f é ponto flutuante.",10, 110.79);
exibe:
o número 10 é decimal, 110.79 é ponto flutuante.
printf("%s", "Alôn");
exibe:
Alô
e avança uma linha
printf(“%c, %d”,65,”C”);
exibe:
A, 67
38
E/S pelo console
FUNÇÃO scanf():
Linguagem C
A função scanf() é utilizada para leitura de dados
pelo teclado. O protótipo desta função está descrito
no arquivo de cabeçalho <stdio.h>.
scanf("string de controle", lista de argumentos);
A string de controle determina como os valores são
lidos para as variáveis apontadas na lista de
argumentos.
Todas as leituras devem ser finalizadas por
<ENTER>.
A lista de argumento deve conter os endereços das
variáveis a que devem ser atribuídos os valores.
39
E/S pelo console
Exemplos:
#include <stdio.h>
Linguagem C
main(){
int idade;
printf(“Digite um número: ”);
scanf(“%d”, &idade);
printf ("nA minha idade é %d", idade) ;
}
#include <stdio.h>
main(){
int pes;
float metros;
printf("Informe o número de pes: ");
scanf("%d", &pes);
metros = pes * 0.3048;
printf("n%d pés é %f metros", pes, metros); 40
}
E/S pelo console
Instruções Descrição
Linguagem C
getchar() lê um caracter do teclado aguardando
<Enter>
getche() lê um caracter do teclado e prossegue
getch() lê um caracter sem eco na tela e
prossegue
putchar() escreve um caracter na tela
gets() lê uma string do teclado
puts() escreve uma string na tela
41
Exercícios
1. Utilize o operador sizeof para exibir quanto
Linguagem C
espaço em bytes ocupa cada um dos tipos básicos
de C (char, int, float e double).
2. Leia uma temperatura em graus Centígrados e
apresentá-la convertida em graus Fahrenheit. A
fórmula de conversão é: F = (9 * C + 160) / 5. Exiba
o resultado com 3 casas decimais.
3. Faça um programa que leia um caractere e exiba
seu código ASCII equivalente.
4. Leia e exiba uma string com seu nome completo
usando a função scanf(). Qual o resultado obtido?
Justifique.
43
Ementa
• Introdução
Linguagem C
• Operadores e Expressões
• Funções de E/S
• Estruturas de Controle
• Vetores e Matrizes
• Strings
• Ponteiros
• Funções
• Estruturas
• Alocação Dinâmica de Memória
• Arquivos
44
Estruturas de Controle
• Governam o fluxo de execução do
Linguagem C
programa. Se dividem em três
categorias:
– Desvios Condicionais: if, operador
ternário (?:) e switch.
– Loop: while(), do-while(), for() e os
comandos continue e break.
– Desvio Incondicional: goto.
45
if
Sintaxe: if (expressão) comando;
Linguagem C
else comando;
onde, comando poder ser um único, um bloco de
comandos e, neste caso, usa-se os delimitadores
de bloco de comandos ( { } ) ou nenhum comando.
A cláusula else é opcional.
V
if (expressão)
comando;
F
else comando;
próximo comando; 46
if
Exemplo:
Linguagem C
main()
{
int a, b;
printf(“Digite dois números”);
scanf(“%d,%d”,&a,&b);
if (b) printf(“%fn”,(float)a/b);
else printf(“divisão por zeron”);
}
47
if aninhados
Ocorre quando um comando if é um objeto de um
Linguagem C
outro if ou else.
Sintaxe exemplo:
if ( i )
{
if ( k ) comando1;
if ( j ) comando2;
else comando3;
}
else comando4;
48
if – else - if
Sintaxe exemplo:
if (expressão) comando;
Linguagem C
else if (expressão) comando;
else if (expressão) comando;
else if (expressão) comando;
else comando;
Neste caso, as expressões são avaliadas de cima para
baixo. Assim que uma expressão for diferente de zero
(verdadeira), o comando associado a ela é executado e a
estrutura encerrada. Se nenhuma expressão for verdadeira,
será executado o comando associado ao último else e, se
ele não for declarado, nenhum comando será executado.
49
if – else - if
main(){
Linguagem C
int magico, adivinhacao;
randomize();
magico= random(10);
printf(“ADIVINHE: ”);
scanf(“%d”,&adivinhacao);
if (adivinhacao == magico){
printf(“ACERTOU”);
printf(“%d é o número mágicon”, magico);
} else if (adivinhacao > magico)
printf(“—errado– muito alton’);
else (“—errado– muito baixon’);}
50
Operador Ternário
main(){
Linguagem C
int x = 3, y = 7, max;
max = (x>y)?1:0;
printf(“max = %dn”,max);
}
51
switch
O comando de seleção switch é utilizado em caso de seleção múltipla. Ele
testa o valor de uma expressão contra uma lista de constantes inteiras ou
caracter. Quando o valor é igual, os comandos associados àquela
Linguagem C
constante são executados. Se nenhuma coincidência for encontrada os
comandos de default são executados.
switch(expressão)
{
case constante1:
comandos;
break;
case constante2:
comandos;
break;
.
default:
comandos;
}
52
switch
O comando break causa a saída imediata do switch. Se não existir um
comando break seguindo os comandos de um case, o programa segue
executando os comandos dos cases abaixo. Exemplo:
Linguagem C
void main() {
int dia;
clrscr();
printf(“Digite um dia da semana: “);
scanf(“%d”,&dia);
switch(dia) {
case 1: printf(“nDomingon”);
break;
case 2: printf(“nSegundan”);
break;
.
case 7: printf(“nSábadon”);
break;
default: printf(“nNúmero inválido!!!n”);
}}
53
Comandos de repetição
O comando de repetição é utilizado nos casos
Linguagem C
em que queremos repetir determinados
comandos.
Laço for
Sintaxe:
for(inicialização;condição;incremento) comando;
ou
for(inicialização;condição;incremento)
{
comandos;
}
54
for
Inicialização: é geralmente uma atribuição
Linguagem C
que determina o valor inicial da variável de
controle. Esta declaração pode ser feita
antes do laço e, desta forma, não necessita
ser declarada no escopo do comando.
Condição: é uma expressão que determina o
final do laço ou o valor final da variável de
controle.
Incremento: define como a variável de
controle do laço varia cada vez que o laço é
repetido.
55
for
Exemplo:
int x;
for(x=1;x<=100;x++) printf(“%d”,x);
Linguagem C
for(x=100;x!=65;x-=5) {
z=x*x;
printf(“o quadrado de %d é %f”,x,z);
}
O laço infinito:
for( ; ; ) printf(“este laço é infiniton”);
ch=”0”;
for( ; ; ){
ch=getchar();
if (ch==”A”) break; o comando break causa
o término imediato do laço
}
printf(“Você digitou A”);
56
while
Sintaxe: while(condição) comando;
Linguagem C
ou
while(condição)
{
comandos;
}
A condição pode ser qualquer expressão, e
verdadeiro é qualquer valor não-zero. Quando a
condição é falsa, o controle do programa passa para
o primeiro comando após o bloco de código do
comando while.
57
while
Exemplo:
void main(){
int t=1, dia;
Linguagem C
while(t) {
printf(“Digite um dia da semana, ou <99> para encerrar:
“);
scanf(“%d”,&dia);
switch(dia) {
case 1: printf(“nDomingon”);
break;
.
case 7: printf(“nSábadon”);
break;
case 99: printf(“nEncerrandon”);
t=0;
break;
default: printf(“nNúmero inválido!!!n”);
} /* fim switch*/
} /* fim while */
} /* fim main() */
58
do-while
Ao contrário dos laços for e while, que testam as
Linguagem C
condições no início, o do-while testa a condição no
final. Este laço sempre será executado pelo menos uma
vez e repete até que a condição se torne falsa.
Sintaxe: do
{
comando
} while (condição);
Exemplo:
do
{
scanf(“%d”,&num);
}while(num!=99);
59
Comandos de desvio
São utilizados para realizar desvios dentro de um
Linguagem C
programa.
• break:
O comando break tem duas finalidades. A primeira é
de terminar um case num comando switch e a
segunda é de forçar o término imediato de um laço
de repetição.
Exemplo:
for(t=0;t<100;t++){
print(“%d n”,t);
if(t==10) break; }
60
Comandos de desvio
• continue:
Linguagem C
Força a repetição (retorna ao início do laço
e testa a condição).
Exemplo:
for(x=0;x<100;x++){
if (x%2) continue;
print(“%d n”,x);
}
61
Comandos de desvio
• goto:
Linguagem C
Apesar das linguagens possuírem estruturas de
controle eficientes, também é disponibilizado o
comando de desvio. Deve-se ter um cuidado muito
grande, pois a sua utilização em demasia ou de forma
incorreta tende a tornar os programas ilegíveis.
A sua utilização é simples, basta declarar um rótulo
(identificador aceito pela linguagem C seguido de dois
pontos) e, de algum ponto do programa estabelecer o
desvio através da declaração goto rótulo;
Sintaxe: goto rótulo;
rótulo:
62
Comandos de desvio
Exemplo:
Linguagem C
int x=1;
retorno:
printf(“%d”,x);
x++;
if(x<=100) goto retorno;
63
Comandos de desvio
• exit():
Linguagem C
Assim como o comando break força o término de um
laço, a função exit() força o término de execução de
um programa, retornando ao sistema operacional.
Sintaxe:
void exit(código_de_erro);
onde código_de_erro é utilizado para indicar o
estado de retorno. Quando for zero, indica término
normal de execução e outros valores são utilizados
para indicar algum tipo de erro (retornado para a
variável ERRORLEVEL em arquivos “batch” do
DOS).
64
Lista de Exercícios
1. Anacleto tem 1,50 metro e cresce 2 centímetros por
Linguagem C
ano, enquanto Felisberto tem 1,10 metro e cresce 3
centímetros por ano. Calcule e exiba quantos anos
serão necessários para que Felisberto seja maior
que Anacleto.
2. Imprima os números perfeitos menores de 100.
Nota: Número perfeito é aquele cuja soma de seus
divisores, exceto ele próprio, é igual ao número.
Exemplo: 6 é perfeito porque 1 + 2 + 3 = 6.
3. Calcule e apresente o valor de S no seguinte
somatório:
S = 1/225 – 2/196 + 4/169 – 8/144 + ... + 16384/1
65
Ementa
• Introdução
Linguagem C
• Operadores e Expressões
• Funções de E/S
• Estruturas de Controle
• Vetores e Matrizes
• Strings
• Ponteiros
• Funções
• Estruturas
• Alocação Dinâmica de Memória
• Arquivos
66
Vetor
• Um vetor é uma matriz de uma dimensão
Linguagem C
capaz de armazenar um conjunto de variáveis
de mesmo tipo, referenciadas pelo seu nome e
por um índice.
• Sintaxe: tipo nome[tamanho];
• As variáveis são alocadas seqüencialmente
na memória.
• tamanho representa o número de elementos
suportado pelo vetor.
• O índice do vetor varia de 0 a (tamanho-1).
67
Vetor
Exemplo:
Linguagem C
main(){
int notas[5], i, soma=0;
for (i=0; i<5 ; i++) {
printf(“Digite a nota %d:”,i);
scanf(“%d”,¬as[i]); }
for (i=0; i<5 ; i++) soma = soma + notas[i];
printf(“Media = %f”, (float) soma/5);
}
Vetor notas 10 5 0 7 2
índices 0 1 2 3 4
68
Verificação de Limites
• A linguagem C não faz verificação automática dos
limites dos vetores.
Linguagem C
• O teste dos limites deve ser realizado pelo programa
e é erro comum de programação:
main()
{
int a[10],i;
for (i=1;i<=10;i++)
scanf(“%d”,&a[i]);
}
69
Exercícios
1. Leia dois vetores A e B com 5 elementos inteiros
Linguagem C
cada, calcule e escreva:
– O vetor S = A + B;
– O vetor W com os elementos intercalados de A e
B;
– O vetor Z obtido pela inversão da ordem de A;
– O vetor Q com os elementos comuns de A e B;
– O vetor Y correspondente à união de A e B;
– Coloque A em ordem crescente de seus
elementos.
70
Matrizes
• Possuem duas dimensões fazendo menção a linhas
Linguagem C
e colunas.
• Sintaxe: tipo nome[dim_linha][dim_coluna];
• Ex: int N[2][3];
Matriz N
5 6 7 Valores
0
1 6 7 8 Valores
Linha 0 1 2 Coluna
71
Inicialização de Matrizes
• C permite a inicialização de matrizes no
Linguagem C
momento da declaração. Ex:
int i[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9,
10};
int sqrs [5][2] = {
1, 1,
2, 4,
3, 9,
4, 16,
5, 25
};
73
Matrizes Não-Dimensionadas
• C pode calcular automaticamente as dimensões de
Linguagem C
uma matriz, usando matriz não-dimensionadas. Se,
na inicialização de uma matriz, seu tamanho for
omitido, o compilador C cria uma matriz grande o
bastante para conter todos os dados inicializadores
presentes.
int i[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int sqrs [][2] = {
1, 1,
2, 4,
3, 9,
4, 16,
5, 25
};
74
Exercícios
1. Leia uma matriz 5x5, imprima a soma dos
Linguagem C
elementos da diagonal principal e a soma dos
elementos da diagonal secundária.
2. Leia duas matrizes A e B, do tipo 3x3, calcule
em uma matriz R sua multiplicação, ou seja, R =
A * B.
3. Leia uma matriz 5x5, calcule a sua transposta.
Imprima as duas matrizes.
4. Faça um programa que ordene uma matriz de
5x5 em ordem decrescente, de maneira que o
maior valor se localize na posição [0][0] e o
menor na [4][4]. O programa deve escrever a
matriz original e a ordenada.
75
Ementa
• Introdução
Linguagem C
• Operadores e Expressões
• Funções de E/S
• Estruturas de Controle
• Vetores e Matrizes
• Strings
• Ponteiros
• Funções
• Estruturas
• Alocação Dinâmica de Memória
• Arquivos
76
Matrizes de char (strings)
• Uma "string" é definida como sendo constituída de
uma matriz de caracteres (tipo de dado char - 1 byte)
Linguagem C
que é terminada por um "nulo". Um nulo é especificado
usando-se '0' que é zero.
• Por exemplo, se quisermos declarar uma matriz "str"
que possa armazenar uma string de 10 caracteres,
escrevemos:
char str [11];
• As funções de manipulação de string armazenam e
manipulam automaticamente o ‘0’.
• Uma constante string fica entre “ “ (aspas), ex:
printf(“%s”, “Curso C”);
77
Strings
• Leitura de uma string do teclado: A maneira mais
fácil de inserir uma string pelo teclado é com a
Linguagem C
função de biblioteca gets(). A forma geral da função
gets() é:
gets(nome_da_matriz);
#include <stdio.h>
main()
{
char str [80];
printf("informe uma string:");
gets(str); /*le a string do teclado*/
printf("%s", str);
}
78
Inicialização de Strings
• Inicialização de string dimensionada:
Linguagem C
char erro[17] = “erro de leituran”;
• Inicialização de string não-dimensionada.
Deixa que o compilador crie uma matriz
grande o suficiente para conter a string:
char erro[] = “erro de leituran”;
79
Funções de Manipulação de String
• As funções de manipulação de strings estão
declaradas no arquivo de cabeçalho “string.h”.
Linguagem C
Função strcpy(): Copia o conteúdo da string "de" para a
string "para". Forma geral:
strcpy(para,de);
#include <stdio.h>
#include<string.h>
main(){
char str [80];
strcpy(str, "Alo");
printf("%s", str);
}
80
Funções de Manipulação de String
Função strlen(): Retorna o tamanho de s.
Linguagem C
strlen(s); onde s é uma string.
/* imprime o tamanho da string digitada
*/
#include<stdio.h>
#include<string.h>
main()
{
char str [80];
printf("digite uma string:");
gets(str);
printf("%d", strlen(str));
}
81
Funções de Manipulação de String
Função strcmp(): Compara duas strings e retorna 0 se elas
forem iguais. Se s1 é lexicograficamente maior (Exemplos:
Linguagem C
"BBBB">"AAAA") que s2, então um número positivo é
retornado; se for menor que s2, um numero negativo é
retornado.
strcmp(s1,s2);
#include<stdio.h>
#include <string.h>
main() {
char s[80];
printf("informe a senha:");
gets(s);
if(strcmp(s, "senha"))
printf("senha invalidan");
else printf("senha corretan"); }
82
Funções de Manipulação de String
Função strcat(): Anexa (concatena) "s2" em " s1";
Linguagem C
"s2" não é modificada. As duas strings devem ser
terminadas com nulo e o resultado também será
terminado com um nulo.
strcat(s1,s2);
#include <stdio.h>
#include <string.h>
main(){
char s1[20], s2[15];
strcpy(s1, "Alo");
strcpy(s2," para todos");
strcat(s1,s2);
printf("%s",s1); }
83
Exercícios
1. Escrever um programa que lê duas strings e
Linguagem C
informa o tamanho, a igualdade entre elas e no
final escrever as strings concatenadas.
2. Escrever um programa que lê uma string e a
escreve em ordem inversa.
3. Escrever um programa que lê uma string e
escreve quantos caracteres iguais a ‘a’ existem
na string.
4. Escrever um programa que lê uma string e a
escreve em maiúsculo. Ver função toupper.
5. Escrever um programa que lê uma string s[30] e
escreve cada palavra desta string numa nova
linha
84
Ementa
• Introdução
Linguagem C
• Operadores e Expressões
• Funções de E/S
• Estruturas de Controle
• Vetores e Matrizes
• Strings
• Ponteiros
• Funções
• Estruturas
• Alocação Dinâmica de Memória
• Arquivos
85
Ponteiros
• Um ponteiro é uma variável que contém um endereço
de memória. Esse endereço é normalmente a posição
Linguagem C
de uma outra variável na memória.
• Sintaxe: tipo *nome_ponteiro;
• tipo do ponteiro define que tipo de variável o ponteiro
pode apontar.
• Operadores de Ponteiros:
& Operador unário que retorna o endereço na memória
do seu operando.
* Operador unário que retorna o valor da variável
localizada no endereço que o segue.
86
Exemplos
• int y, x=0, *px, *py;
px=&x; “px aponta para x”
Linguagem C
y=*px; “y recebe conteúdo de x, ou seja, 0”
py=px; “py também aponta para x”
*py=3; “variável apontada por py, ou seja, x, recebe 3”
• float x=10.1, y;
int *p;
p=&x; /* erro */
y=*p;
printf(“%f”,y);
• int x, *p;
x=10;
*p=x; /* cuidado, ponteiro perdido */
/* (contém lixo) */
87
Expressões com Ponteiros
• Os ponteiros podem aparecer normalmente no lugar
das variáveis.
Linguagem C
• O operador * tem maior precedência que as
operações matemáticas.
Y = *px + 1; /* y recebe a soma de 1 ao
conteúdo de *px */
y = *(px+1); /* y recebe o conteúdo do
endereço de px + 1
(próximo) */
• Dois ponteiros, como outras variáveis, podem ser
comparados.
if (p1==p2).. /* verifica se p1 e p2 apontam
para a mesma variável */
88
Incremento e Decremento de Ponteiros
• Os ponteiros não são necessariamente
Linguagem C
incrementados e decrementados em uma
unidade, mas pelo tamanho do tipo apontado
pelo ponteiro.
• Os operadores ++ e -- possuem precedência
sobre o * e operadores matemáticos.
• Qual a diferença entre
p++; (*p)++; *(p++);
89
Incremento e Decremento de Ponteiros
Linguagem C
p++; incrementa o ponteiro, ou seja, o
endereço(p passa a apontar para a
posição de memória imediatamente
superior).
(*p)++; incrementa o conteúdo apontado por p,
ou seja, o valor armazenado na
variável para a qual p está
apontando.
*(p++); incrementa p, como em p++, e acessa o
valor encontrado na nova
posição.
90
Ponteiros e Matrizes
• Há um grande relacionamento entre ponteiros e
Linguagem C
matrizes.
• Versões com ponteiros são mais rápidas.
• Os ponteiros possuem mais facilidades de
manipulação.
• Ao contrário das matrizes, os ponteiros podem
ser incrementados e decrementados
diretamente.
91
Exemplo
• Lendo um vetor com ponteiro:
Linguagem C
main()
{
int a[5]={0,1,2,3,4}, *p, x;
p=&a[0]; /* mesmo que p=a */
x=*(p+2); /* x recebe a[2] */
printf(“%d”, x);
}
92
Exemplo
• Construindo um vetor com ponteiro:
Linguagem C
main(){
int vet[10], *p, i;
p=vet;
for (i=0,i<10;i++) {
*p=i;
p++;
}
p=vet;
for (i=0,i<10;i++)
printf(“%d”, *p++);
}
93
Exemplo
• Ponteiro com string:
Linguagem C
main(){
char str[80], *p;
printf (“Digite string em letras
maiúsculas: “);
gets(str);
printf (“Eis a string em letras
minúsculas: “);
p=str; /* p aponta para o primeiro
elemento de str */
while (*p) printf(“%c”, tolower(*p++));
}
94
Exemplo
• Matrizes de Ponteiros:
Linguagem C
main(){
char *erro[2]={“arquivo inexistenten”,
“erro na leituran”};
printf (“%s”, erro[0]);
printf (“%s”, erro[1]);
}
95
Exercícios
1. Usando ponteiros, faça um programa que
Linguagem C
imprima uma string invertida.
2. Usando ponteiros, faça um programa que
preencha uma matriz 10x10 de inteiros
com os números de 1 a 100.
3. Usando ponteiros, faça um programa que
leia duas strings e as concatene numa
terceira string.
96
Teste
1. Leia 10 strings para uma matriz de string. Ordene e
Linguagem C
imprima as strings em ordem alfabética.
2. Na teoria de sistemas define-se como elemento
minimax de uma matriz o menor elemento da linha
em que se encontra o maior elemento da matriz.
Escreva um programa que leia uma matriz 4 x 4 e
determine e imprima o seu elemento minimax.
3. Escreva um programa que converta um numero em
notação romana para notação decimal. Considere
números menores que 1000.
97
Ementa
• Introdução
Linguagem C
• Operadores e Expressões
• Funções de E/S
• Estruturas de Controle
• Vetores e Matrizes
• Strings
• Ponteiros
• Funções
• Estruturas
• Alocação Dinâmica de Memória
• Arquivos
98
Funções
• É uma sub-rotina que realiza uma tarefa específica.
•
Linguagem C
Um programa em C é uma coleção de funções.
• Forma geral de uma função:
tipo_retorno nome(lista_parâmetros)
{
// corpo da função
}
tipo_retorno especifica o tipo de dado retornado pela
função. Pode ser qualquer tipo válido exceto um array.
nome especifica o nome da função.
lista_parâmetros é uma seqüência de pares de tipo e
identificador separados por vírgulas. São as variáveis que
recebem o valor dos argumentos passados para a função
quando chamada.
99
Função sem parâmetro
// Este programa contém duas funções: main() e
minha_func()
Linguagem C
void minha_func(); // protótipo de minha_func()
// Não há parâmetros formais
int main(){
printf(“Em main() n”);
minha_func(); // chame minha_func()
printf(“De volta a main()”);
}
// Esta é a definição da função.
void minha_func(){
printf(“De dentro de minha_func()n”);
} Em main()
De dentro de minha_func()
De volta a main()
100
Função com parâmetro
void box(int length, int width, int height);
// protótipo de box() com 3 parâmetros formais
Linguagem C
int main(){
box(7, 20, 4); // passa argumentos para box
box(28, 30, 25);
box(3, 5, 4);
}
// Computa o volume da caixa.
void box(int length, int width, int height){
printf(“Volume da caixa e %d”, length*width
*height);
} // Os parâmetros recebem os valores dos
argumentos passados para box().
101
O retorno de valores
• Uma função pode retornar um valor para seu
Linguagem C
chamador.
• Para retornar um valor usamos return valor.
• O tipo do valor retornado deve ser compatível
com o tipo de retorno declarado na função. Se
não for, um erro em tempo de compilação
ocorrerá.
102
Função com retorno
int box(int length, int width, int
height); // box() agora retorna um
Linguagem C
inteiro
int main(){
int volume;
volume=box(7, 20, 4); // o valor de retorno
de box() é atribuído a volume.
printf(“O Volume da caixa e %d”, volume);
}
// Computa o volume da caixa.
int box(int length, int width, int height){
return length*width*hieght;
} // box() retorna o volume da caixa para
main()
O Volume da caixa e 560
103
Regras de Escopo
• Existem três tipos de variáveis: variáveis locais,
Linguagem C
parâmetros formais e variáveis globais.
• As regras de escopo regem a visibilidade e o
tempo de vida de cada um desses tipos.
Variáveis Locais
Declaradas dentro de uma função ou
dentro de um bloco de código.
Conhecidas apenas dentro do bloco no
qual estão declaradas.
São criadas na entrada do bloco e
destruídas na saída. 104
Variáveis Locais
void func1() {
int x; //x é local para func1()
Linguagem C
x=10;
printf(“x = %d”,x);
}
void func2(){
int x=9; //x é local para func2().
if (x==9){
int y=20; //y é local ao bloco if
printf(“x + y = %d”, x+y);
}
y=100; //erro! Y não é conhecido aqui.
}
105
Parâmetros Formais
• Parâmetros Formais
Linguagem C
– São as variáveis que recebem os argumentos
de uma função.
– Dentro de uma função, elas se comportam
como qualquer outra variável local.
– Os parâmetros formais declarados devem ser
do mesmo tipo dos argumentos usados para
chamar a função.
106
Parâmetros Formais
#include <stdio.h> /* declaração do arquivo de cabeçalho*/
Linguagem C
int mul_var(int, int); /* declaração do protótipo mul_var */
int mul_var(int x, int y) /* declaração da função mul_var */
{
int z; Parâmetros formais
z = x * y; da função
return(z);
}
void main(void) /* declaração da função main()
{
int a, b, mul; Argumentos da função, devem ser
printf("Digite 2 valores:n"); do mesmo tipo do parâmetro formal
scanf("%d %d", &a, &b);
mul = mul_var( a, b); /* chamada da função mul_var*/
printf("n %d ", mul);
}
107
Variáveis Globais
• Variáveis Globais
Linguagem C
– Estas variáveis são declaradas fora das funções, ou
seja, logo após as declarações #include.
– São conhecidas por todo o programa e podem ser
usadas por qualquer parte do código.
– Variáveis globais retêm seus valores durante toda a
execução do programa.
108
Variáveis Globais
#include <stdio.h>
void func1();
Linguagem C
int count; // count é global
int main() {
int i; // i é local
for (i=0;i<10;i++) {
count = i*2;
func1();
}
return 0;
}
void func1() {
printf(“count: %dn”, count); //acessa count global
}
109
Exercícios
1. Escreva e teste a seguinte função média(), que retorna a
Linguagem C
média dos três números:
float media(float x1, float x2, float x3)
1. Escreva e teste a seguinte função power(), que retorna x
elevado a potência de n, onde n pode ser qualquer inteiro:
double power(double x, int n)
Utilize o algoritmo que calcularia x20 multiplicando 1 por x 20
vezes.
3. Escreva e teste a seguinte função isSquare(), que
determina se o inteiro dado é um número quadrado: int
isSquare(int n). Retorna 1 se for número quadrado e 0 caso
contrário.
Os primeiros 10 números quadrados são: 0, 1, 4, 9, 16, 25, 36,
49, 64 e 81
110
Passagem de ponteiros para funções
#include <stdio.h>
Linguagem C
void f(int *j); // f adota um ponteiro int* como parâmetro
int main() {
int i=0, *p;
p=&i;
f(p); // passa o ponteiro
// ou f(&i) passa o endereço de i
printf(“ i = %d”, i);
return 0;
}
// f recebe um ponteiro para um int
void f(int *j) {
*j=100; // var apontado por j recebe 100
}
111
Passagem de um array
• Quando um array é um argumento para
Linguagem C
uma função, o endereço do array é
passado, e não uma cópia de todo o array.
• Um nome de array sem qualquer índice é
um ponteiro para o primeiro elemento no
array.
112
Passagem de um array
#include <stdio.h>
void mostra(int num[10]);
Linguagem C
int main() {
int t[10], i;
for (i=0; i<10 ;i++) t[i]=i;
mostra (t); // passa o array t para uma função
return 0;
}
// Parâmetro é um array dimensionado
void mostra(int num[10]) {
int i;
for (i=0; i<10 ;i++) printf(“%d “,num[i]);
}
OBS: O Compilador C automaticamente converterá o
parâmetro num para um ponteiro int, já que nenhum
parâmetro pode receber um array inteiro. Apenas o
endereço do array é passado.
113
Passagem de um array
Outras possibilidades de passar um ponteiro de
Linguagem C
array:
• Parâmetro é um array não dimensionado
void mostra(int num[ ]) {
int i;
for (i=0; i<10 ;i++) printf(“%d “,num[i]);
}
• Parâmetro declarado como ponteiro
void mostra(int *num) {
int i;
for (i=0; i<10 ;i++) printf(“%d “,num[i]);
}
// um ponteiro pode ser indexado usando [], como
se // fosse um array
114
Passagem de strings
• Como uma string é simplesmente um array
Linguagem C
de caracteres que é terminado por caractere
nulo, quando passamos uma string para
uma função, apenas um ponteiro para o
início da string é na realidade passado.
115
Passagem de strings
void strInvertCase(char *str);
Linguagem C
int main() {
char str[80];
strcpy(str, “Isto E Um Teste”);
strInvertCase(str); //passa ponteiro para str
puts(str);
return 0;
}
void strInvertCase(char *str){
while(*str) {
if (isupper(*str)) *str=tolower(*str);
else if (islower(*str)) *str=toupper(*str);
str++;
}}
116
Exercícios
1. Escreva e teste a função strlen()
2. Escreva e teste a seguinte função:
Linguagem C
void add(float a[], int n, float b[]);
A função adiciona os primeiros n elementos de b aos n
primeiros elementos de a. Por exemplo, se a for
{2.2,3.3,4.4,5.5,6.6,7.7,8.8,8.9} e b for
{6.0,5.0,4.0,3.0,2.0,1.0}, a chamada add(a, 5, b)
transformaria a em {8.2, 8.3, 8.4, 8.5, 8.6, 7.7, 8.8, 8.9}.
3. Escreva e teste a seguinte função, que remove um item
de um array:
void remove(float a[], int &n, int i);
A função remove a[i] mudando para baixo todos os
elementos acima dessa posição e decrementando n.
117
A função main()
• Podemos passar informações para um programa ao
Linguagem C
rodá-lo. Isto é possível passando argumentos de
linha de comando para a função main().
• C define dois parâmetros embutidos, mas opcionais
para main(). Eles são argc e argv.
• argc é um número inteiro que contém o número de
argumentos na linha de comandos. Ele sempre será
pelo menos 1, porque o nome do programa se
qualifica como primeiro argumento.
• argv é um ponteiro para um array de ponteiros de
caracteres. Cada ponteiro no array argv aponta para
uma string contendo um argumento de linha de
comando.
118
A função main()
• O nome do programa é apontado por
Linguagem C
argv[0]; argv[1] apontará para o primeiro
argumento, argv[2] para o segundo
argumento e assim por diante.
• argv é declarado da seguinte forma:
char *argv[];
119
argc e argv
• Esse programa exibe os argumentos da linha de
comando:
Linguagem C
int main(int argc, char *argv[]) {
for (int i=0; i<argc; i++)
puts(argv[i]);
return 0;
}
Se o programa for chamado de ComLine, então
executá-lo da forma: Comline um dois tres,
teríamos a seguinte saída:
Comline
um
dois
tres
120
Exercícios
1. Escreva e teste a seguinte função que retorna o
Linguagem C
índice do menor valor de um array dado:
int minIndex(float a[ ])
1. Escreva e teste a seguinte função que retorna o
valor mínimo entre os primeiros n elementos de um
array dado:
float min(float a[ ], int n)
1. Escreva a função strcpy().
2. Escreva um programa que exiba a soma dos dois
argumentos numéricos de linha de comando.
121
Ementa
• Introdução
Linguagem C
• Operadores e Expressões
• Funções de E/S
• Estruturas de Controle
• Vetores e Matrizes
• Strings
• Ponteiros
• Funções
• Estruturas
• Alocação Dinâmica de Memória
• Arquivos
122
Estruturas
• Uma estrutura é uma coleção de variáveis
Linguagem C
referenciadas pelo mesmo nome.
• As variáveis que formam a estrutura são
chamadas de membros ou campos da
estrutura.
• A palavra reservada struct informa ao
compilador a definição de uma estrutura.
123
Estruturas
Exemplo de estrutura:
Linguagem C
struct pessoal {
char nome[30];
char endereco[80];
int idade;
float salario;
};
Para declarar uma variável com essa estrutura:
struct pessoal funcionario;
124
Estruturas
Referência aos elementos da estrutura: operador ponto
(.)
Linguagem C
gets(funcionario.nome);
funcionario.idade=20;
printf(“ %f”, funcionario.salario);
puts(funcionario.endereco);
125
Matrizes de Estruturas
• Para declarar uma matriz de estruturas do tipo
Linguagem C
pessoal de 100 elementos:
struct pessoal funcionario[100];
• Para acessar uma estrutura específica,
indexamos o nome da estrutura. Por exemplo,
para imprimir o campo nome da estrutura 3:
gets(funcionario[3].nome);
126
Exercício
1. Escreva um programa simples que
Linguagem C
gerencie um cadastro com registros com
os campos NOME, SEXO,
COR_DE_OLHOS, IDADE, ALTURA e
PESO. Escreva as funções Inserir, Exibir e
Excluir um registro da matriz. Obtenha a
seleção das funções através de um menu.
Sugestão: assuma que uma estrutura não está em uso se
o campo NOME estiver vazio.
127
Uniões
• Uma união é uma localização de memória
Linguagem C
usada por muitas variáveis diferentes, que podem
ser de tipos diferentes. A definição de uma união
é parecida com aquela de uma estrutura:
union u_type {
int i;
char ch;
};
• Para declarar uma variável do tipo u_type:
union u_type cvnt;
128
Uniões
• Em cntv, tanto o inteiro i como o
Linguagem C
caractere ch compartilham da mesma
localização de memória. No entanto i
ocupa dois bytes e ch apenas um.
• Para acessar um elemento de uma
union:
cvnt.i=1;
129
Exemplo de União
main(void){
Linguagem C
union u_type {
int i;
char ch[2];
};
union u_type cvnt;
cvnt.i=1000;
printf ("uniao u como int: %dn", cvnt.i);
printf ("uniao u como char: %c %cn",
cvnt.ch[0],cvnt.ch[1]);
getch();
}
130
typedef
• C permite a definição de novos nomes de tipos de
Linguagem C
dados com a palavra-chave typedef.
• A forma geral da instrução typedef é:
typedef tipo nome;
• Por exemplo, podemos criar um novo nome para
float usando:
typedef float balance;
• Essa instrução diria ao compilador para reconhecer
balance, como um novo nome pra float. Assim,
poderíamos criar uma variável float usando:
balance v_contabil;
131
Enumerações
• Enumeração é um conjunto de constantes inteiras
Linguagem C
com nome e especifica todos os valores legais que
uma variável daquele tipo pode ter.
• Forma geral:
enum nome_do_tipo_enum {lista de veriáveis}
lista variável;
• Exemplo:
enum transporte {carro, aviao, trem,
navio};
• Declaração de variável enum:
enum transporte tr1;
132
Enumerações
• Cada um dos símbolos da enumeração
representa um valor inteiro. Como tal, eles
Linguagem C
podem ser usados em qualquer expressão
de números inteiros. A menos que
inicializado de outra forma, o valor do
primeiro símbolo da enumeração é 0, o
valor do segundo é 1 e assim por diante.
tr1=navio;
if (tr1==carro) printf(“ vou de
carro”);
printf(“%d”, aviao);
133
Ementa
• Introdução
Linguagem C
• Operadores e Expressões
• Funções de E/S
• Estruturas de Controle
• Vetores e Matrizes
• Strings
• Ponteiros
• Funções
• Estruturas
• Alocação Dinâmica de Memória
• Arquivos
134
Alocação Dinâmica de Memória
• Um programa em C usa uma das duas maneiras
principais de se armazenar informações na memória
Linguagem C
principal do computador.
• A primeira maneira usa variáveis globais e locais.
Variáveis globais têm seu armazenamento fixo
durante todo o tempo de execução do programa.
Variáveis locais são armazenadas na pilha do
programa. Entretanto essa maneira requer que o
programador saiba, com antecedência, o montante de
armazenamento necessário para cada situação.
• A segunda maneira é através de alocação dinâmica
da área de memória livre (heap) do programa.
• As funções malloc() e free() formam o sistema de
alocação dinâmica de C.
135
malloc()
• void *malloc(unsigned size)
Linguagem C
Retorna um ponteiro void para o primeiro
byte de uma região da memória de tamanho
size da área de alocação dinâmica. O
ponteiro void deverá ser atribuído a um
ponteiro do tipo desejado (usar cast explícito).
Se não houver memória suficiente para
satisfazer o pedido, malloc() retornará um
ponteiro NULL.
136
free()
• free (void *p)
Linguagem C
O oposto de malloc(), free() devolve ao
sistema a memória previamente alocada.
free() nunca deve ser chamada com um
argumento inválido, porque isto fará com
que o computador destrua a lista livre.
137
Exemplo
main() { */ Aloca memória para 50 inteiros /*
Linguagem C
int *p, t;
p=(int *)malloc(50*sizeof(int));
if (!p) printf(“Memória Insuficiente!”);
else {
for (t=0; t<50; t++) *(p+t)=t;
for (t=0; t<50; t++) printf(”%d”, *(p+t));
free(p)
}
}
138
Exercício
1. Escreva um programa que aloque espaço para
cinco strings inseridas pelo usuário.
Linguagem C
2. Escreva uma função getstruct() que aloque
memória para uma estrutura addr e retorne o
ponteiro para a memória alocada:
struct addr {
char nome[40];
char rua[40];
char cidade[30];
char esrado[3];
char cep[10];
};
139
Ementa
• Introdução
Linguagem C
• Operadores e Expressões
• Funções de E/S
• Estruturas de Controle
• Vetores e Matrizes
• Strings
• Ponteiros
• Funções
• Estruturas
• Alocação Dinâmica de Memória
• Arquivos
140
Arquivos
Ponteiro de Arquivo
Linguagem C
• Para ler ou escrever em um arquivo de disco, o
programa deve declarar uma variável ponteiro de
arquivo.
• Um ponteiro de arquivo é um ponteiro para uma
área na memória(buffer) onde estão contidos vários
dados sobre o arquivo a ler ou escrever, tais como o
nome do arquivo, estado e posição corrente
• Este buffer intermediário entre arquivo e programa é
chamado 'fluxo‘ ou ‘stream’, e é uma entidade lógica
genérica, que pode estar associada a uma unidade
de fita magnética, um disco, uma porta serial, etc.
141
Arquivos
Ponteiro de Arquivo
Linguagem C
• Para obter uma variável ponteiro de arquivo :
FILE *fp;
onde fp é o ponteiro de arquivo.
Abrindo um Arquivo:
• A função fopen() abre um fluxo e liga um arquivo a esse fluxo.
Retorna o ponteiro de arquivo associado ao fluxoem questão.
FILE *fopen(char *nome_de_arquivo, char *modo);
• onde modo é uma string contendo o estado desejado para
abertura.
• O nome do arquivo deve ser uma string de caracteres que
compreende um nome de arquivo válido incluindo uma
especificação de caminho (PATH).
142
Modos de Abertura
Modo Significado
"r" Abre um arquivo-texto para leitura
Linguagem C
"w" Cria um arquivo-texto para escrita
"a" Acrescenta dados para um arquivo-texto existente
"rb" Abre um arquivo binário para leitura
"wb" Cria um arquivo binário para escrita
"ab" Acrescenta dados a um arquivo binário existente
"r+" Abre um arquivo-texto para leitura/escrita
"w+" Cria um arquivo-texto para leitura/escrita
"a+" Acrescenta dados ou cria um arquivo-texto para
leitura/escrita
"r+b" Abre um arquivo binário para leitura/escrita
"w+b" Cria um arquivo binário para leitura/escrita
"a+b" Acrescenta ou cria um arquivo binário para leitura/escrita
143
Abertura de Arquivo
• Um arquivo pode ser aberto ou em modo
Linguagem C
texto ou em modo binário.
• No modo texto, as seqüências de retorno de
carro e alimentação de formulários são
transformadas em seqüências de novas linhas
na entrada. Na saída, ocorre o inverso: novas
linhas são transformadas em retorno de carro e
alimentação de formulário. Tais transformações
não acontecem em um arquivo binário.
144
Abertura de Arquivo
• Se um erro ocorre quando se está abrindo
Linguagem C
um arquivo, fopen() retorna um nulo
(NULL).
• Por exemplo: tentar abrir um arquivo
inexistente para leitura, escrever em um
arquivo protegido contra gravação, ou
ainda criar um arquivo se o disco estiver
cheio, um erro ocorrerá e fopen() retornará
NULL.
145