Você está na página 1de 83

Módulo 3

Programação Estruturada
TGPSI
PSI - 1.º ano
Elsa Ascenso
Programação Estruturada

• Permitem organizar a complexidade de um programa;


• Permite reduzir custos de desenvolvimento de sistemas;
• Permite a criação de blocos de instruções que podem ser chamadas
várias vezes no mesmo programa ou em vários programas.
Programação Estruturada

• Para resolver um problema complexo, devemos começar por


decompô-lo em pequenas partes, ou seja, em pequenos
subproblemas.
Funções

• Uma função é um conjunto de instruções que recebem entradas,


fazem alguns cálculos específicos e produzem uma saída.
•O objetivo é juntar algumas tarefas comuns ou repetidas e criar
uma função para que, em vez de escrever o mesmo código
repetidamente para diferentes entradas, possamos chamar a função.
• De uma forma simples, uma função é um bloco de código que só é
executado quando é chamado.
Funções

• Numa função, existem dados, a que damos o nome de parâmetros ou


argumentos
• As funções podem ser usadas sempre que é necessário.
• As funções são identificadas por um nome
• Ao usar este nome estamos a chamar a função
• Após sua execução, programa volta ao ponto do programa situado
imediatamente após a chamada
• A volta ao programa que chamou a função é denominada de retorno
Funções

• A chamada de uma função pode passar informações (argumentos) para o


processamento da função

• Argumentos = lista de expressões


• Lista pode ser vazia
• Lista aparece entre parênteses após o nome da função

Ex: int Soma (int x, int y)


{
}
O Retorno da Função
• Uma função pode retornar resultados ao programa que a chamou
• return (resultados);

• O valor da variável local resultados é passado de volta como o valor da função

• Valores de qualquer tipo podem ser retornados


• Funções predicado: funções que retornam valores
• Procedimentos: funções que não retornam valores

• Sintaxe: void myFunction() { Exemplo explicado


// Código a ser executado •function()é o nome da função
} •Void significa que a função não tem um valor de retorno.
• Exemplo: void function (int x) { •dentro da função (o corpo), adicione o código que define o que a
função deve fazer
• }
Procedimentos / Funções

• Procedimentos – são estruturas que agrupam um conjunto de


comandos, que são executados quando o procedimento é chamado.

• Funções – são procedimentos que retornam um valor quando


terminam.
Procedimentos / Funções

• Um procedimento em C++ tem a mesma sintaxe que uma função,


mas normalmente não devolve qualquer valor.
• Esse facto é indicado colocando a palavra-chave void no
local do tipo do valor de devolução.
Chamar uma função

As funções declaradas não são executadas imediatamente.


São "guardadas para uso posterior" e serão executadas quando forem
chamadas.
Para chamar uma função, escreve-se:
o nome da função seguido de dois parênteses () e um ponto e vírgula;
No exemplo a seguir, funcao() é usado para imprimir um texto (a ação),
quando é chamado:

• #include <iostream>
• using namespace std;

• void funcao() {
• cout << “codigo a ser executado – faz qualquer coisa!";
• }

• int main() {
• funcao();
• return 0;
• }
Uma função pode ser chamada várias vezes:

• #include <iostream>
• using namespace std;

• void funcao() {
• cout << “codigo a ser executado – faz qualquer coisa!";
• }

• int main() {
• funcao();
• funcao();
• funcao();
• return 0;
• }
Declaração e Definição de Função

• Uma função em C++ tem duas partes:


• Declaração – o tipo de retorno, o nome da função e os parâmetros (caso haja)
• Definição - o corpo da função, ou seja, o código a ser executado
Declaração e Definição de Função

• Sintaxe
• void funcao() { // declaracao
// o corpo da função, ou seja, o código a ser executado (definicao)
•}
Declaração e Definição de Função
Muito Importante: Se uma função definida pelo utilizador, como função()
for declarada após a função main(), irá ocorrer um erro

• int main() {
funcao();
return 0;
}

