Baixe o app para aproveitar ainda mais
Prévia do material em texto
Aula 02 1a Questão Considera a FUNÇÃO abaixo: void inverte(int &x, int &y) { int aux = x; x = y; y = aux; } Quais valores serão impressos na tela quando o seguinte programa principal for executado? int main() { int a = 18, b = 28; inverte(a, b); cout << a <<" e "<< b; return 0; } 28 e 08 28 e 18 18 e 28 08 e 18 18 e 18 Explicação: Teste de Mesa a b x y aux 18 28 //Na main() 18 28 18 28 //Quando a função é chamada x, recebe o endereço de a e y, o de b. Logo acessam os mesmos endereços 18 28 18 28 18 //Na função, aux é declarada e inicializada com o valor de x 18 28 28 28 18 //Na função x = y; Deixará x com valor 28 18 28 28 18 18 //Na função y = aux; Deixará y com valor 18 Como a função é void, nada retorna e nem precisa porque os valores foram trocados pela função misterio(...) que recebeu por passagem por referência. 2a Questão Blocos únicos de códigos que realizam diversas tarefas distitintas são de dificil manutenção. Portanto, utiliza-se a tecnica da modularização de programas, a fim de facilitar a implementação e a manutenção dos programas. Esta técnica, também chamada de modularização, tem como principal elemento: As Filas As Estruturas de Dados Os Vetores Os Grafos As funções 3a Questão Considere a função abaixo: int func (int a, int &b) { a = b - a; b = a * 2; a = b * 2; return a; } Considere também o seguinte trecho de código no main : int x=2, y=3, z; z = func (x,y); cout << x << "; " << y<< "; " << z; Após a execução do cout, seria impresso: 1; 2; 4 4; 2; 4 2; 2; 4 2; 2; 1 1; 3; 1 Explicação: Começando a execução pela main, temos que x recebe 2 e y recebe 3. Chamando a função, são passados os valores 2 e 3, respectivamente para a e b. Note que b é passado por referência. Dentro da função tem-se o seguinte : a recebe 1, depois b recebe 2 e então, novamente, a é alterado e recebe 4. Daí, o valor de a igual a 4 é retornado para a main e é atribuído a z. Voltando para a main, temos que x não mudou, ficando igual a 2. Temos ainda que z recebeu 4, o valor retornado pela função e finalmente, y foi alterado para 2. Portanto, foi impresso 2;2;4, pois foram impressos os valores de x, y e z, respectivamente. 4a Questão Uma função possui um valor de retorno inteiro, recebe por valor um inteiro como primeiro parâmetro e por referência um inteiro como segundo parâmetro. Qual das respostas abaixo poderia representar o protótipo dessa função: int func (int a, int &b); void func (int a, int &b); int func (&int, int); int func (int &a, int b); void func (int &a, int &b); Gabarito Coment. 5a Questão Diga, para o trecho do programa abaixo, qual a opção que representa a saída em tela. Considere que o programa será compilado sem erros, e irá executar também sem problemas. void troca (int x, int *y){ int tmp; tmp = *y; *y = x; x = tmp; } int main() { int a = 13, b = 10; troca( a, &b ); cout<<"Valores: "<< a<<"\t"<< b<< endl; system("pause"); } Valores: 31 01 Valores: 10 13 Valores: 13 13 Valores: 13 10 Valores: 10 10 Explicação: A execução começa pela main. São passados o valor de a, que é 13 e o endereço de b, que vale 10. Em seguida, é chamada a função troca e são passados o valor de a e o endereço de b. Executando a função troca, x recebe 13 e *y recebe 10. Mas ocorre a troca, usando tmp como auxiliar. Então x recebe 10 e *y recebe 13. Ao terminar a execução da função, voltamos para a main e temos a sem mudanças e b com a mudança ocorrida na função. Note que x é um parâmetro passado por valor e y é um parÂmetro passado por referência. Portanto, a ficou 13 e b ficou 13. Logo, será impresso : Valores: 13 13 6a Questão #include < iostream > using namespace std; void SOMA(float a, int b) { float result = a+b; cout << "A soma de " << a << " com " << b << " é: " << result; } int main() { int a; float b; a = 10; b = 12.3; SOMA(b,a); } A função SOMA acima possui as seguintes características : Retorna valor. Retorna valor e não possui parâmetros. Não retorna valor e possui parâmetros. Retorna valor e possui parâmetros. Não retorna valor e não possui parâmetros. Explicação: A função void SOMA(float a, int b) { float result = a+b; cout << "A soma de " << a << " com " << b << " é: " << result; } tem o tipo de retorno void, o que significa que nenhum valor é retornado. Além disso, a função possui 2 parâmetros, que são a e b. Logo, a resposta certa é Não retorna valor e possui parâmetros. 7a Questão Considere o trecho de um programa escrito em C++ : long func1 (int n1) { int ft=1, i = 1; while ( i <= n1) { ft *= i; i++; } return ft; } main() { cout << func1 (5); } Marque a opção correta que mostra o que é impresso na tela. 24 120 1 60 5 Explicação: Acompanhando passo a passo : long func1 (int n1) { int ft=1, i = 1; while ( i <= n1) { ft *= i; i++; } return ft; } main() { cout << func1 (5); } Passo a passo : 1) Começando a execução pela main ... func1 é chamada e é passado o valor 5. 2) Entrando na função, temos que n1 recebeu 5, i recebeu 1 e ft recebeu 1. 3) Ainda na função func1 ... teste do loop ... 1 <= 5 ? Sim. Então, ft recebe 1*1, que dá 1 e i passa a valer 2. Acompanhar na tabela desde o início da execução de func1 ft i i <= n1 1 1 1 <= 5 / Sim 1 2 2 <= 5 ? Sim 2 3 3 <= 5 ? sim 6 4 4 <= 5 ? Sim 24 5 5 <= 5 ? Sim 120 6 6 <= 5 ? FAlso SErá retornado o valor de ft que é 120. Volta-se então para a main e o valor 120 é impresso. 8a Questão Considere a função: void dobro(int x) { x = 10 * x; } Qual será o valor impresso na tela quando o programa principal for executado? int main() { int n; n = 5; dobro(n); cout << n; return 0; } 0 5 50 Haverá um erro de compilação 10 Gabarito Coment. 1a Questão O programa executa perfeitamente independente da ordem das funções já que existem os seus protótipos. O programa não executa corretamente, pois o protótipo da função media( ) não apresenta a identificação dos parâmetros, mas apenas os tipos dos mesmos. O programa executa perfeitamente, mas não mostra o valor da media já que esta função não foi chamada na função main( ). O programa não executa corretamente, pois os protótipos estão fora da ordem em que as funções são descritas. O programa não executa corretamente pois as funções devem ser descritas antes da função main(), para que o compilador consiga reconhecê-las. Gabarito Coment. 2a Questão Considere o trecho de um programa escrito em C++. int func1 (int vtx[], int tam) { int soma=0; for (int i=0 ;i < tam; i++) { if (i % 2 !=0) soma += vtx[i]; } return soma; } int main() { int vt[5] = {10,20,30,40,50}; cout << func1 (vt,5); } Marque a opção correta que mostra o que é impresso na tela. 40 30 60 20 50 Explicação: int func1 (int vtx[], int tam) { int soma=0; //inicializa soma com zero. for (int i=0 ; i < tam; i++) { if (i % 2 !=0) //testa se i é ímpar. Se for, acumula na soma o valor de vtx[i] soma += vtx[i]; } return soma; } Fazendo um teste de mesa parcial ... vetor tam soma i {10, 20, 30, 40, 50} 5 0 0 20 1 2 E continua ... se vê que a função está somando os elementos do vetor que possuem índices ímpares. Logo, serão somados 20 e 40, que dará 60. A soma 60 é retornada e impressa na main. 3a Questão Para compararmos vetores de char, usaremos a função _____________________ . Para copiarmos o conteúdo de um vetor de char nas posições ocupadas por outro vetor de char, usaremos a função ______________________ . strcmp(); e strlen() ; strcmp(); e strcmpi (); strcat(); e strcpy() ; strcmp(); e strcat(); strcmp(); e strcpy(); Explicação: Nâo há outra possíbilidade de resposta. Em cstring estão declaradas as funções da opção correta, que fazem exatamente o que foi mencionado no enunciado. Ainda a saber : strcat concatena e strlen conta o número de caracteres 4a Questão Considere a seguinte função: void dobro(int x) { x = 2 * x; } Qual valor será impresso na tela quando o seguinte programa principal for executado? int main() { int n = 3; n = n + 2; dobro(n); cout << n; return 0; } 20 0 10 3 5 Explicação: A função não retorna valor, então o valor de "n" não é alterado permanecendo igual a 5. 5a Questão Funções são instrumentos de modularização de programas, que tem como finalidade tornar o código mais legível, isto é mais fácil de entender, evita replicação de instruções e permite o reuso das funções em outros programas. Então considere o seguinte código: #include< iostream > using namespace std; int main( ) { float a=10.0; float b=4.0; cout < < media(a,b); return 0; } float media(float x, float y) { return (x+y)/2;} Marque a alternativa CORRETA: O código não compila, pois os parâmetros usados na chamada da função deveriam ser "x" e "y"; porém a chamada se deu com identificadores "a" e "b". O código compila normalmente e apresenta como resultado o valor 7.0 O código não compila, pois a função float media(float x, float y) retorna um valor que seria ser armazenado em uma variável do tipo float e só então poderia ser usado o comando cout para exibir o resultado. O código não compila, pois há necessidade de se declarar float media(float, float) como protótipo da função float media(float x, float y)antes da função principal. O código compila normalmente, pois como a descrição da função float media(float x, float y)está posicionada após a função int main ( ), não há necessidade do uso de protótipos. Explicação: Quando uma função é posicionada depois da função main(), o protótipo dela precisa estar presente antes da função main(). Gabarito Coment. 6a Questão Informe qual deverá ser a saída do programa abaixo: #include void func(int *x) { do{ cout << *x << " "; (*x)--; }while(*x>0); } main() { int x=5; func(&x); cout << x; system("pause"); } 5 3 4 2 1 4 5 4 3 2 1 0 5 4 3 2 1 6 5 3 4 2 1 0 5 4 3 2 1 5 7a Questão Em programação podemos utilizar um recurso que modulariza o programa chamado função. As funções precisam ser ativadas para que possam ser executadas. Para isso, é necessário chamar a função pelo seu nome e enviar, quando necessário, os valores respectivos para os parâmetros de entrada. Ao enviar os valores para os parâmetros de entrada, o programa pode fazer uma cópia deste valor ou trabalhar em um endereço enviado. Quando se envia o endereço estamos ativando a função por meio de: Ponteiros. Registro. Envio de valor. Passagem por valor. Envio de inteiro. Gabarito Coment. 8a Questão Considere o trecho de um programa escrito em C++ : int func1 (long num) { int n, na=1; while (num / 10 != 0){ na += 1; num /= 10; } return na; } main() { cout << func1 (132041); } Marque a opção correta que mostra o que é impresso na tela. 2 3 4 6 1 Explicação: Fazendo passo a passo : int func1 (long num) { int n, na=1; while (num / 10 != 0){ na += 1; num /= 10; } return na; } main() { cout << func1 (132041); } Passos : 1) Chamada da função passando o valor 132041 2) Começa a função com num recebendo o valor 132041 3) na recebe 1 4) enquanto num/10 é diferente de zero faça ... Vejamos : 132041/10 é diferente de zero então na recebe 2 e num recebe 13204 5) Volta no teste do loop... 13204 /10 é diferente de zero ? Sim. Então, na recebe 3 e num recebe 1320 6) Volta no teste do loop... 1320 /10 é diferente de zero ? Sim. Então, na recebe 4 e num recebe 132 7) Volta no teste do loop... 132 /10 é diferente de zero ? Sim. Então, na recebe 5 e num recebe 13 8) Volta no teste do loop... 13 /10 é diferente de zero ? Sim. Então, na recebe 6 e num recebe 1 9) Volta no teste do loop... 1 /10 é diferente de zero ? Não. Então, retorna o valor e na que é 6. 1a Questão Caso uma estrutura homogênea (vetor) seja passada como parâmetro para uma função, então: Haverá um erro de compilação, pois vetores não podem ser parâmetros de funções Essa passagem pode ser "por valor" ou "por referência" Todos os valores contidos no vetor são copiados para a função Essa passagem é "por valor" Essa passagem é "por referência" Explicação: Quando o vetor é um parâmetro de uma função ele é sempre passado por referência, não havendo outra possibilidade. Não ocorrerá erro, se o vetor for devidamente passado para a função. 2a Questão Assinale a opção certa. Quando não se escreve o protótipo de uma função ... A definição da função deverá ser escrita, obrigatoriamente, após o programa principal. É preciso definir a função antes do programa principal. O programa não funcionará de forma alguma. A chamada da função poderá ser feita em qualquer hipótese. A chamada da função não poderá ser feita em qualquer hipótese. Gabarito Coment. 3a Questão Considere o trecho de um programa escrito em C++ : int func1 (int n1, int n2) { int soma=0; for ( ; n1 < n2 ; n1 += 2) { soma += n1; } return soma; } main() { cout << func1(1.20); } Marque a opção correta que mostra o que é impresso na tela. 80 102 90 104 100 Explicação: int func1 (int n1, int n2) { int soma=0; for ( ; n1 < n2 ; n1 += 2) {soma += n1; } return soma; } main() { cout << func1(1,20); } Fazendo passo a passo : n1 n2 soma 1 20 0 3 1 5 4 7 9 9 16 11 25 13 36 15 49 17 64 19 81 21 ... Teste dará falso 100 Retorna o valor 100 que é impresso na main. 4a Questão Diga, para o trecho do programa abaixo, qual a opção que representa a saída em tela. Considere que o programa será compilado sem erros e irá executar também sem problemas . void troca (int x, int y){ int tmp; tmp = y; y = x; x = tmp; } int main( ) { int a = 13, b = 10; troca( a, b ); cout<<"Valores: "<< a<<"\t"<< b<<< endl; system("pause"); } Valores: 10 13 Valores: 10 10 Valores: 13 13 Valores: 31 01 Valores: 13 10 Explicação: Acompanhando passo a passo a execução do trecho dado temos : void troca (int x, int y){ int tmp; tmp = y; y = x; x = tmp; } int main( ) { int a = 13, b = 10; troca( a, b ); cout<<"Valores: "<< a<<"\t"<< b<<< endl; system("pause"); } A execução começa pela main e os valores 13 e 10 são passados para a função na chamada em troca(a,b); Ao iniciar a execução em troca, temos que x recebe 13 e y recebe 10. Mas x e y são parâmetros passados por valor então, nada ocorrerá com a e b na main. ASsim, após a função terminar sua execução e voltarmos para a main temos a seguinte impressão na tela : Valores : 13 10 5a Questão A declaração de variáveis na programação é o ato de reservar um espaço na memória para poder armazenar valores de um determinado tipo. Essas variáveis podem ser classificadas como variáveis locais e globais. Sendo assim, qual das situações abaixo representa melhor o conceito das variáveis globais. Em duas funções diferentes temos duas variáveis também diferentes com o mesmo nome apresentando o mesmo valor. Se dentro de uma função "mostra" declararmos uma variável 'R' com um determinado valor poderemos imprimir esta variável em qualquer outra função do programa mostrando o valor atribuído na função "mostra". Em uma função "resul" tem-se uma variável ali declarada por 'T' que recebe o valor inteiro 5. Ao tentar chamar esta variável em outra função é mencionado um warning. Ao modificar o valor da variável 'X' na função "modifica" seu valor modificado poderá ser apresentado em qualquer outra função do programa. Se modificarmos o valor da variável 'Y' na função "soma", e depois imprimirmos na tela esta variável em outra função, onde tambem está declarada a variável 'Y', será acusado um erro de compilação. Explicação: Uma variável é classificada com Global quando for declarada fora de todas as funções, significando que poderá ser alterada em qualquer uma delas. A resposta correta é : Ao modificar o valor da variável 'X' na função "modifica" seu valor modificado poderá ser apresentado em qualquer outra função do programa. Gabarito Coment. 6a Questão Auxiliar = 111 Numero1 = 1000 Numero2 = 80 Auxiliar = 100 Numero1 = 900 Numero2 = 20 Auxiliar = 100 Numero1 = 900 Numero2 = 80 Auxiliar = 100 Numero1 = 1000 Numero2 = 20 Auxiliar = 101 Numero1 = 900 Numero2 = 20 Explicação: Acompanhando a execução Na função main() é declarada a variável valor e inicializada com 1000. Quando na main(), a função mistério é chamada, é passado o endereço da variável valor. Logo, de forma bem simples, v seria o nome da variável valor para a função misterio(...) Dentro da função misterio(...), foi declarada uma variável local aux com conteúdo 11 Sendo assim, aux = aux - 11; Deixará aux com 100 v = v - aux ; Deixará v com 900(1000 - 100) Como a variável numero foi declarada globalmente, todas as funções poderão acessá-la e, com isso, alterar seu valor, numero = aux - numero; Deixará numero com 80(100 - 20) Dentro da função misterio(...) será exibido Auxiliar = 100 e quando retornar à função main(), serão exibidos Numero1 = 900 Numero2 = 80 Resposta correta: Auxiliar = 100 Numero1 = 900 Numero2 = 80 Gabarito Coment. 7a Questão Considere as seguintes afirmativas : I) Os vetores em C++, quando passados como parâmetros de funções, são obrigatoriamente passados "por valor" e não "por referência". II) Variáveis globais são um recurso adequado para troca de informações entre funções distintas. III) Caso uma função necessite retornar mais de um valor ao programa que a chamou, deve fazê-lo usando parâmetros passados "por valor". As afirmativas corretas são: Nenhuma está correta Apenas I e II Apenas II Apenas III Apenas I Explicação: Analisando cada afirmativa ... I . Falso. Em C++ os vetores passados como parâmetros são sempre passados por referência. II. FAlso. Variáveis globais são uma péssima forma de usar recursos, comprometendo principalmente a manutenção do programa. III. FAlso. A função poderá retornar explicitamente um valor com return, mas terá que passar o outro parâmetro por referência e não por valor. Outra forma, será passar todos os parâmetros por referência. Portanto, não opção correta. 8a Questão Considere os trechos abaixo: int valor = 100; void eureka (int &z) { int temp = 25; z--; temp = temp - 10; valor = valor - temp; cout << "Auxiliar = " << temp << endl; } int main() { int R = 1000; eureka(R); cout << "Result = " << R << " Valor = " << valor << endl; } Assinale a opção correta. Será impresso Auxiliar = 15 Result = 999 Valor = 85 sendo que z é um parâmetro passado por referência Será impresso Auxiliar = 15 Result = 1000 Valor = 100 sendo que z é um parâmetro passado por referência Será impresso Auxiliar = 15 Result = 1000 Valor = 85 sendo que z é um parâmetro passado por referência Será impresso Auxiliar = 15 Result = 999 Valor = 85 sendo que z é um parâmetro passado por valor Será impresso Auxiliar = 15 Result = 1000 Valor = 85 sendo que z é um parâmetro passado por valor 1a Questão Considere o trecho de um programa escrito em C++. int func1 (int n1, int n2) { int aux = n1 % n2; while ( aux != 0) { n1 = n2; n2 = aux; aux = n1 % n2; } return n2; } int main() { cout << func1 (27, 18); } Marque a opção correta que mostra o que é impresso na tela. 27 18 6 3 9 Explicação: Fazendo um teste de mesa, temos que o valor 9 retornado e impresso na main. Iniciando um teste de mesa.... n1 n2 aux 27 18 9 18 9 0 continua... continua... continua.. 2a Questão Sobre funções, é correto afirmar: Não devem conter variáveis locais em seu código. Obrigatoriamente devem possuir parâmetros. Obrigatoriamente devem retornam algum valor. São blocos de instruções que são executados quando são chamadas em alguma parte do programa. Não podem ser chamadas dentro de outras funções. Explicação: Uma função é um bloco de instruções que pode ser chamada a partir de outra função, que pode ter ou não parâmetros, que pode ou não retornar valor, que pode ter ou não variáveis locais.3a Questão Considere a função a seguir e a chamada da mesma efetuada no programa principal abaixo. Indique a opção que contem o que será impresso. int executar (int x, int &y) { x = y * 2; y = ++x; return x + y; } int main () { int a=2, b=2, c=2; c = executar (a, b); cout << a << ", " << b << ", " << c; } 3, 2, 8 3, 5, 8 2, 5, 10 4, 5, 9 2, 2, 9 Explicação: Fazendo um teste de mesa, temos o seguinte : A execução começa pela main. As variáveis a, b e c são iniciadas com 2. Chama-se a função executar e são passados os valores de a e b, ou seja, 2 e 2. Ao iniciar a execução da função executar temos que x é passado por valor e y por referência. Iniciando a função temos : Em x = y * 2; Daí : x recebe 2 * 2, que dá 4 Em y = ++x; Daí : x é incrementado para 5 e depois y recebe 5. Então, a soma de x + y é retornado. Ou seja, 10 é retornado. Mas como y é passado por referência, a variável b na chamada da função foi alterada para 5. Nada, no entanto, ocorreu com a na chamada da função, pois x foi passado por valor. Ao voltar para main, será impresso 2, 5, 10 Portanto, qualquer outra opção é totalmente inviável. 4a Questão 1) O que será impresso pela função Eureka ? Assinale a opção correta. void Eureka() { for (int i = 1; i <= 10; i++) if (i % 2 == 0) cout << i << " "; else if (i % 7 == 0) return; } 2 4 6 8 10 Nada é impresso, pois a função não compila. Para a função compilar, deveria ter int no lugar de void, já que há return na função. 2 4 6 8 Nada é impresso, pois a função não compila. A função não deveria usar return, pois não está de acordo com o uso de void. 2 4 6 5a Questão Considere a seguinte função: void dobro(int x) { x = 2 * x; } Qual valor será impresso na tela quando o seguinte programa principal for executado? int main() { int n; n = 5; dobro(n); cout << n; return 0; } 5 Haverá um erro de compilação 10 20 0 6a Questão Assinale a opção CORRETA. O protótipo da função que permitirá calcular o volume de um paralelepípedo com medidas a, b e c de acordo com o trecho da chamada : cout << "Volume = " << volume(a,b,c); float volume (float, float); float volume (float ; float ; float); void volume (float, float, float &); void volume (float , float); float volume (float, float, float); Explicação: Resposta única. Pela chamada da função cout << "Volume = " << volume(a,b,c); temos que a função retorna um valor, que pelo enunciado, vemos que é do tipo float. Há ainda os valores de a, b e c que são medidas de uma figura geométrica. Logo, a, b e c são do tipo float. Como protótipo é uma declaração temos : tipo de retorno da função seguido do seu nome seguido de parênteses e dentro dos parênteses, temos os tipos das variáveis que estavam na chamada da função. Logo : float volume(float, float, float); Note a vírgula para separar os tipos e o ponto e vírgula ao final. 7a Questão Considere o trecho de um programa escrito em C++. void func1 (bool x, int ini, int fim) { for ( int y=ini; y != fim ; y++) { x = !x; if (x) cout << y << endl; else cout << -y << endl; } } int main() { func1(false, 1, 7); } Marque a opção correta que mostra o que é impresso na tela. 1, 2, 3, 4, 5, 6 1, -2, -3, -4, -5, -6 -1, 2, -3, 4, -5, 6 -1, -2, -3, -4, -5, -6 1, -2, 3, -4, 5, -6 Explicação: Fazendo um teste de mesa temos que será impresso a seguinte sequência : 1 -2 3 -4 5 -6, um embaixo do outro. Parte de um teste de mesa : x ini fim y false 1 7 1 true 2 false E continua x, ini, fim e y recebendo valores Tela : 1 -2 3 -4 5 -6 8a Questão Considere a função Adivinhe , n = 4 e que X é formado pela sequência "algoritmo". Assinale a opção que corretamente mostra o vetor Y ao fim da execução da função Adivinhe. void Adivinhe (char X[ ], char Y [ ], int n) { int i, j; j = 0; for ( i = n; i >= 0; i--) { Y[j] = X[i]; j++; } Y[j] = '\0'; } Ocorre erro, pois a função, que é do tipo void, não retorna o vetor Y. algor ogla rogla algo Explicação: Não há outra opção, pois a questão é objetiva. Vejamos passo a passo : X armazena "algoritmo" e Y será gerado. j i 0 4 1 3 2 2 3 1 4 0 5 -1 ... falha o teste i >= 0 A cada rodada do loop temos, considerando os valores de j e i acima, as seguintes atribuições : Y[0] recebe X[4], que é 'r' Y[1] recebe X[3], que é 'o' Y[2] recebe X[2], que é 'g' Y[3] recebe X[1], que é 'l' Y[4] recebe X[0], que é 'a' Y[5] recebe '\0' Daí, Y será rogla
Compartilhar