Escolar Documentos
Profissional Documentos
Cultura Documentos
PROGRAMAÇÃO
AULA 1
1. Compilador;
2. Estrutura de um programa em C;
3. Função main;
4. Principais características de uma função;
5. Pré-processador e diretivas.
TEMA 1 – COMPILADOR
2
A variedade de compiladores nos dias de hoje é muito grande. Existem
inúmeras linguagens fontes, que poderiam ser citadas em várias páginas deste
trabalho. Isso se deve, principalmente, ao fato de que, com o aumento do uso
dos computadores, aumentaram também as necessidades de cada indivíduo,
sendo essas específicas, exigindo, por sua vez, linguagens de programação
diferentes.
Este processo, com a evolução da tecnologia de desenvolvimento de
compiladores, levou à criação de várias técnicas para a construção de um
compilador, ou seja, passaram a existir diferentes maneiras de se implementar
um compilador.
No entanto, a despeito dessa aparente complexidade, as tarefas básicas
que qualquer compilador precisa realizar são essencialmente as mesmas. A
grande maioria dos compiladores de hoje faz uso da técnica chamada tradução
dirigida pela sintaxe. Nessa técnica, as regras de construção do programa fonte
são utilizadas para guiar todo o processo de compilação. Algumas das técnicas
mais antigas utilizadas na construção dos primeiros compiladores (da linguagem
Fortran) podem ser obtidas em Rosen (1967).
Existem duas tarefas principais executadas por um compilador no
processo de tradução:
3
A análise retorna como uma representação intermediária do código fonte.
Sendo assim, deve conter as informações necessárias para a geração do código
objeto que o corresponda. Quase sempre, essa representação tem como
complemento tabelas com informações adicionais sobre o programa fonte.
Existem casos em que a representação intermediária toma a forma de um
programa em uma linguagem intermediária, tornando mais fácil a tradução para
a linguagem objeto desejada (Mizrahi, 2008).
Uma das formas mais comuns de tabela utilizada na representação
intermediária é a tabela de símbolos (tokens). A função dessa tabela é guardar
cada token usado no programa na informação correspondente.
4
Essas fases são conceituais e especificam atividades que todos os
compiladores executam, embora frequentemente as atividades de várias fases
possam ser combinadas e executadas simultaneamente. Essas fases estão
resumidamente ilustradas na Figura 2.
Saber como funciona a compilação pode ser muito útil na hora de escrever
um código e ao depurá-lo. Compilar um programa C é um processo que pode
ser dividido em quatro estágios separados: pré-processamento, compilação,
montagem e linkagem.
Para melhor entendimento, vamos percorrer cada um dos quatro estágios
de compilação do seguinte programa em C, mostrado na Figura 3.
5
1.2.1 Pré-processamento
Remoção de comentários;
Expansão de macros;
Expansão dos arquivos incluídos.
6
Outra forma de formar comentários em C consiste em escrever duas
barras (//) na coluna em que queremos iniciar o comentário. Todos os caracteres,
até ao final dessa linha, serão considerados comentários (Intprogc, 2018).
Os comentários podem aparecer em qualquer ponto do programa em que
seja permitida a utilização de um espaço em branco.
Os exemplos seguintes ilustram algumas das formas possíveis de um
comentário.
// Isto é um exemplo de um comentário uma única linha.
/*
Isto é outro exemplo
de um comentário
que ocupa mais de
uma linha
*/
1.2.2 Compilação
1.2.3 Montagem
7
1.2.4 Linkagem
8
Um código fonte em C pode ser formado por um ou mais arquivos fonte.
Em um arquivo fonte, encontramos declarações e definições de funções e
identificadores. Tais declarações e definições podem estar contidas em arquivos
fonte, arquivos cabeçalho, bibliotecas e outros arquivos necessários ao
programa. Para se obter um arquivo executável, é necessário compilar cada um
dos arquivos do projeto e gerar arquivos objeto destes.
Um programa em C é constituído de:
int main()
int main(void)
int main(int argc, char * argv[ ])
int main(int argc, char * const argv[ ], char * const envp[ ])
10
argc – é o contador de argumentos. Ele informa quantos argumentos
foram passados juntos com o nome do programa. Se o valor é 1, então
argumentos não foram fornecidos com o nome do programa. Observe as
figuras 5 e 6.
11
Figura 8 – Resultado da execução do algoritmo da figura 7
C:\Dev-Cpp\teste4.exe
12
O ambiente do processo é substituído pelo parâmetro envp, sendo
possível guardar vários processos em diferentes posições no vetor.
Por padrão, os nomes argc, argv[ ] e envp[ ] são sempre usados.
Entretanto, não há problema em você usar outros nomes (ex: contador,
argumentos[ ] e ambiente[ ]), desde que você não altere os tipos de dados.
A função main pode retornar um inteiro para o sistema operacional. Para
isso, utiliza-se o int main(), em conjunto com o comando return, para encerrar a
função e passar um inteiro para o sistema operacional, conforme mostrado no
exemplo da Figura 11.
13
chave de abertura de bloco ({) e terminar com uma chave de fechamento de
bloco (}). Essas chaves determinam o corpo da função.
Em uma função, é permitido inserir espaços em branco, tabulações e pular
linhas (esses caracteres são ignorados pelo compilador). É permitido também
escrever várias instruções em uma única linha ou escrever uma instrução em
várias linhas. Não há um estilo obrigatório para a escrita de programas em C. No
entanto, é sempre desejável seguir as boas práticas da programação com
indentações sem exagero (Mizrahi, 2008).
Quando desenvolvemos um projeto de desenvolvimento de software, é
importante que todo o código seja bem indentado, ou seja alinhando de forma
correta.
Em um grande projeto, é importante a definição de um padrão de
indentação, que deve ser documentado e disponibilizado aos demais
programadores.
A palavra indentação é um neologismo e não existe na língua
portuguesa. Esse termo foi “abrasileirado” do termo indentation, usado na língua
inglesa, que significa recuo.
O objetivo da indentação é o de tornar os códigos mais legíveis. A
utilização de regras de indentação permite, por meio de uma simples inspeção
visual, evidenciar facilmente a estrutura global do programa, tornando
claramente visíveis todas as instruções de um ou mais blocos de código.
Nos exemplos das figuras 12, 13, 14, 15, 16 e 17, a seguir, são ilustrados
os dois estilos de indentação mais utilizados. O número de espaços utilizado
pode variar entre 2 e 8. Escolha o estilo que mais lhe agrada e utilize de forma
uniforme em todos os seus programas.
Figura 12 – Indentação IF
14
Figura 13 – Indentação IF, ELSE IF, ELSE
15
Figura 17 – Indentação SWITCH CASE
#include "meuarq.h".
17
Embora a linguagem C disponibilize um grande conjunto de diretivas, que
estão enunciadas na tabela seguinte, no âmbito deste curso, utilizaremos
fundamentalmente a diretiva #include (Intprogc, 2018).
Tabela 2 – Diretivas em C
CÓDIGOS
SIGNIFICADO
ESPECIAIS
\n Nova linha
\t Tabulação
\b Retrocesso (usado para impressora)
\f Salto de página de formulário
\a Beep – Toque do alto-falante
\r CR – Retorno do cursor p/ o início da linha
\\ \ – Barra invertida
\0 Zero
\’ Aspas simples (apóstrofo)
\” Aspas dupla
\xdd Representação hexadecimal
\ddd Representação octal
Fonte: Adaptado de Mizrahi, 2008.
18
Figura 19 – Algoritmo com códigos especiais \t e \n
19
Portanto, na linguagem de programação C, sempre que aparecer, em um
conjunto de caracteres (texto literal no código), uma barra invertida ('\') ou um
porcento ('%'), será um comando. Vejamos na Tabela 4 alguns comandos mais
usados na função printf().
Códigos de
impressão
SIGNIFICADO
formatada com
printf().
%c Caractere simples
%d Inteiro decimal com sinal
%i Inteiro decimal com sinal
%e Notação científica (e minúsculo)
%E Notação científica (e maiúsculo)
%f Ponto flutuante em decimal
Fonte: Adaptado de Mizrahi, 2008.
FINALIZANDO
20
REFERÊNCIAS
21
LINGUAGEM DE
PROGRAMAÇÃO
AULA 2
1. Endereços de memória;
2. Ponteiros;
3. Ponteiros – tamanho e endereçamento;
4. Ponteiros e vetores;
5. Passagem de parâmetros por referência.
2
particular. Para conhecer o endereço em que uma variável está alocada, usa-se
o operador de endereços &. Observe a Figura 1, que mostra um algoritmo que
vai imprimir os endereços de três variáveis usando a função printf() nas linhas
9, 10 e 11.
3
operador “*” antes da variável e o operador “&”1 na chamada do parâmetro
(Mizrahi, 2008).
O resultado do operador &, "endereço de", sempre será o endereço de
memória do elemento em questão, normalmente é o local onde uma variável está
alocada na memória. Isto é, esse operador gera um ponteiro.
A função scanf() espera que o usuário digite algum dado de entrada e o
operador ‘&’, acompanhado da variável, serve para especificar o lugar certo onde
esse dado vai ficar posicionado na memória. Portanto, o uso do operador de
endereço para essa função se faz necessário (Ascencio, 2012).
O operador oposto é o * (asterisco), que pega o valor apontado pelo
endereço.
No exemplo do algoritmo da Figura 1, foram declaradas três variáveis
inteiras. Obtivemos como saída a impressão dos seus endereços em
hexadecimal com o uso do operador &. O endereço alocado depende de vários
fatores, dentre eles, o tamanho da palavra2, se há ou não outros programas
usando a memória, entre outros.
Por essas razões, podemos encontrar endereços diferentes na passagem
de parâmetros e execução do algoritmo (Mizrahi, 2008) para cada nova
execução de um problema. Faça o teste você mesmo. Implemente o exemplo
anterior no seu compilador e mande-o executar diversas vezes. Cada nova
execução gerará valores diferentes de endereços alocados.
Mizrahi (2008) descreve memória como uma unidade organizada
logicamente em palavras. Uma palavra é uma unidade lógica de informação
constituída por um número de bits de único endereço, consequentemente, um
conjunto de palavras armazenadas na memória é um programa, e pode ser
dividido em duas categorias:
1 O operador unário & retorna o endereço na memória de seu operando (Mizrahi, 2008).
2 Unidade de informação para cada tipo de computador (Mizrahi, 2008).
4
Tabela 1 – Exemplo de endereços de palavras
Ordem na Endereço na
Palavras
memória memória
0 000 Palavra 0
1 001 Palavra 1
2 010 Palavra 2
3 011 Palavra 3
4 100 Palavra 4
5 101 Palavra 5
6 110 Palavra 6
7 111 Palavra 7
A capacidade, ou tamanho, de uma memória vai depender do número de
palavras que ela pode suportar. A posição de uma palavra dentro da memória é
tida como o seu endereço. A primeira palavra da memória tem o endereço 000,
a próxima, 001, e assim por diante (Mizrahi, 2008).
TEMA 2 – PONTEIROS
6
A Figura 4 mostra a saída do algoritmo acima após a sua execução.
7
Figura 7 – Exemplo de ponteiros
8
Figura 9 – Tamanho de variáveis mais usadas em C
9
Trabalha-se com ponteiros quando existe a necessidade de ter os valores
das variáveis alterados diretamente na memória mostra um. A Figura 12 mostra
um algoritmo que evidencia esse conceito.
10
ponteiro que aponta para o primeiro elemento do vetor. Observe o algoritmo da
Figura 14.
As instruções acima são usadas para criar um ponteiro que vai apontar
para o primeiro elemento do vetor x[ ]. A expressão “pont = x;” faz com que o
ponteiro “pont” atribua o endereço do primeiro elemento do vetor x[ ]. A Figura
16 ilustra a atribuição do endereço ao ponteiro “pont”.
11
Para obter o endereço do primeiro elemento, basta escrever:
1. int x[ ] = {2, 16, 15, 3, 10};
2. int *pont;
3.
4. pont = x.
ou
1. int x[ ] = {2, 16, 15, 3, 10};
2. int *pont;
3.
4. pont = &x[0].
As instruções anteriores produzem resultados equivalentes. Logo, as
instruções abaixo serão usadas de forma análoga para obter o endereço do
quinto elemento:
1. int x[] = {2, 16, 15, 3, 10};
2. int *pont;
3.
4. pont = &x[4].
Para obter o endereço de outro índice, é necessário utilizar o operador ‘&’.
Observe o código acima e ilustrado na Figura 17.
12
Figura 18 – Exemplo de ponteiro e vetor
13
Figura 20 – Exemplo de ponteiro e vetor
14
A Figura 23 mostra a saída do algoritmo acima após a sua execução.
15
A Figura 25 mostra a saída do algoritmo da Figura 24 após a sua
execução.
16
Figura 27 – Exemplo de vetor de ponteiros
17
dos ponteiros para uma função, ou seja, as alterações dos dados sofridas dentro
da função também serão sentidas fora dela (Mizrahi, 2008).
O código na Figura 29 mostra a implementação da passagem de
parâmetros por referência.
18
3. Na linha 13, a instrução soma_mais_1(&a) recebe o endereço da variável
‘a’;
4. Na linha 22, a função soma_mais_1(*num) altera diretamente o dado na
memória.
5. Na linha 15, a função printf() imprime o valor da variável ‘a’ depois que a
função soma_mais_1(*num) foi executada.
Esses efeitos não ocorrem quando os parâmetros são passados por valor
(sem o uso do asterisco ‘*’ e o operador ‘&’), em que uma cópia do dado é
passada como parâmetro para a função e a variável origem não sofre qualquer
alteração.
19
Figura 32 – Saída do algoritmo
FINALIZANDO
20
REFERÊNCIAS
21
LINGUAGEM DE
PROGRAMAÇÃO
AULA 3
1. Struct;
2. Union;
3. Enum;
4. Typedef;
5. Typedef e struct.
TEMA 1 – STRUCT
2
A struct segue a seguinte sintaxe:
struct <nome_da_struct>
{
<tipo 1> e <variável 1>;
<tipo 2> e <variável 2>;
<tipo 3> e <variável 3>;
...
<tipo n> e <variável n>;
}
struct < nome_da_struct > <nome_variavel>;
3
Figura 3 – Algoritmo com struct
4
Figura 4 – Saída do algoritmo
TEMA 2 – UNION
union <nome_da_union>
{
<tipo 1> e <variável 1>;
<tipo 2> e <variável 2>;
<tipo 3> e <variável 3>;
...
<tipo n> e <variável n>;
};
5
tipo de dados para ser usado em outras partes do programa. Após as chaves,
declara-se as variáveis que vão compor a union.
No exemplo da Figura 5 vamos trabalhar com números, porém não
sabemos se os dados serão do tipo int ou float. Portanto, declara-se um novo
tipo de dados, que iremos chamar de numeroFlex, capaz de armazenar valores
de um dos dois tipos:
num.num2 = 4.0;
6
Figura 7 – Compartilhamento da memória entre variáveis
Uma union torna o código fonte um pouco confuso e, portanto, deve ser
utilizada em momentos em que as variáveis não sejam executadas no mesmo
momento.
Para um melhor entendimento vejamos o algoritmo em que ele imprime
o tamanho de uma union e struct, ambas com os mesmos tipos de variáveis
(Figura 9).
7
Figura 9 – Compartilhamento da memória entre variáveis
8
TEMA 3 – ENUM
enum <nome_da_enum>{lista_de_identificadores};
9
Figura 13 – Compartilhamento da memória entre variáveis
10
A Figura 15 mostra a saída do algoritmo acima após a sua execução.
11
Figura 17 – Escapes com identificadores
12
Figura 19 – Operações com identificadores
TEMA 4 – TYPEDEF
É importante ressaltar que o comando typedef não cria um novo tipo. Ele
apenas permite que um tipo existente seja denominado de uma forma
diferente, de acordo com a especificação desejada pelo programador,
conforme mostrado no algoritmo da Figura 20:
13
A Figura 21 mostra a saída do algoritmo acima após a sua execução:
14
A Figura 23 mostra a saída do algoritmo acima após a sua execução:
15
FINALIZANDO
16
REFERÊNCIAS
17
LINGUAGEM DE
PROGRAMAÇÃO
AULA 4
1. struct calendario{
2. int dia;
3. int mes;
4. int ano;
2
5. }; struct calendario agora, *depois; // declara o ponteiro ‘depois’
6. depois = &agora; // Coloca o endereço no ponteiro ‘depois’
1. (*depois).dia = 28;
2. (*depois).mes = 09;
3. (*depois).ano = 2018;
3
Figura 1 – Ponteiro para uma Struct
1. Entre as linhas seis e dez, criamos uma struct “calendário” com três
componentes do tipo inteiro “dia”, ”mês” e “ano”;
4
5. Na linha 25, os componentes são impressos na tela do usuário e os
acessos aos dados se dá por meio dos ponteiros.
1. atual.dia = &diaSetembro;
2. atual.mes = &mesSetembro;
5
3. atual.ano = &anoSetembro;
1. Entre as linhas seis e dez. criamos uma struct “calendário” com três
ponteiros “*dia”, “*mês” e “*ano”;
2. Nas linhas 12, 13 e 14, criamos três variáveis com suas instancias;
3. Nas linhas 16, 17 e 18, atribui-se os endereços das variáveis para os
ponteiros:
6
4. Nas linhas 20, 21, 22, 23, 24 e 25, são impressos os endereços das
variáveis e o apontamento dos ponteiros;
5. Na linha 27, são impressos os conteúdos das variáveis usando os
ponteiros da struct.
Assim como uma variável, uma struct também pode ser passada como
parâmetro para uma função; essa passagem é feita de duas formas: por valor e
por referência (Mizrahi, 2008).
Uma struct é tratada com uma variável comum, e a passagem por valor é
feita por meio da passagem de uma cópia do seu componente para uma função.
Na passagem por valor, uma cópia do componente da struct é usada e alterado
dentro da função sem afetar a variável da estrutura, na memória da qual ela foi
gerada (Mizrahi, 2008).
7
Figura 5 – Passagem de struct por valor
8
Figura 6 – Saída do algoritmo
10
7. Nas linhas 25 e 26, são impressos os valores dos componentes depois da
execução da função “imprimir_soma_valor()”;
8. Entre as linhas 33 e 36, é criada a função “imprimir_soma_valor()”.
1. void *nome_do_ponteiro;
11
Figura 9 – Ponteiro do tipo void
2. Na linha 7, criamos um ponteiro “y” do tipo void que vai receber o endereço
de ‘x’;
3. Na linha 10, ‘z’ recebe o apontamento de ‘y’;
4. Na linha 11, z altera a instância de x;
5. Na linha 13, imprimimos a atual instância de ‘x’;
6. E nas linhas 14, 15 e 16, os endereços da variável e apontamentos,
respectivamente.
12
TEMA 4 – ALOCAÇÃO DINÂMICA: CALLOC() E FREE()
1. calloc;
2. free;
3. malloc;
4. realloc.
13
Figura 11 – Exemplo com a função calloc()
14
Figura 13 – Implementando a função calloc()
15
Figura 14 – Função free()
16
Figura 15 – Função free()
A função malloc() é bem parecida com a função calloc(). Ela também aloca
um espaço de memória e retorna um ponteiro do tipo void para o início do espaço
de memória alocado. Mas há uma grande diferença: essa função não coloca zero
nos bits do espaço alocado (Mizrahi, 2008). Para declarar uma função malloc( ),
usa-se a sintaxe mostrada abaixo:
17
Figura 16 – Função malloc().
Do mesmo modo, fica complicado toda vez ter que ficar contando Bites
para cada tipo e para resolver esse problema implementamos o operador sizeof.
Vejamos o exemplo da Figura 17.
18
Figura 18 – Função malloc() com tratamento do retorno NULL
19
Figura 19 – Função realloc()
FINALIZANDO
20
REFERÊNCIAS
21
LINGUAGEM DE
PROGRAMAÇÃO
AULA 5
TEMA 1 – RECURSIVIDADE
Caracóis;
Girassóis;
As folhas de algumas árvores;
Dois espelhos quando apontados um para o outro.
O algoritmo passo a passo abaixo ilustra o processo recursivo descrito até
aqui:
Terminou?
Se sim:
Retorne o resultado.
Se não:
3
Divida o problema;
Resolva o(s) problema(s);
Monde os resultados na solução do problema original;
Retorne à solução.
4
TEMA 3 – FUNÇÃO RECURSIVA
6
Figura 4 – Saída do algoritmo
8
Figura 7 – Algoritmo sem função recursiva
9
Figura 9 – Algoritmo com função recursiva
10
Passamos agora ao Exemplo 2, sem recursividade.
11
Figura 13 – Algoritmo com função recursiva
12
TEMA 5 – FUNÇÕES MACRO – DIRETIVA #DEFINE
13
Figura 15 – Algoritmo sem diretiva #define
15
Figura 20 – Saída do algoritmo
16
5.2 Boas práticas da diretiva #define
A ideia é não apenas escrever um código funcional, mas sim usar as boas
práticas para ter um código limpo e de fácil entendimento. Um código mal escrito
dificulta a sua alteração por outros programadores, e é suscetível a erros graves
de compilação. Um código malfeito provoca um retrabalho desnecessário e
frustação para quem vai ter que reprogramá-lo.
Qualquer tecnologia pode ser usada para ajudar ou piorar de vez a
situação. Essa afirmação também se aplica quando usamos macro. Se bem
utilizada, pode facilitar muito a lógica do nosso algoritmo, melhorar a leitura do
código e otimizá-lo. Só que, se for mal utilizada, pode nos causar muita dor de
cabeça, na busca interminável pelos erros do código.
Cada recurso da linguagem de programação tem sua particularidade. As
boas práticas existem para que todos tomem os cuidados necessários, evitando-
se certos erros no desenvolvimento do algoritmo. Quando usamos macro, é
aconselhável sempre colocar, na sequência de substituição, os parâmetros da
macro entre parênteses. Isso serve para preservar a “precedência dos
operadores”, conforme exemplo apresentado na Figura 23.
17
A Figura 24 mostra a saída do algoritmo mostrado na Figura 23, após a
sua execução.
Deve-se sempre usar letras maiúsculas para declarar sua macro, seja ela
uma constante ou uma função. Esse padrão é conhecido pelos programadores
experientes e facilita a leitura e a manutenção do código. Vejamos o exemplo
apresentado na Figura 25.
18
A Figura 26 mostra a saída do algoritmo mostrado na Figura 25, após a
sua execução.
Se o “a” for maior que o “b”, o incrementado será executado mais de uma
vez.
É preciso atentar também à expansão de linhas em macro dentro de um
laço. A barra “\” em macro representa a quebra de linha e indica para o
compilador que a macro continuará na linha abaixo. O exemplo na Figura 29
representa um erro nesse contexto.
19
Figura 29 – Exemplo de um algoritmo sem as chaves no if
20
Figura 31 – Saída do algoritmo
21
Figura 33 – Saída do algoritmo
FINALIZANDO
22
REFERÊNCIAS
23
LINGUAGEM DE
PROGRAMAÇÃO
AULA 6
Retorno:
3
Figura 2 – Saída do algoritmo
4
Fonte: Elaborado pelo autor.
5
Para o próximo algoritmo vamos preencher os espaços com o número
271, só que binário. Esse número é equivalente a:
0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1.
Conforme a conversão realizada na Tabela 1:
0 1 0 0 0 0 1 1 1 1
Fonte: Elaborado pelo autor.
Então:
271 = 0 0 0 0 0 0 0 1 0 0 0 0 1 1 1 1
e
15 = 0 0 0 0 1 1 1 1
O memset() vai usar só 8 bits, que estão representados na Tabela 1. A
cor verde, em binário, é equivalente a decimal 15, conforme apresentado no
algoritmo da Figura 5:
6
Figura 5 – Exemplo de um algoritmo com memset() e vetor
7
Repare que, na Figura 6, tivemos como saída o número 3855. Isso
aconteceu porque o byte 0 0 0 0 1 1 1 1 preencheu duas posições.
3855 = 0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
8
Figura 8 – Saída do algoritmo
Na qual temos:
Retorno:
9
Figura 9 – Exemplo de um algoritmo com memcpy()
10
Figura 11 – Exemplo de um algoritmo com memcpy() e struct
11
de memória de uma forma mais segura com a função memmove() e como fazer
comparação de memória com a função memcmp().
Na qual temos:
Retorno:
1. char nome[20];
2. memcpy(&nome[0], &nome[4], 10); //Comportamento inesperado no caso
de sobreposição.
3. Memmove(&nome[0], &nome[4], 10); //Usa um vetor para tratar o
problema de sobreposição.
12
Figura 13 – Exemplo de um algoritmo com memmove()
13
a=c
a<c
z>c
Na qual temos:
Retorno:
14
Figura 15 – Exemplo de um algoritmo com memcmp()
15
Fonte: Elaborado pelo autor.
16
A Figura 18 mostra a saída do algoritmo da Figura 14 após a sua
execução:
TEMA 3 – ARQUIVOS EM C
disco rígido;
pen drive;
cartão SSD;
entre outros.
Armazenamento durável;
FILE *nomePonteiro;
17
Lembrando que FILE deve ser escrito em letras maiúsculas.
A linguagem C trabalha com apenas dois tipos de arquivos:
1. abrir o arquivo;
1. FILE *arq;
18
2. arq = fopen(“arquivo.txt”,”w”);
f = fopen(“C:\\Users\\Casa\\Documents\\uninter.txt","w");
Para representar a barra "\" em uma string, usamos duas barras: \\
2. Caminho relativo – relativo ao diretório do programa. Exemplo:
f = fopen(“uninter.txt","w");
f = fopen(“..\\Novo\\uninter2.txt","w");
19
Figura 20 – Saída do algoritmo
20
2. r+ – na adição do sinal "+" no "r", iremos abrir o arquivo tanto para
leitura como para escrita; caso ele não exista, o arquivo será criado. Se
o arquivo existir, terá o seu conteúdo apagado e substituído pelo novo.
Exemplo: FILE *arquivo = fopen("uninter.txt", "r+").
3. rb – abre o arquivo em modo binário para leitura.
Exemplo: FILE *arquivo = fopen("uninter.txt", "rb").
21
Figura 21 – Exemplo de um algoritmo com fclose()
22
A Figura 22 apresenta um exemplo com a função fputc():
23
A Figura 24 mostra a saída do algoritmo, após sua execução na Figura
23:
E, como comentamos, uma coisa importante que ocorre “por debaixo dos
panos” é que, após retornar um caractere, essa função já passa a apontar para
o próximo caractere automaticamente, até encontrar -1 (EOF).
Retorno:
24
Figura 25 – Exemplo de um algoritmo com fgetc()
25
A linguagem de programação C traz uma série funções usadas para
manipular arquivos. Na Tabela 3 estão listadas outras funções relacionadas à
manipulação de arquivos.
FINALIZANDO
26
REFERÊNCIAS
27