Livro Texto Unidade 3

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 26

Unidade III

Unidade III
5 FUNÇÕES

A função é um grupo de instruções que juntas executam uma tarefa. Todo programa em C
possui pelo menos uma função, que é a função main(), e todos os programas mais triviais podem
definir algumas funções específicas.

É possível dividir o código em funções separadas, logicamente a divisão geralmente depende de


cada função para executar uma tarefa específica. Para declarar uma função, devemos informar ao
compilador o nome de uma função, o tipo de retorno e os parâmetros.

A linguagem C é por natureza uma linguagem de programação estruturada.


A maior parte de seus recursos é conseguida com a utilização de funções,
como main(), printf(), scanf(), fgets(), puts(), strcmp(), strcpy(). A linguagem
possui uma coleção de bibliotecas, tais como stdio.h e string.h, as quais
possuem um grande conjunto de várias funções que podem ser usadas
a qualquer momento. Uma função também pode ser desenvolvida pelo
programador, a função é um trecho independente de código de programa
com atribuições bem definidas. Uma função (também pode ser denominada
como sub-rotina) pode ser interna ou externa:

• É considerada função interna quando faz parte do compilador.


O conjunto das funções internas forma a chamada biblioteca de
funções, como, por exemplo, as bibliotecas-padrão stdio.h e string.h
(demonstradas em exemplos de programas nos capítulos anteriores).

• É considerada função externa quando é desenvolvida e implementada


por um programador com a finalidade de atender a uma necessidade
em particular (MANZANO, 2013, p. 144).

A biblioteca padrão C fornece inúmeras funções internas que seu programa pode instanciar. Por
exemplo, função strcat() para concatenar duas cadeias, a função memcpy() para copiar um local da
memória para outro local e muitas outras funções.

118
ALGORITMOS

Saiba mais

Para conhecer um pouco mais sobre a funções, leia o capítulo 6 da obra


indicada a seguir.

SOFFNER, R. Algoritmos e programação em linguagem C. São Paulo:


Saraiva, 2013.

A seguir, temos o quadro com as bibliotecas-padrão da linguagem C (compilador GCC).

Quadro 8 – Bibliotecas-padrão da linguagem C

Biblioteca Descrição
Essa biblioteca é a mais utilizada na programação em
stdio.h línguagem C, pois é a padrão, na qual estão embutidas as
funções printf(), puts(), gets(), scanf(), entre outras
Possui as funções matemáticas usadas pela linguagem.
math.h Encontram-se funções trigonométricas, hiperbólicas,
exponenciais, logarítmicas, entre outras
Esta possui as rotinas de tratamento de strings e
string.h caracteres, na qual se encontram as funções strcmp() e
strcpy(), entre outras
Essa biblioteca possui as funções de manipulação de data
time.h e hora do sistema
Possui um conjunto de funções que não se enquadra
stdlib.h em outras categorias. As funções dessa biblioteca são
conhecidas como “funções miscelâneas

Fonte: Manzano (2013, p. 144-145).

Segundo Damas (2016):

Cada função tem que ter um nome único, que serve para a sua invocação
em algum lugar no programa a que pertence.

Uma função pode ser invocada a partir de outras funções.

Uma função (como o seu nome indica) deve realizar uma única tarefa
bem definida.

Uma função deve comportar-se como uma caixa preta. Não interessa
como funciona, o que interessa é que o resultado final seja o esperado, sem
efeitos colaterais.

119
Unidade III

O código de uma função deve ser o mais independente possível do resto do


programa, e deve ser tão genérico quanto possível, para poder ser reutilizado
em outros projetos.

Uma função pode receber parâmetros que alterem o seu comportamento de


forma a adaptar-se facilmente a situações distintas.

Uma função pode retornar, para a entidade que a invocou, um valor como
resultado do seu trabalho (DAMAS, 2016, p. 104).

Uma função é conhecida com vários nomes, como método, sub-rotina, procedimento etc. A forma
geral de uma definição de função na linguagem de programação C é dada a seguir.

return_type nome_da_funcao (lista de parâmetros){


// corpo da função
}

Uma definição de função na linguagem de programação C consiste em um cabeçalho de função


e possui um corpo funcional. A seguir estão todas as partes de uma função

