Comentários

0%

NÃO PODE FALTAR

Estruturas de repetição determinísticas

Márcio Aparecido Artero

Loops ou laços de repetição para uso em diversas situações

As estruturas de repetição também são utilizadas para repetir uma série de operações semelhantes que são executadas para todos os elementos de uma lista de dados, armazenados em tabelas, vetores ou matrizes.

Fonte: Shutterstock.

Deseja ouvir este material?

Áudio disponível no material digital.

Praticar para Aprender

Você, novamente, recebeu uma missão da instituição de ensino na qual se formou. Foi solicitado um programa em linguagem C para transformar o nome digitado dos alunos em letras maiúsculas, assim, caso uma pessoa digite o nome do aluno em letras minúsculas, o programa transformará automaticamente em maiúsculas. Essa é uma prática muito comum no dia a dia do desenvolvimento de software. Por exemplo, ao fazer a busca por um aluno da instituição usando seu nome, antes, é necessário transformar o nome informado, bem como os nomes dos alunos cadastrados no software para caixa alta (maiúsculas) ou baixa (minúsculas). Isso evitará que o fato de uma letra ser informada maiúscula ou minúscula prejudique a busca, ou seja, tanto faz se o usuário informou “josé” ou “José” ou “JOSÉ”; o resultado da busca deve ser sempre o mesmo. Outra aplicação prática desse exercício é quando se quer gerar uma lista de presença dos alunos de determinada turma. É comum sempre imprimir os nomes em caixa alta (maiúsculas), mantendo um padrão entre os nomes e facilitando a leitura do professor. Após a criação do programa, entregue o código no formato TXT para documentação.

Qual função em linguagem C devemos usar para converter maiúsculas em minúsculas e vice-versa? Caro aluno, são tantas as possibilidades de aplicação de estrutura de repetição que não podemos deixar passar esse novo desafio. Então, vamos buscá-lo? Pratique bastante e bons estudos!

Roteiro para o professor

Desafie os alunos a irem além e criarem um programa que modifique o nome do aluno para que a primeira letra do nome seja maiúscula e as demais, minúsculas.

Lembre a eles que o nome pode ser composto, por exemplo, João Paulo. Nesses casos, o aluno terá que saber quando uma palavra terminou e outro começou. Para isso, instrua-o a criar um laço que, ao detectar um caractere em branco (espaço), continue iterando na string até encontrar um caractere não branco.

conceito-chave

Estruturas de repetição possibilitam a repetição de um comando ou de uma sequência de comandos várias vezes. Essas estruturas, também chamadas de laços de repetição ou loops, são utilizadas em diversas aplicações. Considere um sistema de compras de passagens aéreas: um cliente quer viajar para um destino em determinado dia e horário; para cada horário de disponibilidade do voo haverá uma quantidade fixa de assentos disponíveis. Como a aeronave tem uma quantidade fixa de poltronas, pode-se utilizar o comando for, assim, caso as poltronas tenham se esgotado, o usuário não conseguirá comprar a passagem. Podemos comparar esse loop executado a um comando for: pense que a cada cliente que compra uma poltrona é incrementado em 1 do total de poltronas – logo, em comandos de compra – e o pagamento da passagem será concluída.

Figura 2.11 | Reservas de assentos em um voo
Fonte: Shutterstock.

Estrutura de repetição com variáveis de controle - for

Nesta seção, aprenderemos a estrutura de repetição usando for e suas aplicações, bem como os comparativos com as outras estruturas de repetição.

Para tal, vamos iniciar falando da repetição com variáveis de controle, ou seja, como aplicaremos o laço for. Esse comando – que em português significa “para”, segundo Mizrahi (2008) –, é geralmente usado para repetir um comando ou uma sequência de comandos um determinado número de vezes, isto é, podemos determinar quantas vezes acontecerá a repetição. Veja na Figura 2.12 como é representada a estrutura de repetição usando o comando for.

