Loops e Laços¶
No contexto de HPC, onde a eficiência e a performance são cruciais, as estruturas de controle (loops e laços) desempenham papéis vitais:
- Otimização de Algoritmos
- As estruturas de controle permitem que algoritmos sejam implementados de forma eficiente. Condicionais e loops bem utilizados podem reduzir o número de operações e evitar cálculos desnecessários, otimizando o tempo de execução.
- Paralelismo
- Em HPC, o paralelismo é frequentemente utilizado para acelerar a execução dos programas. Estruturas de controle são essenciais para dividir tarefas entre diferentes threads ou processos.
- O uso adequado de condicionais pode garantir que as tarefas sejam distribuídas eficientemente entre os recursos computacionais, evitando sobrecarga em um único nó de processamento.
- Balanceamento de Carga
- Estruturas de controle podem ajudar no balanceamento de carga, distribuindo o trabalho de maneira uniforme entre os processadores. Por exemplo, condicionais podem ser usados para verificar a carga de trabalho em diferentes nós e ajustar dinamicamente a distribuição das tarefas.
- Isso é crucial para evitar situações onde alguns processadores ficam ociosos enquanto outros estão sobrecarregados, maximizando a utilização de recursos e melhorando a performance geral.
- Gerenciamento de Recursos
- Condicionais e loops podem ser usados para gerenciar recursos, como alocação de memória e acesso a dispositivos de I/O. Em ambientes HPC, onde grandes volumes de dados são manipulados, o gerenciamento eficiente de memória é fundamental. Estruturas de controle podem ajudar a evitar desperdício de memória e garantir que os recursos sejam utilizados de maneira eficiente.
Estruturas de controle condicionais (if
, else if
, else
):¶
Exemplo: Encontrar o valor máximo em uma matriz
#include <iostream>
#include <vector>
int main() {
// Inicializa uma matriz 3x3 com valores inteiros
std::vector<std::vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// Define a variável max_value com o primeiro valor da matriz
int max_value = matrix[0][0];
// Percorre cada linha da matriz
for (size_t i = 0; i < matrix.size(); ++i) {
// Percorre cada coluna da matriz
for (size_t j = 0; j < matrix[i].size(); ++j) {
// Se o valor atual da matriz for maior que max_value, atualiza max_value
if (matrix[i][j] > max_value) {
max_value = matrix[i][j];
}
}
}
// Imprime o valor máximo encontrado na matriz
std::cout << "O valor máximo na matriz é: " << max_value << std::endl;
return 0; // Termina o programa
}
Estrutura de controle condicional switch
:¶
Exemplo: Imprimir a posição de um número específico na matriz
#include <iostream>
#include <vector>
int main() {
// Inicializa uma matriz 3x3 com valores inteiros
std::vector<std::vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// Define o valor alvo a ser encontrado
int target = 5;
// Percorre cada linha da matriz
for (size_t i = 0; i < matrix.size(); ++i) {
// Percorre cada coluna da matriz
for (size_t j = 0; j < matrix[i].size(); ++j) {
// Verifica o valor atual da matriz usando switch
switch(matrix[i][j]) {
case 5:
// Se o valor for 5, imprime a posição e sai do switch
std::cout << "Número " << target << " encontrado em: (" << i << ", " << j << ")" << std::endl;
break;
default:
// Caso padrão do switch, não faz nada
break;
}
}
}
return 0; // Termina o programa
}
Estrutura de controle loop for
:¶
Exemplo Somar todos os elementos de uma matriz :
#include <iostream>
#include <vector>
int main() {
// Inicializa uma matriz 3x3 com valores inteiros
std::vector<std::vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// Inicializa a variável sum com 0
int sum = 0;
// Percorre cada linha da matriz
for (size_t i = 0; i < matrix.size(); ++i) {
// Percorre cada coluna da matriz
for (size_t j = 0; j < matrix[i].size(); ++j) {
// Adiciona o valor atual da matriz à sum
sum += matrix[i][j];
}
}
// Imprime a soma de todos os elementos na matriz
std::cout << "A soma de todos os elementos na matriz é: " << sum << std::endl;
return 0; // Termina o programa
}
Estrutura de controle loop while
:¶
Encontrar um número específico na matriz
#include <iostream>
#include <vector>
int main() {
// Inicializa uma matriz 3x3 com valores inteiros
std::vector<std::vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// Define o valor alvo a ser encontrado
int target = 5;
bool found = false; // Flag para indicar se o valor foi encontrado
size_t i = 0; // Índice para as linhas
// Loop externo para percorrer as linhas
while (i < matrix.size() && !found) {
size_t j = 0; // Índice para as colunas
// Loop interno para percorrer as colunas
while (j < matrix[i].size() && !found) {
// Se o valor atual da matriz for igual ao alvo, imprime a posição
if (matrix[i][j] == target) {
std::cout << "Número " << target << " encontrado em: (" << i << ", " << j << ")" << std::endl;
found = true; // Atualiza a flag
}
++j; // Incrementa o índice das colunas
}
++i; // Incrementa o índice das linhas
}
// Se o valor não foi encontrado, imprime uma mensagem
if (!found) {
std::cout << "Número " << target << " não encontrado na matriz." << std::endl;
}
return 0; // Termina o programa
}
Estrutura de controle loop do-while
:¶
Verificar se todos os elementos da matriz são positivos
#include <iostream>
#include <vector>
int main() {
// Inicializa uma matriz 3x3 com valores inteiros
std::vector<std::vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
bool all_positive = true; // Flag para indicar se todos os elementos são positivos
size_t i = 0; // Índice para as linhas
// Loop externo do-while para percorrer as linhas
do {
size_t j = 0; // Índice para as colunas
// Loop interno do-while para percorrer as colunas
do {
// Se o valor atual da matriz for menor ou igual a 0, atualiza a flag e sai do loop
if (matrix[i][j] <= 0) {
all_positive = false;
break;
}
++j; // Incrementa o índice das colunas
} while (j < matrix[i].size());
++i; // Incrementa o índice das linhas
} while (i < matrix.size() && all_positive);
// Imprime o resultado da verificação
if (all_positive) {
std::cout << "Todos os elementos da matriz são positivos." << std::endl;
} else {
std::cout << "Nem todos os elementos da matriz são positivos." << std::endl;
}
return 0; // Termina o programa
}
Controladores de loop break
:¶
Interromper a busca ao encontrar um número específico (break
)
#include <iostream>
#include <vector>
int main() {
// Inicializa uma matriz 3x3 com valores inteiros
std::vector<std::vector<int>> matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
int target = 5; // Define o valor alvo a ser encontrado
bool found = false; // Flag para indicar se o valor foi encontrado
// Loop externo para percorrer as linhas
for (size_t i = 0; i < matrix.size(); ++i) {
// Loop interno para percorrer as colunas
for (size_t j = 0; j < matrix[i].size(); ++j) {
// Se o valor atual da matriz for igual ao alvo, imprime a posição
if (matrix[i][j] == target) {
std::cout << "Número " << target << " encontrado em: (" << i << ", " << j << ")" << std::endl;
found = true; // Atualiza a flag
break; // Interrompe o loop interno
}
}
if (found) {
break; // Interrompe o loop externo
}
}
// Se o valor não foi encontrado, imprime uma mensagem
if (!found) {
std::cout << "Número " << target << " não encontrado na matriz." << std::endl;
}
return 0; // Termina o programa
}
Controladores de loop continue :¶
Ignorar números negativos ao somar elementos de uma matriz (continue
)
#include <iostream>
#include <vector>
int main() {
// Inicializa uma matriz 3x3 com valores inteiros, incluindo números negativos
std::vector<std::vector<int>> matrix = {
{1, -2, 3},
{-4, 5, -6},
{7, -8, 9}
};
int sum = 0; // Inicializa a variável sum com 0
// Loop externo para percorrer as linhas
for (size_t i = 0; i < matrix.size(); ++i) {
// Loop interno para percorrer as colunas
for (size_t j = 0; j < matrix[i].size(); ++j) {
// Se o valor atual da matriz for negativo, ignora-o e continua para a próxima iteração
if (matrix[i][j] < 0) {
continue; // Ignora números negativos
}
// Adiciona o valor atual da matriz à soma
sum += matrix[i][j];
}
}
// Imprime a soma de todos os elementos positivos na matriz
std::cout << "A soma de todos os elementos positivos na matriz é: " << sum << std::endl;
return 0; // Termina o programa
}