Equipe3-2015-1

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
A versão imprimível não é mais suportada e pode ter erros de renderização. Atualize os favoritos do seu navegador e use a função de impressão padrão do navegador.

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
  1. Comando swith
  2. Lista encadeada
  3. Ponteiros
  4. Alocação Dinâmica de Memória
  5. 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
Arquivo utilizado pela equipe (infcoletadas.dat)
cat infcoletadas.dat
XINGU            100      23.5       80
SOLIMOES         200      24.8       81
IAPOQUE          300      32.0       75
MADEIRA          400      33.9       98
BELLOMONTE       500      40.5       90

[...]

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

1.1 - Inicialmente foram feitas a estruturação do arquivo separando a função main do restante das funções para facilitar na detecção de erros

2.1 - Em seguida foram feitas algumas funções (essa sendo desenvolvidas a partir do conhecimento de cada aluno,exemplos passado pelo professor, conteúdo da wiki e pesquisas).

2.2 - Logo após essas funções foram implementadas ao arquivo principal.

2.3 - Compilação do Arquivo principal

3.1 - Ajuste de erros e a repetição dos passos 2.1, 2.2, 2.3

4.1 - Compilação final sem nenhum problema

Observação:O trabalho foi feito através do skype, pela ferramenta de compartilhamento de tela. A programação foi desenvolvida no programa notepad++. Os testes foram realizados nas paginas http://www.tutorialspoint.com/codingground.htm http://www.tutorialspoint.com/compile_c_online.php e confirmados no terminal do linux.

Conclusão

Nesse projeto encontramos grande dificuldades e constatamos que ao implementar o projeto nosso conhecimento foi melhorado.

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 mesmo.

Sugerimos que a cada aula seja proposto para que cada aluno faça um programa de tema livre, porém que use os comandos apresentados em aula com o monitoramento do professor.


Daniel = 9,

          - Empenho para acompanhar o raciocínio das funções e criação de algumas das mesmas
          - Apresentou dificuldades para entender e implementar algumas funções
          - Esforço apresentado para correção dos bugs.

Pablo = 10,

           - Domínio do conteúdo e raciocínio para criação de funções no projeto
           - Criador da estrutura do projeto
           - Esforço apresentado para correção de bugs.

Paulo;

Avaliação (professor)

Caros alunos!

Eu esperava mais do trabalho de vocês. O desempenho que vocês vinham tendo na disciplina não refletiu no trabalho. O programa não atendeu aos requisitos iniciais, porém, foram feitas novas implementações interessantes e o código fonte está comentado. Ainda faltou um cuidado maior com a wiki, achei que o código fonte está muito "inchado", com muitas variáveis, entre outros problemas identificados que conversamos na apresentação.

Por isso minha nota para a equipe toda é: 7.

(Com exceção do Paulo que faltou.)

Douglas A.

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(5)
 
//Estrutura da lista que será criada
typedef struct lista {
    char cidade[40];
    int codigo;
    float temp;
    int umidade;
    struct lista *proximo;
} Dados;
 
void abrirarquivo2();
 
//Arquivo utilizado
	FILE *p_arq;
 
