Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
MarcelValente

jogo sudoku

Recommended Posts

MarcelValente

Boa tarde pessoal! aproveito de imediato para desejar um bom ano a todos vos e a agradecer pela ajuda prestada por voces todos.

Eu tenho mais um problema em maos. Eu tenho um projecto tematico na universidade de desenvolver um jogo do sudoku em C e a parte que me calhou foi a parte do desenvolvimento de uma parte do programa que e memorize as pontuacoes por ordem decrescente de 5 jogadas num ficheiro .txt. eu ja consegui fazr uma parte do programa apenas nao consigo po-lo a dispor por ordem decrescente. se me pudessem ajudar era optimo.

obrigado a todos

Share this post


Link to post
Share on other sites
pedrotuga

Há aqui várias pessoas que te podem ajudar, mas tes que dizer onde é que precisas de ajuda. Em particular, que dúvidas é que tens?

Share this post


Link to post
Share on other sites
pmg

Só 5 elementos para ordenar?

Podes ordenar à mão :)

if (elem1 > elem2) { /* ... */ }
if (elem1 > elem3) { /* ... */ }
if (elem1 > elem4) { /* ... */ }
if (elem1 > elem5) { /* ... */ }
if (elem2 > elem3) { /* ... */ }
if (elem2 > elem4) { /* ... */ }
if (elem2 > elem5) { /* ... */ }
if (elem3 > elem4) { /* ... */ }
if (elem3 > elem5) { /* ... */ }
if (elem4 > elem5) { /* ... */ }


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
pedrosorio

Só 5 elementos para ordenar?

Podes ordenar à mão :)

if (elem1 > elem2) { /* ... */ }
if (elem1 > elem3) { /* ... */ }
if (elem1 > elem4) { /* ... */ }
if (elem1 > elem5) { /* ... */ }
if (elem2 > elem3) { /* ... */ }
if (elem2 > elem4) { /* ... */ }
if (elem2 > elem5) { /* ... */ }
if (elem3 > elem4) { /* ... */ }
if (elem3 > elem5) { /* ... */ }
if (elem4 > elem5) { /* ... */ }

Bleh.... =X


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites
pmg

Bleh.... =X

Acho que é mesmo o método mais rápido :)

Com este método consegues um runtime de 4.2 nanosegundos; com outro método não consegues menos de 5.7 nanosegundos!


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
pedrotuga

E quando um gajo tem trabalhos para fazer ou livros para estudar todos os nanosegundos são importantes.

"Eh pa... se o prof tivesse dado mais uns nanosegundozitos no teste para eu responder a uma pergunta..."

Estou a brincar. É só para dizer que a esse nível o problema da velocidade de execução não se coloca, pelo menos desta forma não.

Implementar um algoritmo de ordenamento é um exercício tambem por si só, e acabara por introduzir o aprendiz à prática de reutilização de código :)

Share this post


Link to post
Share on other sites
pmg

Agora a sério:

Se o MarcelValente conseguir preencher os /* ... */ e chegar ao fim daquele pedaço de código com

elem1 <= elem2 <= elem3 <= elem4 <= elem5

acho que fez um bom trabalho.

É claro que é um trabalho a nível básico, mas não me parce correcto começar logo com um merge sort ou um quick sort.

A partir daquele código, possivelmente com indicações do professor, já se implementa um bubble sort para arrays com N elementos.

nanosegundozitos

LOL


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
MarcelValente

eu mais logo vou enviar o codigo que tenho sobre a minha parte..mas ainda nao esta implementado no programa e depois se puderem ver a forma como melhor fazer aquilo eu agradeco.

ja agora obrigado pela ajuda que deram..eu nao percebo praticamnt nada disto :\

Share this post


Link to post
Share on other sites
MarcelValente

este e o codigo que tenho do meu programa sobre as pontuacoes...como posso agora altera-lo para ficar a funcionar no Ubuntu e a ordenar os nomes por ordem decrescente?

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

int main()

{
    FILE *f1;
    FILE *f2;

    char tabela[50];
    char Ntabela[50];
    char nome[50][10];
    char pontuacao[10][10];
    char Final[50][10];

    int linha=0;

    f1=fopen("tabela.txt","r");

    for(linha=0;fgets(tabela,sizeof(tabela),f1) !=NULL; linha++)
        {
         printf("%s", tabela);
        }

    fclose(f1);
    printf("\n\n");


    for(linha=0;linha<3;linha++)
    {
        printf("Introduza o nome: ");
        gets(nome[linha]);
        printf("Introduza a pontuacao: ");
        gets(pontuacao[linha]);
    }
    printf("\n");

    for(linha=0;linha<3; linha++)
    {
        printf("%s ", nome[linha]);
        printf("Pontuacao: ");
        printf("%s\n",pontuacao[linha]);
    }
    printf("\n\n");

    f2 = fopen("Highscores.txt", "w");

    for (linha=0; linha < 3; linha++)
    {
        fprintf(f2, "%s %s\n", nome[linha], pontuacao[linha]);
    }
    fclose(f2);

    system("pause");
}

