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