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 x 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 x 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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
Agora que você já sabe de tudo isso, faça o problema O Maior usando if e 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!
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
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 retorna "EOF" se for chamado e não houver mais nada para ser lido, ou seja, para ler um inteiro, salvá-lo em x 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 }".
O for serve para simplificar o uso de um loop. O comando "for(comando_inicio; condição; comando_fim){ todos_os_comandos; }" equivale a:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
comando_inicio; | |
while(condição){ | |
todos_os_comandos; | |
comando_fim; | |
} |
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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <cstdio> | |
int main(){ | |
for(int n=1; n<=10; n++) printf("%d ", n); | |
printf("\n"); | |
} |
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 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 que começará com o valor zero. Depois vamos ler o valor de n, e faremos um loop que irá declarar um variável começando com o valor 1 e, a cada repetição, vamos adicionar 1 a seu valor. O loop deverá se repetir enquanto for menor ou igual a n apenas para contarmos quantos números vamos ler. Dentro do loop vamos declarar uma variável inteira . Iremos ler um número inteiro e salvá-lo em . Feito isso, somaremos o valor de ao valor de soma. Assim, iremos ter feito o processo de ler o valor de um número e somá-lo a , exatamente n vezes, que é o número de inteiros na entrada! Ao final do loop, iremos ter somado os n números a e basta que imprimamos o seu valor, seguido da quebra de linha. Vamos ao código:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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; | |
} |
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 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 a se for maior que dez, escrevendo portanto a linha "if(davez>10) soma+=davez;". O código ficaria assim:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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 e 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" - a dividido por b. Se a e b forem 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 b 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.