++ COMUNICADO
Caros colegas e alunos, depois dos acontecimentos ocorridos no dia de hoje e que foram as entregas e defesas da fase 1 do Projecto Integrado achei que devia redigir este comunicado para, pelo menos, todos reflectirmos um pouco sobre o que aconteceu.
Antes de mais, queria aqui deixar expressos os meus parabéns a todos os alunos que, com mais ou menos dificuldades, realizaram um trabalho honesto e compareceram como acordado para fazerem a respectiva defesa.
Foi com grande consternação e tristeza que ao fazer o balanço no fim do dia, a equipe docente constatou que cerca de 50% dos trabalhos apresentados incluíam fraudes a vários níveis. Muitos de vocês foram afectados pos esta situação e no fim fiquei com a sensação de que não perceberam inteiramente o que tinham feito o que motivou esta minha reflexão.
Não percebem que:
copiar um trabalho é o mesmo que roubar, é como entrar num gabinete com a porta aberta e retirar de lá o que entenderem?
ao copiar um trabalho estão a desvalorizar o vosso trabalho?
ao copiar um trabalho estão a enganar-se a vocês próprios pois não aprendem?
ao copiar estão a enganar o docente que tem estado empenhado em ensinar-vos e em preparar-vos para o que será o resto da vossa vida?
um dia podem não ter nada nem ninguém por onde copiar? E aí? Como irão fazer se a vossa cabeça não está preparada para pensar per si?
se quiserem viver num país honesto onde as pessoas sejam verdadeiras isso pode começar por cada um de vocês? Que exemplos dão aos outros ao vosso lado ou que ainda caminham atrás de vós?
Pensem nestas questões que aqui deixo e que se estamos a actuar como actuámos é porque acreditamos que vocês podem ser muito melhores do que mostraram hoje.
Eu acredito. Vocês acreditam? Ainda temos um caminho a percorrer juntos...
José Carlos Ramalho
PS: Atendendo à dimensão do problema a equipe docente emitirá, amanhã às 12.00h, um comunicado onde ficará estabelecido em definitivo como será o procedimento relativamente às situações fraudulentas detectadas hoje (isto só será feito por serem alunos do 1º ano).
-- JoseCarlosRamalho - 30 Mar 2005
COMUNICADO
Neste momento, está a ser preparado um documento que será subscrito por todos os docentes envolvidos e que faz uma análise ao que aconteceu ontem e que justifica as medidas que serão tomadas e que se descrevem a seguir (as que estão relacionadas com PI).
Assim, foi estipulado o seguinte:
As fases do trabalho terão pesos diferentes sendo que a primeira vale 20%, a segunda 40% e a terceira também 40% da nota prática final.
Excepcionalmente, e porque estamos perante uma turma do 1º ano, os alunos apanhados em atitudes fraudulentas será contabilizado um 0 na primeira fase (na pauta aparecerá FRAUDE), podendo continuar a trabalhar para a disciplina entregando as fases seguintes.
++ Funcionamento das aulas Teórico-Práticas e Práticas
As aulas teórico-práticas da diciplina Programação Imperativa são baseadas na
realização de uma ficha teórico-prática por semana, previamente disponível aqui neste
site.
Na aula teórico-prática semanal, a ficha será abordada sob o ponto de vista
algorítmico. Espera-se que o aluno pense no problema e especifique uma possível
solução. Na aula prática, os alunos deverão desenvolver os seus algoritmos em C
e colocá-los a funcionar no computador. No fim, cada grupo deverá submeter ao
sistema de submissões electrónico a ficha com as suas resoluções.
++ Ambiente de Programação em C
Para a resolução dos programas apresentados nas fichas de Programação
Imperativa, aconselham-se todos os alunos a criar um ambiente de trabalho no
computador que permita editar, compilar e executar os programas C, bem como
preparar a documentação associada aos programas desenvolvidos.
+++ Comentários em C
Diga quais as formas permitidas para misturar comentários com
o texto dos programas, na linguagem C.
+++ Primeiro programa C - "Hello world!"
Desenvolva um programa C que escreve a string "O meu primeiro programa" no
écran do computador.
+++ Compilação separada em C
Verifique o que faz cada uma das seguintes opções do gcc:
gcc -E
gcc -S
gcc -c
gcc -o ou só gcc
+++ Soma de 2 números inteiros
Escreva um novo programa C, que soma dois números inteiros, previamente
declarados e inicializados respectivamente com 7 e 9, e escreve o resultado da
soma.
+++ Utilização do gcc
Escreva os comandos para realizar as acções seguintes:
Comandos para compilar os programas C (sem gerar o
++ LaTeX?
+++ Um pequeno relatório
Com a ajuda do professor, elabore em LaTeX? , um pequeno relatório do trabalho
realizado nesta ficha. Para tal edite o ficheiro TeX? desta ficha,
acrescentando as soluções que desenvolveu na aula. No fim, gere um documento em PDF.
-- JoseCarlosRamalho - 24 Feb 2005
O objectivo principal desta ficha é familiarizar o aluno com a linguagem algorítmica que irá ser usada para especificar os algoritmos e com as estruturas de controlo da linguagem C.
Para atingir esse fim, o aluno irá desenvolver pequenos algoritmos e tentar codificá-los em C.
Exercícios:
Exercício Nº1: O Maior de 2 Números
Desenvolva o algoritmo, e posteriormente codifique-o em C, de um programa que lê dois inteiros e escreve o maior deles.
Exercício Nº2: O Maior de N Números
Desenvolva o algoritmo, e posteriormente codifique-o em C, de um programa que lê N inteiros e escreve o maior deles.
Exercício Nº3: Números Pares
Desenvolva o algoritmo, e posteriormente codifique-o em C, de um programa que lê um determinado número inteiro N e escreve os números pares até N.
Exercício Nº4: Potências
Desenvolva o algoritmo, e posteriormente codifique-o em C, de um programa que lê 2 números inteiros, a e b, e escreve o resultado de elevar a à potência de b (utilize estruturas cíclicas para calcular o valor da potência).
Exercício Nº5: Factorial
Desenvolva o algoritmo, e posteriormente codifique-o em C, de um programa que lê um inteiro positivo e escreve o valor do seu factorial.
Exercício Nº6: Tabela de Conversão de Temperaturas
Considere a seguinte fórmula:Fahreneit = 32 + (1.8 * Celsius)
Desenvolva o algoritmo, e posteriormente codifique-o em C, de um programa que calcula uma tabela de conversão entre graus Celsius e graus Fahreneit com Fahreneit a variar entre 0 e 300 (considere intervalos de 5 graus).
-- JoseCarlosRamalho - 28 Feb 2005
O objectivo principal desta ficha é familiarizar o aluno com a codificação de algoritmos um pouco mais complexos alguns deles envolvendo manipulação de strings. Outro dos objectivos, é a integração com a disciplina de Arquitectura de Computadores, pelo que no fim da ficha aparece um conjunto de problemas sobre conversão de representações numéricas.
Para atingir esse fim, o aluno irá desenvolver pequenos algoritmos e tentar codificá-los em C.
Nota: os exercícios 2, 3, 4 e 9 são de resolução opcional. Na ficha a submeter ao sistema só são obrigatórios os restantes.
Desenvolva o algoritmo, e posteriormente codifique-o em C, de um programa que lê um inteiros e escreve no écran os seus divisores.
Exercício Nº2: Maior Divisor Comum
Desenvolva o algoritmo, e posteriormente codifique-o em C como uma função. A sua função deverá ter dois argumentos inteiros e produzir um resultado inteiro que é o maior divisor comum dos argumentos recebidos. Posteriormente codifique um programa principal (main()) que utiliza esta função para cálculo do maior divisor comum de dois números fornecidos pelo utilizador.
Ver Algorítmo de Euclides
Que pode ser resumido em:
Desenvolva o algoritmo, e posteriormente codifique-o em C como uma função. A sua função deverá ter dois argumentos inteiros e produzir um resultado inteiro que é o menor múltiplo comum dos argumentos recebidos. Posteriormente codifique um programa principal (main()) que utiliza esta função para cálculo do menor múltiplo comum de dois números fornecidos pelo utilizador.
Exercício Nº4: É Primo?
Desenvolva o algoritmo, e posteriormente codifique-o em C como uma função. A sua função deverá ter um argumento inteiros e produzir um resultado do tipo booleano (o docente irá desenvolver uma pequena biblioteca de booleanos: bool.h). O resultado será verdadeiro (TRUE) se o argumento passado fôr primo e falso (FALSE) caso contrário. Posteriormente codifique um programa principal (main()) que utiliza esta função para verificar quem é primo numa sequência de inteiros introduzidos pelo utilizador (terminada por 0).
Exercício Nº5: Tudo ao contrário!
Foste transferido para uma nova escola.
Nessa escola, a professora e matemática gostava muito de pôr os alunos a pensar e tentava que a mais simples tarefa fosse algo em que o raciocínio tivesse que intervir.
Uma das medidas que ela implementou foi a de utilizar os números inteiros invertidos. Por exemplo, o 12 seria 21 e o 1821 seria 1281.
Ora, os alunos locais já estão habituados a lidar com os inteiros daquela maneira e até fazem as operações de adição e subtracção com os inteiros naquela forma. No entanto, para ti, que acabaste de chegar à escola esta tarefa não é tão simples.
Assim, resolveste criar um programa em computador que fizesse três coisas:
dado um número calcula o seu inverso (o valor inteiro correcto)
dados dois números na forma invertida calcula a sua soma e devolve o resultado na mesma forma invertida
dados dois números na forma invertida calcula a sua subtracção e devolve o resultado na mesma forma invertida
Sugestão: especifica uma função para cada um dos pontos acima.
Exercício Nº6: Sequência de Fibonacci
Codifica um programa que gere os primeiros 20 números de Fibonacci. Os números de Fibonacci são definidos recursivamente da seguinte forma:
Depois de estudares o algoritmo das divisões sucessivas para a conversão de números decimais em números binários, desenvolvido na aula teórico-prática, codifica-o num programa em C.
Exercício Nº8: Conversão binário-decimal
Depois de teres resolvido o problema anterior, tenta resolver o problema inverso. Nota que os números binários são representados numa string com os carácteres 0 e 1.
Exercício Nº9: Conversão binário-hexadecimal
Pensa agora com converter um número binário em hexadecimal. Cria um programa em C para realizar esta tarefa.
-- JoseCarlosRamalho - 07 Mar 2005
O objectivo principal desta ficha é familiarizar o aluno com a utilização e manipulação de vectores e matrizes em C. As strings são casos particulares de arrays: uma string é um array em que os elementos são todos do tipo char. Assim, nesta ficha surgem também alguns exercícios envolvendo manipulação de strings.
Especifique um programa e codifique-o em C que lê 10 números inteiros positivos de um ficheiro externo (considere que cada linha do ficheiro contem apenas um número) e escreve:
a sua média e o valor máximo;
os numeros maiores que a média;
a quantidade de números menores que a média;
Depois de ter realizado as tarefas anteriores faça o programa produzir os resultados num ficheiro de nome relatorio.txt.
Exercício Nº2: Capicua
Especifique uma função que recebe uma string e verifica se a mesma é capicua (lida da esquerda para a direita, ou da direita para a esquerda, é a mesma palavra/frase).
Exemplos típicos: ala ou rapar.
Um caso curioso (e, claro, mais complexo) é a seguinte Capicua brasileira: Socorram-me subi no onibus em Marrocos.
Exercício Nº3: Conversão Romano-Árabe
Especifique uma função que recebe uma string contendo um número escrito em notação romana e que dá como resultado o respectivo valor inteiro (correspondente à notação arábica).
Exercício Nº4: Cifra por substituição arbitrária
Considere a cifra (palavra-chave) constituída pelas letras "SAPO" seguidas de um dígito n (entre 0 e 9). Para a cifragem (codificação) da mensagem efectuam-se os seguintes passos:
reduzem-se espaços seguidos a um único espaço e mantém-se os caracteres de pontuação;
os digitos rodam-se (circularmente) para a direita da quantidade n;
convertem-se todas as letras em maiúsculas ou minúsculas;
considera-se a seguinte tabela de codificação:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
S
A
P
O
B
C
D
E
F
G
H
I
J
K
L
M
N
Q
R
T
U
V
W
X
Y
Z
A construção desta tabela limita-se a colocar a palavra chave no início e completar com as restantes letras do alfabeto, não colocando as letras que se repetem.
para a codificação, substitui-se cada um dos carácteres da primeira linha pelo carácter correspondente da segunda linha.
Construa um programa que dada uma cifra, codifique a mensagem, e um outro que, dada a mensagem cifrada e a cifra, descodifique a mensagem.
Exercício Nº5: Estatísticas de texto
Crie um programa que leia todos os caracteres de um texto (até encontrar um o fimde ficheiro, eof) e que no fim indique quantas vezes apareceu cada
uma das 26 letras do alfabeto (considere maiúsculas iguais às minúsculas).
-- JoseCarlosRamalho - 13 Mar 2005
O objectivo principal desta ficha é consolidar os conhecimentos sobre manipulação de arrays em C expandindo para a manipulação de arrays multidimensionais, noemadamente as matrizes.
Exercícios:
Exercício Nº1: Gestão de Armazens
Uma empresa tem 10 armazens e precisa de um programa que leia as vendas mensais dos 10 armazens, calcule a media de vendas e produza uma listagem dos armazens com vendas superiores à média calculada.
Exercício Nº2: Contem ou Contido
Desenvolva um algoritmo e posteriormente codifique-o em C que dadas dumas matrizes de dimensões arbitrárias verifica se a primeira contem a segunda (considere que os valores armazenados nas matrizes são do tipo inteiro).
Exercício Nº3: Média dos Alunos
Cada aluno de uma licenciatura em Ciências da Computação pode ter notas correspondentes a 10 disciplinas feitas durante o ano lectivo (caso não tenha sido avaliado positivamente a uma disciplina não terá essa nota).
Declare as estruturas de dados (o modelo) necessárias para suportar o sistema de informação: um aluno tem um número (inteiro sequencial a partir de 1), um nome (string) e uma lista de notas (reais). Pense na hipótese de encarar o número do aluno como um código alfanumérico (para permitir números em qualquer escala, ou mesmo o uso de letras) e identifique as alterações daí decorrentes.
Inicialize a estrutura de dados: na declaração e/ou numa função de inicialização que é chamada no início da função main().
Crie as funções normais de manipulação de uma pequena base de dados:
Inserir - de modo a manter a informação por ordem alfabética de nome. Numa 1ª versão, utilize o algoritmo por trocas directas e, numa 2ª versão, use a inserção ordenada;
Remover - utilize a pesquisa sequencial ordenada para encontrar o registo a remover;
Consultar - utilize a pesquisa dicotómica para encontrar o registo a consultar;
Listar - liste todos os alunos armazenados, por ordem alfabética.
Especifique uma função em C para calcular a média de cada aluno (faça uma função que dada a estrutura de dados principal e o identificador do aluno, produz como resultado a sua média); note que disciplinas não avaliadas não contam para a média (diferente de obter a classificação 0 numa disciplina).
Calcule a média geral da turma.
Calcule a média da turma em cada disciplina.
Calcule a percentagem de faltas (ausência de nota).
O objectivo principal desta ficha é familiarizar o aluno com a utilização dos algoritmos tradicionais de busca e ordenação de Arrays.
Exercícios:
Exercício Nº1: Inserção Ordenada
Voltando ao exercício da última ficha em que se geriam alunos e respectivas notas, implemente a operação correspondente à inserção de um novo aluno (faça a inserção ordenada desse aluno).
Este problema pode ser dividido em três fases:
Descobrir a posição onde o novo aluno deverá ser inserido;
Deslocar os elementos maiores uma posição para a frente;
Inserir o novo aluno na posição livre.
Exercício Nº2: Remoção
Especifique a operação de remoção de um aluno tendo o cuidado de deixar a estrutura ordenada e sem "buracos".
Exercício Nº3: Busca Dicotómica
Uma vez que a estrutura está ordenada a pesquisa pode ser optimizada. Implemente a pesquisa dicotómica sobre um array ordenado.
-- JoseCarlosRamalho - 20 Mar 2005
O objectivo principal desta ficha é familiarizar o aluno com a utilização de algoritmos mais avançados de busca e ordenação sobre Arrays. No fim, porpõem-se alguns exercícos envolvendo estruturas.
Exercícios:
Exercício Nº1: Estrutura Ligada
Voltando ao exercício da última ficha em que se geriam alunos e respectivas notas, considere a hipótese de utilizar uma ligação lógica entre os elementos como forma de os manter ordenados(como discutido na aula teórica de 01-04-2004) e implemente as seguintes funções:
Incialização do modelo de dados: lembre-se que também será necessário gerir as posições livres.
Listar: esta função produz uma listagem ordenada da informação de todos os alunos.
Consulta: esta função imprime no écran toda a informação referente a um determinado aluno.
Inserir: esta função insere o novo aluno na primeira posição livre e actualiza as ligações de forma a manter a informação logicamente ordenada.
Remover: esta função remove o aluno em causa e coloca a respectiva posição na lista de posições livres (garbage collector).
Este problema pode ser dividido em três fases:
Exercício Nº2: Estrutura ou Produto Cartesiano
Considere de novo o problema do exercício anterior e resolva as seguintes alíneas:
Defina um tipo de dados Aluno como sendo uma estrutura (struct) onde é guardada a informação do aluno.
Defina um tipo de dados Turma como sendo uma lista de Aluno.
Declare variáveis do tipo Aluno e do tipo Turma.
Adapte as funções desenvolvidas no exercício anterior para trabalhar com estes novos tipos de dados.
Ficha Nº7: Estruturas de Dados Dinâmicas - Listas Ligadas
Objectivos:
O objectivo principal desta ficha é familiarizar o aluno com a utilização de estruturas de dados dinâmicas.
Exercícios:
Exercício Nº1: Lista de Inteiros
Considere uma lista de inteiros (não se sabe o seu comprimento). Especifique então as seguintes funções e estruturas de dados:
Defina os tipos necessários para suportar uma lista ligada de inteiros.
Especifique uma função para inserir um valor na cabeça da lista.
Especifique uma função para listar os valores da lista, do início para o fim (faça também a função que lista os elementos na ordem inversa).
Especifique uma função para procurar um valor na lista (como resultado deverá devolver um apontador para o elemento ou NULL caso não o encontre).
Especifique uma função para contar os elementos da lista.
Especifique uma função para calcular o maior elemento na lista.
Especifique um programa, usando as funções definidas, que cria uma lista com os múltiplos de 3 entre 0 e 100 e os lista por ordem decrescente e crescente.
Exercício Nº2: À procura da saída ...
Suponha que existe um labirinto (pense numa representação adequada para o mesmo) que tem um ponto de entrada e um ponto de saída. Especifique um algoritmo que vai descobrir um caminho possível entre o ponto de entrada e o ponto de saída. Ajuda: modele numa lista ligada uma stack para ir guardando o caminho percorrido e as hipóteses alternativas.
Exercício Nº3: A Agenda de Contactos
Pretende-se que desenvolva uma aplicação para gerir uma agenda de contactos. Uma agenda é uma lista de entradas ou grupos de entradas. Uma entrada tem a seguinte constituição:
chave
chave única de identificação (não pode haver duas entradas com a mesma chave);
tipo
tipo da entrada: pessoa, empresa, ...
nome
nome da pessoa, empresa ou entidade;
email
contacto electrónco (é opcional)
telefone
número de telefone (obrigatório)
Um grupo pode ter entradas, referências a entradas já existentes na agenda (por chave) ou subgrupos (os grupos podem ter grupos aninhados infinitamente). O grupo tem, então, a seguinte constituição:
chave
chave única de identificação (não pode haver dois grupos com a mesma chave);
nome
nome do grupo; lista de itens: entradas e/ou grupos e/ou referências;
Por sua vez, a referência é apenas constituída pela chave da entrada ou grupo que referencia.
Desenvolva a aplicação nas seguintes etapas:
Defina as estruturas de dados necessárias para suportar o sistema de informação;
Espeifique as várias funções de inserção: inserir uma entrada na agenda, inserir um grupo na agenda, inserir uma entrada num grupo, ...
Especifique uma função para listar o conteúdo da agenda.
Especifique uma função para gravar o conteúdo da agenda num ficheiro.
Especifique uma função para carregar o conteúdo da agenda de um ficheiro.
#ifndef _LISTA
#define _LISTA
typedef struct sInteiro
{
int valor;
struct sInteiro * seg;
} Nodo, *Lista;
Lista inserir( int v, Lista l );
void listar( Lista l );
void listar_inv( Lista l );
Lista procurar( int v, Lista l );
int conta_elems( Lista l );
#endif
lista.c
#include "lista.h"
#include <stdio.h>
Lista inserir( int v, Lista l )
{
Lista novo;
novo = (Lista) malloc(sizeof(Nodo));
novo->valor = v;
novo->seg = l;
return novo;
}
void listar( Lista l )
{
if(l)
{
printf("%d ",l->valor);
listar(l->seg);
}
}
Lista inserir_ord( int v, Lista l)
{
Lista novo;
if((!l) || (l->valor > v))
{
novo = (Lista) malloc(sizeof(Nodo));
novo->valor = v;
novo->seg = l;
return novo;
}
else
{
l->seg = inserir_ord(v,l->seg);
return l;
}
}
prog.c
#include <stdio.h>
#include "lista.h"
int main()
{
Lista li=NULL;
int i=0;
while ((i+=3) < 100)
li = inserir(i,li);
listar(li);
return 0;
}
Este projecto tem como objectivos principais a formação genérica e específica de estudantes em fundamentos de computação em
áreas de informática afins e interligadas, a programação imperativa e a arquitectura de computadores.
Os objectivos de formação genérica incluem: (i) a pesquisa, análise e selecção de informação, (ii) o treino de trabalho de
grupo na resolução de problemas, (iii) o desenvolvimento da capacidade de análise e compreensão de textos em língua inglesa,
e (iv) o desenvolvimento da capacidade de comunicação escrita e oral.
Os objectivos de formação específica incluem: (i) a análise da especificação e do problema, (ii) o desenvolvimento de algoritmos
e consequente programação numa linguagem imperativa, (iii) a execução e realização de testes de conformidade, (iv) a análise
da execução desses programas numa dada arquitectura de computadores (IA-32), e (v) a aplicação de técnicas de optimização
de algoritmos/programas/códigos, com vista a melhorar o desempenho.
A avaliação dos resultados esperados de aprendizagem irão verificar se as/os estudantes conseguem demonstrar ter adquirido
o seguinte conjunto de competências genéricas e específicas:
competências genéricas
a capacidade de trabalho em grupo e respectiva comunicação efectiva e eficiente entre os elementos do grupo;
a capacidade de comunicação escrita e oral na apresentação e discussão dos processos usados e resultados obtidos;
a capacidade de utilização de utilitários genéricos de informática em ambiente Linux e de elaboração de documentos anotados
competências específicas de Programação Imperativa
a capacidade de desenvolver algoritmos para resolver problemas, de forma criativa, criteriosa e crítica, e inserida/o num
grupo de trabalho
o conhecimento e a capacidade de codificar algoritmos e estruturas de dados segundo os princípios da programação estruturada
a capacidade e aptidões práticas para gerar, executar e testar programas codificados em C, usando um conjunto adequado de
utilitários (GNU)
o conhecimento e as aptidões de desenvolver e aplicar testes de conformidade e de analisar situações de fronteira na execução
de programas
capacidade e aptidões na produção de documentação adequada à manutenção por terceiros dos programas desenvolvidos
competências específicas de Arquitectura de Computadores
a capacidade de pesquisar, seleccionar, analisar e interpretar a informação necessária para completar a especificação inicial
do projecto (em língua inglesa, e relacionada com formas de representação de informação) (Fase1);
o conhecimento e a capacidade de identificar e descrever formas de representação binária de informação gráfica (Fase1);
o conhecimento e a capacidade de identificar, compreender e caracterizar as técnicas de codificação de estruturas típicas
de controlo e dos métodos de acesso e manipulação de dados estruturados, no processo de compilação de uma linguagem imperativa
(gcc) (Fase2);
a aptidão para efectuar a análise de código em assembly e utilizar ferramentas de baixo nível de depuração (gdb) de programas (Fase2);
o conhecimento, a capacidade e a aptidão para a aplicação de técnicas de engenharia inversa a código binário (Fase2);
o conhecimento e a capacidade de identificar e descrever métricas que caracterizem o desempenho da execução dos programas
específicos deste trabalho (Fase 3);
aptidões na aplicação de técnicas de análise de desempenho baseadas no profiling de aplicações (Fase 3);
capacidades e aptidões para descrever, aplicar e avaliar técnicas de optimização de desempenho independentes e dependentes
da máquina (Fase 3);
O PNM é um formato de imagem muito simples, fácil de ler a partir de um ficheiro e também fácil de escrever para um ficheiro.
Actualmente uma imagem PNM pode pertencer a uma de três famílias, abaixo explicadas: PBM, PGM e PPM. Cada família tem duas
representações
uma textual e uma compactada.
Embora não seja um requisito da especificação PNM, existe a convenção de que a imagem deve ser armazenada de cima para baixo
e da esquerda para a direita. Cada pixel da imagem é armazenado num byte, valor 0 = preto, valor 255 = branco. Os componentes
de cor são armazenados na ordem habitual RGB ("red", "green" and "blue"), um valor para o nível de vermelho, um valor para
o nível de verde e um valor para o nível de azul.
Esta família corresponde a imagens contendo apenas duas cores, branco (1) e preto (0), normalmente designadas por bitmaps.
A sua forma textual pode ser descrita da seguinte maneira:
qualquer linha iniciada pelo carácter # é um comentário; os comentários só poem aparecer nas linhas do cabeçalho, ou seja,
antes dos valores dos pontos da imagem.
a primeira linha contem o identificador do tipo da imagem: P1
a segunda linha contem um par de valores que definem respectivamente o decimal correspondente ao número de colunas (largura
da imagem em pixeis), por exemplo: 9, e o decimal correspondente ao número de linhas (altura da imagem em pixeis), por exemplo:
as linhas restantes contêm uma lista de valores decimais, em que cada valor corresponde a um pixel da imagem e estão organizadas
de acordo com os valores definidos nas linhas anteriores. Com os exemplos dados nos itens anteriores teríamos 7 linhas cada
uma com 9 valores separados por espaço (cada valor corresponde a um byte, 0-255, que no caso das imagens do tipo P1 apenas
assume valores no intervalo [0,1])
Um exemplo de uma imagem neste formato poderia ser:
Se analisar um pouco a imagem que esta representa um banner com fundo preto e letras a branco. Neste caso, a imagem contem
a string "PI". Note também que, para este caso do banner, a primeira linha, a última linha, a primeira e última colunas são
pretas e que entre duas letras há duas colunas pretas de separação.
A sua forma compactada resulta da constatação de que um byte é uma sequência de 8 0's e 1's. Assim, um byte pode guardar 8
pixeis da imagem. A única alteração ao formato é o identificador que passa a: P4.
A seguir apresenta-se o exemplo anterior agora compactado:
Note que, apenas para efeitos de visualização, introduziram-se espaços entre os valores da forma compactada. Nas formas compactadas
PNM, não há espaços de separação entre os valores. A informação é guardada em ficheiro em bytes sequenciais.
Esta família corresponde a imagens definidas com vários níveis de cinzento.
A sua forma textual pode ser descrita da seguinte maneira:
qualquer linha iniciada pelo carácter # corresponde a um comentário e deverá ser ignorada.
a primeira linha contem o identificador do tipo da imagem: P2
a segunda linha contem um par de valores que definem respectivamente o decimal correspondente ao número de colunas (largura
da imagem em pixeis), por exemplo: 9, e o decimal correspondente ao número de linhas (altura da imagem em pixeis), por exemplo:
a terceira linha contem o maior valor decimal que é possível encontrar para a definição de um pixel: [0,65536] (2 elevado
a 16), vamos designá-lo por MAX. Normalmente, tenta-se que o intervalo seja [0,255] pois apenas nesta situação se pode falar
em compactação e no formato P5. Se MAX estiver no intervalo [0,255] é utilizado apenas um byte por cada pixel da imagem. Caso contrário, MAX esteja no intervalo [256,65535], são utilizados dois bytes por cada pixel da imagem; o byte mais significativo aparece primeiro.
as linhas restantes contêm uma lista de valores decimais, em que cada valor corresponde a um pixel da imagem e estão organizadas
de acordo com os valores definidos nas linhas anteriores. Com os exemplos dados nos itens anteriores teríamos 7 linhas cada
uma com 9 valores separados por espaço (cada valor corresponde a um pixel: 0-MAX).
cada linha não deverá ter mais de 70 valores.
o valor 0 corresponde à cor preta e o valor MAX corresponde à cor branca.
Um exemplo de uma imagem neste formato poderia ser:
Se analisar um pouco a imagem que esta representa um banner com fundo preto e letras a branco. Neste caso, a imagem contém a string "PI". Note também que, para este caso do banner, a primeira linha, a última linha, a primeira e última colunas são pretas e que entre duas letras há duas colunas pretas
de separação.
A sua forma compactada resulta da eliminação dos espaços nas linhas da imagem e apenas para o caso em que MAX está no intervalo
[0,255]. A única alteração ao formato é o identificador que passa a: P5.
Esta secção ficará em branco. Espera-se que os alunos "investiguem" e que a preencham um pouco à semelhança das outras.
Nas secções seguintes descrevem-se as diferentes fases do projecto e referem-se os requisitos que serão avaliados. Cada requisito
está devidamente identificado e poderá será avaliado apenas numa das disciplinas.
Nesta fase, pretende-se que as/os estudantes executem as seguintes tarefas:
pesquisar a Web para caracterizar sucintamente os formatos de imagem JPEG e GIF (avaliação exclusiva de AC), e para completar
o enunciado na descrição do formato PPM;
procurar na Web produtos que, em ambiente Linux (preferencial) convertam ficheiros de imagem/gráficos em formato JPEG ou GIF
para um dos formatos PNM (PBM, PGM ou PPM), e testar pelo menos um dos produtos que satisfaça os requisitos (avaliação exclusiva
de AC)";
desenvolver um conjunto de algoritmos elementares para transformar imagens PNM; mais concretamente, seguindo a descrição feita
na secção anterior pretende-se transformar imagens do tipo P2, P3, P5 e P6 em imagens do tipo P1 ou P4 (avaliação exclusiva
de PI);
codificar os algoritmos propostos, documentando-os adequadamente (avaliação exclusiva de PI);
preparar um conjunto de ficheiros de entrada para teste, que permita validar, além de outras, as de condições limite (avaliação
exclusiva de PI);
criar programas executáveis, usando o ambiente de desenvolvimento da GNU, e seleccionando o nível de optimização -O2 ;
integrar e testar o produto final (da Fase 1) usando comandos da shell para (i) leitura de um ficheiro JPEG ou GIF e sua conversão
para PNM, (ii) leitura de um ficheiro PNM (P2, P3, P5 ou P6) e sua conversão para noutro ficheiro PNM (P1 ou P4) e (iii) visualização
da imagem usando ImageMagick? (avaliação exclusiva de PI);
refinar o interface com o utilizador, construindo um menu de operações e permitindo mais que uma operação em cada sessão (avaliação
exclusiva de PI);
apresentar os resultados destas tarefas num relatório redigido em LaTeX? ; a sua estrutura deverá conter, para além do título
e lista de autores, um resumo (máx. 600 caracteres), uma introdução com caracterização do problema a resolver, uma breve exposição/relato
dos aspectos relevantes de cada uma das fases/tarefas, as conclusões, uma lista da bibliografia pertinente para a resolução
do trabalho, e, em anexo, uma listagem do código.
A título de curiosidade, apresentam-se algumas das operações que se poderão oferecer ao utilizador (se tiver tempo utilize
a sua imaginação para criar mais):
Nesta fase, pretende-se que as/os estudantes executem as seguintes tarefas:
Corrigir e/ou completar as tarefas solicitadas na 1ª fase e que não foram realizadas, ou foram-no de modo menos correcto ou
adequado; estas incluem: (i) a produção de textos sobre JPEG/GIF/PPM, (ii) a selecção/teste de conversores JPEG/GIF para PNM
(PBM, PGM ou PPM), (iii) o desenvolvimento dos algoritmos e respectiva codificação, teste e integração (com os comentários
pertinentes) na transformação de imagens do tipo P2, P3, P5 e P6 em imagens do tipo P1 ou P4 , e (iv) a produção de um texto
em LaTeX? para posterior integração no relatório da 2ª fase e respectiva compilação para PDF.
Desenvolver um conjunto adicional de algoritmos para: (i) efectuar sobre imagens PNM as operações de rodar, negativo, média-vizinhos
e binarização-adaptativa (opcional), em que a descrição destas operações se encontra a seguir; e (ii) procurar os objectos
contidos numa imagem colorindo-os com cores diferentes, à medida que os encontra (esta operação é apenas para imagens P1 e
o resultado deverá ser uma imagem P3), de acordo com as indicações dadas no fim. Do ponto de vista de interface com o utilizador,
esta novas operações solicitadas devem ser integradas com as conversões iniciais no menu de opções da Fase 1, permitindo mais
que uma operação em cada sessão (avaliação exclusiva de PI).
Codificar os algoritmos propostos, comentando-os e documentando-os adequadamente (avaliação exclusiva de PI).
Criar programas executáveis, usando o ambiente de desenvolvimento da GNU, e seleccionando o nível de optimização -O2.
Preparar um conjunto de ficheiros de entrada para teste dos algoritmos/código das funções solicitadas, que permita validar,
além de outras, as condições limite (avaliação exclusiva de PI).
Analisar o código assembly produzido pelo gcc no processo de compilação (apenas) do código C de uma das funções pedidas (média-vizinhos,
no formato P5), dedicando uma secção do relatório a esta análise, com a seguinte informação: (i) apresentação do código em
assembly, claramente identificando o corpo da função e as componentes de arranque e término da função, e incluindo comentários
no corpo da função semelhantes a código C; (ii) identificação dos registos e/ou células de memória onde foram alocadas as
variáveis locais da função; (iii) apresentação da estrutura e conteúdo da stack frame no início da execução do corpo da função;
algumas destas tarefas deverão também ser executadas durante a defesa do trabalho (avaliação exclusiva de AC).
Efectuar o reverse engineering de uma função que converte uma imagem P5 noutra P5, modificada: dado o executável obter uma
possível versão do código da função em C, estruturada de uma forma correcta e elegante (avaliação exclusiva de AC).
Integrar e testar o produto final (da Fase 2) usando comandos da shell para (i) leitura de um ficheiro JPEG ou GIF e sua conversão
para PNM, (ii) leitura de um ficheiro PNM e aplicação de uma das operações pedidas, gerando um outro ficheiro PNM e (iii)
visualização da imagem usando ImageMagick? (avaliação exclusiva de PI).
Apresentar os resultados destas tarefas num relatório redigido em LaTeX? (que terá de ser submetido já compilado para PDF,
num ficheiro cujo nome contém a indicação de "Fase2" seguido da identificação do grupo (por ex., "Fase2-3.15")); a estrutura
do relatório deverá ser idêntica à solicitada na Fase 1 ("conter, para além do título e lista de autores, um resumo (máx. 600 caracteres), uma introdução com caracterização do problema
a resolver, uma breve exposição/relato dos aspectos relevantes de cada uma das fases/tarefas, as conclusões, uma lista da
bibliografia pertinente para a resolução do trabalho, e, em anexo, uma listagem do código") e deverá incluir uma versão reformulada/corrigida/completa do relatório da Fase 1.
Preparar uma apresentação oral do trabalho de grupo feito até à data, (sem slides!) que não deverá ocupar mais de 5 min do
tempo de defesa do trabalho.
Detalhe das operações de manipulação de imagem acima referidos (para PI):
rodar()
a imagem é rodada 90 graus para a direita.
negativo()
o valor dos pixeis da imagem é invertido de acordo com a fórmula: MAX - valor_corrente
media-vizinhos(nvizinhos)
cada pixel da imagem vai tomar um novo valor que será igual à média dos valores dos seus nvizinhos vizinhos, de acordo com
a seguinte interpretação: nvizinhos=2 inclui os vizinhos da esquerda e direita; nvizinhos=4 inclui os vizinhos da esquerda,
direita, cima e baixo; e nvizinhos=8 inclui os vizinhos anteriores e ainda os quatro das diagonais.
bin-adapt()
esta operação será opcional e consiste em criar uma nova versão das conversões para P1; em vez de se considerar o valor médio
(Max/2) como o valor de threshold para a binarização, considere-se o valor médio da diferença entre o valor máximo e a média
dos pixeis da imagem ((Max-Média)/2).
Relativamente à procura de objectos em imagens a preto-e-branco e sua coloração, os objectos a procurar são pixeis contíguos
(horizontal, vertical ou diagonalmente) com o mesmo valor, e podem ser pontos, linhas ou áreas; por exemplo, se se considerar
uma imagem P1 com as letras "PI" em cima, o resultado seria uma P3 com o "P" a uma cor (azul, por exemplo) e o "I" a outra
cor (vermelho, por exemplo).
Relativamente à componente de Programação Imperativa e tendo em atenção o estado em que os trabalhos se encontram, após a
segunda avaliação, foi decidido que a terceira fase será opcional e só deverá ser realizada pelos grupos que cumpriram integralmente
os requisitos até ao momento e que querem obter uma classificação num dos últimos escalões (Muito Bom, Excelente).
Assim, e para grande maioria dos grupos, pede-se que implementem os requisitos das fases 1 e 2. Os restantes terão de desenvolver
a aplicação cujos requisitos se apresentam a seguir.
Desenvolve uma aplicação para a geração automática de pautas musicais coloridas. O programa deverá aceitar um ficheiro de
texto com a descrição textual de uma música e deverá gerar uma imagem P3 ou P6 com a respectiva pauta musical.
Os requisitos para a aplicação são os seguintes:
O desenho da pauta fica ao teu critério: espessura das linhas, dimensões das notas, ...
Uma pauta é constituída por cinco linhas horizontais espaçadas uniformemente. As notas colocam-se sobre as linhas ou nos espaços
entre elas.
Uma música é constituída por uma lista de compassos. Cada compasso deverá ser separado do seguinte por uma linha vertical
de espessura ligeiramente inferior à das linhas da pauta.
A cor das notas não é livre e deverá seguir o seguinte esquema:
Nota Musical
Descrição
Côr RGB em Hex
C
Dó
FF0000
C# ou Db
Dó sustenido ou Ré bemol
FF3300
D
Ré
FF6600
D# ou Eb
Ré sustenido ou Mi bemol
FFCC00
E
Mi
FFFF33
F
Fá
00FF00
F# ou Gb
Fá sustenido ou Sol bemol
00AA00
G
Sol
004400
G# ou Ab
Sol sustenido ou Lá bemol
0000FF
A
Lá
330033
A# ou Bb
Lá sustenido ou Si bemol
990066
B
Si
FF0066
CM
Dó maior
FF0000
O ficheiro de entrada, onde é descrita a música em forma textual, tem a seguinte estrutura:
Na primeira linha tem o título da música.
Cada linha das que se seguem à primeira contem um compasso da música.
Numa linha de compasso cada nota é separada da que se lhe segue por um espaço.
Além de notas podem aparecer pausas e sinais de repetição (o tratmento destes é opcional).
A título de exemplo, apresenta-se a seguir a descrição de uma música popular portuguesa bem conhecida:
O Chapéu de 3 bicos
G
CM G
G F E
F D
D E
F F G
A G
E
Pausa
G CM G G
F E F D
D E F
G A G C
Repete
O resultado esperado para o exemplo anterior pode ser visualizado em: O Chapéu de 3 bicos.
A seguir apresentam-se mais músicas para teste da aplicação final.
O lencinho
G A
G E
C G A
G E
C C C
D D C D
E E D E
F F E F
G G A
G E
C G A
G E
C C C
D D C D
E F G A
G F E D
C C
E F
G
Pausa E F
G
Pausa A Bb
CM
Pausa A Bb
CM
Pausa C C
C C Bb A
G G G A
G F E D
C C
Repete
Dança das Horas: nesta música existem acordes (notas que devem ser tocadas ao mesmo tempo); um acorde tem parentesis curvos
a limitar as suas notas; as notas de um acorde devem ser desenhadas alinhadas verticalmente, ou seja, o centro do círculo
de cada nota deve estar sobre a mesma linha vertical; o tratamento de acordes é um extra.
Dança das Horas
A
F G
C
C
G A
F
F A
G F
C
C C
G A
F
F Pausa
(F A)
(F A)
(F A)
Pausa C
F
O balão do João
O balão do João
G E E
F D D
C D E F
G G G
G E E
F D D
C E G G
(G C E)
Repete
D D D D
D E F
E E E E
E F G
G E E
F D D
C E G G
(G C E)
Repete
Lagarto Pintado
Lagarto Pintado
C
G CM G
E C
A A A
A G
G CM G
E C
F E D
C
Repete
Ficha Nº7: Estruturas de Dados Dinâmicas Listas Ligadas Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização de estruturas de dados ...
Ficha Nº6: Arrays e Estruturas Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização de algoritmos mais avançados de busca e ordena ...
para Submissão de Fichas Práticas e de Trabalhos Práticos Ficha 1, Ambientação ao unix e utilização de algumas ferramentas: gcc, vi, make, latex. (em PDF, em ...
Ficha Nº5 Objectivos: O objectivo principal desta ficha é consolidar os conhecimentos sobre manipulação de arrays em C expandindo para a manipulação de arrays multidimensionais ...
Education/ProgramacaoImperativa Web Preferences The following settings are web preferences of the Education/ProgramacaoImperativa web. These preferences overwrite ...
COMUNICADO Neste momento, está a ser preparado um documento que será subscrito por todos os docentes envolvidos e que faz uma análise ao que aconteceu ontem e que ...
COMUNICADO Caros colegas e alunos, depois dos acontecimentos ocorridos no dia de hoje e que foram as entregas e defesas da fase 1 do Projecto Integrado achei que devia ...
Ficha Nº4 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização e manipulação de vectores e matrizes em C. As strings são casos ...
Ficha Nº6: Busca e Ordenação de Arrays Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização dos algoritmos tradicionais de busca ...
Ficha Nº3 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a codificação de algoritmos um pouco mais complexos alguns deles envolvendo ...
Ficha Nº2 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a linguagem algorítmica que irá ser usada para especificar os algoritmos ...
Funcionamento das aulas Teórico Práticas e Práticas As aulas teórico práticas da diciplina Programação Imperativa são baseadas na realização de uma ficha teórico pr ...
This is a subscription service to be automatically notified by e mail when topics change in this Education/ProgramacaoImperativa web. This is a convenient service ...
TWiki's Education/ProgramacaoImperativa web /view/Education/ProgramacaoImperativa The Education/ProgramacaoImperativa web of TWiki. TWiki is a Web Based Collaboration ...
COMUNICADO Caros colegas e alunos, depois dos acontecimentos ocorridos no dia de hoje e que foram as entregas e defesas da fase 1 do Projecto Integrado achei que devia ...
COMUNICADO Neste momento, está a ser preparado um documento que será subscrito por todos os docentes envolvidos e que faz uma análise ao que aconteceu ontem e que ...
Funcionamento das aulas Teórico Práticas e Práticas As aulas teórico práticas da diciplina Programação Imperativa são baseadas na realização de uma ficha teórico pr ...
Ficha Nº2 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a linguagem algorítmica que irá ser usada para especificar os algoritmos ...
Ficha Nº3 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a codificação de algoritmos um pouco mais complexos alguns deles envolvendo ...
Ficha Nº4 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização e manipulação de vectores e matrizes em C. As strings são casos ...
Ficha Nº5 Objectivos: O objectivo principal desta ficha é consolidar os conhecimentos sobre manipulação de arrays em C expandindo para a manipulação de arrays multidimensionais ...
Ficha Nº6: Busca e Ordenação de Arrays Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização dos algoritmos tradicionais de busca ...
Ficha Nº6: Arrays e Estruturas Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização de algoritmos mais avançados de busca e ordena ...
Ficha Nº7: Estruturas de Dados Dinâmicas Listas Ligadas Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização de estruturas de dados ...
para Submissão de Fichas Práticas e de Trabalhos Práticos Ficha 1, Ambientação ao unix e utilização de algumas ferramentas: gcc, vi, make, latex. (em PDF, em ...
This is a subscription service to be automatically notified by e mail when topics change in this Education/ProgramacaoImperativa web. This is a convenient service ...
Education/ProgramacaoImperativa Web Preferences The following settings are web preferences of the Education/ProgramacaoImperativa web. These preferences overwrite ...
TWiki's Education/ProgramacaoImperativa web /view/Education/ProgramacaoImperativa The Education/ProgramacaoImperativa web of TWiki. TWiki is a Web Based Collaboration ...
This is a subscription service to be automatically notified by e-mail when topics change in this Education/ProgramacaoImperativa web. This is a convenient service, so you do not have to come back and check all the time if something has changed. To subscribe, please add a bullet with your WikiName in alphabetical order to this list:
Each TWiki web has an automatic e-mail notification service that sends you an e-mail with links to all of the topics modified since the last alert.
Users subscribe to email notifications using their WikiName or an alternative email address, and can specify the webs/topics they wish to track using one of these bullet list formats:
three spaces * [ webname . ] wikiName - SMTP mail address three spaces * [ webName . ] wikiName three spaces * SMTP mail address three spaces * SMTP mail address : topics three spaces * [ webname . ] wikiName : topics
In the above examples, topics is a space-separated list of topic names. The user may further customize the specific content they will receive using the following formats:
Specify topics without a Web. prefix
Topics must exist in this web.
Topics may be specified using * wildcards
Each topic may optionally be preceded by a '+' or '-' sign. The '+' sign means "subscribe to this topic" (the same as not putting anything). The '-' sign means "unsubscribe" or "don't send notifications regarding this topic". This allows users to elect to filter out certain topics (and their children, to an arbitrary depth). Topic filters ('-') take precedence over topic includes ('+').
Each topic may optionally be followed by an integer in parentheses, indicating the depth of the tree of children below that topic. Changes in all these children will be detected and reported along with changes to the topic itself. Note This uses the TWiki "Topic parent" feature.
Each topic may optionally be immediately followed by an exclamation mark ! or a question mark ? with no intervening spaces, indicating that the topic (and children if there is a tree depth specifier as well) should be mailed out as complete topics instead of change summaries. ! causes the topic to be mailed every time even if there have been no changes, ? will mail the topic only if there have been changes to it. This only makes sense for subscriptions.
For example:
Subscribe Daisy to all changes to topics in this web.
* daisy.cutter@flowers.com
Subscribe Daisy to all changes in all webs that start with Web.
* daisy.cutter@flowers.com: Web*
Subscribe Daisy to changes to topics starting with Petal, and their immediate children, WeedKillers and children to a depth of 3, and all topics that match start with Pretty and end with Flowers e.g. PrettyPinkFlowers
Subscribe Daisy to the full content of NewsLetter whenever it has changed
* daisy@flowers.com: TWiki.NewsLetter?
Subscribe buttercup to NewsLetter and its immediate children, even if it hasn't changed.
* buttercup@flowers.com: TWiki.NewsLetter! (1)
Subscribe GardenGroup (which includes Petunia) to all changed topics under AllnewsLetters to a depth of 3. Then unsubscribe Petunia from the ManureNewsLetter, which she would normally get as a member of GardenGroup? :
A user may be listed many times in the WebNotify topic. Where a user has several lines in WebNotify that all match the same topic, they will only be notified about changes that topic once (though they will still receive individual mails for news topics).
If a TWiki group is listed for notification, the group will be recursively expanded to the e-mail addresses of all members.
Tip: List names in alphabetical order to make it easier to find the names.
Note for System Administrators: Notification is supported by an add-on to the TWiki kernel called the MailerContrib. See the MailerContrib topic for details of how to set up this service.
Note: If you prefer a news feed, point your reader to WebRss (for RSS 1.0 feeds) or WebAtom? (for ATOM 1.0 feeds). Learn more at WebRssBase and WebAtomBase, respectively.
Related topics:WebChangesAlert, TWikiUsers, TWikiRegistration
The following settings are web preferences of the Education.ProgramacaoImperativa web. These preferences overwrite the site-level preferences in TWikiPreferences, and can be overwritten by user preferences (your personal topic, eg: TWikiGuest in the Main web).
Preferences:
Set WEBTITLE = Programação Imperativa
List of topics of the TWiki.Education/ProgramacaoImperativa web:
Web specific background color: (Pick a lighter one of the StandardColors)
If yes, set SITEMAPLIST to on, do not set NOSEARCHALL, and add the "what" and "use to..." description for the site map. Make sure to list only links that include the name of the web, e.g. Education/ProgramacaoImperativa.Topic links.
Set SITEMAPLIST = on
Set SITEMAPWHAT =
Set SITEMAPUSETO = ...collaborate on
Exclude web from a web="all" search: (Set to on for hidden webs)
Set NOSEARCHALL =
Prevent automatic linking of WikiWords and acronyms (if set to on); link WikiWords (if empty); can be overwritten by web preferences:
Set NOAUTOLINK =
Note: Use the [[...][...]] syntax to link topics in case you disabled WikiWord linking. The <noautolink> ... </noautolink> syntax can be used to prevents links within a block of text.
Default template for new topics and form(s) for this web:
WebTopicEditTemplate? : Default template for new topics in this web. (Site-level is used if topic does not exist)
A preference is defined as: 6 spaces * Set NAME = value Example:
Set WEBBGCOLOR = #FFFFC0
Preferences are used as TWikiVariables by enclosing the name in percent signs. Example:
When you write variable %WEBBGCOLOR% , it gets expanded to #00CCCC .
The sequential order of the preference settings is significant. Define preferences that use other preferences first, i.e. set WEBCOPYRIGHT before WIKIWEBMASTER since %WEBCOPYRIGHT% uses the %WIKIWEBMASTER% variable.
You can introduce new preferences variables and use them in your topics and templates. There is no need to change the TWiki engine (Perl scripts).
TWiki's Education/ProgramacaoImperativa web
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa
The Education/ProgramacaoImperativa web of TWiki. TWiki is a Web-Based Collaboration Platform for the Corporate World.en-usCopyright 2020 by contributing authorsTWiki Administrator [webmaster@di.uminho.pt]The contributing authors of TWikiTWikiDIUM.Education/ProgramacaoImperativa
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa
/twiki/pub/Main/LocalLogos/um_eengP.jpgWebHome
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/WebHome
Programação Imperativa 1ºano da LMCC2004/2005 Equipe Docente: Carlos Ramalho, Rangel Henriques, Personal.Nuno Rodrigues Novidades ... (last changed by JoseBacelarAlmeida)2007-02-12T19:53:38ZJoseBacelarAlmeidaNovasPI
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/NovasPI
$ 27 07 2005: Finais após a época de recurso $ 22 06 2005: As notas práticas são, a partir de agora, definitivas. (last changed by JoseCarlosRamalho)2005-07-27T10:48:06ZJoseCarlosRamalhoTrabalhosPratico
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/TrabalhosPratico
Projecto Integrado Arquitecturas de Computadores (AC2005) e Programa o Imperativa (PI2005) ... (last changed by JoseCarlosRamalho)2005-05-20T11:50:47ZJoseCarlosRamalhoFicha8
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Ficha8
Ficha Nº7: Estruturas de Dados Dinâmicas Listas Ligadas Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização de estruturas de dados ... (last changed by PedroRangelHenriques)2005-04-29T09:01:34ZPedroRangelHenriquesFicha7
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Ficha7
Ficha Nº6: Arrays e Estruturas Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização de algoritmos mais avançados de busca e ordena ... (last changed by PedroRangelHenriques)2005-04-29T09:01:06ZPedroRangelHenriquesFichasPraticas
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/FichasPraticas
para Submissão de Fichas Práticas e de Trabalhos Práticos Ficha 1, Ambientação ao unix e utilização de algumas ferramentas: gcc, vi, make, latex. (em PDF, em ... (last changed by PedroRangelHenriques)2005-04-29T09:00:11ZPedroRangelHenriquesFicha5
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Ficha5
Ficha Nº5 Objectivos: O objectivo principal desta ficha é consolidar os conhecimentos sobre manipulação de arrays em C expandindo para a manipulação de arrays multidimensionais ... (last changed by PedroRangelHenriques)2005-04-29T08:56:52ZPedroRangelHenriquesWebPreferences
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/WebPreferences
Education/ProgramacaoImperativa Web Preferences The following settings are web preferences of the Education/ProgramacaoImperativa web. These preferences overwrite ... (last changed by JoseCarlosRamalho)2005-04-20T08:37:47ZJoseCarlosRamalhoFase1Aval
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Fase1Aval
COMUNICADO Neste momento, está a ser preparado um documento que será subscrito por todos os docentes envolvidos e que faz uma análise ao que aconteceu ontem e que ... (last changed by JoseCarlosRamalho)2005-03-31T12:54:21ZJoseCarlosRamalhoComunicado_F1
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Comunicado_F1
COMUNICADO Caros colegas e alunos, depois dos acontecimentos ocorridos no dia de hoje e que foram as entregas e defesas da fase 1 do Projecto Integrado achei que devia ... (last changed by JoseCarlosRamalho)2005-03-30T20:20:06ZJoseCarlosRamalhoTPImagens
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/TPImagens
circle2.pbm: Círculo circle.pbm: Círculo Imagem JPG: pote de cerâmica: image007.pbm: O pote no formato PBM image007.ppm: O pote no formato ... (last changed by JoseCarlosRamalho)2005-03-29T20:44:17ZJoseCarlosRamalhoFicha8Res
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Ficha8Res
Makefile prog.exe : prog.o lista.o gcc o prog.exe prog.o lista.o prog.o : prog.c lista.h gcc c prog.c lista.o : lista.h lista.c gcc c lista.c lista ... (last changed by JoseCarlosRamalho)2005-03-20T21:23:06ZJoseCarlosRamalhoFicha4
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Ficha4
Ficha Nº4 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização e manipulação de vectores e matrizes em C. As strings são casos ... (last changed by JoseCarlosRamalho)2005-03-20T21:12:02ZJoseCarlosRamalhoFicha6
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Ficha6
Ficha Nº6: Busca e Ordenação de Arrays Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização dos algoritmos tradicionais de busca ... (last changed by JoseCarlosRamalho)2005-03-20T21:08:43ZJoseCarlosRamalhoFicha3
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Ficha3
Ficha Nº3 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a codificação de algoritmos um pouco mais complexos alguns deles envolvendo ... (last changed by JoseCarlosRamalho)2005-03-13T10:45:36ZJoseCarlosRamalhoFicha2
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Ficha2
Ficha Nº2 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a linguagem algorítmica que irá ser usada para especificar os algoritmos ... (last changed by JoseCarlosRamalho)2005-03-03T11:27:32ZJoseCarlosRamalho
++ COMUNICADO
Caros colegas e alunos, depois dos acontecimentos ocorridos no dia de hoje e que foram as entregas e defesas da fase 1 do Projecto Integrado achei que devia redigir este comunicado para, pelo menos, todos reflectirmos um pouco sobre o que aconteceu.
Antes de mais, queria aqui deixar expressos os meus parabéns a todos os alunos que, com mais ou menos dificuldades, realizaram um trabalho honesto e compareceram como acordado para fazerem a respectiva defesa.
Foi com grande consternação e tristeza que ao fazer o balanço no fim do dia, a equipe docente constatou que cerca de 50% dos trabalhos apresentados incluíam fraudes a vários níveis. Muitos de vocês foram afectados pos esta situação e no fim fiquei com a sensação de que não perceberam inteiramente o que tinham feito o que motivou esta minha reflexão.
Não percebem que:
copiar um trabalho é o mesmo que roubar, é como entrar num gabinete com a porta aberta e retirar de lá o que entenderem?
ao copiar um trabalho estão a desvalorizar o vosso trabalho?
ao copiar um trabalho estão a enganar-se a vocês próprios pois não aprendem?
ao copiar estão a enganar o docente que tem estado empenhado em ensinar-vos e em preparar-vos para o que será o resto da vossa vida?
um dia podem não ter nada nem ninguém por onde copiar? E aí? Como irão fazer se a vossa cabeça não está preparada para pensar per si?
se quiserem viver num país honesto onde as pessoas sejam verdadeiras isso pode começar por cada um de vocês? Que exemplos dão aos outros ao vosso lado ou que ainda caminham atrás de vós?
Pensem nestas questões que aqui deixo e que se estamos a actuar como actuámos é porque acreditamos que vocês podem ser muito melhores do que mostraram hoje.
Eu acredito. Vocês acreditam? Ainda temos um caminho a percorrer juntos...
José Carlos Ramalho
PS: Atendendo à dimensão do problema a equipe docente emitirá, amanhã às 12.00h, um comunicado onde ficará estabelecido em definitivo como será o procedimento relativamente às situações fraudulentas detectadas hoje (isto só será feito por serem alunos do 1º ano).
-- JoseCarlosRamalho - 30 Mar 2005
COMUNICADO
Neste momento, está a ser preparado um documento que será subscrito por todos os docentes envolvidos e que faz uma análise ao que aconteceu ontem e que justifica as medidas que serão tomadas e que se descrevem a seguir (as que estão relacionadas com PI).
Assim, foi estipulado o seguinte:
As fases do trabalho terão pesos diferentes sendo que a primeira vale 20%, a segunda 40% e a terceira também 40% da nota prática final.
Excepcionalmente, e porque estamos perante uma turma do 1º ano, os alunos apanhados em atitudes fraudulentas será contabilizado um 0 na primeira fase (na pauta aparecerá FRAUDE), podendo continuar a trabalhar para a disciplina entregando as fases seguintes.
++ Funcionamento das aulas Teórico-Práticas e Práticas
As aulas teórico-práticas da diciplina Programação Imperativa são baseadas na
realização de uma ficha teórico-prática por semana, previamente disponível aqui neste
site.
Na aula teórico-prática semanal, a ficha será abordada sob o ponto de vista
algorítmico. Espera-se que o aluno pense no problema e especifique uma possível
solução. Na aula prática, os alunos deverão desenvolver os seus algoritmos em C
e colocá-los a funcionar no computador. No fim, cada grupo deverá submeter ao
sistema de submissões electrónico a ficha com as suas resoluções.
++ Ambiente de Programação em C
Para a resolução dos programas apresentados nas fichas de Programação
Imperativa, aconselham-se todos os alunos a criar um ambiente de trabalho no
computador que permita editar, compilar e executar os programas C, bem como
preparar a documentação associada aos programas desenvolvidos.
+++ Comentários em C
Diga quais as formas permitidas para misturar comentários com
o texto dos programas, na linguagem C.
+++ Primeiro programa C - "Hello world!"
Desenvolva um programa C que escreve a string "O meu primeiro programa" no
écran do computador.
+++ Compilação separada em C
Verifique o que faz cada uma das seguintes opções do gcc:
gcc -E
gcc -S
gcc -c
gcc -o ou só gcc
+++ Soma de 2 números inteiros
Escreva um novo programa C, que soma dois números inteiros, previamente
declarados e inicializados respectivamente com 7 e 9, e escreve o resultado da
soma.
+++ Utilização do gcc
Escreva os comandos para realizar as acções seguintes:
Comandos para compilar os programas C (sem gerar o
++ LaTeX?
+++ Um pequeno relatório
Com a ajuda do professor, elabore em LaTeX? , um pequeno relatório do trabalho
realizado nesta ficha. Para tal edite o ficheiro TeX? desta ficha,
acrescentando as soluções que desenvolveu na aula. No fim, gere um documento em PDF.
-- JoseCarlosRamalho - 24 Feb 2005
O objectivo principal desta ficha é familiarizar o aluno com a linguagem algorítmica que irá ser usada para especificar os algoritmos e com as estruturas de controlo da linguagem C.
Para atingir esse fim, o aluno irá desenvolver pequenos algoritmos e tentar codificá-los em C.
Exercícios:
Exercício Nº1: O Maior de 2 Números
Desenvolva o algoritmo, e posteriormente codifique-o em C, de um programa que lê dois inteiros e escreve o maior deles.
Exercício Nº2: O Maior de N Números
Desenvolva o algoritmo, e posteriormente codifique-o em C, de um programa que lê N inteiros e escreve o maior deles.
Exercício Nº3: Números Pares
Desenvolva o algoritmo, e posteriormente codifique-o em C, de um programa que lê um determinado número inteiro N e escreve os números pares até N.
Exercício Nº4: Potências
Desenvolva o algoritmo, e posteriormente codifique-o em C, de um programa que lê 2 números inteiros, a e b, e escreve o resultado de elevar a à potência de b (utilize estruturas cíclicas para calcular o valor da potência).
Exercício Nº5: Factorial
Desenvolva o algoritmo, e posteriormente codifique-o em C, de um programa que lê um inteiro positivo e escreve o valor do seu factorial.
Exercício Nº6: Tabela de Conversão de Temperaturas
Considere a seguinte fórmula:Fahreneit = 32 + (1.8 * Celsius)
Desenvolva o algoritmo, e posteriormente codifique-o em C, de um programa que calcula uma tabela de conversão entre graus Celsius e graus Fahreneit com Fahreneit a variar entre 0 e 300 (considere intervalos de 5 graus).
-- JoseCarlosRamalho - 28 Feb 2005
O objectivo principal desta ficha é familiarizar o aluno com a codificação de algoritmos um pouco mais complexos alguns deles envolvendo manipulação de strings. Outro dos objectivos, é a integração com a disciplina de Arquitectura de Computadores, pelo que no fim da ficha aparece um conjunto de problemas sobre conversão de representações numéricas.
Para atingir esse fim, o aluno irá desenvolver pequenos algoritmos e tentar codificá-los em C.
Nota: os exercícios 2, 3, 4 e 9 são de resolução opcional. Na ficha a submeter ao sistema só são obrigatórios os restantes.
Desenvolva o algoritmo, e posteriormente codifique-o em C, de um programa que lê um inteiros e escreve no écran os seus divisores.
Exercício Nº2: Maior Divisor Comum
Desenvolva o algoritmo, e posteriormente codifique-o em C como uma função. A sua função deverá ter dois argumentos inteiros e produzir um resultado inteiro que é o maior divisor comum dos argumentos recebidos. Posteriormente codifique um programa principal (main()) que utiliza esta função para cálculo do maior divisor comum de dois números fornecidos pelo utilizador.
Ver Algorítmo de Euclides
Que pode ser resumido em:
Desenvolva o algoritmo, e posteriormente codifique-o em C como uma função. A sua função deverá ter dois argumentos inteiros e produzir um resultado inteiro que é o menor múltiplo comum dos argumentos recebidos. Posteriormente codifique um programa principal (main()) que utiliza esta função para cálculo do menor múltiplo comum de dois números fornecidos pelo utilizador.
Exercício Nº4: É Primo?
Desenvolva o algoritmo, e posteriormente codifique-o em C como uma função. A sua função deverá ter um argumento inteiros e produzir um resultado do tipo booleano (o docente irá desenvolver uma pequena biblioteca de booleanos: bool.h). O resultado será verdadeiro (TRUE) se o argumento passado fôr primo e falso (FALSE) caso contrário. Posteriormente codifique um programa principal (main()) que utiliza esta função para verificar quem é primo numa sequência de inteiros introduzidos pelo utilizador (terminada por 0).
Exercício Nº5: Tudo ao contrário!
Foste transferido para uma nova escola.
Nessa escola, a professora e matemática gostava muito de pôr os alunos a pensar e tentava que a mais simples tarefa fosse algo em que o raciocínio tivesse que intervir.
Uma das medidas que ela implementou foi a de utilizar os números inteiros invertidos. Por exemplo, o 12 seria 21 e o 1821 seria 1281.
Ora, os alunos locais já estão habituados a lidar com os inteiros daquela maneira e até fazem as operações de adição e subtracção com os inteiros naquela forma. No entanto, para ti, que acabaste de chegar à escola esta tarefa não é tão simples.
Assim, resolveste criar um programa em computador que fizesse três coisas:
dado um número calcula o seu inverso (o valor inteiro correcto)
dados dois números na forma invertida calcula a sua soma e devolve o resultado na mesma forma invertida
dados dois números na forma invertida calcula a sua subtracção e devolve o resultado na mesma forma invertida
Sugestão: especifica uma função para cada um dos pontos acima.
Exercício Nº6: Sequência de Fibonacci
Codifica um programa que gere os primeiros 20 números de Fibonacci. Os números de Fibonacci são definidos recursivamente da seguinte forma:
Depois de estudares o algoritmo das divisões sucessivas para a conversão de números decimais em números binários, desenvolvido na aula teórico-prática, codifica-o num programa em C.
Exercício Nº8: Conversão binário-decimal
Depois de teres resolvido o problema anterior, tenta resolver o problema inverso. Nota que os números binários são representados numa string com os carácteres 0 e 1.
Exercício Nº9: Conversão binário-hexadecimal
Pensa agora com converter um número binário em hexadecimal. Cria um programa em C para realizar esta tarefa.
-- JoseCarlosRamalho - 07 Mar 2005
O objectivo principal desta ficha é familiarizar o aluno com a utilização e manipulação de vectores e matrizes em C. As strings são casos particulares de arrays: uma string é um array em que os elementos são todos do tipo char. Assim, nesta ficha surgem também alguns exercícios envolvendo manipulação de strings.
Especifique um programa e codifique-o em C que lê 10 números inteiros positivos de um ficheiro externo (considere que cada linha do ficheiro contem apenas um número) e escreve:
a sua média e o valor máximo;
os numeros maiores que a média;
a quantidade de números menores que a média;
Depois de ter realizado as tarefas anteriores faça o programa produzir os resultados num ficheiro de nome relatorio.txt.
Exercício Nº2: Capicua
Especifique uma função que recebe uma string e verifica se a mesma é capicua (lida da esquerda para a direita, ou da direita para a esquerda, é a mesma palavra/frase).
Exemplos típicos: ala ou rapar.
Um caso curioso (e, claro, mais complexo) é a seguinte Capicua brasileira: Socorram-me subi no onibus em Marrocos.
Exercício Nº3: Conversão Romano-Árabe
Especifique uma função que recebe uma string contendo um número escrito em notação romana e que dá como resultado o respectivo valor inteiro (correspondente à notação arábica).
Exercício Nº4: Cifra por substituição arbitrária
Considere a cifra (palavra-chave) constituída pelas letras "SAPO" seguidas de um dígito n (entre 0 e 9). Para a cifragem (codificação) da mensagem efectuam-se os seguintes passos:
reduzem-se espaços seguidos a um único espaço e mantém-se os caracteres de pontuação;
os digitos rodam-se (circularmente) para a direita da quantidade n;
convertem-se todas as letras em maiúsculas ou minúsculas;
considera-se a seguinte tabela de codificação:
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
W
X
Y
Z
S
A
P
O
B
C
D
E
F
G
H
I
J
K
L
M
N
Q
R
T
U
V
W
X
Y
Z
A construção desta tabela limita-se a colocar a palavra chave no início e completar com as restantes letras do alfabeto, não colocando as letras que se repetem.
para a codificação, substitui-se cada um dos carácteres da primeira linha pelo carácter correspondente da segunda linha.
Construa um programa que dada uma cifra, codifique a mensagem, e um outro que, dada a mensagem cifrada e a cifra, descodifique a mensagem.
Exercício Nº5: Estatísticas de texto
Crie um programa que leia todos os caracteres de um texto (até encontrar um o fimde ficheiro, eof) e que no fim indique quantas vezes apareceu cada
uma das 26 letras do alfabeto (considere maiúsculas iguais às minúsculas).
-- JoseCarlosRamalho - 13 Mar 2005
O objectivo principal desta ficha é consolidar os conhecimentos sobre manipulação de arrays em C expandindo para a manipulação de arrays multidimensionais, noemadamente as matrizes.
Exercícios:
Exercício Nº1: Gestão de Armazens
Uma empresa tem 10 armazens e precisa de um programa que leia as vendas mensais dos 10 armazens, calcule a media de vendas e produza uma listagem dos armazens com vendas superiores à média calculada.
Exercício Nº2: Contem ou Contido
Desenvolva um algoritmo e posteriormente codifique-o em C que dadas dumas matrizes de dimensões arbitrárias verifica se a primeira contem a segunda (considere que os valores armazenados nas matrizes são do tipo inteiro).
Exercício Nº3: Média dos Alunos
Cada aluno de uma licenciatura em Ciências da Computação pode ter notas correspondentes a 10 disciplinas feitas durante o ano lectivo (caso não tenha sido avaliado positivamente a uma disciplina não terá essa nota).
Declare as estruturas de dados (o modelo) necessárias para suportar o sistema de informação: um aluno tem um número (inteiro sequencial a partir de 1), um nome (string) e uma lista de notas (reais). Pense na hipótese de encarar o número do aluno como um código alfanumérico (para permitir números em qualquer escala, ou mesmo o uso de letras) e identifique as alterações daí decorrentes.
Inicialize a estrutura de dados: na declaração e/ou numa função de inicialização que é chamada no início da função main().
Crie as funções normais de manipulação de uma pequena base de dados:
Inserir - de modo a manter a informação por ordem alfabética de nome. Numa 1ª versão, utilize o algoritmo por trocas directas e, numa 2ª versão, use a inserção ordenada;
Remover - utilize a pesquisa sequencial ordenada para encontrar o registo a remover;
Consultar - utilize a pesquisa dicotómica para encontrar o registo a consultar;
Listar - liste todos os alunos armazenados, por ordem alfabética.
Especifique uma função em C para calcular a média de cada aluno (faça uma função que dada a estrutura de dados principal e o identificador do aluno, produz como resultado a sua média); note que disciplinas não avaliadas não contam para a média (diferente de obter a classificação 0 numa disciplina).
Calcule a média geral da turma.
Calcule a média da turma em cada disciplina.
Calcule a percentagem de faltas (ausência de nota).
O objectivo principal desta ficha é familiarizar o aluno com a utilização dos algoritmos tradicionais de busca e ordenação de Arrays.
Exercícios:
Exercício Nº1: Inserção Ordenada
Voltando ao exercício da última ficha em que se geriam alunos e respectivas notas, implemente a operação correspondente à inserção de um novo aluno (faça a inserção ordenada desse aluno).
Este problema pode ser dividido em três fases:
Descobrir a posição onde o novo aluno deverá ser inserido;
Deslocar os elementos maiores uma posição para a frente;
Inserir o novo aluno na posição livre.
Exercício Nº2: Remoção
Especifique a operação de remoção de um aluno tendo o cuidado de deixar a estrutura ordenada e sem "buracos".
Exercício Nº3: Busca Dicotómica
Uma vez que a estrutura está ordenada a pesquisa pode ser optimizada. Implemente a pesquisa dicotómica sobre um array ordenado.
-- JoseCarlosRamalho - 20 Mar 2005
O objectivo principal desta ficha é familiarizar o aluno com a utilização de algoritmos mais avançados de busca e ordenação sobre Arrays. No fim, porpõem-se alguns exercícos envolvendo estruturas.
Exercícios:
Exercício Nº1: Estrutura Ligada
Voltando ao exercício da última ficha em que se geriam alunos e respectivas notas, considere a hipótese de utilizar uma ligação lógica entre os elementos como forma de os manter ordenados(como discutido na aula teórica de 01-04-2004) e implemente as seguintes funções:
Incialização do modelo de dados: lembre-se que também será necessário gerir as posições livres.
Listar: esta função produz uma listagem ordenada da informação de todos os alunos.
Consulta: esta função imprime no écran toda a informação referente a um determinado aluno.
Inserir: esta função insere o novo aluno na primeira posição livre e actualiza as ligações de forma a manter a informação logicamente ordenada.
Remover: esta função remove o aluno em causa e coloca a respectiva posição na lista de posições livres (garbage collector).
Este problema pode ser dividido em três fases:
Exercício Nº2: Estrutura ou Produto Cartesiano
Considere de novo o problema do exercício anterior e resolva as seguintes alíneas:
Defina um tipo de dados Aluno como sendo uma estrutura (struct) onde é guardada a informação do aluno.
Defina um tipo de dados Turma como sendo uma lista de Aluno.
Declare variáveis do tipo Aluno e do tipo Turma.
Adapte as funções desenvolvidas no exercício anterior para trabalhar com estes novos tipos de dados.
Ficha Nº7: Estruturas de Dados Dinâmicas - Listas Ligadas
Objectivos:
O objectivo principal desta ficha é familiarizar o aluno com a utilização de estruturas de dados dinâmicas.
Exercícios:
Exercício Nº1: Lista de Inteiros
Considere uma lista de inteiros (não se sabe o seu comprimento). Especifique então as seguintes funções e estruturas de dados:
Defina os tipos necessários para suportar uma lista ligada de inteiros.
Especifique uma função para inserir um valor na cabeça da lista.
Especifique uma função para listar os valores da lista, do início para o fim (faça também a função que lista os elementos na ordem inversa).
Especifique uma função para procurar um valor na lista (como resultado deverá devolver um apontador para o elemento ou NULL caso não o encontre).
Especifique uma função para contar os elementos da lista.
Especifique uma função para calcular o maior elemento na lista.
Especifique um programa, usando as funções definidas, que cria uma lista com os múltiplos de 3 entre 0 e 100 e os lista por ordem decrescente e crescente.
Exercício Nº2: À procura da saída ...
Suponha que existe um labirinto (pense numa representação adequada para o mesmo) que tem um ponto de entrada e um ponto de saída. Especifique um algoritmo que vai descobrir um caminho possível entre o ponto de entrada e o ponto de saída. Ajuda: modele numa lista ligada uma stack para ir guardando o caminho percorrido e as hipóteses alternativas.
Exercício Nº3: A Agenda de Contactos
Pretende-se que desenvolva uma aplicação para gerir uma agenda de contactos. Uma agenda é uma lista de entradas ou grupos de entradas. Uma entrada tem a seguinte constituição:
chave
chave única de identificação (não pode haver duas entradas com a mesma chave);
tipo
tipo da entrada: pessoa, empresa, ...
nome
nome da pessoa, empresa ou entidade;
email
contacto electrónco (é opcional)
telefone
número de telefone (obrigatório)
Um grupo pode ter entradas, referências a entradas já existentes na agenda (por chave) ou subgrupos (os grupos podem ter grupos aninhados infinitamente). O grupo tem, então, a seguinte constituição:
chave
chave única de identificação (não pode haver dois grupos com a mesma chave);
nome
nome do grupo; lista de itens: entradas e/ou grupos e/ou referências;
Por sua vez, a referência é apenas constituída pela chave da entrada ou grupo que referencia.
Desenvolva a aplicação nas seguintes etapas:
Defina as estruturas de dados necessárias para suportar o sistema de informação;
Espeifique as várias funções de inserção: inserir uma entrada na agenda, inserir um grupo na agenda, inserir uma entrada num grupo, ...
Especifique uma função para listar o conteúdo da agenda.
Especifique uma função para gravar o conteúdo da agenda num ficheiro.
Especifique uma função para carregar o conteúdo da agenda de um ficheiro.
#ifndef _LISTA
#define _LISTA
typedef struct sInteiro
{
int valor;
struct sInteiro * seg;
} Nodo, *Lista;
Lista inserir( int v, Lista l );
void listar( Lista l );
void listar_inv( Lista l );
Lista procurar( int v, Lista l );
int conta_elems( Lista l );
#endif
lista.c
#include "lista.h"
#include <stdio.h>
Lista inserir( int v, Lista l )
{
Lista novo;
novo = (Lista) malloc(sizeof(Nodo));
novo->valor = v;
novo->seg = l;
return novo;
}
void listar( Lista l )
{
if(l)
{
printf("%d ",l->valor);
listar(l->seg);
}
}
Lista inserir_ord( int v, Lista l)
{
Lista novo;
if((!l) || (l->valor > v))
{
novo = (Lista) malloc(sizeof(Nodo));
novo->valor = v;
novo->seg = l;
return novo;
}
else
{
l->seg = inserir_ord(v,l->seg);
return l;
}
}
prog.c
#include <stdio.h>
#include "lista.h"
int main()
{
Lista li=NULL;
int i=0;
while ((i+=3) < 100)
li = inserir(i,li);
listar(li);
return 0;
}
Este projecto tem como objectivos principais a formação genérica e específica de estudantes em fundamentos de computação em
áreas de informática afins e interligadas, a programação imperativa e a arquitectura de computadores.
Os objectivos de formação genérica incluem: (i) a pesquisa, análise e selecção de informação, (ii) o treino de trabalho de
grupo na resolução de problemas, (iii) o desenvolvimento da capacidade de análise e compreensão de textos em língua inglesa,
e (iv) o desenvolvimento da capacidade de comunicação escrita e oral.
Os objectivos de formação específica incluem: (i) a análise da especificação e do problema, (ii) o desenvolvimento de algoritmos
e consequente programação numa linguagem imperativa, (iii) a execução e realização de testes de conformidade, (iv) a análise
da execução desses programas numa dada arquitectura de computadores (IA-32), e (v) a aplicação de técnicas de optimização
de algoritmos/programas/códigos, com vista a melhorar o desempenho.
A avaliação dos resultados esperados de aprendizagem irão verificar se as/os estudantes conseguem demonstrar ter adquirido
o seguinte conjunto de competências genéricas e específicas:
competências genéricas
a capacidade de trabalho em grupo e respectiva comunicação efectiva e eficiente entre os elementos do grupo;
a capacidade de comunicação escrita e oral na apresentação e discussão dos processos usados e resultados obtidos;
a capacidade de utilização de utilitários genéricos de informática em ambiente Linux e de elaboração de documentos anotados
competências específicas de Programação Imperativa
a capacidade de desenvolver algoritmos para resolver problemas, de forma criativa, criteriosa e crítica, e inserida/o num
grupo de trabalho
o conhecimento e a capacidade de codificar algoritmos e estruturas de dados segundo os princípios da programação estruturada
a capacidade e aptidões práticas para gerar, executar e testar programas codificados em C, usando um conjunto adequado de
utilitários (GNU)
o conhecimento e as aptidões de desenvolver e aplicar testes de conformidade e de analisar situações de fronteira na execução
de programas
capacidade e aptidões na produção de documentação adequada à manutenção por terceiros dos programas desenvolvidos
competências específicas de Arquitectura de Computadores
a capacidade de pesquisar, seleccionar, analisar e interpretar a informação necessária para completar a especificação inicial
do projecto (em língua inglesa, e relacionada com formas de representação de informação) (Fase1);
o conhecimento e a capacidade de identificar e descrever formas de representação binária de informação gráfica (Fase1);
o conhecimento e a capacidade de identificar, compreender e caracterizar as técnicas de codificação de estruturas típicas
de controlo e dos métodos de acesso e manipulação de dados estruturados, no processo de compilação de uma linguagem imperativa
(gcc) (Fase2);
a aptidão para efectuar a análise de código em assembly e utilizar ferramentas de baixo nível de depuração (gdb) de programas (Fase2);
o conhecimento, a capacidade e a aptidão para a aplicação de técnicas de engenharia inversa a código binário (Fase2);
o conhecimento e a capacidade de identificar e descrever métricas que caracterizem o desempenho da execução dos programas
específicos deste trabalho (Fase 3);
aptidões na aplicação de técnicas de análise de desempenho baseadas no profiling de aplicações (Fase 3);
capacidades e aptidões para descrever, aplicar e avaliar técnicas de optimização de desempenho independentes e dependentes
da máquina (Fase 3);
O PNM é um formato de imagem muito simples, fácil de ler a partir de um ficheiro e também fácil de escrever para um ficheiro.
Actualmente uma imagem PNM pode pertencer a uma de três famílias, abaixo explicadas: PBM, PGM e PPM. Cada família tem duas
representações
uma textual e uma compactada.
Embora não seja um requisito da especificação PNM, existe a convenção de que a imagem deve ser armazenada de cima para baixo
e da esquerda para a direita. Cada pixel da imagem é armazenado num byte, valor 0 = preto, valor 255 = branco. Os componentes
de cor são armazenados na ordem habitual RGB ("red", "green" and "blue"), um valor para o nível de vermelho, um valor para
o nível de verde e um valor para o nível de azul.
Esta família corresponde a imagens contendo apenas duas cores, branco (1) e preto (0), normalmente designadas por bitmaps.
A sua forma textual pode ser descrita da seguinte maneira:
qualquer linha iniciada pelo carácter # é um comentário; os comentários só poem aparecer nas linhas do cabeçalho, ou seja,
antes dos valores dos pontos da imagem.
a primeira linha contem o identificador do tipo da imagem: P1
a segunda linha contem um par de valores que definem respectivamente o decimal correspondente ao número de colunas (largura
da imagem em pixeis), por exemplo: 9, e o decimal correspondente ao número de linhas (altura da imagem em pixeis), por exemplo:
as linhas restantes contêm uma lista de valores decimais, em que cada valor corresponde a um pixel da imagem e estão organizadas
de acordo com os valores definidos nas linhas anteriores. Com os exemplos dados nos itens anteriores teríamos 7 linhas cada
uma com 9 valores separados por espaço (cada valor corresponde a um byte, 0-255, que no caso das imagens do tipo P1 apenas
assume valores no intervalo [0,1])
Um exemplo de uma imagem neste formato poderia ser:
Se analisar um pouco a imagem que esta representa um banner com fundo preto e letras a branco. Neste caso, a imagem contem
a string "PI". Note também que, para este caso do banner, a primeira linha, a última linha, a primeira e última colunas são
pretas e que entre duas letras há duas colunas pretas de separação.
A sua forma compactada resulta da constatação de que um byte é uma sequência de 8 0's e 1's. Assim, um byte pode guardar 8
pixeis da imagem. A única alteração ao formato é o identificador que passa a: P4.
A seguir apresenta-se o exemplo anterior agora compactado:
Note que, apenas para efeitos de visualização, introduziram-se espaços entre os valores da forma compactada. Nas formas compactadas
PNM, não há espaços de separação entre os valores. A informação é guardada em ficheiro em bytes sequenciais.
Esta família corresponde a imagens definidas com vários níveis de cinzento.
A sua forma textual pode ser descrita da seguinte maneira:
qualquer linha iniciada pelo carácter # corresponde a um comentário e deverá ser ignorada.
a primeira linha contem o identificador do tipo da imagem: P2
a segunda linha contem um par de valores que definem respectivamente o decimal correspondente ao número de colunas (largura
da imagem em pixeis), por exemplo: 9, e o decimal correspondente ao número de linhas (altura da imagem em pixeis), por exemplo:
a terceira linha contem o maior valor decimal que é possível encontrar para a definição de um pixel: [0,65536] (2 elevado
a 16), vamos designá-lo por MAX. Normalmente, tenta-se que o intervalo seja [0,255] pois apenas nesta situação se pode falar
em compactação e no formato P5. Se MAX estiver no intervalo [0,255] é utilizado apenas um byte por cada pixel da imagem. Caso contrário, MAX esteja no intervalo [256,65535], são utilizados dois bytes por cada pixel da imagem; o byte mais significativo aparece primeiro.
as linhas restantes contêm uma lista de valores decimais, em que cada valor corresponde a um pixel da imagem e estão organizadas
de acordo com os valores definidos nas linhas anteriores. Com os exemplos dados nos itens anteriores teríamos 7 linhas cada
uma com 9 valores separados por espaço (cada valor corresponde a um pixel: 0-MAX).
cada linha não deverá ter mais de 70 valores.
o valor 0 corresponde à cor preta e o valor MAX corresponde à cor branca.
Um exemplo de uma imagem neste formato poderia ser:
Se analisar um pouco a imagem que esta representa um banner com fundo preto e letras a branco. Neste caso, a imagem contém a string "PI". Note também que, para este caso do banner, a primeira linha, a última linha, a primeira e última colunas são pretas e que entre duas letras há duas colunas pretas
de separação.
A sua forma compactada resulta da eliminação dos espaços nas linhas da imagem e apenas para o caso em que MAX está no intervalo
[0,255]. A única alteração ao formato é o identificador que passa a: P5.
Esta secção ficará em branco. Espera-se que os alunos "investiguem" e que a preencham um pouco à semelhança das outras.
Nas secções seguintes descrevem-se as diferentes fases do projecto e referem-se os requisitos que serão avaliados. Cada requisito
está devidamente identificado e poderá será avaliado apenas numa das disciplinas.
Nesta fase, pretende-se que as/os estudantes executem as seguintes tarefas:
pesquisar a Web para caracterizar sucintamente os formatos de imagem JPEG e GIF (avaliação exclusiva de AC), e para completar
o enunciado na descrição do formato PPM;
procurar na Web produtos que, em ambiente Linux (preferencial) convertam ficheiros de imagem/gráficos em formato JPEG ou GIF
para um dos formatos PNM (PBM, PGM ou PPM), e testar pelo menos um dos produtos que satisfaça os requisitos (avaliação exclusiva
de AC)";
desenvolver um conjunto de algoritmos elementares para transformar imagens PNM; mais concretamente, seguindo a descrição feita
na secção anterior pretende-se transformar imagens do tipo P2, P3, P5 e P6 em imagens do tipo P1 ou P4 (avaliação exclusiva
de PI);
codificar os algoritmos propostos, documentando-os adequadamente (avaliação exclusiva de PI);
preparar um conjunto de ficheiros de entrada para teste, que permita validar, além de outras, as de condições limite (avaliação
exclusiva de PI);
criar programas executáveis, usando o ambiente de desenvolvimento da GNU, e seleccionando o nível de optimização -O2 ;
integrar e testar o produto final (da Fase 1) usando comandos da shell para (i) leitura de um ficheiro JPEG ou GIF e sua conversão
para PNM, (ii) leitura de um ficheiro PNM (P2, P3, P5 ou P6) e sua conversão para noutro ficheiro PNM (P1 ou P4) e (iii) visualização
da imagem usando ImageMagick? (avaliação exclusiva de PI);
refinar o interface com o utilizador, construindo um menu de operações e permitindo mais que uma operação em cada sessão (avaliação
exclusiva de PI);
apresentar os resultados destas tarefas num relatório redigido em LaTeX? ; a sua estrutura deverá conter, para além do título
e lista de autores, um resumo (máx. 600 caracteres), uma introdução com caracterização do problema a resolver, uma breve exposição/relato
dos aspectos relevantes de cada uma das fases/tarefas, as conclusões, uma lista da bibliografia pertinente para a resolução
do trabalho, e, em anexo, uma listagem do código.
A título de curiosidade, apresentam-se algumas das operações que se poderão oferecer ao utilizador (se tiver tempo utilize
a sua imaginação para criar mais):
Nesta fase, pretende-se que as/os estudantes executem as seguintes tarefas:
Corrigir e/ou completar as tarefas solicitadas na 1ª fase e que não foram realizadas, ou foram-no de modo menos correcto ou
adequado; estas incluem: (i) a produção de textos sobre JPEG/GIF/PPM, (ii) a selecção/teste de conversores JPEG/GIF para PNM
(PBM, PGM ou PPM), (iii) o desenvolvimento dos algoritmos e respectiva codificação, teste e integração (com os comentários
pertinentes) na transformação de imagens do tipo P2, P3, P5 e P6 em imagens do tipo P1 ou P4 , e (iv) a produção de um texto
em LaTeX? para posterior integração no relatório da 2ª fase e respectiva compilação para PDF.
Desenvolver um conjunto adicional de algoritmos para: (i) efectuar sobre imagens PNM as operações de rodar, negativo, média-vizinhos
e binarização-adaptativa (opcional), em que a descrição destas operações se encontra a seguir; e (ii) procurar os objectos
contidos numa imagem colorindo-os com cores diferentes, à medida que os encontra (esta operação é apenas para imagens P1 e
o resultado deverá ser uma imagem P3), de acordo com as indicações dadas no fim. Do ponto de vista de interface com o utilizador,
esta novas operações solicitadas devem ser integradas com as conversões iniciais no menu de opções da Fase 1, permitindo mais
que uma operação em cada sessão (avaliação exclusiva de PI).
Codificar os algoritmos propostos, comentando-os e documentando-os adequadamente (avaliação exclusiva de PI).
Criar programas executáveis, usando o ambiente de desenvolvimento da GNU, e seleccionando o nível de optimização -O2.
Preparar um conjunto de ficheiros de entrada para teste dos algoritmos/código das funções solicitadas, que permita validar,
além de outras, as condições limite (avaliação exclusiva de PI).
Analisar o código assembly produzido pelo gcc no processo de compilação (apenas) do código C de uma das funções pedidas (média-vizinhos,
no formato P5), dedicando uma secção do relatório a esta análise, com a seguinte informação: (i) apresentação do código em
assembly, claramente identificando o corpo da função e as componentes de arranque e término da função, e incluindo comentários
no corpo da função semelhantes a código C; (ii) identificação dos registos e/ou células de memória onde foram alocadas as
variáveis locais da função; (iii) apresentação da estrutura e conteúdo da stack frame no início da execução do corpo da função;
algumas destas tarefas deverão também ser executadas durante a defesa do trabalho (avaliação exclusiva de AC).
Efectuar o reverse engineering de uma função que converte uma imagem P5 noutra P5, modificada: dado o executável obter uma
possível versão do código da função em C, estruturada de uma forma correcta e elegante (avaliação exclusiva de AC).
Integrar e testar o produto final (da Fase 2) usando comandos da shell para (i) leitura de um ficheiro JPEG ou GIF e sua conversão
para PNM, (ii) leitura de um ficheiro PNM e aplicação de uma das operações pedidas, gerando um outro ficheiro PNM e (iii)
visualização da imagem usando ImageMagick? (avaliação exclusiva de PI).
Apresentar os resultados destas tarefas num relatório redigido em LaTeX? (que terá de ser submetido já compilado para PDF,
num ficheiro cujo nome contém a indicação de "Fase2" seguido da identificação do grupo (por ex., "Fase2-3.15")); a estrutura
do relatório deverá ser idêntica à solicitada na Fase 1 ("conter, para além do título e lista de autores, um resumo (máx. 600 caracteres), uma introdução com caracterização do problema
a resolver, uma breve exposição/relato dos aspectos relevantes de cada uma das fases/tarefas, as conclusões, uma lista da
bibliografia pertinente para a resolução do trabalho, e, em anexo, uma listagem do código") e deverá incluir uma versão reformulada/corrigida/completa do relatório da Fase 1.
Preparar uma apresentação oral do trabalho de grupo feito até à data, (sem slides!) que não deverá ocupar mais de 5 min do
tempo de defesa do trabalho.
Detalhe das operações de manipulação de imagem acima referidos (para PI):
rodar()
a imagem é rodada 90 graus para a direita.
negativo()
o valor dos pixeis da imagem é invertido de acordo com a fórmula: MAX - valor_corrente
media-vizinhos(nvizinhos)
cada pixel da imagem vai tomar um novo valor que será igual à média dos valores dos seus nvizinhos vizinhos, de acordo com
a seguinte interpretação: nvizinhos=2 inclui os vizinhos da esquerda e direita; nvizinhos=4 inclui os vizinhos da esquerda,
direita, cima e baixo; e nvizinhos=8 inclui os vizinhos anteriores e ainda os quatro das diagonais.
bin-adapt()
esta operação será opcional e consiste em criar uma nova versão das conversões para P1; em vez de se considerar o valor médio
(Max/2) como o valor de threshold para a binarização, considere-se o valor médio da diferença entre o valor máximo e a média
dos pixeis da imagem ((Max-Média)/2).
Relativamente à procura de objectos em imagens a preto-e-branco e sua coloração, os objectos a procurar são pixeis contíguos
(horizontal, vertical ou diagonalmente) com o mesmo valor, e podem ser pontos, linhas ou áreas; por exemplo, se se considerar
uma imagem P1 com as letras "PI" em cima, o resultado seria uma P3 com o "P" a uma cor (azul, por exemplo) e o "I" a outra
cor (vermelho, por exemplo).
Relativamente à componente de Programação Imperativa e tendo em atenção o estado em que os trabalhos se encontram, após a
segunda avaliação, foi decidido que a terceira fase será opcional e só deverá ser realizada pelos grupos que cumpriram integralmente
os requisitos até ao momento e que querem obter uma classificação num dos últimos escalões (Muito Bom, Excelente).
Assim, e para grande maioria dos grupos, pede-se que implementem os requisitos das fases 1 e 2. Os restantes terão de desenvolver
a aplicação cujos requisitos se apresentam a seguir.
Desenvolve uma aplicação para a geração automática de pautas musicais coloridas. O programa deverá aceitar um ficheiro de
texto com a descrição textual de uma música e deverá gerar uma imagem P3 ou P6 com a respectiva pauta musical.
Os requisitos para a aplicação são os seguintes:
O desenho da pauta fica ao teu critério: espessura das linhas, dimensões das notas, ...
Uma pauta é constituída por cinco linhas horizontais espaçadas uniformemente. As notas colocam-se sobre as linhas ou nos espaços
entre elas.
Uma música é constituída por uma lista de compassos. Cada compasso deverá ser separado do seguinte por uma linha vertical
de espessura ligeiramente inferior à das linhas da pauta.
A cor das notas não é livre e deverá seguir o seguinte esquema:
Nota Musical
Descrição
Côr RGB em Hex
C
Dó
FF0000
C# ou Db
Dó sustenido ou Ré bemol
FF3300
D
Ré
FF6600
D# ou Eb
Ré sustenido ou Mi bemol
FFCC00
E
Mi
FFFF33
F
Fá
00FF00
F# ou Gb
Fá sustenido ou Sol bemol
00AA00
G
Sol
004400
G# ou Ab
Sol sustenido ou Lá bemol
0000FF
A
Lá
330033
A# ou Bb
Lá sustenido ou Si bemol
990066
B
Si
FF0066
CM
Dó maior
FF0000
O ficheiro de entrada, onde é descrita a música em forma textual, tem a seguinte estrutura:
Na primeira linha tem o título da música.
Cada linha das que se seguem à primeira contem um compasso da música.
Numa linha de compasso cada nota é separada da que se lhe segue por um espaço.
Além de notas podem aparecer pausas e sinais de repetição (o tratmento destes é opcional).
A título de exemplo, apresenta-se a seguir a descrição de uma música popular portuguesa bem conhecida:
O Chapéu de 3 bicos
G
CM G
G F E
F D
D E
F F G
A G
E
Pausa
G CM G G
F E F D
D E F
G A G C
Repete
O resultado esperado para o exemplo anterior pode ser visualizado em: O Chapéu de 3 bicos.
A seguir apresentam-se mais músicas para teste da aplicação final.
O lencinho
G A
G E
C G A
G E
C C C
D D C D
E E D E
F F E F
G G A
G E
C G A
G E
C C C
D D C D
E F G A
G F E D
C C
E F
G
Pausa E F
G
Pausa A Bb
CM
Pausa A Bb
CM
Pausa C C
C C Bb A
G G G A
G F E D
C C
Repete
Dança das Horas: nesta música existem acordes (notas que devem ser tocadas ao mesmo tempo); um acorde tem parentesis curvos
a limitar as suas notas; as notas de um acorde devem ser desenhadas alinhadas verticalmente, ou seja, o centro do círculo
de cada nota deve estar sobre a mesma linha vertical; o tratamento de acordes é um extra.
Dança das Horas
A
F G
C
C
G A
F
F A
G F
C
C C
G A
F
F Pausa
(F A)
(F A)
(F A)
Pausa C
F
O balão do João
O balão do João
G E E
F D D
C D E F
G G G
G E E
F D D
C E G G
(G C E)
Repete
D D D D
D E F
E E E E
E F G
G E E
F D D
C E G G
(G C E)
Repete
Lagarto Pintado
Lagarto Pintado
C
G CM G
E C
A A A
A G
G CM G
E C
F E D
C
Repete
Ficha Nº7: Estruturas de Dados Dinâmicas Listas Ligadas Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização de estruturas de dados ...
Ficha Nº6: Arrays e Estruturas Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização de algoritmos mais avançados de busca e ordena ...
para Submissão de Fichas Práticas e de Trabalhos Práticos Ficha 1, Ambientação ao unix e utilização de algumas ferramentas: gcc, vi, make, latex. (em PDF, em ...
Ficha Nº5 Objectivos: O objectivo principal desta ficha é consolidar os conhecimentos sobre manipulação de arrays em C expandindo para a manipulação de arrays multidimensionais ...
Education/ProgramacaoImperativa Web Preferences The following settings are web preferences of the Education/ProgramacaoImperativa web. These preferences overwrite ...
COMUNICADO Neste momento, está a ser preparado um documento que será subscrito por todos os docentes envolvidos e que faz uma análise ao que aconteceu ontem e que ...
COMUNICADO Caros colegas e alunos, depois dos acontecimentos ocorridos no dia de hoje e que foram as entregas e defesas da fase 1 do Projecto Integrado achei que devia ...
Ficha Nº4 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização e manipulação de vectores e matrizes em C. As strings são casos ...
Ficha Nº6: Busca e Ordenação de Arrays Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização dos algoritmos tradicionais de busca ...
Ficha Nº3 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a codificação de algoritmos um pouco mais complexos alguns deles envolvendo ...
Ficha Nº2 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a linguagem algorítmica que irá ser usada para especificar os algoritmos ...
Funcionamento das aulas Teórico Práticas e Práticas As aulas teórico práticas da diciplina Programação Imperativa são baseadas na realização de uma ficha teórico pr ...
This is a subscription service to be automatically notified by e mail when topics change in this Education/ProgramacaoImperativa web. This is a convenient service ...
TWiki's Education/ProgramacaoImperativa web /view/Education/ProgramacaoImperativa The Education/ProgramacaoImperativa web of TWiki. TWiki is a Web Based Collaboration ...
COMUNICADO Caros colegas e alunos, depois dos acontecimentos ocorridos no dia de hoje e que foram as entregas e defesas da fase 1 do Projecto Integrado achei que devia ...
COMUNICADO Neste momento, está a ser preparado um documento que será subscrito por todos os docentes envolvidos e que faz uma análise ao que aconteceu ontem e que ...
Funcionamento das aulas Teórico Práticas e Práticas As aulas teórico práticas da diciplina Programação Imperativa são baseadas na realização de uma ficha teórico pr ...
Ficha Nº2 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a linguagem algorítmica que irá ser usada para especificar os algoritmos ...
Ficha Nº3 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a codificação de algoritmos um pouco mais complexos alguns deles envolvendo ...
Ficha Nº4 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização e manipulação de vectores e matrizes em C. As strings são casos ...
Ficha Nº5 Objectivos: O objectivo principal desta ficha é consolidar os conhecimentos sobre manipulação de arrays em C expandindo para a manipulação de arrays multidimensionais ...
Ficha Nº6: Busca e Ordenação de Arrays Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização dos algoritmos tradicionais de busca ...
Ficha Nº6: Arrays e Estruturas Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização de algoritmos mais avançados de busca e ordena ...
Ficha Nº7: Estruturas de Dados Dinâmicas Listas Ligadas Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização de estruturas de dados ...
para Submissão de Fichas Práticas e de Trabalhos Práticos Ficha 1, Ambientação ao unix e utilização de algumas ferramentas: gcc, vi, make, latex. (em PDF, em ...
This is a subscription service to be automatically notified by e mail when topics change in this Education/ProgramacaoImperativa web. This is a convenient service ...
Education/ProgramacaoImperativa Web Preferences The following settings are web preferences of the Education/ProgramacaoImperativa web. These preferences overwrite ...
TWiki's Education/ProgramacaoImperativa web /view/Education/ProgramacaoImperativa The Education/ProgramacaoImperativa web of TWiki. TWiki is a Web Based Collaboration ...
This is a subscription service to be automatically notified by e-mail when topics change in this Education/ProgramacaoImperativa web. This is a convenient service, so you do not have to come back and check all the time if something has changed. To subscribe, please add a bullet with your WikiName in alphabetical order to this list:
Each TWiki web has an automatic e-mail notification service that sends you an e-mail with links to all of the topics modified since the last alert.
Users subscribe to email notifications using their WikiName or an alternative email address, and can specify the webs/topics they wish to track using one of these bullet list formats:
three spaces * [ webname . ] wikiName - SMTP mail address three spaces * [ webName . ] wikiName three spaces * SMTP mail address three spaces * SMTP mail address : topics three spaces * [ webname . ] wikiName : topics
In the above examples, topics is a space-separated list of topic names. The user may further customize the specific content they will receive using the following formats:
Specify topics without a Web. prefix
Topics must exist in this web.
Topics may be specified using * wildcards
Each topic may optionally be preceded by a '+' or '-' sign. The '+' sign means "subscribe to this topic" (the same as not putting anything). The '-' sign means "unsubscribe" or "don't send notifications regarding this topic". This allows users to elect to filter out certain topics (and their children, to an arbitrary depth). Topic filters ('-') take precedence over topic includes ('+').
Each topic may optionally be followed by an integer in parentheses, indicating the depth of the tree of children below that topic. Changes in all these children will be detected and reported along with changes to the topic itself. Note This uses the TWiki "Topic parent" feature.
Each topic may optionally be immediately followed by an exclamation mark ! or a question mark ? with no intervening spaces, indicating that the topic (and children if there is a tree depth specifier as well) should be mailed out as complete topics instead of change summaries. ! causes the topic to be mailed every time even if there have been no changes, ? will mail the topic only if there have been changes to it. This only makes sense for subscriptions.
For example:
Subscribe Daisy to all changes to topics in this web.
* daisy.cutter@flowers.com
Subscribe Daisy to all changes in all webs that start with Web.
* daisy.cutter@flowers.com: Web*
Subscribe Daisy to changes to topics starting with Petal, and their immediate children, WeedKillers and children to a depth of 3, and all topics that match start with Pretty and end with Flowers e.g. PrettyPinkFlowers
Subscribe Daisy to the full content of NewsLetter whenever it has changed
* daisy@flowers.com: TWiki.NewsLetter?
Subscribe buttercup to NewsLetter and its immediate children, even if it hasn't changed.
* buttercup@flowers.com: TWiki.NewsLetter! (1)
Subscribe GardenGroup (which includes Petunia) to all changed topics under AllnewsLetters to a depth of 3. Then unsubscribe Petunia from the ManureNewsLetter, which she would normally get as a member of GardenGroup? :
A user may be listed many times in the WebNotify topic. Where a user has several lines in WebNotify that all match the same topic, they will only be notified about changes that topic once (though they will still receive individual mails for news topics).
If a TWiki group is listed for notification, the group will be recursively expanded to the e-mail addresses of all members.
Tip: List names in alphabetical order to make it easier to find the names.
Note for System Administrators: Notification is supported by an add-on to the TWiki kernel called the MailerContrib. See the MailerContrib topic for details of how to set up this service.
Note: If you prefer a news feed, point your reader to WebRss (for RSS 1.0 feeds) or WebAtom? (for ATOM 1.0 feeds). Learn more at WebRssBase and WebAtomBase, respectively.
Related topics:WebChangesAlert, TWikiUsers, TWikiRegistration
The following settings are web preferences of the Education.ProgramacaoImperativa web. These preferences overwrite the site-level preferences in TWikiPreferences, and can be overwritten by user preferences (your personal topic, eg: TWikiGuest in the Main web).
Preferences:
Set WEBTITLE = Programação Imperativa
List of topics of the TWiki.Education/ProgramacaoImperativa web:
Web specific background color: (Pick a lighter one of the StandardColors)
If yes, set SITEMAPLIST to on, do not set NOSEARCHALL, and add the "what" and "use to..." description for the site map. Make sure to list only links that include the name of the web, e.g. Education/ProgramacaoImperativa.Topic links.
Set SITEMAPLIST = on
Set SITEMAPWHAT =
Set SITEMAPUSETO = ...collaborate on
Exclude web from a web="all" search: (Set to on for hidden webs)
Set NOSEARCHALL =
Prevent automatic linking of WikiWords and acronyms (if set to on); link WikiWords (if empty); can be overwritten by web preferences:
Set NOAUTOLINK =
Note: Use the [[...][...]] syntax to link topics in case you disabled WikiWord linking. The <noautolink> ... </noautolink> syntax can be used to prevents links within a block of text.
Default template for new topics and form(s) for this web:
WebTopicEditTemplate? : Default template for new topics in this web. (Site-level is used if topic does not exist)
A preference is defined as: 6 spaces * Set NAME = value Example:
Set WEBBGCOLOR = #FFFFC0
Preferences are used as TWikiVariables by enclosing the name in percent signs. Example:
When you write variable %WEBBGCOLOR% , it gets expanded to #00CCCC .
The sequential order of the preference settings is significant. Define preferences that use other preferences first, i.e. set WEBCOPYRIGHT before WIKIWEBMASTER since %WEBCOPYRIGHT% uses the %WIKIWEBMASTER% variable.
You can introduce new preferences variables and use them in your topics and templates. There is no need to change the TWiki engine (Perl scripts).
TWiki's Education/ProgramacaoImperativa web
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa
The Education/ProgramacaoImperativa web of TWiki. TWiki is a Web-Based Collaboration Platform for the Corporate World.en-usCopyright 2020 by contributing authorsTWiki Administrator [webmaster@di.uminho.pt]The contributing authors of TWikiTWikiDIUM.Education/ProgramacaoImperativa
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa
/twiki/pub/Main/LocalLogos/um_eengP.jpgWebHome
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/WebHome
Programação Imperativa 1ºano da LMCC2004/2005 Equipe Docente: Carlos Ramalho, Rangel Henriques, Personal.Nuno Rodrigues Novidades ... (last changed by JoseBacelarAlmeida)2007-02-12T19:53:38ZJoseBacelarAlmeidaNovasPI
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/NovasPI
$ 27 07 2005: Finais após a época de recurso $ 22 06 2005: As notas práticas são, a partir de agora, definitivas. (last changed by JoseCarlosRamalho)2005-07-27T10:48:06ZJoseCarlosRamalhoTrabalhosPratico
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/TrabalhosPratico
Projecto Integrado Arquitecturas de Computadores (AC2005) e Programa o Imperativa (PI2005) ... (last changed by JoseCarlosRamalho)2005-05-20T11:50:47ZJoseCarlosRamalhoFicha8
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Ficha8
Ficha Nº7: Estruturas de Dados Dinâmicas Listas Ligadas Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização de estruturas de dados ... (last changed by PedroRangelHenriques)2005-04-29T09:01:34ZPedroRangelHenriquesFicha7
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Ficha7
Ficha Nº6: Arrays e Estruturas Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização de algoritmos mais avançados de busca e ordena ... (last changed by PedroRangelHenriques)2005-04-29T09:01:06ZPedroRangelHenriquesFichasPraticas
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/FichasPraticas
para Submissão de Fichas Práticas e de Trabalhos Práticos Ficha 1, Ambientação ao unix e utilização de algumas ferramentas: gcc, vi, make, latex. (em PDF, em ... (last changed by PedroRangelHenriques)2005-04-29T09:00:11ZPedroRangelHenriquesFicha5
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Ficha5
Ficha Nº5 Objectivos: O objectivo principal desta ficha é consolidar os conhecimentos sobre manipulação de arrays em C expandindo para a manipulação de arrays multidimensionais ... (last changed by PedroRangelHenriques)2005-04-29T08:56:52ZPedroRangelHenriquesWebPreferences
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/WebPreferences
Education/ProgramacaoImperativa Web Preferences The following settings are web preferences of the Education/ProgramacaoImperativa web. These preferences overwrite ... (last changed by JoseCarlosRamalho)2005-04-20T08:37:47ZJoseCarlosRamalhoFase1Aval
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Fase1Aval
COMUNICADO Neste momento, está a ser preparado um documento que será subscrito por todos os docentes envolvidos e que faz uma análise ao que aconteceu ontem e que ... (last changed by JoseCarlosRamalho)2005-03-31T12:54:21ZJoseCarlosRamalhoComunicado_F1
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Comunicado_F1
COMUNICADO Caros colegas e alunos, depois dos acontecimentos ocorridos no dia de hoje e que foram as entregas e defesas da fase 1 do Projecto Integrado achei que devia ... (last changed by JoseCarlosRamalho)2005-03-30T20:20:06ZJoseCarlosRamalhoTPImagens
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/TPImagens
circle2.pbm: Círculo circle.pbm: Círculo Imagem JPG: pote de cerâmica: image007.pbm: O pote no formato PBM image007.ppm: O pote no formato ... (last changed by JoseCarlosRamalho)2005-03-29T20:44:17ZJoseCarlosRamalhoFicha8Res
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Ficha8Res
Makefile prog.exe : prog.o lista.o gcc o prog.exe prog.o lista.o prog.o : prog.c lista.h gcc c prog.c lista.o : lista.h lista.c gcc c lista.c lista ... (last changed by JoseCarlosRamalho)2005-03-20T21:23:06ZJoseCarlosRamalhoFicha4
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Ficha4
Ficha Nº4 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização e manipulação de vectores e matrizes em C. As strings são casos ... (last changed by JoseCarlosRamalho)2005-03-20T21:12:02ZJoseCarlosRamalhoFicha6
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Ficha6
Ficha Nº6: Busca e Ordenação de Arrays Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a utilização dos algoritmos tradicionais de busca ... (last changed by JoseCarlosRamalho)2005-03-20T21:08:43ZJoseCarlosRamalhoFicha3
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Ficha3
Ficha Nº3 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a codificação de algoritmos um pouco mais complexos alguns deles envolvendo ... (last changed by JoseCarlosRamalho)2005-03-13T10:45:36ZJoseCarlosRamalhoFicha2
http://wiki.di.uminho.pt/twiki/bin/view/Education/ProgramacaoImperativa/Ficha2
Ficha Nº2 Objectivos: O objectivo principal desta ficha é familiarizar o aluno com a linguagem algorítmica que irá ser usada para especificar os algoritmos ... (last changed by JoseCarlosRamalho)2005-03-03T11:27:32ZJoseCarlosRamalho