Archive for the ‘Exercícios’ Category

Já à muito tempo que não mexia no meu Arduino e restantes sensores, mas agora que a faculdade terminou e que estou práticamente de “férias” voltei a ter algum tempo livre e vontade para fazer mais algumas evoluções e experiências.

O objectivo desta experiência era fazer a leitura das temperaturas do LM335A e guarda-las num ficheiro txt de modo a posteriormente com uma simples aplicação escrita em C (escolhi esta linguagem por ser a linguagem com que tenho mais à vontade neste momento e por ser relativamente fácil de manipular ficheiros txt) que faria a leitura dos dados guardados no ficheiro txt e calcularia algumas das estatísticas sobre esses mesmo dados guardados.

No entanto nem tudo tem sido assim tão fácil, pois guardar os dados num ficheiro txt automaticamente e e fazer com que eles sejam actualizados após determinado tempo não se revelou ser tarefa fácil, pelo que ainda ando à procura de uma solução para isso.

De momento estou a usar a aplicação Termite 2.8, tal como usei aqui: Projecto Robótica – Temperature Sensor LM335A – Leitura e Gravação de Dados   mas esta pequena aplicação não grava os dados automaticamente ao fim de determinado tempo, o que faz com que eu não tenha sempre os dados actualizados disponíveis no ficheiro para que a aplicação possa tratar esses dados.

Apesar destas dificuldades efectuei uma gravação de alguns dados recolhidos manualmente afim de começar a elaborar a aplicação em C, e o resultado que alcancei até agora, ainda que muito rudimentar é o seguinte:

O código fonte da aplicação é o seguinte:

#include
#include 
 
#define N 100
 
FILE *entrada;
float temperatura[N];
int num_linhas = 0, i;
 
lerficheiro()
{
    system("CLS");
 
    entrada=fopen("log.txt","r");
 
    if(entrada==NULL)
    {
        printf("Erro na abertura do ficheiro de entrada\n");
        system("pause");
    }
    else
    {
        while(fscanf(entrada, "Temperatura =    %f\n", & temperatura[i]) != EOF)
        {
            printf("Temperatura =   %f \n", temperatura[i]);
            num_linhas = num_linhas + 1;
 
            i++;
        }
 
        printf("\n\n");
        printf("Numero de Linhas = %d\n", num_linhas);
    }
}
 
int main()
{
    float soma_temp, temp_media;
    int j;
 
    lerficheiro();
 
    for(j = 0; j < num_linhas; j++)
    {
 
        soma_temp = soma_temp + temperatura[j];
        temp_media = soma_temp / num_linhas;
    }
 
    printf("\n\n");
    printf("A Temperatura Media e = %f", temp_media);
}

O código da aplicação ainda está muito pobre e provavelmente muito ineficiente, mas no futuro irei implementar mais funcionalidades assim como um MENU, de modo a tornar a aplicação mais completa e robusta.

Se alguém conhecer uma forma de automatizar a gravação e a leitura dos dados do Arduino + LM335A para o ficheiro txt agradecia que me indicasse essa forma de modo a eu poder evoluir o meu projecto.

Share

Aqui fica um pequeno exercício que fiz onde englobo a aplicação de estruturas e ficheiros em C, não é nada de outro mundo e são conceitos simples de entender.

Aqui fica o código:

#include <stdio .h>
#include <stdlib .h>
 
#define N 100
 
struct data
{
    int dia;
    int mes;
    int ano;
};
 
struct localizacao
{
    float latitude;
    float longitude;
};
 
struct local
{
    char nome[100];
    struct data quando;
    struct localizacao onde;
};
 
