Você está na página 1de 11

#include <stdio.

h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h> //biblioteca onde estão as funções sleep() e usleep()

/**
* o projeto foi implementado utilizando duas listas duplamente encadeadas
*
* @ListaDePlaylists, onde o campo info é do tipo Playlist
* @ListaDeAulas, onde o campo info é do tipo Aula
*
* a struct Playlist possui um ponteiro do tipo ListaDeAulas
* logo cada playlist cadastrada possui uma lista de aulas associada
*/

typedef struct sAula {


int numeroDaAula;
float tempoDeDuracao;
}Aula;

typedef struct sListaDeAulas {


struct sListaDeAulas *ante;
Aula info;
struct sListaDeAulas *prox;
}ListaDeAulas;

typedef struct sPlaylist {


int numeroDaPlaylist;
char nomeDaPlaylist[50];
ListaDeAulas *ptrPlaylist; //ponteiro externo da lista de cada playlist
}Playlist;

typedef struct sListaDePlaylists {


struct sListaDePlaylists *ante;
Playlist info;
struct sListaDePlaylists *prox;
}ListaDePlaylists;

//inicializar a lista de playlists


void inicializarListaDePlaylists(ListaDePlaylists **playlists) {
(*playlists) = NULL;
}

//inicializar a lista de aulas


void inicializarListaDeAulas(ListaDeAulas **playlist) {
(*playlist) = NULL;
}

//lista de playlists vazia


int listaDePlaylistsVazia(ListaDePlaylists **playlists) {
return (*playlists) == NULL;
}

//lista de aulas vazia


int listaDeAulasVazia(ListaDeAulas **playlist) {
return (*playlist) == NULL;
}

//inserir uma playlist no final da lista


int inserirPlaylist(ListaDePlaylists **playlists, Playlist playlist) {
ListaDePlaylists *novaPlaylist;
ListaDePlaylists *percorreLista;

novaPlaylist = (ListaDePlaylists*) malloc(sizeof(ListaDePlaylists));


if(novaPlaylist == NULL)
return 0;

novaPlaylist->ante = NULL;
novaPlaylist->info = playlist;
novaPlaylist->prox = NULL;

if(listaDePlaylistsVazia(playlists)) {
(*playlists) = novaPlaylist;

return 1;
}

percorreLista = (*playlists);
while(percorreLista->prox != NULL) {
percorreLista = percorreLista->prox;
}

novaPlaylist->ante = percorreLista;
percorreLista->prox = novaPlaylist;

return 1;
}

//inserir uma playlist no inicio da lista


int inserirPlaylistNoInicio(ListaDePlaylists **playlists, Playlist playlist) {
ListaDePlaylists *novaPlaylist = (ListaDePlaylists*)
malloc(sizeof(ListaDePlaylists));

if(listaDePlaylistsVazia(playlists))
return inserirPlaylist(playlists, playlist);

novaPlaylist->ante = NULL;
novaPlaylist->info = playlist;
novaPlaylist->prox = (*playlists);
(*playlists)->ante = novaPlaylist;

(*playlists) = novaPlaylist;

return 1;
}

//inserir uma aula no final da lista


int inserirAula(ListaDeAulas **playlist, Aula aula) {
ListaDeAulas *novaPlaylist;
ListaDeAulas *percorreLista;

novaPlaylist = (ListaDeAulas*) malloc(sizeof(ListaDeAulas));


if(novaPlaylist == NULL)
return 0;

novaPlaylist->ante = NULL;
novaPlaylist->info = aula;
novaPlaylist->prox = NULL;
if(listaDeAulasVazia(playlist)) {
(*playlist) = novaPlaylist;

return 1;
}

percorreLista = (*playlist);
while(percorreLista->prox != NULL) {
percorreLista = percorreLista->prox;
}

novaPlaylist->ante = percorreLista;
percorreLista->prox = novaPlaylist;

return 1;
}

//remover a primeira playlist da lista


Playlist removerPlaylistNoInicio(ListaDePlaylists **playlists) {
ListaDePlaylists *removida;
Playlist playlistRemovida;

if(listaDePlaylistsVazia(playlists))
return playlistRemovida;

removida = (*playlists);
playlistRemovida = removida->info;

(*playlists) = (*playlists)->prox;

if((*playlists) != NULL)
(*playlists)->ante = NULL;

free(removida);

return playlistRemovida;
}