Share this post


Link to post
Share on other sites
pmg

este e o codigo que tenho do meu programa sobre as pontuacoes...como posso agora altera-lo para ficar a funcionar no Ubuntu e a ordenar os nomes por ordem decrescente?

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

int main()

{
    FILE *f1;
    FILE *f2;

    char tabela[50];
    char Ntabela[50];
    char nome[50][10];
    char pontuacao[10][10];
    char Final[50][10];

    int linha=0;

    f1=fopen("tabela.txt","r");

    for(linha=0;fgets(tabela,sizeof(tabela),f1) !=NULL; linha++)
        {
         printf("%s", tabela);
        }

    fclose(f1);
    printf("\n\n");


    for(linha=0;linha<3;linha++)

/* Então e se o ficheiro "tabela.txt" não tiver 3 linhas?
** Acho que era boa ideia testar isso antes de entrar neste ciclo
*/
/* Oh! Já agora, porque é que lês o ficheiro todo
** em vez de leres somente as primeiras 3 linhas?
*/

    {
        printf("Introduza o nome: ");
        gets(nome[linha]);

/* não uses gets.
** fgets(nome[linha], sizeof nome[linha], stdin);
** tem praticamente o mesmo efeito e
** não é vulnerável a "buffer overflows"
** http://en.wikipedia.org/wiki/Gets
*/

        printf("Introduza a pontuacao: ");
        gets(pontuacao[linha]);
/* gets, outra vez */
    }
    printf("\n");

    for(linha=0;linha<3; linha++)
    {
        printf("%s ", nome[linha]);
        printf("Pontuacao: ");
        printf("%s\n",pontuacao[linha]);
    }
    printf("\n\n");

/* Na ordenação não te esqueças de manter os arrays
** `nome` e `pontuacao` sincronizados
*/

    f2 = fopen("Highscores.txt", "w");

    for (linha=0; linha < 3; linha++)
    {
        fprintf(f2, "%s %s\n", nome[linha], pontuacao[linha]);
    }
    fclose(f2);

    system("pause");
/* O Ubuntu não deve ter "pause".
** Remove esta linha do programa.
*/
}


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
MarcelValente

Bom dia.

Eu testei o codigo e fiz as alterações que sugeriste mas nao esta a funcionar. Nao esta a ordenar por ordem decrescente de pontuacao e os nomes ficam escritos num genero de "codigo secreto" que nao se entende.

Nao poderias fazer a alteracao e testar e depois passar-me o codigo com os comentarios das alteracoes? se pudesses eu agradecia porque eu nao percebo nada! =\

Share this post


Link to post
Share on other sites
TheDark

