Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Entre para seguir isso  
DiCassio

Jogo Embaralha - Ordena

Recommended Posts

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

Editado por gandalfnho
Mensagem toda colorida e em fonte chamativa

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Nossa, deu mesmo pra ajudar. Mais eu to tendo problemas em criar os laços for :/ (Sou estudante no primeiro semestre, tive pouquissimas aulas)

    Compartilhar este post


    Link para o post
    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"

    Editado por gandalfnho
    Use a tag CODE

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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:

    Compartilhar este post


    Link para o post
    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?

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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?

    Compartilhar este post


    Link para o post
    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"

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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 . (:

    Compartilhar este post


    Link para o post
    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*/

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário

    Entre para seguir isso  





    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

    ×