Ir ao conteúdo
  • Cadastre-se

VisualG Qual a finalidade dessas funções?


Ir à solução Resolvido por Simon Viegas,

Posts recomendados

Estou terminando um vídeo aula sobre funções e nela o professor fala que as funções "maiusc" e "minusc", não funcionam para variáveis caracteres

dentro do visualg. Como assim não funciona ? Porque esse código aqui, "teste" é uma variável do tipo caractere e "maiusc" e "minusc" funcionam normalmente. Gostaria de uma explicação de o porquê ele disse isso, se nesse código aqui, essas  funções funcionam com a variável que é do tipo caractere. 

 

 

Algoritmo "Funcões"

// Descrição   : Aqui você descreve o que o programa faz! (função)
// Autor(a)    : Nome do(a) aluno(a)
// Data atual  : 03/08/2023

Var
 teste : caractere

Inicio

   teste <- "LógicaDeProgramação"
   escreval (maiusc(teste))
   escreval (minusc(teste))

Fimalgoritmo

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Em 03/08/2023 às 21:21, Eli Almeidaa disse:

o professor fala que as funções "maiusc" e "minusc", não funcionam para variáveis caracteres dentro do visualg.

 

Teria que entender melhor o contexto da frase.

 

A função em si usa esse tipo:

Citação
Maiusc (c : caractere) - Retorna um valor caractere contendo a expressão em maiúsculas.

 

O que, por exemplo, não funciona é para os caracteres acentuados.

 

Poderia dar outros detalhes do que seria?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Simon Viegas , Como assim não funcionam para caracteres acentuadas ?

E por que aqui imprime com acento  "lógica" tanto com a função "maiusc" como com "minusc"? 

var
teste : caractere

inicio
  teste <- "LógicaDeProgramação"
  escreval (maiusc(teste))
  escreval (minusc(teste))

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Em 07/08/2023 às 18:37, Eli Almeidaa disse:

@Simon Viegas , Como assim não funcionam para caracteres acentuadas ?

 

Caracteres com acentos não são tratados por nenhuma das duas funções. São ignorados.

 

image.png

 

 

 

 

 

Em 07/08/2023 às 18:37, Eli Almeidaa disse:

E por que aqui imprime com acento  "lógica" tanto com a função "maiusc" como com "minusc"? 

 

Veja: o maiúsculo de "lógica" seria "LÓGICA", mas em vez disso sai "LóGICA". (Pois "os caracteres acentuados não são tratados".)

 

 

 

Sobre o cerne do problema:

Em 04/08/2023 às 23:21, Simon Viegas disse:
Em 03/08/2023 às 21:21, Eli Almeidaa disse:

o professor fala que as funções "maiusc" e "minusc", não funcionam para variáveis caracteres dentro do visualg.

 

No VisualG, toda cadeia de caracteres é tratada, ou seja, funciona*. Daí precisaria entender o que ele estaria se referindo. Já conseguiu descobrir?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Simon Viegas, não consegui descobrir o que ele queria dizer e acho que nem vou, no VisualG funciona e você mesmo está falando que funciona.

 

image.png.edc93b2a2d80ecc06f9762b06ac4e685.png.2338af1d53365f69cc1b6619998ed4fe.png

 

Nesse print que você postou parece que a função maiusc é que não funciona com  caracteres com acento, 

porque "lógicadeprogramação" está todo em minúsculo, então significa que a função minusc está funcionando com os 

caracteres acentuados.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
11 horas atrás, Eli Almeidaa disse:

não consegui descobrir o que ele queria dizer e acho que nem vou

 

De boa... só o fato de revisar um pouco o tema já é interessante. Pode pular isso (ou não).

 

 

 

 

11 horas atrás, Eli Almeidaa disse:

Nesse print que você postou parece que a função maiusc é que não funciona com caracteres com acento, 

porque "lógicadeprogramação" está todo em minúsculo, então significa que a função minusc está funcionando com os 

caracteres acentuados.

 

Seria dizer que você estaria "extrapolando a conclusão", ou seja, o comportamento de uma função, não necessariamente vai dar indícios claros sobre o comportamento de outra função ou outro comportamento que aparenta ser igual ou análogo a outro. Uma coisa é uma coisa, outra coisa é outra coisa! 🙂

 