void main()
{
    FILE *saida, *entrada;
    int quantos, i;
 
    saida = fopen("saida.txt", "w");
 
    struct local locais[20];
 
    printf("Quantos Locais? ");
    scanf("%d", &quantos);
 
    for(i = 0; i < quantos && i < 20; i++)
    {
        printf("Nome = ");
        fflush(stdin);
        gets(locais[i].nome);
        printf("Data(Dia/Mes/Ano) = ");
        scanf("%d/%d/%d", &locais[i].quando.dia, &locais[i].quando.mes, &locais[i].quando.ano);
 
        printf("Latitude = ");
        scanf("%f", &locais[i].onde.latitude);
 
        printf("Longitude = ");
        scanf("%f", &locais[i].onde.longitude);
    }
 
    if(saida == NULL)
    {
        perror("Erro na Abertura do Ficheiro!");
        system("PAUSE");
    }
    else
    {
        for(i = 0; i < quantos; i++)
        {
            fprintf(saida,"%d/%d/%d|%s|%f:%f\n", locais[i].quando.dia, locais[i].quando.mes, locais[i].quando.ano, locais[i].nome, locais[i].onde.latitude, locais[i].onde.longitude);
        }
 
        fclose(saida);
    }
 
    entrada =  fopen("saida.txt", "r");
 
    if(entrada == NULL)
    {
        perror("Erro na Abertura do Ficheiro!");
        system("PAUSE");
    }
    else
    {
        i = 0;
 
        while(!feof(entrada))
        {
            fscanf("%d/%d/%d|%s|%f:%f\n", &locais[i].quando.dia, &locais[i].quando.mes, &locais[i].quando.ano, &locais[i].nome, &locais[i].onde.latitude, &locais[i].onde.longitude);
            printf(entrada,"%d/%d/%d|%[^|]|%f:%f\n", locais[i].quando.dia, locais[i].quando.mes, locais[i].quando.ano, locais[i].nome, locais[i].onde.latitude, locais[i].onde.longitude);
 
            i++;
        }
 
        fclose(entrada);
    }
}

O código que apresento está funcional, mas certamente haverá métodos mais elegantes de chegar ao mesmo resultado.

Share

Este exercício foi proposto numas das aulas práticas de Metodologias de Programação I e agrega a manipulação de ficheiros e strings. O exercício é relativamente fácil, pois em C já existem pequenas funções que nos facilitam o trabalho, e são elas o toupper, tolower.

O exercício é o seguinte:

Ler o conteúdo de um ficheiro txt, converte-lo para maiúsculas e minúsculas separadamente e guardar o resultado num outro ficheiro txt.

Aqui fica o código que criei para resolver o exercício:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 500

main()
{
    FILE *entrada, *saida;
    entrada = fopen("entrada.txt","r");
    char string[MAX];
    int i = 0;

    if(entrada==NULL)
    {
        printf("erro na abertura do ficheiro de entrada\n");
        system("pause");
    }

    saida = fopen("saida.txt","w");

    if(saida==NULL)
    {
        printf("erro na abertura do ficheiro de saida\n");
        system("pause");
    }

    while(!feof(entrada))
    {
        fgets(string, MAX, entrada);
        printf(" %s", string);
    }

    printf("\n\n\n");

    for( i = 0; string[i]; i++)
    {
        string[i] = toupper(string[i] );
    }

    printf(" %s", string);
    fprintf(saida,"%s",string);

    fprintf(saida,"\n\n\n",string);
    printf("\n\n\n");

    for( i = 0; string[i]; i++)
    {
        string[i] = tolower(string[i]);
    }

    printf(" %s", string);
    fprintf(saida,"%s",string);

    fclose(entrada);
    fclose(saida);
}

Se tiverem algum reparo a fazer ou dica de como melhorar o código estou disponível para as ler, aceitar e implementar.

Share

Continuando com a evolução do meu projecto de execução do jogo do galo em C implementei uma nova funcionalidade que não é mais que as estatísticas do jogo. Neste momento as estatísticas apenas ficam guardadas em memória pelo que o só são válidas enquanto o programa não for terminado, mas futramente irei guardar essa informação num ficheiro que posteriormente será lido e actualizado.