void funcao() {
cout << " codigo a ser executado – faz qualquer coisa!";
}

// Erro
Porém,

Declaração e Definição de Função

No entanto, é possível separar a declaração e a definição da função - para


otimização do código.
É frequente, ver programas em C++ que têm declaração de função acima main() e
definição de função abaixo main().
Isso tornará o código mais organizado e fácil de ler:
Porém,

Declaração e Definição de Função


• #include <iostream>
• using namespace std;
// declarar funcoes
void funcao();
// O método principal
int main() {
funcao(); // chamar a funcao
return 0;
}
// definicao da funcao
void funcao() {
cout << “codigo a ser executado – E ano novo, benvindo 2023!”;
}
funcao.cpp
• #include <iostream>
• using namespace std;
• void funcao() {
• cout <<“codigo a ser executado – faz qualquer coisa! \n”;
• }
• int main () {
• funcao ();
• funcao ();
• funcao ();
• return 0;
• }
funcaoerro.cpp
• #include <iostream>
• using namespace std;
• int main () {
• funcao ();
• funcao ();
• funcao ();
• return 0;
• }

• void funcao() {
• cout <<“codigo a ser executado – faz qualquer coisa! \n”;
• }
• /*erro na declaração da função*/
funcaoDD.cpp
• #include <iostream>
• using namespace std;
• //declarar funcoes
• void funcao();
//o método principal
• int main () {
• funcao ();
• return 0;
• }
//definição da função
• void funcao() {
• cout <<“codigo a ser executado – faz qualquer coisa! \n”;
• }
Parâmetros e Argumentos
• As informações podem ser passadas para funções como um
parâmetro. Os parâmetros funcionam como variáveis dentro
da função.
• Os parâmetros são distinguidos após o nome da função,
entre parênteses.
• Pode-se adicionar o número de parâmetros que se quiser,
basta separá-los com uma vírgula
Parâmetros e Argumentos

O exercício a seguir tem uma função que recebe


uma string primeiroultimo chamado como parâmetro.

Quando a função é chamada, lemos um primeiro nome, que é


