Buscar

Prova N2 TÉCNICAS DE PROGRAMAÇÃO

Prévia do material em texto

TÉCNICAS DE PROGRAMAÇÃO
N2
Se foi útil para você deixe um joinha 
Pergunta 1)
Na programação em C, podemos encontrar duas formas distintas de se abrir um arquivo (textual ou binária) aliadas aos modos que esse arquivo será manipulado. Para essa questão, analise o código a seguir, que manipula um arquivo binário, e preencha a lacuna corretamente.
. . .
FILE *arq;
int codigo;
char buffer[35]="algo a ser escrito no arquivo\n";
arq=fopen("exercicio.dat","____");
if(arq==NULL)
{
printf("Erro de abertura do arquivo.\n");
return 0;
}
...
if(!fread(&codigo,sizeof(int),1,arq)) //caso o arquivo ainda esteja vazio
codigo=0;
else
codigo++;
...
if(!fwrite(&codigo,sizeof(int),1,arq))
printf("erro na gravacao do codigo.\n");
else
if(!fwrite(buffer,35,1,arq))
printf("Erro na gravacao do buffer.\n");
fclose(arq);
. . .
Considerando que, caso o arquivo não exista, será criado um novo e caso exista, os dados deverão ser mantidos, assinale a alternativa que corresponda ao preenchimento da lacuna.
Resposta: 
ab+.
Pergunta 2)
Em algumas situações, temos a necessidade de contabilizar a quantidade de certos elementos dentro de uma estrutura do tipo vetor. Para essa questão, suponha que exista a necessidade de contar a quantidade de vogais para que, em seguida, as quantidades classificadas por cada vogal sejam impressas na tela. Para isso, observe o código a seguir:
#include <stdio.h>
#include <string.h>
int main()
{
char str[50]="testando a quantidade de vogais na frase.";
int qtdVogais[5]={0,0,0,0,0};
for(int i=0; i<50; i++)
switch(str[i])
{
case 'a': qtdVogais[0]=qtdVogais[0]++;
case 'e': qtdVogais[1]=++;
case 'i': qtdVogais[2]++;
case 'o': qtdVogais[3]++;
case 'u': qtdVogais[4]++;
}
printf("A=%d E=%d I=%d O=%d U=%d\n",qtdVogais[0],qtdVogais[1],
qtdVogais[2],qtdVogais[3],qtdVogais[4]);
return 0;
}
O programa acima apresenta alguns erros. Com base na análise do código, selecione a opção correta:
Resposta: No código faltam os comandos “ break” associado a cada caso do “ switch”. O critério de parada do laço de repetição não atende às expectativas; o correto seria usar o “ strlen(str)”.
Pergunta 3)
Uma alocação dinâmica de memória consiste em alocar uma certa região de memória para receber informações de um certo tamanho que poderá variar ao longo do processamento do programa. Para essa questão, enumere as linhas de código a seguir de modo a representar a sequência correta que deverá ser programada: 1 para a primeira linha de código que deverá ocorrer, 2 para a segunda e assim por diante:
 
( ) vetor = (int *) malloc(sizeof(int));
( ) int *vetor;
( ) free(vetor);
( ) if(vetor==NULL)
return;
( ) *(vetor+i) = 5;
 