Para atestar o comportamento da função Minusc(), que tal fazer testes mais objetivos nela? Por exemplo:

 

image.png

 

 

Oh! Lá! o caractere "Á' não foi minuscularizado para "á". O problema parece está especificamente nos tais caracteres acentuados (não é certeza, mas é um excelente indício). Se um caso não funcionou, já teríamos uma boa base que a função NÃO estaria funcionando corretamente (como seria esperado idealmente*)... mas o contrário tende a muito mais não ser verdade... tipo, se fizesse alguns testes e todos tivessem dado certo, não quer dizer que a função funciona necessariamente de modo correto, pois podemos está simplesmente "testando errado" ou "não testado o suficiente" 🙂. Saca?   Claro que "não ter funcionado" também pode ser por um teste errado... por ai vai.

 

 

"Hum! acho que o problema são os caracteres acentuados. Vou testar eles para ver"...

 

 

image.png

 

 

Achei isso (numas tabelas):

á Á ã Ã â Â à À é É ê Ê í Í ó Ó õ Õ ô Ô ú Ú ç Ç

 

image.png

 

Oh! Lá!... 100% dos caracteres foram ignorados, ou seja, caracteres acentuados seriam como "caracteres especiais", ou seja, o VisualG interpreta como NÃO havendo uma correspondência em minúsculo ou maiúsculo, daí "retorna o próprio caractere" 😉.  Veja que até vai amadurecendo a ideia de como provavelmente essas funções funcionam.

 

Imagino isso: ou a função retorna o que tem mapiado como correspondente (minúsculo ou maiúsculo respectivamente), ou retorna o próprio caractere.

 

De um modo geral, nós "ABSTRAÍMOS" como funciona as funções, pois de certo modo não importaria!!! "Eu quero que ele me retorne os caracteres minúsculos ou maiúsculos e pronto". Isso é abstrair. Ao se aprofundar em temas, vai tendo noções..., o que pode ajudar a criar novas soluções de problemas que aparentemente não tem relação direta......


 

Ah! Mais queria que funcionasse com acentos. Tentaria ver alternativas para isso... não existe (segundo as documentações) uma função nativa (99,999% de certeza), daí poderia criar uma nova. Exemplo:

 

algoritmo "Torna maiúsculo ou minúsculo incluíndo caracteres acentuados"

funcao MinuscPlus (txt:caractere) : caractere
inicio
   retorne "Em construção"
fimFuncao

funcao MaiuscPlus (txt:caractere) : caractere
inicio
   retorne "Em construção"
fimFuncao

inicio
   escrevaL(Minusc("á Á ã Ã â Â à À é É ê Ê í Í ó Ó õ Õ ô Ô ú Ú ç Ç"))
   escrevaL(Maiusc("á Á ã Ã â Â à À é É ê Ê í Í ó Ó õ Õ ô Ô ú Ú ç Ç"))
   escrevaL(MinuscPLus("á Á ã Ã â Â à À é É ê Ê í Í ó Ó õ Õ ô Ô ú Ú ç Ç"))
   escrevaL(MaiuscPlus("á Á ã Ã â Â à À é É ê Ê í Í ó Ó õ Õ ô Ô ú Ú ç Ç"))
fimAlgoritmo

 

A base tá pronta.. Só pensar em uma lógica e tentar implementar.

 

 

 

Não queria dar spoilers, mas uma sugestão seria pesquisar inicialmente sobre as "funções nativas do VisualG". Dá uma revisada na lista e entender mais ou menos o que cada função faz... São poucas, daí é de boa. (Com a prática, já iria direto no que cito abaixo.)

 

No caminho se depararia com "Funções de Manipulação de Strings", ora! se estou querendo tratar de caracteres (strings), iria tentar direto aí. Que por sua vez se depararia com um tal de "código ASCII"... por aí vai! Vai indo, indo...

 

Não estou dizendo que é trivial, mas não seria nada absurdo também. Todo conhecimento vai se construindo aos poucos... a medida que vai tendo contato vai assimilando e cada vez mais "associando" coisas!!!

 

Caso queria aventurar, fique a vontade. Sugiro que primeiro tente... não busque soluções prontas!! Pois, ao tentar e eventualmente não conseguir (não é o objetivo), ao ter acesso a uma solução, veria um: "nossa, como não pensei nisso" ou "que massa! ideia bacana"... mas é preciso tentar antes. Garanto que vale a pena tentar sozinho e fazendo testes diversos.

 

 

 

