Resolução de Exercícios de Laboratório (Aula 8) – Algoritmos e Estruturas de Dados

Sugestão de Resolução de Exercícios de Laboratório – Introdução ao Algoritmos e Estruturas de Dados (IAED), Instituto Superior Técnico

1. (Vectores) Escreva em linguagem C um programa que pede ao utilizador uma sequência de valores inteiros. O programa começa por pedir ao utilizador para definir o tamanho da sequência a introduzir. Supondo que n é o tamanho da sequência, o programa deverá ler do standard input n inteiros. No final, mostra todos os inteiros positivos que compõem a sequência.

#include <stdio.h>
#include <stdlib.h>

int main(){
int i, n;
int* ptrVec;
printf("Quantos digitos pretende introduzir? ");
scanf("%d", &n);
ptrVec = (int*) malloc(n*sizeof(int));

for(i=0; i<n; i++) scanf(" %d", ptrVec+i);

printf("Numeros introduzidos:n");
for(i=0; i<n; i++) printf("%dn", *(ptrVec+i));

return 0;
}

2. (Pontos 2D e Rectângulos) Considere que um ponto é definido pelas suas coordenadas e que um rectângulo é definido pelos pontos dos cantos superior esquerdo e inferior direito. Considere ainda as seguintes definições para pontos e rectângulos:

typedef struct {
int x;
int y;
} Ponto;

typedef struct {
Ponto se;
Ponto id;
} Rectangulo;

a) Implemente a função Ponto * lePontos(int n) que lê um conjunto de n pontos e retorna um vector contendo todos os pontos. Considere que n é um número pedido ao utilizador.

b) Implemente a função void escrevePontos(Ponto * pontos, int n) que mostra no standard output os pontos contidos num vector de tamanho n.

c) Implemente a função Rectangulo * defineRectangulo(Ponto * pontos, int n) que dado um vector de pontos de tamanho n devolve o rectângulo de menor área que contém todos os pontos do vector.

#include <stdio.h>
#include <stdlib.h>

#define N_PONTOS 10

typedef struct {
int x;
int y;
} Ponto;

typedef struct {
Ponto se;
Ponto id;
} Rectangulo;

Ponto* lePontos(int n){
int i;
Ponto* ptrPontos = (Ponto*) malloc(n*sizeof(Ponto));
for(i=0; i<n; i++){
printf("Ponto %dn", i+1);
printf("X: ");
scanf("%d", &ptrPontos[i].x);
printf("Y: ");
scanf("%d", &ptrPontos[i].y);
}
return ptrPontos;
}

void escrevePontos(Ponto* pontos, int n){
int i;
for(i=0; i<n; i++){
printf("(%d, %d) ", pontos[i].x, pontos[i].y);
}
printf("n");
}

Rectangulo * defineRectangulo(Ponto *pontos, int n){
Rectangulo *r = (Rectangulo*) malloc(sizeof(Rectangulo));
int i;
r->se = pontos[0];
r->id = pontos[0];
for(i = 0; i<n; i++) {
r->se.x = (r->se.x > pontos[i].x) ? r->se.x : pontos[i].x;
r->se.y = (r->se.y > pontos[i].y) ? r->se.y : pontos[i].y;
r->id.x = (r->id.x < pontos[i].x) ? r->id.x : pontos[i].x;
r->id.y = (r->id.y < pontos[i].y) ? r->id.y : pontos[i].y;
}

return r;
}

int main(){
Ponto *pontos1 = NULL;
Rectangulo *r1 = NULL;
pontos1 = lePontos(N_PONTOS);
escrevePontos(pontos1, N_PONTOS);
r1 = defineRectangulo(pontos1, N_PONTOS);
escrevePontos(&(r1->id), 1);
escrevePontos(&(r1->se), 1);
return 0;
}

3. (Vectores de Estruturas) Considere que se pretende ler do standard input a informação de um conjunto de inscrições de alunos a disciplinas e respectivas notas. A estrutura que guarda a informação de uma inscrição está definida do seguinte modo:

typedef struct {
int num_aluno;
char* cod_disc;
int nota;
} Inscricao;

a) Escreva em linguagem C a função Inscricao* lerInscricoes(int n) que lê um sequência de n inscrições do standard input e devolve um novo vector de inscrições de alunos em disciplinas. Assuma que o código de uma disciplina é uma sequência de letras e digitos com tamanho máximo de 10 caracteres.

b) Escreva em linguagem C a função int* distribuicaoNotas(Inscricao* ins, int n, char* disc) que dado um vector de inscrições de tamanho n devolve um novo vector de inteiros com a distribuição das notas de uma disciplina. Ou seja, na posição indice i do vector deverá conter o número de alunos que teve nota i à disciplina.

You may also like...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *