Atv 02 - Gra1033 Técnicas de Programação

Fazer download em pdf ou txt
Fazer download em pdf ou txt
Você está na página 1de 8

Usuário LUIZ PAULO DE FREITAS FERNANDES

Curso GRA1033 TÉCNICAS DE PROGRAMAÇÃO GR3342211 - 202110.ead-


8222.11
Teste ATIVIDADE 2 (A2)
Iniciado 26/04/21 20:41
Enviado 14/05/21 14:35
Status Completada
Resultado da 10 em 10 pontos
tentativa
Tempo decorrido 425 horas, 54 minutos
Resultados exibidos Respostas enviadas, Respostas corretas, Comentários

1 em 1 pontos
Pergunta 1
Quando construimos aplicações para que sejam executadas a partir do comando
de linha (prompt ou console), temos a possibilidade de passarmos informações
ao programa. Para tanto, usamos os parâmetros comumente identificados por
“ argc ” e “ argv ”. Considerando o trecho:

int main(int argc, char *argv[])

Analise as afirmativas a seguir, marcando com “V” a(s) verdadeira(s) e, com “F”
a(s) falsa(s):

( ) caso colocarmos, em nosso código “ printf(“%s”,argv[0]) ”, será impresso o


nome do próprio programa.
( ) caso não passemos nenhum parâmetro ao programa, “ argv ” assumirá o valor
0.
( ) o parâmetro “ argv ” é uma lista de strings .
( ) o parâmetro “ argc ” sempre será positivo e maior ou igual a 1.

Marque a opção que tiver a sequência que você julgue ser a correta:
Resposta Selecionada: .V ; F; V ; V .

Resposta Correta: .V ; F; V ; V .
Comentário Parabéns! Sua resposta foi a correta! Realmente, o parâmetro “ argv” sempre
da resposta: conterá pelo menos um item – que é o nome do arquivo executável evocado para a
execução, inserido na posição 0 do parâmetro “ argv”. Desta forma, o “argc”
sempre será maior ou igual a 1.

1 em 1 pontos
Pergunta 2
Uma das etapas iniciais da implementação das funções consiste na definição de
suas interfaces, ou seja, definição dos tipos de retornos e de suas listas de
parâmetros. Para essa questão, suponha o seguinte enunciado: “Um certa loja
apresenta um programa de incentivo aos seus vendedores atribuindo
premiações àqueles que realizaram mais vendas no mês (independentemente
do valor vendido) e àqueles que conseguiram maiores montantes de venda
(maior valor vendido independentemente do número de vendas efetuadas). As
vendas estão lançadas em uma matriz – cada linha denota um vendedor e as
colunas representam as vendas de cada vendedor. A última posição das colunas
de cada vendedor contém o valor -1 indicando o término dos lançamentos. Os
nomes dos vendedores estão lançados em um vetor de strings – cada vendedor
respresenta um índice do vetor“.

Para tanto, serão criadas as funções abaixo:

NomeVendedorMaiorQtdVendas( );
NomeVendedorMaiorValorVendas( );

Para a questão, suponha que a quantidade máxima de vendas vale 30 e os


nomes têm o tamanho máximo de 40 caracteres. Assinale a opção abaixo que
contenha as interfaces das funções apropriadas ao enunciado:
Resposta
Selecionada: . int NomeVendedorMaiorQtdVendas(float vendas[]
[30], char nomes[][40],
char
nomemaior[]) ;
float NomeVendedorMaiorValorVendas(float
vendas[][30], char nomes[][40],
char
nomemaior[]) .
Resposta
Correta: . int NomeVendedorMaiorQtdVendas(float vendas[]
[30], char nomes[][40],
char
nomemaior[]) ;
float NomeVendedorMaiorValorVendas(float
vendas[][30], char nomes[][40],
char
nomemaior[]) .
Comentário Parabéns! Sua resposta foi a correta! Você interpretou bem o enunciado realizando
da resposta: corretamente o tipo de retorno das funções e seus respectivos parâmetros.
Podemos reforçar o fato da escolha do tipo “ int” para a maior quantidade de
vendas (o número de vendas é um valor inteiro) e do tipo “ float” para o valor
vendido (o montande de valor é uma grandeza que manipula os centavos,
portanto, um valor do tipo real – float). Salientamos o fato de que, quando
passamos matrizes como parâmetros, temos que informar o tamanho de pelo
menos a última dimensão – essa foi o motivo de preenchermos o tamanho das
colunas.

1 em 1 pontos
Pergunta 3
Em algumas situações, como inversão de vetores, surge a necessidade de
implementar uma função que realiza a troca de dois elementos entre si, ou seja,
o elemento “ vet[i] ” recebe o valor de “ vet[j] ” e “ vet[j] ” recebe o valor de “ vet[i] ”.
Sendo assim, pode-se codificar uma função que realizará exatamente essa
permuta. Para essa questão, considere o código apresentado a seguir:

#include <stdio.h>
#include <string.h>

void swap(char __c1, char __c2)


{
char tmp;
tmp = __c1;
__c1 = __c2;
__c2 = tmp;
}

void Ordena(char str[])


{
for(int i=0; i < strlen(str)-1; i++)
for(int j=i+1; j < strlen(str); j++)
if(str[i]>str[j]) swap(__str[i],__str[j]);
}

int main()
{
char str[11]="icbjdgfeah";
printf("Vetor original: %s\n",str);
Ordena(str);
printf("Vetor ordenado: %s\n",str);
return 0;
}

Assinale a opção abaixo que contenha os elementos para preencher as lacunas


(nas opções abaixo, o símbolo ”_” significa deixar a lacuna sem preenchimento):
Resposta Selecionada: . * ; * ; * ; * ; * ; * ; & ; & .

Resposta Correta: . * ; * ; * ; * ; * ; * ; & ; & .

Comentário Parabéns! Sua resposta foi a correta! Você observou que, apesar da função
da resposta: “swap” manipular elementos do vetor, foram passadas posições específicas, ou
seja, foram passados apenas caracteres. Sendo assim, é necessário passar as
referências dos itens “ str[i]” e “ str[j]” para que as alterações realizadas
dentro da função “ swap” tenham validade na função “ Ordena”.

1 em 1 pontos
Pergunta 4
Gerar números aleatórios tem a sua serventia em diversas situações, tais como
geração de sequências para testes de softwares, solução inicial em problemas
de otimização e definição do intervalo de tempo para o reenvio de informações
em redes de computadores. Para o teste, imaginemos um cenário onde dois
jogares disputam uma partida de lançamento de dados – ganha aquele que
obtiver maior pontuação no dado lançado. Para simular esse cenário,
imaginemos o código abaixo:

#include <stdio.h> //arquivo header para a funcao printf()


#include <stdlib.h> //arquivo header para as funcoes srand() e rand()
#include <time.h> //arquivo header para a funcao time()

void Compara(int __jog1, int __jog2)


{
if(jog1 > jog2) printf("Jogador 1 vencedor (1=%d x 2=%d)\n",jog1,jog2);
else if (jog1 < jog2) printf("Jogador 2 vencedor!(1=%d x 2=%d)\n",jog1,jog2);
else printf("Empate (%d)\n",jog1);
}

___ Dado()
{
return ____;
}

int main()
{
srand(time(NULL));
Compara(Dado(),Dado());
return 0;
}

Assinale a opção abaixo que contenha os trechos de código para preencher as


lacunas (o caracter “_” significa para deixar a lacuna vazia):
Resposta Selecionada: . __ ; __ ; int ; (rand()%6)+1 .

Resposta Correta: . __ ; __ ; int ; (rand()%6)+1 .

Comentário Parabéns! Sua resposta foi a correta! Realmente nenhuma função requer
da resposta: passagem de parâmetros por referência pois o único valor retornado é feito através
do retorno da função “ Dado()”. A geração do número aleatório segue a forma
“ (rand()%6)+1” pois a soma por um impede a geração do valor 0 e o resto
da divisão define o valor limite superior do número gerado.

1 em 1 pontos
Pergunta 5
Na linguagem C/C++, encontramos alguns comandos capazes de modificar o
fluxo de execução de um programa: “ return ” (retorno de uma função), “ break ”
(finaliza, por exemplo, um laço de repetição) e “ continue ” que volta para a linha
que contém a definição do laço de repetição (por exemplo, a linha que contém a
palavra “ for ”). Para essa questão, suponha que seja necessário implementar
uma função hipotética que, passados como parâmetros os valores de “ início ” e
de “final ” de uma contagem, imprima os elementos de acordo com o seguinte
conjunto de regras: não imprimir os números ímpares; caso seja encontrado um
valor múltiplo de 5, sair de laço de repetição; caso seja encontrado o valor 48,
sair da função. Para tanto, analise o código a seguir:

#include <stdio.h>

void func(int inicio, int final)


{
int i=inicio;
for(; i<final; i++)
{
if(i%2) ____;
printf("%d ",i);
if(!(i%5)) ____;
if(i==48)
{
printf("\nSaindo da funcao pois encontrou 48.\n");
____;
}
}
if(i==final) printf("\nsaiu do laco pelo limite da contagem\n");
else printf("\nsaiu do laco pois encontrou um multiplo de 5\n");
}

int main()
{
printf("Execucao 1:\n");
func(6,15);
printf("Execucao 2:\n");
func(46,55);
printf("Execucao 3:\n");
func(36,39);
return 0;
}
Assinale a opção abaixo que contenha a ordem correta de aparição dos
comandos “return ”, “ break ” e “ continue ”:
Resposta Selecionada: . continue ; break ; return .

Resposta Correta: . continue ; break ; return .

Comentário Parabéns! Sua resposta foi a correta! Realmente, para pular os ímpares, deve-se
da resposta: incrementar o contador de contagem e voltar ao início do laço de repetição,
usando, para tal, o “ continue”. Por sua vez, a finalização do laço (quando for
múltiplo de 5) é conseguido pelo comando “ break”. Por fim, para encerrar
totalmente a função, ao se deparar com o valor 48, utiliza-se o comando
“return”.

1 em 1 pontos
Pergunta 6
Na definição do protótipo da função, em sua interface, temos que definir o tipo de retorno da função
e, também, a lista de parâmetros. Para essa questão, suponha o trecho de código a seguir:

#include <stdio.h>
#include <stdlib.h>

int func(int a, int __b, char __c[])


{
a +=++__b;
itoa(a,c,10);
return a;
}

int main()
{
char c[10];
int x=5, y=6;
printf("%d %s %d %d",func(x,&y,c),c,x,y);
}

Escolha a afirmativa que contém o resultado da impressão pela função “ printf” e os trechos a
serem inseridos nas lacunas:

Resposta Selecionada: .12 12 ; * ; deixar em branco ; * .

Resposta Correta: .12 12 ; * ; deixar em branco ; * .

Comentário Parabéns! Sua resposta foi a correta! Você observou bem o fato de que a chamada
da resposta: da função, dentro do programa principal, requer uma passagem por valor para a
variável “x” e uma passagem por referência para a variável “y”. Isso implica em
“ int func(int a, int *b, char __c[])“ e, consequentemente,
“ a +=++(*b);”. Uma string sempre é passada por referência – sendo assim,
não necessita o uso de “ *”.

1 em 1 pontos
Pergunta 7
Na computação, existem várias formas de representação numérica, dentre as
quais, podemos citar as representações decimal, hexadecimal, octal e binária.
Para realizar a conversão, por exemplo, de um valor formatado na base decimal
para uma base K , basta realizar divisões sucessivas por K e coletar o último
quociente e todos os restos das divisões em ordem inversa.
Suponha a necessidade de criar uma função recursiva para a conversão de um
número na base decimal para a representação binária (base 2). Para essa
questão, suponha o trecho a seguir:

#include <stdio.h>

void Dec2Bin(int n)
{
if(__) printf("%d",n);
else
{
___;
___;
}
}

int main()
{

Dec2Bin(14);
return 0;
}

Assinale a opção abaixo que contenha os trechos de código para preencher as


lacunas:
Resposta
Selecionada: . n<2 ; Dec2Bin(n / 2) ; printf("%d",n%2) .
Resposta Correta:
. n<2 ; Dec2Bin(n / 2) ; printf("%d",n%2) .
Comentário Parabéns! Sua resposta foi a correta! Você interpretou corretamente o fato de a
da resposta: impressão dos restos das divisões sucessivas é realizada na ordem reversa às
divisões, ou seja, a impressão necessita ser do tipo “pós-ordem”, inserida após a
chamada recursiva. Como critério de parada, a cláusula que indica a não
possibilidade de continuar as divisões por 2.

1 em 1 pontos
Pergunta 8
Um valor binário pode ser representado no padrão conhecido como BCD 8421
(Binary-coded Decimal – Decimal Codificado em Binário). Nesta codificação, os
valores 8421 representam o resultado de 2 i , onde i denota a posição do dígito
dentro da palavra. Por exemplo, 1001 (2) = 1*8 + 0*4 + 0*2 +1*1 = 9 (10) . Para
essa questão, suponha o seguinte código recursivo:

#include <stdio.h>
#include <string.h>

int Bin2Dec(char bin[],int pos,int exp)


{
if(____) return 0;
return (bin[pos]-48)*exp + Bin2Dec(bin,____,____);
}

int main()
{
char binario[9]="10011101"; //valor em decimal = 157
printf("Valor convertido: %d", Bin2Dec(binario,strlen(binario)-1,1));
return 0;
}
Assinale a opção abaixo que contenha os trechos de código para preencher as
lacunas:
Resposta Selecionada: . pos<0 ; pos-1 ; exp*2 .

Resposta Correta: . pos<0 ; pos-1 ; exp*2 .

Comentário Parabéns! Sua resposta foi a correta! Realmente o código foi implementado para
da resposta: que a última posição fosse evocada antes para facilitar o cálculo do expoente – à
medida que se aproxima da posição 0 (início do vetor – posição mais significativa
do número binário), o expoente vai sendo multiplicado por 2. Sendo assim, a
posição foi descrementada a cada evocação da função recursiva. A posição 0 do
vetor também deveria ser manipulada – essa a razão do ( pos<0).

1 em 1 pontos
Pergunta 9
Em funções recursivas, a posição da chamada recursiva em relação às demais
linhas de seu código influencia o resultado. Dependendo da posição, a
recursividade é dita como pré-ordem (quando o processamento antecede a
chamada recursiva); ordem simétrica (quando o processamento encontra-se
entre duas chamadas recursivas) ou, finalmente, pós-ordem (processamento
após as chamadas recursivas). Para essa questão, suponha o código a seguir:

#include <stdio.h>

void Recursao1(int i)
{
if(i>=5) return;
printf("%d ",i);
Recursao1(i+1);
}

void Recursao2(int i)
{
if(i>=5) return;
Recursao2(i+1);
printf("%d ",i);
}

int main()
{
printf("Recursao1\n");
Recursao1(0);
printf("\n\nRecursao2\n");
Recursao2(0);
return 0;
}

Assinale a opção que você julgue ser a correta:


Resposta
Selecionada: .A função “ Recursao1” segue uma recursão pré-ordem – logo o seu resultado
é “ 0 1 2 3 4”. Por sua vez, a função “ Recursao2” é pós-ordem, por
consequência, o seu resultado é: “ 4 3 2 1 0” .

Resposta
Correta: .A função “Recursao1” segue uma recursão pré-ordem – logo o seu
resultado é “0 1 2 3 4”. Por sua vez, a função “Recursao2” é pós-
ordem, por consequência, o seu resultado é: “4 3 2 1 0” .
Comentário Parabéns! Sua resposta foi a correta! Você observou corretamente a ordem de
da resposta: chamada e impressão do resultado. Na pré-ordem, a impressão acontece antes da
chamada, por consequência, a impressão é realizada, neste caso, na ordem
crescente. Na pós-ordem, a impressão acontece na ordem descrescente pois a
recursão caminha por todos os níveis da contagem e imprime o resultado na volta
das chamadas recursivas.

1 em 1 pontos
Pergunta 10
Funções são blocos funcionais modulares presentes nas linguagens de
programação estruturadas. A criação de funções, por exemplo, em C, deve
seguir a sintaxe: <tipo_de_retorno> nome_da_função (lista_de_parâmetros).
Para essa questão, suponha o trecho de código a seguir:

int funcao(int a, int *b)


{
a++;
*b = a * 2;
return b+5;
}

int main()
{
int x=4,y=8,z;
z = funcao(x,&y);
printf(“%d %d %d\n”,x,y,z);
return 0;
}

Assinale a alternativa que apresenta os valores impressos pela função “ printf ”:


Resposta Selecionada: .4 10 15.

Resposta Correta: .4 10 15.


Comentário Parabéns! Sua resposta foi a correta! Você utilizou, com sucesso, os conceitos de
da resposta: passagem de parâmetros por valor e por referência. No caso, realmente, devido à
passagem por valor, a variável “ a”, apesar da alteração internamente à função,
não influenciará o valor de “ x” - variável de origem.

Você também pode gostar