Equipe3-2015-1
Integrantes
DANIEL CABRAL CORREA
PABLO FIDELIS DIAS
PAULO HENRIQUE HORST BIANCHIN
Descrição da atividade principal
Um sistema de aquisição recebe, a cada final do dia, um arquivo de dados contendo informações sobre a temperatura (°C) e a umidade relativa do ar (%) de determinadas localidades do auto Amazonas. Implemente um sistema que importe esses arquivos e atualize os dados de temperatura e umidade de todas as localidades cadastradas. No entanto, é preciso ter um cadastro de localidades com seus respectivos códigos. A cada dia, ou seja, a cada arquivo lido, é preciso apresentar na tela a amplitude térmica da região, indicando temperaturas mínimas, médias e máximas . Portanto é preciso cadastrar novas localidades, remover localidades e imprimir a lista dessas localidades. O sistema deve conter um menu de opções para realizar as atividades, em loop contínuo e com opção para sair.
Descrição da atividade específica
- Fazer uso
- Comando swith
- Lista encadeada
- Ponteiros
- Alocação Dinâmica de Memória
- Funções para tratamento de arquivo
- Exemplo da estrutura (encadeada)
struct TLocalidade{ int codigo; char nome[40]; float temp_media; float temp_media; struct TLocalidade *prox; };
- Exemplo de arquivo (localidades.dat)
cat localidades.dat 100 XINGU 23.5 80 200 SOLIMOES 24.8 81 300 IAPOQUE 32.0 75 400 MADEIRA 33.9 98 500 BELLOMONTE 40.5 90
- Exemplo dos dados coletados (dados1.dat)
cat dados1.dat 100 29.0 89 200 25.3 88 300 35.1 90 400 35.3 100 500 32.0 100
- Exemplo dos dados coletados (dodos2.dat)
cat dodos2.dat 100 39.4 100 200 35.3 78 300 26.9 70 400 33.5 71 500 41.2 93
[...]
Atividades
Distribuição
DANIEL CABRAL CORREA - Responsável pela programação das funções, pelo ajuste de erros, e debate sobre desenvolvimento do projeto.
PABLO FIDELIS DIAS - Responsável pela estruturação do programa, pela programação das funções, pelo ajuste de erros e debate dobre desenvolvimento do projeto.
PAULO HENRIQUE HORST BIANCHIN - Responsável pela compilação e debate sobre desenvolvimento do projeto.
Desenvolvimento
Inicialmente
Observação:O trabalho foi desenvolvido através do skype, pela ferramenta de compartilhamento de tela.
A programação foi desenvolvida no programa notepad++.
Os testes foram realizados na pagina http://www.tutorialspoint.com/codingground.htm e confirmados no terminal do linux.
Conclusão
Ao final do programa realizamos ajustes finos no programa para que funcionasse corretamente e que não houvessem duplicatas.
Concluímos que com o projeto em que trabalhamos conseguimos utilizar todos os métodos aprendidos em aula, utilizamos algumas fontes de estudos extra-curriculares para desenvolvimento do projeto.
Código fonte
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//Máximo de bytes para uma String
#define BUFFER 64
//Espera 3 segundos
#define ESPERA sleep(3)
//Estrutura da lista que será criada
typedef struct lista {
char *cidade;
int codigo;
int temp;
int umidade;
struct lista *proximo;
} Dados;
//Funções para manusear os dados (irão retornar dados)
Dados *inicia_dados (char *cidade, int codigo, int temp, int umidade);
Dados *insere_dados (Dados *dados, char *cidade, int codigo, int temp, int umidade);
Dados *delbusca_dados(Dados *dados, char *chave);
Dados *deleta_dados (Dados *dados, int nTipo);
int checa_vazio (Dados *dados);
//Funções para mostrar dados
void exibe_dados (Dados *dados);
void exibe_tamanho (Dados *nova);
void busca_dados (Dados *dados, char *chave);
//Funções do Menu
void criavazia(void); //1
void inserefim(void); //2
void listavazia(void); //3
void exibe(void); //4
void delbusca(void); //5
void busca(void); //6
//Inicializando os dados da lista
Dados *principal = NULL;
//---------------------------------
// Opção '1'
//---------------------------------
//Criando uma lista vazia
void criavazia(void){
char *cidade;
int codigo=0, umidade=0;
int temp=0;
//Alocando dados para uma String
cidade = (char *)malloc(BUFFER);
//Lendo String cidade
printf("\n\nDigite o cidade: \n----> ");
scanf("%s", cidade);
printf("\n");
//Lendo int codigo
printf("\n\nDigite o codigo: \n----> ");
scanf("%d", &codigo);
printf("\n");
//Lendo int temp
printf("\n\nDigite a temperatura: \n----> ");
scanf("%d", &temp);
printf("\n");
//Lendo int umidade
printf("Digite a umidade: \n----> ");
scanf("%d", &umidade);
printf("\n");
//Lançando os dados lidos na lista Principal
free(principal);
principal = inicia_dados(cidade, codigo, temp, umidade);
}
//Iniciando os dados da lista vazia
Dados *inicia_dados(char *cidade, int codigo, int temp, int umidade) {
Dados *novo;
//Alocando memória para a posição atual da lista
novo = (Dados *)malloc(sizeof(Dados));
//Lançando os dados lidos
novo->cidade = (char *)malloc(strlen(cidade)+1);
strncpy(novo->cidade, cidade, strlen(cidade)+1);
novo->codigo = codigo;
novo->temp = temp;
novo->umidade = umidade;
//Apontando para a próxima posição da lista
novo->proximo = NULL;
return novo;
}
//---------------------------------
// Opção '2'
//---------------------------------
//Inserção de dados no final de uma lista
void inserefim(void) {
char *cidade;
int codigo=0, umidade=0;
int temp=0;
//Alocando dados para uma String
cidade = (char *)malloc(BUFFER);
//Lendo String cidade
printf("\n\nDigite o cidade: \n----> ");
scanf("%s", cidade);
printf("\n");
//Lendo int codigo
printf("\n\nDigite o codigo: \n----> ");
scanf("%d", &codigo);
printf("\n");
//Lendo int temp
printf("\n\nDigite a temperatura: \n----> ");
scanf("%d", &temp);
printf("\n");
//Lendo int umidade
printf("Digite a umidade: \n----> ");
scanf("%d", &umidade);
printf("\n");
//Criando listas auxiliares
Dados *final,*aux;
//Alocando dados para a posição final da lista
final = (Dados *)malloc(sizeof(Dados));
//Setando os valores cidade e Idade
final->cidade = (char *)malloc(strlen(cidade)+1);
strncpy(final->cidade, cidade, strlen(cidade)+1);
final->codigo = codigo;
final->temp = temp;
final->umidade = umidade;
//A pŕoxima posição será Nulo
final->proximo=NULL;
//A lista auxiliar será igual a Principal
aux=principal;
//Enquanto o próximo de auxiliar não for Nulo
while(aux->proximo!=NULL){
aux=aux->proximo;
}
//O último valor, será Nulo, e depois apontando para
//o Final
aux->proximo=NULL;
aux->proximo=final;
}
//Se não tiver nada, insere no inicio
//Inserindo no início da lista
void insereinicio(void){
char *cidade;
int codigo=0, umidade=0;
int temp=0;
//Alocando dados para uma String
cidade = (char *)malloc(BUFFER);
//Lendo String cidade
printf("\n\nDigite o cidade: \n----> ");
scanf("%s", cidade);
printf("\n");
//Lendo int codigo
printf("\n\nDigite o codigo: \n----> ");
scanf("%d", &codigo);
printf("\n");
//Lendo float temp
printf("\n\nDigite a temperatura: \n----> ");
scanf("%d", &temp);
printf("\n");
//Lendo int umidade
printf("Digite a umidade: \n----> ");
scanf("%d", &umidade);
printf("\n");
//Lançando dados no ínicio da lista
principal = insere_dados(principal, cidade, codigo, temp, umidade);
}
//Inserindo dados recebidos
Dados *insere_dados(Dados *dados, char *cidade, int codigo, int temp, int umidade) {
Dados *inicio;
//Alocando memória para a posição atual
inicio = (Dados *)malloc(sizeof(Dados));
//Lançando os dados lidos
inicio->cidade = (char *)malloc(strlen(cidade)+1);
strncpy(inicio->cidade, cidade, strlen(cidade)+1);
inicio->codigo = codigo;
inicio->temp = temp;
inicio->umidade = umidade;
//O próximo valor aponta para a lista já existente
inicio->proximo = dados;
return inicio;
}
//---------------------------------
// Opção '3'
//---------------------------------
//Função que testa se a lista está vazia
void listavazia(void){
if (principal == NULL)
printf("\n\nLista esta Vazia!\n\n ");
else
printf("\n\nLista nao esta Vazia!\n\n ");
getchar();
}
//---------------------------------
// Opção '4'
//---------------------------------
//Exibindo dados da lista
void exibe(void) {
//Se não estiver vazio, exibe os dados
if (!checa_vazio(principal))
exibe_dados(principal);
}
//Exibindo todos os dados do menu
void exibe_dados(Dados *dados) {
printf("Cadastro:\n\n");
printf("------------------------\n");
//Exibindo todos os valores da lista
for (; dados != NULL; dados = dados->proximo) {
printf("cidade: %s\n", dados->cidade);
printf("Codigo: %d\n", dados->codigo);
printf("Temperatura: %d\n", dados->temp);
printf("Umidade: %d\n", dados->umidade);
printf("------------------------\n");
}
getchar();
}
//---------------------------------
// Opção '5'
//---------------------------------
//Deletando valor buscado
void delbusca(void) {
char *chave;
//Se não estiver vazio
if (!checa_vazio(principal)) {
chave = (char *)malloc(BUFFER);
//Armazenando o valor digitado
printf("Digite o cidade para buscar: \n--> ");
scanf("%s", chave);
//Deletando a chave buscada
principal = delbusca_dados(principal, chave);
}
}
//Deletando os valores buscados
Dados *delbusca_dados(Dados *dados, char *chave) {
int achou=0,cont=0;
Dados *juntou, *aux, *nova=dados;
//Correndo a lista e verificando se encontrou a string buscada, se sim, aumenta o contador e seta a variável de busca
for (; nova != NULL; nova = nova->proximo) {
if (strcmp(chave, nova->cidade) == 0) {
achou=1;
cont++;
}
}
//Se encontrou a busca
if(achou==1){
int ind=0;
//Correndo a lista
for(ind=0;ind<cont;ind++){
//Se encontrou na primeira casa apaga a primeira casa
if(strcmp(chave,dados->cidade)==0){
aux=dados;
dados=dados->proximo;
free(aux);
}
//Senão, procura até encontrar
else{
aux=dados;
//Posiciona na frente do encontro para exclusão
while(strcmp(chave,aux->cidade)!=0){
aux=aux->proximo;
}
juntou=dados;
//Enquanto o auxiliar juntou for diferente do posicionado para exclusão
while(juntou->proximo!=aux){
juntou=juntou->proximo;
}
//Aponta para o próximo valor válido
juntou->proximo=aux->proximo;
free(aux);
}
}
printf("Excluido.\n");
}
else
printf("Nenhum resultado encontrado.\n");
getchar();
return dados;
}
//---------------------------------
// Opção '6'
//---------------------------------
//Função que busca os dados
void busca(void) {
char *chave;
//Senão estiver vazio a lista
if (!checa_vazio(principal)) {
chave = (char *)malloc(BUFFER);
//Lendo o cidade que será buscado
printf("Digite o cidade para buscar: \n--> ");
scanf("%s", chave);
//chamando a função que irá procurar o cidade
busca_dados(principal, chave);
}
}
//Percorre cada ponta da lista verificando busca
void busca_dados(Dados *dados, char *chave) {
int achou = 0;
printf("Cadastro:\n\n");
//Percorrendo todas as posições
for (; dados != NULL; dados = dados->proximo) {
//Se encontrou, mostra os dados
if (strcmp(chave, dados->cidade) == 0) {
printf("------------------------\n");
printf("Codigo: %d\n", dados->codigo);
printf("cidade: %s\n", dados->cidade);
printf("Temperatura: %d\n", dados->temp);
printf("Umidade: %d\n", dados->umidade);
printf("------------------------\n");
achou++;
}
}
//Mostrando o resultado da busca
if (achou == 0)
printf("Nenhum resultado encontrado.\n");
else
printf("Foram encontrado(s) %d registro(s).\n", achou);
getchar();
}
//---------------------------------
// Opção '7'
//---------------------------------
//Organiza a lista pela temperatura(função auxiliar)
void organizatemp(){
int tamanho = 62; //Pois amazonas só tem 62 municipios
int aux;
for(int i=tamanho+1; i <= 1; i++) {
for( int j=0; j < i ; j++) {
if(Dados.temp[j]>Dados.temp[j+1]) {
aux = Dados.temp[j];
Dados.temp[j] = Dados.temp[j+1];
Dados.temp[j+1] = aux;
}
}
}
printf("temperatura maxima:%f\n temperatura minima:%f\n",Dados.temp[0],Dados.temp[j-1]);
}
void media(){
float aux;
float soma=0;
float media=0;
int i;
organizatemp();
for (i=0;i>=0;i++){
aux=Dados.temp[i];
soma=soma+aux;
if(Dados.temp[i]==NULL){
break;
}
}
media=soma/(i-1);
printf("media das temperatura:%f\n",media);
}
//---------------------------------
// Opção '8'
//---------------------------------
//---------------------------------
// Função Auxiliar
//---------------------------------
//Função que testa se a lista esta vazia
int checa_vazio(Dados *dados) {
//Se a lista estiver vazia
if (dados == NULL) {
printf("Lista vazia!\n");
getchar();
return 1;
} else
return 0;
}
//---------------------------------
// Função Principal
//---------------------------------
int main(void) {
char escolha;
int chave=0;
//Laço que irá mostrar o menu esperando uma opção (char)
do {
//Limpando a tela, e mostrando o menu lembrando que primeiramente, os itens estão bloqueados até que seja criada uma lista vazia
system("clear");
printf("\n\t\tSistema de Monitoração de temperatura do Amazonas\n\n");
printf("Escolha uma opcao: \n");
printf("1 - Criar lista vazia\n");
if(chave==1){
printf("2 - Inserir no Fim de uma lista\n");
}
printf("3 - Lista Vazia...\n");
if(chave==1){
printf("4 - Exibir a Lista inteira\n");
printf("5 - Eliminar cidade\n");
printf("6 - Busca Dados\n");
}
printf("7 - Sair\n\n");
printf("Resposta: ");
scanf("%c", &escolha);
//Se a chave for diferente de zero, porém a escolha for diferente de 1, 4 e 9, a escolha será z (opção inválida)
if((chave==0)&&((escolha!='1')&&(escolha!='3')&&(escolha!='9')))
escolha='z';
switch(escolha) {
//Criando lista vazia
case '1':
chave=1;
criavazia();
break;
//Inserindo no final
case '2':
//Se a lista não estiver vazia
if(principal!=NULL){
inserefim();
}
//senão inclui no inicio
else{
insereinicio();
}
break;
//Checando se a lista está vazia
case '3':
listavazia();
break;
//Exibindo todos elementos
case '4':
exibe();
break;
//Deleta elemento buscado
case '5':
delbusca();
break;
//Buscando elementos
case '6':
busca();
break;
//Encontra o maior e menor e faz média das temperatura
case '7';
media();
break;
//Adiocana conteudo de arquivo no final da lista
case '8';
addconteudoarq();
break;
//Saindo e finalizando o programa
case '9':
printf("Obrigado por utilizar esse programa!\n");
printf("------>Terminal de Informação<------\n\n");
ESPERA;
exit(0);
break;
//Se foi algum valor inválido
default:
printf("Digite uma opcao valida (pressione -Enter- p/ continuar)!\n");
getchar();
break;
}
//Impedindo sujeira na gravação da escolha
getchar();
}
while (escolha > 0); //Loop Infinito
return 0;
}
<< | Equipe3-2015-1 |
---|