O código que criei até agora é o seguinte:

/**************************************************************
Nome: Nuno Santos
Data: 06-04-2012
Projecto: Jogo do Galo_1.07
**************************************************************/

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

#define DIM 3

int matriz[DIM][DIM];
int contapc = 0, contahumano = 0;

void iniciar_matriz();
void coordenadas();
void coordenadas_pc();
int verifica_vencedor();
void apresenta_matriz();
void apresenta_estatisticas(int contahumano, int contapc);

int main()
{
    printf("\t\t\t\t Jogo do Galo \n\n\n");

    int escolha = 0;

    do
    {
        printf("\t\t\t\t*MENU*\n\n\n");
        printf("1 - Jogar Jogo do Galo:\n");
        printf("2 - Consultar Estatísticas de Jogo:\n");
        printf("3 - SAIR\n");
        printf("Opção: ");
        scanf("%d", &escolha);

        switch(escolha)
        {
            case 1:
            {
                   iniciar_matriz(matriz);
                   apresenta_matriz();

                    do
                    {

                        coordenadas();

                        //Verifica o vencedor após a Jogada do Humano
                        if (verifica_vencedor() == 1)
                        {
                            printf("\n\nO Vencedor é o Jogador Humano!\n\n");
                            contahumano = contahumano + 1;
                            break;
                        }

                    coordenadas_pc();

                        //Verifica o vencedor após a jogada do Computador

                        if (verifica_vencedor() == 1)
                        {
                            printf("\n\nO Vencedor é o Computador!\n\n");
                            contapc = contapc + 1;
                            break;
                        }

                    apresenta_matriz();

                    }while(1);

                    // Apresentar a Matriz após a verificação do vencedor
                    apresenta_matriz();
                    break;

            }

            case 2:
            {
                printf("\t\t\t*Estatisticas do Jogo*\n\n\n");
                apresenta_estatisticas(contahumano, contapc);
                break;
            }

            case 3:
            {
                printf("Deseja Sair!");
                exit(0);
            }

            default:
            {
                printf("Opção Inválida");
                return main;
            }
        }

    }
    while(escolha != 3);

    getchar();
}

// Função que Incializa a matriz

void iniciar_matriz()
{
    int i, j;

    for(i = 0; i < DIM; i++)
    {
        for (j = 0; j < DIM; j++)
        {
            matriz[i][j] = ' ';
        }

    }
}

//Função para a coodenadas

void coordenadas()
 {
    int x, y;

    printf("Insira a coordenada X: ");
    scanf("%d", &x);
    fflush(stdin);

    printf("\n\nInsira a coordenada Y: ");
    scanf("%d", &y);
    fflush(stdin);

    x--;
    y--;

    if (matriz[x][y] != ' ')
    {
        printf("\n Posição Ocupada! \n");
        coordenadas();
    }
    else
    {
        matriz[x][y] = 'X';
    }
}

//Função para apresentar a matriz

void apresenta_matriz()
{
    int i;

    printf("\n");

    for (i = 0; i < DIM; i++)
    {
        printf(" %c | %c | %c ", matriz[i][0], matriz[i][1], matriz[i][2]);

        if ( i != 2)
        {
            printf("\n");
            printf("---|---|---");
            printf("\n");
        }
    }

    printf("\n");
}

// Função para A Jogada do Computador

void coordenadas_pc()
{
    int i, j;

    for (i = 0; i < DIM; i++)
    {
        for(j = 0; j < DIM; j++)
        {
            if (matriz[i][j] == ' ')
            {
                matriz[i][j] = 'O';
                return;
            }
        }
    }
}

//Função para verificar o Vencedor do jogo