• Tipo de retorno: uma função pode retornar um valor. O return_type é o tipo de dados que a
função retorna (valor). Algumas funções executam as operações desejadas sem a necessidade de
retornar um valor. Nesse caso, o return_type será a palavra-chave void (vazio).

• Nome da função: o nome real da função; o nome da função e a lista de parâmetros, juntos,
constituem a assinatura da função.

• Parâmetros: um parâmetro é como um espaço reservado. Quando uma função é chamada, você
passa um valor para o parâmetro e este valor é referido como parâmetro ou argumento real.
A lista de parâmetros refere-se ao tipo, ordem e número dos parâmetros de uma função. Os
parâmetros são opcionais, isto é, uma função pode não conter parâmetros.

• Corpo da função: o corpo da função contém uma coleção de instruções que define a sua
funcionalidade.

120
ALGORITMOS

Veja um exemplo a seguir.

A)

B)

Figura 56 – Exemplo da utilização da implementação da Função em C (imagem do programa Dev C++)

Saiba mais

Para conhecer um pouco mais sobre a funções na linguagem C, você


pode ler o capítulo sobre funções da obra indicada a seguir.

MIZRAHI, V. V. Treinamento em linguagem C. São Paulo: Pearson, 2008.

121
Unidade III

Exemplo de aplicação

Pesquise exemplos de programas que utilizam as funções para auxiliar na organização do código fonte.

Lembrete

Todo programa em C possui pelo menos uma função, que é a função


main(), e todos os programas mais triviais podem definir algumas
funções específicas.

5.1 Objetos e classes

5.1.1 Introdução à programação orientada a objetos

Na programação orientada a objetos (POO), o programa é feito de objetos, com certas


propriedades e operações que eles, os objetos, podem executar; nesse sentido, você deve se
preocupar com o que os objetos expõem. Então, assim como certos fabricantes de computadores
não se importam com as partes internas de uma fonte de alimentação desde que ela faça o que
eles querem, a maioria dos programadores de linguagens que utilizam a POO não se importam
com a maneira como um objeto é implementado desde que ele realize a tarefa desejada.

Observação

A POO é a programação dominante nos paradigmas atuais, tendo


substituído a programação estruturada, que é baseada em técnicas de
programação desenvolvidas no início dos anos 1970.

A programação estruturada tradicional consiste em projetar um conjunto de funções (ou algoritmos)


para resolver um problema. Depois que as funções foram determinadas, o próximo passo é encontrar
maneiras apropriadas de armazenar os dados. A principal preocupação, nesse contexto, é o
desenvolvimento dos algoritmos, com as estruturas de dados ficando em segundo plano.

A POO inverte essa ordem e coloca os dados do primeiro plano, para, em seguida, analisar
os algoritmos que operam os dados. A chave para ser mais produtivo na POO é tornar cada
objeto responsável por executar um conjunto de tarefas relacionadas. Se um objeto depende
de uma tarefa que não é de sua responsabilidade, ele precisa ter acesso a outro objeto cujas
responsabilidades incluam essa tarefa. Dessa forma, o primeiro objeto pede ao segundo objeto
para executar a tarefa.

122
ALGORITMOS

Em particular, um objeto nunca deve manipular diretamente os dados internos de outro


objeto nem deve expor dados para outros objetos acessarem diretamente suas informações. A
comunicação deve ser realizada através das chamadas de método: ao encapsular os dados do objeto,
você conseguirá maximizar a sua reutilização, poderá reduzir a dependência de dados e minimizar
o tempo de depuração. Obviamente, assim como os módulos em uma linguagem orientada a
procedimentos, não se deseja que um objeto individual tenha uma sobrecarga de ações. Assim, o
design e a depuração são simplificados quando você cria objetos pequenos, que executam algumas
tarefas, em vez de utilizar objetos gigantescos, com dados internos extremamente complexos e
com centenas de funções para manipular os dados.

Exemplo de aplicação

Pesquise sobre as diferenças entre as linguagens estruturadas e as linguagens orientadas a objetos.

5.1.2 Objetos

Para trabalhar com POO, você deve identificar três características principais dos objetos,
listadas a seguir.

• Comportamento do objeto: o que você pode fazer com esse objeto ou quais métodos é
possível acessar?

• Estado do objeto: como o objeto reage quando você aplica esses métodos?

• Identidade do objeto: como o objeto se distingue dos outros que podem ter o mesmo
comportamento e estado?

Os objetos são criados a partir de uma classe usando o novo operador, que chama um construtor
com tipos de parâmetros correspondentes. Esses objetos podem ser atribuídos a variáveis ​​declaradas
do tipo dado pelo nome da classe; cada objeto tem uma cópia de cada variável de instância em sua
classe e em todas as superclasses dessa classe.

Os métodos de instância em uma classe podem ser chamados apenas com um objeto do tipo de
classe (ou uma subclasse). Esse objeto é chamado de receptor do método e pode ser referido dentro
do método. Todos os objetos que são instâncias da mesma classe compartilham uma semelhança,
suportando o mesmo comportamento. O comportamento de um objeto é definido pelos métodos
que você pode instanciar.

Em seguida, cada objeto armazena informações sobre o estado do objeto. O estado de um objeto
pode mudar com o tempo, mas não espontaneamente. Uma mudança no estado de um objeto deve
ser uma consequência das chamadas de método. No entanto, o estado de um objeto não o descreve
completamente, pois cada objeto tem uma identidade distinta. Por exemplo, em um sistema de
processamento de pedidos, os pedidos são distintos, mesmo que solicitem itens idênticos.

123
Unidade III

Observe que os objetos individuais que são instâncias de uma classe sempre diferem em
sua identidade e geralmente diferem em seu estado. Por exemplo, o estado de um objeto pode
influenciar seu comportamento.

5.1.3 Classes

Uma classe consiste em um tipo de instância e um objeto de classe.

Um tipo de instância é uma estrutura que contém membros variáveis chamados


​​ de variáveis da
​​
instância e membros da função chamados de métodos da instância.

Um objeto de classe é uma variável global, contendo variáveis ​​e métodos de classe. Esses
membros pertencem a toda a classe sem nenhuma referência a nenhuma instância.

Construtores

As instâncias devem ser inicializadas pelos construtores quando declaradas, e os construtores


devem ser métodos da classe. O construtor deve preferencialmente retornar um tipo de instância,
mas também pode retornar um ponteiro para um tipo de instância.

5.1.4 Storage classes

A classe storage define o escopo (visibilidade) e o tempo de vida das variáveis e/ou
​​ funções
dentro de um programa C. Esses especificadores precedem o tipo que eles modificam. Existem as
seguintes classes de armazenamento que podem ser usadas em um programa C:

• auto;

• register;

• static;

• extern.

124
ALGORITMOS

Classe auto storage

A classe de armazenamento automático é a classe de armazenamento padrão para todas as


variáveis ​​locais.

{
int numero1;
auto int numero2;
}

Observação

É importante ressaltar que auto só pode ser usado em funções, ou seja,


variáveis ​​locais.

Classe register storage

A classe de armazenamento de registro é usada para definir variáveis ​​locais que devem ser
armazenadas e registradas na memória RAM. Isso significa que a variável tem um tamanho máximo
e não pode apresentar o operador ‘&’ unário aplicado a ela.

{
register int numero1;
}

O registro deve ser usado apenas para variáveis ​​que requerem acesso rápido, como contadores.
Vale esclarecer que definir como register não significa que a variável será armazenada em um
registro: isso significa que pode ser armazenado em um registro, dependendo do hardware e das
restrições de implementação.

Classe static storage

Tornar as variáveis ​​locais estáticas permite que elas mantenham os seus valores entre as
chamadas de função. O modificador estático também pode ser aplicado a variáveis globais.
​​ A partir
dessa definição, é possível implementar o programa na linguagem de programação C.

125
Unidade III

Veja o código a seguir.

A)

B)

Figura 57 – Implementação do problema apresentado (imagem do programa Dev C++)

Observação

A classe de armazenamento estático instrui o compilador a manter uma


variável local ativa durante a vida útil do programa, em vez de criá-la e
destruí-la a cada vez que entra e sai do escopo.

5.2 Atributos e associações

5.2.1 Atributos

Os atributos são um mecanismo por meio do qual o desenvolvedor pode anexar informações
extras às entidades da linguagem com uma sintaxe generalizada em vez de introduzir novas
construções sintáticas ou palavras-chave para cada recurso. Essa informação destina-se a ser
usada por uma implementação de maneira que tenha um mínimo de semântica, como melhorar a
qualidade dos diagnósticos produzidos por uma implementação ou especificar o comportamento
específico da plataforma.