usado dentro da função para imprimir o nome completo
Parâmetros e Argumentos
primeironome.cpp
#include <iostream>
#include <string>
using namespace std;
void funcao (string primeiroultimo) {
cout << primeiroultimo << " do 10F. \n";
}
int main() {
funcao(“Rhyanne");
funcao(“Tomas");
funcao(“Rafael");
return 0;
}
Parâmetros e Argumentos
Quando um parâmetro é passado para a função, ele é
chamado de argumento.

No exercício anterior:

primeiroultimo é parâmetro
Rhyanne, Tomas e Rafael são argumentos
Valor do Parâmetro Padrão

Pode-se usar um valor de parâmetro padrão, usando o sinal de


igual (=)
No exercício seguinte, se chamarmos a função sem um
argumento, ela usará o valor padrão (“Portugal"):
Valor do Parâmetro Padrão
paises.cpp
#include <iostream>
#include <string>
using namespace std;
void funcao(string pais = "Portugal") {
cout << pais << "\n";
}
int main() {
funcao("Franca");
funcao("Brasil");
funcao(“Ucrania");
funcao();
funcao();
return 0;
}
Parâmetros e Argumentos

Um parâmetro com um valor padrão geralmente é conhecido


como "parâmetro opcional".
No exercício anterior:
pais é um parâmetro opcional
e “Portugal“ é o valor padrão.
Múltiplos Parâmetros

Dentro da função, pode-se adicionar o número de parâmetros


que se quiser.
Múltiplos Parâmetros – Exercício
multiplosparametros.cpp
#include <iostream>
#include <string>
using namespace std;
void funcao(string primeiroultimo, int idade) {
cout << primeiroultimo << " do 10F - " << idade << " anos. \n";
}
int main() {
funcao(“Ana", 17);
funcao(“Belchior", 15);
funcao(“Bernardo", 18);
return 0;
}
Múltiplos Parâmetros

Quando se trabalha com vários parâmetros, a chamada de


função deve ter o mesmo número de argumentos e
parâmetros, e os argumentos devem ser apresentados pela
mesma ordem.
C++ A palavra-chave de retorno
Valores de retorno

A palavra-chave void, utilizada nos exemplos anteriores, indica


que a função não deve retornar um valor.
Se se quiser que a função retorne um valor, usa-se um tipo de
dados (como int, string, ou os outros que já aprendemos) em
vez de void, e usa-se a palavra chave return dentro da função.
C++ A palavra-chave de retorno
Valores de retorno - Exemplo
somanumfuncao.cpp
#include <iostream>
using namespace std;

int funcao(int x) {
return 5 + x;
} Devolve:
int main() { 8
cout << funcao(3);
return 0;
} //Este exemplo retorna a soma de uma função
com um parâmetro.
C++ A palavra-chave de retorno
Valores de retorno - Exemplo
somavarfuncao.cpp
#include <iostream>
using namespace std;

int funcao(int x, int y) {


return x + y;
}
Devolve:
int main() {
cout << funcao (5, 3); 8 = (5+3)
return 0;
}
//Este exemplo retorna a soma de uma função
com dois parâmetros.
C++ A palavra-chave de retorno
Valores de retorno - Exemplo
funcaoresultado.cpp
#include <iostream>
using namespace std;

int funcao(int x, int y) {


return x + y;
}
Devolve:
int main() {
int z = funcao(5, 3);
8 = (5+3)
cout << z;
return 0;
}
//Armazenar o resultado numa variável.
Passagem de argumentos

Na linguagem C++ os parâmetros podem ser passados para


uma função por valor ou por referência.
Passagem por valor

Até agora e em todas as funções implementadas, a passagem


de parâmetros utilizada foi por valor.
Isto significa que quando uma função é chamada com
parâmetros, o que lhe é passado é o valor da variável.
Passagem por valor

Por exemplo a função


soma(int n1, int n2)
do programa da
listagem 1.30 recebe
os valores 5 e 3 e não
as variáveis x e y
C++ Passar por referência

Como já vimos, nos exercícios / exemplos anteriores, usamos


variáveis normais quando passamos parâmetros para uma
função.
Também se pode passar uma referência para a função.

Isso pode ser útil quando se precisa alterar o valor dos


argumentos.
C++ Passar por referência

Nestas situações, em que é necessário alterar o valor de uma


variável dentro de uma função que foi definida noutra função,
usa-se a passagem por referência.
O programa seguinte apresenta a função divisão inteira que
tem quatro argumentos, dois passados por valor (int dividendo
e int divisor) e dois por referência (int &quociente e int &resto).
A sintaxe da linguagem C++ obriga a que os argumentos
passados por referência são identificados por um & entre o tipo
de dados e o identificador da variável.
C++ Passar por referência
#include <iostream>
void divisaoInteira (int dividendo , int divisor , int &quociente , int &resto )
{
quociente = 0;
while (dividendo>=divisor)
{
dividendo=dividendo−divisor;
quociente=quociente + 1;
}
resto=dividendo;
}
int main ( )
{
int D=23, d=5, q , r ;
divisaoInteira (D, d , q , r );
cout<<"O quociente da divisao inteira de “ << D << " por “ << d << " e “ << q << “\n”;
cout<<"O resto da divisao inteira de “ << D << " por "<< d <<" e "<< r <<“\n”;
return 0;
}
C++ Passar por referência
Desta forma as variáveis q e r definidas na função main que
dentro da função divisaoInteira são quociente e resto,
respetivamente. Isto significa que qualquer alteração dentro
da função divisaoInteira nas variáveis quociente ou resto
altera o valor das variáveis q e r da função main
C++ Passar por referência
trocavalores.cpp
#include <iostream>
using namespace std;
void trocarnumeros(int &x, int &y) {
int z = x;
x = y;
y = z;
}
int main() {
int primeironum = 10;
int segundonum = 20;
cout << "Antes de trocar: " << "\n";
Antes de trocar:
cout << primeironum << segundonum << "\n";
1020
// Chama a função, que irá alterar os valores de primeironum com segundonum
Depois de trocar:
trocarnumeros(primeironum, segundonum);
cout << "Depois de trocar: " << "\n";
2010
cout << primeironum << segundonum << "\n";
return 0;
}
Passar matrizes como parâmetros de função
Pode-se passar arrays para uma função
funcaomatriz.cpp
#include <iostream>
using namespace std;
Devolve:
void funcao(int numeros[5]) {
for (int i = 0; i < 5; i++) { 10
cout << numeros[i] << "\n"; 20
} 30
} 40
50
int main() {
int numeros[5] = {10, 20, 30, 40, 50};
funcao(numeros);
return 0;
}
Passar matrizes como parâmetros de função
Explicação do exercício anterior

A função (funcao) recebe uma matriz como seu parâmetro


(int numeros[5]) e percorre os elementos da matriz com
o ciclo for.
Quando a função é chamada dentro da função principal
main(), passamos a matriz numeros, que gera os elementos
da própria matriz.
Repara que, ao chamar a função, só se precisa usar o
nome da matriz ao passá-la como
argumento funcao(numeros).
No entanto, a declaração completa do array é necessária
no parâmetro da função ( int myNumbers[5]).
ToDo: Calcular área

Criar um programa que calcule a área de um quadrado/retângulo


Lembrar que a área se calcula lado*lado
Mostrar no ecrã 3 situações:
- Quando não se passa nenhum argumento;
- Quando se passa um argumento;
- Quando se passam dois argumentos.
ToDo: Calcular área
funcaoarea.cpp
#include <iostream>
using namespace std;
void area(float lado1 = 2.5, float lado2 = 3.5) {
cout <<“Area:” << lado1*lado2 <<“\n”;
} Devolve:

int main() 8.75


{
cout <<“funcao sem argumentos \n”;
area(); 23,10
cout << “um argumento \n”;
area(6.6); 300
cout << “dois argumentos \n”;
area(10,30);
return 0;
}
ToDo: Calculadora

• Vamos criar uma calculadora completa em C++ e, entender o que são


e para que servem os protótipos de funções
ToDo: Calculadora

• As funções sum(), sub(), mult() e divis() irão fazer as operações de soma,


subtração, multiplicação e divisão.
• Todas recebem dois dados, do tipo float e retornam um resultado também em
float.

• Exceto na função divis().


• É preciso verificar se o denominador é diferente de 0.
Se for, retorna a divisão correta.
Se não for, retorna uma mensagem dizendo que não é possível dividir por 0
ToDo: Calculadora

• A função menu() irá ser a responsável por mostrar as possíveis operações matemáticas.
• O utilizador escreve um valor para escolher a opção.
Se a opção for 0, o programa sai do looping DO WHILE da menu() e se encerra o
programa.
Se a opção for qualquer outro número, o programa pede os dois valores que se vão
usar para calcular a operação e em seguida vai para SWITCH, onde selecionamos a
operação corretamente.

• Passamos os números escritos pelo utilizador para a respectiva função, ela retorna o
resultado que iremos mostrar no ecrã.
ToDo: Calculadora

• No fim, o menu das opções é mostrado novamente, caso o utilizador


queira escolher outra opção e fazer outro cálculo.
Vamos ver como fica o código:
#include <iostream>
using namespace std;
float sum(float a, float b) ToDo: Calculadora
{
return a+b;
}

float sub(float a, float b)


{
return a-b;
}

float mult(float a, float b)


{
return a*b;
}
float divis(float a, float b)
{
if(b!=0)
return a/b;
else
cout<<"Nao se pode dividir por 0\n";
ToDo: Calculadora
}

void menu()
{
int op;
float a, b;
do
{
cout<<"0. Sair\n";
cout<<"1. Somar\n";
cout<<"2. Subtrair\n";
cout<<"3. Multiplicar\n";
cout<<"4. Dividir\n";
cin >> op;
if (op) {
cout<<"Primeiro numero: \n ";
cin >> a; ToDo: Calculadora
cout<<“Segundo numero: \n ";
cin >> b;

switch(op)
{
case 1: cout <<"Soma: " << sum(a,b) << “\n”;
break;
case 2: cout<<"Diferença: " << sub(a,b) << “\n”;
break;
case 3: cout<<"Produto: " << mult(a,b) << “\n”;
break;
case 4:
if(b)
cout<<"Divisão: " << divis(a,b) << “\n”;
else divis(a,b);
break;
default: cout<<"Opção inválida \n";
}
} else
cout<<“A sair...\n";
}while(op);
}
ToDo: Calculadora

int main() {
menu();
return 0;
}

Na função main() simplesmente chamamos a função responsável por mostrar o menu.


E só.
Function Overloading
Sobrecarga de Função

• Isto significa que várias funções podem ter o mesmo nome


desde que tenham diferentes parâmetros
Function Overloading
Sobrecarga de Função

• Exemplo:
• int funcao(intx)
float funcao(float x)
double funcao(double x, double y)
Function Overloading
Sobrecarga de Função

• No próximo exemplo, temos duas funções que somam mas


números de tipos diferentes.
• funcaosobrecarga.cpp
• #include <iostream>
• using namespace std;

• int cargaFuncao (int x, int y) { Function Overloading


• return x + y;
Sobrecarga de Função
• }

• double cargaFuncao (double x, double y) {


• return x + y;
• } Devolve:
Inteiro 13
Decimal 10.56
• int main() {
• int Num1 = cargaFuncao(8, 5);
• int Num2 = cargaFuncao(4.3, 6.26);
• cout << “Valores Inteiros " << Num1 << "\n";
• cout << “Valores Decimais " << Num2;
• return 0;
• }
Function Overloading
Sobrecarga de Função
Em vez de definir duas funções que
devem fazer a mesma coisa, é melhor
sobrecarregar uma.
No exemplo a seguir, sobrecarregamos
a função cargaFunc para funcionar para
ambos os tipos int e double
#include <iostream>
using namespace std;

int cargaFunc(int x, int y) { Function Overloading


return x + y; Sobrecarga de Função
}

double cargaFunc(double x, double y) {


return x + y;
} Devolve:
Inteiro 13
Decimal 10.56
int main() {
int Num1 = cargaFunc(8, 5);
double Num2 = cargaFunc(4.3, 6.26);
cout << "Inteiro " << Num1 << "\n";
cout << "Decimal " << Num2;
return 0;
}
Function Overloading
Sobrecarga de Função

• Muito importante
• Várias funções podem ter o mesmo nome, desde que o
número e/ou o tipo de parâmetros sejam diferentes.
Recursividade

• Recursividade ou Recursão é a técnica de fazer uma chamada


de função em si.
• Esta técnica fornece uma maneira de quebrar problemas
complicados em problemas simples que são mais fáceis de
resolver.
• A recursividade pode ser um pouco difícil de entender. A
melhor maneira de descobrir como funciona é experimentar.
Recursividade - exemplo

• Adicionar dois números é fácil, mas adicionar um intervalo de


números é mais complicado.
• No exemplo a seguir, a recursividade é usada para somar um
intervalo de números, dividindo-o na simples tarefa de somar
dois números
• recursividade.cpp ou recursao.cpp

• #include <iostream>
• using namespace std; Recursividade
• int soma(int k) { exemplo
• if (k > 0) {
• return k + soma(k - 1);
• } else {
• return 0;
• }
• }

• int main() {
• int result = soma(10);
• cout << result;
• return 0;
• }
Recursividade - exemplo

Quando afunção sum() é chamada, ela adiciona o parâmetro k à


soma de todos os números menores que k e retorna o resultado.
Quando k se torna 0, a função retorna apenas 0.
Como o programa segue os seguintes passos:
10 + soma(9)
10 + ( 9 + soma(8) )
10 + ( 9 + ( 8 + soma(7) ) )
...
10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + soma(0)
10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 + 0
Recursividade - exemplo

Como a função não se chama a si mesma quando k é 0, o


programa pára aí e retorna o resultado.
O desenvolvedor deve ter muito cuidado com a recursão, pois
pode ser muito fácil escrever uma função que nunca termina
ou que usa quantidades excessivas de memória ou poder do
processador. No entanto, quando escrita corretamente, a
recursão pode ser uma abordagem de programação muito
eficiente e matematicamente elegante.
Exercícios
• 1 - Criar um programa em C++ que peça ao
utilizador o preço de um artigo e o desconto e
mostre no ecrã o preço final.
funcaoprecodesconto.cpp
• 2 - Criar um programa em C++ que peça ao
utilizador um número com vários dígitos e ele
escreva no ecrã o número de dígitos desse
número funcaocontardigitos.cpp
• #include <iostream> Resolução 1
using namespace std;

float calculaDesconto (float precoArtigo, float taxaDesconto) {


return precoArtigo - (precoArtigo * taxaDesconto / 100);
}

int main() {
float precoArtigo, taxaDesconto, precoFinal;
cout << "Informe o preco do artigo: ";
cin >> precoArtigo;
cout << "Informe a taxa de desconto: ";
cin >> taxaDesconto;
precoFinal = calculaDesconto(precoArtigo, taxaDesconto);
cout << "Preco final com desconto: " << precoFinal << endl;
return 0;
}
• #include <iostream>
using namespace std;

int contarDigitos(int n1) {


static int cont; Resolução 2
if(n1!=0) {
cont++;
contarDigitos(n1/10);
}
return (cont);
}

int main() {
int num, contador;
cout << "programa para contar o numero de digitos de um dado numero \n";
cout << "Insira um numero: ";
cin >> num;

contador = contarDigitos(num);
cout << "A quantidade de numeros inseridos nesse numero: " << contador << endl;
return 0;
}
Exercícios:
• 3 –MDC em C++ - Como calcular o Máximo Divisor Comum
• Vamos calcular o MDC de um número, ou seja, o seu maior divisor
comum, usando recursão.
• Primeiro, temos que entender o que é MDC.
Todo o número natural pode ser divido por outros números, também
números naturais.
Por exemplo, o 8 pode ser dividido por:
8/1 = 8
8/2 = 4
8/4 = 2
8/8 = 1
O 11, que é um primo, pode ser dividido por:
11/1 = 11
11/11 = 1
Exercícios:

• Todos os números naturais têm, pelo menos, dois divisores: o 1 e ele


mesmo.
Então, dois números naturais quaisquer, tem sempre algum divisor
em comum, nem que seja apenas o 1.
• E é aí que entra o MDC, ou seja, o máximo, queremos calcular o
maior divisor comum, o maior divisor desses dois números.
• Vejamos:
• divisores de 18:
Exercícios:
18/1 = 18
18/2 = 9
18/3 = 6
18/6 = 3
18/9 = 2
18/18 = 1
divisores de 15:
15/1 = 15
15/3 = 5
15/5 = 3
15/15 = 1
1 e 3 são os números que se repetem, os divisores em comum. E qual o maior deles? O 3
• Vamos pegar no maior número e calcular o resto da divisão inteira pelo menor.
Se der 0, acabou, o menor é o MDC.

Se não der 0, continuamos com mais alguns cálculos, até o resto da divisão do primeiro pelo segundo ser 0,
mas temos duas situações: o menor número e o resto da divisão do maior pelo menor.
Então, fazemos a recursividade, agora passando como argumentos o menor número e o resto da divisão do
maior pelo menor.
• mdc.cpp
• #include <iostream>


using namespace std;
Exercícios:
int mdc(int num1, int num2)
• {
• if(num1%num2 == 0)
• return num2;
• else
• return mdc(num2, num1%num2);
• }

int main()
• {
• int num1, num2;

cout<<"Introduza o maior numero \n";
• cin>> num1;
• cout<<"Introduza o menor numero \n";
• cin>> num2;

cout<<"MDC: "<<mdc(num1, num2)<< “\n”;
• return 0;
• }
Exercícios

• 4 – Expoente
• Criar um programa em C++ que peça ao
utilizador a base e o expoente e mostre no ecrã
o valor final.
int main()
• #include <iostream> {
float a, b, resultado;
• using namespace std; cout << "introduza o valor da base \n";
• cin >>a;
float potencia(float base, float expoente){ cout << "introduza o valor do expoente \n";
• if (expoente ==0){ cin >> b;
• return 1; resultado = potencia(a,b);
cout <<a <<" elevado a "<< b <<" e igual a " << resultado <<"\n";
• }
return 0;
• }
if (expoente>0){
• return (base*potencia(base, expoente-1));
• }

if (expoente<0){
• return (1/potencia(base, -expoente));
• }
• } Exercícios

Números aleatórios com a Função rand()

• Em muitos programas, é necessário termos números aleatórios.


Por exemplo, para escolher um vídeo aleatório do Youtube, para
fazer um sorteio com seguidores do Instagram, entre outros
• Para isso, usa-se a função rand(), da biblioteca cstdlib.
Números aleatórios com a Função rand()
• funcaorand.cpp
• #include <iostream>
• #include <cstdlib>
• using namespace std;

int main()
• {
• cout<< "Intervalo: 0 - "<<RAND_MAX<< endl;

return 0;
• } Intervalo: 0 - 32767
Números aleatórios com a Função rand()
• Vamos gerar um número aleatório:
• #include <iostream>
• #include <cstdlib>
• using namespace std;

int main()
• {
• cout<<rand()<<endl;

return 0;
• } O que aconteceu?
Feche seu programa. Abra de novo...?

Sim, os números aleatórios repetem-se!


Vamos resolver usando...
Função srand() e as sementes (seed)
randômicas
• Na verdade não existe número puramente aleatório. Existe toda uma
ciência, e estudos e mais estudos.
• Basicamente, há uma regra vai ter que ser usada para gerar esses
números, que na verdade são pseudoaleatórios.
• Vamos fornecer números ao C++
• Ele irá ler esses valores e gerar números diferentes, a partir deles.
Para isso, vamos usar a função srand(), que aceita um inteiro como
parâmetro (um unsigned int).
• #include <iostream>
• #include <cstdlib> funcaosrand.cpp
• using namespace std;

int main()
•{
• srand(1689); 6935

• cout<<rand()<<endl;
O valor da rand mudou
Porque estamos a fornecer ao

• programas números para que sejam


gerados aleatoriamente
return 0;
•}
A função time() da biblioteca ctime

• Existe uma função, da biblioteca ctime, a time(), que quando


invocada retorna o número de segundos desde 00:00 de 1 de janeiro
de 1970. Ela é usada como geradora de sementes, para srand().
• funcaotime.cpp
• #include <iostream> A função time() da
• #include <cstdlib> biblioteca ctime
• #include <ctime>
• using namespace std; Abra e feche...várias vezes...sempre
diferente, o número sorteado!
• Afinal, a cada segundo o retorno da
int main() time(0) é diferente, gerando
•{ sementes diferentes pra srand(),
que altera a rand(), que nos fornece
• unsigned seed = time(0); números aleatórios diferentes
srand(seed);
• cout<<1+rand%10()<<endl; Valores 1 a 10
0,1,2,3,4,5,6,7,8,9

return 0;
•}
• aleatorioumadez.cpp Gerar aleatórios
• #include <iostream> de 1 a 10
• #include <cstdlib>
• #include <ctime>
• using namespace std;

int main()
•{
• unsigned seed = time(0);

srand(seed);
• cout<<1+rand()%10<<endl;

Você também pode gostar