Eu já tinha uma ideia de como poderia fazer. Um exemplo de resultado:

 

image.png

 

Daí, poderia salvar as funções em algum lugar... quando for precisar utilizar elas em algum outro código no futuro, só copiar o código!!!

 

Sobre a questão lá do professor... que tal após de ter implementado as funções alternativas demonstrar para ele o código que fez?

 

Confesso que eu ainda queria entender o que ele quis dizer com "não funciona". 😄

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@Simon Viegas , não sei se é a versão do visualg que estou utilizando, porque ao executar esse mesmo código que você postou,

aparece assim :9u79baz6.png.48def3d26419ec1d3258a1e4f2226fc0.png

 

. E esse outro também :

lrycxu89.png.ad6e98b29c895ee34314e21f97dd5f17.png

. Está dando a entender que tanto a função maiusc como minusc funcionam para os caracteres acentuados na versão do visualg que utilizo. Utilizo a versão 3.0.7.0

 

 

 

 

 

 

 

 

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

@Eli Almeidaa, perfeito. Então as funções foram corrigidas na versão 3.0.7.0. Não cheguei a testar nela. Utilizo por referência a versão 3.0.6.5🙂

 

Obs.: a versão 3.0.7.0 tem outros problemas mais notáveis. A versão mais comum e estável é a 3.0.6.5. Usa um ou outra (ou a 2.x) vai depender da exigência do curso ou professor, por exemplo.

 

Recomendo a 3.0.6.5 mesmo.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP
3 horas atrás, Eli Almeidaa disse:

@Simon Viegas , essa versão que você utiliza no caso é mais antiga?

 

Não mais antiiiga, mas apenas "anterior". A versão 3.0.6.5 seria a mais recomendada. A versão 3.0.7.0 tem muitos bugs!

 

 

 

3 horas atrás, Eli Almeidaa disse:

E já que as funções maiusc e minusc não funcionam corretamente nessa versão 3.0.6.5, então seria melhor seguir a sua recomendação e  tenta criar duas funções MinuscPLus e MaiuscPlus?

 

Uma coisa não me parece necessariamente levar a outra. A sugestão de criar essas funções estaria mais no sentido de treinar e se desafiar. No dia a dia não vai fazer diferença. 

 

 

Abaixo fiz um código para servir referência. Daí, caso queira entender afundo, dá uma pesquisa sobre o tal código ASCII e tente entender qual a lógica utilizada. A proposta inicial seria o oposto, ou seja, a partir do estudo, segar a um algoritmo semelhante... mas creio que fazer uma engenharia reversa seja mais útil momento.

 

algoritmo "Torna maiúsculo ou minúsculo incluíndo caracteres acentuados"
//Obs.: utilitário para versão 3.0.6.5. A versão 3.0.7.0 já está corrigida

const
   caracteresAcentuados = "a A b B á Á ã Ã â Â à À é É ê Ê í Í ó Ó õ Õ ô Ô ú Ú ç Ç"

funcao MinuscPlus(txt:caractere) : caractere
var
   i, cod : inteiro
   c : caractere
   aux : caractere
inicio
   aux <- ""
   para i de 1 ate Compr(txt) faca
      c <- Copia(txt, i, 1)
      cod <- (Asc(c))

      se (((cod >= 65) E (cod <= 90)) OU ((cod >= 192) E (cod <= 218))) então
         aux <- aux + Carac(cod+32)
      senao
         aux <- aux + c
      fimSe
   fimPara

   retorne aux
fimFuncao

funcao MaiuscPlus(txt:caractere) : caractere
var
   i, cod : inteiro
   c : caractere
   aux : caractere
inicio
   aux <- ""
   para i de 1 ate Compr(txt) faca
      c <- Copia(txt, i, 1)
      cod <- (Asc(c))

      se (((cod >= 97) E (cod <= 122)) OU ((cod >= 224) E (cod <= 250))) então
         aux <- aux + Carac(cod-32)
      senao
         aux <- aux + c
      fimSe
   fimPara

   retorne aux
fimFuncao