126
ALGORITMOS

Os atributos destinam-se a situações leves em que as palavras-chave podem ser inadequadas,


mas não pretendem descartar a necessidade ou capacidade de adicionar essas palavras-chave
quando apropriado.

5.2.2 Associações

Associação é um relacionamento (* a *) entre duas classes, permitindo que uma instância de


objeto utilize outro elemento para executar uma ação em seu nome. Pode-se dizer que associação
é o termo mais geral que define o relacionamento entre duas classes, trata-se da forma mais
simples de relação entre classes.

A associação constitui-se em um relacionamento ponto a ponto, um relacionamento estrutural


que descreve um conjunto de links (ou seja, as conexões entre os objetos). É um relacionamento
entre dois ou mais classificadores que envolve a conexão entre as instâncias. De acordo com Ojo e
Estevez (2005), as associações entre as classes A e B podem ser:

• A é uma parte física ou lógica de B;

• A é um tipo de B;

• A está contido em B;

• A é uma descrição de B;

• A é um membro de B;

• A é uma subunidade da organização de B;

• A usa ou gerencia B;

• A se comunica com B;

• A segue B;

• A é propriedade de B.

5.3 Métodos

A programação orientada a objetos (POO) foi usada para melhorar a qualidade, a produtividade
e a reutilização de componentes de software. Nesse paradigma de programação, os principais
agentes ou objetos do aplicativo devem ser identificados. Os objetos possuem dados e métodos
que descrevem seus recursos e comportamento. Um programa orientado a objetos é implementado
como um conjunto de classes e os objetos são criados a partir das instâncias de sua classe. Portanto,
as classes são a unidade básica de modularização em um ambiente orientado a objetos.
127
Unidade III

Os objetos se comunicam pelo mecanismo da mensagem. Com base em seus métodos, o


objeto de recebimento deve interpretar a mensagem, executar o respectivo conjunto de
operações e retornar o resultado à instância de envio. Uma classe encapsula informações que
são acessadas apenas por mensagens, cabendo ressaltar que uma mensagem com o mesmo
nome pode representar operações diferentes através do conceito de polimorfismo. Por exemplo,
a mensagem + pode ser uma adição para uma classe de matriz e também uma concatenação
para uma classe de sequência.

Observação

Os métodos representam comportamentos. Eles podem retornar


as informações sobre um objeto ou atualizar os dados de um objeto. O
código do método é definido na definição de classe. Quando os objetos
individuais são instanciados, esses objetos podem chamar os métodos
definidos na classe.

É possível reutilizar os métodos e manter a funcionalidade encapsulada dentro de um objeto.


Essa reutilização é um grande benefício na depuração: se houver um erro, há apenas um lugar para
encontrá-lo e corrigi-lo em vez de muitos locais em seu código.

O mecanismo de herança permite implementar hierarquias de classe nas quais as classes de


nível inferior herdam dados e métodos das classes de nível superior. Dessa maneira, é possível
estender e reutilizar classes em muitos aplicativos adicionando novas variáveis ​​e métodos para
descrever conceitos mais específicos na hierarquia de classes.

Lembrete

Nas linguagens procedurais, o programa é decomposto em funções


e procedimentos. Na programação orientada a objetos, os objetos
representam algum comportamento usando dados e métodos. Por exemplo,
os vetores e as matrizes são classes comuns para aplicativos de álgebra
linear. Procedimentos para multiplicação de matrizes e produtos vetoriais
são implementados como métodos dessas classes.

128
ALGORITMOS

6 UTILIZAÇÃO DE ARQUIVOS, DIRETÓRIOS E DISCOS

6.1 Formatação de impressão

6.1.1 Entrada e saída de dados

Segundo Manzano:

Toda ação de entrada e saída efetivada com a linguagem C,


independentemente de essas ações se darem de forma direta ou indireta,
sempre realiza a ação do tratamento de cadeias ou caracteres e sua
conversão para o tipo adequado usado pela linguagem.

Em diversos momentos da apresentação desta obra foram usadas para


as operações de entrada e saída de dados diversas funções, tais como as
funções de entrada scanf() / scanf_s(), getchar(), fgetc(), fgets(), fscanf()
/ fscanf_s() e sscanf() / sscanf_s(), além das funções de saída printf() /
printf_s(), putchar(), fputc(), fputs(), fprintf() / fprintf_s(), puts() e sprintf() /
sprintf_s(), snprintf() / snprintf_s().