int verifica_vencedor()
{
    int i;

    // Verificar Linhas e retorna o valor 1 caso seja verdadeiro

    for (i = 0; i < DIM; i++)
    {
        if (matriz[i][0] != ' ' && matriz[i][1] != ' ' && matriz[i][2] != ' ')
        {
            if(matriz[i][0] == matriz[i][1] && matriz[i][0] == matriz[i][2])
            {
                return 1;
            }
        }
    }

    // Verificar Linhas e retorna o valor 1 caso seja verdadeiro

    for (i = 0; i < DIM; i++)
    {
        if (matriz[0][i] != ' ' && matriz[1][i] != ' ' && matriz[2][i] != ' ')
        {
            if (matriz[0][i] == matriz[1][i] && matriz[0][i] == matriz[2][i])
            {
                return 1;
            }
        }
    }

    // Verificar as diagonais e retornar o valor 1 caso seja verdadeiro

    if(matriz[0][0] != ' ' && matriz[1][1] != ' ' && matriz[2][2] != ' ')
    {
        if (matriz[0][0] == matriz[1][1] && matriz[0][0] == matriz[2][2])
        {
            return 1;
        }
    }

    if(matriz[0][2] != ' ' && matriz[1][1] != ' ' && matriz[2][0] != ' ')
    {
        if(matriz[0][2] == matriz[1][1] && matriz[0][2] == matriz[2][0])
        {
            return 1;
        }
    }
}

//Função para calculo das estatísticas e apresentação

void apresenta_estatisticas(int contahumano, int contapc)
{
    printf("Numero de jogos Ganhos pelo Humano: %d\n\n", contahumano);
    printf("Numero de Jogos Ganhos Pelo Computador: %d\n\n", contapc);

}

Sei que esta solução ainda não resolve o desafio e que pode muito bem ser melhorada, principalmente no método da inteligência artificial do modo como o computador joga e sobre como é guardada a informação das estatísticas do jogo, pelo que estou aberto a todas as sugestões que me possam dar.

Share

Tenho continuado a tentar evoluir e incorporar novas funcionalidades neste meu projecto, desta vez implementei um MENU recorrendo ao Switch Case, assim como coloquei um contador de jogos vencidos de modo a saber as estatísticas do Jogo.

Aqui fica o código:

/**************************************************************
Nome: Nuno Santos
Data: 06-04-2012
Projecto: Jogo do Galo_1.06
**************************************************************/

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

#define DIM 3

int matriz[DIM][DIM];
int contapc = 0, contahumano = 0;

void iniciar_matriz();
void coordenadas();
void coordenadas_pc();
int verifica_vencedor();
void apresenta_matriz();
void apresenta_estatisticas(int contahumano, int contapc);

int main()
{
    printf("\t\t\t\t Jogo do Galo \n\n\n");

    int escolha = 0;

    do
    {
        printf("\t\t\t\t*MENU*\n\n\n");
        printf("1 - Jogar Jogo do Galo:\n");
        printf("2 - Consultar Estatísticas de Jogo:\n");
        printf("3 - SAIR\n");
        printf("Opção: ");
        scanf("%d", &escolha);

        switch(escolha)
        {
            case 1:
            {
                   iniciar_matriz(matriz);
                   apresenta_matriz();

                    do
                    {

                        coordenadas();

                        //Verifica o vencedor após a Jogada do Humano
                        if (verifica_vencedor() == 1)
                        {
                            printf("\n\nO Vencedor é o Jogador Humano!\n\n");
                            contahumano = contahumano + 1;
                            break;
                        }

                    coordenadas_pc();

                        //Verifica o vencedor após a jogada do Computador

                        if (verifica_vencedor() == 1)
                        {
                            printf("\n\nO Vencedor é o Computador!\n\n");
                            contapc = contapc + 1;
                            break;
                        }

                    apresenta_matriz();

                    }while(1);

                    // Apresentar a Matriz após a verificação do vencedor
                    apresenta_matriz();
                    break;

            }

            case 2:
            {
                printf("\t\t\t*Estatisticas do Jogo*\n\n\n");
                apresenta_estatisticas(contahumano, contapc);
                break;
            }

            case 3:
            {
                printf("Deseja Sair!");
                exit(0);
            }

            default:
            {
                printf("Opção Inválida");
                return main;
            }
        }

    }
    while(escolha != 3);

    getchar();
}

