Ir ao conteúdo
  • Cadastre-se

kampa896

Membro Pleno
  • Posts

    77
  • Cadastrado em

  • Última visita

Tudo que kampa896 postou

  1. @Alexsander Gutierrez você me explicou em poucos minutos o que estou horas pesquisando. Muito obrigado, meu amigo!
  2. Muito obrigado @Alexsander Gutierrez, realmente o que estava faltando é o arrow function. Porém esbarrei em outro problema. O primeiro foi adicionar o evento, e agora quero retirar. Após ser declarado o jogador vencedor, os eventos de adicionar elementos no tabuleiro continua funcionando. Eu quero deixar sem eventos, após declarado o vencedor. Porém, a minha função "removeClicks" adicionada após a declaração dos vencedores não funciona. Pesquisei usando até o ChatGPT e não localizo o erro, pois ele retorna que está tudo certo. Sabe orientar onde está o erro? let jogadoresAtivos = false; function removeClicks() { const btnClick = document.querySelectorAll('.table-data'); btnClick.forEach(function (elemento) { elemento.removeEventListener('click', setOnCeil); }); } function cellWins(cell) { cell.style.border = '8px solid #F94A29'; cell.style.backgroundColor = '#FC7300'; } window.onload = function () { document.getElementById('players').style.visibility = 'hidden'; document.getElementById('jogadorAtual').style.visibility = 'hidden'; document.getElementById('jogo').style.visibility = 'hidden'; }; const infoBtn = document.getElementById('info'); infoBtn.addEventListener('click', () => { alert( 'Jogo da Velha feito com HTML, CSS e JavaScript\n' + 'Desenvolvido por: @campanaricarlos\n' + 'GitHub: https://github.com/ccampa896\n' + 'LinkedIn: https://www.linkedin.com/in/carlos-campanari-9b4b3b1b3/\n' ); }); const iconsBtn = document.getElementById('icons'); iconsBtn.addEventListener('click', () => { alert('Icons by https://icons.getbootstrap.com/'); }); function useLightTheme() { document.body.style.color = '#212529'; document.body.style.backgroundColor = '#f1f5f9'; const hash = document.getElementById('hashtag'); const controller = document.getElementById('controller'); hash.style.border = '0px solid #fff'; controller.style.border = '0px solid #fff'; } function useDarkTheme() { document.body.style.color = '#f1f5f9'; document.body.style.backgroundColor = '#212529'; const hash = document.getElementById('hashtag'); const controller = document.getElementById('controller'); hash.style.margin = '10px'; controller.style.margin = '10px'; hash.style.border = '5px solid #fff'; controller.style.border = '5px solid #fff'; hash.style.borderRadius = '10px'; controller.style.borderRadius = '10px'; } const lightBtn = document.getElementById('is-light'); const darkBtn = document.getElementById('is-dark'); lightBtn.addEventListener('click', useLightTheme); darkBtn.addEventListener('click', useDarkTheme); function jogadores() { let elementos = document.querySelectorAll('.tresD'); elementos.forEach(function (elemento) { elemento.remove(); }); document.getElementById('players').style.visibility = 'visible'; } const btnJogadores = document.getElementById('jogadores'); btnJogadores.addEventListener('click', jogadores); let NomeJogador1 = ''; let NomeJogador2 = ''; const btnSubmit = document.getElementById('submit'); btnSubmit.addEventListener('click', () => { NomeJogador1 = document.getElementById('jogador1').value; NomeJogador2 = document.getElementById('jogador2').value; jogadoresAtivos = true; alert( 'Jogadores cadastrados!\n' + 'Jogador 1: ' + NomeJogador1 + '\n' + 'Jogador 2: ' + NomeJogador2 ); let elementos = document.querySelectorAll('#players'); document.getElementById('jogador1').value = ''; document.getElementById('jogador2').value = ''; elementos.forEach(function (elemento) { elemento.remove(); }); }); function Jogador(nome, forma) { this.nome = nome; this.forma = forma; } let jogador1, jogador2; //Jogador da rodada let jogadorAtual; let formas = ['X', 'O']; /* 0 1 2 3 4 5 6 7 8 */ let tabuleiro = new Array(9); const setLabelJogadorAtual = function () { document.getElementById('jogadorAtualh3').innerHTML = 'Jogador atual: ' + jogadorAtual.nome; }; function iniciarJogo() { if (jogadoresAtivos) { alert( 'Para iniciar um novo jogo, clique em "Reiniciar"\n' + 'Ou clique em "Parar jogo" para finalizar o jogo atual!' ); alert( 'Jogo iniciado!\n' + 'Jogador 1: ' + NomeJogador1 + '\n' + 'Jogador 2: ' + NomeJogador2 + '\n' + 'Boa sorte!' ); jogador1 = new Jogador(NomeJogador1, 0); //X jogador2 = new Jogador(NomeJogador2, 1); //O jogadorAtual = jogador1; setLabelJogadorAtual(); document.getElementById('jogadorAtual').style.visibility = 'visible'; document.getElementById('jogo').style.visibility = 'visible'; } else { alert('Você precisa informar os jogadores!'); } } const btnIniciarJogo = document.getElementById('iniciarJogo'); btnIniciarJogo.addEventListener('click', iniciarJogo); /*Verifica se o tabuleiro está completamente preenchido, se estiver, significa que ninguém venceu a rodada*/ tabuleiroIsFilled = function () { let preenchidos = 0; for (let i = 0; i < tabuleiro.length; i++) if (tabuleiro[i] != undefined) preenchidos++; return preenchidos == tabuleiro.length; }; /*Verifica a existência de ocorrências de um mesmo elemento(X ou O) nas linhas do tabuleiro, procurando um vencedor*/ const table_datas = document.querySelectorAll('.table-data'); allElementsInSomeLine = function () { for (let i = 0; i < 7; i += 3) { if ( tabuleiro[i] == 'X' && tabuleiro[i + 1] == 'X' && tabuleiro[i + 2] == 'X' ) { cellWins(table_datas[i]); cellWins(table_datas[i + 1]); cellWins(table_datas[i + 2]); alert(jogador1.nome + ' wins!!!'); removeClicks(); } if ( tabuleiro[i] == 'O' && tabuleiro[i + 1] == 'O' && tabuleiro[i + 2] == 'O' ) { cellWins(table_datas[i]); cellWins(table_datas[i + 1]); cellWins(table_datas[i + 2]); alert(jogador2.nome + ' wins!!!'); removeClicks(); } } }; /*Verifica a existência de ocorrências de um mesmo elemento(X ou O) nas colunas do tabuleiro, procurando um vencedor*/ allElementsInSomeColumn = function () { for (let i = 0; i < 3; i++) { if ( tabuleiro[i] == 'X' && tabuleiro[i + 3] == 'X' && tabuleiro[i + 6] == 'X' ) { cellWins(table_datas[i]); cellWins(table_datas[i + 3]); cellWins(table_datas[i + 6]); alert(jogador1.nome + ' wins!!!'); removeClicks(); if ( tabuleiro[i] == 'O' && tabuleiro[i + 3] == 'O' && tabuleiro[i + 6] == 'O' ) { cellWins(table_datas[i]); cellWins(table_datas[i + 3]); cellWins(table_datas[i + 6]); alert(jogador2.nome + ' wins!!!'); removeClicks(); } } } }; /*Verifica a existência de ocorrências de um mesmo elemento(X ou O) nas diagonais do tabuleiro, procurando um vencedor*/ allElementsInSomeDiagonal = function () { if (tabuleiro[0] == 'X' && tabuleiro[4] == 'X' && tabuleiro[8] == 'X') { alert(jogador1.nome + ' wins!!!'); cellWins(table_datas[0]); cellWins(table_datas[4]); cellWins(table_datas[8]); removeClicks(); } else if ( tabuleiro[2] == 'X' && tabuleiro[4] == 'X' && tabuleiro[6] == 'X' ) { alert(jogador1.nome + ' wins!!!'); cellWins(table_datas[2]); cellWins(table_datas[4]); cellWins(table_datas[6]); removeClicks(); } else if ( tabuleiro[0] == 'O' && tabuleiro[4] == 'O' && tabuleiro[8] == 'O' ) { alert(jogador2.nome + ' wins!!!'); cellWins(table_datas[0]); cellWins(table_datas[4]); cellWins(table_datas[8]); removeClicks(); } else if ( tabuleiro[2] == 'O' && tabuleiro[4] == 'O' && tabuleiro[6] == 'O' ) { alert(jogador2.nome + ' wins!!!'); cellWins(table_datas[2]); cellWins(table_datas[4]); cellWins(table_datas[6]); removeClicks(); } }; const btnCell0 = document.getElementById('cell0'); const btnCell1 = document.getElementById('cell1'); const btnCell2 = document.getElementById('cell2'); const btnCell3 = document.getElementById('cell3'); const btnCell4 = document.getElementById('cell4'); const btnCell5 = document.getElementById('cell5'); const btnCell6 = document.getElementById('cell6'); const btnCell7 = document.getElementById('cell7'); const btnCell8 = document.getElementById('cell8'); /*Preenche a célula da tabela HTML escolhida pelo usuário ao clicar, além de cuidar do jogador atual da rodada e chamar as funções de verificação de algum ganhador */ function setOnCeil(cell, pos) { if (tabuleiro[pos] == undefined) { cell.innerText = formas[jogadorAtual.forma]; tabuleiro[pos] = formas[jogadorAtual.forma]; if (jogadorAtual == jogador1) { jogadorAtual = jogador2; } else { jogadorAtual = jogador1; } setLabelJogadorAtual(); } else { alert('Célula já preenchida! Escolha outra!'); } allElementsInSomeLine(); allElementsInSomeColumn(); allElementsInSomeDiagonal(); if (tabuleiroIsFilled()) { alert('Nobody wins! :(. Try Again'); pararJogo(); } } btnCell0.addEventListener('click', () => { setOnCeil(btnCell0, 0); }); btnCell1.addEventListener('click', () => { setOnCeil(btnCell1, 1); }); btnCell2.addEventListener('click', () => { setOnCeil(btnCell2, 2); }); btnCell3.addEventListener('click', () => { setOnCeil(btnCell3, 3); }); btnCell4.addEventListener('click', () => { setOnCeil(btnCell4, 4); }); btnCell5.addEventListener('click', () => { setOnCeil(btnCell5, 5); }); btnCell6.addEventListener('click', () => { setOnCeil(btnCell6, 6); }); btnCell7.addEventListener('click', () => { setOnCeil(btnCell7, 7); }); btnCell8.addEventListener('click', () => { setOnCeil(btnCell8, 8); }); function pararJogo() { if (jogadoresAtivos) { alert( 'Jogo finalizado!\n' + 'Obrigado por jogar!\n' + 'Página recarregada!' ); jogadoresAtivos = false; window.location.reload(); } else { alert('O jogo não foi iniciado!\n' + 'Comece um novo jogo!'); } } const btnPararJogo = document.getElementById('pararJogo'); btnPararJogo.addEventListener('click', pararJogo); const btnJogoDaVelha = document.getElementById('jogo_wiki'); btnJogoDaVelha.addEventListener('click', () => { alert('Página recarregada!\n' + 'Você será redirecionado para a Wikipédia!'); window.location.reload(); window.open('https://pt.wikipedia.org/wiki/Jogo_da_velha'); }); const btnResetarJogo = document.getElementById('reset'); btnResetarJogo.addEventListener('click', () => { alert('Página recarregada!\n' + 'Jogo resetado!'); window.location.reload(); });
  3. Pessoal, bom dia. Não consigo achar o erro de lógica ou de escopo da minha variável "jogadorAtual" para este jogo simples de jogo da velha. O console do navegador apresenta o seguinte erro: "Uncaught TypeError: jogadorAtual is undefined". Os códigos da página: HTML: <!DOCTYPE html> <html lang="pt-BR"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Jogo da Velha</title> <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-aFq/bzH65dt+w6FI2ooMVUpc+21e0SRygnTpmBvdBgSdnuTN7QbdgL+OapgHtvPp" crossorigin="anonymous" /> <link rel="stylesheet" href="./style.css" /> <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-qKXV1j0HvMUeCBQ+QVp7JcfGl760yU08IQ+GpUo5hlbpg51QRiuqHAJz8+BrxE/N" crossorigin="anonymous" ></script> <script src="./index.js" defer></script> </head> <header> <nav class="navbar bg-body-tertiary"> <div class="container-fluid"> <a class="navbar-brand" title="Jogo da Velha: Wikipédia, a enciclopédia livre" href="#" id="jogo_wiki" > <img src="./imagens/hash.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Jogo da Velha </a> <a class="navbar-brand" id="jogadores" href="#"> <img src="./imagens/person-fill.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Jogadores </a> <a class="navbar-brand" id="iniciarJogo" href="#"> <img src="./imagens/play-circle.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Iniciar </a> <a class="navbar-brand" href="#"> <img src="./imagens/repeat.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Reiniciar </a> <a class="navbar-brand" id="pararJogo" href="#"> <img src="./imagens/x-lg.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Parar jogo </a> <a class="navbar-brand" id="is-light" href="#"> <img src="./imagens/sun-fill.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Modo Claro </a> <a class="navbar-brand" id="is-dark" href="#"> <img src="./imagens/moon-fill.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Modo Escuro </a> <a class="navbar-brand" id="info" href="#"> <img src="./imagens/info.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Info </a> <a class="navbar-brand" id="icons" href="#"> <img src="./imagens/images.svg" alt="Logo" width="30" height="24" class="d-inline-block align-text-top" /> Icons </a> </div> </nav> </header> <body> <div class="clearfix"> <img src="./imagens/hash.svg" class="float-end" id="hashtag" alt="hashtag" /> <p> O jogo da velha (português brasileiro) ou jogo do galo (português europeu) ou três em linha é um jogo e/ou passatempo popular. É um jogo de regras extremamente simples, que não traz grandes dificuldades para seus jogadores e é facilmente aprendido. A origem é desconhecida, com indicações de que pode ter começado no antigo Egito, onde foram encontrados tabuleiros esculpidos na rocha, que teriam mais de 3.500 anos. De alguma forma, é um jogo "aparentado" dos "Merels". </p> <img src="./imagens/controller.svg" class="float-start" id="controller" alt="controller" /> <p> Algumas lendas urbanas contam que o jogo terá nascido em Portugal, na cidade de Almada no ano 545. No entanto, só foi popularizado no ano 1500, pelo descobridor Pedro Álvares Cabral, que adorava jogar este jogo durante as suas viagens. Álvares Cabral terá decidido que este jogo seria o primeiro a ser ensinado ao povo indígena no Brasil. O jogo pode ser jogado sobre um tabuleiro ou mesmo sendo riscado sobre um pedaço de papel ou mesa. O menor tabuleiro do mundo foi feito com DNA. </p> <p> Se os dois jogadores jogarem sempre da melhor forma, o jogo terminará sempre em empate. A lógica do jogo é muito simples, de modo que não é difícil deduzir ou decorar todas as possibilidades para efetuar a melhor jogada - apesar de o número total de possibilidades ser muito grande, a maioria delas é simétrica, além de que as regras são simples. Por esse motivo, é muito comum que o jogo empate (ou "dê velha"). </p> <br /> <div class="tresD"> <div class="front"> <img src="./imagens/notebook.png" alt="Tecnologia da Informação" /> </div> <div class="back"> <img src="./imagens/hash.png" alt="Tecnologia da Informação" /> </div> </div> </div> <div id="jogadorAtual"> <h3 id="jogadorAtualh3"></h3> </div> <div id="players"> <h3>Jogadores</h3> <label for="Jogador 1"> Jogador 1: </label> <input type="text" id="jogador1" /> <br /> <br /> <label for="Jogador 1"> Jogador 2: </label> <input type="text" id="jogador2" /> <br /> <br /> <input type="submit" id="submit" value="Ok" /> </div> <div id="jogo"> <table cellpadding="0" cellspacing="0" id="table"> <tr> <td class="table-data" id="cell0" > &nbsp; </td> <td class="table-data" id="cell1" > &nbsp; </td> <td class="table-data" id="cell2" > &nbsp; </td> </tr> <tr> <td class="table-data" id="cell3" > &nbsp; </td> <td class="table-data" id="cell4" > &nbsp; </td> <td class="table-data" id="cell5" > &nbsp; </td> </tr> <tr> <td class="table-data" id="cell6" > &nbsp; </td> <td class="table-data" id="cell7" > &nbsp; </td> <td class="table-data" id="cell8" > &nbsp; </td> </tr> </table> </body> </html> JavaScript: let jogadoresAtivos = false; function cellWins(cell) { cell.style.hover = 'transform: scale(1.2);'; } window.onload = function () { document.getElementById('players').style.visibility = 'hidden'; document.getElementById('jogadorAtual').style.visibility = 'hidden'; document.getElementById('jogo').style.visibility = 'hidden'; }; const infoBtn = document.getElementById('info'); infoBtn.addEventListener('click', () => { alert( 'Jogo da Velha feito com HTML, CSS e JavaScript\n' + 'Desenvolvido por: @campanaricarlos\n' + 'GitHub: https://github.com/ccampa896\n' + 'LinkedIn: https://www.linkedin.com/in/carlos-campanari-9b4b3b1b3/\n' ); }); const iconsBtn = document.getElementById('icons'); iconsBtn.addEventListener('click', () => { alert('Icons by https://icons.getbootstrap.com/'); }); function useLightTheme() { document.body.style.color = '#212529'; document.body.style.backgroundColor = '#f1f5f9'; const hash = document.getElementById('hashtag'); const controller = document.getElementById('controller'); hash.style.border = '0px solid #fff'; controller.style.border = '0px solid #fff'; } function useDarkTheme() { document.body.style.color = '#f1f5f9'; document.body.style.backgroundColor = '#212529'; const hash = document.getElementById('hashtag'); const controller = document.getElementById('controller'); hash.style.margin = '10px'; controller.style.margin = '10px'; hash.style.border = '5px solid #fff'; controller.style.border = '5px solid #fff'; hash.style.borderRadius = '10px'; controller.style.borderRadius = '10px'; } const lightBtn = document.getElementById('is-light'); const darkBtn = document.getElementById('is-dark'); lightBtn.addEventListener('click', useLightTheme); darkBtn.addEventListener('click', useDarkTheme); function jogadores() { let elementos = document.querySelectorAll('.tresD'); elementos.forEach(function (elemento) { elemento.remove(); }); document.getElementById('players').style.visibility = 'visible'; } const btnJogadores = document.getElementById('jogadores'); btnJogadores.addEventListener('click', jogadores); let NomeJogador1 = ''; let NomeJogador2 = ''; const btnSubmit = document.getElementById('submit'); btnSubmit.addEventListener('click', () => { NomeJogador1 = document.getElementById('jogador1').value; NomeJogador2 = document.getElementById('jogador2').value; jogadoresAtivos = true; alert( 'Jogadores cadastrados!\n' + 'Jogador 1: ' + NomeJogador1 + '\n' + 'Jogador 2: ' + NomeJogador2 ); let elementos = document.querySelectorAll('#players'); elementos.forEach(function (elemento) { elemento.remove(); }); }); function Jogador(nome, forma) { this.nome = nome; this.forma = forma; } let jogador1, jogador2; //Jogador da rodada let jogadorAtual; let formas = ['X', 'O']; /* 0 1 2 3 4 5 6 7 8 */ let tabuleiro = new Array(9); const setLabelJogadorAtual = function () { document.getElementById('jogadorAtualh3').innerHTML = 'Jogador atual: ' + jogadorAtual.nome; }; function iniciarJogo() { if (jogadoresAtivos) { alert( 'Para iniciar um novo jogo, clique em "Reiniciar"\n' + 'Ou clique em "Parar jogo" para finalizar o jogo atual!' ); alert( 'Jogo iniciado!\n' + 'Jogador 1: ' + NomeJogador1 + '\n' + 'Jogador 2: ' + NomeJogador2 + '\n' + 'Boa sorte!' ); jogador1 = new Jogador(NomeJogador1, 0); //X jogador2 = new Jogador(NomeJogador2, 1); //O jogadorAtual = jogador1; setLabelJogadorAtual(); document.getElementById('jogadorAtual').style.visibility = 'visible'; document.getElementById('jogo').style.visibility = 'visible'; } else { alert('Você precisa informar os jogadores!'); } } jogadorAtual = jogador1; const btnIniciarJogo = document.getElementById('iniciarJogo'); btnIniciarJogo.addEventListener('click', iniciarJogo); /*Verifica se o tabuleiro está completamente preenchido, se estiver, significa que ninguém venceu a rodada*/ tabuleiroIsFilled = function () { let preenchidos = 0; for (let i = 0; i < tabuleiro.length; i++) if (tabuleiro[i] != undefined) preenchidos++; return preenchidos == tabuleiro.length; }; /*Verifica a existência de ocorrências de um mesmo elemento(X ou O) nas linhas do tabuleiro, procurando um vencedor*/ allElementsInSomeLine = function () { for (let i = 0; i < 7; i += 3) { if ( tabuleiro[i] == 'X' && tabuleiro[i + 1] == 'X' && tabuleiro[i + 2] == 'X' ) { alert(jogador1.nome + ' wins!!!'); pararJogo(); } if ( tabuleiro[i] == 'O' && tabuleiro[i + 1] == 'O' && tabuleiro[i + 2] == 'O' ) { alert(jogador2.nome + ' wins!!!'); pararJogo(); } } }; /*Verifica a existência de ocorrências de um mesmo elemento(X ou O) nas colunas do tabuleiro, procurando um vencedor*/ allElementsInSomeColumn = function () { for (let i = 0; i < 3; i++) { if ( tabuleiro[i] == 'X' && tabuleiro[i + 3] == 'X' && tabuleiro[i + 6] == 'X' ) { alert(jogador1.nome + ' wins!!!'); pararJogo(); } if ( tabuleiro[i] == 'O' && tabuleiro[i + 3] == 'O' && tabuleiro[i + 6] == 'O' ) { alert(jogador2.nome + ' wins!!!'); pararJogo(); } } }; /*Verifica a existência de ocorrências de um mesmo elemento(X ou O) nas diagonais do tabuleiro, procurando um vencedor*/ allElementsInSomeDiagonal = function () { if ( (tabuleiro[0] == 'X' && tabuleiro[4] == 'X' && tabuleiro[8] == 'X') || (tabuleiro[2] == 'X' && tabuleiro[4] == 'X' && tabuleiro[6] == 'X') ) { alert(jogador1.nome + ' wins!!!'); pararJogo(); } else if ( (tabuleiro[0] == 'O' && tabuleiro[4] == 'O' && tabuleiro[8] == 'O') || (tabuleiro[2] == 'O' && tabuleiro[4] == 'O' && tabuleiro[6] == 'O') ) { alert(jogador2.nome + ' wins!!!'); pararJogo(); } }; /*Preenche a célula da tabela HTML escolhida pelo usuário ao clicar, além de cuidar do jogador atual da rodada e chamar as funções de verificação de algum ganhador */ function setOnCeil(cell, pos) { if (tabuleiro[pos] == undefined) { cell.textContent = jogadorAtual.forma; tabuleiro[pos] = jogadorAtual.forma; if (jogadorAtual == jogador1) { jogadorAtual = jogador2; } else { jogadorAtual = jogador1; } setLabelJogadorAtual(); } else { alert('Célula já preenchida! Escolha outra!'); } allElementsInSomeLine(); allElementsInSomeColumn(); allElementsInSomeDiagonal(); if (tabuleiroIsFilled()) { alert('Nobody wins! :(. Try Again'); pararJogo(); } } const btnCell0 = document.getElementById('cell0'); const btnCell1 = document.getElementById('cell1'); const btnCell2 = document.getElementById('cell2'); const btnCell3 = document.getElementById('cell3'); const btnCell4 = document.getElementById('cell4'); const btnCell5 = document.getElementById('cell5'); const btnCell6 = document.getElementById('cell6'); const btnCell7 = document.getElementById('cell7'); const btnCell8 = document.getElementById('cell8'); btnCell0.addEventListener('onclick', setOnCeil(btnCell0, 0)); btnCell1.addEventListener('onclick', setOnCeil(btnCell1, 1)); btnCell2.addEventListener('onclick', setOnCeil(btnCell2, 2)); btnCell3.addEventListener('onclick', setOnCeil(btnCell3, 3)); btnCell4.addEventListener('onclick', setOnCeil(btnCell4, 4)); btnCell5.addEventListener('onclick', setOnCeil(btnCell5, 5)); btnCell6.addEventListener('onclick', setOnCeil(btnCell6, 6)); btnCell7.addEventListener('onclick', setOnCeil(btnCell7, 7)); btnCell8.addEventListener('onclick', setOnCeil(btnCell8, 8)); const pararJogo = function () { if (jogadoresAtivos) { alert( 'Jogo finalizado!\n' + 'Obrigado por jogar!\n' + 'Página recarregada!' ); jogadoresAtivos = false; document.getElementById('jogador1').value = ''; document.getElementById('jogador2').value = ''; window.location.reload(); } else { alert('O jogo não foi iniciado!\n' + 'Comece um novo jogo!'); } }; const btnPararJogo = document.getElementById('pararJogo'); btnPararJogo.addEventListener('click', pararJogo); const btnJogoDaVelha = document.getElementById('jogo_wiki'); btnJogoDaVelha.addEventListener('click', () => { alert('Página recarregada!\n' + 'Você será redirecionado para a Wikipédia!'); window.location.reload(); window.open('https://pt.wikipedia.org/wiki/Jogo_da_velha'); }); CSS: * { padding: 0; margin: 0; box-sizing: border-box; } .clearfix { padding: 30px; text-align: justify; } .float-end { padding: 10px; height: 150px; width: 150px; } .float-start { padding: 10px; height: 150px; width: 150px; } .tresD { height: 400px; width: 220px; position: relative; perspective: 1000px; margin: 0 auto; } .front, .back { position: absolute; backface-visibility: hidden; transform-style: preserve-3d; transition: all 1s ease; } .front { transform: rotateY(0deg); } .back { transform: rotateY(180deg); } .tresD:hover .front { transform: rotateY(-180deg); } .tresD:hover .back { transform: rotateY(0deg); } #players { margin: 0 auto 50px; width: 250px; border: 2px solid black; background-color: #f2f2f2; padding: 20px; text-align: center; } h3 { font-size: 24px; color: #333; } label { font-size: 16px; color: #666; } #submit { margin-top: 4px; height: 25px; width: 150px; font-size: 14px; } #jogadorAtual { margin: 0 auto 50px; width: 250px; border: 2px solid black; background-color: #f2f2f2; padding: 20px; text-align: center; font-weight: bold; } #jogadorAtualh3 { font-size: 24px; color: #333; } #table { margin: 0 auto; width: 400px; border: 2px solid black; background-color: #f2f2f2; padding: 20px; text-align: center; } #table tr { height: 100px; } #table td { width: 100px; border: 1px solid black; font-size: 100px; } #table td:hover { border: 3px solid black; cursor: pointer; } #jogo { padding-bottom: 50px; }
  4. Pessoal, boa noite. Para praticar, estou utilizando o SGBD MySQL e o aplicativo MySQL Workbench com o banco de dados SAKILA, disponível em https://dev.mysql.com/doc/sakila/en/sakila-installation.html. E estou com a seguinte dúvida: ------------------------------------------------ 2. A gerência da rede deseja entender se no mês de maio de 2005 houve diferença na recorrência dos consumidores fidelizados (ou seja, que realizaram mais de um aluguel) entre as duas lojas. Seu desafio é escrever uma consulta que retorne o número médio de dias entre os aluguéis desses consumidores, por loja que estão registrados. Dicas de como construir essa consulta: - Descubra, primeiro, quem são os consumidores (pelo seu customer_id) que queremos analisar: realizaram dois ou mais aluguéis no mês de maio de 2005. Os consumidores analisados podem ser identificados usando o seguinte comando: SELECT customer_id AS id_consumidor, COUNT(rental_id) AS qtd_alugueis, DATE_FORMAT(rental_date, "%Y-%m") AS ano_mes FROM sakila.rental WHERE YEAR(rental_date) = 2005 AND MONTH(rental_date) = 5 GROUP BY customer_id, DATE_FORMAT(rental_date, "%Y-%m") HAVING qtd_alugueis >= 2 ORDER BY customer_id; ------------------------------------------------------------- - Depois, avalie a diferença de tempo entre cada aluguel e o seguinte, por consumidor. Você precisará de uma função de janela para isso. Podemos avaliar com o seguinte comando: WITH fid AS ( SELECT customer_id AS id_consumidor, COUNT(rental_id) AS qtd_alugueis FROM sakila.rental WHERE YEAR(rental_date) = 2005 AND MONTH(rental_date) = 5 GROUP BY customer_id HAVING qtd_alugueis >= 2 ORDER BY customer_id ) SELECT id_consumidor, rental_id, rental_date, LEAD(rental_date) OVER (PARTITION BY id_consumidor ORDER BY id_consumidor) FROM fid LEFT JOIN rental ON fid.id_consumidor = rental.customer_id WHERE YEAR(rental_date) = 2005 AND MONTH(rental_date) = 5; Neste último item, ele pede a diferença de tempo entre cada aluguel e o seguinte, porém eu não consegui achar em lugar nenhum alguma função de janela que trabalhe com função de datas. Alguém tem alguma dica em relação a essa questão?
  5. @arfneto desculpa a demora pra responder. Serviço e faculdade não tá fácil. Mas, mais uma vez, outra aula de linguagem C. Entreguei meu trabalho de uma forma mais simples, mas estou estudando estas formas que você me passou. Muito obrigado!
  6. Eu agradeço toda atenção e todo ensinamento compartilhado. Vou reler o material de estrutura de dados com uma outra visão depois dessa aula com esta visão simples, porém poderosa e objetiva!
  7. @arfnetomeu amigo, só tenho a agradecer sua paciência em me dar essa aula em C. Tem muito material que você postou para eu ler com calma e pesquisar. Mais uma vez, obrigado!
  8. @arfnetoa disciplina é sobre estrutura de dados, porém não entendi exatamente. Entendi que você quis dizer que usar exemplos de playlist de música não teria sentido em usar lista. Mas com seus ensinamentos localizei a função certa e como implementar no código. Muito obrigado, como sempre! Aproveitando a oportunidade e fugindo do item do tópico, linguagem C consegue apagar dados de um arquivo? Nas aulas iniciais aprendi a manipular lendo e escrevendo, mas nunca pensei em apagar. Neste exemplo, se eu quisesse apagar uma linha do arquivo CSV, teria como?
  9. Muito obrigado, eu vou pesquisar sobre isso e aguardo caso você encontre esses exemplos.
  10. @arfnetosobre os anexos você tem razão, não irá ocorrer de novo. E realmente, o exercício pediu uma simulação de playlist, por linha de comando, bem básica. Realmente não tem nada a ver, somente para fins didáticos. Usei variáveis grandes para eu poder entender o que elas significam, mas entendi o ponto que atrapalha a leitura, implementação e teste. Porém, cada nó dessa lista tem que ser uma música, e com o método que você utilizou aí em baixo eu ainda não consegui entender como meu programa vai ler os dados do arquivo CSV e inserir em cada nó da lista. Eu só queria entender a lógica para utilizar funções de leitura de um arquivo e inserir em cada nó de uma lista. Apesar de você ter toda razão em eu não utilizar o '\n' como delimitador, foi o modo que consegui usando as funções de leitura. Mas mesmo assim eu apenas consegui ler e jogar na tela, e não em cada elemento da lista. Mas suas observações são pertinentes como sempre, muito obrigado.
  11. Boa tarde, pessoal. Estou com uma dificuldade em um exercício de lista encadeada. Trata-se de uma simulação de playlist por linha de comando. Consegui fazer um que o programa lê todos os dados do teclado, porém eu gostaria de já ter algumas músicas cadastradas em um arquivo CSV. O código a seguir é o que funciona. #include <stdio.h> #include <stdlib.h> #include <string.h> int menu(); void InserirInicio(int num, char nome[20], char banda[20], int duracao[2]); int Remover(int num); void Listar(); struct playlist_Simples { int id; //criado número que será o identificador da música adicionada char nome[20]; //criado vetor para armazenar o nome da música com tamanho máximo de caracteres char banda[20]; //criado vetor para armazenar o nome da banda com tamanho máximo de caracteres int duracao[2]; //criado um vetor para armazenar os minutos e segundos em formato texto struct playlist_Simples *prox; } *Head; int main() { int op, num, duracao[2]; char nome[20], banda[20]; Head = NULL; while (1) { op = menu(); switch (op) { case 1: printf("Digite o ID da música: "); scanf("%d", &num); getchar(); printf("Digite o nome da música: "); fgets(nome, 20, stdin); nome[strlen(nome) - 1] = '\0'; printf("Digite o nome da banda: "); fgets(banda, 20, stdin); banda[strlen(banda) - 1] = '\0'; printf("Digite o tempo de duração: "); scanf("%d:%d", &duracao[0], &duracao[1]); getchar(); InserirInicio(num, nome, banda, duracao); break; case 2: int res; printf("Digite o numero a ser removido: "); scanf("%d", &num); getchar(); res = Remover(num); if (res == 1) printf("Música removida."); else printf("Música não encontrada."); break; case 3: Listar(); break; case 4: return 0; default: printf("Opção inválida.\n"); } } return 0; } int menu() { int op; printf("1.Inserir música\n"); printf("2.Remover música\n"); printf("3.Listar músicas\n"); printf("4.Sair\n"); printf("Digite sua escolha: "); printf("\n\n"); scanf("%d", &op); getchar(); return op; } void InserirInicio(int num, char nome[20], char banda[20], int duracao[2]){ struct playlist_Simples *NovoElemento; NovoElemento = (struct playlist_Simples *)malloc(sizeof(struct playlist_Simples)); NovoElemento->id = num; strcpy(NovoElemento->nome, nome); strcpy(NovoElemento->banda, banda); NovoElemento->duracao[0] = duracao[0]; NovoElemento->duracao[1] = duracao[1]; if (Head == NULL){ Head = NovoElemento; Head->prox = NULL; } else{ NovoElemento->prox = Head; Head = NovoElemento; } } int Remover(int num){ struct playlist_Simples *ElementoVarredura; ElementoVarredura = (struct playlist_Simples *)malloc(sizeof(struct playlist_Simples)); struct playlist_Simples *Anterior; Anterior = (struct playlist_Simples *)malloc(sizeof(struct playlist_Simples)); ElementoVarredura = Head; while(ElementoVarredura != NULL){ if(ElementoVarredura->id == num){ if(ElementoVarredura == Head){ Head = ElementoVarredura->prox; free(ElementoVarredura); return 1; } else{ Anterior->prox = ElementoVarredura->prox ; free(ElementoVarredura); return 1; } } else{ Anterior = ElementoVarredura; ElementoVarredura = ElementoVarredura->prox; } } return 0; } void Listar() { struct playlist_Simples *ElementoVarredura; ElementoVarredura = (struct playlist_Simples *)malloc(sizeof(struct playlist_Simples)); ElementoVarredura = Head; if (ElementoVarredura == NULL) { return; } while (ElementoVarredura != NULL) { printf("ID: %d; Nome: %s; Banda: %s; Duração: %d:%d\n", ElementoVarredura->id, ElementoVarredura->nome, ElementoVarredura->banda, ElementoVarredura->duracao[0], ElementoVarredura->duracao[1]); ElementoVarredura = ElementoVarredura->prox; } printf("\n\n"); return; } Porém eu gostaria que esta lista fosse previamente preenchida com dados de um arquivo CSV. #include <stdio.h> #include <stdlib.h> #include <string.h> struct playlist_Simples { char id; //criado número que será o identificador da música adicionada, em formato de caractere char nome[20]; //criado vetor para armazenar o nome da música com tamanho máximo de caracteres char banda[20]; //criado vetor para armazenar o nome da banda com tamanho máximo de caracteres char duracao[10]; //criado um vetor para armazenar os minutos e segundos em formato texto struct playlist_Simples *prox; } *Head; int main(){ FILE *arquivo; arquivo = fopen("album.csv", "ra"); while(feof(arquivo) == 0){ char n[20]; fgets(n, 20, arquivo); n[strlen(n) - 1] = '\0'; printf("%s\n", n); } return 0; } Como eu faço pra jogar esses dados iniciais para a lista encadeada? Não estou achando uma função de leitura que eu consiga jogar na lista, para depois poder adicionar outras manualmente. album.csv
  12. @mauro_b obrigado pela dica, meu amigo. Vendo as opções do UDebug você tinha razão. Porém ainda não é essa a resposta correta. Fiz a alteração conforme sua dica, mas continua dando 5% de erro. Mas obrigado mesmo assim! from sys import stdin lista = [] total = [] igual = False for line in stdin: if line == '': break valor = line.split('\n') qtd = int(valor[0]) for i in range(qtd): valores = input().split() if valores == []: continue else: minuto = int(valores[0]) dist = int(valores[1]) media = dist / minuto lista.append(media) if max(lista) == media: if i != 0: for j in range(i): if media == lista[j]: igual = True if not igual: total.append(i+1) tam = len(total) for i in range(tam): print(total[i]) lista.clear() total.clear() igual = False
  13. Senhores, estou com uma dúvida neste exercício, 2551, do site https://www.beecrowd.com.br/judge/pt/problems/view/2551. Verifiquei alguns casos de teste pelo site https://www.udebug.com/URI/2551, que serve para depuração e todos casos são válidos. Porém o julgador online ainda dá 5% de erro. Alguém poderia ajudar? from sys import stdin lista = [] total = [] igual = False for line in stdin: if line == '': break valor = line.split('\n') qtd = int(valor[0]) for i in range(qtd): valores = input().split() minuto = int(valores[0]) dist = int(valores[1]) media = dist / minuto lista.append(media) if max(lista) == media: if i != 0: for j in range(i): if media == lista[j]: igual = True if not igual: total.append(i+1) tam = len(total) for i in range(tam): print(total[i]) lista.clear() total.clear() igual = False
  14. @Midori eu entendi, meu amigo. Mas olha que estranho. A lista 'lista1' recebe o valor da lista 'total[n]'. Ou seja, a lista 'total' é uma lista de lista. A lista 'lista1' vai receber o valor da lista 'total' de índice 'n'. Se eu colocar o valor de 10^8 como diz no enunciado do exercício, a própria plataforma da erro de limite de memória, como postei aí em cima. Além do mais, a variável 'lista1' é uma variável local, que recebe os valores do 'range' do for a qual ela pertence. Então nunca terá um valor acima do índice, entende? Por isso que não estou entendendo este erro. Mas agradeço a atenção, meu amigo.
  15. @Midori sim, simplificar a função estourará no tempo. Sim, o desafio valeu a pena, pra entender a lógica utilizada na programação dinâmica. Eu só estou com dúvida na questão da lista mesmo. Porque que está dando erro IndexError. Mas vou continuar pesquisando. Obrigado pela atenção.
  16. @Midori eu abaixei o índice porque meu computador não consegue rodar... Mas deixa eu te perguntar. No meu código o índice fica igual a "n", que tem o mesmo valor de "num1". O programa não deveria entender que está dentro dos valores? Por IndexError é quando o índice não existe na lista, não é? Eu alterei conforme você comentou e apresentou memória excedida... é um número muito alto pra ser calculado, meu notebook travou algumas vezes que insisti pro programa rodar.
  17. Pessoal, boa tarde. Devido a faculdade, comecei a aprender um pouco de Python e testar os conhecimentos em sites de programação competitiva. Estou com um problema há um tempo e não consigo localizar a solução. total = [] acess = False n_0 = 0 n_1 = 0 n_2 = 0 n_3 = 0 n_4 = 0 n_5 = 0 n_6 = 0 n_7 = 0 n_8 = 0 n_9 = 0 numeros = input() vetor = numeros.split() num1 = int(vetor[0]) num2 = int(vetor[1]) for n in range(100000): total.append([acess, n_0, n_1, n_2, n_3, n_4, n_5, n_6, n_7, n_8, n_9]) while num1 != 0 and num2 != 0: for n in range(num1, (num2 + 1)): string = str(n) lista = list(string) lista1 = total[n] if lista1[0]: continue else: tam = len(string) for i in range(tam): if lista[i] == '0': n_0 += 1 if lista[i] == '1': n_1 += 1 if lista[i] == '2': n_2 += 1 if lista[i] == '3': n_3 += 1 if lista[i] == '4': n_4 += 1 if lista[i] == '5': n_5 += 1 if lista[i] == '6': n_6 += 1 if lista[i] == '7': n_7 += 1 if lista[i] == '8': n_8 += 1 if lista[i] == '9': n_9 += 1 acess = True total.insert(n, [acess, n_0, n_1, n_2, n_3, n_4, n_5, n_6, n_7, n_8, n_9]) n_0 = 0 n_1 = 0 n_2 = 0 n_3 = 0 n_4 = 0 n_5 = 0 n_6 = 0 n_7 = 0 n_8 = 0 n_9 = 0 for n in range(1, 11): dig = 0 for i in range(num1, (num2 + 1)): a = total[i] b = int(a[n]) dig += b if n == 10: print('%d' % dig) else: print('%d ' % dig, end='') numeros = input() vetor = numeros.split() num1 = int(vetor[0]) num2 = int(vetor[1]) Na linha 27 do código, o "juiz online" acusa IndexError, porém eu não consigo entender o motivo. A linha é a seguinte: "lista1 = total[n]", que se encontra na imagem em anexo. Se alguém puder me dar uma luz, eu agradeço. O exercício encontra-se no seguinte link: https://www.beecrowd.com.br/judge/pt/problems/view/1138
  18. Gostaria de agradecer a todos. Realmente, o uso da função recursiva excedeu o tempo de resposta do programa. Obrigado @JorgeGus, @arfneto e @devair1010. Eu não postei a fonte do problema com receio de não cumprir alguma regra do site por citar outros serviços, mas farei da próxima vez. Vocês são top.
  19. Senhores, boa tarde! Estou estudando a linguagem C e colocando em prática através de resoluções de diversos exercícios. Me deparei com um, de um site conhecido, e o site retornou como "tempo limite excedido". Creio que deva ser devido a resposta do programa não ser em tempo hábil, definido pelo site. Dessa forma, trata-se de otimização do código, para ser mais simples, mais eficiente. Colocarei o enunciado e o código aqui, pra ver se alguém me da uma ajuda. Já dediquei um tempo considerável nesta questão, para chegar onde cheguei e não vejo como simplificar ainda mais. Hyam é um menino que adora sequências. Ele anda descobrindo sequências interessantes que nem mesmo Fibonacci imaginaria. Certo dia, Hyam percebeu que dado um número N, ele poderia fazer uma sequência do tipo 0 1 2 2 3 3 3 4 4 4 4 ... N N N ... N. No entanto, Hyam percebeu que cada valor que aumentava no número da sequência, a quantidade total de números da sequência aumentava semelhantemente à um crescimento fatorial, neste caso, ao invés de multiplicar, soma-se o número total de números da sequência com o valor do próximo número da sequência. Por exemplo, se N = 2. A sequência correta seria 0 1 2 2, obtendo-se 4 digitos. Agora, se N = 3, o próximo número da sequência tem valor 3, então a quantidade total de número da sequência seria a quantidade de números com N = 2, que é 4, mais o valor do próximo número da sequência, neste caso 3, obtendo-se 7, já que a sequência correta para N = 3 é 0 1 2 2 3 3 3. Sua tarefa é fazer um algoritmo que dado um número inteiro N, tenha como resposta a quantidade total de números dessa sequência e logo abaixo a sequência completa. Entrada A entrada é composta de vários casos de testes. Cada caso é composto por um inteiro N (0<=N<=200) que indica o valor dos últimos N números da sequência. A entrada termina com final de arquivo (EOF). Saída A saida é no formato Caso X: N numeros onde X é a ordem do número de casos e N é a quantidade de numeros que contém na sequência completa, na próxima linha a sequência de números com um espaço entre eles. É pedido que deixe uma linha em branco após cada caso. Exemplo de EntradaExemplo de Saída 0 1 2 3 Caso 1: 1 numero 0 Caso 2: 2 numeros 0 1 Caso 3: 4 numeros0 1 2 2 #include <stdio.h> int qtd(int total); int main() { int casos = 1, numero, i, j; scanf("%d", &numero); if(numero == 0){ printf("Caso %d: %d numero\n", casos, qtd(numero)); } else{ printf("Caso %d: %d numeros\n", casos, qtd(numero)); } while(numero != EOF){ if(numero == 0){ printf("%d", numero); } else{ printf("0 "); for(i = 0; i <= numero; i++){ for(j = 0; j < i; j++){ if(j == numero){ printf("%d", i); } else{ printf("%d ", i); } } } } printf("\n\n"); casos++; scanf("%d", &numero); if(numero == 0){ printf("Caso %d: %d numero\n", casos, qtd(numero)); } else{ printf("Caso %d: %d numeros\n", casos, qtd(numero)); } } return 0; } int qtd(int total){ if(total == 0){ return 1; } return total + qtd(total - 1); } Caso 4: 7 numeros 0 1 2 2 3 3 3
  20. Gostaria de agradecer a todos, @arfneto, @devair1010 e @Midori. Estou com um problema parecido com o do meu amigo que criou o tópico. Pelas explicações, deve ser a mesma faculdade... E consegui entender e resolver o problema.
  21. Não estou desmerecendo os tutores da faculdade, longe de mim julgar o conhecimento de alguém, mas a didática de vocês está me ensinando muito mais. Obrigado a todos, meus amigos. @arfneto e @codigo rápido. Entendi agora. Quando estudei algoritmos e lógica de programação, mesmo usando C, não tive ponteiros. E o professor desta vez não conseguiu explicar da forma que vocês fizeram, e eles não entendiam a minha dúvida. Agora ficou claro que argumentos em C, em uma função, não quer dizer que precisa ser parâmetro de entrada. Obrigado mais uma vez!
  22. @codigo rápido tive algoritmo e lógica de programação em C e portugol. Mas não tinha visto ponteiros ainda. E o professor não conseguiu explicar da forma que você disse, simples. Obrigado! Testei em um compilador online e deu alguns erros. Quando chegar em casa vou testar na IDE, obrigado!
  23. Bom dia, pessoal. Estou com uma dúvida em uma questão da faculdade e a tutoria não está conseguindo me ajudar. Vou postar aqui com meus questionamentos e apontamentos do professor, pra ver se alguém consegue me explicar de uma outra forma. A questão está em anexo. A minha dúvida foi a seguinte: "Boa tarde, professor. Na atividade prática, a prática 3 pede para que seja executado um programa que calcula a área e o perímetro de um hexágono. E já pede que uma função siga um determinado protótipo. Porém, como parâmetro de entrada da função pré-determinada, já temos a própria área e perímetro como parâmetro de entrada. Não seria a função que teria que calcular esses valores? E o único parâmetro de entrada seria o lado do hexágono?" A primeira resposta do tutor: "Boa Tarde! Verifique que o perimetro e a área são passados por referência. Isso permite que a função retorne os dois valores calculados. Dessa forma estão correto os parâmetros. Bons Estudos;" E eu continuei sem entender: "Professor, boa tarde. Eu entendi que o perímetro e a área são passados por referência. Mas a minha dúvida é a seguinte. O exercício pede que a função calcule o perímetro e a área. Se esses duas informações, já são passadas pra função como parâmetros de entrada, mesmo que por referência, não é a função que calcula, a função ou imprimi ou faz outra coisa com essas informações. Se a função deve receber apenas o lado, como diz no enunciado, seria apenas o lado como parâmetro de entrada. A função que deveria retornar os valores do perímetro e da área, e não receber como parâmetros de entrada. O senhor conseguiu entender a minha dúvida? O protótipo da função deveria receber apenas o lado como parâmetro de entrada, pra poder retornar a área e o perímetro. Mas se a área e o perímetro são parâmetros de entrada, mesmo que através de ponteiros, essas duas informações são calculadas fora da função, em outra parte do programa. Como a função calcularia essas duas informações, se elas já são usadas como valores de entrada?" E a segunda resposta, ainda sem entender... Compreendi sua dúvida. A função deve somente calcular a área e o perímetro e atribuir as variáveis passadas por referência. A função é do tipo void ela não tem retorno pelo comando return devido ao tipo. Não deve-se interpretar que as variáveis passadas são parametros de entrada. Elas são os argumentos da função. A função scanf() funciona da mesma maneira você informa o endereço da variável que irá receber a entrada do usuário. O calculo ocorre de forma simples. Você indica que deseja alterar o conteúdo do ponteiro e atribui o valor desejado. Qualquer dúvida, estou à disposição. Bons Estudos;" Desta forma, respondi novamente, com um exemplo de código: Professor, boa noite. Eu vou assistir a aula online se eu conseguir sair a tempo do trabalho, e vejo se o senhor pode me ajudar. Porque eu ainda não estou entendendo a questão. O protótipo da função, pede três argumentos, correto? Uma variável tipo float 'l' e dois ponteiros, '*area' e '*perimetro'. Esses argumentos são colocados na função no momento que chamamos ela no programa principal, no 'int main()'. Os argumentos são de entrada, são utilizados para chamar a função no programa. Independente se serão utilizados valores ou referência, eles são colocados na função. O senhor disse na explicação: "A função scanf() funciona da mesma maneira você informa o endereço da variável que irá receber a entrada do usuário". É exatamente isso que estou perguntando. O scanf informa o endereço da variável que receber de entrada. Ou seja, se o argumento da função já pede três argumentos (lado, *area e *perimetro), independentes se são valores ou referência, depende da entrada que receber do usuário. Ou seja, o programa não calcula, já que pede inicialmente a entrada do usuário. Entendi que a função é void, não oferece retorno. Mas não entendi como a função pede três argumentos de entrada para chamar a função, sendo que dois deles deveria ser a própria função a calcular. Vou postar um código para o senhor ver, para tentar explicar mais uma vez a minha dúvida." #include <stdio.h> #include <math.h> void calc_hexa(float la); int main() { float lado; printf("Digite o lado do hexágono: "); scanf("%f", &lado); while(lado > 0){ calc_hexa(lado); printf("Digite o lado do hexágono: "); scanf("%f", &lado); } return 0; } void calc_hexa(float la){ float a = (3 * la * la * sqrt(3))/2; float p = 6 * la; printf("%.2f %.2f\n", a, p); } Se o programa tem que calcular a área e o perímetro, eles não podem estar nos argumentos da função, entendeu? Porque esses argumentos da função, ou o usuário tem que fornecer de entrada, ou tem que ter sido calculado em outra parte do programa, para ser usado como valor ou como referência. A função não pode ter em seus argumentos um dado que ela mesma tem que calcular. É essa a minha dúvida.

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...