Baixe o app para aproveitar ainda mais
Prévia do material em texto
118 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. 119 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 stdio.h Essa biblioteca é a mais utilizada na programação em línguagem C, pois é a padrão, na qual estão embutidas as funções printf(), puts(), gets(), scanf(), entre outras math.h Possui as funções matemáticas usadas pela linguagem. Encontram-se funções trigonométricas, hiperbólicas, exponenciais, logarítmicas, entre outras string.h Esta possui as rotinas de tratamento de strings e caracteres, na qual se encontram as funções strcmp() e strcpy(), entre outras time.h Essa biblioteca possui as funções de manipulação de data e hora do sistema stdlib.h Possui um conjunto de funções que não se enquadra 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. 120 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. 121 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. 122 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. 123 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 quandovocê 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. 124 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. 125 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. 126 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. 127 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. 128 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íciona 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. 129 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 - fgetc() fgets() fscanf() / fsacanf_s() getchar() gets() / gets_s() scanf() / scanf_s() sscanf() / sscanf_s() snprintf() / snprintf_s() fputc() fputs() fprintf() / fprintf_s() putchar() puts() printf() / printf_s() sprintf() / sprint_s() Fonte: Manzano (2015, p. 391). 130 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. 131 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). 132 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. 133 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 R Esse código permite apenas abrir um arquivo de texto para a leitura de seus dados. É necessário que o arquivo esteja presente no disco W Esse código permite apenas abrir um arquivo texto para escrita (gravação). Também cria o 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) A Esse código permite apenas abrir um arquivo de texto para escrita (gravação), possibilitando 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 134 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) 135 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) 136 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. 137 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. 138 Unidade III A) B) C) Figura 65 – Acrescentando texto ao arquivo (imagem do programa Dev C++ e do Bloco de Notas que foi gerado) 139 ALGORITMOSSaiba 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. 140 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. 141 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); } 142 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. 143 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.
Compartilhar