//Funções para manusear os dados (irão retornar dados)
Dados *inicia_dados  (char *cidade, int codigo, float temp, int umidade);
Dados *insere_dados  (Dados *dados, char *cidade, int codigo, float 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  busca_dados    (Dados *dados, char *chave);
 
//Inicializando os dados da lista
Dados *principal = NULL;
 
 
//---------------------------------
//     Opção '1'
//---------------------------------
//Criando uma lista vazia
void criavazia(void){
	 Dados *p = malloc(sizeof(Dados));
    //Alocando dados para uma String
    //Lendo String cidade
    printf("\n\nDigite o cidade: \n----> ");
    scanf("%s", p->cidade);
    printf("\n");
    //Lendo int codigo
    printf("\n\nDigite o codigo: \n----> ");
    scanf("%d", &p->codigo);
    printf("\n");
    //Lendo int temp
    printf("\n\nDigite a temperatura: \n----> ");
    scanf("%f", &p->temp);
    printf("\n");
    //Lendo int umidade
    printf("Digite a umidade: \n----> ");
    scanf("%d", &p->umidade);
    printf("\n");
    //Lançando os dados lidos na lista Principal
		if(principal==NULL) {
			principal=p;
		}else {
         p->proximo=principal->proximo;
			principal->proximo=p;
	   }
}
 
//Iniciando os dados da lista vazia
Dados *inicia_dados(char cidade[40], int codigo, float 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
    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[40];
    int codigo=0, umidade=0;
    float temp=0;
    //Alocando dados para uma String
    //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("%f", &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
 
    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(Dados *dados){
    char *cidade;
    int codigo=0, umidade=0;
    float temp=0;
    char aux[40];
    int aux2;
    //Alocando dados para uma String
    cidade = (char *)malloc(BUFFER);
    //Lendo String cidade
    printf("\n\nDigite a cidade: \n----> ");
    scanf("%s", aux);
    printf("\n");
    //Lendo int codigo
    printf("\n\nDigite o codigo: \n----> ");
    scanf("%d", &aux2);
    printf("\n");
    //Lendo float temp
    printf("\n\nDigite a temperatura: \n----> ");
    scanf("%f", &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[40], int codigo, float temp, int umidade) {
    Dados *inicio;
    //Alocando memória para a posição atual
    inicio = (Dados *)malloc(sizeof(Dados));
    //Lançando os dados lidos
    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) {
	 int res;
    Dados *p;
    p=dados;
    printf("Cadastro:\n\n");
    printf("------------------------\n");
    //Exibindo todos os valores da lista
    for (p=principal; p!= NULL; p=p->proximo) {
        printf("cidade: %s\t", p->cidade);
        printf("Codigo: %d\t", p->codigo);
        printf("Temperatura: %.2f\t", p->temp);
        printf("Umidade: %d\n", p->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: %f\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'
//---------------------------------
 
void media(void){
    mediaa (principal);
    maxima (principal);
    minima (principal);
}
 
int maxima(Dados *dados){
    int max=-60000;
    for (; dados != NULL; dados = dados->proximo){
        if(max < dados->temp){
            max=dados->temp;
        }
    }
    printf("Temperatura maxima: %d\n", max);
}
 
int minima(Dados *dados){
    int min=60000;
    for (; dados != NULL; dados = dados->proximo){
        if(min > dados->temp){
            min=dados->temp;
        }
    }
    printf("Temperatura minima: %d\n", min);
}
 
 
int mediaa (Dados *dados){
    int aux;
    float soma=0;
    float media=0;
    int cont=0;
    for (; dados != NULL; dados = dados->proximo){
        aux = dados->temp;
        soma = soma+aux;
        cont ++;
        if(dados==NULL){
            break;
        }
    }
    media=soma/cont;
    printf("media das temperatura:%.2f\n",media);
}
 
//---------------------------------
//     Opção '8'
//---------------------------------
 
void abrirarquivo()
{
  FILE *p_arq;
  int i;
  int res;
  char buff[100];
   if ((p_arq=fopen("infcoletadas.dat", "r")) == NULL) {
     printf("Problemas na abertura do arquivo\n");
     return;
  }
   while(1) {
      if((res = fscanf(p_arq,"%s\n",buff))==EOF) {  					  	    
			   break;
      }
      printf("%s\n",buff);
  }
 fclose(p_arq);
}
 
 
void abrirarquivo2()
{
	int res; 
	if ((p_arq=fopen("infcoletadas.dat","r"))==NULL) {
		printf("Falha na abertura do arquivo.\n");
		return;
	} 
	while(1) { 
   	Dados *dados;
    	dados = (Dados *)malloc(sizeof(Dados));
    	if((res=fscanf(p_arq,"%s %d %f %d", dados->cidade, &dados->codigo, &dados->temp, &dados->umidade))==EOF) {
			break;
	   }
		if(principal==NULL) {
			principal=dados;
		}else {
         dados->proximo=principal->proximo;
			principal->proximo=dados;
 
		}	
	}
	fclose(p_arq);
}
 
 
//---------------------------------
//     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;
    abrirarquivo2();
    //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 - Adicionar cidade\n");
        printf("2 - Inserir no Fim de uma lista\n");
        printf("3 - Lista Vazia...\n");
		  printf("4 - Exibir a Lista inteira\n");
        printf("5 - Eliminar cidade\n");
        printf("6 - Busca Dados\n");
        printf("7 - Mostra media e temperaturas\n");
        printf("9 - 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)
        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(principal);
                }
                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();
            ESPERA;
            break;
            //Adiocana conteudo de arquivo no final da lista
            case '8':
            abrirarquivo();
            ESPERA;
            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