// Função que Incializa a matriz

void iniciar_matriz()
{
    int i, j;

    for(i = 0; i < DIM; i++)
    {
        for (j = 0; j < DIM; j++)
        {
            matriz[i][j] = ' ';
        }

    }
}

//Função para a coodenadas

void coordenadas()
 {
    int x, y;

    printf("Insira a coordenada X: ");
    scanf("%d", &x);
    fflush(stdin);

    printf("\n\nInsira a coordenada Y: ");
    scanf("%d", &y);
    fflush(stdin);

    x--;
    y--;

    if (matriz[x][y] != ' ')
    {
        printf("\n Posição Ocupada! \n");
        coordenadas();
    }
    else
    {
        matriz[x][y] = 'X';
    }
}

//Função para apresentar a matriz

void apresenta_matriz()
{
    int i;

    printf("\n");

    for (i = 0; i < DIM; i++)
    {
        printf(" %c | %c | %c ", matriz[i][0], matriz[i][1], matriz[i][2]);

        if ( i != 2)
        {
            printf("\n");
            printf("---|---|---");
            printf("\n");
        }
    }

    printf("\n");
}

// Função para A Jogada do Computador

void coordenadas_pc()
{
    int i, j;

    for (i = 0; i < DIM; i++)
    {
        for(j = 0; j < DIM; j++)
        {
            if (matriz[i][j] == ' ')
            {
                matriz[i][j] = 'O';
                return;
            }
        }
    }
}

//Função para verificar o Vencedor do jogo

int verifica_vencedor()
{
    int i;

    // Verificar Linhas e retorna o valor 1 caso seja verdadeiro

    for (i = 0; i < DIM; i++)
    {
        if (matriz[i][0] != ' ' && matriz[i][1] != ' ' && matriz[i][2] != ' ')
        {
            if(matriz[i][0] == matriz[i][1] && matriz[i][0] == matriz[i][2])
            {
                return 1;
            }
        }
    }

    // Verificar Linhas e retorna o valor 1 caso seja verdadeiro

    for (i = 0; i < DIM; i++)
    {
        if (matriz[0][i] != ' ' && matriz[1][i] != ' ' && matriz[2][i] != ' ')
        {
            if (matriz[0][i] == matriz[1][i] && matriz[0][i] == matriz[2][i])
            {
                return 1;
            }
        }
    }

    // Verificar as diagonais e retornar o valor 1 caso seja verdadeiro

    if(matriz[0][0] != ' ' && matriz[1][1] != ' ' && matriz[2][2] != ' ')
    {
        if (matriz[0][0] == matriz[1][1] && matriz[0][0] == matriz[2][2])
        {
            return 1;
        }
    }

    if(matriz[0][2] != ' ' && matriz[1][1] != ' ' && matriz[2][0] != ' ')
    {
        if(matriz[0][2] == matriz[1][1] && matriz[0][2] == matriz[2][0])
        {
            return 1;
        }
    }
}

//Função para calculo das estatísticas e apresentação

void apresenta_estatisticas(int contahumano, int contapc)
{
    printf("Numero de jogos Ganhos pelo Humano: %d\n\n", contahumano);
    printf("Numero de Jogos Ganhos Pelo Computador: %d\n\n", contapc);

}

Sei que esta solução ainda não resolve o desafio e que pode muito bem ser melhorada, principalmente no modo em como o computador joga pois da forma que esta implementada é sempre possível ser o Humano a ganhar, pelo que estou aberto a todas as sugestões que me possam dar.

Related Posts Plugin for WordPress, Blogger...Share