Prévia do material em texto
<p>APLICAÇÕES DE PROGRAMAÇÃO</p><p>Aula 1</p><p>PROGRAMAÇÃO E FUNÇÕES COM VETORES</p><p>Programação e funções com vetores</p><p>Olá, estudante! Nesta videoaula faremos uma imersão completa nos fundamentos de vetores. Em nossa jornada de</p><p>aprendizado, exploraremos os conceitos cruciais, as características e a sintaxe essencial para compreender e utilizar vetores de</p><p>maneira eficaz.</p><p>A aula abordará, de forma didática, a definição de vetores, destacando suas características principais e apresentando exemplos</p><p>ilustrativos que facilitarão a assimilação dos conceitos. Nesse processo, nos dedicaremos, também, à sua declaração. Na</p><p>sequência, examinaremos o acesso aos vetores e seus elementos, proporcionando insights práticos sobre como manipular e</p><p>utilizar eficientemente as informações armazenadas. O conhecimento desses aspectos será, pois, crucial para o</p><p>desenvolvimento de soluções computacionais robustas e eficazes.</p><p>Não perca a oportunidade de enriquecer seus conhecimentos nesse tema tão importante da programação. Junte-se a nós nesta</p><p>jornada de descobertas e fortaleça suas habilidades computacionais. Sua participação é fundamental para o sucesso coletivo!</p><p>Clique aqui para acessar os slides da sua videoaula.</p><p>Bons estudos!</p><p>Ponto de Partida</p><p>https://cm-kls-content.s3.amazonaws.com/202401/ALEXANDRIA/ALGORITMOS_E_LOGICA_DE_PROGRAMACAO/PPT/u4a1_algo_log_pro.pdf</p><p>Olá, caro estudante! Seja muito bem-vindo à nossa primeira aula desta Unidade sobre os fundamentos essenciais dos vetores.</p><p>Este conteúdo será de grande valia na construção de seu conhecimento na área, abrindo portas para oportunidades</p><p>profissionais e desenvolvendo seu raciocínio lógico e capacidade de resolução de problemas.</p><p>Assim como a programação se tornou uma habilidade indispensável em diversos setores, hoje os vetores também</p><p>desempenham um papel vital em várias aplicações. Durante esta aula, vamos nos debruçar sobre a definição, as características</p><p>e a sintaxe de vetores, proporcionando uma base sólida para a compreensão e aplicação prática do assunto. Na sequência,</p><p>será proposto um exercício com vetores para o entendimento desse valioso elemento no desenvolvimento de algoritmos.</p><p>Para ilustrar a aprendizagem desta aula, imagine que em um exercício, seu professor lança um desafio para você desenvolva</p><p>um programa em C que seja possível passar vetores com todos os elementos por parâmetro para uma função.</p><p>Ao final desta aula, você estará familiarizado teoricamente com a declaração de vetores e com a habilidade de acessar e</p><p>manipular seus elementos e terá as ferramentas necessárias para armazenar e gerenciar informações de maneira eficaz.</p><p>Dedique-se aos tópicos abordados, pratique ativamente e trilhe sua trajetória na área de algoritmos. Boa aula!</p><p>Vamos Começar!</p><p>A programação é um campo vasto e dinâmico, repleto de desafios e possibilidades. No cerne dessa disciplina, estruturas de</p><p>dados são determinantes, moldando a maneira como os programadores organizam e manipulam informações. Entre essas</p><p>estruturas, os vetores destacam-se como uma ferramenta fundamental em linguagens de programação como C. A habilidade de</p><p>entender, declarar e manipular vetores é essencial para construir algoritmos eficientes e soluções robustas.</p><p>Os vetores em C são uma forma estruturada de armazenar dados homogêneos, permitindo a fácil manipulação de conjuntos de</p><p>informações de forma sequencial. Este artigo mergulha nas entranhas dessa estrutura, explorando desde a definição e</p><p>características até a sintaxe de declaração e acesso aos elementos. Ao compreender esses aspectos fundamentais, os</p><p>programadores podem aprimorar significativamente suas habilidades de desenvolvimento, tornando-se capazes de criar</p><p>programas mais produtivos e legíveis.</p><p>A capacidade de declarar e acessar vetores não é apenas um conhecimento técnico, mas também uma habilidade que promove</p><p>a modularidade e escalabilidade do código. Esta aula, então, se propõe a guiar você, estudante, através dos princípios básicos,</p><p>fornecendo exemplos práticos que ilustram a aplicação desses conceitos. Espera-se, ao fim, que você se sinta capacitado a</p><p>utilizar vetores de maneira efetiva em seus projetos, contribuindo, assim, para o desenvolvimento de softwares mais</p><p>estruturados e eficazes.</p><p>Definição, características e sintaxe de vetores</p><p>Os vetores, em linguagem C, são estruturas de dados que proporcionam uma maneira eficiente de organizar e manipular</p><p>conjuntos homogêneos de informações. Essencialmente, um vetor é uma sequência ordenada de elementos do mesmo tipo,</p><p>armazenados de forma contígua na memória. Sua principal característica reside na capacidade de acessar cada elemento</p><p>individualmente através de índices, facilitando a implementação de algoritmos complexos e o gerenciamento eficaz de dados.</p><p>As propriedades distintivas dos vetores incluem, pois, a organização sequencial dos elementos, permitindo um acesso direto e</p><p>eficiente a qualquer posição do vetor. Além disso, eles possuem um tamanho fixo, determinado durante a declaração. Isso</p><p>implica que a quantidade de elementos não pode ser alterada dinamicamente durante a execução do programa, o que, por um</p><p>lado, proporciona um acesso rápido, mas, por outro lado, impõe limitações em termos de escalabilidade dinâmica.</p><p>A sintaxe de vetores em C segue um padrão específico, na qual o tipo de dado é seguido pelo nome do vetor e o número de</p><p>elementos, delimitado por colchetes. Por exemplo, a sintaxe "int numeros[5];" cria um vetor chamado "numeros" capaz de</p><p>armazenar cinco números inteiros. A partir dessa declaração, os programadores podem acessar e manipular cada elemento</p><p>utilizando índices, iniciando do índice zero até o número total de elementos menos um. Vale lembrar que os índices sempre são</p><p>valores inteiros, então sempre devemos pensar na sintaxe para a criação de um vetor. Logo, temos:</p><p>tipo nome_do_vetor[tamanho];</p><p>Em que “tipo” é a classificação do tipo de dado que o vetor vai trabalhar, isto é, informações numéricas, textuais, lógicas etc. Já</p><p>o “nome_do_vetor”, é o identificador atribuído ao vetor. Esse nome é utilizado para referenciar e manipular o vetor ao longo do</p><p>código. Por exemplo, em “int numeros[5];”, “numeros” é o nome do vetor. Por fim, o “tamanho”, indica o número de elementos</p><p>que o vetor pode armazenar. Este valor deve ser um inteiro não negativo. O tamanho do vetor é fixado durante a declaração e</p><p>não pode ser alterado dinamicamente durante a execução do programa, pois ele é definido de forma estática.</p><p>Se fossemos pensar no vetor “números” mencionado acima, na forma gráfica, na memória do computador, teríamos 5 espaços</p><p>para armazenar 5 valores diferentes. Observe a Tabela 1:</p><p>Tabela 1 | Exemplo de vetor. Fonte: elaborada pelo autor.</p><p>Note que o vetor está exemplificado de forma horizontal; à esquerda temos o início do vetor e à direita o final dele. Portanto, os</p><p>índices iniciam sempre no 0 (zero) e terminam um número a menos que o tamanho do vetor, 4 (quatro), totalizando 5 (cinco)</p><p>espaços na memória. Isso quer dizer que em um vetor de 5 elementos, o seu maior índice será o número 4. Da mesma maneira,</p><p>se criarmos um vetor de 38 elementos, o seu maior índice será o número 37, e assim sucessivamente.</p><p>Os vetores em C fornecem uma organização eficaz para dados, mas, além disso, oferecem uma sintaxe clara e características</p><p>específicas que facilitam o desenvolvimento de algoritmos eficientes. A compreensão da definição, características e sintaxe</p><p>dessas estruturas é fundamental para explorar plenamente o potencial dessa ferramenta no contexto da programação em C.</p><p>Declaração de vetores</p><p>Todos os recursos utilizados na programação e dentro do código-fonte para a construção do algoritmo, que sempre terá como</p><p>objetivo resolver um problema, devem ser declarados. Mas, o que seria essa declaração? E por que ela deve ser realizada?</p><p>A declaração de recursos, variáveis ou constantes, é necessária para a criação do objeto no algoritmo. Veja o exemplo a seguir:</p><p>Figura 1 | Erro na declaração de variáveis. Fonte: elaborada pelo autor.</p><p>O código da Figura 1 apresenta a criação do</p><p>rendimentos anuais de um contribuinte. Os requisitos detalhados são os seguintes:</p><p>Entrada de dados</p><p>A função deve receber como parâmetro a renda anual do contribuinte.</p><p>Faixas de renda</p><p>A tabela de alíquotas é dividida em faixas de renda.</p><p>Considerar três faixas: até R$ 50.000, de R$ 50.001 até R$ 100.000, e acima de R$ 100.000.</p><p>Alíquotas e deduções</p><p>Estabelecer alíquotas de imposto diferentes para cada faixa.</p><p>Definir valores fictícios para as alíquotas.</p><p>Incluir deduções fiscais para cada faixa.</p><p>Cálculo do imposto</p><p>Realizar o cálculo do imposto devido considerando as faixas, alíquotas e deduções estabelecidas.</p><p>Retorno</p><p>A função deve retornar o valor do imposto devido.</p><p>Testes</p><p>Incluir exemplos de uso da função em um programa principal (main) para demonstrar como a função pode ser utilizada.</p><p>Reflita</p><p>A seguir, apresentamos duas questões de reflexão para aprofundar nossa compreensão sobre esses temas:</p><p>1. Funções com vetores</p><p>Refletindo sobre a utilização de funções com vetores, considere como essa abordagem pode otimizar a organização e</p><p>eficiência do código.</p><p>Pense em situações práticas em que a modularidade proporcionada por funções pode facilitar a manipulação de vetores e</p><p>como isso contribui para a manutenção do código.</p><p>Além disso, questione-se sobre como essa prática pode melhorar a legibilidade e a reusabilidade do seu código.</p><p>2. Funções recursivas</p><p>Ao explorar o conceito de funções recursivas, reflita sobre a elegância e simplicidade que essa abordagem pode oferecer</p><p>em certos contextos.</p><p>Considere exemplos de situações em que a recursividade se destaca e questione-se sobre os desafios e as precauções</p><p>necessárias ao utilizar esse recurso.</p><p>Pondere sobre como a compreensão profunda da recursividade pode influenciar a resolução de problemas complexos e</p><p>como você pode aplicar essa técnica de maneira eficiente em seus projetos.</p><p>Refletindo sobre funções com vetores e funções recursivas, percebemos que estes são pilares fundamentais na construção</p><p>de habilidades sólidas em programação.</p><p>O entendimento desses temas não apenas capacita a resolução de problemas específicos, mas também aprimora a</p><p>capacidade de pensar de forma algorítmica.</p><p>Dê o Play!</p><p>Clique aqui para acessar os slides do Dê o play!</p><p>Resolução do estudo de caso</p><p>Cálculo do Imposto de Renda Pessoa Física (IRPF)</p><p>O desenvolvimento da função segue uma lógica de tomada de decisões baseada nas faixas de renda, utilizando estruturas</p><p>condicionais (if, else if). O cálculo do imposto é realizado multiplicando a renda pela alíquota da faixa correspondente e</p><p>https://cm-kls-content.s3.amazonaws.com/202401/ALEXANDRIA/ALGORITMOS_E_LOGICA_DE_PROGRAMACAO/PPT/u4play_algo_log_pro.pdf</p><p>subtraindo as deduções fiscais.</p><p>A seguir, oferecemos uma solução em linguagem C, com um exemplo de programa principal (main) para testar a função de</p><p>cálculo do Imposto de Renda Pessoa Física (IRPF).</p><p>Figura 1 | Cálculo do IRPF. Fonte: elaborada pelo autor.</p><p>Conclusão</p><p>Este estudo de caso destaca a abordagem conceitual na criação da função, apresentando uma visão detalhada dos requisitos</p><p>para o cálculo do Imposto de Renda Pessoa Física (IRPF) em linguagem C.</p><p>Dê o play!</p><p>Assimile</p><p>Nesta linha do tempo, apresentamos, resumidamente, os principais conceitos relacionados a funções com vetores, programação</p><p>com matrizes, a função e recursividade, e registros e arquivos.</p><p>Figura | Programação lógica. Fonte: elaborada pelo autor.</p><p>Referências</p><p>CORMEN, T. et al. Algoritmos: teoria e prática. 3. ed. Rio de Janeiro: LTC, 2022.</p><p>MANZANO, J. A. N. G.; OLIVEIRA, J. F. de. Estudo dirigido de algoritmos. São Paulo: Érica, 2000.</p><p>MENÉNDEZ, A. Simplificando algoritmos. São Paulo: LTC, 2023.</p><p>PINHEIRO, F. de A. C. Elementos de programação em C. Porto Alegre: Bookman, 2012.</p><p>SILVA, F. S. C. da; FINGER, M.; MELO, A. C. V. Lógica para computação. 2. ed. São Paulo: Cengage Learning, 2017.</p><p>ZIVIANI, N. Projeto de algoritmos com implementações em Pascal e C. 3. ed. São Paulo: Cengage Learning, 2011.</p><p>WAZLAWICK, R. S. Introdução a algoritmos e programação com Python: uma abordagem dirigida por testes. Rio de Janeiro:</p><p>LTC, 2018.</p><p>vetor “teste” com a inclusão de 5 valores numéricos aleatórios. Na sequência, é</p><p>utilizado um laço de repetição com o comando “for” para a apresentação em tela dos seus valores. Na linha 8, uma condição</p><p>verifica se no índice 2 do vetor existe o valor “43”, caso o retorno lógico da condição seja verdadeiro, então o conteúdo do índice</p><p>2 do vetor, que é o valor 43, será atribuído na variável que recebeu o nome de “salvo”. Porém, existe um problema no código: a</p><p>variável “salvo” não foi declarada. Observe que na linha 9 ela tem um traço vermelho indicando que há um erro no código.</p><p>Tipo : int 10 20 30 40 50</p><p>Índices 0 1 2 3 4</p><p>Como faríamos para resolver esse problema? Ora, basta declarar a variável no mesmo tipo do vetor. Observe, na Figura 2, o</p><p>código resolvido.</p><p>Figura 2 | Ajustes na declaração de variáveis. Fonte: elaborada pelo autor.</p><p>Façamos, agora, esse mesmo processo com os vetores. A declaração de vetores em linguagem C é um processo fundamental</p><p>na construção de estruturas de dados eficientes. A sintaxe básica envolve especificar o tipo de dado dos elementos, seguido</p><p>pelo nome do vetor e o número de elementos desejados, encapsulados por colchetes. Por exemplo, a declaração int</p><p>numeros[5]; cria um vetor denominado “numeros” capaz de armazenar cinco números inteiros. Essa estrutura fixa a quantidade</p><p>de elementos e estabelece a base para o acesso eficiente a dados sequenciais.</p><p>Ao lado da declaração, a inicialização de vetores é uma prática comum para atribuir valores iniciais aos elementos durante a</p><p>criação. Por exemplo, a declaração int numeros[5] = {10, 20, 30, 40, 50}; cria o vetor “números” com cinco elementos e atribui</p><p>valores específicos a cada um deles. Tal capacidade de inicialização oferece uma maneira concisa de preencher vetores com</p><p>dados relevantes desde o início, facilitando o desenvolvimento de algoritmos coesos.</p><p>Em síntese, a flexibilidade na declaração e inicialização de vetores permite aos programadores adaptarem essas estruturas</p><p>conforme as necessidades específicas de seus algoritmos. Compreender a sintaxe e utilizar exemplos práticos, como os</p><p>mencionados acima, os capacita a criarem estruturas de dados eficazes em C, fornecendo uma base sólida para a manipulação</p><p>eficiente de conjuntos homogêneos de informações.</p><p>Siga em Frente...</p><p>Acesso aos vetores e elementos</p><p>O acesso aos elementos de um vetor em linguagem C é realizado por meio de índices, que representam a posição de cada</p><p>elemento na sequência. Os índices começam geralmente em 0, indicando o primeiro elemento, e vão até o tamanho do vetor</p><p>menos um. A expressão vetor[indice] proporciona acesso direto ao elemento desejado, permitindo a leitura e modificação dos</p><p>dados armazenados. Essa abordagem sequencial e indexada é fundamental para a manipulação precisa e eficiente de</p><p>informações contidas nos vetores.</p><p>Além do acesso individual, iterações através dos elementos de um vetor são comuns em muitos algoritmos. Utilizando estruturas</p><p>de repetição, como o loop “for”, os programadores podem percorrer todo o vetor, acessando e manipulando cada elemento</p><p>sucessivamente. O trecho de código a seguir ilustra como imprimir todos os elementos de um vetor:</p><p>Figura 3 | Exemplo de acesso com índices. Fonte: elaborada pelo autor.</p><p>Neste exemplo, o loop “for” percorrer o vetor “números” e imprime cada elemento juntamente com seu índice correspondente.</p><p>Note que o último índice é 4, e não 5, porque ele inicia em 0.</p><p>O acesso eficiente aos elementos de um vetor, portanto, não apenas simplifica a implementação de algoritmos, mas também</p><p>contribui para a otimização do uso de recursos de memória, pois permite manipular dados de forma organizada e direcionada.</p><p>Vejamos, a título de curiosidade, um código mais avançado, porém bastante interessante, sobre o uso de vetores: um jogo de</p><p>adivinhação em C que utiliza vetores para armazenar e manipular dados em que o jogador tenta adivinhar um número aleatório</p><p>entre 1 e 100.</p><p>Figura 4 | Jogo de adivinhação. Fonte: elaborada pelo autor.</p><p>Figura 5 | Jogo de adivinhação - cont. Fonte: elaborada pelo autor.</p><p>Neste exemplo, o vetor “histórico” é utilizado para armazenar as tentativas do jogador, permitindo ao programa exibir um</p><p>histórico ao final do jogo. O jogo continua até o jogador acertar o número ou atingir o limite de tentativas. O uso de vetores</p><p>facilita o rastreamento e a manipulação dos dados relacionados às tentativas do jogador.</p><p>Explicando melhor:</p><p>Início do programa: o programa começa incluindo bibliotecas necessárias e definindo constantes.</p><p>Inicialização: inicializa a semente para números aleatórios e define um número secreto aleatório entre 1 e 100. Cria um</p><p>vetor para armazenar o histórico de tentativas (historico).</p><p>Jogo principal: um loop inicia, permitindo que o jogador faça várias tentativas.</p><p>Tentativa do jogador: solicita ao jogador para digitar um número. Armazena a tentativa no histórico.</p><p>Verificação da tentativa: se o número digitado for igual ao número secreto, o jogador acertou e o jogo termina. Caso</p><p>contrário, são dadas dicas ao jogador sobre se o número é maior ou menor.</p><p>Limite de tentativas: o jogo verifica se o jogador atingiu o limite de tentativas.</p><p>Exibição do histórico: ao final do jogo, o histórico de tentativas do jogador é exibido.</p><p>Fim do programa: o programa termina.</p><p>Este jogo demonstra como utilizar vetores em C para armazenar e manipular dados, aqui, as tentativas do jogador. Esse uso</p><p>facilita o rastreamento e a exibição do histórico de uma forma organizada.</p><p>Na Figura 6, é possível observar o código rodando.</p><p>Figura 6 | Teste do jogo de adivinhação. Fonte: elaborada pelo autor.</p><p>Conclusão</p><p>Em síntese, a compreensão abrangente sobre vetores em linguagem C abarca a definição, as características, a sintaxe de</p><p>declaração e o acesso eficiente aos elementos. Os vetores proporcionam uma estrutura organizada para armazenar dados</p><p>homogêneos, e sua declaração, feita através da sintaxe específica, determina o tamanho e o tipo de dados que serão</p><p>manipulados. A inicialização de vetores, com exemplos como int numeros[5] = {10, 20, 30, 40, 50};, por seu turno, facilita a</p><p>atribuição de valores iniciais aos elementos.</p><p>Ao acessar os vetores e seus elementos através de índices, os programadores ganham a capacidade de manipular dados de</p><p>forma precisa, seja para leitura, modificação ou iteração. O exemplo prático de um loop “for” que percorre um vetor ilustra como</p><p>essa abordagem sequencial e indexada é aplicada no desenvolvimento de algoritmos.</p><p>Em conjunto, essas qualidades fazem dos vetores em C uma ferramenta indispensável para programadores. Dominar esses</p><p>conceitos proporciona uma base sólida para estruturas de dados, além de capacitar o desenvolvedor a criar algoritmos eficazes,</p><p>contribuindo, assim, para o desenvolvimento de software robusto e escalável.</p><p>Vamos Exercitar?</p><p>Retomando a situação apresentada no início da aula, onde você foi desafiado pelos eu professor a fazer um exercício, que</p><p>desenvolva um programa em C que seja possível passar vetores com todos os elementos por parâmetro para uma função.</p><p>O exercício solicita que sejam criados dois vetores de dez elementos atribuídos da seguinte forma:</p><p>Em seguida, que seja criada uma função que receba os dois vetores e some seus elementos, chegando em um valor total. Esse</p><p>valor deve retornar e ser exibido no programa principal.</p><p>Este é um exercício simples, porém, vai testar suas habilidades na construção, passagem por parâmetros de vetores e</p><p>manipulação de elementos em um vetor.</p><p>Vamos à resolução?</p><p>O código a seguir mostra a resolução do exercício:</p><p>vetA[] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100}</p><p>vetB[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}</p><p>Figura 7 | Código do exercício. Fonte: elaborada pelo autor.</p><p>Neste exemplo, a função “somarElementos()” recebe os dois vetores e o tamanho como parâmetros, percorre os elementos de</p><p>ambos e calcula a soma total. O programa principal declara e inicializa os vetores e chama a função para obter o resultado da</p><p>soma, que é então exibido. O resultado será sempre "605", pois os valores foram</p><p>atribuídos de forma fixa no código. Como</p><p>sugestão, altere o programa para que os elementos dos dois vetores sejam atribuídos pelo usuário, assim, o valor exibido pelo</p><p>programa vai depender dos valores que o usuário informar.</p><p>Saiba Mais</p><p>Para saber mais sobre algoritmos e ter uma visão profunda sobre seus fundamentos, acesse, em sua Biblioteca virtual, o</p><p>Capítulo 1, Seção 1, “O papel dos algoritmos na computação”, do livro Algoritmos: teoria e prática, de Thomas Cormen, uma</p><p>excelente referência na área.</p><p>CORMEN, T. et al. Capítulo 1 – Seção 1: O papel dos algoritmos na computação. In: Algoritmos: teoria e prática. 3. ed. Rio de</p><p>Janeiro: LTC, 2022, p. 3-10.</p><p>Referências Bibliográficas</p><p>CORMEN, T. et al. Algoritmos: teoria e prática. 3. ed. Rio de Janeiro: LTC, 2022.</p><p>MANZANO, J. A. N. G.; OLIVEIRA, J. F. de. Estudo dirigido de algoritmos. São Paulo: Érica, 2000.</p><p>MENÉNDEZ, A. Simplificando algoritmos. São Paulo: LTC, 2023.</p><p>SILVA, F. S. C. da; FINGER, M.; MELO, A. C. V. Lógica para computação. 2. ed. São Paulo: Cengage Learning, 2017.</p><p>ZIVIANI, N. Projeto de algoritmos com implementações em Pascal e C. 3. ed. São Paulo: Cengage Learning, 2011.</p><p>Aula 2</p><p>PROGRAMAÇÃO COM MATRIZES</p><p>Programação com matrizes</p><p>Olá, estudante! Nesta videoaula abordaremos os fundamentos das matrizes. Vamos apresentar a definição de matrizes,</p><p>destacando suas características elementares, e exemplos que facilitarão a assimilação do tema. Além disso, exploraremos, em</p><p>detalhes, a atribuição de valores a matrizes. Em seguida, examinaremos a iteração sobre os elementos das matrizes,</p><p>oferecendo insights práticos sobre como manipular e acessar eficientemente as informações armazenadas.</p><p>Será proposto, nesse processo, um exercício prático envolvendo programação com matrizes na linguagem de programação C.</p><p>O domínio desses assuntos será, pois, crucial para o desenvolvimento de soluções computacionais robustas e eficazes,</p><p>ampliando suas habilidades em programação. Aproveite o conteúdo!</p><p>Clique aqui para acessar os slides da sua videoaula.</p><p>Bons estudos!</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788595158092/epubcfi/6/16[%3Bvnd.vst.idref%3Dchapter01]!/4</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788595158092/epubcfi/6/16[%3Bvnd.vst.idref%3Dchapter01]!/4</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788595158092/epubcfi/6/16[%3Bvnd.vst.idref%3Dchapter01]!/4</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788595158092/epubcfi/6/16[%3Bvnd.vst.idref%3Dchapter01]!/4</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788595158092/epubcfi/6/16[%3Bvnd.vst.idref%3Dchapter01]!/4</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788595158092/epubcfi/6/16[%3Bvnd.vst.idref%3Dchapter01]!/4</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788595158092/epubcfi/6/16[%3Bvnd.vst.idref%3Dchapter01]!/4</p><p>https://cm-kls-content.s3.amazonaws.com/202401/ALEXANDRIA/ALGORITMOS_E_LOGICA_DE_PROGRAMACAO/PPT/u4a2_algo_log_pro.pdf</p><p>Ponto de Partida</p><p>Olá, caro estudante! Seja bem-vindo à nossa aula sobre os fundamentos essenciais das matrizes. Vamos aprofundar nossos</p><p>conhecimentos nos conceitos, características e sintaxe de matrizes.</p><p>Para ilustrar a aprendizagem desta aula, você será desafiado a realizar um exercício de programação, no qual você deve criar</p><p>um programa na linguagem de programação C que lide com duas matrizes de ordem 4x4.</p><p>Ao final desta aula, você estará familiarizado teoricamente com a atribuição de valores a matrizes e com a habilidade de iterar</p><p>sobre seus elementos.</p><p>Bons estudos!</p><p>Vamos Começar!</p><p>As matrizes são estruturas de dados essenciais na programação, permitindo a organização eficiente de conjuntos</p><p>bidimensionais de informações. Elas funcionam como tabelas virtuais, facilitando a ordenação sistemática de dados. Nesta aula,</p><p>exploraremos desde os conceitos fundamentais de matrizes, esclarecendo aspectos teóricos do tema, até aplicações práticas</p><p>em C.</p><p>Em primeiro lugar, então, compreenderemos as características distintivas das matrizes em C enquanto estruturas estáticas, com</p><p>tamanhos conhecidos durante o tempo de compilação, cujos índices começam em zero. A sintaxe para declarar matrizes é clara</p><p>e concisa, estabelecendo uma base sólida para a manipulação eficiente de dados.</p><p>Exploraremos, na sequência, como atribuir valores às matrizes, tanto durante a declaração quanto posteriormente, destacando a</p><p>versatilidade dessa operação. A iteração sobre os elementos das matrizes, por meio de loops aninhados, será abordada em</p><p>detalhes, proporcionando as habilidades necessárias para percorrer e manipular dados em futuras aplicações.</p><p>Esta jornada tem como objetivo, portanto, capacitá-lo a dominar o uso de matrizes em C. Ao compreender os conceitos</p><p>fundamentais, a sintaxe e as técnicas de atribuição e iteração, você estará preparado para enfrentar desafios mais complexos e</p><p>desenvolver soluções eficientes em seus projetos.</p><p>Definição, características e sintaxe de matrizes</p><p>Definição de matrizes</p><p>Uma matriz em linguagem C é uma estrutura de dados bidimensional que organiza informações em linhas e colunas, criando</p><p>uma grade. Essencialmente, é um conjunto de elementos do mesmo tipo, permitindo o acesso e manipulação eficiente desses</p><p>dados. Ao declarar uma matriz, especificamos o tipo de dado, seguido pelo nome e suas dimensões entre colchetes. Por</p><p>exemplo, para criar uma matriz de números inteiros com 3 linhas e 4 colunas, utilizamos a seguinte declaração: int matriz[3][4];.</p><p>Cada elemento na matriz é acessado por meio de índices de linha e coluna, começando ambos a partir de zero.</p><p>O esqueleto de uma matriz refere-se à sua estrutura básica e à forma como ela é declarada em uma linguagem de</p><p>programação. Observe, a seguir, o esqueleto de uma matriz em C:</p><p>tipo_dado: indica o tipo de dado que será armazenado na matriz, como int, float, char etc.</p><p>nome_matriz: é o nome que você atribui à matriz, permitindo referenciar e manipular seus elementos.</p><p>linhas e colunas: representam as dimensões da matriz, indicando quantas linhas e colunas ela terá.</p><p>A visualização de uma matriz como uma tabela é uma analogia útil que facilita a compreensão e manipulação dessas estruturas</p><p>de dados. Essa representação tabular ajuda a organizar e entender a relação espacial entre os elementos.</p><p>Tabela 1 | Visualização de uma matriz. Fonte: elaborada pelo autor.</p><p>Como vemos na Tabela 1, cada número ocupa uma posição específica, sendo identificado por um par de índices (linha, coluna).</p><p>O número 5, por exemplo, está na segunda linha e segunda coluna (índices 1, 1).</p><p>As vantagens de se visualizar uma matriz como tabela, deste modo, são:</p><p>Organização lógica: a visualização como tabela reflete a organização lógica dos dados. Linhas e colunas fornecem uma</p><p>estrutura clara, permitindo que a mente humana compreenda e manipule as informações de maneira ordenada.</p><p>Facilidade na leitura e escrita de código: ao programar, a visualização como tabela facilita a leitura e escrita de código.</p><p>Referenciar um elemento específico se torna intuitivo, pois você utiliza os índices de linha e coluna.</p><p>Modelagem de dados estruturada: em muitos casos reais, dados são naturalmente organizados em tabelas. Ao visualizar</p><p>uma matriz como uma tabela, podemos refletir essa estruturação, o que facilita a modelagem de problemas complexos.</p><p>Aplicações práticas: em domínios como processamento de imagens, jogos e simulações, as matrizes são frequentemente</p><p>utilizadas para representar informações. Visualizá-las como tabelas torna mais fácil conceber algoritmos e lógicas de</p><p>programação relacionadas a esses domínios.</p><p>Portanto, ao visualizar uma matriz como uma tabela, ganhamos uma representação intuitiva e estruturada dos dados, facilitando</p><p>a compreensão, manipulação e implementação de algoritmos em programação.</p><p>tipo_dado nome_matriz[linhas][colunas];</p><p>Int matrizTeste[3][3];</p><p>Índices</p><p>0 1 2</p><p>0 1 2 3</p><p>1 4 5 6</p><p>2 7 8 9</p><p>Figura 1 | Criação de uma matriz. Fonte: elaborada pelo autor.</p><p>Na Figura 1, criamos uma matriz 2x3 de inteiros e atribuímos valores diretamente durante a</p><p>declaração. A primeira linha contém</p><p>os valores 1, 2 e 3, enquanto a segunda linha contém 4, 5 e 6.</p><p>Características e sintaxe de matrizes</p><p>As matrizes em C têm características distintas que moldam seu uso. Elas são estruturas estáticas, o que significa que seu</p><p>tamanho deve ser conhecido no tempo de compilação. Seus índices começam a partir de zero, proporcionando uma abordagem</p><p>consistente e intuitiva. A sintaxe para acessar e manipular elementos é direta, utilizando colchetes e índices. Já a atribuição de</p><p>valores pode ser feita durante a declaração ou posteriormente, e a iteração sobre os elementos geralmente envolve o uso</p><p>de loops aninhados.</p><p>Figura 2 | Atribuição de valores a elementos específicos. Fonte: elaborada pelo autor.</p><p>Na Figura 2, declaramos uma matriz 3x2 e atribuímos valores a elementos específicos após a declaração. A célula na primeira</p><p>linha e primeira coluna recebe 10, enquanto a célula na segunda linha e segunda coluna recebe 20. Este é um exemplo básico</p><p>que destaca a flexibilidade na manipulação de matrizes em C.</p><p>Siga em Frente...</p><p>Atribuição de valores e matrizes</p><p>A atribuição de valores a matrizes em C pode ocorrer durante a declaração ou posteriormente, proporcionando flexibilidade na</p><p>manipulação de dados. Durante a declaração, os valores são especificados entre chaves e separados por vírgulas, seguindo a</p><p>ordem das linhas e colunas. Por exemplo, int matriz[2][3] = {{1, 2, 3}, {4, 5, 6}}; cria uma matriz 2x3 e atribui os valores</p><p>diretamente. Quando a atribuição ocorre após a declaração, cada elemento é acessado individualmente por seus índices,</p><p>permitindo uma personalização mais detalhada.</p><p>Atribuição detalhada</p><p>Ao atribuir valores a matrizes após a declaração, a abordagem individualizada é crucial. Consideremos, pois, uma matriz 3x3 e</p><p>atribuamos valores utilizando loops aninhados:</p><p>Figura 3 | Preenchendo todos os elementos. Fonte: elaborada pelo autor.</p><p>Neste caso, a matriz é preenchida com valores resultantes da multiplicação dos índices da linha e da coluna. Essa abordagem</p><p>personalizada oferece controle total sobre a atribuição, sendo especialmente útil em situações em que os valores seguem um</p><p>padrão ou lógica específica.</p><p>Atribuição de valores durante a declaração</p><p>A atribuição de valores durante a declaração é conveniente e eficaz. Ela ocorre entre chaves e os valores são distribuídos</p><p>automaticamente na ordem das linhas e colunas. Consideremos um exemplo mais complexo:</p><p>Figura 4 | Atribuição na criação. Fonte: elaborada pelo autor.</p><p>Aqui, criamos uma matriz 2x4 de números de ponto flutuante e atribuímos valores diretamente. A precisão decimal dos valores</p><p>flutuantes é mantida, demonstrando a versatilidade dessa técnica de atribuição.</p><p>Utilização da atribuição condicional</p><p>A atribuição de valores pode ser adaptada de acordo com condições específicas. Por exemplo, podemos criar uma matriz 2x2</p><p>em que cada valor é atribuído com base em uma condição:</p><p>Figura 5 | Atribuição com condicional. Fonte: elaborada pelo autor.</p><p>Essa abordagem condicional destaca a adaptabilidade da atribuição de valores, possibilitando a criação de matrizes com base</p><p>em lógicas específicas.</p><p>Em resumo, a atribuição de valores a matrizes em C é uma tarefa personalizável. Seja durante a declaração, seguindo uma</p><p>lógica condicional, ou através de loops aninhados, essa flexibilidade permite a criação e manipulação de matrizes de maneira</p><p>adaptável e eficiente, atendendo às necessidades específicas de cada situação.</p><p>Iteração sobre os elementos de matrizes</p><p>A atribuição de valores em matrizes em C é uma prática fundamental que permite inicializar e atualizar dados de forma eficiente.</p><p>Durante a declaração e atribuição simultânea, podemos utilizar exemplos mais próximos da realidade. Suponhamos que</p><p>https://s3.amazonaws.com/platos-alexandria-prod/kroton/image/66198d9fea5e5e4fa5d1ba2f/67127b35-719e-4186-8f8b-e6ffe3bd8711/original</p><p>https://s3.amazonaws.com/platos-alexandria-prod/kroton/image/66198d9fea5e5e4fa5d1ba2f/67127b35-719e-4186-8f8b-e6ffe3bd8711/original</p><p>estamos lidando com uma matriz que armazena as vendas diárias de produtos em uma loja ao longo de uma semana:</p><p>Figura 6 | Matriz de vendas. Fonte: elaborada pelo autor.</p><p>Neste exemplo, a matriz vendasDiarias armazena as vendas de três produtos ao longo de sete dias. Cada linha representa um</p><p>dia e cada coluna representa um produto.</p><p>Características e detalhes da atribuição</p><p>É essencial entender que, ao atribuir valores em matrizes, estamos organizando dados de forma estruturada. Podemos,</p><p>posteriormente, acessar essas informações para análises mais detalhadas, como calcular médias, identificar tendências de</p><p>vendas ou detectar variações significativas. A flexibilidade na atribuição permite, assim, adaptar a matriz a diferentes conjuntos</p><p>de dados e contextos.</p><p>Figura 7 | Matriz de notas. Fonte: elaborada pelo autor.</p><p>A matriz da Figura 7 apresenta as notas de alunos em diferentes disciplinas. Cada linha representa um aluno e cada coluna</p><p>representa uma disciplina. Essa matriz armazena informações e, além disso, fornece uma estrutura clara para análises futuras,</p><p>como identificar alunos com melhor desempenho em disciplinas específicas.</p><p>Iteração sobre os elementos de matrizes</p><p>https://s3.amazonaws.com/platos-alexandria-prod/kroton/image/66198d9fea5e5e4fa5d1ba2f/98b04c82-e724-40eb-888a-348045f3a386/original</p><p>https://s3.amazonaws.com/platos-alexandria-prod/kroton/image/66198d9fea5e5e4fa5d1ba2f/98b04c82-e724-40eb-888a-348045f3a386/original</p><p>Quando falamos de iteração sobre os elementos de uma matriz, estamos nos referindo à capacidade de percorrer cada</p><p>elemento individual dessa estrutura de dados. Vamos, a título de ilustração, considerar uma matriz temperaturaDiaria, que</p><p>mostra a temperatura em uma cidade ao longo de um mês, por 30 dias e durante 24 horas por dia.</p><p>Figura 8 | Criação de matriz grande. Fonte: elaborada pelo autor.</p><p>A iteração, aqui, seria o processo de percorrer cada célula desta matriz. Isso é feito frequentemente usando loops aninhados,</p><p>em que um loop controla o índice das linhas e o outro o índice das colunas. Dessa forma, conseguimos acessar e manipular</p><p>cada valor individualmente.</p><p>Podemos, por exemplo, preencher essa matriz com valores simulados utilizando um loop duplo:</p><p>Figura 9 | Preenchendo matriz com função. Fonte: elaborada pelo autor.</p><p>Neste trecho de código, um loop percorre os dias e outro as horas de um dia. Dentro dele, a função gerarTemperaturaSimulada()</p><p>(que seria uma função hipotética) pode ser usada para gerar valores simulados de temperatura. Isso é um exemplo prático de</p><p>como a iteração nos permite preencher e manipular grandes conjuntos de dados, como registros meteorológicos em uma matriz.</p><p>Conclusão</p><p>Em conclusão, a compreensão dos conceitos fundamentais relacionados a matrizes, sua sintaxe, atribuição de valores e</p><p>iteração sobre seus elementos é essencial para qualquer programador. As matrizes, ao fornecerem uma estrutura bidimensional,</p><p>oferecem uma maneira poderosa e organizada de lidar com grandes conjuntos de dados. Suas características estáticas, em que</p><p>o tamanho é conhecido no tempo de compilação, e a clareza na sintaxe tornam as matrizes uma escolha eficiente para diversas</p><p>aplicações na programação.</p><p>A atribuição de valores em matrizes, por seu turno, permite não apenas inicializar dados, como também adaptar dinamicamente</p><p>essas estruturas conforme necessário. Esse processo é crucial para representar informações do mundo real de maneira</p><p>organizada, como dados meteorológicos, notas de alunos ou vendas diárias. A flexibilidade na atribuição facilita a manipulação e</p><p>análise desses dados, permitindo que programadores extraiam informações valiosas.</p><p>Já a iteração sobre os elementos de matrizes desempenha um papel vital ao possibilitar o acesso e a manipulação de cada</p><p>célula individualmente. Essa funcionalidade é especialmente importante quando lidamos com grandes volumes de dados, como</p><p>registros de temperatura, ocupação de salas ou qualquer conjunto de informações distribuído em duas dimensões. A utilização</p><p>de loops</p><p>aninhados para percorrer esses elementos proporciona uma abordagem estruturada e efetiva.</p><p>No universo da programação, a importância das matrizes é inquestionável. Elas são a espinha dorsal de muitos algoritmos e</p><p>estruturas de dados, contribuindo para a resolução de problemas em diversas áreas, desde processamento de imagens até</p><p>simulações financeiras. A capacidade de representar e manipular dados em matrizes é uma habilidade elementar para</p><p>programadores, permitindo a criação de soluções robustas e eficazes. Em resumo, as matrizes são ferramentas versáteis e</p><p>capitais que elevam o poder e a eficiência da programação em uma variedade de contextos. Dominar seu uso é, portanto, um</p><p>investimento para qualquer desenvolvedor.</p><p>Vamos Exercitar?</p><p>https://s3.amazonaws.com/platos-alexandria-prod/kroton/image/66198d9fea5e5e4fa5d1ba2f/f6b47c45-82c3-4b96-8fc2-646e3722298f/original</p><p>https://s3.amazonaws.com/platos-alexandria-prod/kroton/image/66198d9fea5e5e4fa5d1ba2f/f6b47c45-82c3-4b96-8fc2-646e3722298f/original</p><p>Retomando a situação apresentada no início da aula, na qual você recebeu um desafio de realizar um exercício de</p><p>programação, no qual você deve criar um programa na linguagem de programação C que lide com duas matrizes de ordem 4x4.</p><p>Portanto, você deverá acompanhar os seguintes passos:</p><p>1. Inicializar uma matriz de 4x4 e fazer a atribuição de valores aleatórios a ela.</p><p>2. Criar uma segunda matriz vazia do mesmo tipo e tamanho.</p><p>3. Realizar o cálculo dos elementos da primeira matriz armazenando o resultado na segunda matriz.</p><p>4. No final do programa, exibir o conteúdo de todos os elementos das duas matrizes em tela.</p><p>Vamos à resolução?</p><p>Na Figura 10, apresentamos a resolução do algoritmo codificado em C em uma ferramenta de edição de código-fonte:</p><p>Figura 10 | Resolução do algoritmo codificado em C. Fonte: elaborada pelo autor.</p><p>A saída do programa e a apresentação dos resultados pode ser observada a seguir:</p><p>Figura 11 | Saída do programa e resultados. Fonte: elaborada pelo autor.</p><p>Neste exercício, trabalhamos com a manipulação de matrizes em linguagem C. Inicializamos a primeira matriz, realizamos um</p><p>cálculo simples (multiplicação dos elementos) e armazenamos o resultado na segunda matriz. Ao final, exibimos ambas Os</p><p>pontos principais abordados foram a declaração e inicialização de matrizes, iteração sobre os elementos das matrizes e</p><p>realização de cálculos com base nesses elementos.</p><p>Saiba Mais</p><p>Para saber mais sobre matrizes (vetores multidimensionais), consulte o Capítulo 10, Seção 10.7, do livro Elementos de</p><p>programação em C, de Pinheiro, disponível no repositório da Biblioteca virtual.</p><p>PINHEIRO, F. de A. C. Capítulo 10. In: Elementos de programação em C. Porto Alegre: Bookman, 2012, p. 245-252.</p><p>Referências Bibliográficas</p><p>CORMEN, T. et al. Algoritmos: teoria e prática. 3. ed. Rio de Janeiro: LTC, 2022.</p><p>MANZANO, J. A. N. G.; OLIVEIRA, J. F. de. Estudo dirigido de algoritmos. São Paulo: Érica, 2000.</p><p>MENÉNDEZ, A. Simplificando algoritmos. São Paulo: LTC, 2023.</p><p>SILVA, F. S. C. da; FINGER, M.; MELO, A. C. V. Lógica para computação. 2. ed. São Paulo: Cengage Learning, 2017.</p><p>ZIVIANI, N. Projeto de algoritmos com implementações em Pascal e C. 3. ed. São Paulo: Cengage Learning, 2011.</p><p>Aula 3</p><p>INTRODUÇÃO A FUNÇÃO E RECURSIVIDADE</p><p>Introdução a função e recursividade</p><p>Olá, estudante! Nesta videoaula, vamos explorar a declaração de funções, assim como sua definição e a caracterização da</p><p>recursividade. Iniciaremos nossa aula destacando a importância de estruturar o código por meio de funções bem definidas.</p><p>Analisaremos, posteriormente, a sintaxe crucial para declarar funções em diferentes contextos, visando fornecer uma</p><p>compreensão sólida dessas estruturas fundamentais em programação.</p><p>Ao adentrarmos na definição e caracterização de recursividade, abordaremos o conceito de uma função chamando a si mesma,</p><p>aspecto poderoso da programação que oferece soluções sofisticadas para problemas complexos. Ilustraremos a recursividade</p><p>com exemplos práticos, mostrando como ela pode simplificar tarefas e tornar o código mais legível.</p><p>Aprofundaremos nosso entendimento ao discutir situações específicas em que a recursividade é especialmente apropriada.</p><p>Analisaremos problemas que naturalmente se prestam a soluções recursivas, demonstrando como essa abordagem pode</p><p>simplificar a implementação e trazer uma eficiência notável em determinados contextos.</p><p>Clique aqui para acessar os slides da sua videoaula.</p><p>Bons estudos!</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/262</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/262</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/262</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/262</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/262</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/262</p><p>https://cm-kls-content.s3.amazonaws.com/202401/ALEXANDRIA/ALGORITMOS_E_LOGICA_DE_PROGRAMACAO/PPT/u4a3_algo_log_pro.pdf</p><p>Ponto de Partida</p><p>Olá, caro estudante! Seja bem-vindo à esta aula sobre declaração de funções e recursividade. A declaração é um aspecto</p><p>essencial para estruturar códigos de forma modular e eficiente, enquanto a recursividade permite soluções sofisticados para</p><p>problemas complexos.</p><p>Nesse percurso de aprendizado, utilizaremos exemplos práticos para ilustrar como uma função pode chamar a si mesma,</p><p>explorando as possibilidades que essa abordagem oferece na simplificação de tarefas e melhoria da legibilidade do código.</p><p>Para ilustrar a aprendizagem desta aula, você será desafiado a criar um algoritmo para apresentar o "n-ésimo" termo da</p><p>sequência de Pell. A sequência de Pell é semelhante à sequência de Fibonacci, mas cada termo é o dobro do termo anterior</p><p>mais o termo antes do anterior. Ou seja, P(n) = 2*P(n-1) + P(n-2), com P(0) = 0 e P(1) = 1.</p><p>Aproveite a aula e vamos, juntos, construir este conhecimento!</p><p>Vamos Começar!</p><p>No vasto universo da programação, o entendimento profundo e preciso de temas fundamentais é a chave para a construção de</p><p>códigos eficientes e soluções sofisticadas. Nossa jornada educativa nos levará por três pilares capitais: a declaração de</p><p>funções, a definição e caracterização da recursividade, e a identificação de situações ideais para a aplicação desse conceito.</p><p>Esses tópicos são elementos básicos para qualquer programador e representam o alicerce para o desenvolvimento de</p><p>algoritmos robustos e a resolução de desafios complexos.</p><p>A declaração de funções, pois, emerge como um ponto-chave, proporcionando a habilidade de modularizar e estruturar código</p><p>de maneira organizada. Essa capacidade não apenas facilita a reutilização do código, tornando-o mais fácil de manter, mas</p><p>também contribui para uma abordagem mais clara e efetiva no desenvolvimento de programas. Entender a sintaxe e a</p><p>importância da declaração de funções é crucial para criar códigos legíveis e de fácil manutenção.</p><p>Na sequência, exploraremos a intrigante dimensão da recursividade, em que uma função pode chamar a si mesma. Nesse</p><p>contexto, analisaremos a definição precisa da recursividade, além de destacarmos as características únicas desse método de</p><p>resolução de problemas. A capacidade de pensar de maneira recursiva é uma habilidade valiosa que, quando aplicada</p><p>corretamente, oferece soluções mais concisas e elegantes.</p><p>Entendendo que a recursividade pode não ser apropriada para todos os cenários, adentraremos nas situações específicas em</p><p>que esse conceito se destaca, fornecendo uma visão prática e estratégica sobre como utilizar esse poderoso recurso. Isso</p><p>porque a seleção criteriosa de situações para aplicação de recursividade é determinante para otimizar o desempenho e a</p><p>eficiência do código.</p><p>Declaração de funções</p><p>A declaração de funções é um pilar essencial na construção de códigos modulares e eficientes em programação. Através dela,</p><p>fragmentamos nosso código em unidades lógicas, permitindo a reutilização, manutenção facilitada e uma abordagem</p><p>mais</p><p>organizada.</p><p>Uma função é um bloco de código designado para realizar uma tarefa específica, isolando e estruturando uma parte do</p><p>programa. A distinção entre procedimentos e funções reside no retorno de valores. Procedimentos realizam tarefas sem gerar</p><p>um resultado específico, enquanto funções retornam um valor após a execução. Por exemplo, um procedimento pode exibir uma</p><p>mensagem na tela, já uma função pode calcular uma média e retornar o resultado.</p><p>Uma função é como uma pequena fábrica que recebe entradas, executa operações e produz saídas. Sua estrutura básica</p><p>(esqueleto) inclui um nome, parâmetros, corpo e um valor de retorno opcional. Parâmetros são as entradas fornecidas à função,</p><p>o corpo contém as instruções executadas e o valor de retorno é o resultado produzido pela função. Vejamos:</p><p>Tipo de retorno (tipo_retorno): indica o tipo de dado que a função retorna. Pode ser qualquer tipo válido em C (int, float,</p><p>char etc.). Se a função não retornar nenhum valor, utiliza-se void.</p><p>Nome da função (nome_da_funcao): é o identificador único que usamos para chamar a função. Deve seguir as regras de</p><p>nomenclatura da linguagem.</p><p>Parâmetros (tipo_parametro parametro): são variáveis que a função aceita como entrada. Podem ser de diferentes tipos</p><p>e podem existir zero ou mais parâmetros. Cada parâmetro é composto por um tipo e um identificador.</p><p>Corpo da função ({...}): contém as instruções e operações realizadas pela função. É dentro do corpo que a lógica da</p><p>função é implementada.</p><p>Valor de retorno (return valor_de_retorno): se a função possui um tipo de retorno diferente de void, é necessário incluir</p><p>uma instrução return para indicar o valor que a função retorna. Esta parte é opcional em funções do tipo void.</p><p>Exemplifiquemos, assim, a declaração de funções em C. Considere uma função simples que calcula a soma de dois números:</p><p>tipo_retorno nome_da_funcao(tipo_parametro1 parametro1, tipo_parametro2 parametro2, ...) {</p><p>// Corpo da função</p><p>// Instruções e operações realizadas pela função</p><p>// Pode incluir declarações de variáveis locais</p><p>// Retorno, se a função tem um tipo de retorno diferente de "void"</p><p>return valor_de_retorno;</p><p>}</p><p>Figura 1 | Exemplo de função. Fonte: elaborada pelo autor.</p><p>Neste exemplo, temos uma função chamada somar que aceita dois inteiros como parâmetros, realiza a adição e retorna o</p><p>resultado. Este é um esqueleto básico que pode ser adaptado para diferentes tipos de funções, dependendo da tarefa que a</p><p>função deve executar.</p><p>Aqui, resultado conterá o valor 8, resultado da chamada da função somar.</p><p>A declaração de funções é, portanto, vital para a estruturação do código, tornando-o mais compreensível e fácil de manter. Ela</p><p>não é apenas uma técnica de programação; é uma filosofia que promove a eficiência, clareza e escalabilidade nos projetos.</p><p>Ao criar funções, praticamos conceitos de modularização e abstração. Modularização envolve dividir um programa em módulos</p><p>independentes, enquanto abstração oculta os detalhes internos de uma função, permitindo que ela seja usada sem a</p><p>necessidade de entender sua implementação interna. Funções bem definidas facilitam a colaboração em equipes de</p><p>desenvolvimento e promovem a reutilização de código, um princípio fundamental na engenharia de software.</p><p>Definição e caracterização de recursividade</p><p>A recursividade é um conceito fundamental na programação, definindo a capacidade de uma função chamar a si mesma durante</p><p>sua execução. Esse método oferece uma abordagem sofisticada e eficiente para resolver problemas complexos ao dividi-lo em</p><p>instâncias menores. A caracterização da recursividade envolve uma função que se decompõe em casos base, nos quais a</p><p>solução é direta, e em casos recursivos, em que a função se chama com entradas reduzidas.</p><p>Fora da programação, a recursividade é uma característica encontrada em muitos campos, como a Matemática e a Linguística,</p><p>nos quais padrões repetitivos são identificados.</p><p>Consideremos um exemplo simples e prático de recursividade fora do contexto da programação. Imagine que você está</p><p>empilhando caixas em uma sala.</p><p>Caso base: se você tiver apenas uma caixa para empilhar, você a coloca no chão. Isso representa o caso base, pois não</p><p>há necessidade de empilhar mais caixas.</p><p>Caso recursivo: se tiver duas ou mais caixas, o processo se torna recursivo. Você coloca a primeira caixa no chão e, em</p><p>seguida, empilha as outras caixas, uma sobre a outra. Para empilhar as demais caixas, você segue o mesmo processo,</p><p>tratando cada pilha de caixas como uma única caixa quando chegar a hora de empilhar.</p><p>Repetição do processo: se houver subpilhas de caixas dentro das pilhas maiores, você repete o mesmo processo. Cada</p><p>vez que encontra uma subpilha, você a trata como uma única caixa e a empilha juntamente com as outras caixas.</p><p>Essa abordagem reflete um padrão recursivo em que você resolve o problema (empilhar as caixas) tratando uma instância</p><p>menor do mesmo problema (empilhar as subpilhas) até atingir um caso base (uma única caixa). Tal analogia demonstra como a</p><p>recursividade pode ser intuitiva e aplicada em situações do cotidiano, ajudando a resolver tarefas complexas dividindo-as em</p><p>tarefas menores e mais gerenciáveis.</p><p>Na programação, especificamente, a recursividade é uma ferramenta poderosa para solucionar problemas que podem ser</p><p>decompostos em subproblemas idênticos ou semelhantes. Ela reflete a capacidade de uma função se autorreferenciar,</p><p>promovendo um recurso mais conciso e claro para certos tipos de problemas. Suas características fundamentais são:</p><p>Caso base: toda função recursiva deve ter um caso base, que representa a condição de parada. Quando a função atinge</p><p>esse caso base, ela para de se chamar recursivamente e retorna um resultado direto.</p><p>Chamada recursiva: a função chama a si mesma com argumentos modificados. Isso permite que a função resolva</p><p>instâncias menores do problema, avançando em direção ao caso base.</p><p>int resultado = somar(5, 3);</p><p>Um exemplo clássico é o cálculo do fatorial de um número. A função fatorial pode ser definida recursivamente da seguinte forma</p><p>em C:</p><p>Figura 2 | Cálculo fatorial. Fonte: elaborada pelo autor.</p><p>Na Figura 2, o caso base é quando n é 0 ou 1, retornando 1. Para valores maiores, a função chama a si mesma com n-1,</p><p>multiplicando o resultado pelo valor atual de n.</p><p>A recursividade é particularmente útil em problemas que podem ser decompostos em subproblemas idênticos ou semelhantes.</p><p>No entanto, seu uso requer atenção para evitar loops infinitos e garantir que cada chamada recursiva aproxime a função do caso</p><p>base.</p><p>Compreender a definição e caracterização da recursividade é crucial para expandir a caixa de ferramentas do programador.</p><p>Saber quando e como aplicá-la pode simplificar significativamente a resolução de questões complexas, tornando o código mais</p><p>sofisticado e modular.</p><p>Siga em Frente...</p><p>Situações de programação adequadas para a recursividade</p><p>A recursividade é uma ferramenta poderosa, mas é primordial aplicá-la nas situações corretas para garantir eficiência e clareza</p><p>no código. A seguir, exploraremos em que casos a recursividade é adequada, porque é benéfica e como pode ser aplicada tanto</p><p>dentro quanto fora do campo da programação.</p><p>1. Estruturas de dados recursivas: a recursividade é frequentemente ideal para lidar com estruturas de dados recursivas,</p><p>como árvores e listas encadeadas. Por exemplo, ao percorrer uma árvore binária, uma função recursiva pode visitar seus</p><p>nós de maneira eficiente, lidando com cada subárvore como uma instância menor do mesmo problema.</p><p>2. Algoritmos dividir para conquistar: problemas que seguem a estratégia “dividir para conquistar” são propensos à</p><p>aplicação de recursividade. Algoritmos como o merge sort e o quicksort são exemplos claros em que a divisão do problema</p><p>em subproblemas menores facilita a solução global.</p><p>3. Problemas que exibem autossimilaridade: situações em que o problema pode ser decomposto em instâncias menores</p><p>semelhantes ao problema original são ideais para recursividade. Por exemplo, o cálculo do fatorial</p><p>e a sequência de</p><p>Fibonacci exibem essa autossimilaridade.</p><p>4. Processamento de estruturas de dados aninhadas: a manipulação de estruturas de dados aninhadas, como listas</p><p>dentro de listas, pode ser simplificada usando recursividade. A função pode tratar cada nível da estrutura como uma</p><p>instância menor, tornando o código mais limpo e modular.</p><p>5. Travessia de grafos: em algoritmos de travessia de grafos, como a busca em profundidade (DFS) e a busca em largura</p><p>(BFS), a recursividade pode ser empregada para explorar os vértices de maneira eficiente, permitindo que cada um seja</p><p>tratado como um subproblema.</p><p>Além da programação, a recursividade pode ser aplicada em problemas matemáticos, como cálculos de sequências recursivas e</p><p>problemas de divisão e conquista. Em tarefas cotidianas, como organizar objetos ou resolver quebra-cabeças, ela também pode</p><p>ser intuitiva.</p><p>Embora seja poderosa, a recursividade não é ideal para todos os programas. Em casos de eficiência, pode haver uma</p><p>sobrecarga de chamadas de função, resultando em um consumo excessivo de memória. Além disso, em problemas que não</p><p>exibem uma estrutura recursiva clara, a aplicação de recursividade pode complicar desnecessariamente o código.</p><p>Figura 3 | Soma recursiva. Fonte: elaborada pelo autor.</p><p>Neste exemplo da Figura 3, a função “somaRecursiva” calcula a soma dos primeiros n números naturais de maneira recursiva.</p><p>Em resumo, a recursividade é adequada em situações em que a estrutura do problema favorece uma abordagem dividida e</p><p>conquistada, e sua aplicação deve ser considerada caso a caso.</p><p>Conclusão</p><p>Ao mergulharmos nos fundamentos da programação, desde a declaração de funções até a compreensão da recursividade e</p><p>suas aplicações, ampliamos nossa visão sobre como estruturar e resolver problemas no mundo da codificação.</p><p>A declaração de funções se revela como uma ferramenta poderosa para a modularização e organização de códigos. Ao</p><p>entender a sintaxe e importância dessa estrutura, programadores podem criar sistemas mais legíveis, reutilizáveis e eficientes.</p><p>A recursividade, por sua vez, destaca-se como uma abordagem sofisticada para lidar com problemas que podem ser divididos</p><p>em subproblemas idênticos ou semelhantes. Seu uso proporciona soluções concisas e claras, mas requer cautela para evitar</p><p>armadilhas como loops infinitos. Ela não se limita à programação, manifestando-se em fenômenos naturais e padrões</p><p>matemáticos. Contudo, seu verdadeiro poder é desbloqueado na programação, na qual a capacidade de criar funções que</p><p>chamam a si mesmas permite maneiras eficazes de solucionar questões.</p><p>Embora a recursividade seja uma ferramenta poderosa, sua aplicação não é ideal para todos os programas. Em certos</p><p>contextos, a complexidade e os custos de desempenho associados podem superar seus benefícios. A escolha da recursividade</p><p>deve ser guiada pela natureza do problema a ser resolvido e pelas características do ambiente em que o código será executado.</p><p>As situações propícias para a aplicação da recursividade incluem problemas que seguem uma estrutura hierárquica ou divisível.</p><p>Algoritmos de ordenação, como o merge sort, ou a exploração de estruturas de dados aninhadas são exemplos em que a</p><p>recursividade se destaca, simplificando a resolução de subproblemas.</p><p>Ao dominar a declaração de funções, entender a natureza da recursividade e identificar situações adequadas para sua</p><p>aplicação, os programadores capacitam-se para construir códigos mais robustos e soluções mais poderosas. Esses conceitos</p><p>são a espinha dorsal de qualquer desenvolvedor, moldando não apenas a forma como escrevemos códigos, mas também a</p><p>maneira como abordamos e resolvemos problemas. Ao explorar esses pilares, elevamos nossa habilidade de criar, inovar e</p><p>contribuir para o vasto universo da programação.</p><p>Vamos Exercitar?</p><p>Retomando a situação apresentada no início da aula, onde você deverá criar uma função recursiva para calcular o “n-ésimo”</p><p>termo da sequência de Pell. A sequência de Pell é semelhante à sequência de Fibonacci, mas cada termo é o dobro do termo</p><p>anterior mais o termo antes do anterior. Ou seja, P(n) = 2*P(n-1) + P(n-2), com P(0) = 0 e P(1) = 1.</p><p>Vamos à resolução?</p><p>Figura 4 | Sequência de Pell. Fonte: elaborada pelo autor.</p><p>Neste código, a função sequenciaPell() calcula o n-ésimo termo da sequência de Pell de forma recursiva, utilizando os casos</p><p>base P(0) = 0 e P(1) = 1. O exemplo no main mostra como utilizar a função para obter o 5-ésimo termo, mas é possível substituir</p><p>o valor de n conforme necessário.</p><p>Saiba Mais</p><p>Para saber mais sobre funções recursivas, consulte o Capítulo 9, Seção 9.7, do livro Elementos de programação em C, de</p><p>Pinheiro, disponível no repositório da Biblioteca virtual.</p><p>PINHEIRO, F. de A. C. Capítulo 9. In: Elementos de programação em C. Porto Alegre: Bookman, 2012, p. 245-252.</p><p>Referências Bibliográficas</p><p>CORMEN, T. et al. Algoritmos: teoria e prática. 3. ed. Rio de Janeiro: LTC, 2022.</p><p>MANZANO, J. A. N. G.; OLIVEIRA, J. F. de. Estudo dirigido de algoritmos. São Paulo: Érica, 2000.</p><p>MENÉNDEZ, A. Simplificando algoritmos. São Paulo: LTC, 2023.</p><p>SILVA, F. S. C. da; FINGER, M.; MELO, A. C. V. Lógica para computação. 2. ed. São Paulo: Cengage Learning, 2017.</p><p>ZIVIANI, N. Projeto de algoritmos com implementações em Pascal e C. 3. ed. São Paulo: Cengage Learning, 2011.</p><p>Aula 4</p><p>REGISTROS E ARQUIVOS</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/221</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/221</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/221</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/221</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/221</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/221</p><p>Registros e arquivos</p><p>Olá, estudante! Nesta videoaula vamos abordar os processos de abertura e fechamento de arquivos, desvendando as práticas</p><p>recomendadas para garantir uma interação segura e eficiente com dados armazenados. Nossa jornada de aprendizado se</p><p>concentrará na declaração de registros e no acesso a esses dados, proporcionando uma visão aprofundada sobre a estrutura e</p><p>organização de informações em arquivos. Passaremos por cada etapa, desde a definição inicial até as nuances da sintaxe,</p><p>assegurando que você compreenda completamente o manejo responsável desses componentes essenciais na programação.</p><p>Na sequência, nos dedicaremos ao processo de escrita e leitura em arquivos, explorando métodos eficazes para armazenar e</p><p>recuperar dados. Essas habilidades são cruciais para o desenvolvimento de aplicações robustas e para garantir a integridade e</p><p>segurança dos dados ao longo do tempo.</p><p>Clique aqui para acessar os slides da sua videoaula.</p><p>Bons estudos!</p><p>Ponto de Partida</p><p>Olá, caro estudante! Seja bem-vindo à esta aula sobre os aspectos fundamentais da manipulação de arquivos em programação.</p><p>Vamos nos concentrar em desvendar os processos de abertura e fechamento de arquivos, fornecendo insights práticos para</p><p>garantir que você esteja equipado para lidar eficientemente com dados armazenados. Nesse processo, exploraremos</p><p>teoricamente a declaração de registros para melhor compreender a estrutura e organização dos dados. Além disso,</p><p>abordaremos o acesso a esses registros.</p><p>Para ilustrar a aprendizagem desta aula, você foi designado para criar um programa em C que gerencie informações de</p><p>estudantes. Cada estudante possui os seguintes dados: nome, idade e média. O programa deve permitir ao usuário inserir</p><p>informações de vários estudantes e, em seguida, salvar essas informações em um arquivo chamado "estudantes.txt". Além</p><p>disso, o programa deve possibilitar a leitura dessas informações a partir do arquivo.</p><p>Ao final desta aula, você não apenas terá conhecimentos teóricos na área, como também contará com as ferramentas</p><p>necessárias para aplicá-los no mundo real. Bons estudos!</p><p>Vamos Começar!</p><p>https://cm-kls-content.s3.amazonaws.com/202401/ALEXANDRIA/ALGORITMOS_E_LOGICA_DE_PROGRAMACAO/PPT/u4a4_algo_log_pro.pdf</p><p>A manipulação de arquivos é essencial no desenvolvimento de programas e sistemas de software, proporcionando a capacidade</p><p>de armazenar e recuperar dados de forma persistente. Abrir e fechar arquivos é uma operação capital nesse contexto,</p><p>permitindo que o programa estabeleça uma conexão com o sistema de arquivos, aloque recursos necessários e libere esses</p><p>recursos quando a operação for concluída. Esse processo é importante para garantir a integridade dos dados e o bom</p><p>funcionamento do programa.</p><p>A declaração e o acesso aos registros, do mesmo modo, são conceitos primordiais quando se trata de trabalhar com arquivos.</p><p>Registros são estruturas de dados que armazenam informações relacionadas em uma única unidade. A declaração adequada</p><p>desses registros é crucial para garantir a coerência e a organização dos dados. Além disso, o acesso eficiente a esses registros</p><p>é vital para a leitura e gravação efetivas em arquivos. Programadores precisam entender como navegar e manipular registros</p><p>para extrair informações ou modificar dados conforme necessário.</p><p>Escrever e ler em arquivos, por seu turno, são operações fundamentais para a interação eficaz entre um programa e o sistema</p><p>de armazenamento. Escrever em arquivos envolve a transferência de dados do programa para o arquivo, garantindo que as</p><p>informações sejam armazenadas de maneira correta e persistente. Já a leitura em arquivos envolve a extração de dados do</p><p>arquivo para o programa, possibilitando a utilização dessas informações dentro da lógica do software.</p><p>Abrir e fechar arquivos, declarar e acessar registros, assim como escrever e ler em arquivos são, pois, elementos basilares na</p><p>criação de softwares que envolvem a manipulação de dados persistentes. Uma compreensão sólida desses conceitos é</p><p>indispensável para garantir a eficiência, segurança e integridade dos sistemas, permitindo que os programadores construam</p><p>aplicações que interajam eficazmente com eles.</p><p>Declaração e acesso aos registros</p><p>Na linguagem de programação C, a declaração e o acesso aos registros desempenham um papel importante na organização e</p><p>manipulação de dados estruturados.</p><p>Um registro é uma estrutura de dados que permite agrupar diferentes tipos de variáveis sob um único nome. O esqueleto de um</p><p>registro em C consiste na declaração da estrutura usando a palavra-chave struct, seguida pelo nome do registro e um conjunto</p><p>de membros (variáveis) entre chaves {}. Cada membro é definido com um tipo de dado específico e um identificador associado.</p><p>A estrutura básica segue o formato:</p><p>struct: palavra-chave que indica que estamos declarando uma estrutura (registro).</p><p>NomeDoRegistro: identificador que nomeia a estrutura, permitindo a criação de instâncias dessa estrutura.</p><p>TipoDeDado1, TipoDeDado2, ..., TipoDeDadoN: diferentes tipos de dados que podem incluir inteiros, caracteres, ponto</p><p>flutuante, entre outros.</p><p>Membro1, Membro2, ..., MembroN: identificadores associados a cada tipo de dado, representando os campos individuais</p><p>do registro.</p><p>O esqueleto fornece a estrutura básica que define como os dados são organizados dentro do registro. Essa estrutura é</p><p>posteriormente utilizada para criar instâncias do registro e acessar seus membros para armazenar e manipular dados de</p><p>maneira organizada.</p><p>struct NomeDoRegistro {</p><p>TipoDeDado1 Membro1;</p><p>TipoDeDado2 Membro2;</p><p>// ... outros membros ...</p><p>TipoDeDadoN MembroN;</p><p>};</p><p>Figura 1 | Declaração de registro. Fonte: elaborada pelo autor.</p><p>No exemplo da Figura 1, declaramos um registro chamado "Pessoa" que contém três variáveis: um array de caracteres para o</p><p>nome, um inteiro para a idade e um número em ponto flutuante para a altura.</p><p>O acesso aos registros é feito utilizando o operador ponto (.) para cada variável. Para atribuir valores a um registro "Pessoa",</p><p>faríamos algo como:</p><p>Figura 2 | Acesso aos registros. Fonte: elaborada pelo autor.</p><p>Neste trecho de código, criamos uma instância da estrutura "Pessoa" chamada "pessoa1" e atribuímos valores às suas</p><p>variáveis individuais.</p><p>É importante ressaltar que os registros permitem agrupar informações relacionadas de forma organizada, facilitando a</p><p>manutenção e compreensão do código. Além disso, o acesso a eles possibilita a manipulação eficiente dos dados armazenados,</p><p>tornando-se uma ferramenta valiosa para estruturar informações em programas escritos em C.</p><p>Siga em Frente...</p><p>Uso de typedef</p><p>O uso de typedef pode simplificar a criação de instâncias de registros, fornecendo um nome mais conciso para o tipo.</p><p>Figura 3 | typedef. Fonte: elaborada pelo autor.</p><p>Neste exemplo, você pode usar “Carro” diretamente como um tipo, sem a necessidade de escrever struct toda vez que desejar</p><p>criar uma instância.</p><p>Abrindo e fechando arquivos</p><p>A manipulação de arquivos é uma operação fundamental em programação que permite que os programas armazenem e</p><p>recuperem dados de maneira persistente. Em C, a abertura e o fechamento de arquivos são realizados por meio de funções</p><p>específicas. A função fopen() é utilizada para abrir um arquivo, enquanto fclose() é usada para fechá-lo. A função fopen() recebe</p><p>dois parâmetros: o nome do arquivo e o modo de operação (por exemplo, “r” para leitura ou “w” para escrita).</p><p>Figura 4 | Declarando arquivo. Fonte: elaborada pelo autor.</p><p>No exemplo anterior, um ponteiro de arquivo chamado “arquivo” é declarado e, em seguida, a função fopen() é utilizada para</p><p>abrir o arquivo “exemplo.txt” para leitura. O modo “r” indica que estamos abrindo o arquivo em modo de leitura.</p><p>Após a conclusão das operações de leitura ou escrita, é essencial fechar o arquivo usando a função fclose() para liberar os</p><p>recursos associados. O exemplo a seguir ilustra o fechamento de um arquivo:</p><p>Figura 5 | Fechando o arquivo. Fonte: elaborada pelo autor.</p><p>Ao fechar o arquivo, o sistema operacional libera quaisquer recursos alocados para a manipulação do arquivo, garantindo a</p><p>integridade dos dados e evitando possíveis problemas de acesso concorrente.</p><p>Vale ressaltar que, ao abrir um arquivo, é preciso verificar se a operação foi bem-sucedida, pois falhas na abertura podem</p><p>ocorrer por diversos motivos, como inexistência do arquivo ou permissões de acesso inadequadas. O ponteiro de arquivo</p><p>retornado pela função fopen() deve ser verificado para garantir que não seja nulo, indicando que a operação foi bem-sucedida.</p><p>Em resumo, a abertura e o fechamento de arquivos em C são operações cruciais para garantir a persistência de dados. O uso</p><p>adequado dessas funções, juntamente com verificações apropriadas, contribui para a robustez e confiabilidade dos programas.</p><p>Escrevendo e lendo em arquivos</p><p>Escrever e ler em arquivos em C é uma parte essencial da programação, permitindo que os programas armazenem informações</p><p>persistentes e recuperem dados quando necessário. A função fprintf() é usada para escrever dados em um arquivo,</p><p>enquanto fscanf() é empregada para ler dados de um arquivo.</p><p>A manipulação de arquivos em C é realizada por meio de modos que indicam a operação que será executada no arquivo. O</p><p>quadro a seguir mostra alguns dos modos mais comuns de abertura de arquivos em C:</p><p>Quadro 1 | Modos de abertura de arquivos. Fonte: elaborado pelo autor.</p><p>Modo Descrição</p><p>“r” Abre o arquivo para leitura. O arquivo deve existir; caso contrário, a abertura falhará.</p><p>“w” Abre o arquivo para escrita. Se o arquivo já existir, seu conteúdo é truncado; se não existir, um</p><p>novo arquivo é criado.</p><p>“a” Abre o arquivo para escrita no modo anexo (append). Os dados são adicionados ao final do</p><p>arquivo se ele existir, ou um novo arquivo é criado se não existir.</p><p>“r+” Abre o arquivo para leitura e escrita. O arquivo deve existir.</p><p>“w+” Abre o arquivo para leitura e escrita. Se o arquivo já existir, seu conteúdo é truncado; se não</p><p>existir, um novo arquivo é criado.</p><p>“a+” Abre o arquivo para leitura e escrita no modo anexo (append). Os dados são adicionados ao final</p><p>do arquivo se ele existir, ou um novo arquivo é criado se não existir.</p><p>Estes são apenas alguns dos modos mais comuns, mas há outros menos utilizados ou específicos para operações binárias</p><p>("rb", "wb", "ab", "r+b", "w+b", "a+b", etc.). Ao utilizá-los, é fundamental realizar verificações adequadas para garantir que as</p><p>operações de abertura sejam bem-sucedidas antes de prosseguir com a leitura ou escrita.</p><p>Para escrever em um arquivo, primeiramente, é preciso abrir o arquivo em modo de escrita. A Figura 6 ilustra como escrever</p><p>dados simples em um arquivo:</p><p>Figura 6 | Escrevendo. Fonte: elaborada pelo autor.</p><p>Neste exemplo, a função fprintf() é usada para escrever uma string e um número no arquivo "exemplo.txt". O caractere de nova</p><p>linha (\n) é usado para separar as linhas no arquivo.</p><p>Para ler dados de um arquivo, é necessário abri-lo em modo de leitura. Na Figura 7, observamos como ler dados previamente</p><p>escritos no arquivo:</p><p>Figura 7 | Lendo. Fonte: elaborada pelo autor.</p><p>Neste caso, a função fgets() é utilizada para ler uma linha por vez do arquivo. O conteúdo lido é então exibido no console</p><p>usando printf().</p><p>Ao lidar com leitura e escrita de dados em arquivos, é crucial realizar verificações para garantir que as operações ocorram sem</p><p>problemas. Certifique-se de que o arquivo foi aberto corretamente e que as operações de leitura ou escrita foram concluídas</p><p>com sucesso.</p><p>Para escrita e leitura de tipos de dados complexos, como estruturas, as funções fwrite() e fread() podem ser utilizadas. Elas são</p><p>particularmente úteis para armazenar e recuperar blocos de dados binários.</p><p>Conclusão</p><p>O entendimento dos conceitos relacionados à declaração e acesso aos registros, abertura e fechamento de arquivos, e escrita e</p><p>leitura em arquivos é essencial para o desenvolvimento de programas robustos e eficientes. A capacidade de organizar dados</p><p>em registros, assim, oferece uma estrutura lógica para representar informações complexas de maneira clara e ordenada,</p><p>facilitando a manipulação e análise dos dados. Essa qualidade é particularmente útil ao modelar objetos palpáveis, como</p><p>registros de funcionários, informações de clientes ou dados de transações.</p><p>Já a operação adequada de abertura e fechamento de arquivos é determinante para garantir a persistência de dados. Abrir um</p><p>arquivo permite que o programa estabeleça uma conexão com o sistema de arquivos, aloque recursos necessários e inicie</p><p>operações de leitura ou escrita. Por outro lado, fechar o arquivo é primordial para liberar recursos e evitar possíveis problemas</p><p>de integridade dos dados. Essas operações são fundamentais em cenários reais, nos quais a persistência e a recuperação de</p><p>informações são indispensáveis, como em sistemas de gerenciamento de arquivos ou bancos de dados.</p><p>A habilidade de escrever e ler em arquivos, por seu turno, permite a interação dinâmica e contínua entre um programa e o</p><p>sistema de armazenamento. Ao escrever em arquivos, os programas podem armazenar dados relevantes para uso futuro,</p><p>enquanto a leitura de arquivos possibilita a recuperação dessas informações quando necessário. Essa funcionalidade é vital em</p><p>muitas aplicações cotidianas, como sistemas de registro de logs, armazenamento de configurações de aplicativos e</p><p>processamento de grandes conjuntos de dados armazenados externamente.</p><p>Ao aplicar esses conceitos, os desenvolvedores podem criar softwares mais flexíveis e adaptáveis às necessidades do mundo</p><p>real. A manipulação eficaz de registros, combinada com operações adequadas de abertura, fechamento, escrita e leitura de</p><p>arquivos, resulta em programas mais eficientes, seguros e capazes de lidar com uma variedade de cenários práticos. Essas</p><p>práticas são capitais para o desenvolvimento de sistemas que lidam com dados persistentes, garantindo uma interação fluida</p><p>entre o software e o sistema de armazenamento, contribuindo para a robustez e confiabilidade do sistema como um todo.</p><p>Vamos Exercitar?</p><p>Retomando a situação apresentada no início da aula, na qual você foi designado para criar um programa em C que gerencie</p><p>informações de estudantes. Cada estudante possui os seguintes dados: nome, idade e média. O programa deve permitir ao</p><p>usuário inserir informações de vários estudantes e, em seguida, salvar essas informações em um arquivo chamado</p><p>"estudantes.txt". Além disso, o programa deve possibilitar a leitura dessas informações a partir do arquivo.</p><p>Vamos à resolução?</p><p>Figura 8 | Registros para armazenar informações. Fonte: elaborada pelo autor</p><p>Figura 9 | Leitura das informações. Fonte: elaborada pelo autor.</p><p>Este programa em C mostra a utilização de registros (structs) para armazenar informações sobre estudantes e como gravar</p><p>esses dados em um arquivo. Além disso, ele possibilita a leitura das informações a partir do arquivo, fornecendo uma</p><p>abordagem prática sobre o uso de registros e manipulação de arquivos em C.</p><p>Saiba Mais</p><p>Para saber mais sobre registros e arquivos, consulte o Capítulo 13 - Entrada e Saída: Arquivos, do livro Elementos de</p><p>programação em C, de Pinheiro, disponível no repositório da Biblioteca virtual.</p><p>PINHEIRO, F. de A. C. Capítulo 13 - Entrada e Saída: Arquivos. In: Elementos de programação em C. Porto Alegre: Bookman,</p><p>2012, p. 341-384.</p><p>Referências Bibliográficas</p><p>CORMEN, T. et al. Algoritmos: teoria e prática. 3. ed. Rio de Janeiro: LTC, 2022.</p><p>MANZANO, J. A. N. G.; OLIVEIRA, J. F. de. Estudo dirigido de algoritmos. São Paulo: Érica, 2000.</p><p>MENÉNDEZ, A. Simplificando algoritmos. São Paulo: LTC, 2023.</p><p>SILVA, F. S. C. da; FINGER, M.; MELO, A. C. V. Lógica para computação. 2. ed. São Paulo: Cengage Learning, 2017.</p><p>ZIVIANI, N. Projeto de algoritmos com implementações em Pascal e C. 3. ed. São Paulo: Cengage Learning, 2011.</p><p>Encerramento da Unidade</p><p>APLICAÇÕES DE PROGRAMAÇÃO</p><p>Videoaula de Encerramento</p><p>Olá, caro estudante! Seja muito bem-vindo à nossa videoaula dedicada às funções, funções recursivas, registros e arquivos.</p><p>Nela, exploraremos a fundo tais conteúdos e os elementos essenciais de um programa na linguagem C.</p><p>Aproveite esta oportunidade de aprendizado e mergulhe neste conteúdo fundamental para o cenário de algoritmos.</p><p>Clique aqui para acessar os slides da sua videoaula.</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/358</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/358</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/358</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/358</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/358</p><p>https://integrada.minhabiblioteca.com.br/reader/books/9788540702035/pageid/358</p><p>https://cm-kls-content.s3.amazonaws.com/202401/ALEXANDRIA/ALGORITMOS_E_LOGICA_DE_PROGRAMACAO/PPT/u4enc_algo_log_pro.pdf</p><p>Bons estudos!</p><p>Ponto de Chegada</p><p>Olá, estudante! Para desenvolver a competência desta Unidade, isto é, criar soluções algorítmicas utilizando técnicas de</p><p>funções e recursividade e estruturas, como vetores e matrizes, tivemos que estudar a fundo procedimentos e funções.</p><p>Durante esta jornada de aprendizado em programação C, mergulhamos em conceitos fundamentais para o desenvolvimento de</p><p>algoritmos. Entre estes tópicos importantes estão:</p><p>Programação e funções com vetores: exploração de conceitos e técnicas relacionados à manipulação de vetores em</p><p>programação.</p><p>Programação com matrizes: abordagem de técnicas e práticas voltadas para a programação envolvendo matrizes.</p><p>Introdução a função e recursividade: apresentação inicial de conceitos sobre funções e recursividade em programação.</p><p>Registros e arquivos: estudo de registros e manipulação de arquivos em programação.</p><p>Tais conhecimentos, que constituem a base para enfrentar desafios de maior complexidade, o preparou para adentrar temas</p><p>mais profundos e empregar suas habilidades em projetos do mundo real.</p><p>É Hora de Praticar!</p><p>Agora, convido você, estudante, a trabalhar com o conteúdo abordado nesta unidade de ensino. Para tanto, vamos abordar um</p><p>estudo de caso sobre Cálculo do Imposto de Renda Pessoa Física (IRPF) com o cenário descrito a seguir:</p><p>Requisitos</p><p>Você foi designado para desenvolver uma função em linguagem C que calcule o Imposto de Renda Pessoa Física (IRPF) com</p><p>base nos</p>