//remover a primeira aula da lista


Aula removerAulaNoInicio(ListaDeAulas **playlist) {
ListaDeAulas *removida;
Aula aulaRemovida;

if(listaDeAulasVazia(playlist))
return aulaRemovida;

removida = (*playlist);
aulaRemovida = removida->info;

(*playlist) = (*playlist)->prox;

if((*playlist) != NULL)
(*playlist)->ante = NULL;

free(removida);

return aulaRemovida;
}
//remover a última playlist da lista
Playlist removerPlaylistNoFim(ListaDePlaylists **playlists) {
ListaDePlaylists *removida;
Playlist playlistRemovida;

if(listaDePlaylistsVazia(playlists))
return playlistRemovida;

removida = (*playlists);
while(removida->prox != NULL) {
removida = removida->prox;
}

if(removida == (*playlists))
return removerPlaylistNoInicio(playlists);

removida->ante->prox = NULL;
playlistRemovida = removida->info;

free(removida);

return playlistRemovida;
}

//remover a ultima aula da lista


Aula removerAulaNoFim(ListaDeAulas **playlist) {
ListaDeAulas *removida;
Aula aulaRemovida;

if(listaDeAulasVazia(playlist))
return aulaRemovida;

removida = (*playlist);
while(removida->prox != NULL) {
removida = removida->prox;
}

if(removida == (*playlist))
return removerAulaNoInicio(playlist);

removida->ante->prox = NULL;
aulaRemovida = removida->info;

free(removida);

return aulaRemovida;
}

//pesquisar uma playlist na lista pelo seu número


ListaDePlaylists *pesquisarPlaylist(ListaDePlaylists **playlists, int
numeroDaPlaylist) {
ListaDePlaylists *percorreLista;

if(listaDePlaylistsVazia(playlists))
return NULL;

percorreLista = (*playlists);
while(percorreLista != NULL) {
if(percorreLista->info.numeroDaPlaylist == numeroDaPlaylist)
return percorreLista;

percorreLista = percorreLista->prox;
}

return NULL;
}

//remover uma playlist da lista pelo seu número


Playlist removerPlaylist(ListaDePlaylists **playlists, int numeroDaPlaylist) {
ListaDePlaylists *removida;
Playlist playlistRemovida;

if(listaDePlaylistsVazia(playlists))
return playlistRemovida;

removida = pesquisarPlaylist(playlists, numeroDaPlaylist);


if(removida == NULL)
return playlistRemovida;

playlistRemovida = removida->info;

//primeira
if(removida == (*playlists))
return removerPlaylistNoInicio(playlists);

//ultima
if(removida->prox == NULL)
return removerPlaylistNoFim(playlists);

removida->ante->prox = removida->prox;
removida->prox->ante = removida->ante;

free(removida);

return playlistRemovida;
}

//ouvir uma playlist


void ouvirPlaylist(ListaDeAulas **playlist) {
ListaDeAulas *aulas = (*playlist);

//system("clear");
system("cls");

printf("REPRODUZINDO PLAYLIST\n\n");

while(aulas != NULL) {
printf("Aula %d - %.2f\n", aulas->info.numeroDaAula, aulas-
>info.tempoDeDuracao);

sleep(5);
usleep(500000);

aulas = aulas->prox;
}

printf("\n");
printf("Voce terminou a playlist\n");

sleep(5);
usleep(500000);
}

/**
* mover uma playlist para primeira posição da lista
* a cada vez que uma playlist é reproduzida o método de ordenação é aplicado
* a playlist reproduzida é alocada para a primeira posição da lista
* quando todas as playlists são reproduzidas, uma após a outra, a ordenação não
acontece
*/
void moverUmaPlaylistParaFrente(ListaDePlaylists **playlists, int numeroDaPlaylist)
{
ListaDePlaylists *playlistParaMover;
Playlist playlistAuxiliar;

playlistParaMover = pesquisarPlaylist(playlists, numeroDaPlaylist);

if(playlistParaMover == (*playlists)) {
return;
}

if(playlistParaMover->prox == NULL) {
playlistAuxiliar = removerPlaylistNoFim(playlists);
inserirPlaylistNoInicio(playlists, playlistAuxiliar);

return;
}

playlistAuxiliar = removerPlaylist(playlists, playlistParaMover-


>info.numeroDaPlaylist);
inserirPlaylistNoInicio(playlists, playlistAuxiliar);
}

