Ir para conteúdo
Fórum Script Brasil

vangodp

Membros
  • Total de itens

    883
  • Registro em

  • Última visita

Tudo que vangodp postou

  1. vangodp

    Duvida do CODIGO

    O operador % que se chama "modulo", serve para obter o resto de uma divisão. Se ao usar o operador de divisão(/), para por exemplo dividir "int resultado = 5/2", o resultado seria igual a 2. Porem sobra 1 correto? E se isso for exatamente o que eu quero? Saber o resto da divisão, e não o valor? Então uso modulo. Então no "int resultado = 5%2" resultado seria 1. Com isso você já sabe para que serve o operador modulo. Ao entrar no for por primeira vez(E só essa primeira vez), tanto i como k receben os valores de 0 e 1 respectivamente. logo começa a repetir k=k+i%2 até que se de a condição de i<k(i menor que k). Sendo assim a melhor estratégia para essas coisas é anotar em um papel tudo o que for acontecendo. E também é bom usar o proprio programa para ir imprimindo para nós os valores e assim ser possível a compreensão do problema. Isso mostro logo em seguida. Outro ponto em destacar é que não sei se é do seu conhecimento porem os operadores tem uma prioridade, ao igual que em matemáticas, por exemplo / tem prioridade sobra + e -, etc. isso você pode ver nesta pagina: https://pt.wikipedia.org/wiki/Operadores_em_C_e_C%2B%2B Nesta tabela: Por exemplo, na linha: o operador ++(incremento) tem prioridade sobre o operador --(decremento). Porque ++ esta primeiro. Porem ao mesmo tempo tanto o operador de incremento como o de decremento tem prioridade aos parêntesis pois o parêntesis se encontra mais abaixo na tabela. O que da para entender que a ordem de prioridades funciona mais ou menos desta forma: ou seja que a ordem seria esta ++, --, (), [], ., ->... Acho que deu para entender como funciona as prioridades. Porque eu to explicando isso? Porque se você for na tabela, na sua expressão k=k+i%2 você tem 3 operadores =, + e o %. Esqueça o operador =, mas os operadores de soma e modulo, um tem maior prioridade que o outro, modulo tem prioridade ao operador de soma, então na parte de k+i%2 vai ter prioridade i%2, ou seja vai ser obtido o resultado de i%2 e o resultado disto seria somado a k. para ficar mais claro aconteceria isso k=k+(i%2). Agora vamos usar o próprio programa para que nos diga em cada momento o valor das variáveis. Para isso vamos alterar ele para imprimir ditos valores. #include <stdio.h> int i, j, k; int main() { printf("Antes de entrar no main as variaveis i, j e k tem os seguintes valores:\n"); printf("i=%d\n", i); printf("j=%d\n", j); printf("k=%d\n\n", k); //As variaveis i, j e k podem gerar numeros ao "azar", pois podem conter lixo já que podem //ocupar o lugar na memoria que antes tivesse outro variavel de outro programa qualquer que //tenha liberado esse espaço porem deixou lá seus valores antigos. for ( //atribuição: Somente acontece uma vez pois não há logica em atribuir valores mais de //uma vez para as variaveis que estiverem nesta parte i = 0, j = 1, k = 2, printf("Dentro do for as variaveis tomaram o valor de:\n"), printf("i=%d\n", i), printf("j=%d\n", j), printf("k=%d\n\n", k); //condição: Acontece cada vez antes de entrar no corpo do for{}, por encuanto i for menor que k // da verdadeiro(true), por encuanto tiver um true nesta parte o programa continua rodando. Se // i llegar a ser igual o maior que k será gerado um false, pois i n será menor que k, neste momento //já n se executará mais o corpo do programa -> {k = k + i % 2;}. E i já não se incrementará mais no seguinte passo. i < k; //Alteração de valores: //Nesta parte se alteram os valores das variaveis conforme a necessidade do //programador. Essa parte acontece todas as vezes que o for rodar, igual que a ultima //parte. Importante! Esta depende da anterior, já que se for gerado um false na parte da condição //não chegará a entrar nesta. i++, printf("Agora seus valores são:\n"), printf("i=%d\n", i), printf("j=%d\n", j), printf("k=%d\n\n", k) ) { //Corpo do programa printf("A expressao k = k + i %% 2 é realizada\n"); printf ("Antes da expresao %d = %d + %d %% 2 \n", k, k, i); k = k + i % 2; printf ("Depois da expresao %d = %d + %d %% 2 \n\n", k, k, i); } printf ( "%d,%d,%d", i, j, k ); } Vou deixar aqui também o fonte, por que as vezes ao copiar código de esta pagina gera error, então neste caso melhor baixar o fonte. http://cpp.sh/9b5fs
  2. vangodp

    EOF, '\0' e '\n'

    não... para nada. Perfeito.👌
  3. usa o botão <> para postar o código 👋
  4. vangodp

    STRUCT C

    tirar & quando for ler strings ou ponteiros dos scanfs. E certamente você tem lixo no buffer, procure limpar o buffer.
  5. crie um array com os dados e passe pela tal função hash em um laço
  6. https://www.clubedohardware.com.br/forums/topic/1342345-erro-na-execução-de-um-algoritmo-em-c-com-ponteiros/?do=findComment&amp;comment=7322140
  7. Não sei seu nível de Inglês mas se buscar por "bounding box collision" certamente vai encontrar o que está procurando. Neste video o cara explica como calcular as colisões, porem para sdl sfml.
  8. para que alguém fosse capaz de lhe ajudar deveria entender como funciona o sistema de coordenadas da megadrive.
  9. Seria melhor usar a etiqueta <> para postar os códigos
  10. Se supõe que deve ter a vez do jogador 1 e a vez do 2, dependendo da vez do jogador atual você comprova com um if. Vamos supor que jogador 1 é X, e que jogador 2 é O, deveria ter uma variavel int player que inicializara com o valor de 1, e que passado a vez de um jogador deveria incrementar mas nunca passar de 2, se isso acontecer deve voltar ao valor de 1. Vamos ver na pratica. #include <stdio.h> #include <stdlib.h> #define dim 3 typedef struct Cordenadas{ int x; int y; }Ponto; void tabuleiro(char vetores[dim][dim]){ printf("\t\%c|%c|%c\n",vetores[0][0],vetores[0][1],vetores[0][2]); printf("\t-----\n"); printf("\t%c|%c|%c\n",vetores[1][0],vetores[1][1],vetores[1][2]); printf("\t-----\n"); printf("\t%c|%c|%c\n",vetores[2][0],vetores[2][1],vetores[2][2]); } int main(){ char vetores [dim][dim]={{' ',' ',' '},{' ',' ',' '},{' ',' ',' '}}; int sair = 0; int vencedor = 0; int player = 0; //Começa com player 1. Player1 = 0 e Player2 = 1; Ponto ponto; while ( sair != 1 ){//Por incuanto não tiver um vencedor continua rodando system("cls"); tabuleiro(vetores); printf("É a vez do jogador %d. Escolha sua jogada.\n", (player == 0)? 1 : 2); printf("Linha?: "); scanf("%d%*c", &ponto.x); printf("Coluna?: "); scanf("%d%*c", &ponto.y); system("cls"); printf("Escolheu a posicao %d%d.", ponto.x, ponto.y); vetores[ponto.x][ponto.y] = (player == 0)? 'X' : 'O'; //Si se tratar do player 0(player1) vai botar um X no mapa, caso contrario se trata do outro player, e neste caso bota um O. ;) Essa era sua duvida //Verificar aqui si tem vencedor... //Verificar se por exemplo aconteceu 3 X na linha1. linha0 == X X X if ( vetores[0][0] == 'X' && vetores[0][1] == 'X' && vetores[0][2] == 'X' ){ sair = 1; vencedor = 0; //Vencedor player 1 } //verificar os outros casos //Só incrementamos si NÃO há um vencedor. Vai nos servir para informar qual foi o vencedor no final, por isso não pode incrementar depois de ter um jogador vitorioso. if (sair != 1){ player++; player = ((player)%2); } } system("cls"); //informar vencedor printf("O vencedor é o player %s", (vencedor == 0)? "PLAYER1" : "Player2" ); } Tenta entender... e si tiver duvidas pergunte
  11. Sujeira no buffer. Limpe o buffer depois de cada leitura, sobre tudo antes de ler chars ou strings.
  12. procure no google "Tipos de dados em C/C++" e você verá alguns
  13. Eu não sou muito bom em matematicas não, mas se você usar o google vai até sair algumas "coisinhas" hihihi https://stackoverflow.com/questions/8496182/calculating-powa-b-mod-n #include<stdio.h> int modulo(int a, int b, int n){ long long x=1, y=a; while (b > 0) { if (b%2 == 1) { x = (x*y) % n; // multiplying with base } y = (y*y) % n; // squaring the base b /= 2; } return x % n; } int main(){ printf("%d", modulo(131, 23, 187)); return 0; }
  14. É bem util acostumar a chamar perror depois de abrir um programa. Seria muito bom você acostumar abrir um arquivo da seguinte forma pois você comprova possiveis erros de abertura: #include<stdio.h> int main(){ FILE* arq; char* nomeArquivo = "teste.txt"; //Comprovando if( (arq=fopen( nomeArquivo,"r"))==NULL){//Si fopen retornar nullo... //Se o arquivo NÃO caimos aqui perror("Erro"); //Perror vai informar o por que. Pode ser porque o arquivo não existe, ou pode que você não tenha permisão, ou haja um erro... realmente podem ser muitos erros, por isso é importante chamar o perror para saber. puts("Aperte uma tecla para sair."); getchar(); return 1; // Termina com o código do erro 1 e sai do programa. } /* Se o arquivo abriu caimos aqui, é dizer, si o fopen retornou qualquer outra coisa que não seja null então caimos aqui, e podemos seguir. Recorde que precisa fechar o arquivo com fclose antes de sair ou en outros casos. */ return 0; } Agora bem... isso quer dizer uma palavra por linha certo? Se for assim bastaria você usar fscanf para ler cada uma das palavras: #include<stdio.h> int main(){ FILE* arq; char* nomeArquivo = "teste.txt"; char palavra[100]; //Comprovando if( (arq=fopen( nomeArquivo,"r"))==NULL){//Si fopen retornar nullo... //Se o arquivo NÃO caimos aqui perror("Erro"); //Perror vai informar o por que. Pode ser porque o arquivo não existe, ou pode que você não tenha permisão, ou haja um erro... realmente podem ser muitos erros, por isso é importante chamar o perror para saber. puts("Aperte uma tecla para sair."); getchar(); return 1; // Termina com o código do erro 1 e sai do programa. } /* Se o arquivo abriu caimos aqui, é dizer, si o fopen retornou qualquer outra coisa que não seja null então caimos aqui, e podemos seguir. Recorde que precisa fechar o arquivo com fclose antes de sair ou en outros casos. */ //Repete até o fim do arquivo while( fscanf(arq, "%s", palavra) != EOF ){// lê uma palavra printf("%s\n", palavra); // imprime uma palavra } return 0; } Então agora quer dizer que você lê uma linha e guarda essa linha no vetor palavra, agora seria só tratar essa palavra como quiser.
  15. vangodp

    Iniciando um array

    quando você declarar qualquer variavel, essa pode conter lixo. Prove declarando bool e dando um valor inicial. #include <iostream> using namespace std; int main () { bool padrão[100] = {false}; padrão[0]=padrão[10]=padrão[35]=padrão[83]= true; unsigned int contador = 0; while ( contador < 100 ) { if (padrão[contador]!=true){ cout << "if: " << contador << endl; }else{ cout << "else: " << contador << endl; } contador++; } cin.ignore(); return 0; }
×
×
  • Criar Novo...