Baixe o app para aproveitar ainda mais
Prévia do material em texto
Lista 1 - Gabarito 1) Considere o programa abaixo e depois dê o que se pede: #include <iostream> #include <cstdlib> using namespace std; void Teste1(int ); void Teste2(int &); int Teste3(int); int x = 20; int main() { int numero = 10, outroNumero; Teste1(numero); cout << "Valor de numero (após Teste1) = " << numero << endl; cout << "X = " << x << endl; Teste2(numero); cout << "Valor de numero (após Teste2) = " << numero << endl; cout << "X = " << x << endl; outroNumero = Teste3(numero); cout << "Valor de outro numero (após Teste3) = " << outroNumero<< endl; cout << "X = " << x << endl; system("pause"); } void Teste1(int numero) { numero = numero +x ; x++; } void Teste2(int &numero) { int valor = 100; numero = numero + valor; x++; } int Teste3(int n) { int valor = 200; n = n + valor; x--; return n; } Pede-se: a) Identifique as variáveis globais e locais. Quando identificar uma variável local, especifique o escopo da mesma. b) Identifique, em cada função, o tipo de passagem de parâmetros. c) Mostre, passo a passo, o valor de todas as variáveis, indicando o momento em que as variáveis não mais ocupam espaço na memória. d) Diga o que é impresso na tela Solução : a) Variável global : x Variáveis locais : 1) numero e outroNumero – escopo : main. Veja o trecho : int main() { int numero = 10, outroNumero; //continua 2) numero - escopo : Teste1 3) numero e valor – escopo : Teste2 4) n e valor - escopo : Teste3 b) Função main : Não há passagem de parâmetros Função Teste 1 : Passagem de parâmetro por valor Função Teste 2: Passagem de parâmetro por referência FunçãoTeste 3: Passagem de parâmetro por valor c) Passos : 1) Variável global x recebe 20. Ela será visível na main e nas outras funções. 2) Na main, a variável local numero recebe 10, na declaração. 3) Chamada para a função Teste1, passando o valor de numero, ou seja, 10. 4) Na função Teste1 : Há uma variável local numero (cópia da variável numero da main) que recebeu o valor passado 10. A variável numero local à função Teste1 recebe 10+20, ou seja, numero (local à Teste1) recebe 30. Depois, a variável global x é incrementada para 21. Terminada a função Teste1, a variável local numero deixa de ocupar espaço na memória. Assim, terminada a execução de Teste1, a variável x está visível, com a alteração sofrida, mas a variável numero (local a Teste1) já não mais existe na memória. 5) Volta-se para main, para a 1ª. linha de cout. Neste momento, tem-se que numero (local à main) permanece com o valor 10 e a variável global x vale 21. 6) Chamada para a função Teste2. Neste caso, há uma passagem de parâmetro por referência usando & (ver definição e protótipo da função). 7) Começando a execução de Teste2, vemos o parâmetro numero, a variável local valor e x (variável global). A variável local valor recebe 100 na declaração. O argumento numero (vide chamada da função Teste2) recebe 10 + 100, ou seja, 110 e depois, x é incrementado para 22. Ao terminar a execução de Teste2, tem-se que valor não mais ocupa espaço na memória, x foi de fato modificada e numero (variável local à main) sofreu a alteração realizada em Teste2, passando a valer 110. 8) Na linha outroNumero = Teste3(numero); temos que a variável outroNumero, que é local à main, receberá o retorno da função Teste3. O argumento de Teste3 é numero, que neste momento vale 110. Assim comoTeste1, a função Teste3 trabalha com passagem de parâmetro por referência. 9) Começando a executar Teste3 temos o parâmetro n, que é uma variável local à função Teste3. O parâmetro n armazena o valor do argumento numero, usado na chamada da função. Como numero (local à main) vale 110, o parâmetro n vale também 110. Dentro de Teste3 há uma variável local valor que recebe 200 na declaração. Em seguida, a variável local n (local à função Teste3) recebe 310 (n recebe 200 + 110). Em seguida, x (variável global) é decrementada para 21. O valor da variável local n é retornado para o ponto de chamada na função main. Ao término da execução de Teste3, tanto a variável n, quanto a variável valor, não mais ocupam espaço em memória. 10) O valor retornado pela função Teste3 é atribuído à variável outroNumero, que recebe 310. A variável global x vale 21. 11) Somente ao término da execução da função main, as variáveis x, numero e outroNumero são liberadas da memória. d) 2) Construa uma função que receba um número inteiro e retorne o fatorial do número. Números muito grandes não terão o fatorial calculado. Solução : #include <iostream> using namespace std; //Protótipo int fatorial(int ); //prog. principal int main() { int n; cout << "\t\tCalculo do fatorial " << endl; do { cout << "Digite um valor maior ou igual a zero : "; cin >> n; if (n < 0) cout << "ERRO: Valor negativo. Digite um valor maior ou igual a zero. " << endl; } while (n <0); cout << "Fatorial de " << n << " = " << fatorial(n) << endl; system("pause"); } //Definição int fatorial(int n) { int fat = 1; //inicializa o produto que é o fatorial for ( ; n >= 2; n--) fat = fat * n; return fat; } 3) Construa uma função que receba um número inteiro e exiba se ele é, ou não, primo. Solução : #include <iostream> using namespace std; //Protótipo void ehPrimo(int num); int main() { int numero; cout<<"\nDigite numero: "; cin>>numero; ehPrimo(numero); cout<<endl; system("pause"); } void ehPrimo(int num) { int cd=0; for(int x=1; x<=num && cd<=2; x++) if(num % x ==0) cd++; if(cd==2) cout<<"\nEh primo\n"; else cout<<"\nNao eh primo\n"; } 4) Construa uma função que receba um caracter como parâmetro e retorne 1 caso seja uma vogal, minúscula ou maiúscula, e 0 em caso contrário. Solução : #include <iostream> using namespace std; //Protótipo int testaLetra(char ); //Prog. principal int main() { char letra; int resultado; cout << "\t\tPrograma para verificar se letra eh vogal" << endl; cout << "Digite uma letra : "; cin >> letra; letra = toupper(letra); //converte para maiúscula resultado = testaLetra(letra); if (resultado == 1) cout << letra << " eh vogal." << endl; else cout << letra << " nao eh vogal." << endl; system("pause"); } //Definição da função int testaLetra(char letra) { if (letra == 'A' || letra == 'E' || letra == 'I' || letra == 'O' || letra == 'U') return 1; else //o else pode ser apagado, pois o comando return nos tira da função quando executado return 0; } 5) Construa uma função que calcule o número de combinações de n elementos p a p . A fórmula da combinação é a seguinte : Números muito grandes não terão o fatorial calculado. Sendo assim, a combinação, também não poderá ser apresentada. Obs. : Pela Matemática: n > 0 , p <= n e p >= 0 Solução : #include <iostream> using namespace std; //Protótipos int fatorial(int n); int combinacao(int n, int p); //Prog. principal int main() { int n, p; int resultado; cout << "\t\tCOMBINACAO DE N, P a P. " << endl; do { cout << "Digite uma quantidade n (n > 0) : "; cin >> n; if (n <= 0) cout << "ERRO : entrada invalida. " << endl; } while (n <= 0); do { cout << "Digite a quantidade p de elementos (p >= 0 e p <= n) : "; cin >> p; if (p < 0 || p > n) cout << "ERRO : Entrada invalida. " << endl; } while (p < 0 || p > n); resultado = combinacao(n,p); cout << "Resultado da combinacao de " << n << " , " << p << " a " << p << " = " << resultado << endl; system("pause"); } //Definições das funções int fatorial(int n) { int fat = 1; //inicializa o produto, pois o fatorial é um produto de inteiros for ( ; n >= 2; n--) fat = fat * n; return fat; } int combinacao(int n, int p) { return (fatorial(n) / (fatorial(p) * fatorial(n-p))); } 6) Construa uma função que receba como parâmetros dois vetores inteiros, e um inteiro indicando a quantidade de elementos que os dois vetores têm. A função deverá retornar o produto interno dos dois vetores. Solução : #include <iostream> #define TAM 10 using namespace std; //Protótipo int calculaProdutoInterno(int v[], int w[], int n); //Prog. principal int main() { int v[TAM], w[TAM], n, resultado; do { cout << "Digite a quantidade de elementos para v e w (> 0 e <= " << TAM << " ) : "; cin >> n; if (n < 1 || n > TAM) cout << "ERRO : Quantidade invalida. " << endl; }while (n < 1 || n > TAM); cout << "Entre com valores para v e para w ... " << endl << endl; for (int i = 0; i < n; i++) { cout << "v[ " << i << " ] = " ; cin >> v[i]; cout << "w[ " << i << " ] = " ; cin >> w[i]; cout << endl; } resultado = calculaProdutoInterno(v,w,n); cout << "Produto interno = " << resultado << endl; system("pause"); } //fim da main //definição da função int calculaProdutoInterno(int v[], int w[], int n) { int soma = 0; //inicializa o somatório for (int i = 0; i < n; i++) soma = soma + v[i] * w[i]; return soma; } ¨7) Construa uma função que receba uma mensagem, seu tamanho e um caracter e retire todas as ocorrências desse caracter na mensagem colocando * em seu lugar. A função deve retornar o total de caracteres retirados. Solução : #include <iostream> #include <cstring> #include <cctype> using namespace std; //ProtótipoS void maiuscula(char mens[], int tam); int criprografa(char mens[], int tam, char letra); //Função Principal int main() { char mensagem[100], letra;int t; cout<<"\nDigite mensagem: "; cin.getline(mensagem, 100); cout<<"\nLetra: "; cin>>letra; letra=toupper(letra); t=strlen(mensagem); maiuscula(mensagem,t); cout<<criprografa(mensagem, t, letra)<<endl; cout<<mensagem<<endl; system("pause"); } / /Definições das funções void maiuscula(char mens[], int tam) { for(int x=0; x<tam; x++) mens[x]=toupper(mens[x]); } int criprografa(char mens[], int tam, char letra) { int troca=0; for(int x=0; x<tam; x++) if(mens[x]==letra) { mens[x]='*'; troca++; } return troca; }
Compartilhar