Ir ao conteúdo
  • Cadastre-se

Jogo Embaralha - Ordena


DiCassio

Posts recomendados

Gente, recebí o comando de um projeto mais eu não to conseguindo fazer. Na verdade não sei nem por onde começar =/

Comando da questão..:

Implementar um programa completo em C que simule o jogo “embaralha-ordena” o jogo deve funcionar da seguinte maneira: o usuario deve prencher uma matiz de maneira desordenada, um um quadro deve ficar vazio, a seguir o usuario deve movimentar os numeros dos quadrados adjacentes e por meio desses movimentos ordenar a matriz. Apos cada movimento do usuario deve existir uma funçao q testa se a matiz esta ordenada. O jogo deve ser finalizado quando a matriz estiver totalmente ordenada.

Resumindo..: eu tenho que criar um jogo semelhante ao embaralha-ordena. O último espaço tem que ficar em branco, mais ou menos assim..:

[ 6 2 3 5

7 1 4 ]

Alguém tem alguma ideia? preciso muito disso e é pra daqui a 2 dias :\

Link para o comentário
Compartilhar em outros sites

Bem, vamos por partes :

1) criar uma matriz com a configuração desejada, por exemplo [2][4].

2) fazer um for lendo numeros e os armazenando de matriz[0][0] até matriz[1][2] usando dois for's alinhados

3)inicializar matriz[1][3] com um espaço ou algo parecido.

4) exibir a matriz.

5)pedir uma posição do estilo "1,4" que pediria para colocar o elemento matriz[0][3] em matriz[1][3], através da permutação de variaveis.

obs: a permutação(troca de valores) das variaveis pode ser feita de duas formas. A primeira utiliza uma variavel auxiliar, sendo portanto mais legivel, e a outra não a utiliza, gastando porém menos memoria.

opção 1: aux=matriz[0][3]; matriz[0][3]=matriz[1][3]; matriz[1][3]=aux;

opção 2: matriz[1][3]=matriz[1][3]+matriz[0][3]; matriz[0][3]=matriz[1][3]-matriz[0][3]; matriz[1][3]=matriz[1][3]-matriz[0][3];

6)limpar a tela e exibir a nova matriz.

7)Usar um for para comparar matriz[0][0] com matriz[0][1], matriz[0][1] com matriz[0][2], etc. Se o segundo elemento de comparação for sempre maior, a ordenação está terminada, caso contrario, você pode voltar ao passo 5 e pedir uma posição

Link para o comentário
Compartilhar em outros sites

Bem, cuidado com esse começo. Eu não sei como é a metodologia dos cursos porque aprendi baixando apostila do apostilando.

Bom, você precisa de duas variaveis auxiliares, digamos 'i' e 'j' que controlarão os for's

você poderia fazer um for dentro do outro. Numa matriz bidimensional, como é o caso da sua, o indice mais a esquerda representa as linhas e o mais a direita, as colunas.

Dessa forma, você fara alguma coisa parecida com isso (se tiver dificuldade de entender, me avise):

for(i=0; i<=1; i++)
{
for(j=0; j<4; j++)
{
system("cls");
if(i==1&&j==3) continue; /*se estiver na segunda coluna, quarta linha, vá para a proxima interação, fazendo com que se deixe os for's. Lembrando que a posição matriz[1][3] você colocará um espaço, por exemplo*/
printf("digite um número : ");
scanf("%d", &matriz[i][j]);}}
matriz[1][3]=' ';

Dessa forma, você lerá os números da primeira linha, da primeira até a quarta coluna, e depois na segunda linha, da primeira até a terceira coluna. Depois você simplesmente coloca um espaço na ultima posição, para que quando for imprimida na tela, fique um espaço "vazio"

Link para o comentário
Compartilhar em outros sites

Bem, cuidado com esse começo. Eu não sei como é a metodologia dos cursos porque aprendi baixando apostila do apostilando.

Bom, você precisa de duas variaveis auxiliares, digamos 'i' e 'j' que controlarão os for's

você poderia fazer um for dentro do outro. Numa matriz bidimensional, como é o caso da sua, o indice mais a esquerda representa as linhas e o mais a direita, as colunas.

Dessa forma, você fara alguma coisa parecida com isso (se tiver dificuldade de entender, me avise):

for(i=0; i<=1; i++)
{
for(j=0; j<4; j++)
{
system("cls");
if(i==1&&j==3) continue; /*se estiver na segunda coluna, quarta linha, vá para a proxima interação, fazendo com que se deixe os for's. Lembrando que a posição matriz[1][3] você colocará um espaço, por exemplo*/
printf("digite um número : ");
scanf("%d", &matriz[i][j]);}}
matriz[1][3]=' ';