As ações foram efetivadas de diversas maneiras, desde por meio dos


periféricos-padrão de entrada (teclado) e saída (monitor de vídeo) até operações
com arquivos em disco e buffers de memória, mas sempre contextualizadas
à medida que eram necessárias (MANZANO, 2015, p. 390-391).

Quadro 9 – Relação entre as funções de entrada e saída de dados

Entrada Saída
- snprintf() / snprintf_s()
fgetc() fputc()
fgets() fputs()
fscanf() / fsacanf_s() fprintf() / fprintf_s()
getchar() putchar()
gets() / gets_s() puts()
scanf() / scanf_s() printf() / printf_s()
sscanf() / sscanf_s() sprintf() / sprint_s()

Fonte: Manzano (2015, p. 391).

129
Unidade III

Para Soffner:

A linguagem C não determina um tipo específico para a manipulação de


strings (que são vetores ou cadeias de caracteres, terminados pelo caractere
NULL). Para isso, fornece uma completa biblioteca de funções específicas
(string.h). Funções que manipulam strings a percorrem até encontrar o
caractere NULL, quando saberão que ela terminou. Utilizamos, portanto,
o caractere zero da tabela ASCII (‘\0’) para encerrar a string, e este ocupa um
espaço que deve ser previsto pelo programador, como visto anteriormente.
A relação entre strings e vetores é, dessa forma, direta. Uma string é
um vetor de caracteres, mas nem todo vetor de caracteres é uma string
(SOFFNER, 2013, p. 92).

A partir dessa definição, é possível implementar o programa na linguagem de programação C.


Veja o código a seguir.

A)

B)

Figura 58 – Implementação do problema apresentado (imagem do programa Dev C++)

Neste próximo exemplo, é possível verificar o comprimento de uma string.

130
ALGORITMOS

A)

B)

Figura 59 – Implementação do problema apresentado (imagem do programa Dev C++)

Retomando Soffner:

Outras importantes funções de manipulação de strings são:

• strcpy( ): copia uma string em outra;

• strcat( ): adiciona o conteúdo de uma string em outra;

• strlwr( ): converte conteúdo para minúsculas;

• strupr( ): converte conteúdo para maiúsculas;

• strcmp( ): compara duas strings (SOFFNER, 2013, p. 94).

131
Unidade III

No exemplo a seguir, é possível verificar a aplicação da função strcmp( ), que realiza a comparação
de duas string que serão digitadas pelo usuário.

A)

B)

Figura 60 – Implementação do problema apresentado (imagem do programa Dev C++)

Saiba mais

Para conhecer um pouco mais sobre a entrada de dados, leia o capítulo


abordando teclado e cursor na obra indicada a seguir.

MIZRAHI, V. V. Treinamento em linguagem C. São Paulo: Pearson, 2008.

Exemplo de aplicação

Pesquise sobre as funções de manipulação de strings disponíveis na linguagem C.

132
ALGORITMOS

6.1.2 Arquivos

Sobre o assunto, diz Manzano:

A principal vantagem de um arquivo é que as informações armazenadas


podem ser consultadas a qualquer momento. Outra vantagem é o fato de
armazenar um número maior de registros do que uma tabela em memória.
Está limitado apenas ao tamanho do meio físico para gravação.

É um conjunto de registros (que pode ser apenas um registro) que, por sua
vez, é um conjunto de campos (que pode ser apenas um campo), sendo cada
campo o conjunto de informações (MANZANO, 2013, p. 192).

Ainda de acordo com Manzano (2013), o tipo de abertura de um arquivo é especificado por três
códigos do tipo string, a saber:

• letra r para leitura (read);

• letra w para gravação (write);

• letra a para adicionar dados (append).

A seguir, temos um quadro com essa representação.

Quadro 10 – Opções de acesso a arquivos

Tipo de abertura Descrição


