Ir ao conteúdo

Simon Viegas

Membro VIP
  • Posts

    3.940
  • Cadastrado em

Tudo que Simon Viegas postou

  1. Olá. 1) PADRÕES DE INDENTAÇÃO Reforçando essa questão... Seu código está relativamente organizado, mas ainda é necessário mais rigor no padrão utilizado. Não existe uma regra única, mas é necessário que identificando/criando a sua e passar a seguir ela. Seguindo mais ou menos a base da sua indentação, seu código poderia ficar assim: program caixa; uses CRT; type t_produtos = record codigo: string[5]; descricao: string[10]; preco: real; end; var produto :array [1..5] of t_produtos; preco1 :real; troco :real; pagamento :real; quantidade :integer; prodescolhido:string; totalcompra :real; finalcompra :string; begin repeat produto[1].codigo := '1111'; produto[1].descricao := 'Arroz'; produto[1].preco := 5.00; produto[2].codigo := '1112'; produto[2].descricao := 'Feijao'; produto[2].preco := 2.00; produto[3].codigo := '1113'; produto[3].descricao := 'Macarrao'; produto[3].preco := 3.50; produto[4].codigo := '1114'; produto[4].descricao := 'Leite'; produto[4].preco := 1.50; produto[5].codigo := '1115'; produto[5].descricao := 'Acucar'; produto[5].preco := 4.50; writeln('Insira o Codigo do Produto'); readln(prodescolhido); writeln('Insira a Quantidade'); readln (quantidade); case prodescolhido of '1111': preco1 := produto[1].preco; '1112': preco1 := produto[2].preco; '1113': preco1 := produto[3].preco; '1114': preco1 := produto[4].preco; '1115': preco1 := produto[5].preco; end; //fim case totalcompra := totalcompra + quantidade*preco1; writeln ('Finalizar Compra?'); readln(finalcompra); until (finalcompra = 'Sim'); if (finalcompra = 'Sim') then begin clrscr; writeln('Total da Compra: R$ ', totalcompra:6:2); writeln('Pagamento'); readln(pagamento); troco:= pagamento-totalcompra; writeln('troco: R$ ', troco:6:2); writeln('Pressione ENTER para finalizar o programa'); readln; end; end. Basicamente entrando a questão dos "dentes" no lugar certo e melhor uso do espaçamento entre linhas. Um ponto particular meu está no alinhamento dos tipos ali nas variáveis... isso não é comum, mas acho bem interessante. 2) CADASTRO DOS PRODUTOS O cadastro só precisa ser feito uma vez, ou seja, deve ficar fora do repeat. Algo como: ... totalcompra :real; finalcompra :string; begin produto[1].codigo := '1111'; produto[1].descricao := 'Arroz'; ... produto[5].preco := 4.50; repeat writeln('Insira o Codigo do Produto'); readln(prodescolhido); ... 3) PESQUISAR DADOS EM VETORES E/OU REGISTROS Em relação ao uso do for, a ideia é que percorra o vetor posição por posição e vai comparando o prodescolhido com o codigo do produto. Dessa forma, forma, após ter o prodescolhido, encontrará a posição do produto no vetor (ou não) e usará o preço que está lá... é como está sendo feito no case, só que em vez de enumar, usar um laço de repetição para ir comparando. Da forma que você fez está bom e funciona, apenas que precisará de uma opção do case para cada item. Se forem 20.000 itens, seriam 20.000 opções... fora que a questão para atualizar os código... Os código estão no "código fonte", e não nas "tabelas de produtos" (no vetor). Então, por enquanto deixe como está. Pois acho que precisa antes ajustar outras coisas, como os citarei abaixo. Depois tenta ajustar o código para usar o laço. 4) SUGESTÕES Observação inicial: cada item é facultativo, mas deve ser feito individualmente, ou seja, só faz um novo item após o item escolhido estiver pronto e funcionando. Não é interessante fazer duas ou mais coisas ao mesmo tempo. Qualquer dúvida sobre um item é só ir perguntando. 4.1) Exibir dados do item atual na tela Ao registrar um produto ou quantidade, não está dando para ver qual foi consta no sistema. Seria interessante exibir esses dados na tela. A medida que cadastra um item, mostra os dados dele. 4.2) Mesclar leitura de produto com fechar venda Ficar perguntando se quer finalizar a compra para cada item fica repetitivo e cansativo, imagine você como um caixa de supermercado e ter que ficar respondendo isso a cada item. Uma boa forma que contornar isso seria utilizar a leitura do código mesmo, ou seja, ou "operador do caixa" digita o código do produto, ou digita, por exemplo, "fechar" ou "sair" etc. Se digitou "fechar" (ou o que seja), fecha a conta e passa para a próxima etapa do pagamento. Senão, continua normalmente localizando o código da venda. Veja, a ideia é que o caixa vai ficar sempre esperando para cadastrar um produto... quando quer sair, insere o respectivo comando. A parte da leitura do código funcionaria como uma leitura de códigos gerais... se for produto, vai simplesmente registrar o produto. Se for outra coisa, vai para a outra coisa, como o "fechar", ou "cancelar item", ou "inserir cpf".. etc. Inclusive a opção de inserir a quantidade também não é para todos os itens, pelo contrário, somente os itens que são identificados como repetidos, que o operador insere a quantidade... outro ponto notável é que a quantidade vem antes do código, ou seja, primeiro insere a quantidade, depois passa o item. Pelo menos vejo isso nos mercados. Resumindo: você poderia fazer algo assim: se o código informado for "x" (ou "*" etc), o programa ler a quantidade; senão se o código for "fechar", o programa fecha a venda e vai para o pagamento"; senão localiza o código e registra o produto. *** Exemplo de esboço de como pode ficar a tela: Lembrado que os ajustes devem ser feitos aos poucos... não tente fazer tudo de uma vez que é mais complicado. PS: para alinhar o texto, eu fiz assim: totalcompra := totalcompra + quantidade*pdtTemp.preco; writeln(pdtTemp.codigo:4,' ',pdtTemp.descricao:11,' ',quantidade:3,' ',pdtTemp.preco:4:3,' SUB ',totalcompra:3:3); Essa variável temporária declarei assim: pdtTemp :t_produtos; No aguardo.
  2. Olá. Bacana. Seja bem vindo ao Fórum do Clube do Hardware. Sobre as nomenclaturas das variáveis: Justamente, é recomendado que utilizem nomenclaturas de variáveis mais próximas às suas finalidades... por exemplo: Então, se o que deseja é o "quantos anos a pessoa faz ou faria no ano", um bom exemplo de nomenclatura seria qtdAnos ou idade ou janeiros ou idadeNoAnoAtual etc. Entende? A ideia é deixar o mais próximo do contexto que elas representam. Da mesma forma, como você mesmo sugere, soma não ficou muito adequado, já que é justamente o oposto... uma "subtração". Umas sugestões para nomenclatura seriam anoNascimento ou anoInicial ou nascimento etc. Em relação as dúvidas aqui no Fórum, a orientação é que tratem apenas um código para cada tópico, ou seja, nesse sentido, nesse tópico trataríamos apenas da primeira dúvida que é relacionado a «um enigma no Pascal». Caso queira tratar de um novo tema, como «O programa que fala a sua idade:», aí abriria um novo tópico para tratar dele, ou seja, dessa forma, cada programa terá um tópico próprio... caso contrário, os temas ficaram misturado... por exemplo, começamos a falar do programa da "Ano de Nascimento", daí, de repente precisa voltar para o tema do "Enigma".. as postagem ficariam misturadas, entende?. Nesse tópico, vamos focar no Enigna, ok? Como está o andamento do código? Tem alguma dúvida sobre alguma parte ou precisa de ajuda ou já terminou ele? Caso tenha dúvidas sobre o código da idade ou outro código, por favor, abra um novo tópico. No aguardo.
  3. Olá @Mauro Britivaldo. Pois é, então teoricamente o site está errado. Concorda? rs Sobre a minha resposta anterior, estava complementando... segue: Para fins de testes (de aprendizagem particular), e, aproveitando para servir de demonstração do que consegui, segue código com outra reorganização #include <stdio.h> int main(int argc, char** argv) { int A, a, B, b; //Inicio: A-horas a-minutos, e Fim: B-horas b-minutos scanf(" %d%d%d%d", &A, &a, &B, &b); //leitura dos dados. Podem ser separados por "espaços" (no contexto, seria "DEVE") if (A == B && a == b) //se horários são iguais B = 24, b = 0; //supoem-se que virou o dia, logo sendo 24h de jogo. else { //pré-calcula a quantidade de horas if (A >= B && a >= b) //se respectivamente a hora e minuto inicial forem maior que a hora e minuto final ("se virou o dia") B = 24 + B - A; //a hora final será a diferença, mais a compensação de 24 horas else B = B - A; //a hora final será apenas a diferença //calcula a quantidade de minutos if (a > b) //se minuto inicial for maior que minuto final B = B - 1, b = 60 + b - a; //retira uma hora da hora final e o minuto final será a diferença, mais a compensação de 60 minutos else b = b - a; //o minuto final será apenas a diferença } printf("O JOGO DUROU %d HORA(S) E %d MINUTO(S)\n", B, b); } Obs. 1: meus testes se referiram basicamente no uso de vírgula para separar as instruções. Não conhecia essa possibilidade, e achei curioso e interessante. Obs. 2: deixei o código sem a correção do erro citado mais acima, apenas dei uma reorganizada e inserir uma tentativa de explicar o código. Se possível, minha sugestão seria deixar inicialmente o @diogo moura tentar corrigir, caso queira é claro. Caso não consiga (ou não queira), eu ou @Mauro Britivaldo ajudamos, beleza? No aguardo.
  4. Olá. Seria isso? #include <stdio.h> int main(int argc, char** argv) { int A, a, B, b; //Inicio: A-horas a-minutos, e Fim: B-horas b-minutos scanf(" %d%d%d%d", &A, &a, &B, &b); if (A == B && a == b) B = 24, b = 0; else { //if (A >= B && a > b) if (A >= B && a >= b) { A = 24 - A; B = B + A; } else B = B - A; if (a > b) { B = B - 1; b = 60 + b - a; } else b = b - a; } printf("O JOGO DUROU %d HORA(S) E %d MINUTO(S)\n", B, b); } Vejam: No aguardo.
  5. Olá a todos. @Mauro Britivaldo, em relação a minha à participação como colaborador, já aproveitando o contexto, fiz alguns testes com seu código e erros foram encontrados, ex.: Teoricamente teria que dar 22h (se não me engano). Não sei como funciona os critérios do ambiente, mas teoricamente o código está teoricamente falhando pelo menos nesse quesito. Já falando como um moderador, apesar da boa intenção, recomendamos que não "entregue" um código com uma reposta pronta para o usuário. A orientação que tentem orientar para o que o próprio usuário identifique os seus erros e os corrija. Em relação ao código do @diogo moura, consegui identificar pelo menos que está com problemas ao inverter a subtração. Já que se começou 7h00, e terminou 6h00, teriam jogado 23h (se não me engano), e não 1h. Pode haver outros erros, mas no mínimo, supostamente, tem esse. Suponho eu que essa questão não foi observada, já que não foi citado inicialmente. Aí ver se após "ajustar", se melhoria a resultado no site, assim como verificar quais são os outros critérios para o ambiente, ou seja, tentar identificar o problema para assim tentar corrigir. No aguardo.
  6. Olá. Não sei como funciona os critérios do URI, mas tem pelo menos um detalhe: esse lance de inverter a hora caso o final seja menor que o inicial está errado. Se cara começa 7 0 e termina 6 0, ele jogou apenas 1 hora? nops!
  7. Olá. 1) POSICIONAMENTO DO VETOR Na verdade está utilizando a variável errada.. a coordenada do vetor está em cont (recebido por parâmetro), e não o j local (do procedimento). Por sinal, essa variável local j não deveria nem existir. Simplesmente apague! 2) ATUALIZAÇÃO DE POSIÇÃO PARA CADASTRO Você precisa atualizar a posição da coordenada antes de adicionar. Teoricamente cont começa com 0, ai você atualiza antes de adicionar. obs.: apesar de ser automática, é recomendado inicializar a variável cont logo após começar o programa (atribuir o valor 0 a ela). 3) NOMENCLATURAS DE VARIÁVEIS Evite confusões... use sempre nomenclaturas de variáveis sugestivas, ex.: Em vez de: var opcao :integer; cont :integer; valores:vetValores; 4) CORRELAÇÃO DE VARIÁVEIS Para adicionar você passou por parâmetro a variável j, mas, como vistos nos outros procedimento, deve usar a cont. Essa variável j (global) não tem nada a ver com a história. 5) PASSAGEM DE PARÂMETROS Na hora de listar, está usando passagem por referência sem necessidade (não precisa do var). E para os diferentes procedimentos e funções, siga a mesma linha de raciocínio, ou seja, se começou chamado de vet e cont lá nas assinaturas, continue usando eles... não tem porque usar i ou j... Perceba inclusive que você usou a nomenclatura j tanto para auxiliar para percorrer o vetor em um lugar, e j como o vetor em si em outro... a ideia e padronizar o bagulho... seguir a mesma lógica em todo o código. Obs.: i e j são comumente utilizado apenas como "auxiliar para percorrer vetores"... por padrão, deixe elas para esse fim. Não use para outra coisa. Obs.2: claro que não é rígido, mas deve existir alguma justificativa/coerência na escolha, por exemplo. *** No aguardo.
  8. Olá. 1) COMO E PORQUE POSTAR CÓDIGOS Ao postar um código, é necessário utilizar a tag CODE. Favor ler comunicado contido no topo do fórum: "Poste seus códigos corretamente!" 2) INDENTAÇÃO DE CÓDIGO Na programação, é essencial que o código sempre esteja indentado. Os padrões são diversos, mas tem que seguir uma lógica. Ex.: program caixa; uses CRT{, math}; //unit math não utilizada var prodescolhido:string; quantidade :integer; preco :real; pagamento :real; troco :real; totalcompra :real; finalcompra :string; {produto :string;} //variável não utilizada begin repeat writeln('Produto Escolhido e Quantidade'); readln(prodescolhido); readln(quantidade); case prodescolhido of 'Arroz' :preco:=5.0; 'Feijao' :preco:=2.0; 'Macarrao':preco:=3.5; 'Leite' :preco:=1.5; 'Açucar' :preco:=4.0; end; totalcompra:=totalcompra + quantidade*preco; writeln ('Finalizar Compra?'); readln(finalcompra); until (finalcompra = 'Sim'); if (finalcompra = 'Sim') then begin ClrScr; writeln('Total da Compra: R$ ', totalcompra:6:2); writeln('Pagamento'); readln(pagamento); troco:= pagamento-totalcompra; writeln('troco: R$ ', troco:6:2); writeln('Pressione ENTER para finalizar o programa'); readln; end; end. 3) CADASTRO DOS PRODUTOS Sim. Inclusive existem dois recursos que podem ajudar: record (registros) e file (arquivos). Esse último pode ficar para depois. Então, poderia organizar mais ou menos assim: program caixa; uses CRT{, math}; //unit math não utilizada type t_Produtos = record //definição do tipo "produto" codigo :string[5]; descricao:string[10]; preco :real; end; Ai seria um esboço, os dados necessários vai verificando aos poucos. A variável ficaria mais ou menos assim: var produtos :array [1..5] of t_Produtos; //lista de produtos cadastrados Percebe que o type apenas criou um tipo personalizado... Apenas que esse tipo é um record, ou seja, para acessar um produto utiliza a coordenada do vetor normalmente e para acessar um dado deste produto utiliza ".", ex.: produtos[2].descricao:='Feijao'; produtos[2].preco :=2.0; Não tem mistério. No registro, é como se cada variável tivesse outras sub-variáveis. Nesse caso é um vetor de registros. Segue os mesmos princípios de um vetor comum, a diferença que existe esse acesso via "." para dado do registro. 4) ESTOQUE DE MERCADORIAS Não sugiro implementar isso agora. Pode ficar pra depois. Antes devem vir as estruturas do produtos e das vendas. 5) CADASTRO DE ITENS DE VENDA O ideal é analisar o "mundo real", geralmente os itens são registrados OU pelo código de barras, lidos pelo leitor ou digitados manualmente (mais tradicional); OU pelo nome do produto, que ao digitar vai localizando (comum em mercadinhos , padarias...); OU por um código do item na loja, algo como uma tabela que foi cadastrada de acordo com critérios da loja, tipo 1211 para Arroz X, 2415 para Feijão Z, 3144 para Arroz G, 4724 para Açúcar H..; OU etc.... Acho que por enquanto a maneira prática seria utilizando parte dos códigos de barras originais de produtos, algo como os últimos 3 ou 4 dígitos. Ai, na hora de "passar" no caixa, o "operador" digitaria o código, e programa localizaria o produto e apresentaria na tela, após digitaria a quantidade e registraria a venda. Ou seja, a forma como idealizar cadastrar os itens vai impactar na forma de como irá cadastrar o produto lá no item 3. *** Se for seguir essa linha de raciocínio.. Próximas etapas: - define a estrutura do type para o produto e o vetor dele; - cadastra os produtos com os seus respectivos dados (faz isso logo após o begin principal), algo como: BEGIN //Cadastro dos produtos produtos[1].codigo :='11111'; //vou usar código em sequência para facilitar os testes produtos[1].descricao:='Arroz Tio Joao 1 KG'; produtos[1].preco :=5.0; Isso para cada item... - quando for passar item, será necessário localizar o produto de através de um dos seus dados (no caso, código ou descrição), ai ao encontrar, usa o .preco do respectivo produto lá na conta. Use um for para percorrer o vetor e encontrar a posição do produto que quer. Qualquer dúvida é só perguntar. No aguardo.
  9. Olá. Eu não tinha entendido o contexto, mas já consegui entender. Ficou muito bom! Obs.: apenas um detalhe: os se dentro do repita precisam do senao também, já que são mutuamente excludentes.
  10. Por quê do maior? não daria para verificar o tamanho individualmente? Nops! Tem que tomar cuidado para não se atrapalhar... zero seria o código, ou seja, código zero representa o caractere "null carater" ("não é caractere" ou "nulo"). Já o caractere 0 tem como o código 48 tanto no ASCII, tanto no ANSI. Etc. Obs.: pelo que consta, ANSI não é uma codificação em si, ou seja, é o nome do instituto, não da codificação... assim como temos o ABNT. Qualquer coisa dá uma pesquisa mais a fundo sobre. Essa tabela provavelmente deve ser apenas dos "caracteres imprimíveis"... eu não consegui encontrar uma tabela completa do ANSI (suposta tabela), só uma que começa justamente do 32 também. É com Visualg mesmo ou outra linguagem? Se puder posta o código aqui que analisamos melhor.. No aguardo.
  11. A questão é: para quê guardar esses subtotais por produto? pelo que entendi do seu código, você pode simplesmente ir acumulando o subtotal. O Subtotal será simplesmente: subTotal:=subTotal+(precoUnitario*quantidade); Em relação aos if, não é necessariamente sobre a quantidade, mas sobre o "tipo", ou seja, os itens são excludentes entre si... se for um não pode ser mais um outro, logo teria que usar if/else. (vide diferenças em if e if/else) No aguardo.
  12. Olá. Nesse caso está comparando como um conjunto de caracteres "a...z", seria uma string. Assim como é "Maria". Além dos conceitos apresentados por @devair1010, seria possível também usar o operador in. Ex.: if (caracter in ['a'..'z']) or ((caracter in ['A'..'Z'])) then ou if (UpCase(caracter) in ['A'..'Z']) then ou if (caracter in ['a'..'z','A'..'Z']) then Para os caracteres que representam o números, idem. Obs. 1: o ".." serve para definir uma faixa e a "," serve para enumerar as opções, ou seja, se fosse, por exemplo, vogais, poderia enumerar uma a uma (pois elas não estão em sequência na tabela ASCII). Obs. 2: Não é possível utilizar a sequência de minúsculos e maiúsculos de uma vez só pois elas também não estão em sequência, exista outros caracteres entre um e o outro. Se estivessem, seria algo como: if (caracter in ['A'..'z']) then Mas lembrando: não serve para o seu caso. No aguardo.
  13. Olá. Pelo que consta seria 0 (zero), ou seja, seria a representação do null character. Vide Caractere Nulo no Wikipedia. Mas não sei como funcionaria no Visualg... teria que entender melhor o contexto. ADENDOS: - acho "" estaria mais para "caractere nulo" mesmo. O termo "espaço vazio" seria " ", ou seja, existe um espaço, mas ele está vazio; - a tabela utilizada no Visualg é ASCII (ANSI é outra); No aguardo.
  14. Olá @MarkosM, seja bem vindo ao Fórum do Clube do Hardware. Vamos analisar o que foi passado: Nesse caso, ao atualizar o preço, você está apenas atribuindo um valor, ex.: Ou seja, a posição do vetor vai receber "algo vezes outro", que é algo como "valor do total dos itens registrados no momento". Como você quer : Então você poderia fazer é também deixar o valor atual na conta, algo como: subtotal[1]:=subtotal[1]+(quantidade*preco1); obs.: os "()", matematicamente, não são necessário, incluir apenas para destacar que são dois itens: "valor atual"+"valor do subtotal dos itens registrados no momento". *** Sugiro que teste para ver se funcionar. Mas além disso, tem outros pontos que acho que precisam ser verificados, como: use do if/else em vez de só if (ou usar case); a forma de calcular o subtotal, ou seja, você pode simplesmente ir somando o "valor unitário * quantidade". Separar os item num vetor não está tendo utilidade alguma, pelo menos na forma que você está fazendo. Caso queira ir implementando funcionalidades, é só postar. No aguardo.
  15. Só complementando: Vamos a pergunta: A resposta é SIM. Vai aumentar! Agora, quanto a vai aumentar? como citado: ou seja, existe um aumento mínimo/irrisório..., mas isso é por um parâmetro técnico... na prática não faz diferença. Se para seu contexto fica melhor usar uma chamada dentro da outra, pode utilizar. Nesse "nosso" nível de programação não precisamos nos preocupar com isso. Acho que o mais importa é a velocidade do processamento... e que mesmo assim deve também ter uma diferença irrisória para programa simples. O que não pode é utilizar as chamadas em círculo ou recursivas... algo como um procedimento chamar outro para voltar, como um item do menu, chama menu em si... chamar um procedimento NÃO É apenas um "um atalho" para as instruções, envolve outras problemáticas. Se você já viu programação em .bat, verás que lá tem um tal de GOTO. Lá sim funciona como apenas um "jump", ou seja, o código "pula" para determinado trecho, aqui não, envolve essa tal de pilha.
  16. Olá. Quando você tentou aconteceu o quê? dizer que não conseguiu não é suficiente. Tente interpretar os erros..., ai tenta corrigir, caso não consiga posta indicando onde está com dificuldade. Vamos lá: Ao compilar deu esse erro: _FCdH.PAS(8,45) Fatal: Syntax error, ")" expected but ";" found O erro diz que esperava um ")", mas encontrou um ";", ou seja, sugere que está faltando ")" na instrução. O erro está nesta linha, na coluna 45: resultado:=(n1 + n1) + (sqrt(exp(2*ln(n1)); Como citado: Olhe quantos "(" você usou, e quantos ")" existem para fechar cada um deles. No aguardo.
  17. Olá. Em relação ao erro: Este já diz o que está acontecendo. Só traduzir. Resumidamente: para cada parêntese aberto, necessitam-se de uma correspondente para fechar. No aguardo.
  18. Erro meu. Seria ">=", ou seja, teoricamente no máximo vai ser igual mesmo.. mas se por algum motivo qualquer esse valor fique maior que o máximo, também não continuará (se usar só igual, iria). É uma proteção a mais. Na hora de listar, o cont é contador de cadastros, daí, ele se refere a última posição do vetor. Para percorrer o vetor, você utiliza a auxiliar j que vai de 1 a cont, logo, deveria usar o j para posicionar o vetor. writeln(i[j]); Tenta corrigir esses pontos e posta o código completo, daí fica mais fácil para reanalisamos. No aguardo.
  19. Na verdade não, o programa continua entrando no else da mesmíssima forma, ou seja, esse if vai servi na verdade para "não executar o texto quando acertar a resposta". Resumindo: basicamente você está descrevendo "o problema" de forma errada. PS: se atentar para manter o código sempre indentado. Esse printf() deve ficar um dente pra frente. A título de curiosidade, esse {} não é necessário quando se tem apenas uma instrução, ex.: #include <stdio.h> #include <stdlib.h> #include <time.h> int main () { int op,sorteio=0,cont=1; srand((unsigned)time(NULL)); sorteio=rand(); printf("Sorteando um numero entre [0,%d]\n", RAND_MAX); printf("%d",sorteio); do { printf("\n Tentativa %d: ",cont); scanf("%d",&op); if(sorteio>op) printf("O numero sorteado e maior que %d",op); else if(sorteio!=op) printf("O numero sorteado e menor que %d",op); cont++; } while( op !=sorteio ); printf("parabéns voce acertou o numero sorteado em %d tentativa(s)\n ",cont-1); system("pause"); return 0; } Obs. 1: aparentemente existem 2 comandos dentro do else, mas na verdade só tem um... que é o if. O printf() está dentro do if (pertence a ele), ou seja, não conta. Essa é uma das "mágicas" da indentação, ela já sugere como a estrutura funciona... Obs. 2: a indentação NÃO influencia no código, é apenas estética, mas é de fundamental importância. Obs. 3: retire o número que foi sorteado da tela, com ele exibido eu sempre acerto de primeira, rs. Outra coisa, esse "aleatório" não está funcionando muito bem, pelo menos aqui no Dev++... toda vez que abro o programa, o número apenas vai aumentando um pouco... ou seja, o cara já dá para saber que o número segue essa lógica e fica mais fácil para chutar. Sugiro que verifique outra forma de sorteio mais eficiente. No aguardo.
  20. 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
  21. O tópico está a algum tempo parado, mas vou tentar complementar: A grosso modo: não. Não é mesma coisa. Creio que: read(x); read(y); Seja o mesmo que: read(x,y); Daí seguindo as características do que já foi citado nas outras postagens e também o que é citado no link. Para o read: Ou seja: Resumindo: a princípio, a diferença está em usar o ln ou não. Usar junto ou váris comandos separados não faz diferença. Como já comentado, não seria essa característica. Basta dá uma olhada nos comentários anteriores. Esse foi basicamente o motivo para criar esse tópico e tentarmos esclarecer sobre o tema e ver que não é isso. Como já sugere mais a cima, o readln também pode. Algo como: readln(a,b,c); Reforçando: creio eu que não tem diferença entre ler um a um (um read ou readln para cada variável) ou usar de uma vez com um único comando, este último serviria apenas para simplificar, ou seja, o que faz diferença é ter ln ou não... separado ou junto seria basicamente estética.
  22. Olá. Mude o read para readln. Dê uma olhada nesse tópico: Qual a diferença entre READ e READLN ??? PS: ao usar readln para aguardar antes de continuar (e por consequência fechar), você precisará dar um ENTER. Caso queira continuar com qualquer* tecla, poderá usar o ReadKey. Ex.: writeln('a idade da pessoa e: ',idade); writeln; write ('Pressione qualquer tecla para continuar'); ReadKey; end. obs. 1: vale salientar que esse texto que coloquei antes não faz parte do comando, apenas inserir para complementar o código, ele poderia está no seu também, a diferença que teria que dizer "Pressione ENTER...". A tecla ReadKey funciona parecido com o readln, a diferença que a tela digitada é retornara no próprio comando, em vez jogada na variável que foi passada por parâmetro, ou seja, caso quisesse pegar o valor, usaria algo assim: tecla:=ReadKey; obs. 2: caso o comando não funcione no seu compilador, acusando algo como "Identifier not found...", será necessário carregar a unit (biblioteca) que contém o comando, no caso a CRT (ou WinCRT, em alguns casos). Ex.: program nome_idade; uses CRT; Qualquer dúvida é só perguntar. No aguardo.
  23. Olá @edsonxdXDxd. Seja bem vindo ao Fórum do Clube do Hardware. 1) DECLARAÇÃO DE VARIÁVEIS O erro diz que foi esperado um ";", mas foi encontrado uma ",", ou seja, para "finalizar" a declaração de um tipo é necessário um ";". Ex.: var n1, resultado: real; round: integer; Ou para ficar mais organizado: var n1, resultado :real; round :integer; 2) UTILIZAÇÃO DE FUNÇÕES PREDEFINIDAS Ao compilar novamente vai dar outros erros... Como esse esse é um pouco mais complexo, vou adiantar... verás que dará um erro mais ou menos assim: _FCdH.PAS(9,28) Fatal: Syntax error, ")" expected but "(" found O erro diz que na linha 9, coluna 28, que fica logo após o round é esperado um ")", mas foi encontrado um "("... Ou seja, que supostamente era necessário fechar o writeln. Isso ocorre porque round é uma variável no seu contexto, e depois de variável não em "(". Como assim? pode se perguntar! Creio eu que a sua intenção foi usar a function (função) que tem a nomenclatura round (essa aqui), mas como você criou uma variável com a mesma nomenclatura lá no var, o Pascal perdeu a referência a funcion e passou a associar a round como sendo a variável que você definiu. Entende? Resumindo: o round() é uma função já predefinida e você não precisa ser declarada. Apenas use-a. Da mesma forma que você usa a precedure write ou read... essas funções e procedimentos já estão pré-carregadas e prontas para uso. *** Por fim... só compilar novamente, ver se vai dar algum erro e tenta corrigir. Após testa o algoritmo para ver se está dando o resultado esperado. Qualquer dúvida é só postar. No aguardo.
  24. Olá. Como assim não está entrando? o que acontece? Testei aqui e está entrando.
  25. Olá. Verdade. O valor de N está sendo necessário em duas funções distintas, ou seja, após os métodos terminarem, esse valor precisa ficar armazenado. E resumidamente seria: - Em relação ao seu código atual, não precisa de parâmetro no Verificar_se_inteiro(), basta usar o n diretamente. - Na função Verificar_se_inteiro(), se for usar parâmetro, não use a variável global também. - Sugiro que tente passar o máximo de dados externos pelo parâmetro, em vez de usar variáveis globais. Na versão estendida... Já que está acessando a variável global N (em vez de receber por parâmetro) nos 2 métodos, poderia fazer o mesmo com o Verificar_se_inteiro(), ou seja, deixando este método sem receber parâmetro também, simplesmente usando o N global diretamente. Obs.: Em relação ao código atual, já que estava recebendo, deveria usá-lo, ex.: {Se (N <> 0) ENTÃO} //você está recebendo o valor por parâmetro, use-o Se (num <> 0) ENTÃO Quociente <- num/Int(num) Entendeu? A minha sugestão é que todos os métodos usem apenas as suas variáveis locais, e tudo que precisa ser externo venha por parâmetro. Isso com exceção do vetor, pois no Visualg não é possível (ou desconheço uma forma). Ex.: Para as variáveis globais: var vetorA :vetor[1..MAX] de real //vetor que armazenará os números usados n :inteiro //quantidade de número que serão usados E as assinaturas dos métodos: procedimento leiaVetorA(var qtdNum:inteiro) Recebe a quantidade de números que serão usados (e receberia o vetor também, mas como não dá...). Faz o que tem que fazer e no final essa variável que foi recebida estará atualizada. Perceba que está recebendo um inteiro, pois a quantidade de número é inteira mesmo... como você implementou a verificação para não aceitar números não inteiros (com fração), usaria outra variável local real para ler, ai verificaria se é inteiro ou não, após obter um inteiro válido, atualizaria a variável qtdNum (que por consequência irá atualizar o n global que é inteiro). obs.1: teoricamente a nomenclatura da variável do parâmetro pode ser igual a nomenclatura da variável global... ou seja, seriam variáveis distintas com o mesmo nome, mas em escopos diferentes. Para não confundir, deixei propositalmente com outro nome. obs. 2: perceba que o parâmetro será recebido como referência (com o var), ou seja, a variável alterada dentro do método altera também a variável que foi enviada pelo parâmetro (no final do método, a variável global ficará com o mesmo valor que a variável do parâmetro da função ficou, em detrimento de quando não usa o var, que vai como valor, ou seja, uma cópia apenas do dado que foi passado... a variável de origem fica intacta). funcao Verificar_se_inteiro (x:real):logico Recebe um real qualquer, faz o que tem que fazer e retorna um lógico na própria função indicando a resposta. Aqui x tem que ser real mesmo, já que é o número a ser verificado. Não precisa do var, pois o que necessita é apenas o valor do que foi lido. O objetivo da função é retornar se é inteiro ou não. obs.: perceba que essa função é genérica, ou seja, pode ser usado em outros contextos... outros algoritmos... sem (ou pouca) adaptação. Percebe que nela usei a nomenclatura "x" para sugerir que a função não é algo específico da seu algoritmo, daí não precisaria indicar que é referente ao auxiliar que foi usado para atualizar o qtdNum. funcao retorna_maior_numero (qtdNum:inteiro):real Assim como na leitura, recebe a quantidade de números (e receberia o vetor também), daí faz o que tem que fazer e retorna a resposta na própria função. Se achar interessante implementar, fique a vontade. Qualquer dúvida ou comentário, fico no aguardo. No aguardo.

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!