Dessa forma, você lerá os números da primeira linha, da primeira até a quarta coluna, e depois na segunda linha, da primeira até a terceira coluna. Depois você simplesmente coloca um espaço na ultima posição, para que quando for imprimida na tela, fique um espaço "vazio"

Obrigado pela ajuda, mesmo.

A metodologia não é lá muito boa.. é tudo muito corrido, sobra muitas dúvidas que não tem como agente tirar.. mais enfim, vou tentar levar "na barriga"

Eu já to com dúvida na criação de matrizes.. e o professor não tirou minha duvida..

Me ajuda com isso, pra criar uma matriz eu preciso de algum elemento auxiliar ou ponteiro? Como eu disse, sou novato nisso.. tive pouquissimas aulas D:

Link para o comentário
Compartilhar em outros sites

bem, primeiramente precisamos definir o que seria uma matriz : uma matriz é uma variavel que armazena outras variaveis.

Um vetor é um exemplo de matriz unidimensional(uma única dimensão)

exempo : char nome[50];/*nesse caso, criamos um vetor de caracteres, comumente chamado de string, que armazena 50 caracteres*/

Uma matriz bidimensional pode significar um vetor de vetores

exemplo : char matriz [6][50]; /*este outro caso faz com que sejam criadas 6 vetores de caracteres, cada um com espaço para 50 caracteres*/

Um bom exemplo de matriz bidimensional é o programa de planilha "excel", que trabalha com linhas e colunas. Numa matriz bidimensional, os colchetes mais a direita são as colunas, que variam mais rapidamente, e o mais a esquerda são as linhas.

em teoria, podemos criar uma matriz de qualquer dimensão que quisermos, mas é raro uma matriz maior do que 3 dimensões. O motivo? Memoria.

A quantidade de memoria gasta numa matriz equivale ao tamanho do tipo*tamanho do colchete mais a direita*tamanho do colchete a esquerda do da direita*......

Por exemplo, admitindo-se que o tamanho de um char é 1 byte, uma matriz char matriz[5][6] ocupa : 1*5*6 = 30 bytes na memoria

Para se declarar matrizes, sejam elas uni ou polidimensionais, não se faz necessario mais nada ale´m do que foi dito aqui.

Com relação aos ponteiros, devemos nos lembrar que o nome sozinho da matriz equivale a um ponteiro para seu primeiro elemento

scanf("%c", matriz); é igual a scanf("%c",&matriz[0]);

Numa matriz bidimensional(um vetor de strings, por exemplo) se quiser ler um vetor, pode-se usar simplesmente o indice do colchete mais a esquerda.

char matriz[6][50]; //um vetor de 6 vetores, com cada vetor contendo 6 vetores de 50 caracteres cada

//se quisermos ler uma string para colocar nesse vetor, podemos fazer :

scanf("%s", matriz[0]);// irá ler uma string para o primeiro vetor de strings.

Como foi mostrado acima, pode-se referenciar uma string dentro do determinado vetor, mas como referenciar um determinado caractere dentro de uma determinada string??

Bem, pode-se usar os dois colchetes.

matriz[0][0]='c'; //o primeiro caractere da primeira string é 'c'

Você já aprendeu a usar ponteiros e ponteiros de ponteiros?

Link para o comentário
Compartilhar em outros sites

bem, primeiramente precisamos definir o que seria uma matriz : uma matriz é uma variavel que armazena outras variaveis.

Um vetor é um exemplo de matriz unidimensional(uma única dimensão)

exempo : char nome[50];/*nesse caso, criamos um vetor de caracteres, comumente chamado de string, que armazena 50 caracteres*/

Uma matriz bidimensional pode significar um vetor de vetores

exemplo : char matriz [6][50]; /*este outro caso faz com que sejam criadas 6 vetores de caracteres, cada um com espaço para 50 caracteres*/

Um bom exemplo de matriz bidimensional é o programa de planilha "excel", que trabalha com linhas e colunas. Numa matriz bidimensional, os colchetes mais a direita são as colunas, que variam mais rapidamente, e o mais a esquerda são as linhas.

em teoria, podemos criar uma matriz de qualquer dimensão que quisermos, mas é raro uma matriz maior do que 3 dimensões. O motivo? Memoria.

A quantidade de memoria gasta numa matriz equivale ao tamanho do tipo*tamanho do colchete mais a direita*tamanho do colchete a esquerda do da direita*......

Por exemplo, admitindo-se que o tamanho de um char é 1 byte, uma matriz char matriz[5][6] ocupa : 1*5*6 = 30 bytes na memoria

