Lógica de Programação: Estruturas e Conceitos
Lógica de Programação: Estruturas e Conceitos
Felipe
Mathias Raphael
Lacerda
TRF 5ª (Analista Judiciário - Análise de
Dados) Desenvolvimento de Software -
2024 (Pós-Edital)
Autor:
Diego Carvalho, Renato da Costa,
Equipe Informática e TI, Paolla
Ramos, Fernando Pedrosa Lopes
02 de Agosto de 2024
Índice
1) Apresentação - Felipe Mathias
..............................................................................................................................................................................................3
APRESENTAÇÃO DA AULA
Olá, alunos! Bem-vindos a mais uma aula do curso de Tecnologia
de Informação para concursos públicos, no Estratégia Concursos.
Minha aventura no mundo do ensino surgiu de uma vontade interna de atuar como professor –
sempre amei explicar as coisas, além de ter certa facilidade em expressar conceitos mais complexos
para pessoas que talvez não tenham tanta experiência na área.
Meu objetivo aqui é digerir assuntos, desde os mais simples aos mais complexos, para que qualquer
aluno consiga os entender, seja um programador, operador de infraestrutura, ou simplesmente um
leigo que resolveu adentrar no mundo dos concursos e se deparou com TI no seu edital.
Gostaria de pedir que sempre vejam as questões comentadas durante a aula. Elas trazem conteúdo
essencial para o aprendizado, muitas vezes abordando alguns pontos que não foram abordados no
conteúdo e são essenciais para a resolução de questões.
Caso tenha alguma dúvida, não tenha receio de entrar em contato comigo nas minhas redes sociais
(especialmente no meu Instagram, que deixarei abaixo), ou no fórum de dúvidas que os responderei
assim que possível.
Ah, posto bastante coisa interessante de TI direcionada para concursos lá, dá uma olhadinha que
algumas coisas podem te interessar. Volta e meio acerto alguma questão de prova por lá ;)
LÓGICA DE PROGRAMAÇÃO
Conceitos gerais
Você já deve ter se deparado com a palavra “programação”, e provavelmente ela cause diversos
tipos de receio em você. Mas não tenha medo, coruja, vamos explorar toda a base da
programação e da lógica de programação nessa aula, de forma visual, e bem gradual para que
você entenda todo o assunto.
Então, de forma geral, podemos resumir a programação como a prática de escrever códigos para
orientar o computador a performar determinadas ações, em determinado momento. Como uma
peça coreografada, o computador irá ler todo o script, e executará os comandos nele escritos.
Esses comandos são instruções, definições, entre outros que veremos mais à frente.
Essas orientações ao computador são escritas a partir de algoritmos. Um algoritmo é uma
sequência finita de instruções bem definidas e não ambíguas que descrevem um processo ou
conjunto de operações a serem executadas para resolver um problema específico. Essa instruções
são lidas e interpretadas em uma ordem específica, usualmente na ordem em que são escritas no
código.
Comentários:
Perfeito! Com um algoritmo elencamos uma sequência lógica de passos, que são executados
sequencialmente, visando solucionar determinado problema através da execução de uma tarefa.
(Gabarito: Certo)
Saindo do mundo computacional, imagine que você tem uma decisão a tomar - pense que sua
namorada (o) está exigindo veementemente que você a (o) leve no cinema para assistir Duna 2.
Diante desse cenário, você concorda, afinal é um filme excelente e muito aclamado, e decide ir ao
cinema. O objetivo final é assistir ao filme, então você faz uma sequência de passos:
Pseudocódigo
Início
preparação() {
colocar a roupa,
pegar a companhia,
ir ao cinema
}
filme() {
escolher sessão,
comprar ingresso,
assistir ao filme
}
Fim
Essa caixa acima será a nossa IDE - nossa plataforma de programação que iremos
usar durante a aula. Ela é separada em três partes - um cabeçalho, que indica a
linguagem utilizada, um corpo que apresenta um bloco de código, e, por fim, um
terminal (ausente no exemplo acima) que irá mostrar o resultado da execução dos
nossos comandos. Os termos “Início” e “Fim” indicam o início e o fim de um
programa - irei omiti-los durante a aula para não tornarmos os códigos
desnecessariamente longos.
E pronto, você cumpriu o seu objetivo - que era assistir ao filme no cinema. Porém, no meio desse
caminho podem existir situações que impedem a consecução do objetivo, como o fato do filme
não estar mais em exibição, ou estar com uma sessão lotada. Na computação, a programação visa,
através dos algoritmos, justamente dar instruções gerais e alternativas, para lidar com os percalços,
visando chegar num objetivo aceitável.
Vamos fazer mais um algoritmo, para orientar você a como aprender com essa aula?
Pseudocódigo
Início
estudo() {
ler teoria,
ler questões comentadas,
fazer exercícios do PDF
}
Fim
Linguagens de Programação
OBS: Essa lista pode variar conforme a forma de análise dos dados
• Nível de Abstração:
o Linguagens de baixo nível: São mais próximas da linguagem de máquina e fornecem um
controle direto sobre o hardware do computador. Exemplos incluem Assembly.
o Linguagens de alto nível: São mais abstratas e fornecem construções mais poderosas e
expressivas. Exemplos incluem Python, Java, C++.
• Paradigma de Programação:
o Imperativa: As instruções são executadas sequencialmente, alterando o estado do
programa através de atribuições. Exemplos incluem C, Fortran.
Para a aula de hoje, como não estamos a ponto de implementar determinada linguagem ainda,
usaremos um conceito chamado de pseudolinguagem, ou português estruturado. Uma
pseudolinguagem é uma forma simplificada de expressar algoritmos e lógica de programação,
utilizando uma mistura de elementos de linguagens de programação reais e linguagem natural.
Ela é usada principalmente para explicar conceitos de programação, projetar algoritmos e fornecer
uma representação clara e compreensível de um problema ou solução, sem se preocupar com a
sintaxe específica de uma linguagem de programação real.
Comentários:
Comentários
Muitas linguagens de programação trazem instruções complexas, ou tão personalizáveis que sua
interpretação por outros desenvolvedores acaba sendo dificultada. Nesses casos, as linguagens
em geral contam com uma ferramenta de auxílio para a interpretação: os com comentários.
Comentários são blocos de código não interpretados pela ferramenta que fará a leitura do código.
Ele não possui um valor lógico, interpretável, somente um conjunto de instruções, observações e
detalhamentos que o próprio desenvolvedor utilizará. Essa instrução pode indicar algum padrão
de codificação que deve ser usado, o funcionamento de uma função ou até mesmo explicar qual
variável está sendo chamada.
Para identificar um comentário, usa-se um símbolo no início do código. Esse símbolo deve ser
escrito para cada linha do código - ou seja, se pularmos uma linha, temos de escrever o símbolo
novamente, já que as simbologias, salvo exceções específicas de códigos, abrangem somente a
linha em que o comentário se deu início.
Símbolos que são usados para os comentários diferente entre linguagens - podemos ter barras
duplas //, uma cerquilha #, ou até mesmo uma estrutura especial para comentários em múltiplas
linhas, como no JavaScript, que implementa comentários entre os símbolos /* e */, ou a notação
usada em CSS, que coloca os comentários entre <!-- e -->.
Como pseudocódigos são literais e não exigem muita “mágica” para serem interpretados, não
usaremos muitos comentários na aula de hoje - mas, quando aparecerem, usaremos a notação das
barras duplas //. Veja um exemplo:
Pseudocódigo
Início
estudo() {
ler teoria,
ler questões comentadas,
fazer exercícios do PDF //esse é um comentário de código
}
Fim
Variáveis e Constantes
Conceitos gerais
Quando estamos programando, pode ser necessário armazenar algum tipo de valor, de dado, no
conjunto de instruções que estamos passando ao computador. Por exemplo, pode ser útil definir
pi = 3.1415, para que não tenhamos que digitar o número toda vez que formos usá-lo, ou podemos
ter dados que serão alterados durante a execução do código, mas que precisam referenciar um
mesmo objeto - por exemplo, uma mudança de estado, onde a pessoa está “com fome” e depois
“saciado”.
A programação tem um tipo de estrutura específica para lidar com isso: são as variáveis. As
variáveis representam locais de armazenamento na memória do computador onde valores podem
ser guardados e manipulados durante a execução de um programa. Cada variável possui um nome
único que a identifica e um tipo de dado que determina o tipo de informação que pode ser
armazenada nela.
Variáveis
int Idade = 31
Tipo de Identificador Valor
dado
O identificador será responsável por, justamente, identificar uma variável de forma inequívoca. É,
basicamente, o nome da variável. Então, por exemplo, podemos criar uma variável “Fome”, que
irá comportar o valor sobre o estado de fome atual, ou a variável “Cor_Cabelo”, que irá receber
valores para cor de cabelo.
O tipo de dado refere-se ao formato do valor que será alocado à variável. Cada linguagem
específica trabalha com tipos de dados diferentes, mas, de forma geral, podemos definir alguns
tipos de dados básicos - e que usaremos hoje:
Então, uma variável do tipo string comportará um conjunto de caracteres, usualmente formando
algum tipo de texto. Especificamente nesse caso, as strings são delimitadas pelo uso de aspas -
podendo ser aspas simples ´string´ ou aspas duplas “string”. Isso é um ponto muito
importante, e cobrado muito pelas bancas, veja os seguintes valores:
• 5
• “5”
Se formos fazer uma comparação restrita, isso é, verificando tanto o valor quanto o tipo do dado
anotado, veremos que os dois valores são diferentes. Portanto, 5 ≠ “5”. Isso, pois a notação 5
indica que estamos trabalhando com um tipo numérico inteiro, e a notação “5” com uma string
de caracteres.
Outro ponto que é importante destacar sobre os tipos de dado é a tipagem. A tipagem diz
respeita à forma como as linguagens lidam com as definições de tipos de dado. Cada linguagem
de programação pode ter propriedades diferentes quanto à força da tipagem e quanto à
dinamicidade da tipagem. A força da tipagem diz respeito à rigidez ou flexibilidade de uma
linguagem com relação aos tipos de dados de uma variável.
• Fortemente tipada: o escopo do tipo de dado não é flexível, não permitindo, portanto,
operações entre tipos de dados distintos - assim, é exigida uma transformação explícita dos
dados ao mesmo tipo antes de operações, caso contrário a operação apontará erros.
Exemplo de linguagens fortemente tipadas incluem Python e Jave.
• Fracamente tipada: temos um escopo flexível para cada variável, permitindo operações
entre diferentes tipos sem a necessidade de uma transformação de tipo de dado explícita,
já que a linguagem irá fazer a conversão implicitamente. Exemplos de linguagem incluem
JavaScript e PHP.
• Tipagem dinâmica: o tipo é definido com base no valor que está sendo atribuído, sem
necessidade de indicação expressa do tipo de dado. Exemplo: JavaScript e Python.
• Tipagem estática: a linguagem é incapaz de definir, por ela mesma, o tipo de dado apenas
com base no valor - nesse caso, é necessária uma declaração explícita do tipo de dado junto
da variável. Exemplo: Java, C++.
Propriedades do Tipo
Força Dinamicidade
Os dados de um algoritmo devem ser definidos por tipos para que seus conteúdos possam ser
submetidos a operações corretas, inerentes a cada tipo de dado.
Comentários:
Apesar da definição se dar ora de forma expressa, ora de forma implícita (na tipagem dinâmica),
ele sempre deve ser definido, de forma que o interpretador do código consiga fazer as operações
de forma correta íntegra. Correta a afirmativa. (Gabarito: Correto)
E, por fim, temos o valor da variável. É nele que declaramos o que a variável comportará, seu
conteúdo. Esse valor, por estarmos tratando de uma variável, é, justamente, variável rs. Ele poderá
ser modificado ao longo da execução de um código sem nenhum problema maior. Em
contraponto a isso, temos as constantes. Valores armazenados em uma constante não podem ser
alterados depois de declarados e atribuídos.
Agora que você sabe o que é uma variável, precisamos aprender a declará-la. Já fizemos isso lá
em cima, quando dei o exemplo de uma variável idade a vocês. Cada linguagem tem uma forma
diferente, veja como funciona em diferentes linguagens:
JavaScript
let melhorCurso = "Estratégia"
Python
melhorCurso = "Estratégia"
R
melhorCurso <- "Estratégia"
Java
String melhorCurso = "Estratégia"
Veja que é um processo simples - definimos o nome, o valor e, quando necessário, atribuímos o
tipo de dado à relação.
Agora, uma pergunta: essas variáveis podem ser usadas em todo o programa?
A resposta é: depende. Isso pois as variáveis têm uma propriedade chamada de escopo. O escopo
define onde poderemos usar nossa variável dentro do programa, do código da aplicação. De
forma geral, temos dois tipos de escopo:
• Escopo global: as variáveis podem ser acessadas (usadas) em qualquer ponto do código,
seja fora ou dentro um outro bloco de código interno, como funções, métodos, classes etc.
• Escopo local: são acessíveis somente no contexto em que foram criadas. Por exemplo, uma
variável criada dentro de uma classe, só é utilizada dentro dessa classe.
Global Local
Nessa aula, para declararmos variáveis, iremos usar um padrão utilizado por linguagens de
tipagem estáticas, similar ao usado em Java. O padrão será:
Pseudocódigo
String nomeCurso = "Desenvolvimento de sistemas";
int numeroInteiro = 9;
double numeroDecimal = 9.31;
boolean condicao = true;
Atribuição de valores
Na seção anterior, fizemos declarações de variáveis - que consiste em definir a variável e seu tipo
de dado suportado. Porém, eu “omiti” uma informação de você: a declaração de uma variável
envolve apenas a sua criação, não a alocação de um valor a esse espaço de memória. Para
alocarmos um valor na variável, estamos fazendo o processo chamado de atribuição de valores.
Apesar dessa diferenciação entre declaração e alocação de valores, é prática comum que ambas
sejam feitas de uma só vez, já que isso otimiza o espaço do código, reduzindo as linhas e
otimizando o programa. Ainda assim, após determinada declaração de uma variável, é possível
fazer novas atribuições de valor a ela, já que ela é, justamente, variável.
Essa atribuição pode ocorrer de duas formas distintas: através de um valor, ou através de uma
referência. Quando uma variável é atribuída por valor, o que é atribuído é uma cópia do valor. Isso
significa que uma cópia do valor é feita e atribuída a outra variável. Modificar a variável original
não afetará a cópia e vice-versa. Tipos primitivos, como inteiros e caracteres, são geralmente
atribuídos por valor.
Já quando uma variável é atribuída por referência, o que é copiado é a referência (ou endereço
de memória) para o valor, não o valor em si. Isso significa que ambas as variáveis agora apontam
para o mesmo objeto na memória. Modificar o objeto através de uma variável afetará o objeto
acessado pela outra variável, pois ambas apontam para a mesma área de memória.
Formas de atribuição
Para ficar mais fácil de visualizar a diferença, vou trazer uma tabela com comparações.
a) cruzada.
b) exclusiva.
c) reversa.
d) por valor.
e) por referência.
Comentários:
O método que (b) copia os valores, e (c) cujas alterações não impactam a variável real, é chamado
de método de atribuição por valor. (Gabarito: Letra D)
Ordem de Leitura
Temos três tipos de estruturas num código, que delimitam a ordem de leitura das instruções:
• Estrutura sequencial: é a estrutura geral do código, que exige uma leitura sequencial do
código, na ordem em que ele aparece.
• Estrutura de seleção: são estabelecidas por sintaxes condicionais, e delimitam que apenas
uma das opções deve ser escolhida. Exemplo dessa estrutura são os blocos Se...então.
• Estruturas de iteração: define um bloco de código que deve ser repetido enquanto
determinada condição for obedecida. Exemplo dessa estrutura são os blocos Enquanto.
Quando estamos encarando a estrutura sequencial, determinada linha de código não tem
conhecimento de nada que está escrito após ela - por isso, não podemos acessar o valor de
variáveis antes de declará-las. Exceções a isso são linguagens que permitem hoisting.
O hoisting é uma ferramenta que empurra, automaticamente, toda variável para o topo do código,
é como se uma leitura prévia fosse feita varrendo o código e, encontrando uma variável, ela é
jogada para o topo do código para ser lida antes de tudo.
Apenas nesses casos é que as variáveis poderão ser utilizadas e lidas antes de serem declaradas.
Esse comportamento é específico de uma linguagem - o JavaScript (e suas variantes, como o
TypeScript). Na aula de hoje, usaremos a abordagem tradicional, sem hoisting, que é o mais
recomendado para evitar erros de compilação.
Ah, mais um comentário! Você deve ter percebido o uso do ponto e vírgula ;. Essa é uma
simbologia utilizada para delimitar o fim de uma instrução. O interpretador do código iniciará a
ler uma linha e considerará tudo de forma conjunta, até a delimitação do fim da linha. Essa
simbologia, a depender da linguagem de implementação, não é obrigatória.
(Inédita/Prof. Felipe Mathias) Julgue o item abaixo, com base nos conceitos da lógica de
programação.
Comentários:
Operadores
Você já deve estar acostumado a usar operadores, sejam eles os matemáticos, como soma + e
diferença -, ou até mesmo os comparativos, como o “maior ou igual” ≥. Na programação, esses
operadores também estão presentes e ocupam um papel de destaque - muitas vezes, eles que
movem nossas funções.
Operadores matemáticos
Um ponto inicial importante: os números decimais devem obedecer à notação com pontuação.
Então, escrevemos 1.99 para designar a “famosa” loja que existe em toda cidade, não 1,99. Um
outro ponto que pode ter lhe chamado atenção é justamente a operação de módulo - ela retorna
o resto de uma divisão.
5 2
-4 2
1 Resto
(CEBRASPE/EMPREL/2023)
calc = 5 % 2
imprime(calc)
a) 1
b) 2
c) 10
d) 20
e) 25
Comentários:
Questão tranquila, agora que você sabe como o módulo funciona. O cálculo é exatamente o que
fizemos acima - portanto, o resto do módulo de 5 por 2 (5%2) é 1. (Gabarito: Letra A)
X = 4 * 3 + 2 % 2
Bom, para conseguir responder, você deve saber a ordem de execução dos operadores - e aqui é
simples, seguimos a lógica dos operadores matemáticos tradicionais. A ordem se dá pela
precedência de operadores - veja a ordem, da maior preferência à menor:
1) Parênteses ()
2) Incremento/decremento ++, --
3) Multiplicação, divisão e módulo *, /, %
4) Adição e subtração +, -
Então, nossa equação pode ser representada da seguinte forma, agrupando as execuções:
X = (4 * 3) + (2 % 2)
A multiplicação 4*3 é igual a 12, já o módulo, o resto da divisão de 2 por 2 é 0. Portanto, teremos
X = 12 + 0 = 0.
“Ok Felipe, para números esse assunto é tranquilo. Mas existem somas de strings?”
Bom, se você não tinha essa dúvida, espero tê-la plantado na sua cabeça. E sim, meu caro aluno,
é possível somarmos strings. Esse tipo de operação, na computação, recebe um nome especial:
concatenação. A concatenação de textos é uma operação que faz, basicamente, a junção de dois
blocos de texto. Veja, em código, como ela funciona:
Pseudocódigo
String nome = "Felipe";
String sobrenome = "Mathias";
String nomeCompleto = nome + sobrenome;
Escrever(nomeCompleto) //função para mostrar o valor no terminal
FelipeMathias
+
Acima, usamos uma função chamada Escrever(). Irei explicar mais à frente o que é uma função
e como elas funcionam, mas já adianto que o propósito dessa função específica é escrever
determinado item no console (a parte preta abaixo do bloco de código). No nosso caso, ela
“imprime” o valor da variável nomeCompleto.
Após o algoritmo a seguir ser executado, os valores das variáveis c e d serão iguais.
real d
real c
d = 6 / -2 + -3 * -2 – 3
escreva (d)
c = 6 / -2 + 3 * 2 – 3
escreva(c)
Comentários:
Para resolvermos as operações, precisamos saber a ordem de execução dos operadores. Separarei
por parênteses para que você possa observar melhor, vamos lá.
c = (6 / -2) + (3*2) -3
c = (-3) + (6) - 3; c = 0
Como tanto d quanto c possuem o mesmo valor (0), a afirmativa está correta. (Gabarito: Certo)
Operadores Relacionais
Os operadores são:
Um detalhe que você deve ter atenção é exatamente o primeiro operador da lista, o operador de
igualdade. Quando estamos comparando a igualdade de um valor, estamos verificando se ambos
expressam o mesmo valor - diferentemente da operação “=” usada na matemática tradicional,
como em “2 + 2 = 4”. Tenha em mente que estamos fazendo comparações com o ==, enquanto
com o = estamos fazendo atribuições, usualmente a variáveis. Vamos fazer umas operações de
relação e vermos os resultados no console.
Pseudocódigo
boolean comparacao1 = 4 == 4;
boolean comparacao2 = 4 > 4;
boolean comparacao3 = 4 >= 4;
boolean comparacao4 = 4 != 4;
Escrever(comparacao1);
Escrever(comparacao2);
Escrever(comparacao3);
Escrever(comparacao4);
Verdadeiro
Falso
Verdadeiro
Falso
Podemos também, assim como nas operações matemáticas, fazer comparações de caracteres.
Aqui, a comparação será lexicográfica. Nela, as letras são tratadas conforme números na tabela
de códigos ASCII - basicamente, começamos pela letra A com o maior número, e terminamos com
o Z, como maior letra. Além disso, as minúsculas são “maiores” que as maiúsculas.
•B>A
•a>A
• Mario > Maria
• Carlos > Carla
Operadores lógicos
Os operadores lógicos são operadores que introduzem as operações de lógica booleana, aquela
que vemos junto de raciocínio lógico matemático, dentro do panorama de programações. Na
lógica booleana, temos 2 valores: valores verdadeiros, e valores falsos. Dados esses valores,
podemos fazer comparações lógicas entre eles, através de 3 operadores:
• E
• OU
• NÃO (ou NEGAÇÃO)
Nos operadores relacionais, a saída será um valor booleano a partir da comparação de dois valores
quaisquer. Aqui nos operadores lógicos, a saída também será um valor booleano - porém, estamos
comparando outros dois valores booleanos. Para saber a saída, preciso que você tenha um
conhecimento básico da lógica matemática. Vou fazer uma breve revisão com você!
E lógico (conjunção)
OU lógico (disjunção)
Com o comparador OU lógico, comparamos duas expressões lógicas e temos como resultado o
valor verdadeiro se algum dos dois valores comparados, ou ambos, forem verdadeiros. Ou seja,
só retornaremos falso se todos os elementos forem falsos. Então, teremos os seguintes casos:
O último comparador não é bem uma comparação, já que, diferentemente doas anteriores, ele
não compara dois valores, ele age em um único valor. O NÃO é responsável por “inverter” o valor
de uma variável - ou seja, se ela é verdadeira, a o NÃO irá a transformar em falsa; se for falsa, o
NÃO irá a transformar em verdadeira. Então, temos os seguintes casos:
Essas comparações podem ser analisadas a partir de uma tabela - chamada de tabela verdade.
Considere que teremos duas variáveis, p e q, que podem assumir valores verdadeiros (V) ou falsos
(F). Suas relações se darão da seguinte forma:
p q pEq ==78fc4==
p OU q NÃO p NÃO q
V V V V F F
V F F V F V
F V F V V F
F F F F V V
Vou passar algumas operações e quero que você responda mentalmente o valor booleano
resultante dessa operação, antes de verificar a resposta. Antes, vamos listar algumas variáveis de
forma agrupada - ou seja, declaramos o tipo e uma série de variáveis, e todas as variáveis
receberão o mesmo tipo. Vamos lá!
Int a = 3, b = 4, c = 1, d = 5, e = 9, f = 5
1) a > b OU d == f
Resposta: Verdadeiro. A primeira sintaxe é false, já que a (3) não é maior que b (4), mas a
segunda sintaxe é verdadeira e, como estamos com o operador OU lógico, precisamos de
apenas um dos lados com valor Verdadeiro para termos retorno Verdadeiro.
2) a > b E d == f
Resposta: Falso. Aqui temos as mesmas comparações - mas como o operador é o E lógico,
precisamos que ambos os lados sejam verdadeiros para ter o retorno verdadeiro.
3) d >= f E c < e
4) b%a == c
(CEBRASPE/Pref. Fortaleza/2023)
real c, b, d;
real x, y;
c = 5;
b = 8;
d = 3;
x = (c < b) ou (b < d) e (c < d);
y = ((c < b) ou (b < d)) e (c < d);
escreva(x);
escreva(y);
Com base no algoritmo precedente, julgue o item a seguir, relativo a operadores e expressões.
Comentários:
Questão interessante. Temos 5 variáveis (c, b, d, x, y), todas do tipo real (números positivos). As
variáveis c, b e d são declaradas de forma direta, com os valores 5, 8 e 3, e as variáveis X e Y vão
receber o valor resultante da operação lógica contida nelas. Um detalhe importante, como
estamos trabalhando com as variáveis x e y do tipo real, apesar de termos uma comparação lógica,
o valor de saída será um número - 0 se Falso, 1 se Verdadeiro. Vamos realizar as duas operações.
Basicamente, estamos fazendo o seguinte: x = (5 < 8) ou (8 < 3) e (5 < 3); x = (V) ou (F) e (F)
Para resolvermos, precisamos saber a ordem de execução das operações lógicas. As linguagens
podem variar, mas, de forma geral, temos NÃO → E → OU.
Então, faríamos:
Agora temos um parênteses - e ele sempre terá precedência. Executaremos o lado do “OU” antes
e, depois, compararemos com o outro lado da equação.
Como x (1) e y (0) são diferentes, a afirmativa está incorreta. (Gabarito: Falso)
Operações Lógicas com Números (Bitwise)
As operações lógicas não se restringem aos valores numéricos - elas podem ser aplicadas também
a valores numéricos. Para isso, você deve ter um conhecimento básico de números binários. Esse
será um assunto que você verá em mais profundidade em um momento específico, então vou
trazer uma breve explicação para que você possa entender as operações.
Os números binários são um sistema numérico que utiliza apenas dois dígitos: 0 e
1. Enquanto o sistema decimal, que é o sistema numérico mais comum, utiliza 10
dígitos (de 0 a 9), o sistema binário tem uma abordagem mais direta.
Num sistema binário, o 1 indica que o número está presente, e o 0 indica que não
está. O número mais à direita sempre equivale a 2 0 e, a partir dali, subimos uma
casa exponencial. Veja como fica, em base decimal, os 8 primeiros bits:
27 26 25 24 23 22 21 20
128 64 32 16 8 4 2 1
1100011
Quando comparamos logicamente dois números, fazemos uso de operadores bitwise, que
comparam nossas variáveis bit a bit. Ou seja, se temos um número 1011, e outro 1110 (em bits,
obviamente), iremos comparar 1 com 1, 0 com 1, 1 com 1 e 1 com 0.
1011
1110
Vamos ver os principais operadores – que derivam de operadores lógicos (E, OU e afins). Encare
o 1 como verdadeiro, e 0 como falso, que ficará bem mais tranquilo de entender.
• 1 & 1 → 1
•
•
0 & 1 → 0
1 & 1 → 1
1011
• 1 & 0 → 0 & & & &
1110
1010
Bitwiser OR ( | )
Para operações bitwise or (OU lógico) usamos o ou lógico do JavaScript: | . Aqui, teremos o valor
1 apontado quanto pelo menos um, e qualquer um, dos dois elementos for 1. A operação 11 | 14
ocorre da seguinte forma:
•
•
1 | 1 → 1
0 | 1 → 1
1011
• 1 | 1 → 1 | | | |
• 1 | 0 → 1
1110
1111
Como resposta, temos 1111, ou 15.
XOr (^)
Para operações bitwise xor (OU EXCLUSIVO lógico) usamos o xor lógico do JavaScript: ^ . O XOR
corresponde, em lógica, ao ou exclusivo, ou ao ou A ou B, mas não ambos. Dessa forma,
retornaremos 1 quando somente um dos dois números for 1, e 0 quando ambos forem 1 ou 0.
Então:
• 1 ^ 1 = 0
• 1 ^ 0 = 1
• 0 ^ 0 = 0
• 1 ^ 1 → 0
•
•
0 ^ 1 → 1
1 ^ 1 → 0
1011
• 1 ^ 0 → 1
| | | |
1110
1111
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital)
[Link]
29
178
26
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Bitwise Not
O operador bitwise not (negação lógica) usa o símbolo ~ para indicar uma negação do que
estamos comparando. Aqui, não estamos mais comparando dois números, e sim negando um
número. Mas aqui temos um detalhe: estamos trabalhando com números binários. A negação 5
não é, simplesmente, -5.
O que ocorre com o operador é a inversão total de bits. Usualmente, trabalhamos com espaços
de 32 bits. O número 5 seria representado da seguinte forma:
00000000000000000000000000000101
Porém, é comum que façamos a omissão dos 0s para simplificar o entendimento – já que, em
conversões, eles não contribuem em nada. Mas, para negarmos, iremos fazer uma complementar
e transformar todos os bits 0 em 1, e 1 em 0:
11111111111111111111111111111010
Acontece que a negação transforma um número positivo em negativo, nesse caso os binários
funcionam um pouco diferente. Aqui, o bit mais significativo (o bit mais à esquerda) é usado como
bit de sinal. O bit mais significativo igual a 1 indica um número negativo, e, se for igual a 0 ,
indica um número positivo.
Quando os números forem indicados como negativos, temos uma mudança – os 0s representam
complementos de 2. E, ao contrário de números positivos, não começamos com 2 0, e sim com 21.
Ok, parece complexo né? Mas tenho uma forma muito mais simples de resolver isso, seguindo
uma fórmula infalível:
~X = -(X + 1)
A negação de qualquer número vai ser igual ao negativo do seu número subsequente. Então:
• ~5 = -(5+1) = -6
• ~0 = -(0+1) = -1
• ~12 = -(12+1) = -13
• ...
• ~14.324 = -(14.324+1) = -14.325
Deslocamento de Bits
A última operação que veremos, que na verdade são 3, representam operações de deslocamento
– chamadas de bitwise left shift (deslocamento de bits para a esquerda), e bitwise right shift
(deslocamento de bits para a direita). Sua simbologia é:
• Bitwise Right Shift = >> ;
• Bitwise Left Shift = << ;
Aqui, deslocamos todos os bits para a direita, ou esquerda, preenchendo o bit restante com o bit
de sinal – 0 se positivo, 1 se negativo. Como a sintaxe do operador é X >> n , podemos, em X,
definir o número que queremos operar, e em n definir a quantidade de casas que iremos deslocar.
5 >> 1
• Estamos deslocando 5 (0101) 1 bit para a direita. Iremos excluir o bit mais à direita (que
destaquei em vermelho), e preencher o restante com 0s.
• 0101 >> 1 → 0010
• Convertendo para base decimal, temos que 5 >> 1 = 2
5 << 1
• Estamos deslocando 5 (0101) 1 bit para a esquerda. Aqui é mais simples – basta adicionar
mais um 0 no final da cadeia de bits.
• 0101 << 1 → 01010
• Convertendo para base decimal, temos que 5 >> 1 = 10
-5 >> 1:
• Em bitwise right shift com números negativos, por estarmos trabalhando com números
negativos (bit mais significativo igual a 1), o preenchimento é feito com 1s, e não com 0s.
• Lembrem que a negação de um número é igual a ele, somado a um, negativo (~X = -(X+1).
Então, para acharmos -5, temos que fazer ~4.
• 4 em binário: 000...0100 (vou omitir os 0s, mas saibam que existem 32 números aqui)
• Negando todos os bits, para achar -5: 111...1011
Bom, lembrem que eu falei que são 3 operadores, mas só vimos 2 né? O outro operador é uma
variação, chamado de zero-fill. O zero-fill, como o nome aponta, preencherá n casas, à direita ou
à esquerda, apenas com 0s.
Nesse caso, temos o zero-fill right shift. Ele possui uma diferença significativa: ele muda o bit mais
significativo. não preencheremos mais o número com os bits significativos, e sim sempre com 0.
Então, aqui, números negativos se tornarão positivos. Sua notação é dada ao adicionarmos mais
um símbolo ao shift, >>> .
5 >>> 1:
-5 >>> 1:
4&1
7|2
~ -5
9 >> 2
9 >>> 1
a) 0; 7; 5; 1; 2.
b) 1; 9; 5; 1; 2.
c) 0; 7; 4; 2; 4.
d) 0; 9; 4; 0; 4.
e) 1; 1; -5; 4; 2.
Comentários:
Apesar da questão ser implementada em linguagem (JavaScript), você não deve ter dificuldades
para resolvê-la, já que esse tipo de operação independe de linguagem. Vamos lá!
1. 4 & 1
Primeiro, convertemos 4 e 1 para bits, ficando com 0100 & 0001. Agora, comparamos:
• 0&0=0
• 1&0=0
• 0&0=0
• 0&1=0
Resultado 0000 = 0
2. 7 | 2
• 0|0=0
• 1|0=1
• 1|1=1
• 1|0=1
Resultado 0111 = 7
3. ~ -5
Vamos aplicar a fórmula, já que é a forma mais prática de resolvermos a questão. Lembrem:
• ~X = - (X+1)
• ~ (-5) = - (-5+1)
• ~ (-5) = - (-4)
• ~ (-5) = 4
Resultado = 4
4. 9 >> 2
5. 9 >>> 1
Como falei para vocês, operações zero-fill com números positivos não mudam nada. Assim, vamos
deslocar 1001 uma casa para a direita, preenchendo com 0s.
Estruturas condicionais
Lembram do exemplo que lhe trouxe lá no começo da aula, do problema que poderia surgir ao
chegar no cinema? Vamos recapitular.
Agora, pense logicamente, poderíamos ter uma variável chamada de filme_disponível, que
recebe um valor booleano Verdadeiro, se o filme estiver disponível, ou Falso, se ele não estiver
disponível. O objetivo do “programa” era assistir ao filme, porém se filme_disponível for
Falso, não poderemos concluir esse objetivo.
Imagine que essa variável seja de fato falso, ou seja, o filme, por algum motivo, não está disponível
para ser assistido. E agora, quais as opções? Simplesmente cancelar o “programa”? Fazer outra
coisa, ir a um bar, um restaurante? Todas essas situações precisam ser pensadas enquanto estamos
elaborando os planos da noite - caso contrário, sua companhia irá ficar irritada, né?
Na computação não é diferente, precisamos pensar em diversas situações diferentes para que um
programa lide com elas. Para esses casos, surge uma estrutura basilar em toda a programação -
as estruturas condicionais. Temos duas estruturas principais que você precisa saber e entender: o
Se...então e o Escolha...caso.
Essas estruturas são chamadas de estruturas de seleção, pois deve-se selecionar um caminho para
ser seguido. Vamos entender cada uma das estruturas.
A estrutura de controle IF, que pode ser classificada como do tipo iteração, determina o caminho
que o algoritmo deve seguir, de acordo com determinada condição.
Comentários:
Apesar do IF (Se) definir um caminho para o algoritmo seguir, ela não é uma estrutura de iteração,
e sim uma estrutura de seleção. (Gabarito: Errado)
Se... então
O Se...então (ou If... Then, em inglês) é a estrutura básica das condicionais em programação. Nela,
analisamos determinada situação, se ela for verificada, ou seja, se a comparação feita for de valor
Verdadeiro, executaremos determinado bloco de código. Veja que aqui iremos usar os
operadores lógicos e relacionais, então é importante que você tenha os entendido.
Para que você possa entender melhor, vamos analisar um “sistema de aprovação”, que irá verificar
se determinado aluno atingiu a nota desejada para ser aprovado. Aqui, vamos trabalhar
inicialmente com uma situação - apenas a mudança para “aprovado” da variável situação do aluno,
se ele tiver uma nota igual ou superior a 7.
Pseudocódigo
String Nota_do_aluno = 8;
String Situação_do_aluno = "";
Escrever(Situação_do_aluno)
Aprovado
Mas você consegue ver que esse programa está falho, né? Apenas indicaremos se o aluno está
aprovado. Não conseguimos indicar se o aluno está reprovado, se a nota for menor que 7.
Precisamos ajeitar nosso programa. Para isso, complementamos o se...Então com mais um
elemento: senão. Ele incluirá um bloco de código “residual”, que será executado se a condição
de verificação for falsa.
Pseudocódigo
String Nota_do_aluno = 6;
String Situação_do_aluno = "";
Escrever(Situação_do_aluno)
Reprovado
Podemos aprimorar ainda mais o nosso programa, colocando uma série de Senão. A interpretação
do código será feita a partir do primeiro Se...Então, caso o resultado seja Falso, pularemos ao
próximo Senão, até percorrermos todo o código - caso não seja encontrada nenhuma resposta de
valor Verdadeiro, o bloco de código utilizado corresponderá ao último Senão.
Vamos adicionar mais uma camada ao nosso exemplo: teremos os seguintes casos:
• Nota ≥ 7 = Aprovado
• Nota < 7 e ≥ 5 = Recuperação
• Nota < 5 = Reprovado
Pseudocódigo
String Nota_do_aluno = 6;
String Situação_do_aluno = "";
Escrever(Situação_do_aluno)
Recuperação
Veja que temos duas comparações - Nota_do_aluno < 7 e Nota_do_aluno >= 5, como estamos
usando o E lógico, para atender a esse Senão precisamos ter um retorno do tipo Verdadeiro nas
duas comparações. Podemos criar diversas situações de uso do Senão no meio, tendo um número
ilimitado de comparações - porém, como o código varre todas as opções verificando sua
implementação, essa pode não ser a melhor alternativa em termos de otimização.
Uma outra possibilidade de uso do Se...Então é o uso de condicionais aninhadas. Teríamos uma
condicional dentro de outra condicional - o que também pode prejudicar o desempenho do
programa, apesar de muitas vezes ser necessário. Vamos para a próxima estrutura de condicionais
que acaba resolvendo alguns dos problemas que lhe falei.
a) DO – UNTIL
b) DO – WHILE
c) IF – THEN - ELSE
d) REPEAT – UNTIL
e) SELECT – CASE
Comentários:
O bloco expressa uma escolha, se determinada condição for implementada, vamos para o caminho
do Sim, caso contrário, para o caminho do Não - isso indica a estrutura do SE-ENTÃO-SENÃO, ou
IF-THEN-ELSE, em inglês. (Gabarito: Letra C)
sp = (a + b + c)/2;
ar = sp*(sp - a)*(sp - b)*(sp - c);
se (ar < 0)
escreva (“Não é possível obter resultado.”);
senão
escreva (“Resultado: “);
escreva(raiz_quadrada(ar));
fimse
Comentários:
Como temos um valor de ar menor que 0 (ar < 0), executaremos o bloco Se, tendo como retorno
o texto “Não é possível obter resultado”, e não o valor 10.3923. (Gabarito: Errado)
Escolha...caso
No mesmo exemplo que terminamos no capítulo anterior, podemos escrever o código com o
Escolha...caso, veja:
Atualizar “Situação do
Caso Nota do Aluno ≥ 7
Aluno” para “Aprovado”
Atualizar “Situação do
Caso Nota do Aluno ≥ 7
Aluno” para “Recuperação”
Atualizar “Situação do
Senão
Aluno” para “Reprovado”
Pseudocódigo
String Nota_do_aluno = 6;
String Situação_do_aluno = "";
Escolha
Caso (Nota_do_Aluno >= 7) Faça:
Situação_do_aluno = "Aprovado";
Caso (Nota_do_aluno < 7 && >= 5) Faça:
Situação_do_aluno = "Recuperação";
Senão
Situação_do_aluno = "Reprovado";
Fim Escolha
Estruturas de Repetição
Imagine que você precise criar um código que irá Escrever, no terminal, os números de 1 a
1.000.000. De uma forma rudimentar, baseada na “força bruta”, você poderia escrever o código
da seguinte forma:
Pseudocódigo
Escrever(1)
Escrever(2)
Escrever(3)
...
Escrever(999999)
Escrever(1000000)
Já pensou o trabalho que seria escrever cada uma dessas linhas? 1 milhão de linhas para um
programa relativamente simples. Para resolver esses problemas, assim como implementar mais
dinamicidade nos códigos, entram em voga as estruturas de repetição (também chamadas de
estruturas de iteração) . Nela, repetiremos determinado bloco de código conforme a condição de
verificação. Esse tipo de estrutura pode ser chamada de loop, em inglês, e cada repetição do
bloco é chamada de iteração, ou laço.
• Enquanto
• Repita...até
• Faça...enquanto
• Para
Muito foco aqui pois essa é uma parte essencial, já que esse conteúdo é cobrado tanto na parte
de lógica de programação, quanto nas próprias linguagens em si, dada a sua importância. Vamos
lá!
Enquanto
O Enquanto (ou While) é uma estrutura de repetição que irá repetir determinado bloco de código
enquanto a condição de verificação tiver valor Verdadeiro. Aqui, a verificação é feita antes de
iniciarmos a execução, se o valor for verdadeiro, seguimos em frente na execução; caso contrário,
a repetição é terminada.
Fluxo do
Código
Enquanto
Falso
Verdadeiro
Bloco de código
Vamos refazer a nossa contagem de 1 a 1.000.000 com a estrutura do Enquanto. Para isso,
criaremos uma variável para comportar os números, chamada de contagem, e, a cada laço do
Enquanto, iremos fazer um incremento nessa variável, usando o operador ++. Lembrando que esse
código será executado enquanto a variável contagem for menor ou igual a 1.000.000. O código
ficará da seguinte forma:
Pseudocódigo
int contagem = 1
a) do while.
b) for.
c) while.
d) if.
Comentários:
Questão bem interessante. Veja que, inicialmente (em A), estamos verificando se determinada
condição é TRUE (Verdadeira) ou FALSE (Falsa). Se for TRUE, executaremos o bloco B, e essa
execução se repetirá enquanto a verificação de A continuar verdadeira. Isso caracteriza o bloco
condicional Enquanto, o While. (Gabarito: Letra C)
constante A = 50
enquanto (A > 0)
A -= 5;
fim enquanto
escreva (A);
Comentários:
Essa questão tem algumas camadas de conhecimento sendo exploradas. Para começar, podemos
afirmar errado pois a variável A é do tipo constante, ou seja, não poderá ser alterada. Porém,
vamos ignorar esse fato por enquanto e vamos analisar a estrutura do Enquanto.
Temos uma condição A > 0, ou seja, enquanto A for maior que 0, iremos executar um bloco de
código. O bloco de código é a operação A -= 5, que é uma operação de atribuição: cada vez que
ela for chamada, retiraremos 5 unidades do valor de A. Portanto, iríamos reduzir o valor de 5 em
5 - teríamos 50, 45, 40... 0.
Veja que, apesar da condição ser A > 0, quando tivermos o valor de A = 5, a condição ainda será
verdadeira e executaremos a operação A -= 5, resultando em A = 0. Nesse momento, como A
possui o valor 0, a condição não será mais estabelecida e não executaremos mais o código - mas
o valor do A que seria impresso realmente seria 0. Note a importância da ordem de leitura do
código.
Porém, novamente, como estamos tratando de uma constante, não podemos alterar seu valor de
forma externa - então o valor da operação escreva (A) (que é similar ao Escrever(A), que estamos
fazendo até agora) será 50. (Gabarito: Errado)
Repita...até
A segunda forma de estrutura de repetição, o Repita...até, que também pode aparecer como
Faça...enquanto, é uma estrutura muito similar ao enquanto - porém, a verificação da condição
é feita após a execução do bloco de código. Então, aqui, mesmo que a condição não seja satisfeita,
iremos executar o bloco de código ao menos uma vez. Além disso, aqui o bloco de código é
executado enquanto a condição for falsa. Se a condição for implementada, verdadeira, sairemos
do bloco.
Repita:
Bloco de Código
Até (Condição a ser verificada)
Fim Repita
REPITA
Bloco de código
Falso
Verdadeiro
Enquanto
Vamos pegar o mesmo código que usamos anteriormente, no Enquanto, e aplicá-lo aqui.
Pseudocódigo
int contagem = 1
Repita:
Escrever(contagem)
contagem++
Até (contagem = 1000000)
Fim Repita
Agora eu lhe pergunto, qual será o valor que será impresso no terminal na execução do último
laço desse loop?
(FGV/TCE SP/2023) Marta está definindo um algoritmo para descrever um menu de funções do
sistema, apresentando as opções baseadas em números, seguido da leitura da opção, com a saída
ocorrendo após a digitação do número zero.
Para gerenciar o fluxo de execução, que envolve a exibição do menu e leitura da opção, repetindo-
se até que seja digitada a opção zero, Marta deve utilizar a estrutura de controle:
a) enquanto - faça;
b) se - então;
c) repita - até;
d) para - faça;
e) se - então - senão.
Comentários:
O fluxo de execução de um código é a ordem com que o interpretador lê esse código e executa
operações. Estamos seguindo um fluxo de execução de bloco de código → verificação de
condição, até que determinada condição seja verificada como verdadeira. Essa estrutura se
caracteriza como uma repetição do tipo Repita...Até. (Gabarito: Letra C)
Faça...enquanto
Veja que já temos uma primeira diferença - o Faça...enquanto irá executar as instruções enquanto
a condição for verdadeira. Uma segunda diferença é o momento da verificação da condição:
apesar de executar um bloco independentemente do que ocorra, o Faça...enquanto verifica a
condição antes de executar o bloco uma vez, enquanto o Repita...até verifica depois.
Então, resumindo:
Repita:
Bloco de Código
Até (Condição a ser verificada)
Fim Repita
FAÇA
Bloco de código
Verdadeiro
Falso
Enquanto
Para
A estrutura de repetição Para é uma estrutura destinada a uso quando você já sabe quantas
iterações, quantos laços do loop você quer que sejam realizados. No Para, definimos um valor
inicial, um valor final e quanto esse valor será incrementado (ou decrementado) a cada laço -
servindo como forma de controle para quantas iterações teremos.
• a → valor de início
• b → valor final
• c → incremento ou decremento
Alternativamente, esse bloco pode aparecer como Para i de x até z, onde i indica a variável
da contagem, x o valor inicial e z o valor final - nesse caso, sempre subiremos uma unidade a cada
laço. Vamos a alguns exemplos, para que você entenda bem a sistemática do Para.
• a→y=0
• b→y<5
• c → y++
Veja que começamos o valor inicial declarando uma variável y, com valor 0. É prática comum
declararmos uma variável qualquer para isso, e essa variável terá escopo local - ou seja, só será
aplicável ao contexto dessa estrutura. Em seguida, definimos o valor limite, y < 5, e definimos a
forma de incremento - y++ (ou seja, uma unidade por laço).
Então, a cada laço, a variável y terá seu valor alterado. A execução se dará da seguinte forma:
• Laço 1 → y = 0;
• Laço 2 → y = 1;
• Laço 3 → y = 2;
• Laço 4 → y = 3;
• Laço 5 → y = 4;
Então, com essa sintaxe Para (y = 0; y < 5; y++) estamos passando para o código que queremos
executar o bloco de código definido por 5 vezes.
• a→y=5
• b→y>0
• c → y--
• Laço 1 → y = 5;
• Laço 2 → y = 4;
• Laço 3 → y = 3;
• Laço 4 → y = 2;
• Laço 5 → y = 1;
O uso do Para passa a ser interessante quando o valor da variável local declarada é útil para o
contexto do loop. Por exemplo, na nossa contagem de 1 a 1.000.000, podemos fazer a execução
do nosso programa numa forma bem reduzida. Aqui, utilizarei a variável local i, que iniciará em 0
e irá até 1.000.000, incrementando em 1 unidade a cada laço. Utilizarei essa mesma variável local
no comando Escrever(), dentro do bloco de código, para que esse valor seja impresso. Veja como
diminuímos o tamanho do código:
Pseudocódigo
Para (i = 1; i <= 1000000; i++) Faça
Escrever(i)
Fim Para
x = 10;
para (y = 40; y < 100; y = y + 16)
x = x + 10;
fim para
Comentários:
O Para inicia com a variável em 40, com o limite superior menor que 100, e incrementa o valor em
16 unidades a cada laço. Então, teremos execuções para y igual a 40, 56, 72 e 84. A próxima
iteração seria com y = 100, que passa a não obedecer mais à condição de verificação (y < 100).
Portanto, de fato, executamos o comando 4 vezes. (Gabarito: Certo)
Agora, vamos resolver uma questão de um nível avançado, que combina as estruturas condicionais
e de repetição - o que é muito comum em questões e na prática do dia a dia. Vamos lá!
Início
Inteiro: x, y, z, i;
x ← 3;
y ← 3;
z ← 3;
Para i de 1 até 6 faça
[ Se (z = 3)
Então
[
x ← x+1;
y ← y+2;
z ← z-1;
]
Senão
[
z ← z+1;
]
]
z ← x + y + z;
Fim.
a) 15
b) 16
c) 17
d) 18
e) 19
Comentários:
Não deixe o tamanho da sintaxe te assustar. Encare com calma, linha por linha, para entender o
que está acontecendo. Iniciamos o código declarando 3 variáveis do tipo inteiro, x, y e z - todas
com o valor igual a 3. Em seguida, iniciamos um loop Para numa notação um pouco diferente do
que vimos, mas basicamente estamos iniciando em 1, indo até 6 com incrementos de uma unidade
- ou seja, seria como Para (i = 1, i <= 6; i++) - ou seja, 6 laços.
x = x + 1 = 4 +1; x = 5
y = y + 2 = 5 + 2; y = 7
z = z - 1 = 3 - 1; z = 2
x=6
y=9
z=3
Por fim, temos uma nova atribuição de valor à variável z antes de finalizar o programa:
z=x+y+z
z = 6 + 9 + 3 = 18
Estruturas de Desvio
Pode ser que determinadas linhas de código só precisem ser executadas se determinada condição
for (ou não for) satisfeita. Por exemplo, se determinada condição for falsa, pode ser que tenhamos
que executar uma série de salvaguardas para proteger a aplicação, como numa tentativa de
invasão de hackers. Porém, se a condição for verdadeira, esse determinado bloco não seria
executado.
Embora muitas estruturas que vimos podem agir implementando esse “salto” de linhas, como,
por exemplo, uma estrutura condicional, temos uma estrutura específica para esses casos: é a
estrutura de desvio incondicional - representada nos algoritmos por Vá para, ou, em inglês, Go
to. Apesar de não termos essa limitação em pseudocódigo, essa estrutura de desvio não é
suportada nativamente por diversas linguagens, necessitando de uma adaptação através de
funções.
Veja um exemplo:
Pseudocódigo
Inicio
int nota
String situaçao
Função Prova_de_Recuperação() {
//bloco de código
}
Fim
No exemplo acima, pularemos toda a parte do código necessário para gerar uma prova de
recuperação, caso a nota do aluno seja maior ou igual a 7. Outros casos comuns de uso do Vá para
envolvem loops aninhados - onde, se determinada condição no loop interno for satisfeita, usamos
um comando de desvio para encerrar o loop total, tanto interno quanto externo.
Estruturas de Dados
As Estruturas de Dados são formas de agruparmos diversos valores em uma única variável. Esses
assuntos são vistos com mais profundidade em aula específica, mas, como muitas questões de
lógica de programação exigem conhecimentos acerca desses assuntos, vou passar um panorama
geral para você do que é cada estrutura de dados. Veremos 5 estruturas na aula de hoje:
• Vetores
• Listas
• Filas
• Pilhas
• Matrizes
• Registros
Vetores
Os vetores, também referenciados pelo seu nome em inglês, array, são estruturas de dados
homogêneas, isso é, recebem somente um tipo de dado, que comportam uma coleção de dados
ordenados. Além disso, eles são um tipo de estrutura unidimensional, ou seja, os dados são
agrupados em uma única direção, formando uma lista de dados. Para declararmos vetores, vamos
usar o seguinte padrão:
Pseudocódigo
int vetorNumeros = vetor [1, 2, 3, 4, 5]
Cada elemento, desses 5 atribuídos ao vetor, é delimitado por uma posição - chamada de índice.
Esse índice, ou index em inglês, é útil para acessarmos determinado valor dentro do vetor.
Usualmente, começa-se a contagem de posições a partir do 0. Portanto, o primeiro elemento terá
a posição 0, e incrementamos a posição de 1 em 1. Veja:
1 2 3 4 5
Índice: Índice: Índice: Índice: Índice:
0 1 2 3 4
Para acessarmos determinado elemento do vetor, basta delimitarmos a posição desse elemento
dentro de um par de colchetes - veja:
Pseudocódigo
int vetorNumeros = vetor [1, 2, 3, 4, 5]
Escrever(vetorNumeros[2])
• É uma estrutura de dados estática, isso é, possui um tamanho fixo determinado na hora da
sua criação
• São armazenados de forma contígua na memória, possibilitando uma pesquisa mais veloz
de elementos no seu corpo.
Listas
As listas são uma estrutura de dados que comportam uma multiplicidade de valores de forma
ordenada, assim como os vetores - mas elas tem algumas diferenças basilares entre si. Enquanto
os vetores são estáticos, as listas são dinâmicas, isso é, permitem a inserção e remoção de
elementos livremente, já que não temos um tamanho fixo.
Imagine uma lista enorme, com 1.000 números. A complexidade de escrever os valores
manualmente, como fizemos no vetor, passa a ser maior, não é? Para resolver isso, podemos
começar com uma lista vazia, e alimentá-la através de operações de atribuição ( +=) dentro de um
loop. Veja como ficaria.
Pseudocódigo
int lisaLonga = lista []
Após o algoritmo a seguir ser executado, o valor da variável soma1 será maior que o da variável
soma2.
vetor a[7];
real soma1, soma2;
inteiro i;
a = [1,3,9,27,81,243,729];}
soma1 = 0;
i = 0;
soma2 = 1 * (1-3^7)/(1-3)
escreva(soma1)
escreva(soma2)
Comentários:
A questão traz algumas variáveis, dentre elas um vetor a com 7 elementos. Vamos achar o valor
de soma1 e soma2, para verificarmos o apontamento da afirmativa. Vamos começar com o soma1.
O loop Enquanto irá somando o valor atual de soma1 com a respectiva posição no vetor. Então,
como i = 0, e o aumento a cada laço é incremental, faremos 7 loops (de i = 0 até i = 6). Vamos ver
o primeiro laço:
1) Laço 1 - i = 0:
soma1 = soma1 + a[0]
soma1 = 0 + 1 = 1
2) Laço 2 - i = 1:
soma1 = soma1 + a[1]
soma1 = 1 + 3 = 4
3) Laço 3 - i = 2:
soma1 = soma1 + a[2]
soma1 = 4 + 9 = 13
4) Laço 4 - i = 3:
soma1 = soma1 + a[3]
soma1 = 13 + 27 = 40
5) Laço 5 - i = 4:
soma1= soma1 + a[4]
soma1 = 40 + 81 = 121
6) Laço 6 - i = 5
soma1 = soma1 + a[5]
soma1 = 121 + 243 = 364
7) Laço 7 - i = 6
soma1 = soma1 + a[6]
Portanto, o valor final da variável soma1 é 1.039. Na hora da prova, se você tiver entendido a
lógica - que estamos somando todos os valores do vetor - a resolução se torna muito mais rápido.
Só iríamos somar os valores de a, e encontraríamos o mesmo valor.
Então, o valor de soma2 (1.093) é maior que o valor de soma1 (1.039). Sendo assim, afirmativa
incorreta. (Gabarito: Errado)
Filas
As filas, ou queues, são estruturas de dados homogêneas e unidimensionais, assim como as listas
- mas possuem uma propriedade especial: as inserções e remoções da sua estrutura utilizam a
regra “primeiro a entrar, primeiro a sair” - ou FIFO (“First In, First Out”). Ou seja, sempre que
formos inserir um elemento na estrutura, ele será inserido no fim da fila, e quando retirarmos
algum dado, o primeiro dado da fila será retirado.
As filas, assim como a próxima estrutura de dados, pilhas, não são implementadas de forma direta
por algumas linguagens - então, é comum o uso de extensões ou a implementação através de um
tipo especializado de lista. Aqui na lógica de programação, como não trabalhamos com uma
linguagem específica, não temos problemas quanto a isso.
(CEBRASPE/SEPLAN RR/2023) Julgue o item a seguir acerca dos conceitos de estrutura de dados.
Sempre que houver uma remoção na estrutura de dados denominada fila, o elemento removido
será aquele que está na estrutura há mais tempo.
Comentários:
Pilhas
As pilhas, ou stacks, assim como as filas, são estruturas de dados homogêneas e unidimensionais.
Aqui, novamente, temos uma estrutura diferenciada, utilizando o padrão “Último a Entrar,
Primeiro a Sair” - ou LIFO (“Last In, First Out”). Pense num pacote de Pringles - a última batata
adicionada ao pacote será aquela no topo do tubo, e essa também será a primeira a ser retirada.
A estrutura em pilha funciona da mesma forma.
a) Fila
b) Lista Encadeada
c) Pilha
d) Árvore
Comentários:
Matrizes
As matrizes são estruturas de dados homogêneas, assim como os vetores - mas a principal
diferença aqui é que passamos a trabalhar com duas dimensões. Assim, passamos a trabalhar com
índices em duas dimensões - a dimensão horizontal e vertical. Pense em uma estrutura similar a
uma matriz que você estudou em matemática, no ensino médio.
Para declararmos uma matriz é simples, temos um processo similar ao da lista - porém, ao
delimitarmos os colchetes, cada linha será delimitada por um outro par de colchetes internos. Veja
uma estrutura geral:
Assim como nos vetores, podemos acessar os elementos da matriz através de seu índice. Porém,
agora temos 2 eixos para verificar a posição, assim sendo necessário dois argumentos ao
especificarmos o dado que queremos recuperar. Por exemplo, matriz[0, 0] irá retornar o primeiro
elemento, da primeira linha.
Veja um exemplo em uma tabela - nela, iremos selecionar o elemento matriz[2, 3], onde 2
representa a linha, e 3 a coluna.
Índice 0 1 2 3 4
0 Brasil EUA Canada México Bolívia
1 Japão Egito Gana China Bélgica
2 Argentina Itália Inglaterra Peru Austrália
3 Rússia Nepal Holanda Cuba Líbia
Em termos de sintaxe, poderíamos montar essa tabela e selecionar o mesmo elemento da seguinte
forma:
Pseudocódigo
int matrizPaises = matriz [
["Brasil", "Eua", "Canada", "México", "Bolívia"],
["Japão", "Egito", "Gana", "China", "Bélgica"],
["Argentina", "Itália", "Inglaterra", "Peru", "Austrália"],
["Rússia", "Nepal", "Holanda", "Cuba", "Líbia"]]
Escrever(matrizPaises[2, 3])
Peru
(IDCAP/CREA BR/2023) É correto afirmar que a imagem abaixo corresponde a um exemplo de:
a) Lista.
b) Árvore.
c) Conjunto.
d) Matriz.
e) Tabela espelhada.
Comentários:
A estrutura apresenta um conjunto de dados elencados em linhas em colunas, cada qual com seu
respectivo índice. Essa estrutura caracteriza uma matriz. (Gabarito: Letra D)
precisa de um índice para cada uma de suas dimensões”. Essa descrição se refere a qual estrutura
de dados?
a) Registro.
b) Vetor.
c) Matriz.
d) Pilha.
e) Fila.
Comentários:
Registros
O registro é uma estrutura de dados heterogênea, ou seja, agrupa diferentes tipos de dado numa
mesma variável. Ele é usado para representar entidades ou objetos complexos, nos quais cada
campo dentro do registro armazena um tipo específico de informação.
Em um registro, cada campo possui um nome único que o identifica e um tipo de dado associado
que define o tipo de informação que pode ser armazenada nele. Por exemplo, em um registro de
Pessoa, poderíamos ter campos como "nome" (String), "idade" (inteiro), "altura" (real), etc.
Quando definimos um registro, definimos um “esqueleto” de estrutura, sem passar nenhum valor
para a variável. Posteriormente, podemos criar variáveis derivadas desse esqueleto, com toda a
sua estrutura implementada. Vamos para um exemplo!
Pseudocódigo
registro Pessoa
Nome: String
Idade: Int
Altura: Float
fim Registro
Com isso, criamos uma estrutura de registro. Agora, podemos declarar variáveis conforme essa
estrutura, que vai funcionar como um “tipo de dado” para a variável declara. Assim, podemos
passar valores para os diferentes identificadores internos da entidade. Vamos fazer duas
atribuições, para que você possa entender melhor.
Pseudocódigo
Pessoa pessoa1
[Link] = "Felipe"
[Link] = 30
[Link] = 1.88
Pessoa pessoa2
[Link] = "Milena"
[Link] = 24
[Link] = 1.62
Veja que “navegamos” através das diferentes variáveis dentro do registro através de um ponto -
por exemplo, em [Link], estou atribuindo um valor para a propriedade nome, da variável
pessoa1. Isso permite também que retornemos esse valor através de uma seleção, assim como
fizemos com os vetores e as matrizes.
Rotinas
Funções e Procedimentos
À medida que encontramos problemas cada vez mais complexos, é necessário quebrarmos um
programa geral em diversos outros programas menores, “subprogramas”, cada qual com uma
funcionalidade definida. Essas pequenas partes que formam o programa são chamadas de rotinas.
As rotinas facilitam a execução e legibilidade do código, além de adicionar a modularidade ao
programa - já que definimos determinada funcionalidade, ela pode ser replicada em outros pontos
do código, quando for necessário.
Vou dar um exemplo: quando usamos o código Escrever(texto) para que determinado texto
seja mostrado no terminal, não temos nenhum retorno no código, apenas os dados sendo
mostrados no terminal. Esse é um procedimento. Para funções, o exemplo mais clássico é o uso
de uma função para fazermos a exponenciação de um número. Podemos fazer:
Função exp(a, b)
retorne a^b
fim Função
Comentários:
Perfeito! Funções são blocos de código que executam alguma instrução repetível, isso é, pode ser
usada repetidamente sem “esgotamento”. Para ser caracterizada como uma função, deve haver
um retorno. (Gabarito: Correto)
Função (parâmetros):
Bloco de código
Fim Função
Para entendermos melhor como implementar essa estrutura, precisamos entender os parâmetros.
Parâmetros
Os parâmetros (também chamados de argumentos) em funções são variáveis locais que são
especificadas como parte da definição de uma função e que recebem valores quando a função é
chamada ou invocada. Eles servem como mecanismo para passar informações para dentro de uma
função, permitindo que ela trabalhe com valores específicos.
Quando uma função é definida, os parâmetros são listados entre parênteses após o nome da
função. Por exemplo, em uma função que calcula a soma de dois números, os parâmetros seriam
os dois números que estão sendo somados. Quando a função é chamada, os valores passados
como argumentos para os parâmetros são atribuídos às variáveis de parâmetro dentro da função,
permitindo que ela os utilize em suas operações internas.
Você pode não ter percebido, mas quando lhe expliquei a função exponencial, usamos os
parâmetros. Vamos relembrar:
Função exp(a, b)
retorne a^b
Fim Função
Aqui, temos os parâmetros a e b. Como é uma função de exponenciação, o parâmetro a será nossa
base, e o parâmetro b o expoente. Assim, toda vez que chamarmos uma função, passaremos os
parâmetros que queremos calcular. Por exemplo podemos achar 3² passando a função exp(3,2),
ou 3³ passando a função exp(3,3).
Na instrução A(i) = FUNC(i), a saída da função FUNC( ) é passada corretamente como parâmetro
de entrada (i) para a função A.
Comentários:
Na instrução A(i) = FUNC(i), o valor de retorno da função FUNC(i) está sendo atribuído à variável
A na posição i, mas não está sendo passado como parâmetro para a função A. A atribuição
acontece após a chamada da função FUNC(i), portanto, não está sendo passado como parâmetro
de entrada para a função A. (Gabarito: Errado)
Pseudocódigo
Função soma (a, b)
retorne a + b
Fim Função
Escrever(soma(3, 4))
Escrever(soma(2, 2))
Escrever(soma(3, 9))
7
4
12
Podemos também fazer funções mais avançadas, com blocos de códigos extensos - incluindo
outras funções locais, declaração de variáveis locais, entre outros. Vamos fazer um exemplo, uma
função que irá identificar se determinado valor é par ou não.
Pseudocódigo
Função par(i)
Se (i%2 == 0) Então
Retorne "É par"
Senão
Retorne "É impar"
Fim Função
Escrever (par(2))
Escrever (par(0))
Escrever (par(3))
Escrever (par(9))
É par
É par
É impar
É impar
A função apresentada irá passar o parâmetro apresentado para um bloco condicional. Se o resto
da divisão do parâmetro por 2 for 0, teremos um número par - e retornaremos “É par”. Caso
contrário, executaremos o bloco Senão e teremos um retorno “É ímpar”.
Função soma_fatorial(n)
Soma = 0
Para i de 1 até n faça
Fatorial = 1
j=1
Enquanto j <= i faça
Fatorial = Fatorial * j
j=j+1
Fim Enquanto
Soma = Soma + Fatorial
Fim Para
Retorne Soma
Fim Função
A) 3
B) 6
C) 9
D) 12
Comentários:
Estamos rodando a função com n = 3, e dentro dela temos um bloco Para começando com i = 1,
indo até i = 3 , com somas unitárias (ou seja, teremos 3 laços). Ademais, dentro do bloco Para,
temos um outro loop Enquanto - que será executado enquanto a variável local j for menor ou igual
à variável i. Vamos fazer os laços.
• Fatorial = Fatorial * j
• Fatorial = 1 * 1
• Fatorial = 1
• j=j+1
• j=1+1=2
• j=2
• Fatorial = Fatorial * j
• Fatorial = 1 * 2
• Fatorial = 2
• j=j+1
• j=2+1
• j=3
• Fatorial = Fatorial * j
• Fatorial = 2 * 3
• Fatorial = 6
Portanto, concluímos que o valor de Soma para soma_fatorial(3) é 9. Esse programa é responsável
por calcular a soma de todos os fatoriais até de 1 até 3 - portanto, somamos o fatorial de 1 (1), de
2 (2) e de 3 (6). (Gabarito: Letra C)
Essa passagem de parâmetros que vimos até agora é conhecida como passagem de valor.
Podemos ter uma outra forma de passagem de parâmetros chamada de referência. Aqui, ao invés
de passar uma cópia do valor de uma variável para uma função, é passada uma referência (ou
endereço de memória) para a variável original. Isso significa que a função pode modificar o valor
da variável original diretamente, já que ela tem acesso direto à sua localização na memória.
Guarde a diferença!
a) A passagem por referência é uma técnica que permite que variáveis sejam executadas em
paralelo; ao contrário da passagem por valor.
b) A passagem de uma referência à memória onde o valor está armazenado; a passagem por valor
envolve a cópia do valor real do argumento para a função.
c) A passagem por referência permite modificar o valor da variável passada como argumento,
não necessariamente uma variável global; ao contrário da passagem por valor.
d) A passagem por valor é uma técnica que permite modificar o valor de uma variável global a
partir de uma função; a passagem por referência mantém a integridade do valor original.
Comentários:
Lembre-se, a passagem de parâmetros por referência passa um ponteiro, que aponta para o local
na memória onde o dado está armazenado, permitindo a modificação do parâmetro diretamente
pela função. Já a passagem por valor traz apenas uma cópia literal do parâmetro. (Gabarito: Letra
B)
Temos alguns tipos especiais de funções. As principais, e que você precisa saber, são:
• Funções recursivas
• Funções anônimas
• Funções de ordem superior
• Funções nominadas
• Funções puras
Tipos de Funções
Funções recursivas
Pode ser que uma função chame a si mesma durante o a sua execução. Esses casos são chamados
de funções recursivas. Esses casos são úteis para cálculos matemáticos complexos, como
Fibonacci, navegações de estruturas de dados mais avançadas, algoritmos mais avançados, entre
outros.
Para estruturarmos uma função recursiva, não basta simplesmente chamar a própria função dentro
do seu corpo - afinal, se fizermos isso, teremos um loop infinito que “quebrará” o código.
Devemos seguir uma estrutura composta de:
• Um caso base, literal, que determina quando a função recursiva deve parar de chamar a si
mesma e começar a retornar valores . Ela é aparte essencial para que não entremos em um
loop infinito.
• Uma chamada recursiva, que irá chamar a função principal com um argumento diferente a
cada laço. Cada chamada recursiva normalmente reduz o problema em direção ao caso
base, garantindo que, eventualmente, o caso base seja alcançado e a recursão pare.
Função Recursiva
Uma função é dita recursiva quando, dentro dela, é feita uma ou mais chamada a ela mesma.
Comentários:
Perfeito! Uma função recursiva é aquela que chama a si mesmo um ou mais vezes dentro de seu
próprio bloco de código. (Gabarito: Certo)
f(0) = 0
f(1) = 1
f(n) = f(n-1) + f(n+2), para qualquer natural n > 1
CODIGO-01
def f(n: int):
if n == 1:
return 1
if n == 2:
return 1
else:
return f(n-1) + f(n-2)
CODIGO-02
Comentários:
Trouxe essa questão mais como um desafio a você - apesar de ela estar expressa numa linguagem
real, em Python, você deve ter sido capaz de identificar a recursividade apenas no código 01,
nesse seguinte trecho:
else:
return f(n-1) + f(n-2)
Estamos chamando a própria função f, com parâmetros diferentes. Já no código 02, não
conseguimos encontrar nenhum caso de recursividade, já que a função f só é citada na sua própria
definição, não dentro do seu bloco de código. Portanto, podemos afirmar que somente o primeiro
algoritmo emprega função recursiva. (Gabarito: Letra A)
Vou trazer um exemplo para você entender melhor o funcionamento, vamos lá.
Função fatorial(n)
Senão
Chamada recursiva
Retorne n * fatorial (n - 1)
Fim Função
Vamos chamar essa função e ver como dá seu funcionamento? Vamos começar com fatorial(3).
Laço 1 - n = 3
• n * fatorial (n - 1) = 3 * fatorial(2)
Terminamos com um bloco que não sabemos o resultado - a função fatorial(2). Precisamos ir para
o próximo laço da recursividade, para encontrarmos esse valor.
Laço 2 - n = 2
• n * fatorial (n - 1) = 2 * fatorial(1)
Laço 3 - n = 1
• n * fatorial (n - 1) = 1 * fatorial(0)
Laço 4 - n = 0
Finalmente chegamos no caso em que vamos executar o bloco base. Como temos n == 0, iremos
simplesmente retornar 1. Então, podemos afirmar que fatorial(0) = 1.
• Laço 4 → fatorial(0) = 1
• Laço 3 → fatorial(1) = 1 * fatorial(0) = 1 * 1 = 1
• Laço 2 → fatorial(2) = 2 * fatorial(1) = 2 * 1 = 2
• Laço 1 → fatorial(3) = 3 * fatorial(2) = 3 * 2 = 6
Portanto, encontramos que a execução de fatorial(3) é igual a 6. Perceba que vamos agregando
os valores encontrados, até voltarmos ao topo da recursão e encontrarmos o valor que
pretendíamos originalmente.
Funções puras
Uma função é chamada de função pura se, e somente se, dada uma mesma entrada, sempre
retornará uma mesma saída, sem efeitos colaterais observáveis. Isso quer dizer que o resultado da
função depende apenas de seus argumentos, e não de estados externos, como variáveis globais
ou estados do sistema.
• Determinismo: Dadas as mesmas entradas, uma função pura sempre produzirá o mesmo
resultado.
• Ausência de efeitos colaterais: Funções puras não modificam variáveis globais, arquivos,
bancos de dados, etc. Seu único efeito é retornar um valor.
• Transparência referencial: Pode-se substituir a chamada de uma função pura pelo seu
resultado, sem alterar o comportamento do programa.
a) baixa coesão
b) ausência de efeitos colaterais
c) incapacidade de chamar outra função
d) alto acoplamento
e) encapsulamento aberto
Comentários:
A questão exige conhecimento sobre a linguagem Scala, mas isso é indiferente, já que a definição
de uma função pura independe da linguagem. Das alternativas apresentadas, a única que aponta
uma característica da função é a letra B, com a ausência de efeitos colaterais. (Gabarito: Letra B)
Funções nominadas
As funções nominadas, sem surpresa, são funções com nomes específicos e podem ser chamadas
por esse nome, em qualquer parte do programa. Ela é declarada com um nome específico, de
forma a permitir sua reutilização ao longo do programa. Até agora, todas as funções que
trabalhamos são funções nominadas.
Existem algumas funções nominadas “especiais”, que já foram pré-concebidas e têm seu nome
restrito ao uso por outras funções. Elas trazem funcionalidades pré-programadas, como o print()
em Python, que faz uma impressão do código no terminal de comando, ou o length() em
JavaScript, que registra o comprimento de um objeto.
Funções anônimas
Funções anônimas são chamadas assim pois não possuem nome - são um contraponto às funções
nominadas. Elas só podem ser utilizadas localmente, já que não possuem uma referência para
serem chamadas externamente. O exemplo mais comum de funções anônimas são as funções
lambda, em Python.
Pseudocódigo
int Quadrado = Função(x) retornar x * x
int Resultado = Quadrado(5)
Veja que estamos chamando a variável Quadrado, que especifica uma função local, e não a própria
função - até porque ela não tem nome, não temos como chamá-la.
Uma função de ordem superior é uma função que recebe outra função como argumento e/ou
retorna uma função como resultado. Em outras palavras, uma função de ordem superior trata
funções como cidadãos de primeira classe, permitindo que elas sejam passadas e retornadas como
qualquer outro tipo de dado. Veja um exemplo:
Pseudocódigo
Função operacaoMatematica(x, y, operacao)
retornar operacao(x, y)
fim Função
A princípio, a função parece uma função simples, apenas com três parâmetros - mas, no corpo
dela, dentro do bloco de código, estamos chamando outra função, a função operacao(). Essa
função pode ser definida externamente, e passada como parâmetro. Veja como podemos
desenvolver esse caso.
Pseudocódigo
Função aplicarOperacaoMatematica(x, y, operacao)
retornar operacao(x, y)
fim Função
Função soma(a, b)
retornar a + b
fim Função
Função multiplicacao(a, b)
retornar a * b
fim Função
Escrever(resultado1)
Escrever(resultado2)
8
15
Vamos resolver um exercício complexo? Nele iremos misturar as funções de ordem superior com
recursividade.
função f(x)
se (x == 0 ou x == 1)
retorna 1;
fimse
retorna f(x - 1)*x
fimfunção
função func(a)
se (a == 0)
retorna 2
fimse
retorna a + f(a - 1)
fimfunção
escreva(func(6));
Comentários:
Temos duas funções - uma função recursiva f(x) e outra função de ordem superior func(a). Estamos
chamando primeiramente a função de ordem superior, com func(6). Então, vamos ver o que
acontece.
Como o parâmetro a = 6, vamos cair no bloco alternativo - vamos retornar a + f(a - 1), ou seja, a +
(f5). Sendo assim, precisamos subir para a função f(x) e resolvê-la com x = 5. E nela, novamente,
como não atendemos a condição do Se, vamos executar o retorno - f(x-1) * x
Por fim, no laço 5 teremos f(1), e, como x == 1, caímos no bloco base - retornando 1. Como
chegamos a um valor, podemos subir somando.
Laço 5 - f(1) = 1
Laço 4 - f(2) = f(1) * 2 = 1 * 2 = 2
Laço 3 - f(3) = f(2) * 3 = 2 * 3 = 6
Laço 2 - f(4) = f(3) * 4 = 6 * 4 = 24
Laço 1 - f(5) = f(4) * 5 = 24 * 5 = 120
Então, encontramos que f(5) é igual a 120. Então é essa a resposta... só que não! Agora temos que
voltar para a função que foi chamada inicialmente, a func, nós paramos a execução do bloco com
a + f(5). Portanto, teremos a + 120 = 120 + 6 = 126.
Com isso terminamos a sua introdução à lógica de programação. É essencial que você entende o
conteúdo dessa aula, ela irá facilitar (e muito) o aprendizado das demais linguagens de
programação - que criam uma estrutura definida para implementar as diversas formas de interação
que vimos na aula de hoje. Não esqueça de resolver as questões para aplicar o conhecimento da
aula.
QUESTÕES COMENTADAS
Algoritmo Maior
Var
num1, num2, maior: inteiro:
Inicio
Leia (num1, num2);
Se (num1>num2) então
maior ← num1;
senão
maior ← num2;
fimse;
escreva (maior);
Fim
a) diagrama de Nassi-Shneiderman
b) diagrama hierárquico de fluxo
c) pseudocódigo
d) fluxograma
Comentários:
Veja que não temos uma estrutura padrão para de linguagem - estamos usando uma linguagem
estruturada apenas para descrever um algoritmo. Isso caracteriza o uso de pseudolinguagem.
Gabarito: Letra C
Comentários:
Gabarito: Correto
03. (CEBRASPE/CAU BR/2024) Com relação à lógica de programação, julgue o próximo item.
A estrutura de controle IF, que pode ser classificada como do tipo iteração, determina o caminho
que o algoritmo deve seguir, de acordo com determinada condição.
Comentários:
• Estruturas sequenciais
• Estruturas de seleção
• Estruturas de iteração (ou repetição)
O IF, ou Se, é uma estrutura de seleção, que elenca uma série de blocos de código, e um deles
será selecionado para execução conforme determinada condição pré-definida.
Gabarito: Errado
Comentários:
Cuidado! O pseudocódigo não conta com uma estrutura definida e, portanto, não é uma
linguagem executável. Diferentemente de linguagens como Java e Python.
Gabarito: Errado
05. (CEBRASPE/TST/2024)
programa principal
inteiro i, contagem = 10, limite = 10;
Com base no algoritmo precedente, escrito em pseudocódigo, assinale a opção que corresponde
ao tipo de estrutura em que se realiza o decréscimo da variável contagem.
a) estrutura de controle
b) estrutura de repetição
c) estrutura condicional
d) atributo
e) função
Comentários:
O bloco de código apresenta uma estrutura Para, que é uma das formas de implementarmos uma
estrutura de repetição (iteração), principalmente nos casos em que sabemos a quantidade de laços
(iterações, repetições) que queremos realizar.
Gabarito: Letra B
a) o reaproveitamento de código.
b) a passagem de parâmetros.
c) o recebimento do retorno das funções.
d) o grau de abstração do sistema.
e) a facilidade de implementação das funções.
Comentários:
Funções pré-definidas fazem parte das funções nominadas, que permitem seu reuso através de
uma chamada posterior, utilizando o nome da função - que pode ser nativa à linguagem, ou criada
pelo desenvolvedor. Com isso em mente, vamos às alternativas.
a) Certo. De fato, uma das maiores vantagens trazidas pelas funções predefinidas é a
capacidade de reaproveitar o bloco de código ao longo do programa.
b) Errado. Passagem de parâmetros é um processo feito em qualquer tipo de função, não é
inerente às funções predefinidas.
c) Errado. Toda função retorna determinado valor.
Gabarito: Letra A
a) F-F-F
b) F-V-F
c) V-F-V
d) V-V-V
Comentários:
( ) Estruturas de condição não são necessárias em programação, pois é possível realizar todas as
operações sem avaliar condições.
Falso. Não temos outra forma de implementar as funcionalidades das estruturas condicionais sem
o uso delas - e as condições são partes estruturantes e essenciais de um código.
Gabarito: Letra B
a) goto
b) struct
c) if
d) else
e) for
Comentários:
Na execução de um código, dada determinada situação, pode ser interessante (ou obrigatório)
que linhas de código sejam puladas para a correta execução de um programa - como, por
exemplo, se determinado bloco Se for executado, podemos pular instruções que introduziriam
alternativas à execução desse bloco. A instrução que realiza esse “salto” é a goto (vá para).
Gabarito: Letra A
09. (CEBRASPE/POLC AL/2023) Julgue o próximo item, no que se refere a estruturas de controle
de fluxo.
// codigo 1
i=1
fim = 7
enquanto i < fim faça
escreva(i)
i=i+1
fim enquanto
depois = i
// codigo 2
fim = 6
i=0
enquanto i < fim faça
i=i+1
escreva(i)
fim enquanto
depois = i
Comentários:
Temos dois loops Enquanto. Ambos possuem a mesma estrutura - serão executados enquanto a
variável i for menor que a variável fim (i < fim) e, a cada iteração, incrementarão o valor da variável
i em 1 unidade. Vamos analisar a saída de cada código.
Código 1:
• Escrever o valor de i
• Incrementá-lo em uma unidade
• Laço 1 - i = 1:
o escreva (i) → 1
o i=i+1→i=2
• Laço 2 - i = 2:
o escreva(i) → 2
o i=i+1→i=3
• Laço 3 - i = 3:
o escreva(i) → 3
o i=i+1→i=4
• Laço 4 - i = 4:
o escreva(i) → 4
o i=i+1→i=5
• Laço 5 - i = 5
o escreva(i) → 5
o i=i+1→i=6
• Laço 6 - i = 6
o escreva(i) → 6
o i=i+1→i=7
No laço 6, quebramos a condição e o bloco Enquanto. As saídas dessa estrutura foram (1, 2, 3, 4,
5, 6).
Código 2:
A saída aqui será (1, 2, 3, 4, 5, 6). Veja que temos a mesma saída - isso acontece pois a escrita do
valor da variável acontece antes do incremento no código 1, e depois do incremento no código
2. Sendo assim, correta a afirmativa.
Gabarito: Correto
Início
[
Tipo MAT = matriz[1..3,1..3] de inteiros;
MAT: M;
Inteiro: i, j, X, Y;
X ← 0;
Y ← 0;
Para i de 1 até 3 faça
[
Para j de 1 até 3 faça
[
Se i = j
Então M[i,j] ← i + j + 1;
Senão M[i,j] ← i + 2*j + 1;
]
]
Para i de 1 até 3 faça
[
X ← X + M[i,i];
Y ← Y + M[1,i];
]
Imprima (X+Y);
] Fim.
a) 29.
b) 30.
c) 31.
d) 32.
e) 33.
Comentários:
Em questões longas como essa, aconselho que analise o código com muita calma e cuidado, para
entender a ordem de execução dos comandos.
Nessa questão, estamos executando um loop Para, visando preencher uma matriz 3x3. Dentro
desse loop, executamos outro Para que irá, de fato, preencher a lista. A interação de loops
aninhados é a seguinte:
Então, como já sabemos quais valores começamos a execução do bloco mais interno do código,
vamos começar.
Laço 1 - i = 1; j = 1
• M1, 1 = i + j + 1;
• M1, 1 = 1 + 1 + 1 = 3
Laço 2 - i = 1; j = 2
• M1, 2 = i + 2*j + 1
• M1, 2 = 1 + 2*2 + 1 = 6
Laço 3 - i = 1; j = 3
• M1, 3 = i + 2*j + 1
• M1, 3 = 1 + 2*3 + 1 = 8
Com isso encerramos o primeiro laço do loop externo, com i = 1. Repetiremos esse processo pra
i = 2, e i = 3. Os resultados de cada iteração serão:
• Laço 3: M2, 1 = 5
• Laço 4: M2, 2 = 5
• Laço 5: M2, 3 = 9
• Laço 6: M3, 1 = 6
• Laço 7: M3, 2 = 8
• Laço 8: M3, 3 = 7
ÍNDICE 1 2 3
1 3 6 8
2 5 5 9
3 6 8 7
Bom, agora que temos a matriz, temos mais um loop para ser executado - e mais um loop Para,
que vai de 1 até 3, ou seja, 3 iterações. Nele, fazemos duas operações:
Laço 1 - i = 1:
• X = M1, 1
• X=3
• Y = M[1, 1]
• Y=3
Laço 2 - i = 2:
• X = X + M 2, 2
• X=3+5
• X=8
• Y = Y + M 1, 2
• Y=3+6
• Y=9
Laço 3 - i = 3:
• X = X + M 3, 3
• X=8+7
• X = 15
• Y = Y + M 1, 3
• Y=9+8
• Y = 17
Então, terminamos com X = 15 e Y = 17. Por fim, finalmente (ufa), fazemos a soma dos valores
para encontrar a resposta:
X + Y = 15 + 17 = 32
Gabarito: Letra D
11. (COCP IFMT/IFMT/2023) Segundo Manzano & Oliveira (2016), um laço incondicional, entre
outras coisas, é um tipo de laço que é iterativo, porém não é interativo e tem seu funcionamento
controlado por uma variável denominada contador. Com essa descrição, o autor se refere ao laço
do tipo:
Fonte: (MANZANO, José Augusto & OLIVEIRA, Jayr Figueiredo de. Algoritmos: Lógica para desenvolvimento de programação de
computadores. 18 ed. São Paulo: Erica, 2016).
a) para/fim_para
b) repita/até_que
c) enquanto/fim_enquanto
d) laço/fim_laço
e) execute/enquanto_for
Comentários:
As características que ajudam a identificar qual estrutura de repetição está sendo utilizado é:
Isso nos denota o uso da estrutura repetitiva Para, que utiliza um contador para verificar quantas
iterações serão feitas. Porém, como ele não analisa o resultado da iteração, somente o contador,
ele não é um loop interativo.
Gabarito: Letra A
Comentários:
Perfeito. Quando usamos uma estrutura condicional, por exemplo o Se...então..senão, estamos
fazendo uma verificação lógica - isso é, se o valor da sintaxe passada como parâmetro for
verdadeiro, executaremos o bloco Se, se for falso, executaremos o Senão.
Gabarito: Correto
13. (FUNDATEC/CIGA SC/2023) Na linguagem Java, existe uma estrutura de controle de fluxo de
execução que permite executar um bloco de código pelo menos uma vez e depois repeti-lo
enquanto uma condição é verdadeira. Que estrutura é essa?
a) do-while
b) while
c) for
d) if-else
e) repeat-until
Comentários:
A estrutura que é executada ao menos uma vez, independentemente de ter sua condição de
implementação verificada (se é verdadeira ou falsa), é o Faça...enquanto - ou Do...while.
Fluxo do
Código
Bloco de código
Verdadeiro
Falso
Enquanto
Um adendo: a explicação também poderia ser respondida com o Repita...até, mas o Java não
aceita nenhum comando desse gênero.
Gabarito: Letra D
Início
Inteiro: a, b, c, i, M;
a ← 0;
b ← 2;
c ← 4;
M ← 10;
Para i de 1 até 5 faça
[
Se (a < b)
Então
[
a ← a + 1;
c ← a + b;
]]
M ← M + a + b - c;
Imprima M;
Fim.
Se (a < b)
a) 1
b) 2
c) 3
d) 4
e) 5
Comentários:
Temos um loop Para executado 5 vezes (de i = 1 até i = 5). A cada iteração, se a < b, faremos uma
operação incremental em a, e atualizaremos o valor de c com o valor de a + b. Como para nossa
análise só importa o valor de a e b, vamos ignorar as interações com a variável c. Vamos ver os
laços:
Laço 1 - i = 1; a = 0, b = 2
• a=a+1
• a=0+1=1
Laço 2 - i = 2; a = 1; b = 2
• a=a+1
• a=1+1=2
A partir do laço 3, teremos a = b (2), então não teremos mais o valor Verdadeiro para a condicional
Se (a < b). Assim, podemos afirmar que o número de vezes que a condição é considerada
verdadeira é igual a 2.
Gabarito: Letra B
a) repita...até_que
b) faça...enquanto
c) caso...seja...faça...senão...fim_caso
d) enquanto...faça...fim_enquanto
e) para...de...até...faça...fim_para
Comentários:
A estrutura de repetição que sempre executará um bloco de código antes de verificar a condição,
fazendo essa verificação após a execução, é o Repita...Até. Cuidado - o Faça...enquanto tem
uma estrutura muito similar, também irá executar o bloco ao menos uma vez, mas faz a verificação
antes da executá-lo.
Gabarito: Letra A
a) Loop.
b) Classe.
c) Variável.
d) Constante.
Comentários:
Ferramentas de controle de fluxo são aquelas que interrompem o fluxo “normal” de leitura do
código, o fluxo contínuo e sequencial. Uma das formas de controlarmos o fluxo é através das
estruturas de repetição, ou loops. Com eles, um determinado bloco de código é executado n
vezes, enquanto a condição for verdadeira ou conforme um contador.
Gabarito: Letra A
17. (CONSUPLAN/IF PA/2023) Qual das seguintes instruções de pseudocódigo seria utilizada para
fazer o programa repetir um conjunto de ações até que uma determinada condição seja satisfeita?
a) SE...ENTÃO
b) PARA...ATÉ
c) CASO...SEJA
d) ENQUANTO...FAÇA
Comentários:
Uma estrutura, para repetir inúmeras vezes, deve se encaixar no conceito das estruturas de
repetição. Dentre as alternativas, temos duas delas - o PARA...ATÉ, e o ENQUANTO...FAÇA. A
estrutura que faz uma sequência de repetições até que determinada condição seja implementada
é o ENQUANTO...FAÇA. O PARA...ATÉ usará um contador para ter uma quantidade definida de
repetições.
Gabarito: Letra D
a) Apenas I e II.
b) Apenas I e III.
c) Apenas II e IV.
d) Apenas II, III e IV.
e) I, II, III e IV.
Comentários:
I. Certo. O algoritmo é uma sequência de regras que visa executar determinado programa.
II. Certo. A ordem corresponde ao fluxo de execução do código - usualmente sequencial.
III. Certo. Os algoritmos possuem regras para definir sua correta interpretação.
IV. Certo. Mesmo em pseudocódigo, temos algumas regras e padronizações que devem ser feitas
e mantidas, imagine escrever cada função, cada loop de um jeito diferente num mesmo código,
isso geraria uma confusão total.
Gabarito: Letra E
19. (FUNCER/Pref. São Tomé/2023) Dentro da lógica de programação é uma estrutura que
permite executar mais de uma vez o mesmo comando ou conjunto de comandos, de acordo com
uma condição ou com um contador. A estrutura de repetição básica abaixo está se referindo:
a) do while.
b) for.
c) while.
d) if.
Comentários:
A estrutura apresentada inicia, em A, com uma verificação se determinado item possui o valor
TRUE (verdadeiro) ou FALSE (falso). Se o valor for TRUE, executamos o bloco B e, em seguida,
verificamos novamente se seu valor é verdadeiro ou falso. Se o valor for FALSE, seguimos na
execução normal do código. Essa estrutura é chamada de WHILE, ou Enquanto.
Gabarito: Letra C
20. (CETAP/SEMAS PA/2023) Em que situação a recursividade é apropriada como solução para
um problema de programação?
Comentários:
Gabarito: Letra A
21. (CEBRASPE/EMPREL/2023)
calc = 5 % 2
imprime(calc)
a) 1
b) 2
c) 10
d) 20
e) 25
Comentários:
A sintaxe 5%2 indica que estamos fazendo um módulo de 5 por 2, e seu retorno será o resto da
divisão.
5 2
-4 2
1 Resto
Portanto, o valor impresso será equivalente ao resto da divisão de 5 por 2, que é igual a 1.
Gabarito: Letra A
estrutura S
[Link]=0
estrutura-vazia(S){
se ([Link]=0)
retorna Verdadeiro;
fim se
}
EMPURRA (S,x){
[Link] = [Link]+1;
S[[Link]] = x;
PUXA (S)
se (Stack-Empty(S))
escreva_erro(“Underflow”);
senao
[Link] = [Link]-1;
retorna S[[Link]+1];
fim se
Considerando a estrutura S precedente, inicialmente vazia e armazenada no arranjo S[1 ... 6],
julgue o próximo item, a respeito de construção de algoritmos e estrutura de dados.
O resultado final das operações na sequência EMPURRA(S, 4), EMPURRA (S, 1), EMPURRA (S, 3),
PUXA(S), EMPURRA (S, 8) e PUXA (S) é S[4,1,3,8].
Comentários:
A questão traz algumas estruturas condicionais visando preencher uma pilha de dados. Temos a
chamada da função EMPURRA e PUXA com os seguintes parâmetros:
• EMPURRA(S, 4)
• EMPURRA(S, 1)
• EMPURRA(S, 3)
• PUXA(S)
• EMPURRA(S, 8)
• PUXA(S)
Basicamente, cada uma dessas funções EMPURRA irá alocar o número passado no parâmetro x no
topo da pilha, enquanto as funções PUXA irão retirar o elemento do topo. Então, alocaremos,
inicialmente, os números 4, 1 e 3 na pilha:
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 100
[Link] 178
19
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Portanto, é incorreto afirmar que ficamos com S[4, 1, 3, 8] - ficaremos com S[4, 1].
Gabarito: Errado
Comentários:
Perfeito! As funções trazem blocos de código, pequenos programas, que podem ser reutilizados
em diversos pontos do código. Além disso, para ser caracterizada como uma função, a operação
deve produzir alguma saída (retorno).
Gabarito: Correto
Comentários:
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 101
[Link] 178
20
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
O SE ENTÃO SENÃO é uma estrutura condicional, de seleção, e não um loop. Os loops englobam
o PARA, ENQUANTO, FAÇA ENQUANTO, REPITA ATÉ, e outros. Portanto, incorreta a afirmativa.
Gabarito: Errado
Algoritmo é uma lista de instruções que conduzem ações especificadas, passo a passo, em rotinas
embasadas em hardware ou software.
Comentários:
Um algoritmo é, exatamente, uma lista de instruções que passará determinado valor de entrada
por diversas ações e passos, que podem envolver rotinas embasadas em hardware (linguagens de
baixo nível) ou em software (linguagens de alto nível). Então, correta a definição.
Gabarito: Correto
constante A = 50
enquanto (A > 0)
A -= 5;
fim enquanto
escreva (A);
Comentários:
Essa questão tem algumas camadas de conhecimento sendo exploradas. Para começar, podemos
afirmar errado pois a variável A é do tipo constante, ou seja, não poderá ser alterada. Porém,
vamos ignorar esse fato por enquanto e vamos analisar a estrutura do Enquanto.
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 102
[Link] 178
21
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Temos uma condição A > 0, ou seja, enquanto A for maior que 0, iremos executar um bloco de
código. O bloco de código é a operação A -= 5, que é uma operação de atribuição: cada vez que
ela for chamada, retiraremos 5 unidades do valor de A. Portanto, iríamos reduzir o valor de 5 em
5 - teríamos 50, 45, 40... 0.
Veja que, apesar da condição ser A > 0, quando tivermos o valor de A = 5, a condição ainda será
verdadeira e executaremos a operação A -= 5, resultando em A = 0. Nesse momento, como A
possui o valor 0, a condição não será mais estabelecida e não executaremos mais o código - mas
o valor do A que seria impresso realmente seria 0. Note a importância da ordem de leitura do
código.
Porém, novamente, como estamos tratando de uma constante, não podemos alterar seu valor de
forma externa - então o valor da operação escreva (A) (que é similar ao imprimir(A), que estamos
fazendo até agora) será 50.
Gabarito: Errado
x = 10;
para (y = 40; y < 100; y = y + 16)
x = x + 10;
fim para
Comentários:
O Para inicia com a variável em 40, com o limite superior menor que 100, e incrementa o valor em
16 unidades a cada laço. Então, teremos execuções para y igual a 40, 56, 72 e 84. A próxima
iteração seria com y = 100, que passa a não obedecer mais à condição de verificação (y < 100).
Portanto, de fato, executamos o comando 4 vezes.
Gabarito: Correto
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 103
[Link] 178
22
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
sp = (a + b + c)/2;
ar = sp*(sp - a)*(sp - b)*(sp - c);
se (ar < 0)
escreva (“Não é possível obter resultado.”);
senão
escreva (“Resultado: “);
escreva(raiz_quadrada(ar));
fimse
Comentários:
Como temos um valor de ar menor que 0 (ar < 0), executaremos o bloco Se, tendo como retorno
o texto “Não é possível obter resultado”, e não o valor 10.3923.
Gabarito: Errado
função f(x)
se (x == 0 ou x == 1)
retorna 1;
fimse
retorna f(x - 1)*x
fimfunção
função func(a)
se (a == 0)
retorna 2
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 104
[Link] 178
23
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
fimse
retorna a + f(a - 1)
fimfunção
escreva(func(6));
Comentários:
Temos duas funções - uma função recursiva f(x) e outra função de ordem superior func(a). Estamos
chamando primeiramente a função de ordem superior, com func(6). Então, vamos ver o que
acontece.
Como o parâmetro a = 6, vamos cair no bloco alternativo - vamos retornar a + f(a - 1), ou seja, a +
(f5). Sendo assim, precisamos subir para a função f(x) e resolvê-la com x = 5. E nela, novamente,
como não atendemos a condição do Se, vamos executar o retorno - f(x-1) * x
Por fim, no laço 5 teremos f(1), e, como x == 1, caímos no bloco base - retornando 1. Como
chegamos a um valor, podemos subir somando.
Laço 5 - f(1) = 1
Laço 4 - f(2) = f(1) *2=1*2=2
Laço 3 - f(3) = f(2) *3=2*3=6
Laço 2 - f(4) = f(3) * 4 = 6 * 4 = 24
Laço 1 - f(5) = f(4) * 5 = 24 * 5 = 120
Então, encontramos que f(5) é igual a 120. Então é essa a resposta... só que não! Agora temos que
voltar para a função que foi chamada inicialmente, a func, nós paramos a execução do bloco com
a + f(5). Portanto, teremos a + 120 = 120 + 6 = 126.
De toda a forma, a resposta não será 720 - portanto, a afirmativa está incorreta.
Gabarito: Errado
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 105
[Link] 178
24
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Comentários:
Muito pelo contrário - essa é uma desvantagem da recursividade, já que ela tem um alto consumo
de memória. Iremos executar várias iterações dentro de uma só função, o que irá necessitar uma
alocação maior de memória.
Gabarito: Errado
31. (CEBRASPE/Pref. Fortaleza/2023) Julgue o item que se segue, relativo a conceitos de avaliação
de expressões.
Após o algoritmo a seguir ser executado, o valor da variável soma1 será maior que o da variável
soma2.
vetor a[7];
real soma1, soma2;
inteiro i;
a = [1,3,9,27,81,243,729];}
soma1 = 0;
i = 0;
soma2 = 1 * (1-3^7)/(1-3)
escreva(soma1)
escreva(soma2)
Comentários:
A questão traz algumas variáveis, dentre elas um vetor a com 7 elementos. Vamos achar o valor
de soma1 e soma2, para verificarmos o apontamento da afirmativa. Vamos começar com o soma1.
O loop Enquanto irá somando o valor atual de soma1 com a respectiva posição no vetor. Então,
como i = 0, e o aumento a cada laço é incremental, faremos 7 loops (de i = 0 até i = 6). Vamos ver
o primeiro laço:
Laço 1 - i = 0:
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 106
[Link] 178
25
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Laço 2 - i = 1:
soma1 = soma1 + a[1]
soma1 = 1 + 3 = 4
Laço 3 - i = 2:
soma1 = soma1 + a[2]
soma1 = 4 + 9 = 13
Laço 4 - i = 3:
soma1 = soma1 + a[3]
soma1 = 13 + 27 = 40
Laço 5 - i = 4:
soma1= soma1 + a[4]
soma1 = 40 + 81 = 121
Laço 6 - i = 5
soma1 = soma1 + a[5]
soma1 = 121 + 243 = 364
Laço 7 - i = 6
soma1 = soma1 + a[6]
soma1 = 364 + 769 = 1039
Portanto, o valor final da variável soma1 é 1.039. Na hora da prova, se você tiver entendido a
lógica - que estamos somando todos os valores do vetor - a resolução se torna muito mais rápido.
Só iríamos somar os valores de a, e encontraríamos o mesmo valor.
Então, o valor de soma2 (1.093) é maior que o valor de soma1 (1.039). Sendo assim, afirmativa
incorreta.
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 107
[Link] 178
26
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Gabarito: Errado
Início
Inteiro: x, y, z, i;
x ← 3;
y ← 3;
z ← 3;
Para i de 1 até 6 faça
[ Se (z = 3)
Então
[
x ← x+1;
y ← y+2;
z ← z-1;
]
Senão
[
z ← z+1;
]]
z ← x + y + z;
Fim.
a) 15
b) 16
c) 17
d) 18
e) 19
Comentários:
Não deixe o tamanho da sintaxe te assustar. Encare com calma, linha por linha, para entender o
que está acontecendo. Iniciamos o código declarando 3 variáveis do tipo inteiro, x, y e z - todas
com o valor igual a 3. Em seguida, iniciamos um loop Para numa notação um pouco diferente do
que vimos, mas basicamente estamos iniciando em 1, indo até 6 com incrementos de uma unidade
- ou seja, seria como Para (i = 1, i <= 6; i++) - ou seja, 6 laços.
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 108
[Link] 178
27
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
x=6
y=9
z=3
Por fim, temos uma nova atribuição de valor à variável z antes de finalizar o programa:
z=x+y+z
z = 6 + 9 + 3 = 18
Gabarito: Letra D
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 109
[Link] 178
28
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Comentários:
Gabarito: Letra B
34. (FGV/TCE SP/2023) A série de Fibonacci é definida da seguinte forma: o primeiro e o segundo
termos valem 1, e os demais são obtidos pela soma de seus dois antecessores. Em termos gráficos,
ela define uma espiral, sendo utilizada em diversas áreas, que vão da biologia até o mercado
financeiro. Um algoritmo para cálculo do termo de ordem n da série é apresentado a seguir.
algoritmo Fibonacci
var x, a, b, i, f: inteiro
início
leia(x);
a <- 1
b <- 1
f <- 1
i <- 2
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 110
[Link] 178
29
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
fim algoritmo
Executando o algoritmo, se for informado o valor 7 para x, será impressa a mensagem “Fibonacci
para o termo: “: ‘
a) 7
b) 21
c) 28
d) 64
e) 128
Comentários:
Estamos executando a função leia(x) com x = 7. Com isso, executaremos o loop Enquanto com a
condição i ≤ 7. Vamos fazer os laços.
LAÇO 1 - i = 2
• f = a + b; f = 1 + 1; f = 2
• a = b; a = 1
• b = f; b = 2
• i = i + 1; i = 2 + 1; i = 3
Um ponto de atenção - quando fazemos b = f, usamos o valor “atualizado” de f, já que ele foi
modificado dentro do laço, antes de chamarmos a operação.
LAÇO 2 - i = 3
• f = a + b; f = 1 + 2; f = 3
• a = b; a = 2
• b = f; b = 3
• i = i + 1; i = 4
LAÇO 3 - i = 4
• f = a + b; f = 2 + 3; f = 5
• a = b; a = 3
• b = f; b = 5
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 111
[Link] 178
30
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
• i = i + 1; i = 5
LAÇO 4 - i = 5
• f = a + b; f = 3 + 5; f = 8
• a = b; a = 5
• b = f; b = 8
• i = i + 1; i = 6
LAÇO 6 - i = 6
• f = a + b; f = 5 + 8; f = 13
• a = b; a = 8
• b = f; b = 13
• i = i + 1; i = 7
LAÇO 7 - i = 7
• f = a + b; f = 8 + 13; f = 21
Como estamos no último laço, os demais valores não nos importam. A saída, que envolve o valor
de f, será, portanto, 21.
Gabarito: Letra B
35. (FGV/TCE SP/2023) Marta está definindo um algoritmo para descrever um menu de funções
do sistema, apresentando as opções baseadas em números, seguido da leitura da opção, com a
saída ocorrendo após a digitação do número zero.
Para gerenciar o fluxo de execução, que envolve a exibição do menu e leitura da opção, repetindo-
se até que seja digitada a opção zero, Marta deve utilizar a estrutura de controle:
a) enquanto - faça;
b) se - então;
c) repita - até;
d) para - faça;
e) se - então - senão.
Comentários:
O fluxo de execução de um código é a ordem com que o interpretador lê esse código e executa
operações. Estamos seguindo um fluxo de execução de bloco de código → verificação de
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 112
[Link] 178
31
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
condição, até que determinada condição seja verificada como verdadeira. Essa estrutura se
caracteriza como uma repetição do tipo Repita...Até.
Gabarito: Letra C
Início
Inteiro: i, j, k, a;
...
Para i de 3 até 6 faça
Para j de 4 até 7 faça
Para k de 2 até 8 faça
[
a ← a + 1;
]
...
Fim.
É correto afirmar que, a variável a, após a execução de desse trecho de programa, terá sido
incrementada
a) 8 vezes.
b) 54 vezes.
c) 336 vezes.
d) 112 vezes.
e) 6 vezes.
Comentários:
Ótima questão para entendermos o funcionamento de loops aninhados. Para cada iteração do
loop mais externo, serão executadas todas as iterações do loop interno, e do seu loop interno
também. Então, basicamente, teremos:
• Iteração geral 1 - i = 3
o Iteração bloco aninhado 1 - j = 4
▪ Iterações internas, de k = 2 a k = 8 (ou seja, 7 iterações).
o Iteração bloco aninhado 2 - j = 5
▪ Iterações internas, de k = 2 a k = 8 (ou seja, 7 iterações).
o Iteração bloco aninhado 3 - j = 6
▪ Iterações internas, de k = 2 a k = 8 (ou seja, 7 iterações).
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 113
[Link] 178
32
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Veja que, para uma iteração do bloco externo, executamos 28 iterações internas. Como vamos de
3 a 6, isso é, temos 4 execuções, executaremos 4 x 28 = 112 iterações.
Uma forma mais direta de achar esse valor é multiplicar as vezes que cada bloco Para irá ocorrer -
temos 7 no bloco interno, 4 no bloco intermediário e 4 no bloco externo. Então, 7 * 4 * 4 = 112.
Gabarito: Letra D
ALGORITMO
DECLARE n1, n2 NUMÉRICO
n1 ⟵ 6
n2 ⟵ aplica_processamento(n1)
ESCREVA (“O processamento aplicado em “, n1, “ resulta em “ n2)
FIM_ALGORITMO
a) 180
b) 90
c) 120
d) 720
Comentários:
O primeiro passo para entendermos a questão é entender qual valor está sendo passado para a
sub-rotina. Conseguimos identificar nesse trecho:
n1 ⟵ 6
n2 ⟵ aplica_processamento(n1)
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 114
[Link] 178
33
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
• Laço 1 = 6 * aplica_processamento(5)
• Laço 2 = 5 * aplica_processamento(4)
• Laço 3 = 4 * aplica_processamento(3)
• Laço 4 = 3 * aplica_processamento(2)
• Laço 5 = 2 * aplica_processamento(1)
• Laço 6 → aplica_processamento(1) = 1
• Laço 6 = 1
• Laço 5 = 2 * 1 = 2
• Laço 4 = 3 * 2 = 6
• Laço 3 = 4 * 6 = 24
• Laço 2 = 5 * 24 = 120
• Laço 1 = 6 * 120 = 720
Gabarito: Letra D
inteiro op=8
op = 5
op = 4
Comentários:
Temos uma declaração inicial da variável op, que é do tipo inteiro, e depois temos novas
declarações. Essas novas declarações substituem o valor original - portanto, de fato, o valor final
da variável será 4, equivalente à última atribuição de valor.
Gabarito: Correto
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 115
[Link] 178
34
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Uma função é dita recursiva quando, dentro dela, é feita uma ou mais chamada a ela mesma.
Comentários:
Veja que essa é uma cobrança recorrente - tanto do ponto de vista teórico, que corresponde a
quebra do programa em subprogramas, quanto do ponto de vista prático, que corresponde a uma
função chamando a si uma ou mais vezes. Portanto, correta a afirmativa.
Gabarito: Correto
Comentários:
Gabarito: Letra A
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 116
[Link] 178
35
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Início
Inteiro: x, y, z, j;
Leia x, y;
z ← 19;
Para j de 1 até 3 faça
[
Se z > (x+y)
Então
z ← z - 3;
Senão
z ← z + 5;
]
z ← z + z;
Imprima z;
Fim.
a) 42
b) 36
c) 32
d) 48
e) 40
Comentários:
Vamos executar o código com x = 8 e y = 9. Como x + y = 17 é menor que 19, caímos no bloco
Se. Então, nosso primeiro laço será da seguinte forma:
LAÇO 1 - j = 1
• z=z-3
• z = 19 - 3
• z = 16
LAÇO 2 - j = 2
• z=z+5
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 117
[Link] 178
36
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
• z = 16 + 5
• z = 21
LAÇO 3 - j = 3
• z=z-3
• z = 21 - 3
• z = 18
Chegamos ao valor de z, que é 18. Por fim, temos uma nova atribuição ao valor de z:
• z=z+z
• z = 18 + 18
• z = 36
Gabarito: Letra B
42. (IFTO/IFTO/2022) Qual das definições abaixo melhor descreve o que é um algoritmo?
Comentários:
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 118
[Link] 178
37
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Gabarito: Letra E
a) 00101011
b) 10010110
c) 00110101
d) 11101001
Comentários:
Precisamos converter os números binários para a base decimal, de forma que seja possível fazer a
soma. Temos:
• 10001010 = 21 + 23 + 27 = 138
• 01011111 = 20 + 21 + 22 + 23 + 24 + 26 = 95
Gabarito: Letra D
Para que a função fat funcione corretamente, o trecho “. . . “ deve ser substituído por
a) return fat(n + 1)
b) return fat(n)
c) return fat(n-1)
d) return n * fat(n)
e) return n * fat(n-1)
Comentários:
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 119
[Link] 178
38
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
A questão traz um programa com um bloco de código faltante. O objetivo é que seja calculado o
fatorial do algoritmo de forma recursiva - isso nos indica que devemos chamar a própria função
fat dentro do código.
Como não queremos uma recursão infinita, devemos ajeitar o parâmetro da função chamada para
que ela chegue a obedecer a condição do bloco base (no else) - que será cumprida quando o valor
de n ≤ 1. Portanto, a cada iteração devemos fazer fat(n-1). Assim, se n for igual a 4, por exemplo,
iremos reduzi-lo uma unidade a cada laço, até chegarmos a n = 1.
Além disso, o fatorial é composto pela multiplicação de um número pelos seus predecessores -
então, por exemplo, o fatorial de 3 (3!) será igual a 3 x 2 x 1. Sendo assim, precisamos passar o
parâmetro atual para o cálculo - ficando, portanto, com n * fat(n-1) na recursão.
• LAÇO 1 - 3 * fat(2)
• LAÇO 2 - 2 * fat(1)
• LAÇO 3 - fat(1) = 1
• LAÇO 2 - 2*1 = 2
• LAÇO 1 - 3*2 = 6
Gabarito: Letra E
Durante a execução de um programa, uma variável pode armazenar vários valores a cada instante,
ou seja, ela pode armazenar até dez registros ao mesmo tempo.
Comentários:
“A cada instante” é uma constatação um pouco forte - mas, de fato, podemos frequentemente
mudar o valor de uma variável, afinal, ela é variável. É o que acontece numa recursão, por exemplo.
Porém, a variável irá armazenar apenas o valor atual, não múltiplos valores ao mesmo tempo - a
não ser que seja uma variável de estrutura de dados. Mesmo assim, não teremos os limites de dez
registros ao mesmo tempo. Portanto, podemos concluir que a afirmativa está incorreta.
Gabarito: Erado
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 120
[Link] 178
39
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
( ) IF
( ) FOR
( ) WHILE
a) 2-1-3
b) 1-2-3
c) 3-2-1
d) 3-1-2
Comentários:
Portanto, temos 3 - 1 - 2.
Gabarito: Letra D
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 121
[Link] 178
40
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
6. fimse
7. fimpara
Comentários:
Na linha 5, temos o valor de i sendo atribuído à variável p. O i é a posição do vetor que estamos
navegando - portanto, podemos afirmar que i recebe a posição no vetor vet do respectivo valor
de i.
Gabarito: Letra B
Comentários:
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 122
[Link] 178
41
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Gabarito: Letra D
Os laços usados em estruturas de repetição e teste podem ser feitos por meio de comandos como
enquanto e repita.
Comentários:
Perfeito! Os laços são as repetições, feitas na estrutura de repetição. Comandos como Enquanto,
Repita...até, Faça...até e Para são formas de implementarmos essas estruturas.
==78fc4==
Gabarito: Correto
As estruturas se e senão são estruturas de repetição utilizadas nas situações em que, caso
determinada condição seja alcançada, um comando é realizado, caso contrário, outro comando é
executado
Comentários:
Gabarito: Errado
switch (expressão) {
case expressão_constante1:sentença1;
...
case constanten: sentença_n;
[default: sentençan + 1]
}
a) Controle múltiplo
b) Repetição múltipla
c) Desvio múltiplo
d) Seleção múltipla
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 123
[Link] 178
42
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Comentários:
Gabarito: Letra D
52. (IBFC/DPE MT/2022) Assinale a alternativas que esteja tecnicamente correta quanto ao
pseudocódigo, em inglês, que representa uma estrutura de repetição.
a) Switch
b) Return
c) While
d) Function
Comentários:
Das estruturas apresentadas, a única que apresenta uma estrutura de repetição é o WHILE. A
estrutura SWITCH é uma estrutura de seleção múltipla, RETURN é um comando para atribuir
retorno a uma função, e FUNCTION é função, em inglês.
Gabarito: Letra C
53. (QUADRIX/SEE DF/2022) Acerca dos aspectos das linguagens de programação e das
estruturas de dados e da programação orientada a objetos (POO), julgue o item a seguir.
Comentários:
Cuidado! O “e” lógico, em programação, tem valor de conjunção, isso é, só será verdadeiro se
todos os seus elementos também forem. Já o “não”, de fato, é uma negação lógica.
Gabarito: Errado
54. (FCM/IF AM/2022) Sobre listas, pilhas e filas, associe corretamente as colunas
ESTRUTURAS DE DADOS
1 - Listas Lineares
2 - Pilha
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 124
[Link] 178
43
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
3 - Fila
DESCRIÇÕES
( ) São utilizadas quando se deseja processar itens de acordo com a ordem “primeiro-que-chega,
primeiro- atendido”.
( ) Também são chamadas listas LIFO.
( ) Existe uma ordem linear, que é a “ordem de chegada”.
( ) Adequadas quando não é possível prever a demanda por memória, permitindo a manipulação
de quantidades imprevisíveis de dados, de formato também imprevisível.
( ) Os itens são colocados um sobre o outro. O item inserido mais recentemente está no topo e o
inserido menos recentemente no fundo.
a) 2, 3, 1, 2, 3.
b) 3, 2, 2, 1, 2.
c) 2, 2, 3, 1, 2.
d) 3, 2, 2, 1, 3.
e) 3, 2, 3, 1, 2.
Comentários:
( ) São utilizadas quando se deseja processar itens de acordo com a ordem “primeiro-que-chega,
primeiro- atendido”.
A descrição se refere ao modelo FIFO, usado nas filas. (3)
( ) Adequadas quando não é possível prever a demanda por memória, permitindo a manipulação
de quantidades imprevisíveis de dados, de formato também imprevisível.
A questão descreve as listas - inclusive, essa é uma das principais características que diferem as
listas dos vetores.
( ) Os itens são colocados um sobre o outro. O item inserido mais recentemente está no topo e o
inserido menos recentemente no fundo.
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 125
[Link] 178
44
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Gabarito: Letra E
a) if
b) else if / elif
c) else
d) while
e) for
Comentários:
Quando estamos rodando uma condicional, temos o bloco do SE..ENTÃO, que irá analisar uma
condição e executar determinar bloco de código se essa condição for verdadeira. Em seguida,
podemos ter o bloco SENÃO (else), que, em casos de seleção binária, nunca irá fazer uma
avaliação do valor da condição - somente será executada como um “caso residual”.
Gabarito: Letra C
a) if
b) for
c) while
d) switch
e) do - while
Comentários:
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 126
[Link] 178
45
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
O loop escolhido quando se sabe a quantidade de repetições que teremos é o loop Para - o FOR.
Nele, teremos um contador, onde definiremos o valor inicial, final e a forma de incremento (ou
decremento), com isso conseguimos definir a quantidade de repetições que teremos.
Gabarito: Letra B
Início
Inteiro: a1, a2, a3, i;
Leia a1;
a2 ← 1;
a3 ← 5;
Para i de 1 até 4 faça
[
Se (a1+a2) < a3
Então
a2 ← a2 + 1;
Senão
a3 ← a3 + 2;
]
a1 ← a2 + a3;
Imprima a1;
Fim.
Assumindo que o valor lido para a variável a1 tenha sido 3, então o resultado impresso ao final do
procedimento para a variável a1 é igual a:
a) 3
b) 7
c) 9
d) 11
e) 14
Comentários:
Temos um loop para de 4 repetições (de i = 1, até i = 4). Nele, verificaremos um condição - vamos
ver o que acontece se rodarmos esse programa com a1 = 3.
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 127
[Link] 178
46
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
LAÇO 1 - i = 1:
• a1 + a2 = 3 + 1 = 4
• a3 = 5
• a2 = a2 + 1
• a2 = 1 + 1
• a2 = 2
LAÇO 2 - i = 2
• a1 + a2 = 3 + 2 = 5
• a3 = 5
Agora, passamos a executar o bloco Senão, já que a soma é igual ou maior que a3. Então, teremos:
• a3 = a3 + 2
• a3 = 5 + 2
• a3 = 7
LAÇO 3 - i = 3
• a1 + a2 = 5
• a3 = 7
• a2 = a2 + 1
• a2 = 2 + 1
• a2 = 3
LAÇO 4 - i = 4
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 128
[Link] 178
47
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
• a1 + a2 = 3 + 3 = 6
• a3 = 7
Continuamos no bloco Senão, já que a soma de (a1 + a2) não superou ou igual a3. Portanto:
• a2 = a2 + 1
• a2 = 3 + 1
• a2 = 4
Por fim, iremos imprimir a soma de a2 e a3 com seus valores finais - 4 e 7. A saída será 4 + 7 = 11.
Gabarito: Letra D
58. (VUNESP/PC RR/2022) Considere o trecho de um procedimento a seguir, expresso na forma
de uma pseudolinguagem (português estruturado).
Inteiro: a, i, j, k, m;
...
a ← 0;
...
Para i de 1 até 3 faça
[
Para j de 1 até 3 faça
[
Para k de 1 até 3 faça
[
Para m de 1 até 3 faça
[
a ← a + 2;
]
]
]
]
Ao final da execução desse trecho de código, o valor presente na variável a será igual a:
a) 12
b) 27
c) 54
d) 81
e) 162
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 129
[Link] 178
48
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Comentários:
Vou lhe ensinar um jeito rápido de resolver essa questão. O total de laços executado será igual à
multiplicação de laços ocorridos em cada bloco Para. Em todos os blocos teremos 3 execuções -
portanto, 3 * 3 * 3 * 3 = 34 = 81. A cada execução do laço mais interno, teremos o incremento de
2 unidades ao valor da variável a - que parte de 0. Portanto, teremos 0, 2, 4, 6, 8... até
completarmos os 81 laços. A saída final será, portanto, 81 * 2 = 162.
Gabarito: Letra E
59. (SS CENTEC/CENTEC/2022) endo que A=3, B=7, C=4 e D=B, marque a alternativa CORRETA
de acordo com as afirmações abaixo.
I. (B + A) <= C
II. (A > C) AND (C <= D)
III. (A+B) > 10 OR (A+B) = (C+D)
IV. (A>=C) AND (D >= C)
Comentários:
I. (B + A) <= C
Falso. B + A = 10; C = 4. Portanto, temos 10 ≤ 4 - que é falso.
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 130
[Link] 178
49
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Falso. Temos (A >= C), ou (3 ≥ 4), que é FALSO, e ( D >= C), ou (7 ≥ 4), que é VERDADEIRO.
Porém, na disjunção (AND, ou E lógico), precisamos de ambos os lados verdadeiros para termos
um retorno verdadeiro - sendo assim, a afirmação é falsa.
Gabarito: Letra E
a) DO WHILE
b) WHILE
c) FOR
d) IF
e) CASE
Comentários:
A estrutura que analisa a quantidade de vezes que determinada estrutura de repetição irá ser
repetida antes da execução do código, baseado em um contador, é o PARA, ou FOR, em inglês.
Gabarito: Letra C
Os dados de um algoritmo devem ser definidos por tipos para que seus conteúdos possam ser
submetidos a operações corretas, inerentes a cada tipo de dado.
Comentários:
A definição do tipo de dado de uma variável é essencial, já que cria restrições a o que pode ou
não ser alocado nessa variável. Essa definição pode ser explícita ou implícita, a depender da
tipagem da linguagem. Nesse sentido, correta a afirmativa.
Gabarito: Correto
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 131
[Link] 178
50
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Comentários:
Muito cuidado! Operadores lógicos são os operadores E, OU e NÃO, responsáveis por fazer
comparações lógicas. Operadores matemáticos, como a soma e subtração, são responsáveis por
inserir aplicações matemáticas. A afirmativa define operadores matemáticas, e não lógicos, e, por
esse motivo, está incorreta.
Gabarito: Errado
Comentários:
Perfeito! Dentro da programação, temos dois locais para alocação de valores na memória - as
variáveis, que podem ter os valores alterados durante a execução dos códigos, e as constantes,
que devem ter seus valores inalterados. E, de fato, os tipos de dado repassados pela questão
estão corretos.
Gabarito: Errado
A passagem de um vetor por valor é mais eficiente que a passagem por parâmetro, considerando
aspectos de tempo de processamento e espaço em memória, estando ambas as situações sob as
mesmas condições de recursos.
Comentários:
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 132
[Link] 178
51
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Passar um vetor por valor implica em criar uma cópia do vetor original, o que pode ser muito
ineficiente em termos de tempo de processamento e espaço de memória, especialmente se o
vetor for grande. Isso ocorre porque cada elemento do vetor precisa ser copiado individualmente,
o que pode levar a um aumento significativo no uso da memória e no tempo de processamento.
Por outro lado, passar um vetor por referência (ou seja, como um parâmetro) é geralmente mais
eficiente, pois apenas a referência ao vetor original é passada. Isso significa que não é necessário
criar uma cópia do vetor, economizando assim tempo de processamento e espaço de memória.
Portanto, em geral, a passagem de um vetor por referência é preferível à passagem por valor,
especialmente quando se trabalha com vetores grandes. No entanto, é importante notar que
passar um vetor por referência significa que qualquer alteração feita ao vetor dentro da função
afetará o vetor original. Se isso não for desejado, então uma cópia do vetor deve ser feita de
qualquer maneira.
Gabarito: Errado
Comentários:
O escopo sintático em linguagens de programação engloba a área onde variáveis podem ser
referenciadas. Isso significa que o escopo sintático determina as partes do código onde uma
variável é acessível. As principais limitações de escopo são o escopo global e local.
Por exemplo, se uma variável é definida dentro de uma função, seu escopo é geralmente limitado
a essa função. Isso significa que a variável pode ser referenciada (ou seja, lida ou modificada)
apenas dentro dessa função. Se tentarmos referenciar a variável fora da função, o programa
provavelmente gerará um erro, pois a variável está fora do seu escopo sintático.
Gabarito: Letra A
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 133
[Link] 178
52
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
As funções executam um ou mais comandos e sempre retornam um resultado para quem fez uma
chamada à função.
Comentários:
Perfeito! As funções executam um ou mais blocos de código, com comandos, quase como
“subprogramas”. E, além disso, para ser caracterizado como uma função (e não um
procedimento), sua execução deve sempre retornar algum resultado.
Gabarito: Errado
Comentários:
Gabarito: Letra C
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 134
[Link] 178
53
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
68. (FUNCERN/CM Natal/2023) As variáveis de programação são fundamentais para o dia a dia
do programador. Elas orientam o programa a executar operações. Uma variável em um programa
é definida como
a) um valor fixo.
b) um local na memória para armazenar dados.
c) uma palavra-chave reservada.
d) um comando executável
Comandos:
Por definição, uma variável é um local na memória do programa onde armazenamos determinados
dados, valores, para que possam ser reutilizadas ao longo do programa.
Gabarito: Letra B
69. (VUNESP/EPC/S2023) Considere que, ao se chamar uma função: a) foram passados os valores
de variáveis para ela; b) o valor de cada variável na função chamadora é copiado nas variáveis
fictícias correspondentes da função chamada; c) as alterações feitas nas variáveis fictícias na função
chamada não têm efeito nos valores das variáveis reais na função chamadora.
a) cruzada.
b) exclusiva.
c) reversa.
d) por valor.
e) por referência.
Comentários:
Temos duas formas de atribuição - atribuições por valor, e por referência. Isso já nos permite
eliminar as três primeiras alternativas. Quando passamos um valor de uma variável por valor,
estamos fazendo uma cópia desse valor original, desassociando a referência com o destino. Dessa
forma, podemos alterar a variável de origem do valor sem termos impactos na nova variável. E é
exatamente essa abordagem a trazida pela questão.
Se tivéssemos uma variável por referência, teríamos apenas um ponteiro referenciando o dado
original, e qualquer alteração nesse dado original traria alterações para a variável que o referencia.
Gabarito: Letra D
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 135
[Link] 178
54
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Início
Inteiro: p, q, S, cont;
p ← 5;
q ← 3;
Para cont de 1 até 5 faça
[
Se (p+q) > 2*p
Então
p ← p-1;
Senão
q ← q+2;
]
S ← p + q;
Fim.
a) 8.
b) 9.
c) 10.
d) 11.
e) 12.
Comentários:
Questão padrão da Vunesp. Teremos um laço Para com 5 iterações - vamos resolvê-las.
LAÇO 1 - cont = 1:
LAÇO 2 - cont = 2:
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 136
[Link] 178
55
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
• q=q+2
• q=5+2
• q=7
LAÇO 3 - cont = 3:
LAÇO 4 - cont = 4:
LAÇO 5 - cont = 5:
• S=p+q
• S=2+7
• S=9
Gabarito: Letra B
71. (VUNESP/DPE SP/2023) Os parâmetros que são passados para uma função de um programa
são denominados parâmetros reais, enquanto que os parâmetros recebidos por uma função são
denominados parâmetros formais. Neste contexto, em uma chamada de função por valor, os
valores dos parâmetros reais
a) são copiados para os parâmetros formais da função, e as alterações nestes efetuadas dentro
da função refletem-se em alterações nos parâmetros reais.
b) são copiados para os parâmetros formais da função, e as alterações nestes efetuadas dentro
da função não implicam em alterações nos parâmetros reais.
c) não são copiados para os parâmetros formais da função, e as alterações efetuadas nestes
dentro da função, refletem-se em alterações nos parâmetros reais.
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 137
[Link] 178
56
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
d) não são copiados para os parâmetros formais da função, e as alterações efetuadas nestes
dentro da função, não implicam em alterações nos parâmetros reais.
e) não são copiados para os parâmetros formais da função, e esta não pode realizar alterações
em seus parâmetros formais.
Comentários:
Nas chamada de função por valor, os parâmetros são copiados para a função, e, graças a isso,
eventuais alterações não impactam os valores originais, ou parâmetros reais. Nesse sentido, a
alternativa que traz a explicação correta é a letra B.
Gabarito: Letra B
01 Programa {
02 funcao inicio() {
03 real resultado
04
05 resultado = 5.0 + 4.0 * 2.0
06 escreva(resultado)
07
08 resultado = (5.0 + 4.0) * 2.0
09 escreva(resultado)
10
11 resultado = 1.0 + 2.0 / 3.0 * 4.0
12 escreva(resultado)
13 }
14 }
a) Real e 18.0
b) Cadeia e 22.0
c) Real e 40.0
d) Inteiro e 20.0
e) Real e 22.0
Comentários:
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 138
[Link] 178
57
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Na linha 9, estamos escrevendo o resultado da função passada logo acima, na linha 8. Vamos
resolvê-la:
Então, o resultado será 18.0 e o número do tipo real - detalhe que, apesar do resultar ser um
número inteiro (18), a presença de uma casa decimal nos traz o tipo real.
Gabarito: Letra A
73. (IBFC/TRF 5/2024) Estruturas de dados são constantemente utilizadas em algoritmos para
resolução de problemas, desde os mais simples aos mais complexos, desta forma, estrutura de
dados utiliza o princípio “Último a entrar, primeiro a sair”(LIFO):
a) Fila
b) Lista Encadeada
c) Pilha
d) Árvore
Comentários:
A estrutura de dados que traz a abordagem LIFO, ou seja, que numa eventual remoção, o
elemento do topo, aquele adicionado mais recentemente, será retirado, é a pilha.
Gabarito: Letra C
74. (CEBRASPE/INPI/2024) Acerca de estrutura de dados e algoritmos, julgue o item a seguir.
Pilhas são tipos de estruturas de dados que permitem a remoção direta de qualquer elemento de
sua estrutura.
Comentários:
As pilhas são caracterizadas pela abordagem LIFO - ou seja, as remoções só podem ser feitas no
elemento que está no topo da pilha, elemento adicionado mais recentemente. Não é possível
retirar outros elementos. Portanto, a afirmativa está incorreta.
Gabarito: Errado
75. (CEBRASPE/SEPLAN RR/2023) Julgue o item a seguir acerca dos conceitos de estrutura de
dados.
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 139
[Link] 178
58
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Sempre que houver uma remoção na estrutura de dados denominada fila, o elemento removido
será aquele que está na estrutura há mais tempo.
Comentários:
Perfeito! Na estrutura em fila, o elemento retirado será aquele que está alocado na frente da fila,
que é composta justamente do elemento mais antigo que foi adicionado ao conjunto de dados -
assim como uma fila indiana. Portanto, correta a afirmativa.
Gabarito: Correto
76. (VUNESP/TCM SP/2023) Considere uma estrutura de dados do tipo pilha, inicialmente vazia,
que possui as operações típicas de inserção e remoção de elementos, denominadas PUSH e POP.
PUSH 1
PUSH 2
POP
PUSH 3
POP
PUSH 4
POP
PUSH 5
Após a realização de todas essas operações, o número de elementos na pilha e o valor armazenado
no topo da pilha serão, respectivamente,
a) 0 e 0.
b) 1 e 1.
c) 1 e 5.
d) 2 e 1.
e) 2 e 5.
Comentários:
Como estamos numa estrutura de PILHA, as operações PUSH, um “Empilhar”, em português, irão
alocar determinado número no topo da pilha. Já as operações de POP irão desempilhar o dado
do topo, isso, é, removê-lo do conjunto. Analisando as ações, temos:
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 140
[Link] 178
59
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
POP [1]
PUSH 4 [1, 4]
POP [1]
PUSH 5 [1, 5]
Portanto, a pilha será composta dos elementos [1, 5] - mas cuidado, essa não é a nossa resposta.
Queremos o número de elementos (2) e o valor armazenado no topo (5) - portanto, a resposta
será 2 e 5.
Gabarito: Letra E
77. (VUNESP/Pref. Marília/2023) Considere uma estrutura de dados com a propriedade de que,
sempre que houver a remoção de um elemento nela armazenado, o elemento a ser removido é
aquele que se encontra armazenado na estrutura há menos tempo.
a) fila.
b) pilha.
c) lista simples.
d) lista encadeada.
e) lista duplamente encadeada.
Comentários:
Quando, numa remoção, removemos o elemento mais recente do conjunto, estamos usando a
abordagem LIFO - característica das pilhas.
Gabarito: Letra B
78. (CESGRANRIO/BB/2023) A Figura a seguir exibe o conteúdo de três pilhas: P1, P2 e P3.
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 141
[Link] 178
60
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Admita que um método Java, chamado exibePilha, receba essas três pilhas como parâmetros e
execute os seguintes passos:
O que será exibido no console, quando o método exibePilha for executado, tendo P1, P2 e P3
sido passadas como parâmetros?
a) 10 15 25 28
b) 10 25 30 40
c) 15 10 28 25
d) 20 35 34 40
e) 40 34 30 60
Comentários:
Portanto, A1 ficará com os valores [10, 15, 25, 28, 30, 60, 40, 34]
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 142
[Link] 178
61
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Esvaziando a P3 para A1, teremos A1 = [10, 15, 25, 28, 30, 60, 40, 34, 35, 20]
Esse procedimento faz com que A2 seja o inverso de A1. Então teremos A2 = [20, 35, 34, 40, 60,
30, 28, 25, 15, 10]
Vamos remover os 4 elementos do topo da pilha (numa representação horizontal, são os 4 últimos
elementos) - vou destacá-los em negrito. A2 = [20, 35, 34, 40, 60, 30, 28, 25, 15, 10]
Gabarito: Letra A
algoritmo Marcos
var
i, a: inteiro
v: vetor [1..5] de inteiro
início
a <- 0
escreva(a)
fim algoritmo
Considerando o vetor com índice inicial 1 e final 5, e utilizando os valores {2, 1, 2, 1, 2}, Marcos
obterá a impressão do valor:
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 143
[Link] 178
62
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
a) 3
b) 8
c) 9
d) 16
e) 19
Comentários:
Estamos rodando o vetor inicialmente com os valores {2, 1, 2, 1, 2}, com índice iniciando a
contagem em 1. O primeiro Para do código irá ler o elemento de cada posição da array, é apenas
uma forma do código saber o número que está sendo trabalhado. O foco aqui é no segundo Para:
LAÇO 1 - i = 1:
• a = a + v[1]
• a=0+4
• a=4
LAÇO 2 - i = 2
• a = a +v[2]
• a=4+2
• a=6
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 144
[Link] 178
63
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
LAÇO 3 - i = 3
• a = a + v[3]
• a=6+4
• a = 10
LAÇO 4 - i = 4
Aqui um cuidado, o valor de v[6-4] = v[2], será consultado conforme alteração feita no LAÇO 2 -
portanto, seu valor será igual a 2, não o valor original de v[1], que seria 1.
• a = a + v[4]
• a = 10 + 3
• a = 13
LAÇO 5 - i = 5
• a = a + v[5]
• a = 13 + 6
• a = 19
Assim, terminamos com a variável a = 19, e com o vetor v = {4, 2, 4, 3, 6}. Perceba que esses
valores alterados no vetor são comunicados aos laços - muita atenção. Como a questão quer o
valor de a, a resposta será 19.
Gabarito: Letra E
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 145
[Link] 178
64
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Comentários:
Gabarito: Letra D
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 146
[Link] 178
65
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
QUESTÕES COMENTADAS
Algoritmo Maior
Var
num1, num2, maior: inteiro:
Inicio
Leia (num1, num2);
Se (num1>num2) então
maior ← num1;
senão
maior ← num2;
fimse;
escreva (maior);
Fim
a) diagrama de Nassi-Shneiderman
b) diagrama hierárquico de fluxo
c) pseudocódigo
d) fluxograma
03. (CEBRASPE/CAU BR/2024) Com relação à lógica de programação, julgue o próximo item.
A estrutura de controle IF, que pode ser classificada como do tipo iteração, determina o caminho
que o algoritmo deve seguir, de acordo com determinada condição.
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 147
[Link] 178
1
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
05. (CEBRASPE/TST/2024)
programa principal
inteiro i, contagem = 10, limite = 10;
para (i = 0; i > limite; i = i + 1) faça
contagem = contagem – 1;
fim para
imprime(contagem);
fim programa
Com base no algoritmo precedente, escrito em pseudocódigo, assinale a opção que corresponde
ao tipo de estrutura em que se realiza o decréscimo da variável contagem.
a) estrutura de controle
b) estrutura de repetição
c) estrutura condicional
d) atributo
a) o reaproveitamento de código.
b) a passagem de parâmetros.
c) o recebimento do retorno das funções.
d) o grau de abstração do sistema.
e) a facilidade de implementação das funções.
a) F - F - F
b) F - V - F
c) V - F - V
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 148
[Link] 178
2
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
d) V - V - V
a) goto
b) struct
c) if
d) else
e) for
09. (CEBRASPE/POLC AL/2023) Julgue o próximo item, no que se refere a estruturas de controle
de fluxo.
// codigo 1
i=1
fim = 7
enquanto i < fim faça
escreva(i)
i=i+1
fim enquanto
depois = i
// codigo 2
fim = 6
i=0
enquanto i < fim faça
i=i+1
escreva(i)
fim enquanto
depois = i
Início
[
Tipo MAT = matriz[1..3,1..3] de inteiros;
MAT: M;
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 149
[Link] 178
3
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Inteiro: i, j, X, Y;
X ← 0;
Y ← 0;
Para i de 1 até 3 faça
[
Para j de 1 até 3 faça
[
Se i = j
Então M[i,j] ← i + j + 1;
Senão M[i,j] ← i + 2*j + 1;
]
]
Para i de 1 até 3 faça
[
X ← X + M[i,i];
Y ← Y + M[1,i];
]
Imprima (X+Y);
] Fim.
a) 29.
b) 30.
c) 31.
d) 32.
e) 33.
11. (COCP IFMT/IFMT/2023) Segundo Manzano & Oliveira (2016), um laço incondicional, entre
outras coisas, é um tipo de laço que é iterativo, porém não é interativo e tem seu funcionamento
controlado por uma variável denominada contador. Com essa descrição, o autor se refere ao laço
do tipo:
Fonte: (MANZANO, José Augusto & OLIVEIRA, Jayr Figueiredo de. Algoritmos: Lógica para desenvolvimento de programação de
computadores. 18 ed. São Paulo: Erica, 2016).
a) para/fim_para
b) repita/até_que
c) enquanto/fim_enquanto
d) laço/fim_laço
e) execute/enquanto_for
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 150
[Link] 178
4
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
13. (FUNDATEC/CIGA SC/2023) Na linguagem Java, existe uma estrutura de controle de fluxo de
execução que permite executar um bloco de código pelo menos uma vez e depois repeti-lo
enquanto uma condição é verdadeira. Que estrutura é essa?
a) do-while
b) while
c) for
d) if-else
e) repeat-until
Início
Inteiro: a, b, c, i, M;
a ← 0;
b ← 2;
c ← 4;
M ← 10;
Para i de 1 até 5 faça
[
Se (a < b)
Então
[
a ← a + 1;
c ← a + b;
]]
M ← M + a + b - c;
Imprima M;
Fim.
Se (a < b)
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 151
[Link] 178
5
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
a) 1
b) 2
c) 3
d) 4
e) 5
a) repita...até_que
b) faça...enquanto
c) caso...seja...faça...senão...fim_caso
d) enquanto...faça...fim_enquanto
e) para...de...até...faça...fim_para
a) Loop.
b) Classe.
c) Variável.
d) Constante.
17. (CONSUPLAN/IF PA/2023) Qual das seguintes instruções de pseudocódigo seria utilizada para
fazer o programa repetir um conjunto de ações até que uma determinada condição seja satisfeita?
a) SE...ENTÃO
b) PARA...ATÉ
c) CASO...SEJA
d) ENQUANTO...FAÇA
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 152
[Link] 178
6
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
a) Apenas I e II.
b) Apenas I e III.
c) Apenas II e IV.
d) Apenas II, III e IV.
e) I, II, III e IV.
19. (FUNCER/Pref. São Tomé/2023) Dentro da lógica de programação é uma estrutura que
permite executar mais de uma vez o mesmo comando ou conjunto de comandos, de acordo com
uma condição ou com um contador. A estrutura de repetição básica abaixo está se referindo:
a) do while.
b) for.
c) while.
d) if.
20. (CETAP/SEMAS PA/2023) Em que situação a recursividade é apropriada como solução para
um problema de programação?
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 153
[Link] 178
7
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
21. (CEBRASPE/EMPREL/2023)
calc = 5 % 2
imprime(calc)
a) 1
b) 2
c) 10
d) 20
e) 25
estrutura S
[Link]=0
estrutura-vazia(S){
se ([Link]=0)
retorna Verdadeiro;
fim se
}
EMPURRA (S,x){
[Link] = [Link]+1;
S[[Link]] = x;
}
PUXA (S)
se (Stack-Empty(S))
escreva_erro(“Underflow”);
senao
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 154
[Link] 178
8
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
[Link] = [Link]-1;
retorna S[[Link]+1];
fim se
Considerando a estrutura S precedente, inicialmente vazia e armazenada no arranjo S[1 ... 6],
julgue o próximo item, a respeito de construção de algoritmos e estrutura de dados.
O resultado final das operações na sequência EMPURRA(S, 4), EMPURRA (S, 1), EMPURRA (S, 3),
PUXA(S), EMPURRA (S, 8) e PUXA (S) é S[4,1,3,8].
Algoritmo é uma lista de instruções que conduzem ações especificadas, passo a passo, em rotinas
embasadas em hardware ou software.
constante A = 50
enquanto (A > 0)
A -= 5;
fim enquanto
escreva (A);
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 155
[Link] 178
9
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
x = 10;
para (y = 40; y < 100; y = y + 16)
x = x + 10;
fim para
sp = (a + b + c)/2;
ar = sp*(sp - a)*(sp - b)*(sp - c);
se (ar < 0)
escreva (“Não é possível obter resultado.”);
senão
escreva (“Resultado: “);
escreva(raiz_quadrada(ar));
fimse
função f(x)
se (x == 0 ou x == 1)
retorna 1;
fimse
retorna f(x - 1)*x
fimfunção
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 156
[Link] 178
10
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
função func(a)
se (a == 0)
retorna 2
fimse
retorna a + f(a - 1)
fimfunção
escreva(func(6));
31. (CEBRASPE/Pref. Fortaleza/2023) Julgue o item que se segue, relativo a conceitos de avaliação
de expressões.
Após o algoritmo a seguir ser executado, o valor da variável soma1 será maior que o da variável
soma2.
vetor a[7];
real soma1, soma2;
inteiro i;
a = [1,3,9,27,81,243,729];}
soma1 = 0;
i = 0;
soma2 = 1 * (1-3^7)/(1-3)
escreva(soma1)
escreva(soma2)
Início
Inteiro: x, y, z, i;
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 157
[Link] 178
11
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
x ← 3;
y ← 3;
z ← 3;
Para i de 1 até 6 faça
[ Se (z = 3)
Então
[
x ← x+1;
y ← y+2;
z ← z-1;
]
Senão
[
z ← z+1;
]]
z ← x + y + z;
Fim.
a) 15
b) 16
c) 17
d) 18
e) 19
34. (FGV/TCE SP/2023) A série de Fibonacci é definida da seguinte forma: o primeiro e o segundo
termos valem 1, e os demais são obtidos pela soma de seus dois antecessores. Em termos gráficos,
ela define uma espiral, sendo utilizada em diversas áreas, que vão da biologia até o mercado
financeiro. Um algoritmo para cálculo do termo de ordem n da série é apresentado a seguir.
algoritmo Fibonacci
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 158
[Link] 178
12
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
var x, a, b, i, f: inteiro
início
leia(x);
a <- 1
b <- 1
f <- 1
i <- 2
i <- i + 1
fim enquanto
escreva("Fibonacci para o termo: ", f)
fim algoritmo
Executando o algoritmo, se for informado o valor 7 para x, será impressa a mensagem “Fibonacci
para o termo: “: ‘
a) 7
b) 21
c) 28
d) 64
e) 128
35. (FGV/TCE SP/2023) Marta está definindo um algoritmo para descrever um menu de funções
do sistema, apresentando as opções baseadas em números, seguido da leitura da opção, com a
saída ocorrendo após a digitação do número zero.
Para gerenciar o fluxo de execução, que envolve a exibição do menu e leitura da opção, repetindo-
se até que seja digitada a opção zero, Marta deve utilizar a estrutura de controle:
a) enquanto - faça;
b) se - então;
c) repita - até;
d) para - faça;
e) se - então - senão.
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 159
[Link] 178
13
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Início
Inteiro: i, j, k, a;
...
Para i de 3 até 6 faça
Para j de 4 até 7 faça
Para k de 2 até 8 faça
[
a ← a + 1;
]
...
Fim.
É correto afirmar que, a variável a, após a execução de desse trecho de programa, terá sido
incrementada
a) 8 vezes.
b) 54 vezes.
c) 336 vezes.
d) 112 vezes.
e) 6 vezes.
ALGORITMO
DECLARE n1, n2 NUMÉRICO
n1 ⟵ 6
n2 ⟵ aplica_processamento(n1)
ESCREVA (“O processamento aplicado em “, n1, “ resulta em “ n2)
FIM_ALGORITMO
a) 180
b) 90
c) 120
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 160
[Link] 178
14
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
d) 720
inteiro op=8
op = 5
op = 4
Comentários:
Temos uma declaração inicial da variável op, que é do tipo inteiro, e depois temos novas
declarações. Essas novas declarações substituem o valor original - portanto, de fato, o valor final
da variável será 4, equivalente à última atribuição de valor.
Gabarito: Correto
Uma função é dita recursiva quando, dentro dela, é feita uma ou mais chamada a ela mesma.
Início
Inteiro: x, y, z, j;
Leia x, y;
z ← 19;
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 161
[Link] 178
15
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
a) 42
b) 36
c) 32
d) 48
e) 40
42. (IFTO/IFTO/2022) Qual das definições abaixo melhor descreve o que é um algoritmo?
a) 00101011
b) 10010110
c) 00110101
d) 11101001
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 162
[Link] 178
16
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Para que a função fat funcione corretamente, o trecho “. . . “ deve ser substituído por
a) return fat(n + 1)
b) return fat(n)
c) return fat(n-1)
d) return n * fat(n)
e) return n * fat(n-1)
Durante a execução de um programa, uma variável pode armazenar vários valores a cada instante,
ou seja, ela pode armazenar até dez registros ao mesmo tempo.
( ) IF
( ) FOR
( ) WHILE
a) 2-1-3
b) 1-2-3
c) 3-2-1
d) 3-1-2
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 163
[Link] 178
17
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
Os laços usados em estruturas de repetição e teste podem ser feitos por meio de comandos como
enquanto e repita.
As estruturas se e senão são estruturas de repetição utilizadas nas situações em que, caso
determinada condição seja alcançada, um comando é realizado, caso contrário, outro comando é
executado
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 164
[Link] 178
18
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
switch (expressão) {
case expressão_constante1:sentença1;
...
case constanten: sentença_n;
[default: sentençan + 1]
}
a) Controle múltiplo
b) Repetição múltipla
c) Desvio múltiplo
d) Seleção múltipla
52. (IBFC/DPE MT/2022) Assinale a alternativas que esteja tecnicamente correta quanto ao
pseudocódigo, em inglês, que representa uma estrutura de repetição.
a) Switch
b) Return
c) While
d) Function
53. (QUADRIX/SEE DF/2022) Acerca dos aspectos das linguagens de programação e das
estruturas de dados e da programação orientada a objetos (POO), julgue o item a seguir.
54. (FCM/IF AM/2022) Sobre listas, pilhas e filas, associe corretamente as colunas
ESTRUTURAS DE DADOS
1 - Listas Lineares
2 - Pilha
3 - Fila
DESCRIÇÕES
( ) São utilizadas quando se deseja processar itens de acordo com a ordem “primeiro-que-chega,
primeiro- atendido”.
( ) Também são chamadas listas LIFO.
( ) Existe uma ordem linear, que é a “ordem de chegada”.
( ) Adequadas quando não é possível prever a demanda por memória, permitindo a manipulação
de quantidades imprevisíveis de dados, de formato também imprevisível.
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 165
[Link] 178
19
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
( ) Os itens são colocados um sobre o outro. O item inserido mais recentemente está no topo e o
inserido menos recentemente no fundo.
a) 2, 3, 1, 2, 3.
b) 3, 2, 2, 1, 2.
c) 2, 2, 3, 1, 2.
d) 3, 2, 2, 1, 3.
e) 3, 2, 3, 1, 2.
a) if
b) else if / elif
c) else
d) while
e) for
a) if
b) for
c) while
d) switch
e) do - while
Início
Inteiro: a1, a2, a3, i;
Leia a1;
a2 ← 1;
a3 ← 5;
Para i de 1 até 4 faça
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 166
[Link] 178
20
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
[
Se (a1+a2) < a3
Então
a2 ← a2 + 1;
Senão
a3 ← a3 + 2;
]
a1 ← a2 + a3;
Imprima a1;
Fim.
Assumindo que o valor lido para a variável a1 tenha sido 3, então o resultado impresso ao final do
procedimento para a variável a1 é igual a:
a) 3
b) 7
c) 9
d) 11
e) 14
Inteiro: a, i, j, k, m;
...
a ← 0;
...
Para i de 1 até 3 faça
[
Para j de 1 até 3 faça
[
Para k de 1 até 3 faça
[
Para m de 1 até 3 faça
[
a ← a + 2;
]
]
]
]
Ao final da execução desse trecho de código, o valor presente na variável a será igual a:
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 167
[Link] 178
21
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
a) 12
b) 27
c) 54
d) 81
e) 162
59. (SS CENTEC/CENTEC/2022) endo que A=3, B=7, C=4 e D=B, marque a alternativa CORRETA
de acordo com as afirmações abaixo.
I. (B + A) <= C
II. (A > C) AND (C <= D)
III. (A+B) > 10 OR (A+B) = (C+D)
IV. (A>=C) AND (D >= C)
a) DO WHILE
b) WHILE
c) FOR
d) IF
e) CASE
Os dados de um algoritmo devem ser definidos por tipos para que seus conteúdos possam ser
submetidos a operações corretas, inerentes a cada tipo de dado.
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 168
[Link] 178
22
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
A passagem de um vetor por valor é mais eficiente que a passagem por parâmetro, considerando
aspectos de tempo de processamento e espaço em memória, estando ambas as situações sob as
mesmas condições de recursos.
As funções executam um ou mais comandos e sempre retornam um resultado para quem fez uma
chamada à função.
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 169
[Link] 178
23
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
68. (FUNCERN/CM Natal/2023) As variáveis de programação são fundamentais para o dia a dia
do programador. Elas orientam o programa a executar operações. Uma variável em um programa
é definida como
a) um valor fixo.
b) um local na memória para armazenar dados.
c) uma palavra-chave reservada.
d) um comando executável
69. (VUNESP/EPC/S2023) Considere que, ao se chamar uma função: a) foram passados os valores
de variáveis para ela; b) o valor de cada variável na função chamadora é copiado nas variáveis
fictícias correspondentes da função chamada; c) as alterações feitas nas variáveis fictícias na função
chamada não têm efeito nos valores das variáveis reais na função chamadora.
a) cruzada.
b) exclusiva.
c) reversa.
d) por valor.
e) por referência.
Início
Inteiro: p, q, S, cont;
p ← 5;
q ← 3;
Para cont de 1 até 5 faça
[
Se (p+q) > 2*p
Então
p ← p-1;
Senão
q ← q+2;
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 170
[Link] 178
24
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
]
S ← p + q;
Fim.
a) 8.
b) 9.
c) 10.
d) 11.
e) 12.
71. (VUNESP/DPE SP/2023) Os parâmetros que são passados para uma função de um programa
são denominados parâmetros reais, enquanto que os parâmetros recebidos por uma função são
denominados parâmetros formais. Neste contexto, em uma chamada de função por valor, os
valores dos parâmetros reais
a) são copiados para os parâmetros formais da função, e as alterações nestes efetuadas dentro
da função refletem-se em alterações nos parâmetros reais.
b) são copiados para os parâmetros formais da função, e as alterações nestes efetuadas dentro
da função não implicam em alterações nos parâmetros reais.
c) não são copiados para os parâmetros formais da função, e as alterações efetuadas nestes
dentro da função, refletem-se em alterações nos parâmetros reais.
d) não são copiados para os parâmetros formais da função, e as alterações efetuadas nestes
dentro da função, não implicam em alterações nos parâmetros reais.
e) não são copiados para os parâmetros formais da função, e esta não pode realizar alterações
em seus parâmetros formais.
01 Programa {
02 funcao inicio() {
03 real resultado
04
05 resultado = 5.0 + 4.0 * 2.0
06 escreva(resultado)
07
08 resultado = (5.0 + 4.0) * 2.0
09 escreva(resultado)
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 171
[Link] 178
25
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
10
11 resultado = 1.0 + 2.0 / 3.0 * 4.0
12 escreva(resultado)
13 }
14 }
a) Real e 18.0
b) Cadeia e 22.0
c) Real e 40.0
d) Inteiro e 20.0
e) Real e 22.0
73. (IBFC/TRF 5/2024) Estruturas de dados são constantemente utilizadas em algoritmos para
resolução de problemas, desde os mais simples aos mais complexos, desta forma, estrutura de
dados utiliza o princípio “Último a entrar, primeiro a sair”(LIFO):
a) Fila
b) Lista Encadeada
c) Pilha
d) Árvore
Pilhas são tipos de estruturas de dados que permitem a remoção direta de qualquer elemento de
sua estrutura.
75. (CEBRASPE/SEPLAN RR/2023) Julgue o item a seguir acerca dos conceitos de estrutura de
dados.
Sempre que houver uma remoção na estrutura de dados denominada fila, o elemento removido
será aquele que está na estrutura há mais tempo.
76. (VUNESP/TCM SP/2023) Considere uma estrutura de dados do tipo pilha, inicialmente vazia,
que possui as operações típicas de inserção e remoção de elementos, denominadas PUSH e POP.
PUSH 1
PUSH 2
POP
PUSH 3
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 172
[Link] 178
26
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
POP
PUSH 4
POP
PUSH 5
Após a realização de todas essas operações, o número de elementos na pilha e o valor armazenado
no topo da pilha serão, respectivamente,
a) 0 e 0.
b) 1 e 1.
c) 1 e 5.
d) 2 e 1.
e) 2 e 5.
77. (VUNESP/Pref. Marília/2023) Considere uma estrutura de dados com a propriedade de que,
sempre que houver a remoção de um elemento nela armazenado, o elemento a ser removido é
aquele que se encontra armazenado na estrutura há menos tempo.
a) fila.
b) pilha.
c) lista simples.
d) lista encadeada.
e) lista duplamente encadeada.
78. (CESGRANRIO/BB/2023) A Figura a seguir exibe o conteúdo de três pilhas: P1, P2 e P3.
Admita que um método Java, chamado exibePilha, receba essas três pilhas como parâmetros e
execute os seguintes passos:
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 173
[Link] 178
27
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
O que será exibido no console, quando o método exibePilha for executado, tendo P1, P2 e P3
sido passadas como parâmetros?
a) 10 15 25 28
b) 10 25 30 40
c) 15 10 28 25
d) 20 35 34 40
e) 40 34 30 60
algoritmo Marcos
var
i, a: inteiro
v: vetor [1..5] de inteiro
início
a <- 0
escreva(a)
fim algoritmo
Considerando o vetor com índice inicial 1 e final 5, e utilizando os valores {2, 1, 2, 1, 2}, Marcos
obterá a impressão do valor:
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 174
[Link] 178
28
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
a) 3
b) 8
c) 9
d) 16
e) 19
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 175
[Link] 178
29
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
GABARITO
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 176
[Link] 178
30
03063835439 - JeanDionísio Raposo
Diego Carvalho, Renato da Costa, Equipe Informática e TI, Paolla Ramos, Fernando Pedrosa Lopes
Aula 00 - Prof. Felipe Mathias Raphael Lacerda
TRF 5ª (Analista Judiciário - Análise de Dados) Desenvolvimento de Software - 2024 (Pós-Edital) 177
[Link] 178
31
03063835439 - JeanDionísio Raposo