Doubt with "minor" in Visualg

Asked

Viewed 44 times

2

I started a course of algorithms and I like it a lot! But lately I have been quite complicated with the question of "minor" in some situations. Follows the question:

Create a program that reads the sex and age of several people. The program will ask if the user wants to continue or not to each person. At the end, show:
a) which is the age of majority
b) how many men were registered
c) the age of the youngest woman
d) what is the average age among men

The only option I can’t make 100% right is the letter C. Can anyone give me a light how to do it? My code is like this currently:

algoritmo "semnome"
var
nome,sexo,resp: caractere
a,idade,menor,maior,s,menorf,c: real
inicio
c <- 1
Repita
   Escreva("Digite seu nome: ")
   Leia(nome)
   Escreva("Digite seu sexo [M/F]: ")
   Leia(sexo)
   Se (sexo="M") entao
      a <- a+1
   fimse
   Escreva("Digite sua idade: ")
   Leia(idade)
   Se (c=1) entao
      menor <- idade
   fimse
   Se (idade>maior) entao
      maior <- idade
   fimse
   Se (sexo="F") e (idade<menor)  entao
      menorf <- menor
   fimse
   Se (sexo="M") entao
      s <- s+idade
   fimse
c <- c+1
Escreval("Você quer continuar? [S/N] ")
Leia(resp)
Ate(resp="N")
Escreval(maior, " é a maior idade.")
Escreval(a, " é a quantidade de homens.")
Escreval(menorf, " é a menor idade entre as mulheres.")
Escreval(s/a, " é a média da idade dos homens.")
fimalgoritmo

If anyone can point out my mistake, I will thank them very much. Tips on how to improve this code are also welcome :)

Thanks!

1 answer

1


Let’s go to some stitches:

  • In your code all numeric variables are real, but ages are whole, so you can use inteiro:
  • Note that you have 2x the same conditional Se (sexo="M") entao, can combine this into a single validation;
  • There are variables with less suggestive names, like "a, c, s," can improve that;
  • You can enter all values and validate at the end, it will make the code easier to understand.

That said, some changes:

var 
   nome,sexo,resp: caractere
   totM,idade,,maior,somaIdadeM ,menorIdadeF,c: inteiro

inicio
// inicializar os contadores
maior <- 0
totM <- 0
menorIdadeF <- 0
somaIdadeM <- 0

c <- 1
Repita
   Escreva("Digite seu nome: ")
   Leia(nome)
  
   Escreva("Digite seu sexo [M/F]: ")
   Leia(sexo)

   Escreva("Digite sua idade: ")
   Leia(idade)

   // primeiro o mais simples, a maior idade
   se (idade > maior)
      maior <- idade
   fimse

   // segundo sexo = M
   Se (sexo="M") entao
      totM <- totM+1
      somaIdadeM <- somaIdadeM + idade
   fimse

   // finalmente sexo = F, que tem mais validacao
   se (sexo = "F") entao
     // se a idade digitada for menor que a "atual" menor idade
     // ou se a menor idade for zero, que eh o valor inicial
     // atribui a idade digita para a menor idade

     se (idade < menorIdadeF) ou (menorIdadeF = 0) entao
        menorIdadeF <- idade
     fimse
   fimse

   
   Escreval("Você quer continuar? [S/N] ")
   Leia(resp)
Ate(resp="N")

Escreval(maior, " é a maior idade.")
Escreval(totM, " é a quantidade de homens.")
Escreval(menorIdadeF, " é a menor idade entre as mulheres.")
Escreval(somaIdadeM/totM, " é a média da idade dos homens.")

Note that in female age has 3 conditions, first se (sexo = "F") simple to understand, then se (idade < menorIdadeF) ou (menorIdadeF = 0).

The condition (idade < menorIdadeF) is also simple to understand, if you have entered an age less than "current" underage, it replaces, but the last condition ou (menorIdadeF = 0) serves to assign the first female age type to "menorIdadeF". As well?

"MenorIdadeF" was started with the value zero, now imagine that the female ages were typed 25, 15, 6, none of them will be less than zero, soon will be with zero that was the initial value, and is wrong.

A more "simple" alternative to remove the ou (menorIdadeF = 0) would start the variable "lessIdadeF" with a very high value, for example 9999, because ai "theoretically" any "valid" age would be lower, but has 2 problems:

  • There is being validated age, someone could type 50000 and will accept;
  • Could never be typed a woman’s age, and then the age would be with this "strange" value, so zero would be a more "acceptable" value, ie if never typed gets zero.

If you can find both se complicated, I could put it in a single command, but I would need one more parenthesis because, first validates sex, then age:

se (sexo = "F") e ((idade < menorIdadeF) ou (menorIdadeF = 0)) entao

Browser other questions tagged

You are not signed in. Login or sign up in order to post.