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:

Principal

[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.

 

Recursos informáticos de apoio - Ambientes de desenvolvimento

[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.