Para se declarar matrizes, sejam elas uni ou polidimensionais, não se faz necessario mais nada ale´m do que foi dito aqui.

Com relação aos ponteiros, devemos nos lembrar que o nome sozinho da matriz equivale a um ponteiro para seu primeiro elemento

scanf("%c", matriz); é igual a scanf("%c",&matriz[0]);

Numa matriz bidimensional(um vetor de strings, por exemplo) se quiser ler um vetor, pode-se usar simplesmente o indice do colchete mais a esquerda.

char matriz[6][50]; //um vetor de 6 vetores, com cada vetor contendo 6 vetores de 50 caracteres cada

//se quisermos ler uma string para colocar nesse vetor, podemos fazer :

scanf("%s", matriz[0]);// irá ler uma string para o primeiro vetor de strings.

Como foi mostrado acima, pode-se referenciar uma string dentro do determinado vetor, mas como referenciar um determinado caractere dentro de uma determinada string??

Bem, pode-se usar os dois colchetes.

matriz[0][0]='c'; //o primeiro caractere da primeira string é 'c'

Você já aprendeu a usar ponteiros e ponteiros de ponteiros?

Tirou uma dúvida e tanto.

Não, não aprendi a usar ponteiros muito bem.. a única coisa que sei, é que ele aponta pra um determinado lugar na memória. Estou correto?

Link para o comentário
Compartilhar em outros sites

Corretissimo. Agora vou te ensinar a criar uma matriz unidimensional e bidimensional dinamicamente.

O que isso quer dizer? Bem, quando você declara "char matriz[50];" o sistema aloca o tamanho de memoria necessario para você usar esses dados, no caso 50 bytes, admitindo-se char de 1 byte.

O problema é : e quando você não sabe o tamanho necessario? Para isso você pode usar um ponteiro do tipo do vetor que você quer. uma variavel ponteiro é indicada com "*".

ex: char* matriz_dinamica;// diz pro programa para criar um ponteiro de char.

Bem, um ponteiro desse jeito não pode ser usado, pois não foi "apontado" para lugar nenhum. Além disso, não tem um tamanho.

Se quisermos, numa parte do programa, que esse ponteiro vire uma matriz unidimensional de tamanho 80? Precisaremos da função malloc(), disponivel em stdlib.h, que aloca uma determinada quantidade de bytes e devolve um ponteiro para esse bloco de memoria

matriz_dinamica=(char*)malloc(sizeof(char*)*80);//bem, agora nos usamos um "cast" para forçar o retorno de malloc a ser do tipo "ponteiro de char". Depois de alocarmos memoria para o ponteiro, podemos usa-lo como se fosse um vetor, pois de fato foi isso que virou.

matriz_dinamica[4]='c';//coloca o caracter 'c' no quinto indice do vetor(lembre-se que os indices, em C, começam em 0).

Mas, e se nós quisermos uma matriz bidimensional, um vetor de string's, ou seja, um conjunto de frases? Bem, precisaremos de um ponteiro para ponteiro, indicado pelo simbolo "**".

char** matriz_bidimensional;

Vamos agora colocar o equivalente aos colchetes mais a esquerda :

matriz_bidimensional=(char**)malloc(sizeof(char**)*80);

Agora alocar o colchete mais a direita :

for(i=0; i<80; i++)//vamos acessar cada indice que colocamos anteriormente

matriz_bidimensional=(char*)malloc(sizeof(char*)*80);

Pronto, agora temos um ponteiro que podemos usar como uma matriz bidimensional de tamanhos 80 e 80. matriz_bidimensional[0][8]='c'; matriz_bidimensional[6]="Eu aprendi essa budega"

Link para o comentário
Compartilhar em outros sites

Corretissimo. Agora vou te ensinar a criar uma matriz unidimensional e bidimensional dinamicamente.

O que isso quer dizer? Bem, quando você declara "char matriz[50];" o sistema aloca o tamanho de memoria necessario para você usar esses dados, no caso 50 bytes, admitindo-se char de 1 byte.

O problema é : e quando você não sabe o tamanho necessario? Para isso você pode usar um ponteiro do tipo do vetor que você quer. uma variavel ponteiro é indicada com "*".

ex: char* matriz_dinamica;// diz pro programa para criar um ponteiro de char.

Bem, um ponteiro desse jeito não pode ser usado, pois não foi "apontado" para lugar nenhum. Além disso, não tem um tamanho.

Se quisermos, numa parte do programa, que esse ponteiro vire uma matriz unidimensional de tamanho 80? Precisaremos da função malloc(), disponivel em stdlib.h, que aloca uma determinada quantidade de bytes e devolve um ponteiro para esse bloco de memoria

matriz_dinamica=(char*)malloc(sizeof(char*)*80);//bem, agora nos usamos um "cast" para forçar o retorno de malloc a ser do tipo "ponteiro de char". Depois de alocarmos memoria para o ponteiro, podemos usa-lo como se fosse um vetor, pois de fato foi isso que virou.

matriz_dinamica[4]='c';//coloca o caracter 'c' no quinto indice do vetor(lembre-se que os indices, em C, começam em 0).

Mas, e se nós quisermos uma matriz bidimensional, um vetor de string's, ou seja, um conjunto de frases? Bem, precisaremos de um ponteiro para ponteiro, indicado pelo simbolo "**".

char** matriz_bidimensional;

Vamos agora colocar o equivalente aos colchetes mais a esquerda :

matriz_bidimensional=(char**)malloc(sizeof(char**)*80);

Agora alocar o colchete mais a direita :

for(i=0; i<80; i++)//vamos acessar cada indice que colocamos anteriormente

matriz_bidimensional=(char*)malloc(sizeof(char*)*80);

Pronto, agora temos um ponteiro que podemos usar como uma matriz bidimensional de tamanhos 80 e 80. matriz_bidimensional[0][8]='c'; matriz_bidimensional[6]="Eu aprendi essa budega"

Entendí. Então um ponteiro para ponteiro funciona "da mesma forma" que um ponteiro qualquer. A diferença seria que ele aponta duas vezes, é isso? Obrigado pela ajuda, e por esclarecer muitas pequenas grandes dúvidas que eu tinha D:. É notável que eu não consiga fazer esse jogo pra quinta-feira, mais agradeço bastante a sua paciência de ensinar pra um zerado tudo que ele precisa saber sobre matrizes e ponteiros. Valeu mesmo . (:

Link para o comentário
Compartilhar em outros sites

matriz_dinamica=(char*)malloc(sizeof(char*)*80);//bem, agora nos usamos um "cast" para forçar o retorno de malloc a ser do tipo "ponteiro de char". Depois de alocarmos memoria para o ponteiro, podemos usa-lo como se fosse um vetor, pois de fato foi isso que virou.

matriz_dinamica[4]='c';//coloca o caracter 'c' no quinto indice do vetor(lembre-se que os indices, em C, começam em 0).

Mas, e se nós quisermos uma matriz bidimensional, um vetor de string's, ou seja, um conjunto de frases? Bem, precisaremos de um ponteiro para ponteiro, indicado pelo simbolo "**".

char** matriz_bidimensional;

Vamos agora colocar o equivalente aos colchetes mais a esquerda :

matriz_bidimensional=(char**)malloc(sizeof(char**) *80);

Agora alocar o colchete mais a direita :

for(i=0; i<80; i++)//vamos acessar cada indice que colocamos anteriormente

matriz_bidimensional=(char*)malloc(sizeof(char*)*80);

Corrigindo:

matriz_dinamica=(char*)malloc(sizeof(char)*80);//bem, agora nos usamos um "cast" para forçar o retorno de malloc a ser do tipo "ponteiro de char". Depois de alocarmos memoria para o ponteiro, podemos usa-lo como se fosse um vetor, pois de fato foi isso que virou.

matriz_dinamica[4]='c';//coloca o caracter 'c' no quinto indice do vetor(lembre-se que os indices, em C, começam em 0).

Mas, e se nós quisermos uma matriz bidimensional, um vetor de string's, ou seja, um conjunto de frases? Bem, precisaremos de um ponteiro para ponteiro, indicado pelo simbolo "**".

char** matriz_bidimensional;

Vamos agora colocar o equivalente aos colchetes mais a esquerda :

matriz_bidimensional=(char**)malloc(sizeof(char*) *80);

Agora alocar o colchete mais a direita :

for(i=0; i<80; i++)//vamos acessar cada indice que colocamos anteriormente

matriz_bidimensional=(char*)malloc(sizeof(char)*80);

Entendí. Então um ponteiro para ponteiro funciona "da mesma forma" que um ponteiro qualquer. A diferença seria que ele aponta duas vezes, é isso?

Ponteiro para ponteiro simplesmente aponta para um ponteiro...

int i=1;

int x=5;

int *p1;

int **p2;

p1=&i;

p2=&p1;

(*p1)++; /* i agora possui valor 2 */

(*p2)=&x; /* p1 agora aponta para x */

(*p1)++; /* x agora possui valor 6*/

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...