Introdução à Programação C

Documentos relacionados
Introdução à Programação C

Introdução à Programação C

Computação II Orientação a Objetos

LINGUAGEM C: FUNÇÕES FUNÇÃO 04/07/2017. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

Programação: Vetores

Computação II Orientação a Objetos

Computação II Orientação a Objetos

ÁRVORES BINÁRIAS DE BUSCA. Vanessa Braganholo Estruturas de Dados e Seus Algoritmos

Computação II Orientação a Objetos

Computação II Orientação a Objetos

Computação II Orientação a Objetos

LINGUAGEM C: FUNÇÕES FUNÇÃO 08/01/2018. Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

1. Selecione a Estrutura de Dados que melhor representa os diretórios ou pastas de arquivos do computador.

Recursividade. Objetivos do módulo. O que é recursividade

3. Linguagem de Programação C

Linguagem e Técnicas de Programação

Apêndice A. Alguns construtores e métodos importantes e úteis da classe Vector são:

Computação II Orientação a Objetos

Aula 18: Funções em C

FUNÇÕES EM C Material adaptado da profa Silvana Maria Affonso de Lara

Linguagem de Programação I. Aula 10 Funções

Árvores. Sérgio Carlos Portari Júnior

Recursividade. Prof. Jesus José de Oliveira Neto

Computação II Orientação a Objetos

Árvores. Prof. César Melo DCC/ICE/UFAM

Introdução à Programação C

INF 1620 P4-13/12/01 Questão 1 Nome:

Árvores. Prof. César Melo DCC/ICE/UFAM

Computação II Orientação a Objetos

Listas generalizadas. SCC-202 Algoritmos e Estruturas de Dados I

LISTA DE EXERCÍCIOS MÊS 04

1. Faça um programa que leia uma string digitada pelo usuário e salve em um arquivo em branco.

Estrutura de Dados. Ricardo José Cabeça de Souza Parte 4

Introdução à Programação C

Algoritmos e Estruturas de Dados I 01/2013. Passagem de Parâmetros e Estruturas. Pedro O.S. Vaz de Melo

INF 1620 P3-21/06/08 Questão 1 Nome:

SSC304 Introdução à Programação Para Engenharias. Ponteiros. GE4 Bio

Modularização: Funções em C

1 Introdução e Conceitos básicos

Algoritmos e Estruturas de dados

Compiladores Ambiente de Execução

MC-102 Aula 24 Arquivos em C e Parâmetros do Programa

Computação II Orientação a Objetos

Linguagens de Domínio Específico

Estrutura de Dados Funções e Procedimentos

Alocação Dinâmica de Memória

Computação II Orientação a Objetos

Linguagem de Programação

Programação Estruturada e Orientada a Objetos. Estruturas Aninhadas

Programação I Funções. Prof. Carlos Alberto

Heaps. Estrutura de Dados. Universidade Federal de Juiz de Fora Departamento de Ciência da Computação 1 / 35

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

UFJF - DCC - Estrutura de Dados e Laboratório de Programação II

Linguagem de Programação III

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

ESTRUTURAS COMPOSTAS. REGISTROS (Struct) Introdução à Ciência da Computação I Simone Senger Souza

Listas: nós de cabeçalho, listas não homogêneas, listas generalizadas. SCC-502 Algoritmos e Estruturas de Dados I

CONCEITOS BÁSICOS DE ORIENTAÇÃO A OBJETOS PROF. ME. HÉLIO ESPERIDIÃO

Estruturas de Dados. Revisão de Funções e Recursão. Agradecimentos

Paradigmas de Programação. Java First-Tier: Aplicações. Orientação a Objetos em Java (I) Nomenclatura. Paradigma OO. Nomenclatura

Computação II Orientação a Objetos

Compiladores Ambiente de Execução

Organizam dados de forma hierárquica. Acontecem com frequência na natureza. Fáceis de representar e manipular com computadores

INF 1620 P4-27/06/02 Questão 1 Nome:

Árvores: conceitos gerais e representações

Suponha um conjunto habitacional, com várias famílias... imagina se todas elas morassem em uma única casa?

Técnicas de projeto de algoritmos: Indução

Listas: a última das 3 estruturas lineares (Pilhas, Filas e Listas)... árvores e grafos são não lineares!

INF 1007 Simulado P2 Nome: Instruções

UNIVERSIDADE FEDERAL FLUMINENSE INSTITUTO DE COMPUTAÇÃO DEPARTAMENTO DE CIÊNCIA DA COMPUTAÇÃO

ANHANGUERA ESTRUTURA DE DADOS AULA 02 O QUE É ESTRUTURA DE DADOS? Prof. Thomás da Costa

Funções são blocos de código que podem ser nomeados e chamados de dentro de um programa.

Compiladores Geração de Código

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

Análise de Complexidade. Algoritmos e Estruturas de Dados Flavio Figueiredo (

Linguagens de Programação

i a[i]

Aluno: Valor Nota Q1 3.0 Q2 2.5 Q3 2.5 Q4 2.0 Total 10.0

Classes o Objetos. Classes, objetos, métodos e variáveis de instância

Construtores e Especificadores de Acesso

Listas: nós de cabeçalho, listas não homogêneas, listas generalizadas

Para entender o conceito de objetos em programação devemos fazer uma analogia com o mundo real:

Programação II. Árvores Binárias (Binary Trees) Bruno Feijó Dept. de Informática, PUC-Rio

ESTRUTURA DE DADOS ESTRUTURAS E PONTEIROS

Permite modularidade (dividir programa em partes): Facilita a depuração (debug) e portabilidade.

Algoritmos e Programação

Ponteiros. Baseado nos slides do Prof. Mauro.

Árvores, Árvores Binárias e Árvores Binárias de Pesquisa. Rui Jorge Tramontin Jr.

Aula 10 Modularização Cleverton Hentz

Computação II (MAB 225)

Aula 13 Oficina de Programação Modularização. Profa. Elaine Faria UFU

Compiladores - Análise Ascendente

Análise e Complexidade de Algoritmos

Compiladores - Análise Ascendente

Informática I. Aula 14. Aula 14-10/10/2007 1

Linguagem de Programação III

Vetores. IFSC/Florianópolis - Programação Orientada a Objetos + POO - prof. Herval Daminelli

Revisão: Tipo Abstrato de Dados Recursividade

Sub-rotinas em C. Disciplina de Programação de Computadores I Universidade Federal de Ouro Preto

C Operadores e Expressões

Transcrição:

Introdução à Programação C Fabio Mascarenhas - 2014.2 http://www.dcc.ufrj.br/~fabiom/introc

Um Sistema de Arquivos Suponha que queremos representar um sistema de arquivos em que temos arquivos e diretórios Um arquivo tem um nome e um tamanho Um diretório tem um nome, uma lista de arquivos, mas também tem uma lista de outros diretórios Quando a definição de um tipo de dado inclui outras instâncias desse mesmo tipo como parte dele dizemos que esse tipo de dado é recursivo

struct Arq e struct Dir Usamos vetores dinâmicos para as listas de arquivos e diretórios: struct Dir { char nome[maxnome]; int uso_arqs; int cap_arqs; struct Arq *arqs; int uso_dirs; int cap_dirs; struct Dir *dirs; }; struct Arq { char nome[maxnome]; int tamanho; }; Poderíamos usar um vetor de tamanho fixo para os arquivos (struct Arq arqs[maxarqs]), mas não para o vetor de diretórios! Tente pensar em qual é o tamanho em memória de uma struct Dir acima, e qual seria ele se o campo dirs fosse um vetor de struct Dir

Campo recursivo Um campo recursivo sempre deve ser um ponteiro para a estrutura, e só pensar em seu layout na memória:

Criando diretórios Criar um novo diretório e adicionar um novo arquivo ou diretório a um já existente são tarefas simples Um novo diretório não tem arquivos nem outros diretórios Adicionar um arquivo a um diretório é só copiar seus dados para o vetor de arquivos, aumentando sua capacidade se necessário O mesmo para adicionar um diretório a outro

Sistema de arquivos Podemos representar o sistema de arquivos pelo seu diretório raiz Os diretórios formam uma árvore a partir desse diretório raiz

Espaço total Como podemos calcular o espaço total ocupado por todos os arquivos do nosso sistema? Para um arquivo é simples, é o seu tamanho Para uma lista de arquivos, basta somar todos os tamanhos E para um diretório?

kbytes_usados Definir a função que calcula quanto de espaço um diretório usa é fácil, basta usar a própria função para saber quando cada subdiretório dele usa: static int kbytes_usados(struct Dir *dir) { int i; int total = 0; for(i = 0; i < dir->uso_arqs; i++) { total = total + dir->arqs[i].tamanho; } for(i = 0; i < dir->uso_dirs; i++) { total = total + kbytes_usados(&(dir->dirs[i])); } return total; } Dizemos que a função kbytes_usados é uma função recursiva

Caso base, caso recursivo Uma função recursiva chama ela própria como parte de sua execução, mas nem sempre ela realmente vai fazer isso, ou o programa nunca terminaria! Quando ela consegue executar sem se chamar novamente, dizemos que ela atingiu um caso base Para kbytes_usados, o caso base é um diretório sem nenhum subdiretório Os outros casos são chamados de casos recursivos, e a ideia é que sempre que chamamos a função novamente estamos chamando ela em um problema menor, e alguma hora chegaremos em um caso base

Procurando um diretório por nome Muitas coisas que podemos querer fazer com uma estrutura recursiva são implementados por funções recursivas Por exemplo, como poderíamos implementar uma função busca_dir, que recebe um ponteiro para um diretório e um nome, procura um diretório com aquele nome, e retorna um ponteiro para ele (ou 0 se não achar)? O caso base é o caso em que o nome que estamos procurando é o do próprio diretório passado pra busca_dir Para o caso recursivo, retornamos o primeiro resultado de busca_dir nos subdiretórios que não for 0

Recursão em mais de um parâmetro Uma chamada recursiva de uma função pode envolver vários parâmetros Pense em uma variante de busca_dir com a assinatura abaixo, que busca a enésima ocorrência do diretório com o nome dado static struct Dir *busca_dir(struct Dir *dir, char *nome, int n, int *achados) Se não existirem n ocorrências, busca_dir retorna 0 e o parâmetro de saída achados diz quantas ocorrências existem O caso base agora é dir->nome igual ao nome passado, e n == 1

Desenhando com recursão Desenhar com funções recursivas é uma forma interessante de visualizar a recursão, e formar padrões bonitos: static void rec_h(double x, double y, double alt, double larg, int n) { tela_ret(x - larg/2, y-1, larg, 2, 1, 1, 1); tela_ret(x - larg/2-1, y - alt/2, 2, alt, 1, 1, 1); tela_ret(x + larg/2-1, y - alt/2, 2, alt, 1, 1, 1); if(n > 0) { rec_h(x - larg/2, y - alt/2, alt/2, larg/2, n-1); rec_h(x - larg/2, y + alt/2, alt/2, larg/2, n-1); rec_h(x + larg/2, y - alt/2, alt/2, larg/2, n-1); rec_h(x + larg/2, y + alt/2, alt/2, larg/2, n-1); } }

Concluindo Árvores como nossa árvore de diretórios são o tipo mais comum de estrutura recursiva, e aparecem na maioria das aplicações Os controles de uma interface gráfica formam uma árvore, uma página HTML em um browser é uma árvore de tags, um programa de computador é uma árvore de declarações, comandos e expressões Funções recursivas como as que vimos são a maneira mais fácil de trabalhar com qualquer tipo de árvore, e vocês usarão muito esse tipo de função em outras disciplinas do curso de computação