-
Posts
3.940 -
Cadastrado em
Tipo de conteúdo
Artigos
Selos
Livros
Cursos
Análises
Fórum
Tudo que Simon Viegas postou
-
Olá. Temos o problema: Que no caso são divididos em duas partes.... 1) "up case" e "down case"; e 2) espelhamento. Se preferir, faça logo o segundo, que é bem mais fácil!!! Vamos lá: 1) TIPO DE DADO x VARIÁVEIS Está declaração das letras "a" ao "z" do tipo string está conceitualmente errada.. Podemos dizer que as letras são "dados", ou seja, está contida em um "tipo" (caracteres)... de uma maneira mais simples, tente imaginar que você queria trabalhar com números, você iria declarar o "1", "2", "3"... do tipo interger? Enfim... pode apagar toda a terceira de variáveis! 2) ACESSO A CARACTERE (letra) DA FRASE Uma string no Pascal se comporta como um "array de char de 255 posições", ou seja, se você quer uma letra em determinada posição, basta acessar utilizando a posição com "[]", ex.: var frase: string; begin frase:='Bora Beea Minha Porreta'; writeln(frase[11]); //vai imprimir a quinta letra "B") Outra exemplo auto explicativo letra:=frase[10]; //decima letra da frase Esse recurso serve para os 2 "sub-programas". 3) VERIFICAÇÃO DA LETRA Creio que o uso do UpCase() ou qualquer outra função (de tratamento de strings) pronta, ou mesmo achar uma algoritmo pronto, deve ser evitada... Pois creio que o objetivo do exercício seja desenvolver o raciocínio, e usar "algo pronto perderia a graça"... então, tendo o recurso do item 2), já elimina uns dos desafios que era de "coletar" as letras da frase. Foque no "tendo uma letra, como retornar o valor invertido no sentido de minúsculo e MAIÚSCULO?" *** Para facilitar no processo criativo, em vez de uma frase, leia apenas uma letra e imprima o "caractere convertido". Depois passar para uma frase é fácil. No aguardo.
-
Manipulação de dados em um .txt no pascal
Simon Viegas respondeu ao tópico de VagnerOliveira em Programação - outros
Olá @VagnerOliveira. 1) PESQUISA EM ARQUIVOS DE TEXTO Arquivos de texto no Pascal são sequenciais, ou seja, o arquivo é aberto no inicio e para chegar, por exemplo, na 4ª posição, terá que passa para 2ª, daí passar para 3ª e por fim chegar na 4ª. Não dá para ir direto... Então, como de qualquer forma não se sabe a posição, você pode ir comparando de cadastro por cadastro, e parar de procurar quando achar. Algo assim: reset(ARQTXT); achou:=false; while (not eof(ARQTXT)) and (not achou) do Ai no while, ler sempre o nome e telefone (para ficar em sequência por cadastro) e compara um deles com o valor a ser pesquisado... caso o pesquisado for igual ao valor lido no arquivo, ai o "achou" passaria a ser true. A pesquisa termina no fim do arquivo ou achando o cadastro... Após verifica o valor de achou e faz o que tem que fazer.. 2) EXCLUSÃO Tem pelo menos duas formas de fazer: ou [1] "marca" o cadastro como excluído, ou [2] exclui fisicamente o registro. Para ambos, você terá que recriar o arquivo, pois se não me engano, arquivos de texto, no Pascal, não são editáveis! ou seja, ou você lê (reset) ou você adiciona novos dados no final (append).. mas não tenho certeza. Para o primeiro, você vai lendo e recriando um novo arquivo, e quando for chegar no arquivo a ser excluído, faz alguma marcação para indicar que o arquivo está excluído. Por exemplo colocando um "@" do nome. (na hora de usar o programa, teria que usar esse mesmo parâmetro para verificar se o cadastro está excluído ou não). Para o segundo, vai recriando cadastro por cadastro, mas "pula" o cadastro que será excluído. *** No aguardo. -
Questão: vetor com valores intercalados
Simon Viegas respondeu ao tópico de Kaio Gomes em Programação - iniciantes
Olá @Kaio Gomes e @andbecker. O vetor 3 está sendo gerado errado. De um modo geral, é necessário gerar o vetor, para só depois escrever na tela, da mesma forma que foi feito com o vetor 4. Obs.: não confundir "exibir corretamente" com "gerar corretamente". O foco do problema são os vetores! -
Visualg - vetor e procedimento
Simon Viegas respondeu ao tópico de Paulo Koreia em Programação - iniciantes
PS: outra coisa. Não é tb necessário ficar cadastrando todas as informações a cada teste... poderia deixar somente o CPF e Nome. Quanto tiver mais ou menos encaminhado, "habilita" os dados restantes e faz novos testes. Para "desabilitar", basta colocar o trecho desejado em comentário. (ou // em cada linha, ou { } no trecho), ex.: escreva ("Digite o CPF: ") leia (cpf[i]) escreva ("Digite o Nome: ") leia (nome[i]) {escreva ("Digite o Endereço: ") leia (end[i]) escreva ("Digite o Bairro: ") leia (bai[i]) escreva ("Digite o CEP: ") leia (cep[i]) escreva ("Digite a Cidade: ") leia (cid[i]) escreva ("Digite o Estado: ") leia (est[i]) escreva ("Digite o Telefone: ") leia (tel[i]) escreva ("Digite o Celular: ") leia (cel[i])} Faz os mesmo ajustes nas consultas... -
Visualg - vetor e procedimento
Simon Viegas respondeu ao tópico de Paulo Koreia em Programação - iniciantes
Olá @Paulo Koreia. 1) IDENTAÇÃO Mantenha seu código sempre identado. A dica é já tentar codificar identado... o espaçamento padrão deixei com 3 espaços (eu particularmente prefiro com 2) Abaixo já deixo um código identado... 2) QUANTIDADE DE CADASTROS Para facilitar os testes, recomendam-se utilizar poucos cadastros, como uns 3..., pois conceitualmente não faz diferença nenhuma testar com 2, com 5, 50 ou com 1000... os resultados serão os mesmos, mas com menos trabalho. Ao final, reajusta para 50 novamente. O código abaixo já deixo com 3! 3) REAJUSTE DA LÓGICA DO CADASTRO Nesse código, você está cadastrado todo o limite de cadastros de uma vez só. Faz mais sentido cadastrar de um em um. Ai tem duas opções: ou cadastra um e volta para o menu principal, ou cadastra um e perguntar, no próprio procedimento de cadastro, se deseja cadastrar mais. *** Código identado e com limite de 3: Sugestões: - Faça alguns testes e entenda o comportamento atual do código; - Faça testes pressionando F8 (passo a passo). Entenda mais a fundo como funciona o fluxo de execução. - Coloque um repita/ate no menu principal, de modo que caso não escolha a opção 0, o procedimento continue repetindo. Vá fazendo testes... Qualquer dúvida é só postar. No aguardo; -
Visualg - vetor e procedimento
Simon Viegas respondeu ao tópico de Paulo Koreia em Programação - iniciantes
Olá. Achou o local, mas analisou o que pode ser? Para adiantar, provavelmente esqueceu de declarar o "i" que está sendo usado lá. Tente corrigir e dê continuidade. No aguardo. -
Visualg - vetor e procedimento
Simon Viegas respondeu ao tópico de Paulo Koreia em Programação - iniciantes
Olá @Paulo Koreia. O que ocorre ao tentar rodar? tente analisar o erro ou onde o erro está ocorrendo (geralmente o programa para na linha onde deu erro). Se não conseguir, posta aqui as informações. ADENDO: Sobre o que eu citei: É apenas para tirar o comando "interrompa" do caso, mas a opção "0" ainda precisa existir... já que a opção está disponível no menu. Então, o programa precisa ser finalizado deixando a execução chegar no "fimProcedimento"..., em vez de executar o comando "interrompa". Veja seu código: Ao digitar "0", a lista do menu vai apenas repetir, pois só está aceitando o 1, 2 e 3 no "ate". Insira o "0" também. Lá no case, ou você deixa sem o "0" mesmo, ou insere algo, como um texto de despedida. No aguardo. -
Visualg - vetor e procedimento
Simon Viegas respondeu ao tópico de Paulo Koreia em Programação - iniciantes
Olá @Paulo Koreia. 1) USO DA TAG CODE Ao postar um código, favor utilizar a tag CODE (botão <>). Abaixo um pouco sobre: 2) CÓDIGO REPETIDO Parece que seu código está montado... tem por exemplo duas vezes o consulta_cpf(). Dê uma arrumada nisso. 3) CICLO DO CÓDIGO Dentro dos procedimento, como no trecho do cadastro() acima, você está "chamando" procedimento principal() para voltar ao menu principal, mas você não pode fazer isso!!!. Veja, ao entrar em um procedimento, o programa principal ou procedimento continua aberto de onde o novo procedimento foi chamado até que ele (o novo) finalize e o programa volte para o programa anterior. Cada procedimento funciona como um sub-programa, daí, ao chamar um procedimento, o programa fica aguardando o sub-programa terminar e continua do mesmo ponto onde o sub-programa foi iniciado. No seu código, o sub-programa principal() chama, por exemplo, o cadastro()... daí, é aberto um novo sub-programa, certo? mas dentro do cadastro() você chama novamente o principal(), ou seja, formando uma "pilha de sub-programas". Esse recurso tem até nome: recursividade, mas ele não pode ser feito assim... veja: PILHA DE SUB-POGRAMAS 1 PROOGRAMA: "Cadastro_clientes" 2 SUB-PROG.: "principal()" 3 SUB-PROG.: "cadastro()" 4 SUB-PROG.: "principal()" 5 SUB-PROG.: "cadastro()" 6 SUB-PROG.: "principal()" . . Resumidamente: Não chame o principal() dentro dos sub-programas, mas sim crie um repita lá no principal() para que o código repita até que informem o "0". Percebe a diferença? assim, o principal() vai chamar um procedimento, ao procedimento finalizar, volta para o principal(), que por sua vez pode chama um novo procedimento ou finalizar... (é um vai e volta) Outra coisa, tire esse interrompa do case 0 e deixe o código finalizar sozinho. (quando a opção for "0", o código não vai mais repetir e vai finalizar) *** No aguardo. -
Função par e impar separadas.
Simon Viegas respondeu ao tópico de Giovane Sornoqui em Programação - iniciantes
Acho que agora eu entendi seu raciocínio... mas acho que esse "universo dos inteiros" seria somente no quociente, e não no dividendo e divisor. Ex. de inteiro/inteiro. 8 / 3 = 2.666... vai ter resto 0 da mesma forma. Outro ponto interessante é que o operador "/" aceita inteiros para dividi-los, mas "exige" um real (ou conjunto maior) como resposta. Outro exemplo: 10/2 = 5. 10 e 2 pode ser considerado inteiro, mas os "compiladores" não aceita o 5 inteiro tb. A "/" transforma a conta em real! C=A/B; A e B inteiros ou real, e C necessariamente real (mesmo se A e B foram inteiros) pra cima MEU CHUTE Então, o % e o MOD seriam operadores, e estes possuem alguma limitação. Já o fmod é uma função, que por sua vez é mais flexível (como o exemplo que fiz acima em Pascal). -
Função par e impar separadas.
Simon Viegas respondeu ao tópico de Giovane Sornoqui em Programação - iniciantes
Olá @PredatorX9. Se "%" significa resto, daria 0,5, não? Então: Testando: A=4.5 e B=2.0 A-(B*(A/B)) 4.5-(2*(4.2/2) 4.5-(2*(2.25) 4.5-(4.5) 0 OK, a conta bateu...mas fazendo a conta com números inteiros, também dará zero.. Tem algo errado ai... , veja: A-(B*(A/B)) --> A-(AB/B) --> A-A --> 0 (não faz sentido, a expressão em si dá 0). A fórmula deve ser outra... Se souber explicar melhor o conceito ficaria grato! *** @Giovane Sornoqui, já conseguiu resolver? adicionado 10 minutos depois PS: não consegui vislumbrar como funcionara o operador % (ou MOD), mas consegui meio que simular um: program simualdorMOD; uses CRT; function MOD_tabajara(X,Y:real):real; begin repeat X:=X-Y; until X<Y; MOD_tabajara:=X; end; BEGIN ClrScr; writeln('4.5 mod 2 = ',mod_tabajara(4.5,2):0:10); //"0.5" = "impar" writeln('10 mod 2 = ',mod_tabajara(10 ,2):0:10); //"0" = "par" ReadKey; END. PS2: pela definição de paridade, necessariamente os números terão que ser inteiro (Z) mesmo... 4.5 não é par, nem é ímpar. -
Função par e impar separadas.
Simon Viegas respondeu ao tópico de Giovane Sornoqui em Programação - iniciantes
Olá. Um adendo: @PredatorX9, O contexto estaria mais para o contrário... "uma divisão de um real por um inteiro". Veja que a divisão seria por 2 (inteiro), logo, podendo resultar em resto. Ex.: 4,5 % 2, daria 2 com resto 0,5. Ou seja, creio que seria algo mais voltado a "limitação da linguagem" ou algo como "limitação da arquitetura computacional". Enfim, creio que o problema pede "números inteiros": No caso bastando ajustar o tipo lá na função (e caso necessário: outros ajustes no código em si, como na declaração da variável no programa principal). Abraços -
Como usar else depois do case
Simon Viegas respondeu ao tópico de Thetheu Diias em Programação - outros
Olá @Thetheu Diias. 1) Use readln(), em vez de read() Resumidamente: troque todos os read por readln. Um pouco sobre aqui: 2) Evite CAIXA ALTA Ou seja, o uso de texto em MAIÚSCULO é de certo modo desagradável para leitura. Em certo contexto, parece que está gritando. Abaixo seu código reindentado... veja a diferença. program Consumo; uses CRT; var valor, km, opcao, consumo, despesa: real; litros: integer; comb: integer; BEGIN writeln(' Combustivel'); writeln; writeln('> [1] - Gasolina'); writeln('> [2] - Alcool '); writeln('> [3] - diesel '); writeln; write('Selecione o tipo de combustivel: '); read(comb); writeln; case comb of 1:writeln('Combustivel selecionado: gasolina'); 2:writeln('Combustivel selecionado: alcool'); 3:writeln('Combustivel selecionado: diesel'); else repeat writeln('Combustivel selecionado: inválido'); writeln('selecione o tipo de combustivel: '); read(comb); until (comb < 1) and (comb >= 4); end; //fim case writeln; write('Informe o valor do combustivel: '); read(valor); writeln; write('Informe a quantidade de litros abastecida: '); read(litros); writeln; write('Informe a quilometragem percorrida: '); read(km); writeln; consumo:=(km / litros); //obs.: esses "( )" são facultativos. despesa:=(valor * litros); if (comb = 1) then begin writeln('combustivel: gasolina'); writeln('valor do combustivel: r$', valor:2:2, ' reais'); writeln('litros: ', litros:2:1); writeln('distancia: ',km:3:2, ' km'); writeln('consumo: ', consumo:2:2,' km por litros de combustivel'); writeln('despesa: r$', despesa:2:2, ' reais'); end; if (comb = 2) then begin writeln('combustivel: alcool'); writeln('valor do combustivel: r$', valor:2:2, ' reais'); writeln('litros: ', litros:2:1); writeln('distancia: ',km:3:2, ' km'); writeln('consumo: ', consumo:2:2,' km por litros de combustivel'); writeln('despesa: r$', despesa:2:2, ' reais'); end; if (comb = 3) then begin writeln('combustivel: diesel'); writeln('valor do combustivel: r$', valor:2:2, ' reais'); writeln('litros: ', litros:2:1); writeln('distancia: ',km:3:2, ' km'); writeln('consumo: ', consumo:2:2,' km por litros de combustivel'); writeln('despesa: r$', despesa:2:2, ' reais'); end; ReadKey; END. 3) Else do case O mais correto seria dizer "dentro do else". "Depois" dá a entender que é fora!, ou seja, teriam-se um else, com os seus códigos, e após ele teria um repeat, o que não é o caso. Então, a estrutura me parece correta. O que pode está dando problema é o que eu citei no item 1). Substitua todos os read por readln e faça outros testes. 3.1) Estrutura do case Tomemos o exemplo abaixo como base: case comb of 1:begin writeln('combustivel selecionado: gasolina'); xxx xxx end; 2:begin writeln('combustivel selecionado: alcool'); xxx xxx xxx xxx end; 3:writeln('combustivel selecionado: diesel'); else repeat writeln('combustivel selecionado: inválido'); writeln('selecione o tipo de combustivel: '); read(comb); until (comb < 1) and (comb >= 4); end; //fim case Perceba que caso queiramos colocar "mais de uma instrução" dentro de cada "caso", é necessário inserir um begin/end. Dá mesma forma que precisaríamos colocar se fosse para um if por exemplo, ou seja, "Para uma linha, bota direto. Mais de uma linha, insere o begin/end". Por curiosidade, o else do case foge a "essa regra", ou seja, não sendo necessário um begin/end dentro dele. Se você colocar mais 10 linhas, por exemplo, depois do until, o else vai funcionar normalmente. Obs.: só para ficar claro... esse repeat dentro do else conta como uma instrução só, não importando quantas linhas tem entre ele o until. 4) IF x IF/ELSE Para os if dos "comb" ali embaxio, é necessário utilizar a estrutura de if/else neles (em vez de vários if simples), pois são "condições mutuamente exclusivas entre si", ou seja, se for uma opção, não vai ser a outra...Por exemplo, se for a opção 2, não poderá mais ser a opção 3, logo não fazendo mais sentido verificar os posteriores. (não utilizar o else pode ser considerado erro de lógica). *** No aguardo. -
Agendar consultas - visualg - complexo
Simon Viegas respondeu ao tópico de vitormendonca em Programação - iniciantes
Olá @vitormendonca. 1) Uso de laço de repetição Sim! Pois a coordenada é dada pela data e hora, ou seja, é específica. ** 2) Agendamento de consulta A coordenada resultada está em (10,3), logo vai acessar a posição (10,3), ou seja, "jan_vet[d,h]". Ai você poderia armazenar algo que identifique o armazenamento, como por exemplo o nome... algo como: jan_vet[d,h]<-paciente 3) Sobre ter vaga no horário Basta verificar que na coordenada tem algo já armazenado ou não... então, quando não se cadastra nada na posição, qual valor vai está contido nele? (descubra) Daí, se estiver com esse valor, está vago! Se tiver diferente, é porque está ocupado (claro). *** No aguardo. -
Agendar consultas - visualg - complexo
Simon Viegas respondeu ao tópico de vitormendonca em Programação - iniciantes
Olá @vitormendonca. Para agendar você pode verificar se na coordenada resultada na data e hora desejada já está ocupada ou não. Ou seja, se na posição tem "0" ou não. Se tiver zero, é por quê tem livre. Ai agenda. Se não tiver, é porque já está ocupada. No aguardo. -
Seleção direta e inserção direta
Simon Viegas respondeu ao tópico de anonymouatour em Programação - outros
Olá. Sobre o SelectionSort(), já foi citado aqui: Sobre o InsertionSort, primeiro tente entender o outro... -
Agendar consultas - visualg - complexo
Simon Viegas respondeu ao tópico de vitormendonca em Programação - iniciantes
Olá @vitormendonca. 1) Local "correto" das declarações A declaração dos procedimento devem ficar acima do "início" principal...ou seja, logo após o "var". Basicamente descer o trecho lá de cima para após os procedimentos. (a não ser que exista algum motivo especial para ficar do jeito que está, é claro) 2) Sobre as datas Vai depender como vai estruturar o armazenamento das consultas... mas de um modo geral, você poderia ignorar os anos bissextos e dizer que todo mês tem 30 dias por enquanto. 3) Horários disponíveis / Horários agendados Mesma coisa... vai depender de como estruturar para armazenar esses informações... *** Então, essas consultas é para um só paciente ou para vários? Sugiro que inicialmente tente modelar para cadastrar as consultas sem se preocupar datas disponíveis ou mesmo se a data é válida. No aguardo. -
VisualG Programa para armazenar o RG de 100 pessoas
Simon Viegas respondeu ao tópico de anonymouatour em Programação - iniciantes
Olá. Acho que só esqueceu de trocar o vet[] por func[]... Abaixo tento explicar mais ou menos como funciona o código. Veja os comentários: procedimento SelectionSort() //Basicamente o Selecion Sort vai ordenando posição a posição, ou seja, //ele procura o menor valor e e troca pela posição atual (caso necessário) //vai para próxima e repete o processo, até a penúltimo (o último já estará //ordenado var i, j, :inteiro min, aux:inteiro inicio //SLECIONAR O MENOR VALOR DO I PRA FRENTE para i de 1 ate total-1 faca //do primeiro ao penúltimo min <- i //menor valor igual a primeira posição do loop atual para j de i+1 ate total-1 faca //para indo do posterior ao atual até o último se func[j] < func[min] então //se posição atual é menor que o "menor atual" min<-j //menor passa ser o atual (em j) fimSe fimPara //final, o min terá posição do menor número!!! e i será a posição que está //sendo ordenada //SE O MENOR NÃO ESTÁ NO PRÓPRIO I (se no i estiver o menor, o mim=i) se min<>i então //faz a troca entre um e outro aux <- func[i] //copia o valor (pois será substituido abaixo) func[i] <- func[min]//menor passa a ter o valor mínimo func[min]<- aux //onte estava o mínimo, agora passa a ser o que estava em L //ou seja, no final, a posição i vai ter o menor valor (dele pra frente) fimSe fimPara escreva("RG's ordenados: ") para i:=1 ate total-1 faca escreva(func[i]) fimPara fimProcedimento OBSERVAÇÃO: Esse código é apenas uma demonstração... estude o método Selection Sort, tente entender por completo o seu funcionamento. Analise o código assim e adapte no seu código! Após, poste o seu código completo até aqui! e onde está com dúvidas. No aguardo. -
Problema no visualg calculando média errada
Simon Viegas respondeu ao tópico de Gilmar Zezilia Alves em Programação - iniciantes
Olá @Gilmar Zezilia Alves. Seja bem vindo ao Fórum do Clube do Hardware. Aqui o resultado deu certo. O que está dando errado? -
Olá. 1) Em relação ao seu código, 2 pontos: 1) dê mais espaço para fruta na hora de exibir; 2) use números em real para os valores. 2) Em relação ao tamanho da matriz Continuo achando que você deve usar uma matriz 2x2. Essa dificuldade para ajustar o código é normal... e isso que é o interessante. Um objetivo da disciplina é justamente estimular o raciocínio. Outro ponto interessante é que o desenvolvimento para descobrir soluções é reaproveitado, e acredite, é usado no dia dia. ** Minha sugestão: - ajuste os pequenos detalhes do seu código e deixe "pronto"; - copie o código e tente fazer com uma matriz 2x2. Vá fazendo teste e tente ir corrigindo. Após posta aqui o que conseguiu fazer e onde está com dúvidas. Observações: acho que você deveria evitar textos em MAIÚSCULO. É visualmente estranho e cansativo. Abaixo seu código em minúsculo e com alguns ajustes de identação (meu padrão é um pouco diferente) program MultMatriz; uses CRT; var fruta: array [1..4,1..1] of string; valor: array [1..4,1..1] of integer; m,n,i, soma: integer; begin //---------------------------------------------- for m:= 1 to 4 do begin for n:= 1 to 1 do begin write ('Escreva o nome da fruta ',m,': '); readln(fruta[m,n]); end; end; //---------------------------------------------- ClrScr; for m:= 1 to 4 do begin for n:= 1 to 1 do begin write ('escreva o valor da fruta ', fruta[m,n],': '); readln(valor[m,n]); end; end; //---------------------------------------------- ClrScr; writeln('Amostragem da tabela'); GotoXY(3,2); writeln('Fruta'); GotoXY(11,2); writeln('valor'); //---------------------------------------------- for i := 1 to 5 do begin GotoXY(9,i+2); writeln('|'); end; for i := 1 to 5 do begin GotoXY(1,i+2); writeln('|'); end; for i := 1 to 5 do begin GotoXY(20,i+2); writeln('|'); end; GotoXY(1,7); writeln('---------------------'); //---------------------------------------------- for m:= 1 to 4 do begin for n:= 1 to 1 do begin GotoXY(3,m+2); writeln(fruta[m,n]); end; end; for m:= 1 to 4 do begin for n:= 1 to 1 do begin GotoXY(16,m+2); writeln ('R$ ',valor[m,n]); end; end; //---------------------------------------------- END. Veja, existem basicamente 3 bases de identação: 1) como a sua, onde colocar o begin/end na mesma direção da instrução que corresponde; 2) como a "padrão", onde fica identado em relação a instrução, e o que está dentro do begin/end também fica identado; 3) como a "minha", onde idento o begin/end, mas não idento para o que está dentro. (ganho um dente de espaço e facilita quando precisa remover ou adicionar um begin/end) VEJA: a principal sugestão aqui é evitar usar maiúscula, o padrão de identação cada um pode usar o seu, mas que fique claro que existe um e que está se seguindo, ou seja, coerente. No aguardo. adicionado 5 minutos depois Ah! veja que alguns comandos subiram e ficaram no lado do GotoXY(), não é uma questão de padrão, é apenas uma sugestão para tentar ainda mais organizar o código. Tem lá as suas vantagens... especialmente em códigos maiores..
-
Ola @Augusto G rocha. 1) Tamanho do array Você declarou uma Matriz 4x4, ou seja, com 16 Frutas... mas ele pede uma com 4 Frutas. Perceba que o primeiro 1..4 se refere a primeira coordenada. Numa matriz matemática seria o "i". O segundo 1..4, que vem depois da vírgula, representaria o "j". Como de 1..4 são 4 posições, teríamos 4 para o "i", 4 para o "j". (uma matriz quadrada de ordem 4). Para o seu contexto, com um total de 4 posições, só existe 3 possibilidades: a Matriz será 4x1 ou 2x2 ou 1x4. A declaração poderia ficar assim: [1..4,1..1] ou [1..2,1..2] ou [1..1,1..4] 2) Uso do array Apesar de ter 16 posições, você está usando apenas 4... ou seja, teríamos um desperdício (de certo modo está relacionado ao item 1). Outra coisa, existe um pequeno erro de lógica no trecho... veja, apesar ter ter o mesmo efeito, a estrutura do for está incompleta. Uma mais correto seria: FOR M:= 1 TO 4 DO BEGIN FOR N:= 1 TO 1 DO BEGIN WRITE ('Escreva o Nome da Fruta ', M,': '); READLN (Fruta[M,N]); END END; Não entendeu a diferença? Veja como ficaria o trecho do seu código com a identação correta: FOR M:= 1 TO 4 DO BEGIN FOR N:= 1 TO 1 DO WRITE ('Escreva o Nome da Fruta ', M,': '); //apenas essa linha está dentro do FOR READLN (Fruta[M,N]); END; ATENÇÃO: A identação não influencia na execução, é apenas visual! Para o Pascal, esse código acima e o seu são idênticos. 3) Exibição dos resultados FOR M:= 1 TO 4 DO BEGIN FOR N:= 1 TO 4 DO BEGIN Gotoxy(11,M + 2 ); Writeln ('R$ ',Valor[M,N]); END; END; Aqui está exibindo coisa a mais... está como se fosse uma matriz 4x4... e o resultado não está saindo corretamente na tela. 4) Escolha da matrizes Apesar das 3 possibilidades que sugeri serem matrizes, creio que faça mais sentido usar uma matriz 2x2... pois as 1x4 e 4x1 são "matrizes linha", ou seja, só uma coordenada varia.... em fim. sugiro que use uma matriz 2x2. Ex.: VAR Fruta: ARRAY [1..2,1..2] OF String; Valor: ARRAY [1..2,1..2] OF Integer; Obs.: numa matriz 4x1, só precisaria de um for... bastaria usar "READLN (Valor[M,1])"... (mas como disse: use uma matriz 2x2) *** No aguardo.
-
Não consigo instalar o sass
Simon Viegas respondeu ao tópico de Ramon Fontes em Programação - outros
Olá @Ramon Fontes. Obrigado pelo feedback. -
Olá @bRUT. Seja bem-vindo ao Fórum do Clube do Hardware. Qual a linguagem de programação? Pesquise sobre o problema em si... tente "calcular no papel" para verificar e assimilar o contexto, e construa um algoritmo na linguagem estipulada. Poste aqui o que conseguiu fazer e onde está com dúvidas. No aguardo.
-
Olá. Resumidamente: - As coordenadas do array são independentes das coordenadas do GotoXY(); - Faz mais sentido organizar o array normalmente e calcular a posição desejada a partir da posição (no array)... no seu código, você meio que está ajustando o array para que tenha um valor bom para o GotoXY(), percebe a diferença? é as coordenas do GotoXY que devem se ajustar ao array...! (essa correção entre uma coisa e outra é da necessidade do problema, não um requisito do Pascal. Como a cada posição vou imprimir uma posição correspondente, poderia "calcular" onde cada um vai ser impresso de acordo com a tal posição no array) Ex.: for Y:=1 to 4 do for X:=1 to 4 do begin GotoXY(X*10,Y*3); //X=coluna, Y=linha (ou seja, a cada 10 colunas e 3 linhas) writeln('a',X,Y); end; Outra forma de dar espaçamento é com o "comando de formatação"... acho que o exemplo abaixo será autoexplicativo: for Y:=1 to 4 do //para cada linha begin GotoXY(5,Y*4); //começa na coluna 5, pulando de 4 em 4 linhas for X:=1 to 4 do //para cada coluna write('Blablabla':15); //<variavel>:xxx ou <texto>:xxx = Esse "xxx" é quantidade de caracteres reservados a esquerda (insere espaços até que a variavel ou texto ocupe X espaços end; writeln; readln; No aguardo.
-
Não entendi a correção entre "dividir uma matriz por 2" entre "Fruta e Valor". Deve ser a questão 4, não? Analisando ela, acho que se são 4 frutas, as matrizes deveriam ser de [1,4] ou [2,2] ou [4,1], ou seja, "ter quatros elementos cada". Se são duas matriz, e cada posição (fruta) de uma matriz terá a uma posição (valor) correspondente na outra, faz mas sentido usar uma mesma ordem para as duas!, ou seja, "para posições iguais respectivamente nas matrizes, teremos dados para uma mesma fruta ". Ex.: Fruta que está na posição (1,2) terá o seu preço também na posição (1,2) da outra matriz. No aguardo.
-
Olá @Augusto G rocha. A primeira coisa que sugiro verificar é a estrutura dos dados. Como não tem enunciado, preciso de esclarecimentos: Fruta: ARRAY [1..10,1..10] OF String; Valor: ARRAY [1..8,1..8] OF integer; Para que será usado o array Fruta e o array valor? Por quê nessas matrizes uma vai de 1 a 10 para cada coordenada e o outro vai de 1 a 8? Por quê cada uma tem duas coordenadas? 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