Figura 2.12 | Fluxograma de repetição com variáveis de controle
A imagem mostra o fluxo indo para o símbolo de processo com o texto: inicializa a variável que segue o fluxo para o símbolo de condicional, que tem saída para dois fluxos, uma saída com a letra F segue o fluxo e a outra saída com a letra V vai para o símbolo de processo com o texto comandos, que segue o fluxo para o símbolo de processo com o texto incrementa a variável e o fluxo volta para o símbolo de condicional.
Fonte: elaborada pelo autor.

A sintaxe usando a linguagem de programação em C fica da seguinte forma:

for(inicialização; condição de parada; incremento) {
  comando ou sequência de comandos;
}

Na aplicação do comando for você encontra três expressões separadas por ponto e vírgula. O significado de cada uma delas é apresentado a seguir:

Para facilitar ainda mais, veja a seguinte representação:

for (y = 0; y <= 10; y++)

y = 0

Declaração e atribuição de valor inicial para y, assim, tem o seu valor iniciado em 0. 

y <= 10

O laço se repetirá enquanto y for menor ou igual a 10.

y++

Ao final da execução dos comandos do laço de repetição, y será incrementado em 1.

Agora, vamos aplicar essa representação em um programa que mostra uma sequência de números, em que y vai de 0 a 10. Observe a saída do código utilizando a ferramenta Paiza.io.

Código 2.18 | Comando for – sequência de números
#include <stdio.h>
int main() {
    int x, y;
    for(y = 0; y <= 10; y++) {
        printf("\ny=%d", y);
    }
    return 0;
}
Fonte: elaborado pelo autor.

Teste o Código 2.18 utilizando a ferramenta Paiza.io.

Assimile

O incremento em um comando for não precisar ser unitário (de um em um). Você pode utilizar incrementos maiores para, por exemplo, imprimir todos os números pares de 0 a 10:

Código 2.19 | Comando for – incremento
#include <stdio.h>
int main() {
    int x, y;
    for(y = 0; y <= 10; y += 2) {
        printf("\ny=%d", y);
    }
    return 0;
}
Fonte: elaborado pelo autor.

No código a seguir, vamos criar uma contagem regressiva de um número qualquer, digitado pelo usuário:

Código 2.20 | Comando for – contagem regressiva
#include <stdio.h>
int main() {
    int contador;
    printf("\nDigite um número para contagem regressiva: ");
    scanf("%d", &contador);
    for (contador; contador >= 1; contador--) {
        printf("%d ", contador);
    }
    return 0;
}
Fonte: elaborado pelo autor.
Exemplificando

Você pode usar o comando break dentro de um laço for para uma determinada condição, forçando, assim, o término do laço. Veja o exemplo a seguir:

Roteiro para o professor

É comum aos alunos que estão começando a trabalhar com o comando for forçar a saída do comando ao modificar o valor da variável de controle. Essa, entretanto, é uma má prática de programação. A variável de controle deve ser gerenciada pelo próprio comando, a fim de tornar o código mais legível e menos suscetível a erro.

Por exemplo, suponha que durante o desenvolvimento do programa um programador alterou a condição de parada do laço. Se ele não estiver ciente de que a variável de controle está sendo modificada dentro do laço, seu programa pode apresentar erros de difícil identificação.

Desafie os alunos a elaborar um programa capaz de ler 10 números do teclado, adicionando-os em um vetor. Posteriormente, peça para que eles elaborem um comando for que percorra esse vetor até encontrar um número ímpar maior do que 5. Ao encontrar esse número, o laço deve ser encerrado e seu valor deve ser impresso na tela. Para isso, os alunos não podem usar outros comandos de repetição, como o while, nem podem usar o comando break para sair do laço. A ideia é que eles usem uma condicional mais complexa no comando for, como:

for (int i = 0; i < 10 && achou == false; i++) {
  achou = (vetor[i] > 5 && vetor[i] % 2 == 1); 
}  

Vetores

