Programação de Computadores II - Prova 3 - 2024/1
A prova é individual e sem consulta. Responda as questões na folha de respostas.
Considere a Linguagem C para resolução das questões.
1. (3,0) Simule a execução do programa apresentado a seguir e explicite a saída a ser exibida (mostre
exatamente o que será exibido em tela na execução do programa, seguindo corretamente a
formatação adotada). Além disso, faça um trecho de código que libere todo o espaço de memória
alocado dinamicamente neste programa, a ser incluído logo após a linha 33.
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 void f(int x, int *n, int **m) {
5 int i, j;
6 for(i=0;i<x;i++)
7 for(j=0;j<x;j++) {
8 *(*(m+i)+j)=i+j;
9 *(n+i)+=*(*(m+i)+j); }
10 }
11
12 int main() {
13 int **m;
14 int *p, *q, *n, r=5;
15 m = (int **) malloc(r * sizeof(int *));
16 if(!m)
17 return -1;
18 for (int i=0; i<r; i++) {
19 *(m+i) = (int *) malloc (r * sizeof (int));
20 if (! (*(m+i)))
21 return -1; }
22 n = (int *)calloc(sizeof(int),r);
23 q = (int *)malloc(sizeof(int)*2);
24 *q=*n;
25 *(q+1)=5;
26 f(r,n,m);
27 p=n;
28 *p*=-1;
29 printf("%d, %d, %d",*p,*q,*(q+1));
30 for (int j=0;j<r;j++) {
31 printf("\n[%d]: %d ",j,*(n+j));
32 for (int k=0;k<r;k++)
33 printf("(%d) ",*(*(m+j)+k)); }
34 return 0;
35 }
2. (3,0) Considere a estrutura de dados a seguir, que implementa uma lista ligada, bem como as
funções: (i) inicializarLista que inicializa a lista ligada; e (ii) exibirLista que mostra em
tela os elementos da lista ligada. Escreva uma função, cuja assinatura seja int insere(Tlista*
l, char c), que implemente a inserção de um novo elemento (com conteúdo de c) na lista
ligada, mantendo a lista em ordem alfabética crescente. Sua função deve inserir o novo elemento na
posição correta (de forma a manter a lista ordenada), atualizando apenas o encadeamento dos
elementos já existentes para inclusão do novo elemento (sem mexer no conteúdo de elementos já
existentes na lista). Implemente uma pesquisa sequencial para encontrar a posição onde o novo
elemento deve ser inserido. Indique a complexidade de algoritmo da função implementada,
analisando o número de comparações e usando a notação Big O.
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 typedef struct aux {
5 char c;
6 struct aux* prox;
7 } Telem;
8
9 typedef struct {
10 Telem* inicio;
11 } Tlista;
12
13 void inicializarLista(Tlista* l) {
14 l->inicio=NULL; }
15
16 void exibirLista(Tlista* l) {
17 Telem* end = l->inicio;
18 while (end != NULL) {
19 printf("%c ", end->c);
20 end = end->prox; }
21 printf("\n"); }
3. (4,0) O programa a seguir é usado para ler e armazenar dados, que serão informados pelo usuário,
sobre as notas obtidas pelos alunos de uma determinada turma nas avaliações realizadas, de acordo
com a estrutura Taval. A estrutura é usada para armazenar os seguintes dados sobre cada um dos
alunos: (i) DRE do aluno (dre), (ii) nota do aluno na Prova 1 (p1) e (iii) o nota do aluno na Prova 2
(p2). Tais informações são gravadas, em um arquivo binário nomeado [Link], através da
função gravaArqBin. Neste arquivo, a primeira informação armazenada, é um inteiro N que
indica o número de registros armazenados no arquivo (ou seja, número de alunos da turma com
informações contidas no arquivo). As demais informações armazenadas são os dados sobre os N
alunos, usando a estrutura Taval. A seguir, o programa lê as informações, a partir do arquivo
binário gravado previamente, através da chamada da função leArqBin, e retorna um vetor de
estrutura Taval de N posições. Uma função de ordenação, nomeada sortAval, que implemente
um dos métodos de ordenação vistos ao longo da disciplina (escolha entre: bubble sort, insertion
sort, selection sort e merge sort), deve ordenar um vetor de estrutura Taval, em ordem crescente
de DRE (campo dre da estrutura). Ao inal, o programa, através da função gravaArqTxt, deve
gravar os DREs e as médias dos alunos (estarão em ordem crescente de DRE) em um arquivo texto
de saída nomeado [Link]. A média deve ser calculada como uma média aritmética das notas
das duas provas.
Implemente as funções leArqBin , sortAval e gravaArqTxt; nenhuma mudança deve ser
realizada no restante do programa para que ele funcione apropriadamente. Para facilitar a
compreensão, um Exemplo de E/S em Tela e o correspondente Exemplo de Arquivo de Saída
([Link]) gerado são apresentados a seguir. Siga a formatação mostrada no Exemplo de
Arquivo de Saída ([Link]) para gravar o arquivo texto de saída na função gravaArqTxt.
f
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 typedef struct {
5 int dre;
6 double p1;
7 double p2; } Taval;
8
9 void gravaArqBin(FILE *parq) {
10 Taval grava;
11 int N;
12 printf("Informe a quantidade de alunos: ");
13 scanf("%d",&N);
14 fwrite(&N,sizeof(int),1,parq);
15 for(int i=0;i<N;i++) {
16 printf("---%do. Aluno\n",i+1);
17 printf("DRE, nota P1, nota P2: ");
18 scanf("%d %lf %lf",&[Link], &grava.p1, &grava.p2);
19 fwrite(&grava,sizeof(Taval),1,parq); } }
20
21 int main() {
22 FILE *parq;
23 if((parq=fopen("[Link]","wb"))==NULL)
24 return -1;
25 gravaArqBin(parq);
26 fclose(parq);
27 if((parq=fopen("[Link]","rb"))==NULL)
28 return -1;
29 int N;
30 Taval *aluno=leArqBin(&N,parq);
31 fclose(parq);
32 sortAval(aluno,N);
33 if((parq=fopen("[Link]","w"))==NULL)
34 return -1;
35 gravaArqTxt(aluno,N,parq);
36 fclose(parq);
37 return 0; }
Exemplo de E/S em Tela Exemplo de Arquivo de Saída ([Link])
Informe a quantidade de alunos: 5 DRE 1 - media 9.500000
---1o. Aluno DRE 2 - media 10.000000
DRE, nota P1, nota P2: 1 10 9 DRE 3 - media 6.250000
---2o. Aluno DRE 4 - media 8.000000
DRE, nota P1, nota P2: 5 7 4 DRE 5 - media 5.500000
---3o. Aluno
DRE, nota P1, nota P2: 4 9 7
---4o. Aluno
DRE, nota P1, nota P2: 2 10 10
---5o. Aluno
DRE, nota P1, nota P2: 3 5 7.5