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

MarcelValente

jogo sudoku

16 mensagens neste tópico

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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) { /* ... */ }

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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 :\

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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");
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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.
*/
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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! =\

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
#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");

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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]);
   }


0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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);

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

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?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora