Programação Básica 02 - IF e FOR

Aula de Rogério Júnior

 

É quase impossível encontrar, hoje, problemas que se resolvam sem o uso de "if" e "for". Esses comandos já vem no C++, não pertencendo a nenhuma biblioteca. O if significa "se" e é como usamos os operadores lógicos de uma linguagem. Ele condiciona um comando a uma condição qualquer, executando-o apenas se ela for verdadeira. Sua gramática é "if(condição){ faça isso }". Ou seja, chamamos o if, abrimos parênteses e dentro deles inserimos uma condição qualquer. Se a condição for verdadeira, o programa executará tudo que está dentro das chaves que sucedem o if. Vale lembrar que, se dentro das chaves houver um único comando, elas não são necessárias e o programa executará o comando seguinte ao if somente se a condição nele for verdadeira. Observe que não é necessário inserir ";" após as chaves.

Desse modo, uma linha que imprime um número salvo em uma variável chamada x somente se ele for maior que 10 fica assim: "if(x>10){ printf("%d", x);}" ou simplesmente "if(x>10) printf("%d", x);". Além disso, após um if, também podemos chamar um else, que significa "senão". A gramática seria "if(condição){ faça isso } else {faça aquilo}", ou seja, se a condição for verdadeira, faça isso, se não (se ela for falsa) faça aquilo. Lembre-se que o que está entre as chaves pode ser qualquer série de comandos, inclusive outros if's e else's. Dito isso, uma linha que salvaria o módulo de um inteiro em uma variável mod seria:  "if( x>0 ){ mod=x } else { mod = -x}". Vale lembrar que o operador de igualdade é "==", e não "=". Para imprimir um número x apenas se ele for igual a 5, devemos escrever "if(x==5) printf("%d", x);". Lembre-se que "=" significa recebe e "if(x=5)" faria a variável receber o valor 5. Outros operadores comuns são o de diferença (!=), o de menor ou igual (<=), maior ou igual (>=), menor que (<) e maior que (>).

Estudar o if envolve estudar os operadores lógicos "&&" e "||". O "&&" ou "and" significa "e", ou seja, se escrevermos "if(condição1 && condição2){ faça isso }", o programa fará isso apenas se a condição1 e a condição2 forem ambas verdade. Ele pode ser usado várias vezes, ou seja, se quisermos fazer algo apenas se três condições forem verdade ao mesmo tempo, podemos escrever "if(condição1 && condição2 && condiçao3)".

O operador "||" ou "or" significa ou, ou seja, se escrevermos "if(condição1 || condição2){ faça isso }", o programa fará isso se a condição1 ou condição2 forem verdade. Assim como o && ele também pode ser usado várias vezes. Dito isso, vejamos o código de um programa que lê um número n na tela e, em seguida, imprime uma linha escrita "esta no intervalo" se um número estiver entre 5 e 10 (incluindo 5 e 10) e que imprime "nao esta no intervalo" caso contrário.


#include <cstdio> // scanf e printf
int main(){
int n; // declaro a variavel n
scanf("%d", &n); // leio o valor na tela e salvo em n
if(5<=n && n<=10) printf("esta no intervalo\n"); // se n estiver entre 5 e 10, imprimo que ele está no intervalo
else printf("nao esta no intervalo\n"); // se não, imprimo que ele não está no intervalo
return 0;
}

view raw

limit.cpp

hosted with ❤ by GitHub

Agora que você já sabe de tudo isso, faça o problema O Maior usando if else, ao invés da fórmula que o site recomenda. Se você não conseguir, segue o código da solução, mas realmente tente fazer o problema antes!


#include <cstdio> //scanf e printf
int main(){
int a, b, c; // declaro as variáveis a, b e c
scanf("%d %d %d", &a, &b, &c); // leio os números na tela e salvo em a, b e c
if(a>=b && a>=c) printf("%d eh o maior\n", a); // se a for maior ou igual que b e c, ela é a maior
else{ // senão
if(b>=a && b>=c) printf("%d eh o maior\n", b); // se b for maior ou igual que a e c, ela é a maior
else printf("%d eh o maior\n", c); // se não foi a nem b, então c é a maior
}
return 0;
}

view raw

greater.cpp

hosted with ❤ by GitHub

Vamos falar agora do for. Para começar, ele é um loop, ou seja, ele condiciona a repetição de um comando enquanto determinada condição for verdadeira. O loop mais simples é o while. Sua gramática é "while(condição) { faça isso }", ou seja, enquanto a condição for verdadeira, faça o que estiver entre as chaves. Assim como o if, ele não precisa de de ; ao fim das chaves e, se entre as chaves houver um único comando, elas não são necessárias. Nos loops, é comum o uso dos operadores +=, -=, ++ e --. Se escrevemos "a+=b", então adicionamos em a o valor de b. É semelhante ao comando "a=a+b". Analogamente, "a-=b" subtrai da variável a o valor de b. O comando "a++" adiciona 1 ao valor de a e "a--" subtrai 1 ao seu valor. Veja, por exemplo, um código que imprime todos de 1 até 10 em uma única linha, separados um a um por um espaço em braco e uma quebra de linha ao final do programa:


#include <cstdio>
int main(){
int n=1; // declaro a variável n começando com o valor 1
while(n<=10){ // enquanto n for menor ou igual a 10
printf("%d ", n); // imprima o valor de n e um espaço
n++; // e adicione 1 ao seu valor
}
printf("\n"); // imprima a quebra de linha
return 0;
}

view raw

till.cpp

hosted with ❤ by GitHub

Veja que a cada repetição do loop, o programa imprime o valor de n e adiciona 1 ao seu valor. Após 10 repetições, seu valor será 11, e, quando no começo do loop, a condição for checada, ela será falsa e o loop acabará. Vale lembrar que o while checa a condição apenas no começo do loop, ou seja, ele não acaba assim que a condição se torna falsa, mas apenas no momento em que ele recomeça com a condição falsa.

Vale lembrar que o scanf retorna "EOF" se for chamado e não houver mais nada para ser lido, ou seja, para ler um inteiro, salvá-lo em e executar uma série de comandos até que não haja mais números na entrada, devemos escrever "while(scanf("%d", &x)!=EOF){ série de comandos }".

for serve para simplificar o uso de um loop. O comando "for(comando_inicio; condição; comando_fim){ todos_os_comandos; }" equivale a:


comando_inicio;
while(condição){
todos_os_comandos;
comando_fim;
}

view raw

for.cpp

hosted with ❤ by GitHub

Ou seja, o primeiro parâmetro do for (comando_inicio) é um comando realizado antes e fora do loop. Este loop será realizado enquanto o segundo parâmetro (condição) for verdade. O loop envolverá a repetição do que houver entre as chaves ( todos_os_comandos;) seguido do terceiro parâmetro (comando_fim). Veja como imprimir os números de 1 a 10 novamente, mas agora usando o for:


#include <cstdio>
int main(){
for(int n=1; n<=10; n++) printf("%d ", n);
printf("\n");
}

view raw

till10for.cpp

hosted with ❤ by GitHub

Um uso comum do loop é ler um entrada de quando só conhecemos seu tamanho após lê-la. Façamos, por exemplo, um programa que imprime a soma de números. A entrada (o que será lido na tela) terá na primeira linha o valor de n, que é a quantidade de números a serem somados e, na segunda linha estarão os n números inteiros. A saída (o que o programa deve imprimir) deve ser a soma dos n números. Para isso, vamos declarar uma variável soma que começará com o valor zero. Depois vamos ler o valor de n, e faremos um loop que irá declarar um variável i começando com o valor 1 e, a cada repetição, vamos adicionar 1 a seu valor. O loop deverá se repetir enquanto i for menor ou igual a n apenas para contarmos quantos números vamos ler. Dentro do loop vamos declarar uma variável inteira davez. Iremos ler um número inteiro e salvá-lo em davez. Feito isso, somaremos o valor de davez ao valor de soma. Assim, iremos ter feito o processo de ler o valor de um número e somá-lo a soma, exatamente n vezes, que é o número de inteiros na entrada! Ao final do loop, iremos ter somado os n números a soma e basta que imprimamos o seu valor, seguido da quebra de linha. Vamos ao código:


#include <cstdio> // scanf e printf
int main(){
int n, soma=0; // declaro a variável n e a variável soma com valor zero
scanf("%d", &n); // leio o número na tela e salvo em n
for(int i=1; i<=n; i++){ // repito n vezes o processo entre chaves
int davez; // declaro o inteiro davez
scanf("%d", &davez); // leio o valor na tela e salvo em davez
soma+=davez; // somo o valor de davez à variável soma
}
printf("%d\n", soma); // imprimo o valor de soma seguido da quebra de linha
return 0;
}

view raw

soma.cpp

hosted with ❤ by GitHub

Se a entrada for, por exemplo:

5

11 2 7 15 -2

O programa deve gerar um única linha, a soma dos cinco números:

33

Vamos juntar o if e o for e escrever um programa que, dados números, soma todos os que são maiores que dez. Basta repetir o código anterior, mas agora, no lugar da linha "soma+=davez;", iremos apenas somar o valor de davez a soma se davez for maior que dez, escrevendo portanto a linha "if(davez>10) soma+=davez;". O código ficaria assim:


#include <cstdio> // scanf e printf
int main(){
int n, soma=0; // declaro a variável n e a variável soma com valor zero
scanf("%d", &n); // leio o número na tela e salvo em n
for(int i=1; i<=n; i++){ // repito n vezes o processo entre chaves
int davez; // declaro o inteiro davez
scanf("%d", &davez); // leio o valor na tela e salvo em davez
if(davez>10) soma+=davez; // se davez for maior que 10, somo o seu valor à variável soma
}
printf("%d\n", soma); // imprimo o valor de soma seguido da quebra de linha
return 0;
}

Observe que, agora, na mesma entrada anterior:

5

11 2 7 15 -2

o programa deverá gerar uma única linha com a soma dos números que são maiores que 10, que são 11 e 15:

26

Vale lembrar dois comando muito importantes que podemos usar em um loop: break continue. O primeiro significa, quebra, e é usado para para um loop. Se escrevemos o comando "break;" o programa irá parar imediatamente o loop em que o break foi escrito. Se abrimos dois loops e, dentro do segundo, mandamos o programa dar break, apenas o segundo loop será encerrado. O continue é semelhante ao break, mas em vez de fechar o loop, ele apenas pula para o próximo passo, ou seja, se chamarmos o comando "continue;" ele vai para a próxima repetição no momento em que o comando é executado, ignorando, naquela repetição, o resto do loop e já indo direto para a próxima.

Vamos lembrar apenas alguns operadores matemáticos para resolver problemas:

"a/b" - dividido por b. Se aforem inteiros, será o valor do piso da divisão, ou seja, 7/2 é 3.5, mas como 7 e 2 são inteiros 7/2 seria igual a 3 em C++. Se fosse 7.0/2, então 7.0 não é inteiro, é uma double, e 7.0/2 seria 3.5.

"a*b" - a multiplicado por b.

"a%b" - o resto que a deixa na divisão por b. 7%3 é 1, pois 7 dividido por 3 é dois e deixa resto 1, e 6%3 é zero, pois 6 dividido por 3 é 2 e deixa resto 0. Vale lembrar que um número a só é múltiplo de b se o resto da divisão de a por for zero, ou seja, se a%b==0.

Agora que você já sabe de tudo isso, tente fazer os seguintes problemas do URI. Se ainda não tem uma conta neste site, clique aqui.

Problema 1 - Notas e Moedas

Problema 2 - Teste de Seleção 1

Problema 3 - Intervalo

Problema 4 - Lanche

Problema 5 - Média 3

Problema 6 - Coordenadas de um ponto

Problema 7 - Múltiplos

Problema 8 - Média Ponderada

Problema 9 - Maior e Posição

Problema 10 - Soma de ímpares Consecutivos II

Problema 11 - Senha Fixa

Problema 12 - Crescente e Decrescente

Problema 13 - Jogo de Varetas (Problema com solução no site. Para vê-la, clique aqui)

Problema 14 - Triângulos (Problema da 1ª fase da P1 de 2014, e o suficiente para passar de fase). Solução aqui.

Se tiver alguma dúvida em algum problema, vá na página inicial do curso e preencha o formulário para enviar sua pergunta.


As aulas do Curso Noic de Informática são propriedade do Noic e qualquer reprodução sem autorização prévia é terminantemente proibida. Se você tem interesse em reproduzir algum material do Curso Noic de Informática para poder ministrar aulas, você pode nos contatar por esta seção de contato para que possamos fornecer materiais específicos para reprodução.