Agora, vamos trabalhar algumas aplicações utilizando vetores. Segundo Manzano (2013; 2015), vetor (array) é um tipo especial de variável, capaz de armazenar diversos valores “ao mesmo tempo”, usando um mesmo nome de variável. Por armazenar diversos valores, também é chamado de variável composta. Veja a sintaxe a seguir para utilização de vetores:

tipo variavel[n]

em que “n” representa a quantidade de elementos do vetor.

Vamos a outro exemplo em que armazenamos valores em um vetor. Lembre-se de que os elementos de um vetor são acessados por meio de índices, que vão de 0 à n – 1, em que n é a quantidade de elementos.

Código 2.21 | Comando for – vetor
#include <stdio.h>

#define VET_TAM 5

int main () {
    int num[VET_TAM];
    
    for (int i = 0; i < VET_TAM; i++) {
        printf("\nEntre com um número: ");
        scanf("%d", &num[i]);
        printf("\nO valor digitado foi: %d", num[i]);
    }
    
    return 0;
}
Fonte: elaborado pelo autor.
Roteiro para o professor

Uma boa prática de programação é evitar números mágicos, isto é, valores literais que aparecem ao longo do código, mas que não apresentam qualquer semântica implícita a eles. No código a seguir, 5 (cinco), que representa a quantidade de elementos de um vetor, é um número mágico.

#include <stdio.h>
int main () {
  int num[5];  

  for (int i = 0; i < 5; i++) {
    printf("\nEntre com um número: ");
    scanf("%d", &num[i]);
    printf("\nO valor digitado foi: %d", num[i]);
  }  

  return 0;
}

Além de dificultar a legibilidade, outro problema com os números mágicos é que eles acabam se repetindo ao longo do código, tornando o programa mais difícil de manter e mais propenso a erros. Pense no que aconteceria se um programador alterasse o tamanho do vetor, mas esquecesse de alterar a condição de parada do comando for.

Por isso, incentive os alunos a definirem constantes no código, como no exemplo desse quadro.

Exemplificando 

Que tal usarmos o comando for e while no mesmo código?

O programa a seguir encontra a primeira posição para um determinado número inserido pelo usuário.

Vejamos, então, como fica a programação:

Código 2.22 | Comandos for e while
#include <stdio.h>

#define VET_TAM 5

int main () {
    int vetor[VET_TAM];
    int num, i = 0, achou = 0;
    
    // Preenche vetor
    for (int i = 0; i < VET_TAM; i++) {
        printf("\nEntre com um número: ");
        scanf("%d", &vetor[i]);
    }

    printf("\n\nInforme o número a ser encontrado: ");
    scanf("%d", &num);
    
    while(i < VET_TAM) {
        if (vetor[i] == num) {
            achou = 1;
            break;
        }
        i++;
    }
    
    if (achou == 1) {
        printf("\nO número %d foi encontrado na posição %d do vetor", num, i);
    } else {
        printf("\nO número %d não foi encontrado no vetor", num);
    }
    return 0;
}
Fonte: elaborado pelo autor.

Teste o Código 2.22 utilizando a ferramenta Paiza.io.

Comando continue

Dando prosseguimento aos nossos estudos, vamos conhecer o comando continue. Segundo Damas (2016), um comando continue, dentro de um laço, possibilita que a execução de comandos corrente seja terminada, passando à próxima iteração do laço, ou seja, quando usamos o continue dentro de um laço, este é passado para a próxima iteração.

Vejamos, agora, um programa que percorrerá os números de 1 a 30, imprimindo na tela apenas os números ímpares. Nas iterações com números pares, o comando continue é usado para levar o programa para a próxima iteração. As linhas 3 a 8 declaram um comando for para iterar (percorrer) entre os números 1 a 30, imprimindo seu valor da tela, conforme mostra a linha 7. Contudo, na linha 4 é feito um teste condicional para verificar se o número da iteração corrente, representado pela variável i, é par. Caso seja, então o comando continue é executado, fazendo com que o laço for vá para a próxima iteração, sem executar as linhas que estão abaixo do comando continue. Nesse sentido, pode-se afirmar que o programa não imprime o valor dos números pares na tela.

Código 2.23 | Comando for – continue
#include <stdio.h>
int main() {
    for (int i = 1; i <= 30; i++) {
        if (i % 2 == 0) {
            continue;
        }
        printf("%d ", i);
    }
}
Fonte: elaborado pelo autor.

 Agora, você pode testar o código utilizando a ferramenta Paiza.io.

Reflita 

Segundo Damas (2016), o comando continue poderá apenas ser utilizado dentro de laços. No entanto, o comando break pode ser utilizado em laços ou nas instruções switch. Existem outras formas de continuar uma instrução dentro do laço?

Matrizes

Dando sequência aos nossos estudos, vamos entender como são aplicadas as matrizes. “Matrizes são arranjos de duas ou mais dimensões. Assim como nos vetores, todos os elementos de uma matriz são do mesmo tipo, armazenando informações semanticamente semelhantes” (EDELWEISS, 2014, p. 196).

Veja como fica a sintaxe de matrizes de duas dimensões:

tipo variável[M][N]

M representa a quantidade de linhas e N a quantidade de colunas.

Importante lembrar que:

Observe o programa a seguir: temos uma matriz 3x3 em que os valores são lançados de acordo com a linha e coluna e que é montada no formato da matriz. Nesse código, na linha 5 é declarada uma matriz 3x3. Das linhas 6 a 11, essa matriz é percorrida, célula por célula, por meio de um comando for, e os valores são lidos e adicionados na matriz (linhas 8 e 9). É possível notar que há um comando for (linhas 7 a 10) dentro de outro comando for (linhas 6 a 11). Isso é bastante comum de se ver quando se trabalha com matrizes bidimensionais, pois é preciso percorrer a matriz em duas dimensões (linhas e colunas), então, há um comando for para lidar com as linhas (o mais externo) e um para lidar com as colunas (o mais interno). Continuando a explicação do código, as linhas 12 a 18 tratam da impressão dos dados da matriz na tela. O processo é basicamente o mesmo das linhas 6 a 11, com a diferença que agora o comando printf é usando, em vez do scanf.

Veja o resultado da programação na Figura 2.13.

Código 2.24 | Comando for – matriz
#include <stdio.h>

int main() {
    int linha, coluna;
    int matriz[3][3];
    for (linha = 0; linha < 3; linha++) {
        for (coluna = 0; coluna < 3; coluna++) {
            printf("\nDigitar os valores da matriz para [linha %d, coluna %d]: ", linha + 1, coluna + 1);
            scanf("%d", &matriz[linha][coluna]);
        }
    }
    printf("\n\nVeja a sua Matriz\n");
    for (linha = 0; linha <= 2; linha++) {
        for (coluna=0;coluna<3;coluna++) {
            printf("%d\t", matriz[linha][coluna]);
        }
        printf("\n");
    }
    return 0;
}
Fonte: elaborado pelo autor.

Teste o Código 2.24 utilizando a ferramenta Paiza.io.

Figura 2.13 | Resultado da impressão de uma matriz 3x3
 a imagem mostra a matriz, com os valores: linha 1 coluna 1: 1, linha 1 coluna 2: 2 linha 1 coluna 3: 3, linha 2 coluna 1: 4, linha 2 coluna 2: 5, linha 2 coluna 3: 6, linha 3 coluna 1: 7, linha 3 coluna 2:8 e linha 3 coluna 3: 9.
Fonte: captura de tela da saída do programa Paiza.io elaborada pelo autor.

Para encerrar a seção, vamos trabalhar em um problema sobre matrizes: a ideia é descobrir se determinada matriz é diagonal ou não. Uma matriz diagonal é definida como uma matriz em que todos os elementos cujo i ≠ j são nulos. Esse problema utiliza estruturas de decisão e repetição e uma das possíveis soluções para o problema apresentado no código a seguir:

Código 2.25 | Comando for – matriz diagonal
#include <stdio.h>

int main() {
    int linha, coluna;
    int matriz[3][3];
    int eh_diagonal = 1;
    
    for (linha = 0; linha < 3; linha++) {
        for (coluna = 0; coluna < 3; coluna++) {
            printf("\nDigitar os valores da matriz para [linha %d, coluna %d]: ", linha + 1, coluna + 1);
            scanf("%d", &matriz[linha][coluna]);
        }
    }
    for (linha = 0; linha < 3; linha++) {
        for (coluna = 0; coluna < 3; coluna++) {
            if (coluna != linha && matriz[linha][coluna] != 0) {
                eh_diagonal = 0;
            }
        }
    }
    
    if (eh_diagonal == 1) {
        printf("\n\nSua matriz é diagonal!");
    } else {
        printf("\n\nSua matriz não é diagonal!");
    }
    return 0;
}
Fonte: elaborado pela autora.

Teste o Código 2.25 utilizando a ferramenta Paiza.io.

As linhas 8 a 13 do código apresentado são responsáveis por preencher a matriz 3x3 declarada na linha 5 com números lidos do teclado, assim como vimos no exemplo anterior. As linhas 14 a 20 verificam se a matriz informada é ou não uma matriz diagonal. Para isso, no comando if da linha 16 é verificado se o valor das variáveis “linha” e “coluna” são diferentes (essas variáveis representam os índices da matriz). Caso sejam, então verifica-se se o valor contido na posição matriz[linha][coluna] é diferente de 0 (zero). Isso é feito, pois como é dito no enunciado do problema, para uma matriz ser considerada diagonal, todos os elementos fora da diagonal principal (ou seja, elementos cuja posição da linha e coluna são iguais) devem ser nulos. Caso o resultado da condição da linha 16 seja verdadeira, então o valor da variável “eh_diagonal” passa a ser igual a 0 (zero), representando que aquela matriz não é uma matriz diagonal. Caso contrário, o valor da variável “eh_diagonal” continua sendo igual a 1 (um), conforme declarado na linha 6 do programa. Ao finalizar a execução do laço for, nas linhas 22 a 26 é feita a verificação da variável “eh_diagonal”. Caso seu valor seja igual a 1, então é impresso na tela a mensagem “Sua matriz é diagonal!” (linha 23), caso contrário, será impresso “Sua matriz não é diagonal!” (linha 25).

Exemplificando

Retomando o exemplo que demos no início desta seção, suponha um sistema de compras de passagens aéreas. Um cliente quer viajar para um destino em determinado dia e horário e, para cada horário de disponibilidade do voo, haverá uma quantidade fixa de poltronas disponíveis.

Para armazenar essas informações usaremos uma matriz 3x5, em que cada linha representa um horário de voo e cada coluna representa uma das seguintes situações: poltrona livre (que será representado pelo número inteiro 0), poltrona ocupada (que será representado pelo número inteiro 1) e poltrona indisponível (que será representado pelo número inteiro -1). Por exemplo, considerando a matriz a seguir, temos o seguinte:

  1. O primeiro horário de voo disponibiliza 4 poltronas, sendo que as três primeiras estão ocupadas e a 4ª poltrona está livre.
  2. O segundo horário conta com 5 poltronas, contudo, todas já estão ocupadas.
  3. E o terceiro e último horário tem apenas 2 poltronas e todas encontram-se livres.

Considerando a matriz anterior como entrada, leia o horário do voo solicitado pelo usuário (1, 2 ou 3) e informe uma das seguintes opções: “Seu voo foi reservado com sucesso!” ou “Não há poltronas disponíveis nesse voo!”. Caso o voo seja agendado, a matriz de informações do voo deve ser atualizada.

Para ficar mais interessante, crie um menu de opções bem simples, contendo “Reservar voo” e “Sair”.

