|
|
Linha 75: |
Linha 75: |
| ==Conclusão== | | ==Conclusão== |
| | | |
| + | =Código fonte= |
| + | <syntaxhighlight lang=c> |
| #include <stdio.h> | | #include <stdio.h> |
| #include <stdlib.h> | | #include <stdlib.h> |
| #include <string.h> | | #include <string.h> |
| | | |
− | //Máximo de bytes para uma String | + | /*Estrutura para o arquivo*/ |
− | #define BUFFER 64
| + | struct TLocalidade{ |
− |
| + | }; |
− | //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
| + | struct Tcadastro { |
− | void inserefim(void) {
| + | }; |
− | char *cidade;
| + | struct Tremover{ |
− | int codigo=0, umidade=0;
| + | }; |
− | int temp=0;
| + | struct Timprimir{ |
− | //Alocando dados para uma String
| + | }; |
− | cidade = (char *)malloc(BUFFER);
| + | struct Tlerarquivos{ |
− | //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
| + | void main(){ |
− | //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();
| |
− | }
| |
| | | |
− | //---------------------------------
| + | int opcao; |
− | // Opção '5'
| + | printf("Entre com uma opção\n 1-Cadastro\n 2-Remover cadastro\n 3-Imprimir\n 4-Ler Arquivos 5-Sair\n"); |
− | //---------------------------------
| + | scanf ("%d",&opcao); |
− |
| + | switch(opcao) { |
− | //Deletando valor buscado
| + | case 1: |
− | void delbusca(void) {
| + | Tcadastro; |
− | char *chave;
| + | break; |
− | //Se não estiver vazio
| + | case 2: |
− | if (!checa_vazio(principal)) {
| + | Tremover; |
− | chave = (char *)malloc(BUFFER);
| + | break; |
− | //Armazenando o valor digitado
| + | case 3: |
− | printf("Digite o cidade para buscar: \n--> ");
| + | Timprimir; |
− | scanf("%s", chave);
| + | break; |
− | //Deletando a chave buscada
| + | case 4: |
− | principal = delbusca_dados(principal, chave);
| + | Tlerarquivos; |
− | }
| + | break; |
− | }
| + | case 5: |
− |
| + | printf("Saindo"); |
− | //Deletando os valores buscados
| + | break; |
− | Dados *delbusca_dados(Dados *dados, char *chave) {
| + | default: |
− | int achou=0,cont=0;
| + | printf("opcao default\n"); |
− | Dados *juntou, *aux, *nova=dados;
| + | break; |
− |
| + | } |
− | //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;
| |
− | }
| |
| | | |
| | | |