Podes mostrar como implementaste, para ser possível entender o que está mal e corrigir, explicando porque não funciona :(


Desaparecido.

Share this post


Link to post
Share on other sites
MarcelValente
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()

{
    FILE *f1;
    FILE *f2;

    char tabela[50];
    char Ntabela[50];
    char nome[50][10];
    char pontuacao[10][10];
    char Final[50][10];

    int linha=0;

    f1=fopen("tabela.txt","r");

    for(linha=0;fgets(tabela,sizeof(tabela),f1) !=NULL; linha++)
        {
         printf("%s", tabela);
        }

    fclose(f1);
    printf("\n\n");


    for(linha=0;linha<3;linha++)
{
        printf("Introduza o nome: ");
        //gets(nome[linha]);
        fgets(nome[linha], sizeof nome[linha], stdin);
        printf("Introduza a pontuacao: ");
       
        fgets(nome[linha], sizeof nome[linha], stdin);

}
    printf("\n");

    for(linha=0;linha<3; linha++)
    {
        printf("%s ", nome[linha]);
        printf("Pontuacao: ");
        printf("%s\n",pontuacao[linha]);
    }
    printf("\n\n");
f2 = fopen("Highscores.txt", "w");

    for (linha=0; linha < 3; linha++)
    {
        fprintf(f2, "%s %s\n", nome[linha], pontuacao[linha]);
    }
    fclose(f2);

    system("pause");

}

Share this post


Link to post
Share on other sites
MarcelValente

boas outra vez..

eu estive a fazer umas alteracoes e usei o bubblesort so que no bubblesort tambem queria ordenar os nomes em funcao das pontuacoes..e ao enviar o segundo array para dentro do bubblesort da-me um erro, que nao percebo como resolver. o erro e :

semestre\projecto informatica-sudoku\tabelapontuacao.c||In function `void bubblesort(int*, int, char*)':|

semestre\projecto informatica-sudoku\tabelapontuacao.c|20|error: incompatible types in assignment of `char' to `char[50]'|

semestre\projecto informatica-sudoku\tabelapontuacao.c|22|error: invalid conversion from `char*' to `char'|

semestre\projecto informatica-sudoku\tabelapontuacao.c||In function `int main()':|

semestre\projecto informatica-sudoku\tabelapontuacao.c|56|error: cannot convert `char (*)[10]' to `char*' for argument `3' to `void bubblesort(int*, int, char*)'|

||=== Build finished: 3 errors, 0 warnings ===|

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

void bubblesort (int *lista, int tam,char *lista1)
{
int i,aux,troca;//,cres;
char tmp[50];
do
{
	troca=0;
	for(i=0; i<tam; i++)
	{
		if(lista[i]>lista[i+1])// && (cres) || (lista[i]<lista[i+1] && cres==0))
		{
			aux=lista[1];
			lista[i]=lista[i+1];
			lista[i+1]=aux;

			tmp=lista1[1];
			lista1[i]=lista1[i+1];
			lista1[i+1]=tmp;

			troca++;
		}
	}
}
while(troca!=0);
//ou while(i<aux);
}


int main()

{
    FILE *f1;
    FILE *f2;

    char tabela[50];
    //char Ntabela[50];
    char nome[50][10];
    int pontuacao[10];
    //char Final[50][10];
    int i=0;
    int linha=0;

    f1=fopen("tabela.txt","r");

    for(linha=0;fgets(tabela,sizeof(tabela),f1) !=NULL; linha++)
        {
         i = sscanf(tabela, "%s %d", &nome[linha],&pontuacao[linha]);
         printf("%s %d\n", nome[linha],pontuacao[linha]);
        }

    fclose(f1);
   bubblesort(pontuacao,linha,nome);

   for(i=0;i<linha;i++)
   {
        printf("%s %d\n", nome[i],pontuacao[i]);
   }


Share this post


Link to post
Share on other sites
pmg

semestre\projecto informatica-sudoku\tabelapontuacao.c||In function `void bubblesort(int*, int, char*)':|

semestre\projecto informatica-sudoku\tabelapontuacao.c|20|error: incompatible types in assignment of `char' to `char[50]'|

semestre\projecto informatica-sudoku\tabelapontuacao.c|22|error: invalid conversion from `char*' to `char'|

semestre\projecto informatica-sudoku\tabelapontuacao.c||In function `int main()':|

semestre\projecto informatica-sudoku\tabelapontuacao.c|56|error: cannot convert `char (*)[10]' to `char*' for argument `3' to `void bubblesort(int*, int, char*)'

Explicação dos erros:

linha 20: tmp = lista1[1];

tmp foi definido como `char tmp[50];`; linha1 foi definido como `char *lista1`, portanto lista1[1] é um char.

Não podes assignar um char a um array de chars.

linha 22: lista1[i+1]=tmp;

Este erro é parecido com o da linha 20, so que "ao contrário".

linha 56: bubblesort(pontuacao,linha,nome);

A função bubblesort tem o protótiop void bubblesort (int *lista, int tam,char *lista1).

O terceiro argumento que a função espera receber é um char *.

Na chamada à função estás a passar-lhe o nome, que foi definido como char nome[50][10];.

Os tipos `char [50][10]` e `char *` são incompatíveis.

Solução dos erros: (não testado)

linha 56: O protótipo da função tem de ser alterado para a função receber um array de array de caracteres. Por exemplo

void bubblesort(int *lista, int tam, char **lista1);

Depois desta alteração acho que não precisas de mudar mais nada na função para ela ser compilável, mas precisas de mudar mais coisas para ela funcionar como pretendes.

linhas 20 e 22:

Em princípio deveria funcionar depois de alterares o protótipo, mas há um senão: o lista1[ x ] é na realidade um array de caracteres e não podes assignar nada para ele ... mas podes alterar os caracteres para onde ele aponta. Tens que substituir os 'assignments' para strcpy()'s

strcpy(tmp, lista1[1]);
strcpy(lista1[i], lista1[i+1]);
strcpy(lista1[i+1], tmp);


What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Share this post


Link to post
Share on other sites
MarcelValente

boas..

estive a tntar fazr essas alteracoes e nao da.

Se alguem pudesse por favor resolver esse erro pk ja tentei de tudo e tenho k entregar ate kinta feira este programa e nao consigo. alguem pode ajudar-me por favor?

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.