Uma possível solução para o problema é apresentada a seguir:

Código 2.26 | Matriz - menu
#include <stdio.h>
int main() {
    // Matriz inicial
    int mat[3][5] = {
        1, 1, 1, 0, -1,
        1, 1, 1, 1, 1,
        0, 0, -1, -1, -1
    };
    
    int opcao;
    int numVoo;
    int reservou;
    
    do  {
        printf("\n1 - Reservar voo\n2 - Sair\nInforme a opção desejada: ");
        scanf("%d", &opcao);
        switch(opcao) {
            case 1: 
                printf("Informe o número do voo (1-3): ");
                scanf("%d", &numVoo);
                reservou = 0;
                if (numVoo >= 1 && numVoo <= 3) {
                    for(int i = 0; i < 5 && reservou == 0; i++) {
                        if (mat[numVoo - 1][i] == 0) {
                            reservou = 1;
                            mat[numVoo - 1][i] = 1;
                        }  
                    }
                    if (reservou == 1) printf("\nSeu voo foi reservado com sucesso!");
                    else printf("\nNão há poltronas disponíveis nesse voo!");
                } else {
                    printf("Opção inválida!");
                }
                break;
            case 2: 
                printf("\nSaindo...");
                break;
            default: printf("Opção inválida!");
        }
    } while (opcao != 2);
    return 0;
}
Fonte: elaborado pelo autor

Teste o Código 2.26 utilizando a ferramenta Paiza.io.

Pesquise mais 

O vídeo referido a seguir traz uma dinâmica muito interessante na aplicação de vetores e matrizes. Realizado de “aluno para aluno”, apresenta uma revisão bem minuciosa da programação em linguagem C:

PROGRAMAR em C - Revisão Vetores/Matrizes - Aula 27. [S. l.], 21 nov. 2012. (22 min. 28 s.). Publicado pelo canal De aluno para aluno.

Chegamos ao final desta seção. Procure praticar e testar os programas apresentados. Lembre-se: sempre existe uma forma diferente para resolver problemas computacionais. Sucesso!

Faça valer a pena

Questão 1

Análise o código apresentado a seguir:

#include <stdio.h>
int main() {
    int A[5]; 
    int I, SOMA = 0; 
    printf("\nSomatorio de elementos\n\n");
    for (I = 0; I <= 4; I++) {
        printf("\nInforme um valor para o elemento nr. %2d: ", I);
        scanf("%d", &A[I]);
    }
    for (I = 0; I <= 4; I++) {
        if (A[I] % 2 != 0) {
            SOMA += A[I]; 
        }
    }
    printf("\n\nA soma dos elementos equivale a: %d", SOMA);
    return 0;
}

Segundo Manzano (2013), podemos dizer que o código a seguir executa as seguintes instruções:

  1. Inicia o contador de índice, variável I, como 0 (zero).
  2. Lê os cinco valores, um a um.
  3. Verifica se o elemento é par; se sim, efetua a soma dos elementos. Apresenta o total de todos os elementos pares da matriz.

Após a análise do código, é correto o que se afirma em:

Tente novamente...

Esta alternativa está incorreta, leia novamente a questão e reflita sobre o conteúdo para tentar novamente.

Correto!

  1. Inicia o contador de índice, variável I, como 0 (zero).
  2. Lê os cinco valores, um a um.

Tente novamente...

Esta alternativa está incorreta, leia novamente a questão e reflita sobre o conteúdo para tentar novamente.

Tente novamente...

Esta alternativa está incorreta, leia novamente a questão e reflita sobre o conteúdo para tentar novamente.

Tente novamente...

Para o item III, o correto é:

  1. Verifica se o elemento é ímpar; se sim, efetua a soma dos elementos. Apresenta o total de todos os elementos ímpares da matriz.
Questão 2