//exibir a lista de playlist e executar uma escolhida pelo seu número


void verPlaylists(ListaDePlaylists **playlists) {
int numeroDaPlaylistEscolhida;
ListaDePlaylists *playlistEscolhida;
ListaDePlaylists *percorreLista;

do {
//system("clear");
system("cls");

printf("PLAYLISTS CADASTRADAS\n\n");

percorreLista = (*playlists);
while(percorreLista != NULL) {
printf("%d. %s\n", percorreLista->info.numeroDaPlaylist, percorreLista-
>info.nomeDaPlaylist);
percorreLista = percorreLista->prox;
}

printf("0. Voltar\n\n");

printf("Ouvir Playlist: ");


scanf("%d", &numeroDaPlaylistEscolhida);
playlistEscolhida = pesquisarPlaylist(playlists, numeroDaPlaylistEscolhida);

if(numeroDaPlaylistEscolhida != 0){
ouvirPlaylist(&playlistEscolhida->info.ptrPlaylist);
moverUmaPlaylistParaFrente(playlists, playlistEscolhida-
>info.numeroDaPlaylist);
} else {
return;
}
}while(numeroDaPlaylistEscolhida != 0);
}

//excluir uma playlist


void excluirPlaylist(ListaDePlaylists **playlists) {
int numeroDaPlaylistEscolhida;
ListaDePlaylists *percorreLista;

do {
//system("clear");
system("cls");

printf("PLAYLISTS CADASTRADAS\n\n");

percorreLista = (*playlists);
while(percorreLista != NULL) {
printf("%d. %s\n", percorreLista->info.numeroDaPlaylist, percorreLista-
>info.nomeDaPlaylist);
percorreLista = percorreLista->prox;
}

printf("0. Voltar\n\n");

printf("Excluir Playlist: ");


scanf("%d", &numeroDaPlaylistEscolhida);

if(numeroDaPlaylistEscolhida != 0) {
removerPlaylist(playlists, numeroDaPlaylistEscolhida);
}
else
return;

}while(numeroDaPlaylistEscolhida != 0);
}

///pegar o n�mero da pr�xima playlist na lista


int numeroDaProximaPlaylist(ListaDePlaylists **playlists) {
ListaDePlaylists *percorreLista = (*playlists);

if(listaDePlaylistsVazia(playlists)){

return 1;
}
else {
while(percorreLista->prox != NULL) {
percorreLista = percorreLista->prox;
}
return percorreLista->info.numeroDaPlaylist +1;
} //return percorreLista->info.numeroDaPlaylist +1;
}

//cadastrar uma nova playlist na lista


void cadastrarPlaylist(ListaDePlaylists **playlists) {
int i;
int numeroDeAulas;
Aula novaAula;
Playlist novaPlaylist;
ListaDePlaylists *playlistCadastrada;

//system("clear");
system("cls");

printf("Nome da Playlist: ");


scanf("%s", novaPlaylist.nomeDaPlaylist);

novaPlaylist.numeroDaPlaylist = numeroDaProximaPlaylist(playlists);

inicializarListaDeAulas(&novaPlaylist.ptrPlaylist);

inserirPlaylist(playlists, novaPlaylist);

playlistCadastrada = pesquisarPlaylist(playlists, novaPlaylist.numeroDaPlaylist);

printf("\n");
printf("Playlist cadastrada! Agora cadastre as aulas da Playlist\n\n");
sleep(5);
usleep(500000);

printf("Playlist: %s\n\n", playlistCadastrada->info.nomeDaPlaylist);


printf("Quantas aulas a playlist possui? ");
scanf("%d", &numeroDeAulas);

printf("\n");
for(i = 1; i <= numeroDeAulas; i++) {
novaAula.numeroDaAula = i;

printf("Tempo de Duracao da Aula %d: ", i);


scanf("%f", &novaAula.tempoDeDuracao);

inserirAula(&playlistCadastrada->info.ptrPlaylist, novaAula);
}

printf("\n");
printf("Playlist cadastrada com sucesso!\n");

sleep(5);
usleep(500000);
}