var
   x : inteiro
   //variável crida apenas para fazer funcionar a const. Por algum motivo só
   //funciona se tiver variáveis globais kkkkkkkkkkk

inicio
   escrevaL("Original : ", caracteresAcentuados)
   escrevaL("Maiúsculo: ", MinuscPLus(caracteresAcentuados))
   escrevaL("Minúsculo: ", MaiuscPlus(caracteresAcentuados))

   escrevaL(MinuscPlus("Lógica de Programação"))
   escrevaL(MaiuscPlus("Lógica de Programação"))
fimAlgoritmo

 

Link para o comentário
Compartilhar em outros sites

1º)@Simon Viegas , estava pensando justamente nessa função asc para tentar desenvolver essas funções que você propôs.

Essa resolução vai ajudar a entender.

Mas ainda tenho dúvidas em relação a função asc e carac. 

Essa função asc aí ela só retorna o número decimal da primeira letra da palavra, mesmo que a palavra tenha outra letras ?

Como aqui :

 

Algoritmo "Funções asc e carac"

Var
   palavra : caractere

Inicio
   palavra <- "Lógica"
   escreval (asc(palavra))
   escreval (carac(33))

Fimalgoritmo

2º)Mesmo que a variável palavra tenha "ógica", ela só retorna o decimal da primeira letra no caso, do "L" ?

3º)E  função carac só pode ler dois números por vez para representar um caractere ou três números por vezes para representar um caractere,

não pode ler um conjunto de números para representar a palavra inteira ?

Já que você mencionou a tabela ASCII. Tenho um pouco de dificuldade para entender. A tabela ASCII só funciona para dados do tipo caractere?

Quando cria uma variável do tipo inteiro ou real, está utilizando a tabela ASCII também?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Membro VIP

A base de tudo é o tal ASCII... mas vou tentar detalhar uns pontos. Vamos lá:

 

 

Em 14/08/2023 às 20:21, Eli Almeidaa disse:

Essa função asc aí ela só retorna o número decimal da primeira letra da palavra, mesmo que a palavra tenha outra letras ?

 

Pesquisou sobre a função? (Não estou criticando, apenas estimulando.)

 

Veja:

image.png

 

image.png

 

🙂

 

Veja: nesse PDF eu tentei pesquisar por "asc()" e não achei. Daí coloquei um espaço no meio... 😉

 

Entrando apenas num âmbito de uma mais alta "abstração". Independente do que esse "inteiro" (o retorno) venha representar, precisaria entender que existe uma "correlação" de um (caractere) para um (número). "Ele obtém um caractere e retorna um número de acordo com esse caractere, o que lá isso signifique".

 

 

 

 

Em 14/08/2023 às 20:21, Eli Almeidaa disse:

2º)Mesmo que a variável palavra tenha "Lógica", ela só retorna o decimal da primeira letra no caso, do "L" ?

 

Ou a pergunta ficou repetida (mesmo conteúdo da primeira), ou eu não entendi bem o que quis dizer...

 

 

 

 

 

Em 14/08/2023 às 20:21, Eli Almeidaa disse:

3º)E  função carac só pode ler dois números por vez para representar um caractere ou três números por vezes para representar um caractere, não pode ler um conjunto de números para representar a palavra inteira ?

 

Não. A função Carac() só recebe um valor (inteiro). Se você estiver se referindo a "dois dígitos", a resposta também é não. Ela recebe um "número qualquer" (uma eventual quantidade de dígitos seria outra questão)... e retorna um caractere que tem correção com esse número...

 

Para entender o que poderia ser "esses números" ou "esses caracteres", precisa apenas "pesquisar um pouco mais sobre ASCII".

 

 

 

 

Em 14/08/2023 às 20:21, Eli Almeidaa disse:

Já que você mencionou a tabela ASCII. Tenho um pouco de dificuldade para entender. A tabela ASCII só funciona para dados do tipo caractere?

 

Sobre o ASCII é isso.

Pesquise mais sobre!. A proposta é essa mesma: ter contato com algo novo e, caso necessário, "vestir a roupa de sapo" para tentar entender o que é. Veja artigos sobre o tema, assista vídeos no Youtube até assimilar. "ISSO VALE PARA QUALQUER COISA... PARA QUALQUER CONTEXTO". Ao entender o ASCII, vai entender perfeitamente para que serve o Asc() e Carac(). Tipo, elas são funções "opostas". Mais uma vez abstraindo: um "traduz algo de um caractere para um número", o outro "traduz algo de um número para um caractere"... isso relacionado a uma mesma coisa (de uma tal tabela lá).

 