Esse código permite apenas abrir um arquivo de texto para a leitura de seus dados. É necessário
R que o arquivo esteja presente no disco
Esse código permite apenas abrir um arquivo texto para escrita (gravação). Também cria o
W arquivo para ser trabalhado. Caso o arquivo exista, esse código recria o arquivo, ou seja, você
perde o arquivo criado anteriormente (por isso, deve ser usado com muito cuidado)
Esse código permite apenas abrir um arquivo de texto para escrita (gravação), possibilitando
A acrescentar novos dados ao final dele. Caso o arquivo não exista, ele será, então, criado

Fonte: Manzano (2013, p. 391).

Na quadro 11, são apresentadas as funções específicas para se trabalhar com arquivos.

Quadro 11 – Opções de acesso a arquivos

Funções de manipulação de arquivos


fopen( ) Abre um arquivo para trabalho
fclose( ) Fecha o arquivo

133
Unidade III

Funções de manipulação de arquivos


putc( ) Escreve um caractere no arquivo aberto
fputc( ) Mesma função de putc( )
getc( ) Lê um caractere do arquivo de trabalho
fgetc( ) Mesma função de getc( )
fseek( ) Posiciona o ponteiro de arquivo em um byte específico
rewind( ) Posiciona o ponteiro de arquivo no início deste
fprintf( ) Idem ao printf na saída-padrão
fscanf( ) Idem ao scanf na entrada-padrão

Adaptado de: Soffner (2013, p. 159).

Para iniciar as operações com um arquivo, o primeiro passo é criá-lo. No exemplo a seguir, é
apresentado o código para a criação do arquivo e o print da criação após a sua execução.

A)

B)

C)

Figura 61 – Criação de arquivo (imagem do programa Dev C++ e do diretório do Windows)

134
ALGORITMOS

Lembrete

Após a criação do arquivo, é possível utilizá-lo para a gravação dos


dados e/ou informações.

Veja o código a seguir, por meio do qual é possível criar um arquivo, utilizando-o após
sua gravação.

A)

B)

C)

Figura 62 – Manipulação do arquivo (imagem do programa Dev C++ e do Bloco de Notas que foi criado)

135
Unidade III

O próximo exemplo mostra que é possível acessar as informações que foram escritas no arquivo
texto, exibindo o seu conteúdo. Observe o código com essa ação.

A)

B)

Figura 63 – Manipulação do Arquivo (imagem do programa Dev C++)

Na sequência, temos um exemplo mostrando que é possível salvar o texto de uma frase no
arquivo que será gerado.

136
ALGORITMOS

A)

B)

Figura 64 – Salvando o texto de uma frase completa (imagem do programa Dev C++)

O próximo exemplo ilustra como abrir o arquivo de modo que seja possível acrescentar um
novo texto ao conteúdo, gravando-se, depois, a alteração.

137
Unidade III

A)

B)

C)

Figura 65 – Acrescentando texto ao arquivo (imagem do programa Dev C++ e do Bloco de Notas que foi gerado)

138
ALGORITMOS

Saiba mais

Para conhecer um pouco mais sobre o assunto, você pode ler o capítulo
sobre arquivos da obra indicada a seguir.

SOFFNER, R. Algoritmos e programação em linguagem C. São Paulo:


Saraiva, 2013.

Resumo

Vimos que a função é um grupo de instruções que, juntas, executam


uma tarefa. Todo programa em C possui pelo menos uma função, que
é a função main(), e todos os programas mais triviais podem definir
algumas funções específicas.

Foi discutido que na POO o programa é feito de objetos, com certas


propriedades e operações que os objetos podem executar. Nesse sentido,
você deve se preocupar com o que os objetos expõem. Então, assim como
os fabricantes de computadores não se importam com as partes internas de
uma fonte de alimentação que corresponde a suas expectativas, a maioria
dos programadores de linguagens que utilizam a POO não se importam
com a maneira como um objeto é implementado desde que tais objetos
cumpram suas funções.

Os métodos de instância em uma classe podem ser chamados apenas


com um objeto do tipo de classe (ou uma subclasse). Esse objeto é chamado
de receptor do método e pode ser referido dentro do método. Todos os
objetos que são instâncias da mesma classe compartilham uma semelhança,
suportando o mesmo comportamento. O comportamento de um objeto é
definido pelos métodos que você pode instanciar.

Viu-se também que linguagem C não determina um tipo específico


para a manipulação de strings (que são vetores ou cadeias de caracteres,
terminados pelo caractere NULL). Para isso, fornece uma completa biblioteca
de funções específicas (string.h).