Quando trabalhamos com o comando for, podemos encontrar três expressões separadas por ponto e vírgula. A primeira expressão é a inicialização, que é executada uma única vez, antes de começar o laço. A segunda é a condição de parada, em que é realizado um teste que determina se a condição é verdadeira ou falsa e, caso seja verdadeira, permanece no laço, caso falsa, encerra o laço e passa para a próxima instrução. A última expressão é executada depois dos comandos.

O nome dado para essa última expressão é:

Tente novamente...

Somatório está incorreto, pois é um termo que não pertence ao contexto da estrutura de repetição for.

Tente novamente...

Finalização está incorreto, pois é um termo que não pertence ao contexto da estrutura de repetição for.

Tente novamente...

Processamento está incorreto, pois é um termo que não pertence ao contexto da estrutura de repetição for.

Correto!

Incremento, pois a partir dela é possível incrementar uma repetição de acordo com um contador específico. É importante lembrar, ainda, que o incremento é executado depois dos comandos, por exemplo, “x++” incrementado 1 para o seu valor final.

Tente novamente...

Substituição está incorreto, pois é um termo que não pertence ao contexto da estrutura de repetição for.

Questão 3

Analise o código do programa a seguir, em que foi utilizada a estrutura de repetição com variável de controle:

#include <stdio.h>
int main() {
  int contador; //variável de controle do loop
  for(contador = 1; contador <= 10; contador++) {
      printf("%d ", contador);
  }
  return 0;
}

Analisando o programa apresentado, assinale a alternativa que corresponde à leitura que podemos fazer da linha 4.

Tente novamente...

Incorreta, pois na segunda expressão o “contador” está condicionado a ser menor ou igual a 10. Além disso, na terceira expressão, “contador” será realizado o incrementado de 1 para ao seu valor.

Referências

02 - EXERCÍCIO - Estruturas de repetição em C. [S. l.], 10 mar. 2017. 1 vídeo (10 min 38s). Publicado pelo canal Hélio Espiridião. Disponível em: https://cutt.ly/njEroNN. Acesso em: 10 jan. 2021.

13 - PROGRAMAÇÃO em Linguagem C - Desvio Condicional Aninhado - if / else if. [S. l.], 27 fev. 2015. 1 vídeo (11 min. 12 s.). Publicado pelo canal Bóson Treinamentos. Disponível em: https://cutt.ly/rjErauV. Acesso em: 10 jan. 2021.

DAMAS, L. Linguagem C. 10. ed. Rio de Janeiro: LTC, 2016.

EDELWEISS, N. Algoritmos e programação com exemplos em Pascal e C. Porto Alegre: Bookman, 2014.

MANZANO, J. A. N. G. Estudo dirigido de linguagem C. 17. ed. rev. São Paulo: Érica, 2013.

MANZANO, J. A. N. G. Linguagem C: acompanhada de uma xícara de café. São Paulo : Érica, 2015.

MIZRAHI, V. V. Treinamento em linguagem C. 2. ed. São Paulo: Pearson Prentice Hall, 2008.

PROGRAMAÇÃO C - Aula 07 - while, do-while, for - Estruturas de repetição. [S. l.], 10 abr. 2012. 1 vídeo (15 min. 56 s.). Publicado pelo canal Peterson Lobato. Disponível em: https://cutt.ly/ajErsxs. Acesso em: 10 jan. 2021.

PROGRAMAR em C - Revisão Vetores/Matrizes - Aula 27. [S. l.], 21 nov. 2012. 1 vídeo (22 min. 28 s.). Publicado pelo canal De aluno para aluno. Disponível em: https://cutt.ly/2jErdMl. Acesso em: 10 jan. 2021.

SCHILDT, H. C Completo e total. 3. ed. São Paulo: Pearson Prentice Hall, 2005.

SOFFNER, R. Algoritmos e Programação em Linguagem C. São Paulo: Saraiva, 2013.

Bons estudos!

AVALIE ESTE MATERIAL

OBRIGADO PELO SEU FEEDBACK!