É algo relativamente simples, é só ter um pouco mais de contato. Se aprofunde nos temas que venham a ocorrer no caminho.

 

Ao entender o ASCII, vai também entender porque resolvi utilizar esses dois pares de pares de caractere:

 

Em 14/08/2023 às 19:39, Simon Viegas disse:
se (((cod >= 65) E (cod <= 90)) OU ((cod >= 192) E (cod <= 218))) então
Em 14/08/2023 às 19:39, Simon Viegas disse:
se (((cod >= 97) E (cod <= 122)) OU ((cod >= 224) E (cod <= 250))) então

 

E o restante da lógica também

Link para o comentário
Compartilhar em outros sites

@Simon Viegas , minha pergunta foi se a função asc só retorna o decimal da primeira letra da palavra, porque nesse código abaixo,

a variável 'palavra' contém o nome "lógica" e quando executa asc(palavra), só retorna o decimal da primeira letra, no caso do "L".

Algoritmo "Funções asc "

Var palavra : caractere

Inicio
   palavra <- "Lógica"  
   escreval (asc(palavra))    

fimalgoritmo

 

E enquanto a função carac minha dúvida é se ela só ler um decimal por vez, ou se pode ler um conjunto de decimais que forma uma palavra inteira, porque ao

tentar retornar, por exemplo, o nome "Lógica" utilizando decimais que formam esse nome, dá erro . Como aqui :

 

Algoritmo "Funções carac"

Var
   palavra : inteiro

Inicio
   palavra <- 761621031059997
   escreval (carac(palavra))
              
   // Coloquei os decimais que representam cada letra da palavra "Lógica"
   // junto para tentar imprimir a palavra "Lógica" de uma vez só.
   
    //76 - L
   // 162 - ó
   // 103 - g
   // 105 - i
   // 99 - c
   // 97 - a

Fimalgoritmo

 

 

 

 

Link para o comentário
Compartilhar em outros sites

  • mês depois...
  • Membro VIP
  • Solução
Em 19/08/2023 às 16:18, Eli Almeidaa disse:

@Simon Viegas , minha pergunta foi se a função asc só retorna o decimal da primeira letra da palavra, porque nesse código abaixo,

a variável 'palavra' contém o nome "lógica" e quando executa asc(palavra), só retorna o decimal da primeira letra, no caso do "L".

 

Só retorna o código da primeira letra, como destaquei na definição da função:

 

Em 15/08/2023 às 21:36, Simon Viegas disse:

image.png

 

image.png

 

Ou seja: no VisualG não existe um tipo específico para "um caractere" (char), tem apenas para "um conjunto de caracteres" (string), daí, a função Asc() foi desenvolvida para "automaticamente" extrair a primeira letra da cadeia de caracteres que foi enviada. Ela sempre recebe um conjunto de caracteres (mesmo que tenha tamanho 1) e usa apenas o primeiro deles.

 

 

 

 

Em 19/08/2023 às 16:18, Eli Almeidaa disse:

E enquanto a função carac minha dúvida é se ela só ler um decimal por vez, ou se pode ler um conjunto de decimais que forma uma palavra inteira, porque ao

tentar retornar, por exemplo, o nome "Lógica" utilizando decimais que formam esse nome, dá erro . Como aqui :

 

Um caminho é tentar buscar a definição da função:

 

 

image.png

 

 

Ou seja: ela recebe apenas UM inteiro. Logo, só tem como traduzir para UM caractere.

 

Adendo

Agora perceba: e mesmo assim, como o VisualG separaria onde começaria e onde terminaria cada código de caractere na "sequência" 761621031059997? O primeiro é 7 ou 76? Se o primeiro for 7, o próximo seria 6 ou 61? Se o primeiro for 76, o próximo seria 1 ou 16... ou 162? Saca?.... Esse tipo de "amadurecimento lógico" vai se criando a medida que vai se desenvolvendo.

,

CONCLUSÃO

Ambos só funcionando traduzindo uma código/caractere por vez.

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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!