Ficha Programática da unidade curricular
Unidade
curricular:
|
LINGUAGENS DE PROGRAMAÇÃO I
|
||
|
|
|
|
|
Docente:
|
RUI SILVA MOREIRA
|
Grau académico:
|
DOUTOR
|
Categoria
Funcional:
|
PROFESSOR AUXILIAR
|
|
|
|
|
|
|
|
Ciclo
de Estudos:
|
1º CICLO
|
Curso:
|
ENGENHARIA INFORMÁTICA
|
Semestre curricular:
|
1º SEMESTRE
|
Ano lectivo:
|
2009-2010
|
N.º
total de ECTS:
|
7
|
|
|
N.º
ECTS de Contacto:
|
2,5
|
|
|
Tipologia
das aulas:
|
As aulas terão natureza Teórico-Prática (TP) e Prática Não-Laboratorial
(PNL)
|
||
|
Avaliação: |
1 -
Avaliação contínua
O
método de avaliação da disciplina baseia-se no modelo da avaliação contínua e
compreende duas componentes: uma componente Teórico-Prática e uma componente Prática Não-Laboratorial resultante de trabalhos realizados com
recurso ao computador e/ou em laboratório de informática.
Componente
Teórico-Prática
A
componente teórico-prática tem um peso de
50% na classificação final da disciplina. A avaliação da componente
teórico-prática realiza-se de forma contínua durante as aulas teórico-práticas,
e inclui os seguintes elementos de avaliação:
·
Dois testes de
avaliação individual:
incidem sobre os conhecimentos leccionados até ao momento em que são realizados. Cada teste possui um peso de 45% na classificação final da componente teórico-prática. Um teste
realiza-se a meio do semestre e o outro no fim do semestre (em data a combinar com os
alunos). Estas avaliações incluirão uma parte de índole mais prática (com a
duração de 40 minutos) na qual se pedirá aos alunos para desenvolverem
determinadas estruturas de dados e/ou algoritmos utilizando a linguagem C –
vale 70% da nota do teste. Esta
componente será complementada por uma parte de índole mais teórico-prática (com
a duração de 20 minutos) englobando um conjunto de perguntas de escolha
múltipla (havendo desconto de 25% por cada resposta errada) ou
verdadeiros/falso (aplicando-se um desconto de 50% por cada resposta errada) sobre
a sintaxe e semântica da linguagem C e de interpretação de programas em C – vale 30% da nota do teste.
·
Desempenho nas aulas
TP: esta
componente procurará avaliar a assiduidade (medida por folhas de presença), a
participação e o empenho nas aulas teórico-práticas (como demonstrado nas
aulas) e também a capacidade para a realização de pequenos trabalhos práticos,
atribuídos durante as aulas, para serem realizados em casa até à aula seguinte.
Estes trabalhos serão atribuídos durante todo o semestre e serão contabilizados
equitativamente. Este elemento possui um peso de 10% na classificação final da componente teórico-prática.
Exige-se
uma nota mínima de oito (8) valores
nesta componente para que se possa ponderar com a classificação da componente
prática não-laboratorial para efeitos de cálculo da classificação final na
disciplina.
A
falta aos momentos de avaliação será convertida numa nota 0 (zero) para efeitos
de cálculo da classificação. Caso o aluno não fique aprovado, será remetido
para exame de recurso ou especial (seja trabalhador-estudante ou finalista),
desde que o aluno tenha obtido a aprovação na componente prática da disciplina
e cumprido o regime de assistência às aulas. Nas aulas teórico-práticas a assiduidade obrigatória é de 50%, de
acordo com o regulamento pedagógico da UFP.
A
classificação obtida na componente teórico-prática será, pois, obtida através
da seguinte expressão:
Nota da componente Teórico-Prática = 45% Teste 1 + 45% Teste 2 + 10% Desempenho
nas Aulas TP
Componente
Prática Não-Laboratorial
A
componente prática não-laboratorial tem um peso de 50% na classificação final da disciplina. A avaliação da
componente prática não-laboratorial realiza-se igualmente de modo contínuo
durante as aulas práticas não-laboratoriais e também pela realização de um
projecto. O projecto será realizado em grupo (no máximo com 3 a 4 alunos) e
implicará a especificação e desenvolvimento de estruturas de dados e
algoritmos, sob a forma de uma ou mais aplicações em C, sobre um ou mais temas propostos
no início do semestre.
A avaliação da componente prática
não-laboratorial inclui os seguintes elementos de avaliação:
·
1º Relatório do Projecto: os alunos deverão
entregar um relatório até meio do semestre (em data a especificar), com as
estruturas de dados e funções que implementem em C uma parte (especificada pelo
docente) do projecto proposto. Este relatório possui um peso de 45% da nota da componente prática
não-laboratorial.
·
2º Relatório do Projecto: no final do semestre
(em data a especificar) os alunos deverão entregar um relatório final com todas
as estruturas de dados e as funções C que implementem a totalidade do projecto
proposto. Deverão fazer ainda, em sala de aula, uma apresentação e uma demonstração
de toda a aplicação. O relatório final deve descrever pormenorizadamente a
funcionalidade de toda a aplicação e de todas as funções e algoritmos
desenvolvidos. Esta componente possui um peso de 45% da nota da componente prática não-laboratorial;
·
Desempenho nas aulas
PNL:
esta componente procurará avaliar a assiduidade (medida por folhas de
presença), a participação e o empenho nas aulas práticas não-laboratoriais
(como demonstrado nas aulas) e também a capacidade para a realização de
pequenos trabalhos práticos, atribuídos durante as aulas, para serem realizados
em casa até à aula seguinte. Estes trabalhos serão atribuídos durante todo o
semestre e serão contabilizados equitativamente. Este elemento possui um peso
de 10% na classificação final da
componente teórico-prática.
A assiduidade às aulas práticas não-laboratoriais
deve ser no mínimo de 70%. Não há possibilidade de recurso ou época especial
para a componente prática não-laboratorial. Os alunos terão que marcar presença
em duas ou mais sessões de discussão/análise dos trabalhos propostos durante as
horas de atendimento para acompanhamento do projecto e/ou esclarecimento de
dúvidas. A classificação obtida na componente prática obtém-se através da
seguinte expressão:
Nota da componente
Prática Não-Laboratorial = 45% 1º Relatório Projecto + 45% 2º Relatório Projecto
+ 10% Desempenho nas Aulas PNL
Classificação
final
A classificação final da disciplina obtém-se
através da seguinte expressão:
Nota
final = 50% Nota da Componente Teórico-Prática + 50% Nota da Componente Prática
Não-Laboratorial
Ao aluno, só será contabilizada a
classificação obtida na componente teórico-prática da disciplina se o aluno
tiver obtido uma classificação igual ou
superior a dez (10) valores na componente
prática. Caso contrário lança-se a nota negativa (da componente prática) em
pauta. De igual modo, exige-se uma nota
mínima de oito (8) valores na componente
teórico-prática para que se possa ponderar com a classificação da
componente prática não-laboratorial. Caso contrário lança-se a nota negativa
(da componente teórica) em pauta.
2 -
Exame de Recurso/Época Especial:
O exame de recurso/época especial é uma prova
excepcional que ocorre apenas no final do ano lectivo, no período previsto no
cronograma, e que apenas abrange a componente teórico-prática da disciplina,
incidindo sobre a totalidade da matéria teórico-prática incluída no programa da
disciplina, com a duração máxima, incluindo tolerância, de 90 minutos. O aluno
só se poderá submeter a este exame se tiver sido aprovado na componente prática
desta disciplina e tenha cumprido as assiduidades mínimas estabelecidas no
regulamento pedagógico. É exigida uma nota mínima que seja, pelo menos, igual
ao valor inferior da classificação, que num exame, dá acesso à oral, nesta
componente teórica da avaliação para que se possa ponderar com a nota da
componente prática para efeitos do cálculo da nota final. Esta prova destina-se
aos alunos que não obtiveram aprovação na componente teórico-prática da
disciplina, ou alunos em regimes especiais. Não existe qualquer possibilidade
de recurso à componente prática da disciplina.
A classificação final do aluno será calculada
utilizando a equação indicada acima na secção classificação final. A
classificação obtida no exame de recurso ou especial corresponderá à
classificação da componente teórica.
Este procedimento também se aplica às Épocas
de Trabalhador-Estudante e Finalista.
No caso de alunos com o estatuto de trabalhador-estudante, com
impossibilidade de presença num número significativo de aulas teórico-práticas,
a avaliação do desempenho em sala de aula será substituída por uma prova oral
em que o aluno deverá resolver um conjunto de problemas teórico-práticos
relacionados com o programa da disciplina. Sempre que se julgar necessário, o
docente poderá solicitar o desenvolvimento de trabalhos complementares (sob o
modo de apresentação oral ou escrita) de modo a melhor aferir o nível de
conhecimentos e
de competências alcançado pelo aluno.
|
Objectivos da unidade curricular e competências a
atingir: |
A linguagem C surgiu
no inicio da década de 70 nos Bell Telephone Laboratories e foi utilizada como
linguagem de desenvolvimento do sistema Unix. É por isso considerada uma
linguagem de sistema, com um âmbito de aplicação alargado. Foi mais tarde
normalizada pelo American National Standards Institute (ANSI) e é considerada
actualmente uma linguagem genérica de ampla utilização.
Esta unidade
curricular tem como principal objectivo ensinar os alunos a programar através
de uma linguagem de programação imperativa/procedimental. Dadas as
características da linguagem C e a sua ampla divulgação e utilização,
privilegiamos esta linguagem no ensino e aplicação dos conceitos e métodos que
habilitem os alunos a estruturar e desenvolver software em C. Assim,
pretende-se que os alunos compreendam a sintaxe e a semântica da linguagem C e
se consigam expressar algoritmicamente nesta linguagem. Pretende-se ainda
fomentar e explorar as capacidades de abstracção e de raciocínio na elaboração
de programas em C, que são fundamentais em perfis de engenharia informática.
Numa primeira fase
pretende-se que os alunos sejam fluentes nos conceitos básicos da linguagem
(cf. tipos de dados, operadores e expressões, estruturas de controlo,
estruturação dos programas em funções, vectores, estruturas, apontadores e
gestão de memória, etc.) de modo a que possam analisar, compreender e
exprimir-se em programas em C. Posteriormente, pretende-se que os alunos
dominem a implementação de estruturas de dados lineares com recurso a
apontadores (cf. pilhas, listas ligadas, etc.) e ficheiros (cf. de texto e
binários) que são vulgarmente utilizadas na modelização e desenvolvimento de
soluções para problemas reais.
No final do semestre
os alunos deverão ser capazes de compreender fluentemente diferentes tipos de
programas em C e utilizar todas as potencialidades da linguagem C para definir
estruturas de dados e desenvolver os algoritmos necessários à resolução de
múltiplos problemas de programação.
|
Conteúdos por unidade
lectiva e sua forma de execução pedagógica: |
|
Conteúdos |
Horas Contacto |
Estudo Individual |
ECTS |
Bibliografia |
|
(T+TP+P+L+TC+OT) |
||||
|
1. Introdução à programação em C |
|
|
|
|
|
1.1. Ambiente de
programação |
6 |
8 |
0,5 |
[1],
[2], [3] |
|
1.1.1. Plataforma
de desenvolvimento (Open
Watcom/Dev C++) |
||||
|
1.1.2. Criação de projectos |
||||
|
1.1.3. Ciclo de
desenvolvimento |
||||
|
1.1.4. Execução
de programas |
||||
|
1.2. Conceitos
básicos em C |
||||
|
1.2.1. Estrutura
dos programas |
||||
|
1.2.2. Entrada e
saída de dados básica |
||||
|
1.3. Variáveis e
tipos de dados |
||||
|
1.3.1. Tipos de
dados primitivos |
||||
|
1.3.2. Declaração
e atribuição |
||||
|
1.3.3. Operadores
e expressões |
||||
|
1.4. Estruturas
de controle básicas |
||||
|
1.4.1. Execução
condicional (if-else; switch) |
||||
|
1.4.2. Ciclos
(for, while, do-while) |
||||
|
1.4.3. Controlo
da execução (break, continue) |
||||
|
2. Estruturação dos programas em funções |
|
|
|
|
|
2.1. Definição de
funções |
6 |
8 |
0,5 |
[1],
[2], [3] |
|
2.2. Passagem de
parâmetros por valor |
||||
|
2.2. Variáveis
locais |
||||
|
2.3. Valores de
retorno |
||||
|
2.4. Recursividade |
||||
|
3. Vectores e Strings |
|
|
|
|
|
3.1. Declaração e
inicialização de vectores |
8 |
18 |
1 |
[1],
[2], [3] |
|
3.2. Passagem de
vectores por parâmetro |
||||
|
3.3. Definição de
constantes e macros |
||||
|
3.4. Cadeias de
caracteres (Strings) |
||||
|
3.5. Funções de
manipulação de Strings |
||||
|
3.6. Vectores
multi-dimensionais |
||||
|
4. Apontadores |
|
|
|
|
|
4.1. Declaração e
inicialização apontadores |
8 |
18 |
1 |
[1],
[2], [3] |
|
4.2. Aritmética
de apontadores |
||||
|
4.3. Apontadores e
vectores (Arrays) |
||||
|
4.4. Passagem de
vectores para funções |
||||
|
4.5. Passagem de
parâmetros por referência |
||||
|
4.6. Apontadores
para apontadores |
||||
|
5. Estruturas de dados |
|
|
|
|
|
5.1. Declaração
de estruturas de dados (struct) |
10 |
16 |
1 |
[1],
[2], [3], [4], [5] |
|
5.2. Declaração e
inicialização de variáveis do tipo struct |
||||
|
5.3. Declaração
de tipos de estruturas (typedef) |
||||
|
5.4. Operadores
sobre estruturas |
||||
|
5.5. Passagem de
estruturas como parâmetros de funções |
||||
|
5.6.
Alocação/libertação dinâmica de memória |
||||
|
6. Apontadores e estruturas de dados
dinâmicas |
|
|
|
|
|
6.1. Estruturas com
apontadores |
12 |
26 |
1,5 |
[1],
[2], [3], [4], [5] |
|
6.2.
Implementação de pilhas (Stack) com listas ligadas |
||||
|
6.3.
Implementação de filas (Queue) com listas ligadas |
||||
|
6.4. Algoritmos
de ordenação e pesquisa |
||||
|
7. Ficheiros |
|
|
|
|
|
7.1. Entrada e
saída de dados (streams) |
8 |
18 |
1 |
[1],
[2], [3] |
|
7.2. Ficheiros
standard (stdin, stdout, stderr) |
||||
|
7.3. Modos de
abertura de ficheiros |
||||
|
7.4. Ficheiros de
texto |
||||
|
7.5. Ficheiros
binários |
||||
|
7.6. Ficheiros de
acesso aleatório |
||||
|
8. Conceitos avançados |
|
|
|
|
|
8.1. Instruções
ao pré-processador |
6 |
8 |
0,5 |
[1],
[2], [3] |
|
8.2. Variáveis de
registo (register) |
||||
|
8.3. Variáveis do
tipo enum |
||||
|
8.4. Variáveis do
tipo union |
||||
|
8.5. Apontadores
para funções |
||||
|
8.6. Funções e
variáveis static |
||||
|
8.7. Organização
de projectos em vários ficheiros |
||||
|
TOTAL |
64 |
120 |
7 184 |
|
Nota: Nº de ECTS = horas/26
Conteúdos - Horas Contacto - Estudo
Individual – ECTS - Bibliografia
1. Introdução à programação em C – 6 – 8 - 0,5
- [1], [2], [3]
2. Estruturação dos programas em funções – 6
– 8 - 0,5 - [1], [2], [3]
3. Vectores e Strings – 8 – 18 – 1 - [1],
[2], [3]
4. Apontadores – 8 – 18 – 1 - [1], [2], [3]
5. Estruturas de dados - 10 – 16 – 1 - [1],
[2], [3], [4], [5]
6. Apontadores e estruturas de dados
dinâmicas – 12 – 26 - 1,5 - [1], [2], [3], [4], [5]
7. Ficheiros
- 8 – 18 – 1 - [1], [2], [3]
8. Conceitos avançados – 6 – 8 - 0,5 - [1],
[2], [3]
|
Bibliografia: |
[1] L. Damas,
Linguagem C, 10ª Edição, FCA, 1999.
[2] M. Sá, Fundamentos de Programação usando C, FCA,
2004.
[3] B. Kernighan &
D. Ritchie, The C Programming Language, Prentice-Hall International, 1988.
[4] J. Tremblay &
P. Sorensen, Introduction to Data Structures with Applications, McGraw-Hill,
1984.
[5] J. Vasconcelos & J. Carvalho, Algoritmia e
Estruturas de Dados: Programação nas linguagens C e Java, Centro Atlântico,
2005.
[1] Open Watcom - http://www.openwatcom.org/index.php/Download
[2] Dev C++, http://www.bloodshed.net/dev/devcpp.html
Requisitos a serem cumpridos
para registo total dos ECTS:
A aprovação (nota final igual ou superior a dez valores) é
condição necessária, mas não suficiente, para creditar esta unidade curricular.
Para obter a creditação desta unidade curricular o aluno terá de garantir a
obtenção de todos os ECTS previstos para a unidade curricular. A atribuição dos
ECTS ao aluno não é dependente exclusivamente da assiduidade em sala de aula (obrigatoriamente assegurada a, pelo menos,
a 70% das aulas práticas laboratoriais e 50% das aulas teórico-práticas
leccionadas); ela é também decidida em função da assiduidade aos actos
pedagógicos programados pelo professor e da participação em seminários, eventos
culturais e científicos a definir pelo docente ou pela coordenação da área
científica de Informática.
Os ECTS
previstos para o trabalho e estudo pessoal do aluno só lhe serão integralmente
atribuídos em função do desempenho demonstrado, nomeadamente no que respeita à
aquisição dos conhecimentos e competências visados por esta unidade curricular:
conhecimento efectivo da bibliografia indicada e demonstração do conhecimento
da linguagem C e da capacidade para compreender e desenvolver programas em C. O grau de desenvolvimento de conhecimentos bem como de
aquisição de competências nas áreas temáticas compreendidas no programa da
disciplina será avaliado de modo contínuo ao longo do semestre, quer em termos
do domínio dos conceitos teóricos que sustentam a análise e compreensão de
programas em C, quer em termos do domínio das técnicas e métodos de desenvolvimento
de aplicações e projectos em C, quer ainda em termos de comunicação oral e
escrita dos temas e conceitos abordados.
Resumo: Introdução à programação em C: ambiente de programação, criação e
execução de projectos; estruturação dos programas; variáveis e tipos de dados
primitivos; operadores e expressões; controlo do fluxo de execução.
Estruturação dos programas em funções: passagem de parâmetros por valor, variáveis
locais e funções recursivas. Vectores e Strings: declaração e inicialização de
vectores; passagem de vectores por parâmetro; funções de manipulação de Strings
e vectores multi-dimensionais. Apontadores: declaração e inicialização de
apontadores; aritmética de apontadores; apontadores e vectores; passagem de
parâmetros por referência e apontadores para apontadores. Estruturas de dados:
declaração de tipos e estruturas de dados (struct); declaração e inicialização
de variáveis do tipo struct; operadores sobre estruturas; passagem de
estruturas como parâmetros de funções; alocação/libertação dinâmica de memória.
Apontadores e estruturas de dados dinâmicas: implementação de pilhas e filas
com listas ligadas; algoritmos de ordenação e pesquisa. Ficheiros: entrada e
saída de dados e streams de ficheiros standard (stdin, stdout, stderr); ficheiros
de texto e binários; Ficheiros sequenciais e de acesso aleatório. Conceitos
avançados: instruções ao pré-processador; variáveis de registo, enumeradas e de
união; apontadores para funções; funções e variáveis estáticas; organização de
projectos em vários ficheiros.
Abstract: Introduction to C programming: programming environment, creating and executing
projects, structuring programs; variables and primitive data types; operators
and expressions; flow control. Structuring programs into functions: passing
parameters by-value, local variables and recursive functions. Arrays and
Strings: declaring and initializing arrays; passing arrays as parameters; functions
for string manipulation and multi-dimensional arrays. Pointers: declaring and initializing
pointers; pointer arithmetic; pointers and arrays; passing parameters
by-reference and pointer to pointers. Data structures: declaring types and data
structures; declaring and initializing variables of type struct; operators on
structures; passing structures as functions parameters; dynamic memory
allocation/deallocation. Pointers and dynamic data structures: implementing stacks
and queues with linked lists; algorithms for sorting and searching. Files: I/O
data streams and standard file streams (stdin, stdout, stderr); text and binary
files; sequential and random access files. Advanced concepts: pre-processor
instructions; variables of type register, enum and union; pointers to
functions; static variables and functions; organizing projects in separate
files.