Jump to content

mandelacruz

Membros
  • Content Count

    12
  • Joined

  • Last visited

  • Country

    Brazil

Community Reputation

2 Neutral

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Não entendi muito bem aonde não aparece os números, você não especificou, mas, se estiver falando do output no console, é porque o printf(" %d", p->dados); está com '%d' e não '%f' ou '%lf'.
  2. Criei esse jogo da velha em C, à priori para windows... Não sei se a função system("pause") funciona em outras plataformas... Enfim, caso identfiquem algo que poderia ser escrito de uma forma melhor, será bem vinda a sugestão. Sei que existem vários jogos da velha por ai, mas decidi fazer a minha versão, sendo meu segundo projeto na linguagem C. #include <stdio.h> #define MAX 3 void Menu(int mensagem);//Opções de jogar ou sair. int Controle(int posicoes[][MAX]);//Controla a vez de cada jogador, a verificação de vitória e empate. void Jogo(int posicoes[][MAX], int vez, int ganhou); void ZeraTabuleiro(int posicoes[][MAX]); void Clear(void); int VerificaPosicaoExistente(int linha, int coluna);//Verifica se a linha e coluna que o usuário escolheu, foram números entre 1 e 3. int VerificaPosicao(int posicoes[][MAX], int linha, int coluna);//Verifica se já existe 'X' ou 'O' na posição. int VerificaVitoria(int posicoes[][MAX]); void ErroMensagens(int mensagem); void printaLinha(char *chars, int linha);//Aloca na variável chars(função Jogo()), o respectivo caractere da variável linha(função Jogo()). int main() { int posicoes[MAX][MAX], jogardenovo; Menu(0); do{ jogardenovo = Controle(posicoes); }while(jogardenovo); return 0; } void Menu(int mensagem) { char strings[4][46] = {"Jogo da velha\n", "\nO jogador 1 ganhou. Deseja jogar novamente?\n", "\nO jogador 2 ganhou. Deseja jogar novamente?\n", "\nEMPATE! Deseja jogar novamente?\n"}; int opcao = -1; do{ printf("\t\t%s\n" "1. Jogar\n" "0. Sair\n" "Opcao: ", strings[mensagem]); scanf("%d", &opcao); while(getchar() != '\n')//Limpa stream de entrada. opcao = -1;//Se o usuário mandar, por exemplo, 1d como escolha de opção, não será permitido. if(opcao != 1 && opcao != 0) printf("Opcao invalida. Tente novamente!\n" "-----------------------------------------------------------------------\n"); }while(opcao != 1 && opcao != 0); if(!opcao) exit(1); } int Controle(int posicoes[][MAX]) { int vez, jogada, vv = 0; ZeraTabuleiro(posicoes); for(vez = 1, jogada = 1; ; vez++, jogada++) { Jogo(posicoes, vez, 0);//Chama a função jogo() e só retorna pra cá, quando o jogador da vez acabar a jogada. if(jogada >= 5 && jogada <= 9)//Entre as jogadas 5 e 9, verifica vitória. { if(vv = VerificaVitoria(posicoes)) { Jogo(posicoes, vez, 1); Menu(vv); return 1; } } if(jogada == 9)//Caso na jogada 9 não tenha vitória, chama função Menu() e avisa empate. { Jogo(posicoes, vez, 1); Menu(3); return 1; } if(vez == 2)//Controla o laço for e a vez de cada jogador. vez = 0; } } void Jogo(int posicoes[][MAX], int vez, int ganhou) { int linha = -1, coluna = -1; char strings1[2][8] = {"\t", "Linha:"}, strings2[2][7] = {"Linha", "Coluna"}, simbolos[2] = {'X', 'O'}, chars; for(int i = 1; i <= 2; i++) { Clear(); if(i == 1) chars = ' '; if(i == 2) printaLinha(&chars, linha); printf("\t\t\t\t\t c1 c2 c3\n" "\t\t\t\t\t *******************\n" "\t\t\t\t\tl1| %c | %c | %c |\n" "\t\t\t\t\t*********************\n" "\t\t\t\t\tl2| %c | %c | %c |\n" "\t\t\t\t\t*********************\n" "\t\tVez:Jogador %d\t\tl3| %c | %c | %c |\n" "\t\tsimbolo:'%c'\t\t *******************\n" "\t\t%s%c\t\t%s:", posicoes[0][0], posicoes[0][1], posicoes[0][2] , posicoes[1][0], posicoes[1][1], posicoes[1][2] , vez, posicoes[2][0], posicoes[2][1], posicoes[2][2] , simbolos[vez-1], strings1[i-1], chars, strings2[i-1]); if(ganhou == 1)//Se essa função(Jogo) for chamada passando 1 na variável ganhou, break; //apenas mostra as ultimas posições do jogo e retorna para a função Controle(). if(i == 1) { scanf("%d", &linha); while(getchar() != '\n')//Limpa stream de entrada. linha = -1;//Se o usuário mandar, por exemplo, 1d como escolha da linha, não será permitido. } if(i == 2) { scanf("%d", &coluna); while(getchar() != '\n')//Limpa stream de entrada. coluna = -1;//Se o usuário mandar, por exemplo, 2f como escolha da coluna, não será permitido. if(VerificaPosicaoExistente(linha, coluna)) { if(VerificaPosicao(posicoes, linha, coluna)) { ErroMensagens(1); system("pause"); linha = coluna = -1; i = 0; } else break; } else { ErroMensagens(0); system("pause"); linha = coluna = -1; i = 0; } } } if(vez == 1) posicoes[linha-1][coluna-1] = 'X'; if(vez == 2) posicoes[linha-1][coluna-1] = 'O'; } void ZeraTabuleiro(int posicoes[][MAX]) { for(int linha = 0; linha < MAX; linha++) for(int coluna = 0; coluna < MAX; coluna++) posicoes[linha][coluna] = ' '; } void Clear(void) { for(int i = 0; i < 100; i++) putchar('\n'); } int VerificaPosicaoExistente(int linha, int coluna) { if(linha >= 1 && linha <= MAX) { if(coluna >= 1 && coluna <= MAX) return 1; else return 0; } else return 0; } int VerificaPosicao(int posicoes[][MAX], int linha, int coluna) { if(posicoes[linha - 1][coluna - 1] == 'X' || posicoes[linha - 1][coluna - 1] == 'O') return 1; else return 0; } int VerificaVitoria(int posicoes[][MAX]) { int linha, coluna, j1 = 0, j2 = 0; //Verifica vitória na horizontal. for(linha = 0; linha < MAX; linha++) { for(coluna = 0; coluna < MAX; coluna++) { if(posicoes[linha][coluna] == 'X') j1++; if(posicoes[linha][coluna] == 'O') j2++; } if(j1 == 3) return 1; else j1 = 0; if(j2 == 3) return 2; else j2 = 0; } //Verifica vitória na vertical. for(coluna = 0; coluna < MAX; coluna++) { for(linha = 0; linha < MAX; linha++) { if(posicoes[linha][coluna] == 'X') j1++; if(posicoes[linha][coluna] == 'O') j2++; } if(j1 == 3) return 1; else j1 = 0; if(j2 == 3) return 2; else j2 = 0; } //Verifica 'X' na diagonal da esquerda para direita '\' if(posicoes[0][0] == 'X' && posicoes[1][1] == 'X' && posicoes[2][2] == 'X') return 1; //Verifica 'O' na diagonal da esquerda para direita '\' if(posicoes[0][0] == 'O' && posicoes[1][1] == 'O' && posicoes[2][2] == 'O') return 2; //Verifica 'X' na diagonal da direita para esquerda '/' if(posicoes[0][2] == 'X' && posicoes[1][1] == 'X' && posicoes[2][0] == 'X') return 1; //Verifica 'O' na diagonal da direita para esquerda '/' if(posicoes[0][2] == 'O' && posicoes[1][1] == 'O' && posicoes[2][0] == 'O') return 2; return 0; } void ErroMensagens(int mensagem) { char erromensagens[2][40] = {"Posicao inexistente. Tente novamente!!\n", "Posicao ocupada. Tente outra posicao!!\n"}; Clear(); printf("%s", erromensagens[mensagem]); } void printaLinha(char *chars, int linha) { switch(linha) { case 1: *chars = '1'; break; case 2: *chars = '2'; break; case 3: *chars = '3'; break; } }
  3. Que vergonha alheia desse post que fiz, nao sei como eu escrevi esse codigo. Mds como sou burro... Não tem nada haver com o algoritmo de inserção.
  4. Olá ,queria saber se esse codigo que criei seria a mesma coisa do algoritmo de ordenação por inserção. Tentei me expressar bem nos comentarios para que entendam. Tentei criar esse algoritmo escrito de uma maneira diferente do que é apresentado nos livros e tal. Ele ta apresentando o resultado final tudo ok, mas fui ver a quantidade de trocas desse meu código com outro de um livro , vi que esse meu faz muito mais trocas dai me surgiu a duvida se realmente fiz ele certo. #include <stdio.h> #include <string.h> void inserction(char *p, int caracs); int main() { char s[10]; printf("Digite uma string:\n"); scanf("%10[^\n]", s); printf("--------------------------------------------------------------\n"); printf("String antes de ser ordenada por Inserction(InserctionSort)\n\t%s\n", s); inserction(s, strlen(s)); printf("String depois de ser ordenada por Inserction(InserctionSort)\n\t%s\n", s); return 0; } void inserction(char *p, int caracs) { for(int i=0; i<caracs-1; i++)// controlador da posição atual do vetor { for(int j=i+1; j<caracs; j++)// controlador da posição sucessora da atual posição { if(p[j] < p[i])// comparação da a posição atual com o seu sucessor. Caso V, declara uma //variável temporária e faz as trocas { char t; t = p[i]; p[i] = p[j]; p[j] = t; if(i >= 1 && p[i] < p[i-1])//começo da comparação com o antecessor. Caso V, faz as trocas { t = p[i-1]; p[i-1] = p[i]; p[i] = t; } } } } } Desde já obrigado!! O código de livro que me referi foi esse aqui: #include <stdio.h> #include <string.h> void insert(char *item, int count); int main() { char s[10]; printf("Digite uma string:\n"); scanf("%10[^\n]", s); printf("---------------------------------------------------\n"); printf("String antes de ser ordenado por inserção: %s\n", s); insert(s, strlen(s)); printf("\nString depois de ser ordenado por inserção: %s\n", s); return 0; } void insert(char *item, int count) { int a, b; char t; for(a=1; a<count; ++a) { t = item[a]; for(b=a-1; b>=0 && t<item[b]; b--) { item[b+1] = item[b]; } item[b+1] = t; } }
  5. Ajudou sim. Esse compound literals faz total sentido com oque eu estava pensando e tentando fazer. Inclusive nunca tinha ouvido falar nele antes, provavelmente tem no livro que estou estudando, mas não cheguei nessa parte ainda. Enfim, obrigado!!
  6. https://overiq.com/c-programming-101/character-array-and-character-pointer-in-c/ Esse site explica bem o que acontece fazendo: char *p = "testando"; char P[] = "testando"; O que na minha cabeça deveria ser a mesma coisa para: int *i = {1,3,5,7,8}; int I[] = {1,3,5,7,9}; Mas nao funciona da mesma forma, então estou procurando saber o porque, mas não encontro em canto algum.
  7. #include <stdio.h> #include <stdlib.h> void main(){ char *c = "testando"; // Porque aqui é possivel criar um vetor de caracteres na declaração de um ponteiro para char int *i = {1,3,5,7,9}; // mas aqui não é possivel criar um vetor de inteiros na declaração de um ponteiro para inteiros? } Editei pq estava muito confuso da forma que perguntei antes, agora ta mais resumido a dúvida.
  8. pior que consegui de uma forma parecida com essa sua '-'. pior ainda que eu tinha testado essa forma ontem e nao tava dando certo, por isso vim perguntar aqui, mas acho que por engano devo ter aberto o arquivo no modo "wb" sendo que queria ler, dai tava dando um numero aleatório... Mas enfim o importante é aprender uahsuahsua. #include <stdio.h> #include <stdlib.h> typedef struct{ long int numero; }addr; addr teste; void main(){ FILE *p = fopen("teste", "rb"); if(p == NULL){ printf("ERRO"); exit(1); } fread(&teste,sizeof(addr),1,p); fclose(p); printf("Numero: %ld\n", teste.numero); } Cara eu juro que fiz dessa forma ontem e nao estava pegando,eu devia estar muito cansado ja de tanto ler.
  9. Não man, o que você fez foi ler o conteúdo de um arquivo texto. A minha duvida é se é possivel fazer a leitura de apenas um campo de uma struct que está em um arquivo BINÁRIO. Mas obrigado por tentar ajudar.
  10. Já tentei sem sucesso 😕
  11. mandelacruz

    Dúvida em C

    Duvida abaixo:
×
×
  • Create New...