Duração: 1h30 1. (2.0 valores) Para cada um dos programas seguintes, indique o que é escrito no ecrã quando os programas são executados: 1.a) (1.0 valores) #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct _t{ char * sss; struct _r *nnn; } t_r; t_r * f1(t_r *n, char *str){ t_r *a; a = (t_r*)malloc(sizeof(t_r)); if(a == NULL) exit(1); a->sss = str; a->nnn = n; return a; } int main(){ char s1[] = "1234567"; t_r *k = NULL; k = f1(k, s1); k = f1(k, &s1[2]); k = f1(k, &s1[5]); f1(k, &s1[3]); while(k != NULL){ printf("%s\n", k->sss); k = k->nnn; } exit(0); } — 1/3 — 1.b) (1.0 valores) #include <stdio.h> #include <stdlib.h> #include <string.h> void x(char a[], char *b, int n){ char c; c = (a[2]+ *b)/2; a[0] = a[(a[0]-'0' + n)/2]; *b = c; } int main(){ char s1[]="0987654321"; int v2[]={1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; x(s1, &s1[4], v2[3]); printf("%s\n", s1); x(&s1[2], &s1[0], v2[5]); printf("%s\n", s1); x(&s1[7], &s1[4], v2[0]); printf("%s\n", s1); x(&s1[7], &s1[4], v2[4]); printf("%s\n", s1); exit(0); } 2. (1.5 valores) 2.a) (0.5 valores) Defina o cabeçalho (protótipo) de uma função que aceita como argumento uma matriz W de dimensões DIM1xDIM2 e calcula e devolve a matriz A dada por: A = W ×W T onde T designa a matriz transposta. 2.b) (1.0 valores) Implemente (escreva o código) a função anterior. Notas: os valores DIM1 e DIM2 foram anteriormente definidos usando a instrução #define — 2/3 — 3. (4.0 valores) Considere uma lista ligada que representa as sucessivas paragens do percurso de um autocarro. Admita que cada elemento da lista corresponde a uma paragem e é constituído pelo nome dessa paragem, o tempo médio do percurso entre essa paragem e a seguinte. O tempo é representado por um inteiro e expresso em minutos. A ultima paragem também aparece na lista mas o tempo aí armazenado é 0. 3.a) (0.5 valores) Defina um tipo de dados t_lista_par que permita suportar a lista descrita. 3.b) (1.0 valores) Desenvolva uma função (cria_percurso) que recebe os nomes da paragem inicial e final e o tempo de percurso entre estas e retorna uma lista com esses dois elementos. Exemplo: inicio = cria_percurso(“Amadora”, “Oeiras”, 40) devolve a seguinte lista: inicio ->Amadora(40m) -> Oeiras(0m) 3.c) (1.0 valores) Escreva uma função com protótipo (cabeçalho) seguinte: float tempoMedio(t_lista_par *base); que receba como argumentos o apontador para a primeira paragem e devolva o tempo médio necessário para a conclusão do percurso. 3.d) (1.5 valores) Escreva uma função com protótipo: int insereNovaPar(t_lista_par *base, char * nome_ant, float percent, char *nome_novo); que recebe um apontador para a base da lista e insere uma nova paragem (chamada nome_novo) a seguir a uma paragem já existente (nome_ant). O parâmetro percent é a percentagem do tempo originalmente gasto após a paragem onde se faz a inserção que passa a ser gasto após a nova paragem. Para a lista anterior, se realizarmos: insereNovaPar(inicio, “Amadora”, 0.75, “Queluz”) ficamos com a seguinte lista: inicio ->Amadora(10m) -> Queluz (30m) -> Oeiras(0m) Esta função não pode inserir paragens antes da primeira, nem após a última. Se a inserção for realizada, a função retorna 1. Se a paragem nome_ant não existir retorna 2 e se se tentar introduzir uma paragem após a última, retorna 3. 4. (2.5 valores) 4.a) (0.5 valores) Defina o tipo de dados t_hora, que permita armazenar as horas e minutos correspondentes a um instante de tempo. Os valores dos minutos e horas devem ser armazenados separadamente. 4.b) (1.0 valores) Implemente uma função (cria_tempo), que recebe um inteiro correspondente ao número de minutos e retorna uma estrutura, do tipo anterior, correspondente a esse valor (deve calcular as horas e minutos correspondentes). 4.c) (1.0 valores) Implemente uma função (muda_hora), que recebe uma hora, e um inteiro (negativo ou positivo) correspondente aos minutos e efectua o atraso ou adiantamento da hora recebida. A nova hora não pode ficar com 75 minutos, devendo os valores armazenados ser normalizados — 3/3 —