Ir ao conteúdo
  • Cadastre-se

Simon Viegas

Membro VIP
  • Posts

    3.940
  • Cadastrado em

Tópicos solucionados

  1. O post de Simon Viegas em Estrutura de Controle com Repetição lendo o mesmo dado foi marcado como solução   
    Olá a todos.
     
    Vou aproveitar para tentar explicar como ir desenvolvendo...
     
    Sobre:
     
    @jonas steindorff gomes, inicialmente seria meio que uma interpretação do que seria esse "enquanto", veja:
     
     
    O trecho do enunciado está se referindo a "toda" entrada de dados... ou seja: vai continuar lendo (os dados de novos entrevistados) até que seja inserido uma idade negativa. Uma "idade negativa" será uma "referência" para indicar que não quer mais inserir novos dados (o programa tem que parar de coletar)!. Observe que apesar de ser última linha do enunciado, ela é uma base do problema.
     
    Outro ponto é que você não precisa fazer todo o programa para começar a testar... uma técnica que pode ser útil é se basear no que quer como resposta final, veja:
    //a) a média de salário do grupo; //b) a maior e a menor idade do grupo; //c) a quantidade de mulheres com salário até R$100,00. Perceba que são 3 itens isolados... é fácil imaginar que poderia fazer um programa separado para cada uma dessas alíneas, concorda?
     
    Como a referência de parada é a idade, vamos começar pela segunda. Poriam-se começar com algo assim:
    algoritmo "FCdH" //Foi feita uma pesquisa entre os habitantes de uma região. Foram coletados //os dados de idade, sexo (M/F) e salário. Faça um algoritmo que informe: //a) a média de salário do grupo; //b) a maior e a menor idade do grupo; //c) a quantidade de mulheres com salário até R$100,00. //Encerre a entrada de dados quando for digitada uma idade negativa. var idade :inteiro inicio repita escreva ("Idade : ") leia(idade) ate idade < 0 fimAlgoritmo Ou seja: apenas testando essa "leitura de dados até que a idade seja negativa".
     

     
    Parece que está funcionando... agora implementa e testa o que está sendo pedido:
     
     
    Ainda separando por partes, testando só com o maior.
    var idade :inteiro maior :inteiro inicio repita escreva ("Idade : ") leia(idade) se idade > maior entao maior <- idade fimSe ate idade < 0 escreval("Maior idade : ", maior:1) fimAlgoritmo Parece que ficou bom... Depois com o menor também:
    var idade :inteiro maior, menor :inteiro inicio menor <- 999 repita escreva ("Idade : ") leia(idade) se idade > maior entao maior <- idade fimSe se idade < menor entao menor <- idade fimSe ate idade < 0 escreval("Maior idade : ", maior:1) escreval("Menor idade : ", menor:1) fimAlgoritmo Opa! aqui já apareceu um problema:

     
    Para qualquer sequência que coloco, o menor sempre está ficando com "valor negativo que inseri". 🤔, ou seja: tem algo errado nessa lógica aí...
     
    Após reinterpretar o contexto do problema, é observável que esse "valor negativo" NÃO deveria fazer parte da conta, ou seja: esse valor negativo foi usado apenas como uma flag para indicar que não quer mais ler dados, logo de fato não devendo entrar na conta... . Poderia ficar algo assim:
    repita escreva ("Idade : ") leia(idade) se nao (idade < 0) entao se idade > maior entao maior <- idade fimSe se idade < menor entao menor <- idade fimSe fimSe ate idade < 0 Pronto. Agora só vai "analisar" as idades que "não são negativas".
     
    Vamos inserir outro ponto:
     
    Algo assim:
    var idade :inteiro maior, menor :inteiro salario, somaSalario, mediaSalario :real inicio menor <- 999 repita escreva ("Idade : ") leia(idade) escreva ("Salario: ") leia(salario) se nao (idade < 0) entao se idade > maior entao maior <- idade fimSe se idade < menor entao menor <- idade fimSe fimSe ate idade < 0  
    Mas testando, já vi após inserir uma idade negativa, o programa ainda está perguntando o salário... 😒. Basta deixar dentro do se também.
     
    Outros pontos surgem, como a necessidade de verificar se pelo menos um registro foi lido lá antes de calcular a média.. para evitar divisão por zero.
     
    algoritmo "FCdH" //Foi feita uma pesquisa entre os habitantes de uma região. Foram coletados //os dados de idade, sexo (M/F) e salário. Faça um algoritmo que informe: //a) a média de salário do grupo; //b) a maior e a menor idade do grupo; //c) a quantidade de mulheres com salário até R$100,00. //Encerre a entrada de dados quando for digitada uma idade negativa. var idade :inteiro maior, menor :inteiro salario, somaSalario, mediaSalario :real cont :inteiro inicio menor <- 999 repita escreva ("Idade : ") leia(idade) se nao (idade < 0) entao cont <- cont + 1 escreva ("Salario: ") leia(salario) se idade > maior entao maior <- idade fimSe se idade < menor entao menor <- idade fimSe somaSalario <- somaSalario + salario fimSe ate idade < 0 se cont > 0 entao mediaSalario <- somaSalario / cont fimSe escreval("Maior idade : ", maior:1) escreval("Menor idade : ", menor:1) escreval("Média salário: R$", mediaSalario:1:2) fimAlgoritmo  
    Faz uns testes para ver se está calculando certo. Vê se dá para simplificar ou melhorar alguma coisa. Por aí vai..
     
    Após inserir o item c)...
     
     
    ADENDO:
    Para os programas em geral, o VisualG tem um recurso bem interessante para ajudar nos testes. Basta inserir alguns leia() entre um estrutura aleatorio. Ex.:
    algoritmo "FCdH" //Foi feita uma pesquisa entre os habitantes de uma região. Foram coletados //os dados de idade, sexo (M/F) e salário. Faça um algoritmo que informe: //a) a média de salário do grupo; //b) a maior e a menor idade do grupo; //c) a quantidade de mulheres com salário até R$100,00. //Encerre a entrada de dados quando for digitada uma idade negativa. var idade :inteiro maior, menor :inteiro salario, somaSalario, mediaSalario :real cont :inteiro inicio menor <- 999 repita escreva ("Idade : ") aleatorio -5, 60 leia(idade) aleatorio off se nao (idade < 0) entao cont <- cont + 1 escreva ("Salario: ") aleatorio 980, 3000 leia(salario) aleatorio off se idade > maior entao maior <- idade fimSe se idade < menor entao menor <- idade fimSe somaSalario <- somaSalario + salario fimSe ate idade < 0 se cont > 0 entao mediaSalario <- somaSalario / cont fimSe escreval("Maior idade : ", maior:1) escreval("Menor idade : ", menor:1) escreval("Média salário: R$", mediaSalario:1:2) fimAlgoritmo Desta forma, o próprio computado vai escrevendo respostas sozinho...
  2. O post de Simon Viegas em Menu de login (Quero fazer tipo um bando de dados com o .txt) foi marcado como solução   
    Sobre:
     
    Particularmente preciso que especifique qual parte está com dificuldades... o que não está funcionado...
     
     
     
    Sobre:
     
    Quando desconhecer, dá um Google... especialmente para o IOResulte() e Reset() .
     
    Mas segue:
     
    IOResult() = Traz o código do resultado da última operação de entrada e saída. Quando não ocorre erros, traz 0, caso contrário, retorna um código referente ao erro que ocorreu. (para nosso contexto, só importa se foi 0 ou não). É um comando inerente ao uso de arquivos...
    usuario.nome = Esse "." é uma forma de acessar uma "variável" do registro que foi previamente definido. Ex.:
     
     
    A variável usuario é do tipo TUsuario,  tendo assim esses "atributos". Record é meio que simplesmente uma forma de de agrupar variáveis.
     
    Reset() = É o comando que abre o arquivo e posiciona o "cursor" para leitura, ou escrita, no início, ou seja: o arquivo vai ficar "aberto" e pronto para ser lido, ou escrito, lá no topo dele. Usado tanto no text, tando no file of. Mas tem diferença entre um e outro... No text existe também o Append(). Um com uso semelhante para o outro seria Seek().
     
    - pesquise sobre registro (record) no Pascal;
    - pesquise sobre arquivos no Pascal;
     
    Por ai vai.
  3. O post de Simon Viegas em calculadora algoritmo fat dando erro de sintaxe foi marcado como solução   
    Olá @Hotaru.
     
    Sobre:
     
    Tem uma vírgula a mais ali no final. Basta apagar.
     
     
     
     
    Esse fimAlgoritmo está perdido aí... só remover também.
     
     
    Sobre:
     
    Dois pontos:
    A sintaxe padrão seria:
    para <variável> de <valor-inicial> ate <valor-limite> [passo <incremento>] faca <seqüência-de-comandos> fimpara Fonte: https://www.apoioinformatica.inf.br/produtos/item/14-comandos-de-repeticao
     
    No caso ficaria:
    para i de 2 ate a faca FAT:=FAT*i fimpara  
    Mas o principal problema é que a é do tipo real, e o para não aceita esse tipo... tem que usar uma variável do tipo inteiro.
     
    Uma forma de resolver seria:
    para i de 2 ate int(a) faca FAT:=FAT*i fimpara Ou você utiliza outra variável...
     
    Aí fica faltando apenas jogar o valor de FAT no resultado.
     
    No aguardo.
  4. O post de Simon Viegas em Me deem opiniões de mudança no código, e amplificar meu código :D foi marcado como solução   
    Olá.
     
    Vamos lá.
     
    Inicialmente só um detalhe sobre o enunciado:
     
     
    Ou seja: não se usa "o mesmo" como sendo uma espécie de "pronome pessoal". Para entender melhor sobre isso, dá um Google... ;).
     
    Outro ponto é que pede para ler o "nome", mas o mesmo este não é utilizado para algo.
     
     
    Sobre:
     
    Segue um código resumido:
    program Exercicio_4; { Faça um algoritmo que receba o sexo da pessoa, a idade e mostre a soma das pessoas do sexo feminino. O programa deve receber no total de 10 pessoas. } uses CRT; var nome :string; sexo :char; idade, somaIdadeFeminino, contadorPessoas :integer; begin contadorPessoas := 0; //obs.: no Pascal não precisa, pois é "zerada" automaticamente, mas é recomendado utilizar! Clrscr; while contadorPessoas < 3 do begin Inc(contadorPessoas); ClrScr; writeln('----- CADASTRO DE DADOS PESSOAIS -----'); write ('Nome : '); readln(nome); write ('Sexo : '); readln(sexo); write ('Idade: '); readln(idade); TextColor(contadorPessoas); //será uma boa ideia? if (UpCase(sexo) = 'F') then begin Inc(somaIdadeFeminino, idade); {TextColor(Random(14) + 1);} //está mudando algumas vezes sem usar antes end end; TextColor(Random(14) + 1); writeln('A soma das idades femininas é: ',somaIdadeFeminino); ReadKey(); end.  
    Sugiro comparar com o seu código... qualquer dúvidas, reclamações, sugestões e só postar.
     
    No aguardo.
     
  5. O post de Simon Viegas em Vetor não adiciona novas entradas foi marcado como solução   
    @Montesuma Oliveira, bom dia.
     
    Qual o enunciado completo desse "exercício"? as característica do problema dependem do que foi solicitado.
     
    No aguardo.
    adicionado 35 minutos depois Seguindo a mesma base do código original:
    algoritmo "Estrutura Indexadas - Vetor(Array)" var i :inteiro qtdVeiculos :inteiro totVeiculos :inteiro nomeVeiculo :vetor [1..3] de caractere inicio qtdVeiculos <- 0 //obs.: no VisuAlg não precisa, pois já estará com 0 enquanto qtdVeiculos <> -1 faca escreval("Digite a Quantidade de Veículos para Cadastrar ou -1 Para Sair: ") leia(qtdVeiculos) para i de 1 ate qtdVeiculos faca totVeiculos <- totVeiculos + 1 escreva ("Digite o Nome do Veículo: ") leia(nomeVeiculo[totVeiculos]) fimPara fimEnquanto para i de 1 ate totVeiculos faca escreval("O Veículo ", nomeVeiculo[i], " tem o índice ", i) fimPara fimAlgoritmo
    Como citado, as características vão depender do enunciado. Um ponto que acho que já seria interessante tratar é o limite de cadastros. Nesse base acima, para facilitar os testes, deixe apenas com 3 veículos.
     
    Outro ponto é: só vai precisar cadastrar o nome do veículo, mesmo?
  6. O post de Simon Viegas em Pascal, Fazer um file. foi marcado como solução   
    Olá @TheMajor.
     
    Para saber a última matricula utilizada, vai depender de como você armazenou as matrículas no arquivo. Supondo que sempre inseriu em ordem, então a última matrícula vai está na última posição. Basta lê-lo.
     
    Para posicionar o arquivo na última posição, poderá utilizar o comando Seek().
    Algo como:
    Seek(f, FileSize(f)-1); //posciona o ponteiro antes da última posição Ou seja, ao ler a linha vai ler o último registro. Daí pega a matrícula que está lá e gera a nova matrícula a partir desse dado.
     
    Para escrever no final (após o último):
    Seek(f, FileSize(f)); //posciona o ponteiro após a última posição (final)  
    No aguardo.
  7. O post de Simon Viegas em Problema no Pascalzim Error Log: DOMAIN e Exp: OVERFLOW foi marcado como solução   
    Olá a todos. Só complementando:
     
    Na verdade não é propriamente um número negativo lá no sqrt(), está sim efetuando uma operação com um NaN, ou seja: o problema em si não está no cálculo da raiz, mas sim no cálculo do logaritmo... Lá sim que não poderia utilizar números negativos... ele retorna o tal do NaN...que por sua vez o Exp() vai retornam um NaN também... já a raiz dá pau.
     
    Poderia fazer assim:
    program URI_1015 ; var x1, x2, y1, y2, d : real ; begin readln(x1, y1); readln(x2, y2); d := sqrt( exp(2*ln(abs(x2-x1))) + exp(2*ln(abs(y2-y1))) ); writeln (d:0:4); end.  
    Pois essa subtração, exemplo, x2-x1, é para encontrar a "distância entre os pontos", ou seja, será sempre positivo (não existe distância negativa)... no caso, como resultado dessa subtração vai ser elevada ao quadrado, não se faz necessário utilizar o módulo na fórmula geral. Entende? a grosso modo a fórmula deveria ser assim:
     

     
    Perceba também que a "ordem dos tratores não alteram o viaduto", ou seja: tanto faz x2-x1, quanto x1-x2... iria dar no mesmo (nessa ou na fórmula original).
     
     
    @Loops Infinity, sobre:
     
     
    Aqui temos alguns probleminhas nas justificativas e também nas correções (apenas detalhes):
    como já citado, o problema está no ln(), e não no exp() ou ná sqrt(). Uma justificativa mais correta seria algo como: "removi o cálculo de potência pela fórmula exp(y*ln(x)), pois as vezes o x dá negativo, e o Pascal não sabe calcular logaritmos para este tipo de número"; como você mesmo já fez, uma outra forma de calcular uma potência, no caso de número ao quadrado, é multiplicando ele por ele mesmo... desta forma, o resultado sempre será não negativo¹ ("positivo"), logo não precisando do abs(); 1 - todo número real vezes ele mesmo resultará em um número não negativo.
     
    Logo, a resposta seria algo assim:
    program URI_1015; var x1, x2, y1, y2, d : real; begin readln(x1, y1); readln(x2, y2); d := sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) ); writeln(d:0:4); end.  
    No aguardo.
  8. O post de Simon Viegas em Erro no algoritmo usando enquanto foi marcado como solução   
    Olá.
     
    Resumindo:
     
    Quando utilizar uma disjunção (e), para entrar no enquanto, ambas as "condições" devem resultar em verdadeiro, para assim a "expressão" resultar em verdadeiro.
     
     
    Quando utiliza uma conjunção (ou), basta uma condição ser verdadeira para iniciar (ou continuar repetindo). Será algo como: "enquanto o valor for menor igual a 50 OU maior ou igual a 70".
     
     
     
     
     
     
    Como vai ler primeiro, para depois verificar, poderia utilizar um repita. Exemplo:
    algoritmo "Exercicio3" // Função: Enquanto // Autor : Álvaro Bueno Sanchez // Data : 26.04.19 var valor : inteiro inicio repita LimpaTela() escreval("Digite um valor") leia(valor) ate ((valor > 50) e (valor < 70)) LimpaTela() escreval("Esse era o Valor que eu estava esperando!") escreval escreval("ALGORITMO FINALIZADO ./.\./.\./...") fimAlgoritmo  
    ADENDO:
    Repare que a condição do enquanto é o oposto da condição do repita, ou seja, um utiliza a negação do outro.
     
    algoritmo "Exercicio3" // Função: Enquanto // Autor : Álvaro Bueno Sanchez // Data : 26.04.19 var valor : inteiro inicio valor := 0 repita LimpaTela() escreval("Digite um valor") leia(valor) ate nao ((valor <= 50) ou (valor >= 70)) LimpaTela() escreval("Esse era o Valor que eu estava esperando!") escreval escreval("ALGORITMO FINALIZADO ./.\./.\./...") fimAlgoritmo  
  9. O post de Simon Viegas em Solução de um pequeno problema foi marcado como solução   
    Basicamente precisar "reinicializar" a variável s a cada loop.
     
    Algo assim:
    //program Dextohex; program DecToHex; uses CRT; var deci,x,r:integer; c :char; s:string; begin repeat ClrScr; write ('Digite o número em decimal: '); readln(deci); x := deci; s := ''; //zera a variável repeat r := x mod 16; x := x div 16; case r of 10: c := 'A'; 11: c := 'B'; 12: c := 'C'; 13: c := 'D'; 14: c := 'E'; 15: c := 'F'; else c := chr(48+r); end; //fim case s := c+s; until x=0; write(s); readln; until deci=0; end.  
  10. O post de Simon Viegas em Função escolha não está dando certo foi marcado como solução   
    @Ricardo Régis, insira as resposta em maiúsculo, por exemplo: "INVERNO".
     
    ou
     
    Tornar as respostas em maiúsculo resolve também:
    leia (estacao) estacao <- Maiusc(estacao) No escolha/caso não precisa mexer.
  11. O post de Simon Viegas em Operador aritmético divisão não funciona foi marcado como solução   
    Olá @Educador Prepara, seja bem-vinda ao Fórum do Clube do Hardware.
     
    1# Causa raiz
    Sobre:
     
    Resumidamente ocorre que está sendo utilizado um else indevidamente em ambos os códigos. Esse else está vinculado justamente ao if que verifica se é divisão ou não, ou seja, quando entra no if da divisão, não vai entrar no else (pois é pra isso que o else serve). Para as outras opções o contrário. Como não vai entrar na divisão, vai entrar no else, e assim mostrando a resposta.
     
    Uma maneira mais simples de resolver é: simplesmente remova os else. Ex.:
     
    program Multiplica_divide; var n1, n2, resultado :real; escolha :char; begin writeln('Digite M para Multiplicação'); writeln('Digite D para Divisão'); writeln('Qual operação deseja realizar?'); readln(escolha); writeln; writeln('Digite o primeiro número: '); readln(n1); writeln('Digite o segundo número: '); readln(n2); if escolha = 'M' then begin resultado := N1*N2; readln; end; if escolha = 'D' then begin resultado := N1/N2; readln; end; writeln('O resultado e: ', resultado :2:2); readln; readln; end.
    RESUMIDAMENTE: o else do final deve ser removido. No caso, um else deveria existir entre os if (e não após o segundo if).
     
     
     
    2# Outro pontos importantes
    Aproveitando o contexto, revisemos alguns outros pontos... especialmente para outros membros que venham a ler o tópico.
     
    Vamos lá:

    obs.: no código mais abaixo, demonstro cada uma das alíneas que se seguem.
    O Pascal/Delphi NÃO é Case-sensitive para os comandos, ou seja, tanto faz, por exemplo, usar writeln, quanto Writeln, ou WriteLN etc. Entretanto, para as comparações sim... ou seja, 'M' é diferente de 'm'. No seu código só vai funcionar se usar as "escolhas" com letras maiúsculas.... logo, seria interessante aceitar as duas possibilidades (eu por exemplo costumo usar em minúsculo). Os if das "escolhas" são mutuamente excludentes, logo, aqui sim, fazem-se necessário o uso de estrutura if/else em vez de dois ou quanto, respectivamente, if simples. Os if simples são independentes, fazem as suas verificações sem se importar com o(s) resultado(s) anteriores. Tipo: no segundo código, mesmo sendo 'A', seu código irá verificar se é 'B", depois se é 'C' e depois se é 'D'. São verificações desnecessárias... (é possível uma variável ter dois valores ao mesmo tempo simultaneamente? não!). Já com if/else, não não verificará. Se um if anterior for verdadeiro, não fará as verificações posteriores. Por exemplo: é 'A'?, não. Senão, é 'B'? sim! entra no 'B' e quando terminar pulará para próxima instrução após a estrutura (que fica depois do end; do if 'D'). Assim não verificando se é 'C' ou 'D'.
    Não use read, use apenas readln. Nesse tópico tentamos justificar. Mas resumidamente é isso: evite possíveis "bugs". Simplesmente use (e orientem a usar) somente o readln. Quem perguntar é só dizer: "o read pode dar problemas em alguns caso. Não vale a pena se aprofunda, simplesmente não use e se tiver curiosidade, pesquise sobre".
    Segue o segundo código aplicado as alterações:
    program Calculadora_4_operacoes_basicas; var n1, n2, resultado :real; escolha :char; begin writeln('A para Somar '); writeln('B para Subtrair '); writeln('C para Multiplicar'); writeln('D para Dividir '); write('Escolha o que deseja fazer: '); readln(escolha); //aqui o citado na alínea 3 writeln; write ('Digite o primeiro numero: '); readln(n1); //aqui o citado na alínea 3 write ('Digite o segundo numero : '); readln(n2); //aqui o citado na alínea 3 if (escolha = 'A') or (escolha = 'a') then //aqui o citado na alínea 1 begin resultado := n1+n2; end else //aqui o citado na alínea 2 if (escolha = 'B') or (escolha = 'B') then //aqui o citado na alínea 1 begin resultado := n1-n2; end else //aqui o citado na alínea 2 if (escolha = 'C') or (escolha='c') then //aqui o citado na alínea 1 begin resultado := n1*n2; end else //aqui o citado na alínea 2 if (escolha = 'D') or (escolha = 'd') then //aqui o citado na alínea 1 begin resultado := n1/n2; end; writeln('Resultado: ',resultado:1:3); readln; end.
    Dúvida, críticas, sugestões... é só postar.
    adicionado 23 minutos depois ADENDO:
    Esqueci de comentar... Na divisão, é comum implementar um tratamento para evitar a tal "divisão por zero". Ex.:
    if (escolha = 'D') or (escolha = 'd') then begin if (n2 <> 0) then begin resultado := n1/n2; end else begin writeln('ERRO: Divisão por 0'); //pois se for 0/0 será uma INDETERMINAÇÃO (poderia ser qualquer valor), e, para os outros casos, será uma indefinição (operação impossível). readln; exit; //vai para o "end." end; end;  
  12. O post de Simon Viegas em Erro: Invalid floating point operation foi marcado como solução   
    @brunord2014, é necessário revisar toda a estrutura do código. Segue um código exemplo:
    algoritmo "FCdH" // Autor : Bruno // Data : 09/11/2018 // Descrição: //Programa que recebe diversos número inteiros e retorna quantos número foram //digitados, a soma desses números e a média dos números positivos. var n :inteiro //número digitado pelo usuário qtn :inteiro //quantidade de número digitados s :inteiro //soma dos números digitados qtp :inteiro //quantidade de número positivos sp :inteiro //soma dos números positivos mdp :real //media dos número positivos inicio n <- 0 qtn <- 0 s <- 0 qtp <- 0 sp <- 0 mdp <- 0 escreva("Por favor digite o primeiro número ou 0 para finalizar:") leia(n) se (n = 0) entao escreval("Algortmo finalizado sem calculos...") senao repita qtn <- qtn+1 //atualiza a quantidade de números digitados s <- s+n //atualiza a soma dos números se (n > 0) entao //se for positivo qtp <- qtp+1 //atualiza a qnt de número positivos sp <- sp+n //atualiza soma dos positivos fimSe escreval("Digite o próximo número ou 0 para finalizar: ") leia(n) ate (n = 0) //se for quer finalizar escreval() escreval("A quantidade de números digitados foi : ",qtn) escreval("A soma dos números digitados foi : ",s) se (qtp = 0 ) entao escreval("Você não digitou números positivos.") senao mdp <- sp/qtp //calcula média dos positivos escreval("A média de números positivos digitados foi: ",mdp) fimse fimSe fimAlgoritmo  
     
    Se tiver com dúvidas sobre alguma parte, é só postar.
     
    No aguardo.
  13. O post de Simon Viegas em Problemas com VisuAlg ao ler variável foi marcado como solução   
    1#
    Por favor, poste o texto do código, em vez de uma imagem.
     
     
     
    2#
    Teste com o Visualg 3.6.0.5. 
    Exemplo de link:
    https://baixe.net/download/4313/visualg/
     
     
     
    ***
     
    No aguardo.
  14. O post de Simon Viegas em Função que retorna o maior elemento de um vetor foi marcado como solução   
    Olá.
     
    Sobre:
     
     
    Para que seria esse primeiro for?
     
    Mas em fim... você está utilizando a variável maior tanto para controlar esse for, tanto para receber o "maior valor". Não me faz sentido... além do mais, como é um quantidade fixa de loops, assim como foi feito no segundo for, poderia utilizar um int comum.
     
    RESUMINDO:
    Apague o primeiro for e deixe apenas o segundo. Não precisa de "um for dentro do outro". Simplesmente irá "comparar o maior com a primeira até a última posição".
     
     
    Obs.: como existe um if que compara o valor de maior, se faz necessário garantir que esta variável tenha algum valor logo na primeira comparação. Perceba que você apenas alocou a memória para o maior, mas não definiu valor para ele. Uma solução boa para inicializar os "maiores" e "menores" costumam ser atribuindo o primeiro valor a eles, ou seja, após as variáveis estarem prontas para o uso, defini o maior e menor como sendo o primeiro, daí, o for já começará da segunda posição em diante (posição 1).
     
     
    No aguardo.
  15. O post de Simon Viegas em Isso é uma função? foi marcado como solução   
    Vou tentar expor como eu entendo.
     
    Tomemos os seguintes códigos:
    void Decimal_Bi_He() { } e
    int Decimal_Bi_He() { }  
    O primeiro está definido para fazer algo e "não retornar" nada nela mesma;
    O segundo faz algo e retorna algo nela mesma, ou seja, por exemplo, poderia invocar esse método dentro de um printf().
     
    Entendi que tem 2 pontos centrais:
    o nome dessas estrutura no C, ou seja, como elas são chamadas; (tem diferença entre uma e outra?) como usar uma ou outra estrutura no seu código, ou seja, em relação ao uso ou não do retorno ou parâmetros. 1#
    Em relação ao "nome dessas estruturas no C", como citado por @AnsiC e @isrnick, ambos podem ser chamados de função, ou seja, não é definido uma diferenciação entre uma coisa e outra... ambos são chamados funções e pronto.
     
    Em outras linguagens como Pascal, quando uma "estrutura dessa" retorna um valor nela mesma (como esse int da segunda) seria chamada de function (função), quando não retorna nada (como a que tem void), é chamada de procedure (procedimento).
     
    Ou seja, no Pascal, quando é solicitado uma função, subentenderia de cara que "essa estrutura" retornasse algo nela mesma (obs.: e que esse retorno seria usado, como tentarei explicar na segunda parte). Caso fosse solicitado um procedimento, seria como você fez, ou seja, a própria "estrutura" faria algo, mas sem o uso do retorno de algum algo nela mesma.
     
     
    RESUMINDO:
    No C, pelo já citado, não tem diferença entre retornar ou não... ambos são chamados de função, logo, você está usando uma função. A questão agora é  apenas se está usando como se quer ou não.
     
     
     
    2#
    Já em relação ao uso da função em si, aí entra outros critérios, como o uso de parâmetros e uso ou não de retorno pela própria estrutura.
     
    Veja o que diz o enunciado (ou o que você citou):
     
     
    - Como citado, dizer "uma função" no C não ajuda sobre ser void ou não;
    - Dizer receber, na minha suposição, seria receber por parâmetro, ou seja, no seu código está "recebendo por uma variável global";
    - Já o retornar eu entendo que a função deveria retornar nela mesma, ou seja, seria como a tal function do Pascal. No seu código, você está imprimindo o resultado na própria função (não está utilizando o recurso de retornar com o return), mas o enunciado pede que a função apenas retorne o valor... ai entra outra questão: retornar como? tem pelo menos 3 formas: pode ser por uma variável global; pode ser por uma variável do parâmetro; ou pode ser pelo próprio método. Eu acho que é pela terceira.
     
    RESUMINDO:
    Para mim a maneira mais provável é que a função receba  2 parâmetros e retorne a resposta na própria função, algo como:
    string Decimal_Bi_He(int decimal, int base) { string resultado; return resultado; } obs.: no C não usa string, apenas estou expondo a ideia. Teria que adaptar ao contexto... acho que seria algo como char*.
     
    Ai no código usa essa resposta da função, ou seja, o papel da função é apenas fazer as contas e entregar o resultado... que é coletado la no main() e usado como desejar.
     
     
    ADENDO:
    Acho também muuuito provável que não é para usar uma função pronta como a itoa(), mas deixe isso para depois.
     
  16. O post de Simon Viegas em Verificador de Palíndromos - melhora na lógica foi marcado como solução   
    Olá.
     
    1#
    É para verificar uma palavra ou para verificar uma frase?... palíndromo geralmente se refere à última.
     
     
     
    2#
    Pelo que eu vi, você está comparando os caracteres de um posição, com a posição "oposta". Nesse caso, poderia fazer direto...
    Ex.:
    se copia(palavraEscolhida,n,1) <> copia(palavraEscolhida,((compr(palavraEscolhida)-n)+1) ,1) ENTÃO  
    Mesmo se fosse usar um vetor, poderia usar um vetor só... ou seja, compararia uma posição nesse vetor, com a posição oposta deste mesmo vetor.
     
     
     
    2#
    O que você está fazendo NÃO é verificar se é palíndromo, está apenas verificando se invertida fica igual. São coisas distintas... palíndromo não é só isso, ou seja, toda palavra que invertida fica igual é palíndromo, mas existem palavras que quando invertida não fica igual, e mesmo assim é palíndromo...  Ex: anã. Ele é palíndromo.
     
    Se for usando frases, teríamos: Socorram-me, subi no ônibus em Marrocos. É palíndromo, mas se invertida não fica igual...
     
     
    ***
     
    Em fim. Dê uma pesquisa sobe o que é palíndromo. Entenda melhor o problema e tente aplicar os conceitos.
     
    No aguardo.
  17. O post de Simon Viegas em Bug no meu algorítimo foi marcado como solução   
    Já sabe onde está o erro... comparando com outras linhas, verás que não tem esses "[]". Basta tirá-los.
  18. O post de Simon Viegas em Error no meu algorítimo foi marcado como solução   
    Pronto! Então já sambemos que é algo no "posicionamento desse vetor". Ao analisar, verás que dentro do para do Aluno, tem outro para para as questões, certo? acontece que você usou a mesma variáveis nos 2. No pode! Use outra variável no para interno.
     
     
  19. O post de Simon Viegas em Lista Duplamente Encadeada em Linguagem C foi marcado como solução   
    Caro usuário,
     
    Seja bem-vindo ao Fórum do Clube do Hardware.
     
    No intuito de servir como fonte de pesquisa no caso de instituições de ensino, informamos que incorrer no resolvimento por completo de questões relacionadas a disciplinas escolares de cursos técnicos e faculdades podem ser revistas e removidas pela Equipe de Moderação do Clube do Hardware.
     
    Para sanar dúvidas sobre esse tipo de problema, por gentileza, publique o passo a passo do desenvolvimento da questão, projeto, monografia ou conteúdo em dúvida para que possamos analisar se a resposta está correta ou não, ou para que possa ser auxiliado com a dúvida no desenvolvimento do exercício.
     
    Infelizmente, não há como resolver os trabalhos pelos usuários. O objetivo do Fórum do Clube do Hardware é auxiliar seus usuários a encontrar soluções para que possam sanar suas dúvidas, e não de trazer soluções prontas para seus usuários.. Além disso, copiar e colar respostas que não são de autoria própria do qualquer usuário é considerado plágio, o que é ilegal.
     
    Esperamos que compreenda.
     
    Atenciosamente,
    Equipe Clube do Hardware
  20. O post de Simon Viegas em C++ Inserir o "$" automaticamente e ler so numero foi marcado como solução   
    Olá.
     
    @Malver Arkan, sobre:
     
    Então, tudo depende da necessidade, ou seja, para que seria esse U$? Se for apenas para exibir na hora de responder, basta seguir algumas das orientações já apresentadas.
    obs.: se estiver se referindo ao Dólar, creio que o correto seria US$.
     
    Percebe que o U$ não pertence ao número... assim como se estivesse trabalhando por exemplo com Quilômetros, não precisaria usar o KM no número em si. A unidade de medida fica separada.

     
    Sobre:

    Tem que tomar cuidado na representação.. tecnicamente 40+50 = 90, esse U$ (ou US$) não entra na conta! Para "resultar" em U$ no final, teria que ser algo assim:
    Exemplo: "U$40+U$50 = U$90" Entende? ou teria alguma outra operação entre unidades, que por sua vez resultaria em U$. A unidade de medida não deveria surgir do nada...

    Tipo, ao solicitar o "valor por hora", teria que especificar em qual moeda... algo como:
    cout << "Informe o valor por hora (em U$): "; cin >> valorhora; Ou seja, esse valor está em Dólar (o que o que seja), daí o resultado também será em Dólar (ou será em alguma outra unidade de medida que resultou de alguma operação)

    Resumindo: o U$ ficaria no texto, não no número.
     
    No aguardo.
     
     
     
  21. O post de Simon Viegas em Hexadecimal para decimal não está funcionando foi marcado como solução   
    Olá
     
    1#
    @Augusto Henrique Ferreira,  sobre:
    Fica errada como?  o que acontece?
     
    Você  precisaria relatar o problema.
     
     
     
    2#
    Para tentar adiantar, testei o seu código. Me pareceu que o número está dando maior, ou seja,  se inserir 1 está dando 16 (em vez de 1).  Se inserir 10 está dando 256 (em vez de 16).
     
    Então, se parar para  observar, veremos que está  dando um valor 16 vezes maior... logo, provavelmente tem algo a ver com o expoente.
     
    Tenta  assim:
    ... 'E' :digito:=14; 'F' :digito:=15; end; //fim case {expoente:=expoente+1;} //está atualizando antes da hora deci:=deci+digito*(exp(expoente*ln(16))); expoente:=expoente+1; end; ...  
     
     
    ***
     
    ADENDO: Perceba que "algo não está funcionando no código"  é justamente o esperado aqui no Fórum, ou seja, é necessário tentar apontar "o que está dando errado". Entende? Serve tanto para tentarmos ir direto  ponto,  tanto para você mesmo ter contato com o erro.
     
    O segredo é sempre  tentar entender o erro.
     
     
    No aguardo.
  22. O post de Simon Viegas em Constante com dois valores foi marcado como solução   
    Olá.
     
    Segue alguns exemplos:
     
     
    1#
    Utilizando matrizes.
    algoritmo "FCdH" var estados:vetor [1..9] de caracter //nome dos estados times :vetor [1..9,1..4] de caracter //cod do Estado, Time //BA<-1, CE<-2, MG<-3, PE<-4, PR<-5, RJ<-6, SC<-8, SP<-9 i, j:inteiro INICIO estados[1]<-"BA" estados[2]<-"CE" estados[3]<-"MG" estados[4]<-"PE" estados[5]<-"PR" estados[6]<-"RJ" estados[7]<-"RS" estados[8]<-"SC" estados[9]<-"SP" times[1,1]<-"Bahia" times[1,2]<-"Vicetória" times[2,1]<-"Ceará" times[3,1]<-"América Mineiro" times[3,2]<-"Atlético Mineiro" times[3,3]<-"Cruzeiro" times[4,1]<-"Sport" times[5,1]<-"Atlético Paranaense" times[5,2]<-"Paraná" times[6,1]<-"Botafogo" times[6,2]<-"Flamengo" times[6,3]<-"Fluminense" times[6,4]<-"Vasco da Gama" times[7,1]<-"Grêmio" times[7,2]<-"Internacional" times[8,1]<-"Chapecoense" times[9,1]<-"Corinthians" times[9,2]<-"Palmeiras" times[9,3]<-"Santos" times[9,4]<-"São Paulo" escreval("RELAÇÃO DE TIMES DO BRASILEIRÃO 2018") escreval() para i de 1 ate 9 faca para j de 1 ate 4 faca se (times[i,j] <> "") ENTÃO escreval(times[i,j],"-",estados[i]) fimSe fimPara fimPara fimAlgoritmo No caso, utilizei outro vetor para ter a lista dos estados.
     
     
     
    2#
    Utilizando registros e vetor:
    algoritmo "FCdH" tipo t_time = registro nome :caracter estado:caracter fimRegistro var times :vetor [1..20] de t_time i, j :inteiro INICIO times[01].nome<-"Bahia" times[01].estado<-"BA" times[02].nome<-"Vicetória" times[02].estado<-"BA" times[03].nome<-"Ceará" times[03].estado<-"CE" times[04].nome<-"América Mineiro" times[04].estado<-"MG" times[05].nome<-"Atlético Mineiro" times[05].estado<-"MG" times[06].nome<-"Cruzeiro" times[06].estado<-"MG" times[07].nome<-"Sport" times[07].estado<-"PE" times[08].nome<-"Atlético Paranaense" times[08].estado<-"PR" times[09].nome<-"Paraná" times[09].estado<-"PR" times[10].nome<-"Botafogo" times[10].estado<-"RJ" times[11].nome<-"Flamengo" times[11].estado<-"RJ" times[12].nome<-"Fluminense" times[12].estado<-"RJ" times[13].nome<-"Vasco da Gama" times[13].estado<-"RJ" times[14].nome<-"Grêmio" times[14].estado<-"RS" times[15].nome<-"Internacional" times[15].estado<-"RS" times[16].nome<-"Chapecoense" times[16].estado<-"SC" times[17].nome<-"Corinthians" times[17].estado<-"SP" times[18].nome<-"Palmeiras" times[18].estado<-"SP" times[19].nome<-"Santos" times[19].estado<-"SP" times[20].nome<-"São Paulo" times[20].estado<-"SP" escreval("RELAÇÃO DE TIMES DO BRASILEIRÃO 2018") escreval() para i de 1 ate 20 faca escreval(times[i].nome,"-",times[i].estado) fimPara fimAlgoritmo  
     
     
    3#
    Utilizando registros e 2 vetores.
    algoritmo "FCdH" tipo t_time = registro nome :caracter estado:inteiro //código do estado fimRegistro var times :vetor [1..20] de t_time estados:vetor [1.. 9] de caracter //nome dos estados i, j :inteiro INICIO estados[1]<-"BA" estados[2]<-"CE" estados[3]<-"MG" estados[4]<-"PE" estados[5]<-"PR" estados[6]<-"RJ" estados[7]<-"RS" estados[8]<-"SC" estados[9]<-"SP" times[01].nome<-"Bahia" times[01].estado<-1 times[02].nome<-"Vicetória" times[02].estado<-1 times[03].nome<-"Ceará" times[03].estado<-2 times[04].nome<-"América Mineiro" times[04].estado<-3 times[05].nome<-"Atlético Mineiro" times[05].estado<-3 times[06].nome<-"Cruzeiro" times[06].estado<-3 times[07].nome<-"Sport" times[07].estado<-4 times[08].nome<-"Atlético Paranaense" times[08].estado<-5 times[09].nome<-"Paraná" times[09].estado<-5 times[10].nome<-"Botafogo" times[10].estado<-6 times[11].nome<-"Flamengo" times[11].estado<-6 times[12].nome<-"Fluminense" times[12].estado<-6 times[13].nome<-"Vasco da Gama" times[13].estado<-6 times[14].nome<-"Grêmio" times[14].estado<-7 times[15].nome<-"Internacional" times[15].estado<-7 times[16].nome<-"Chapecoense" times[16].estado<-8 times[17].nome<-"Corinthians" times[17].estado<-9 times[18].nome<-"Palmeiras" times[18].estado<-9 times[19].nome<-"Santos" times[19].estado<-9 times[20].nome<-"São Paulo" times[20].estado<-9 escreval("RELAÇÃO DE TIMES DO BRASILEIRÃO 2018") escreval() para i de 1 ate 20 faca escreval(times[i].nome,"-",estados[times[i].estado]) fimPara fimAlgoritmo  
     
    ***
     
    Por ai vai.
  23. O post de Simon Viegas em Média errada não encontro erro foi marcado como solução   
    Pelo contrário... os parênteses do código original não tem utilidade em nível de preferência, ou seja, isso:
     
     
     
    É o mesmo que isso:
    mpa1 = pro1_1 * 6 + pro2_1 * 4 / 10; mpa2 = pro1_2 * 6 + pro2_2 * 4 / 10;  
    Em ambos os códigos, primeiro multiplica [1] pro1_1 por 6..., depois multiplica os [2] pro2_1 por 4, após, [3] divide a conta 2 por 10, só depois adiciona a conta [1] a conta [3]. Resumindo: a conta 1 não vai ser dividida por 10.
     
     
    Já no seu novo código, ficou certo:
    mpa1 = ((pro1_1 * 6) + (pro2_1 * 4)) / 10; mpa2 = ((pro1_2 * 6) + (pro2_2 * 4)) / 10;  
    Que é o mesmo que:
    mpa1 = (pro1_1 * 6 + pro2_1 * 4) / 10; mpa2 = (pro1_2 * 6 + pro2_2 * 4) / 10; Veja que os parênteses da multiplicação não são necessário... entretanto, para um melhor efeito didático, deixe da forma que você fez... (visualmente separa as etapas)
     
    Att
     
     
  24. O post de Simon Viegas em Código para mostrar números pares de 1 até 100 foi marcado como solução   
    Olá @Vinicius Zancanari.
     
    Sintaxe do for:
    //for (int i= 1;i<= 100,i++;) for (i=1; i<=100; i++) {  
    adicionado 6 minutos depois ADENDO:
    Os números pares são em sequência... não precisa ficar verificando. Ex.:
    #include <stdio.h> main () { for (int i=1; i<=100/2; i++) { printf ("Numero par: %d\n",i*2); } } ou
    #include <stdio.h> main () { for (int i=2; i<=100; i+=2) { printf ("Numero par: %d\n",i); } } Etc
     
  25. O post de Simon Viegas em Como capturar o valor das setas ? foi marcado como solução   
    Olá @Code guy.
     
    Como o código já está "pronto", vou tentar levantar algumas questões:
     
     
    1) LEITURA DA TECLA PELO GETCH()
     
    No caso, continua acontecendo o que foi citado:
    O programa tem que fazer a leitura duas vezes para poder executar o que se deseja, ou seja, está dando 2 loops para fazer uma coisa só. Pelo testes, o seu código está resultando no que deseja, mas, particularmente, entendo que existe um pequeno erro de lógica aí... pois deveria fazer cada tecla em um único loop.
    Para "provar" isso, poderia inserir esse trecho no código:
    int cont=0; //usado para contar quantos loops o programa já deu do { system("cls"); cont+=1; printf("Loop %d",cont);  
     
    Para corrigir isso, poderia fazer algo como sugerido por @vangodp.
     
     
    Poderia ficar com algo assim:
    seta = getch(); if (seta == 0 || seta == 224) //caso retorne um "pré-código" de setas seta = getch(); //ler novamente (para pegar a segunda parte) Entende? ao pressionar uma seta, o método getch() primeiro retorna um código (224 ou 0)... ao tentar ler novamente uma tecla nova tecla, ele já retorna o código da tecla em si (obs.: a tecla é pressionada uma única vez, mas "consome" duas leituras).
     
    Ai entra questão também das outras possibilidades... como do @cyer ou outras que podem existir...
     
     
     
    2) CONDIÇÕES MUTUAMENTE EXCLUDENTES
    Tecnicamente, para condições mutuamente excludentes em if, seria "necessário" o uso do else... pois se uma condição for verdadeira, necessariamente jamais poderia ser um outra... logo, não faz sentido verificar. Veja:
    Se seta conter 72, JAMAIS, poderá também conter 80 também... logo, precisa do else antes do segundo if. Idem para os if da posicao.
     
    Veja por exemplo o código do @cyer... só vai verificar as próximas, se as anteriores não forem verdadeiras.
     
     
     
    3) "ORDEM DOS TRATORES"
    Observe que no seu código você está usando ifs antes mesmo ter ter algum valor para seta, ou seja, está comparando algo que não foi inicializado. E não tem motivo para comparar... já que a comparação vem do fato da intenção de querer mudar, ou seja, do usuário ter pressionado uma tecla... se ninguém pressionou nada, por que verificar?
    Resumindo: a leitura da seta deve vir antes dos if. Você colocou abaixo.
     
    ***
     
     
    Por ai vai.
     
    Att.

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!