//menu do professor
void menuAreaDoProfessor(ListaDePlaylists **playlists) {
int opcaoMenuAreaDoProfessor;

do {
//system("clear");
system("cls");

printf("AREA DO PROFESSOR\n\n");
printf("1. Ver Playlists\n");
printf("2. Excluir Playlist\n");
printf("3. Cadastrar Playlist\n");
printf("0. Voltar\n\n");

printf("Opcao: ");
scanf("%d", &opcaoMenuAreaDoProfessor);

switch(opcaoMenuAreaDoProfessor) {
case 1:
verPlaylists(playlists);
break;

case 2:
excluirPlaylist(playlists);
break;

case 3:
cadastrarPlaylist(playlists);
break;

default:
break;
}
}while(opcaoMenuAreaDoProfessor != 0);
}

//reproduzir todas as playlists, uma após a outra


void ouvirTodasAsPlaylists(ListaDePlaylists **playlists) {
ListaDePlaylists *percorreLista = (*playlists);

while(percorreLista->prox != NULL) {
ouvirPlaylist(&percorreLista->info.ptrPlaylist);

percorreLista = percorreLista->prox;
}
}

//menu do aluno
void menuAreaDoAluno(ListaDePlaylists **playlists) {
int opcaoMenuAreaDoAluno;

do {
//system("clear");
system("cls");

printf("AREA DO ALUNO\n\n");
printf("1. Ver Playlists\n");
printf("2. Reproduzir Todas as Playlists\n");
printf("0. Voltar\n\n");

printf("Opcao: ");
scanf("%d", &opcaoMenuAreaDoAluno);

switch(opcaoMenuAreaDoAluno) {
case 1:
verPlaylists(playlists);
break;
case 2:
ouvirTodasAsPlaylists(playlists);
break;

default:
break;
}
}while(opcaoMenuAreaDoAluno != 0);
}

//menu principal
void menuPrincipal(ListaDePlaylists **playlists) {
int opcaoMenuPrincipal;

do {
//system("clear");
system("cls");

printf("GERENCIADOR DE PLAYLISTS\n\n");
printf("1. Area do Aluno\n");
printf("2. Area do Professor\n");
printf("0. Sair\n\n");

printf("Opcao: ");
scanf("%d", &opcaoMenuPrincipal);

switch(opcaoMenuPrincipal) {
case 1:
menuAreaDoAluno(playlists);
break;

case 2:
menuAreaDoProfessor(playlists);
break;

default:
break;
}
}while(opcaoMenuPrincipal != 0);
}

int main() {
ListaDePlaylists *playlists;
ListaDePlaylists *playlistPesquisada;
Playlist novaPlaylist;
Playlist *playlist;
Aula aulaDaPlaylist;
int i, j;

/**
* o bloco de código abaixo cria registros para testes,
* para facilitar a compreensão do que foi implementado
*/

inicializarListaDePlaylists(&playlists);

strcpy(novaPlaylist.nomeDaPlaylist, "Minha Primeira Playlist");


novaPlaylist.numeroDaPlaylist = 1;
inicializarListaDeAulas(&novaPlaylist.ptrPlaylist);
inserirPlaylist(&playlists, novaPlaylist);

strcpy(novaPlaylist.nomeDaPlaylist, "Minha Segunda Playlist");


novaPlaylist.numeroDaPlaylist = 2;
inicializarListaDeAulas(&novaPlaylist.ptrPlaylist);
inserirPlaylist(&playlists, novaPlaylist);

strcpy(novaPlaylist.nomeDaPlaylist, "Minha Terceira Playlist");


novaPlaylist.numeroDaPlaylist = 3;
inicializarListaDeAulas(&novaPlaylist.ptrPlaylist);
inserirPlaylist(&playlists, novaPlaylist);

strcpy(novaPlaylist.nomeDaPlaylist, "Minha Quarta Playlist");


novaPlaylist.numeroDaPlaylist = 4;
inicializarListaDeAulas(&novaPlaylist.ptrPlaylist);
inserirPlaylist(&playlists, novaPlaylist);

for(j = 1; j <= 4; j++) {


playlistPesquisada = pesquisarPlaylist(&playlists, j);
for(i = 1; i <= 7; i++) {
aulaDaPlaylist.numeroDaAula = i;
aulaDaPlaylist.tempoDeDuracao = i + 1.53;

inserirAula(&playlistPesquisada->info.ptrPlaylist, aulaDaPlaylist);
}
}

//chama o menu principal


menuPrincipal(&playlists);

return 0;
}

Você também pode gostar