Assinale a alternativa que apresenta a sequência correta.
Resposta: 2, 1, 5, 3, 4.
Pergunta 4) B
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: .  n<2 ; Dec2Bin(n / 2) ; printf("%d",n%2) .
Pergunta 5)
Uma das operações recorrentes em relação à manipulação de vetor consiste em identificar o maior ou o menor valor dentre aqueles armazenados. Para essa questão, considere o código apresentado abaixo:
#include <stdio.h>
#include <string.h>
int main()
{
int vet[10]={5, 2, 4, 9, 1, 3, 8, 6, 0, 7},maior;
int i,pos_maior=0;
maior=vet[0];
for(i=0; i<strlen(vet);i++)
if(vet[i]>maior)
{
maior = vet[i];
pos_maior = i;
}
printf("Maior valor: %d (pos = %d)", vet[pos_maior],pos_maior);
return 0;
}
A partir do código apresentado, avalie as afirmativas abaixo:
I - Pode-se substituir o bloco do comando “for” por
i=0;
while(vet[i])
{
if(vet[i]>maior)
{
maior = vet[i];
pos_maior = i;
}
i++;
}
II - O valor inicial da variável “maior” poderia ser substituído por um valor muito pequeno (ao invés de receber o conteúdo da primeira posição do vetor) porém, apresentaria uma vulnerabilidade pois correria o risco do vetor não possuir um valor superior ao instanciado.
III - O valor inicial de “i” no código apresentado poderia ser 1 ao invés de 0.
IV - Esse algoritmo seria o mais otimizado dentre os mecanismos de busca mesmo se o vetor já estivesse ordenado crescentemente.
Escolha, dentre as opções a seguir, a alternativa que você julgue ser a correta:
Resposta: 
I, II e III são verdadeiras.
Pergunta 6)
Em vários exemplos do mundo real (na natureza, nas artes, nas engenharias etc.) encontramos a sequência de Fibonacci, ela é construída a partir de seus dois primeiros elementos, que valem 1 (um) e, depois, cada elemento seguinte é igual à soma dos dois elementos imediatamente anteriores. Por exemplo, em uma série de Fibonacci de 8 elementos tem-se: [1; 1; 2; 3; 5; 8; 13; 21].
Para essa questão, suponha o código a seguir:
#include <stdio.h>
#include <string.h>
int main()
{
int n=8,a=__,b=__,c,i;
printf("serie de Fibonacci %d elementos: %d,%d",n,a,b);
for (i= __ ; __;i++)
{
c=__;
printf(", %d",c);
a=__; b=__;
}
return 0;
}
Escolha a alternativa que represente o correto preenchimento das lacunas no código acima.
Resposta: .1 ; 1; 3 ; i<=n ; a+b ; b; c .
Pergunta 7)
Para essa questão, suponha que um certo arquivo mantém, em sua primeira posição, a quantidade de registros armazenados. Após o indicativo da quantidade, são gravados os valores na forma <int,float>. Desta forma, o arquivo consiste em:
<qtd_registros><int1><float1><int2><float2>...<intn,floatn>.
Para essa questão, analise o código a seguir e preencha as lacunas de modo a representar o processo listagem de todos os registros armazenados no arquivo.
#include <stdio.h>
 
int main()
{
FILE *arq;
int qtd,valor_int,i;
float valor_float;
arq=fopen("exercicio.dat","___");
if(arq==NULL)
{
printf("Erro de abertura do arquivo.\n");
return 0;
}
fread(&qtd,____,1,arq);
for(i=0; i<qtd;i++)
{
____(&valor_int,sizeof(int),1,arq);
____(&valor_float,sizeof(float),1,arq);
printf("[%d] int=%d float=%f\n",i,valor_int,valor_float);
}
fclose(arq);
return 0;
}
Assinale a alternativa que você julgue ser a correta.
Resposta: 
. rb ; sizeof(int) ; fread ; fread .
Pergunta 8) B
Genericamente, uma string pode ser definida como uma sequência de caracteres dispostos em uma estrutura homogênea (vetor). Em C/C++, as strings são iniciadas na posição 0 do vetor e são finalizadas pelo caractere nulo. Para essa questão, suponha que existe uma string carregada em uma variável denominada “str”. Dadas as sequências de código a seguir, assinale aquela (s) que proporciona (m) a impressão da string em ordem inversa com “I” e, com “N”, a (s) que proporcionam a impressão em ordem normal.
( ) i=0;
do
{
printf("%c",str[i]);
i++;
} while(str[i]=='\x0');
( ) i=strlen(str)-1;
while(i)
{
printf("%c",str[i]);
i--;
}
( ) for(i=strlen(str)-1;i>=0;i--)
printf("%c",str[i]);
( ) i=0;
for(;str[i];i++)
printf("%c",str[i]);
Assinale a alternativa que apresenta a sequência correta:
Resposta: N; I; I; N.
Pergunta 9)
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: . int NomeVendedorMaiorQtdVendas(float vendas[][30], char nomes[][40],
                                   char nomemaior[]) ;
     float NomeVendedorMaiorValorVendas(float vendas[][30], char nomes[][40],
                                   char nomemaior[]) .
Pergunta 10)
Um ponteiro para ponteiro denota uma variável que armazena um valor através de uma dupla indireção. Sendo assim, um ponteiro referência um outro ponteiro que, por sua vez, aponta para um valor específico. Para essa questão, analise o código a seguir:
 
#include <stdio.h>
 
int main()
{
int a = 10, *pont, **pontpont;
pont = &a;
pontpont = &pont;
a = 12;
printf("pont = %d\t pontpont: %d\n", *pont,**pontpont);
return 0;
}
 
Assinale a alternativa que apresenta os valores impressos pela função “printf()”.
Resposta: 12 12.

Continue navegando