Na sequência, abordamos a utilização dos arquivos na linguagem


de programação C. A principal vantagem de um arquivo é o fato de as
informações armazenadas poderem ser consultadas a qualquer momento.
Outra vantagem é a possibilidade de se armazenar um número maior de
registros do que uma tabela em memória. O arquivo está limitado apenas
ao tamanho do meio físico para gravação.
139
Unidade III

Exercícios

Questão 1. A sequência de Fibonacci é uma sequência numérica em que o número atual é obtido
a partir da soma dos dois números anteriores. Os primeiros números dessa sequência são 0 e 1.

Com base no exposto, analise o trecho de programa em linguagem C dado a seguir.

int fibonacci(int num)

{
if(num==1 || num==2)
return 1;
else
return fibonacci(num-1) + fibonacci(num-2);
}

Sobre a função anterior, analise as afirmativas.

I – A função trabalha com dois argumentos, int e num.

II – A função retorna a série de Fibonacci.

III – A função é um exemplo de função recursiva, ou seja, que faz uso dela mesma.

IV – No condicional, temos o operador lógico E.

É correto o que se afirma apenas em:

A) I e IV.

B) II.

C) III.

D) I e II.

E) II, III e IV.

Resposta correta: alternativa C.

140
ALGORITMOS

Análise das afirmativas

I – Afirmativa incorreta.

Justificativa: quando trabalhamos com funções em linguagem C, devemos passar como


argumento o tipo da variável seguido do nome da variável. Logo, nesse caso, o argumento da
função Fibonacci é apenas a variável num, que é do tipo inteiro.

II – Afirmativa incorreta.

Justificativa: vemos que a função retorna o número 1 ou o resultado da soma da função com
argumentos num-1 e num-2. Logo, ela retorna apenas um termo da série de Fibonacci, não a
série completa.

III – Afirmativa correta.

Justificativa: vemos, na última linha do código da função, o que segue.

return fibonacci(num-1) + fibonacci(num-2);

Logo, a função faz uma chamada de si mesma, o que caracteriza uma função recursiva.

IV – Afirmativa incorreta.

Justificativa: em linguagem C, o operador lógico E é representado pelo símbolo &&, enquanto


o operador lógico OU é representado pelo símbolo ||.

Questão 2. Considere o código em linguagem C e analise as afirmativas a seguir.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
FILE *pont;
int num;
pont=fopen(“arquivo.txt”,”a”);
fprintf(pont, “%i”, num);
fclose(pont);
}

141
Unidade III

I – A saída de dados do programa é feita na tela.

II – A saída de dados é feita no arquivo arquivo.txt.

III – As funções fopen() e fclose() fazem, respectivamente, o acesso e o fechamento de arquivos.

IV – A saída do programa é a palavra num.

É correto o que se afirma apenas em:

A) I e IV.

B) II.

C) III e IV.

D) I e II.

E) II e III.

Resposta correta: alternativa E.

Análise das afirmativas

I – Afirmativa incorreta.

Justificativa: a saída de dados na tela é feita pela função printf(). No código, temos a função
fprintf(), que faz a saída de dados em um arquivo.

II – Afirmativa correta.

Justificativa: vemos, na linha de código a seguir, que é acessado o arquivo arquivo.txt. Logo,
a saída de dados é feita como uma inclusão (note o parâmetro “a”, de append, “acrescentar”)
nesse arquivo.

PRTARQ=fopen(“arquivo.txt”,”a”);

III – Afirmativa correta.

Justificativa: as funções fopen() e fclose() são as funções em linguagem C que fazem o acesso
e o fechamento de arquivos.

142
ALGORITMOS

IV – Afirmativa incorreta.

Justificativa: a saída do programa é o conteúdo da variável num, que armazena números


inteiros, e não a palavra num, como pode ser visto na linha a seguir.

fprintf(PRTARQ, “%i”, num);

Para que a saída fosse a palavra “num”, a linha de código deveria ser:

fprintf(PRTARQ, “%s”,” num”);

Ou seja, a saída deveria ser do tipo string (%s) e teríamos a palavra “num” entre parênteses
como argumento da função. Se usamos num sem parênteses, fazemos referência ao conteúdo dessa
variável. Se usamos “num” entre parênteses, fazemos referência à sequência de caracteres num.

143

Você também pode gostar