Baixe o app para aproveitar ainda mais
Prévia do material em texto
Atividade 2 - Técnicas de Programação 1- Para essa questão, suponha o seguinte enunciado: “O imposto de renda incidirá sobre o salário de todos os assalariados de modo que o desconto seja proporcional ao seu salário e de acordo com as faixas de valores”. Para esse enunciado foi implementada uma função cuja chamada ocorrerá na forma: . . . float salarioLiquido; salarioLiquido = CalculaIRPF(salario_bruto, &imposto_retido); . . . Assinale a opção abaixo que represente a interface mais apropriada para a questão: R: · . float CalculaIRPF(float, float *); . 2- 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: R: · .12 12 ; * ; deixar em branco ; * . 3- Para a evocação de uma função, algumas informações deverão ser armazenadas, como o endereço da linha que contém a evocação (registrador PC - Program Counter - Contador de Programa), para que, quando a função for finalizada, o computador saiba voltar ao ponto de chamada. Dentre as afirmativa abaixo, assinale com “V” aquela(s) que você julgar estar correta e, com “F”, a(s) falsa(s). ( ) As informações para o retorno, em função da evocação da função, são empilhadas em uma região da memória principal do computador chamada “ stack” (pilha). ( ) Não precisamos nos preocupar com a quantidade de evocações aninhadas (uma função chamando outra e assim por diante, em uma ação de profundidade) independentemente dos dispositivo para o qual estamos implementando nosso código. ( ) Funções recursivas são aquelas que demandam muito recurso da máquina. ( ) O sistema operacional também empilha as informações decorrentes das funções associadas às interrupções do computador. Assinale a alternativa abaixo que contenha a sequência que você julgue ser a correta: R: · .V; F; F; V. 4- 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: R: · . n<2 ; Dec2Bin(n / 2) ; printf("%d",n%2) . 5- 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”: R: · .4 10 15. 6- Quando se implementa uma fução, devemos seguir a sintaxe da linguagem de programação utilizada e, também, realizar a definição de sua interface de acordo com as nossas necessidades. Para essa questão, suponha o trecho de código a seguir para procurar uma sequência dentro de uma cadeia de DNA: #include <stdio.h> #include <string.h> ___ ProcuraDNA(char ___dna[],char ___seq[],int ___ret[]) { int indice=0; for(int i=0; i<strlen(dna); i++) if(!strncmp(&(dna[i]),seq,3)) ret[indice++]=i; ret[indice]=-1; //apenas para marcar o último item adicionado } int main() { int i=0, pos[19]; char str[19] = "GATGATCATGTCGTACATC", //uma sequencia de DNA qualquer seq_proc[4] = "ATG"; //Adenina, Timina, Guanina - uma cadeia exemplo ProcuraDNA(str,seq_proc,pos); printf("posicoes:"); while(pos[i]!=-1) { printf("%d ",pos[i]); i++; } return 0; } Escolha a afirmativa que contém o resultado da impressão pela função “printf” e os trechos a serem inseridos nas lacunas: R: · . void ; deixar em branco ; deixar em branco ; deixar em branco . 7- Os compiladores C/C++, para realizar a verificação de consistência de uso das funções, faz uso dos arquivos de cabeçalhos (headers). Nestes arquivos, por exemplo, o protótipo das funções são declarados. Desta forma, o compilador verifica se as chamadas implementadas estão compatíveis com as definições das funções. Para essa questão, suponha a existência de dois arquivos: um contendo o arquivo header e outro contendo a implementação em C. (A) Arquivo header: #ifndef _ARQHEADER #define _ARQHEADER int func1(int *, int); float func2(float, char []); void func3(int *, int *, float); int func4(char[],int, char); #endif (B) Arquivo de implementação int main() { int a,b,c; float f1,f2; char str[20],carac; c=func1(a,b); //Linha 1 f2=func2(f1,str[0]); //Linha 2 c=func3(&a, &b, f1); //Linha 3 c=func4(str,a,carac); //Linha 4 func1(&c,a); //Linha 5 return 0; } Analisando a parte de implementação com o arquivo header, assinale a alternativa que contém os possíveis erros que seriam acusados pelo compilador: R: · .Na linha 1, o parâmetro “ a” não está sendo passado por referência (falta o “ &”); na linha 2, está sendo passado o caracter da posição 0 e não toda a string “ str”; na linha 3, está sendo atribuído um valor à variável “ c” por intermédio de uma função que nada retorna ( func3); as demais linhas estão corretas. 8- 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): R: · . * ; * ; * ; * ; * ; * ; & ; & . 9- Quando se implementa uma fução, devemos seguir a sintaxe da linguagem de programação utilizada e, também, realzar a definição de sua interface de acordo com as nossas necessidades. Para essa questão, suponha o trecho de código a seguir: #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() ___ func1(int ___x, ___ a) { ___x=rand()%a; return ___x*(rand()%5); } int main() { int aleat,ret; int a=10; srand(time(NULL)); //iniciacao do gerador de numeros aleatorios for(int i=0; i<10;i++) { ret=func1(__aleat,a); printf("valor aleatorio gerado %d: %d (limitado %d) - ret funcao: %d.\n", i,aleat,a,ret); } return 0; } Escolha a afirmativa que contém o resultado da impressão pela função “printf” e os trechos a serem inseridos nas lacunas: R: . int; * ; deixar em branco ; * ; * ; & . 10- Modularizar um sistema significa dividí-lo em blocos funcionais e, estes subdividí-los em funções. É recomendável que as funções tenham o seu comportamento bem pontual, ou seja, deve ser única a desempenhar uma função específica. Diante da questão sobre modularização, assinale com “V” a(s) afirmativa(s) abaixo que você julgue como verdadeira(s) e, com (F), a(s) falsa(s). ( ) Dificulta o processo de testes pelo fato de que, com a modularização, deve-se testar um número muito maior de funções . ( ) Facilita a reutilização do código pois a funcionalidade de uma função pode fazer parte de uma outra parte do sistema. ( ) O programa fica mais organizado, separado por funcionalidades. ( ) A compreensão do código se torna mais exaustiva devido ao grande número de chamadas de funções na implementação. Escolha a opção correta: R: · .F ; V ; V ; F .
Compartilhar