Preparatório EsFCExTÉCNICAS DE PROGRAMAÇÃO a. Lógica Aplicada Prof. Ricardo Sant'Ana Sumário 1 Introdução 2 Resolução de Exercícios 3 Conclusão Introdução Lista de Assuntos 2. TÉCNICAS DE PROGRAMAÇÃO: • a. Lógica aplicada: algoritmos, técnicas de construção de algoritmos, resolução de problemas. Introdução Bibliografia COSTA, Daniel G. JAVA em Rede: Recursos Avançados. Rio de Janeiro: Brasport, 2008. DEITEL, H. M. JAVA Como Programar. 6. ed. [S.l.]: Editora Bookman, 2006. GAMMA, Erich et al. Padrões de Projeto: Soluções Reutilizáveis de Software Orientado a Objetos. [S.l.]: Bookman, 2005. GUIMARÃES, Ângelo de Moura; LAGES, Newton de Castilho. Algoritmos Estruturados de Dados. [S.l.]: Editora LTC, 1994. MORGAN, Michael. JAVA 2 para Programadores Profissionais. [S.l.]: Editora Ciência Moderna, 2001. MUTO, Claudio Adonai. PHP & MYSQL Guia Completo. [S.l.]: Brasport, 2004. TENENBAUM, Aaron M.; LANGSAM, Yedidyah; AUGENSTEIN, Moshe J. Estruturas de Dados Usando C. [S.l.]: Makron Books, 1995. VELOSO, Paulo et al. Estrutura de Dados. [S.l.]: Editora Campus, 1983. WIRTH, Niklaus. Algorítmos e Estruturados de Dados. [S.l.]: Editora PHB, 1989. Introdução Motivação: Questão 60 da segunda prova 2014 Teoria na forma de Exercícios Conhecimento prévio! Introdução #include <stdio.h> int main(){ int i=9; i^=15; i>>=1; i<<=2; printf("%d",i); return 0; } Introdução #include <stdio.h> i=9 int main(){ int i=9; i^=15; i>>=1; i<<=2; printf("%d",i); return 0; } Introdução #include <stdio.h> i^=15 int main(){ i=i^15 int i=9; i^=15; ^ → operador xor i>>=1; 0000 1001 → 9 i<<=2; printf("%d",i); 0000 1111 → 15 return 0; 0000 0110 → 6 } Portanto, i=6 Introdução #include <stdio.h> i>>=1 int main(){ i=i>>1 int i=9; i^=15; >> → operador i>>=1; deslocamento i<<=2; printf("%d",i); 0000 0110 11 → 6 return 0; 0000 0011 → 3 } Portanto, i=3 Introdução #include <stdio.h> i<<=2 int main(){ i=i<<2 int i=9; i^=15; << → operador i>>=1; deslocamento i<<=2; printf("%d",i); 0000 0011 → 3 return 0; 0000 1100 11 → 12 } Portanto, i=12 Introdução #include <stdio.h> Imprime int main(){ %d → inteiro int i=9; i^=15; Saída = 12 i>>=1; i<<=2; printf("%d",i); return 0; } Questão 01 Qual a saída desse código ? #include <stdio.h> int main(){ int i=~9; printf("%d",i); return 0; } Questão 01 Operador ~:complemento #include <stdio.h> Originalmente, int tem tamanho de 4 bytes int main(){ int i=~9; Representaremos com 2 printf("%d",i); bytes return 0; 0000 0000 0000 1001 → 9 } E o que é o complemento ? Questão 01 0000 0000 0000 1001 → 9 #include <stdio.h> 1111 1111 1111 0110 → ~ Esse é um número negativo! 1 int main(){ a esquerda!!! int i=~9; printf("%d",i); return 0; Mas que número é esse ? } C utiliza complemento 2 para representar números negativos: 1111 1111 1111 0110 Inverte e soma 1 para ver que número é negativo: 0000 0000 0000 1001 0000 0000 0000 0001 +1 0000 0000 0000 1010 10 – portanto 10 negativo Questão 02 Qual a saída desse código ? #include <stdio.h> #include <stdlib.h> int main(){ int i = pow(2,16)-1; if (!i) { printf("verdadeiro %d",i); } else printf("falso! %d",i); return 0; } Questão 02 Qual é esse valor ? #include <stdio.h> Pow → potência, ou seja,2 #include <stdlib.h> elevado a 16. int main(){ Ou seja,65536 int i = pow(2,16)-1; Assim i= 65535 if (!i) { printf("verdadeiro %d",i); } else printf("falso! %d",i); return 0; } Questão 02 Em C podemos verificar #include <stdio.h> condições com qualquer valor #include <stdlib.h> → ao contrário do Java que utilizamos o tipo boolean. int main(){ Assim, o valor do int i = pow(2,16)-1; condicional será falso if (!i) { somente se for ZERO ! printf("verdadeiro %d",i); } O que nos leva a crer que, else no caso dessa questão, o printf("falso! %d",i); valor será verdadeiro ! return 0; } Questão 02 Mas antes da variável i #include <stdio.h> existe o operador NOT (que #include <stdlib.h> funciona bit a bit). Assm: i = 65535 int main(){ int i = pow(2,16)-1; Ou seja, em binário, i tem o if (!i) { valor 1111 1111 1111 1111. printf("verdadeiro %d",i); Assim, } !i = 0000 0000 0000 0000 else printf("falso! %d",i); Ou seja, !i vale ZERO. Portanto será apresentado a return 0; saída: } falso! 65535 Questão 03 Qual a saída desse código ? #include <stdio.h> #include <stdlib.h> int main() { int intern = 1; int extern = intern^extern; printf("%d \n",result); return 0; } Questão 03 Novamente, lembrando que ^ é #include <stdio.h> o operador xor, temos #include <stdlib.h> 0000 0000 0000 0001 int main() { 0000 0000 0000 1000 xor int intern = 1; int extern = 8; -------------------- int result = intern^extern; 0000 0000 0000 1001 printf("%d \n",result); return 0; } Ou seja, resultado vale 9! Questão 03 ERRADO ! #include <stdio.h> #include <stdlib.h> extern → palavra reservada int main() { do C ! Não pode ser int intern = 1; utilizada como nome de int extern = 8; variável ! int result = intern^extern; printf("%d \n",result); return 0; Esse programa não compila ! } Questão 04 Prova: FUNIVERSA - 2012 - PC-DF - Perito Criminal - Informática São palavras-chave da linguagem C no padrão ANSI e, portanto, não podem ser utilizadas como nomes para variáveis a) typedef, master, core, newline. b) union, extern, main, core. c) int, long, static, void. d) Float, Long, Core, Continue. e) signed, unsigned, master, main. Questão 04 Prova: FUNIVERSA - 2012 - PC-DF - Perito Criminal - Informática São palavras-chave da linguagem C no padrão ANSI e, portanto, não podem ser utilizadas como nomes para variáveis a) typedef, master, core, newline. b) union, extern, main, core. c) int, long, static, void. d) Float, Long, Core, Continue. e) signed, unsigned, master, main. Questão 04 auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while Questão 04 Especificadores de Classe de Armazenamento: auto extern static register Questão 04 Especificadores de Classe de Armazenamento: auto • O especificador de classe de armazenamento auto define variáveis locais. Raramente usado pois todas as variáveis do C são auto por definição #include <stdio.h> #include <stdlib.h> int main() { int auto i = 1; int auto e = 8; int auto result = i^e; printf("%d \n",result); return 0; } Questão 04 Especificadores de Classe de Armazenamento: extern • O extern define variáveis que serão usadas em um arquivo apesar de terem sido declaradas em outro. int count; float sum; main (void){ ... return 0; } Questão 04 Especificadores de Classe de Armazenamento: extern • O extern define variáveis que serão usadas em um arquivo apesar de terem sido declaradas em outro. extern int count; extern float sum; int RetornaCount (void) { ... return count; } Questão 04 Especificadores de Classe de Armazenamento: static O funcionamento das variáveis declaradas como static depende se estas são globais ou locais. Variáveis globais static funcionam como variáveis globais dentro de um módulo, ou seja, são variáveis globais que não são (e nem podem ser) conhecidas em outros módulos. Isto é util se quisermos isolar pedaços de um programa para evitar mudanças acidentais em variáveis globais. Questão 04 Especificadores de Classe de Armazenamento: static Variáveis locais static são variáveis cujo valor é mantido de uma chamada da função para a outra. Veja o exemplo: int count (void) { static int num=0; num++; return num; } A função count() retorna o número de vezes que ela já foi chamada. Questão 04 Especificadores de Classe de Armazenamento: register O computador tem a memória principal e os registradores da CPU. As variáveis (assim como o programa como um todo) são armazenados na memória. O modificador register diz ao compilador que a variável em questão deve ser, se possivel, usada em um registrador da CPU. • Velocidade • Não pode ser global • Pedido do programador Questão 05 #include <stdio.h> Qual a saída desse código ? void func(); int i = 10; int main() { int i = 20; func(); printf("i= %d ", i); { int i = 30; func(); printf("i= %d ", i); } return 0; } void func() { printf("i = %d ", i); } Questão 05 #include <stdio.h> Essa é uma questão de escopo void func(); de variáveis. int i = 10; A primeira variável i foi definida num escopo global int main() { int i = 20; e, portanto, tanto main() func(); como func() tem acesso a printf("i= %d ", i); ela: { void func(); int i = 30; func(); int i = 10; printf("i= %d ", i); } int main() { return 0; } ... } void func() { printf("i = %d ", i); } void func() { ... } Questão 05 #include <stdio.h> Essa variável i=20 local void func(); sobrepõe a variável i int i = 10; global. Chamamos a função fund() int main() { int i = 20; Não há motivo para ter func(); acesso a variável i printf("i= %d ", i); declarada dentro do escopo { main() int i = 30; func(); Portanto será impresso o printf("i= %d ", i); valor da variável i GLOBAL: } i=10 return 0; } void func() { printf("i = %d ", i); } Questão 05 #include <stdio.h> Agora iremos imprimir o void func(); valor da variável i int i = 10; declarada no escopo main() - pois ela sobrepõe a variável int main() { i GLOBAL: int i = 20; func(); i=10 i=20 printf("i= %d ", i); { int i = 30; func(); printf("i= %d ", i); } return 0; } void func() { printf("i = %d ", i); } Questão 05 #include <stdio.h> Declaramos uma variável i void func(); dentro de um “sub-escopo” do int i = 10; main (portanto variável local) com o valor 30. Essa int main() { variável sobrepõe a variável int i = 20; i declarada dentro do escopo func(); main() e sobrepõe a variável printf("i= %d ", i); i declarada GLOBAL. { int i = 30; func(); printf("i= %d ", i); } return 0; } void func() { printf("i = %d ", i); } Questão 05 #include <stdio.h> Chamamos a função fund() void func(); Não há motivo para ter int i = 10; acesso a variável i declarada dentro do sub- int main() { int i = 20; escopo main() func(); Portanto será impresso o printf("i= %d ", i); valor da variável i GLOBAL: { int i = 30; i=10 i=20 i=10 func(); printf("i= %d ", i); } return 0; } void func() { printf("i = %d ", i); } Questão 05 #include <stdio.h> Dentro do sub-escopo void func(); declarado em main() a int i = 10; variável i tem valor 30, portanto esse valor será int main() { impresso: int i = 20; func(); i=10 i=20 i=10 i=30 printf("i= %d ", i); { int i = 30; func(); printf("i= %d ", i); } return 0; } void func() { printf("i = %d ", i); } Questão 06 #include <stdio.h> Qual a saída desse código ? func(int *a, int b) { int temp; temp = *a; *a = b; b = temp; } int main() { int a = 10, b = 20; func(&a, b); printf("a = %d, b = %d", a, b); return 0; } Questão 06 #include <stdio.h> Esse código ś sobre passagem func(int *a, int b) { de parâmetro: por valor e int temp; por referência. temp = *a; Quando chamamos a função *a = b; func (&a, b), a é passado b = temp; } por referência e b é passado int main() { por valor. Isso quer dizer int a = 10, b = 20; que se a função func func(&a, b); modificar “a” a variável printf("a = %d, b = %d", a, b); será realmente modificada. return 0; Se a função modificar “b”, b } continua inalterado. Questão 06 #include <stdio.h> a=10 e b=20 func(int *a, int b) { int temp; temp = *a; *a = b; b = temp; } int main() { int a = 10, b = 20; func(&a, b); printf("a = %d, b = %d", a, b); return 0; } Questão 06 #include <stdio.h> Chamamos a função func. func(int *a, int b) { int temp; temp = *a; *a = b; b = temp; } int main() { int a = 10, b = 20; func(&a, b); printf("a = %d, b = %d", a, b); return 0; } Questão 06 #include <stdio.h> Para as variáveis locais da func(int *a, int b) { função func: int temp; temp = *a, portanto temp=10 temp = *a; *a = b; *a=b, portando a=20 b = temp; b=temp, portanto b=10 } int main() { int a = 10, b = 20; func(&a, b); printf("a = %d, b = %d", a, b); return 0; } Questão 06 #include <stdio.h> Ao sair da função func() a func(int *a, int b) { variável a do escopo main() int temp; sofreu as alterações em func temp = *a; ou seja, a vale 20. Já a *a = b; variável b do escopo main() b = temp; continuou inalterada, } portanto, 20. int main() { int a = 10, b = 20; Assim: func(&a, b); a=20, b=20 printf("a = %d, b = %d", a, b); return 0; } Questão 07 #include <stdio.h> Questão de lógica int concurso(int v[10], int c) { Qual a saída do código ao int i = 0; int s = 9; lado ? int m; while (i <= s) { m = i + (s - i) / 2; if (c == v[m]) return m; else if (c < v[m]) s = m - 1; else i = m + 1; } return -1; } int main(int arc, char * argv[]) { int v[10] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 }; printf("%d\n", concurso(v, 3)); return 0; } Questão 07 #include <stdio.h> Vetor v int concurso(int v[10], int c) { 0 1 2 3 4 5 6 7 8 9 int i = 0; int s = 9; 1 3 5 7 9 11 13 15 17 19 int m; while (i <= s) { m = i + (s - i) / 2; if (c == v[m]) concurso(v,3) return m; else if (c < v[m]) s = m - 1; else i = m + 1; } return -1; } int main(int arc, char * argv[]) { int v[10] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 }; printf("%d\n", concurso(v, 3)); return 0; } Questão 07 #include <stdio.h> Função concurso: int concurso(int v[10], int c) { I=0, s=9 int i = 0; int s = 9; While (i<=s) int m; while (i <= s) { m=0+(9-0)/2 m = i + (s - i) / 2; if (c == v[m]) m=4 return m; c == v[m]??? else if (c < v[m]) s = m - 1; 3 == v[4]? else i = m + 1; 3 == 9 ?? não ! } return -1; Mas c<v[m], portanto } s=4-1, s=3 int main(int arc, char * argv[]) { int v[10] = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 19 }; printf("%d\n", concurso(v, 3)); return 0; } Questão 07 #include <stdio.h> Função concurso: int concurso(int v[10], int c) { i=0, s=3 int i = 0; int s = 9; while (i<=s) int m; while (i <= s) { m=0+(3-0)/2 m = i + (s - i) / 2; if (c == v[m]) m=1 return m; c == v[m]??? else if (c < v[m]) s = m - 1; 3 == v[1]? else i = m + 1; 3 == 3 ?? SIM! } return -1; Return m, ou seja return } 1 int main(int arc, char * argv[]) { Assim, concurso(v,2) → 1 int v[10] = { 1, 3, 5, 7, 9, 11, 13, É impresso na tela 15, 17, 19 }; printf("%d\n", concurso(v, 3)); 1 return 0; } Questão 08 Prova: CESGRANRIO - 2010 - IBGE - Analista de Sistemas - Suporte Para os recursos presentes na linguagem de programação C, são feitas as afirmativas abaixo. I - Permite acesso de baixo nível através da introdução de código Assembly no programa C. II - A passagem de parâmetros por referência para funções pode ser simulada através da utilização de ponteiros. III - O tipo de dados typedef são estruturas variáveis que permitem que dados relacionados sejam combinados e manipulados como um todo. Está(ão) correta(s) a(s) afirmativa(s) a) I, apenas. b) II, apenas. c) III, apenas. d) I e II, apenas. e) I, II e III. Questão 08 I - Permite acesso de baixo nível através da introdução de código Assembly no programa C. #include <stdio.h> int main() { int arg1=2, arg2=3, add, sub, mul ; __asm__ ( "addl %%ebx, %%eax;" : "=a" (add) : "a" (arg1) , "b" (arg2) ); __asm__ ( "subl %%ebx, %%eax;" : "=a" (sub) : "a" (arg1) , "b" (arg2) ); __asm__ ( "imull %%ebx, %%eax;" : "=a" (mul) : "a" (arg1) , "b" (arg2) ); printf( "%d + %d = %d\n", arg1, arg2, add ); printf( "%d - %d = %d\n", arg1, arg2, sub ); printf( "%d * %d = %d\n", arg1, arg2, mul ); return 0 ; } Questão 08 II - A passagem de parâmetros por referência para funções pode ser simulada através da utilização de ponteiros. #include<stdio.h> void troca(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } int main() { int a = 2, b = 3; printf("Antes de chamar a função :\na=%d\nb=%d\n", a, b); troca(&a, &b); printf("Depois de chamar a função:\na=%d\nb=%d\n", a, b); return 0; } Antes de chamar a função : a=2 b=3 Depois de chamar a função: a=3 b=2 Questão 08 II - A passagem de parâmetros por referência para funções pode ser simulada através da utilização de ponteiros. Em PHP <?php function soma(&$valor) { $valor = $valor + 10; } $contador = 0; soma ( $contador ); echo $contador; ?> Questão 08 III - O tipo de dados typedef são estruturas variáveis que permitem que dados relacionados sejam combinados e manipulados como um todo. #include <stdio.h> int main(void){ typedef struct { char nome[30]; float matematica, fisica, media; }Alunos; Alunos alunos[3]; int count; for(count = 0 ; count < 3 ; count++){ fflush(stdin); __fpurge(stdin); printf("\nNome do aluno %d: ", count+1); gets(alunos[count].nome); printf("Nota de matematica: "); scanf("%f", &alunos[count].matematica); printf("Nota de fisica: "); scanf("%f", &alunos[count].fisica); alunos[count].media = (alunos[count].matematica + alunos[count].fisica)/2; } return 0; } Questão 08 Prova: CESGRANRIO - 2010 - IBGE - Analista de Sistemas - Suporte Para os recursos presentes na linguagem de programação C, são feitas as afirmativas abaixo. I - Permite acesso de baixo nível através da introdução de código Assembly no programa C. II - A passagem de parâmetros por referência para funções pode ser simulada através da utilização de ponteiros. III - O tipo de dados typedef são estruturas variáveis que permitem que dados relacionados sejam combinados e manipulados como um todo. Está(ão) correta(s) a(s) afirmativa(s) a) I, apenas. b) II, apenas. c) III, apenas. d) I e II, apenas. apenas e) I, II e III. Questão 09 Prova: CESPE - 2009 - INMETRO - Analista Executivo em Metrologia e Qualidade - Redes - Parte II Considerando o código em linguagem C acima, julgue o item abaixo #include <stdio.h> #define SIZE 6 char *MyStr(char *s, int n, int i){ for(i=0;i<n/2;i++){ s[n]=*(s+i); s[i]=s[n-i-1]; } *(s+n-i-1)=*(s+n); *(s+n)='\0'; return s; } int main(void){ char str[SIZE]="abcde"; int i=0; printf("%s\n",MyStr(str,SIZE-1,i)); for(;i<sizeof(str);i++){ printf("%c",str[i]); } } O include da linha 1 é desnecessário nesse programa, uma vez que não é chamada nenhuma função da biblioteca stdio.h no código. Certo Errado Questão 09 Prova: CESPE - 2009 - INMETRO - Analista Executivo em Metrologia e Qualidade - Redes - Parte II Considerando o código em linguagem C acima, julgue o item abaixo #include <stdio.h> #define SIZE 6 char *MyStr(char *s, int n, int i){ for(i=0;i<n/2;i++){ s[n]=*(s+i); s[i]=s[n-i-1]; } *(s+n-i-1)=*(s+n); *(s+n)='\0'; return s; } int main(void){ char str[SIZE]="abcde"; int i=0; printf("%s\n",MyStr(str,SIZE-1,i)); for(;i<sizeof(str);i++){ printf("%c",str[i]); } } O include da linha 1 é desnecessário nesse programa, uma vez que não é chamada nenhuma função da biblioteca stdio.h no código. Certo Errado Questão 10 Prova: CESPE - 2009 - INMETRO - Analista Executivo em Metrologia e Qualidade - Redes - Parte II Considerando o código em linguagem C acima, julgue o item abaixo #include <stdio.h> #define SIZE 6 char *MyStr(char *s, int n, int i){ for(i=0;i<n/2;i++){ s[n]=*(s+i); s[i]=s[n-i-1]; } *(s+n-i-1)=*(s+n); *(s+n)='\0'; return s; } int main(void){ char str[SIZE]="abcde"; int i=0; printf("%s\n",MyStr(str,SIZE-1,i)); for(;i<sizeof(str);i++){ printf("%c",str[i]); } } A função MyStr recebe três parâmetros como argumento. Todos eles são parâmetros por referência. Certo Errado Questão 10 Prova: CESPE - 2009 - INMETRO - Analista Executivo em Metrologia e Qualidade - Redes - Parte II Considerando o código em linguagem C acima, julgue o item abaixo #include <stdio.h> #define SIZE 6 char *MyStr(char *s, int n, int i){ for(i=0;i<n/2;i++){ s[n]=*(s+i); s[i]=s[n-i-1]; } *(s+n-i-1)=*(s+n); *(s+n)='\0'; return s; } int main(void){ char str[SIZE]="abcde"; int i=0; printf("%s\n",MyStr(str,SIZE-1,i)); for(;i<sizeof(str);i++){ printf("%c",str[i]); } } A função MyStr recebe três parâmetros como argumento. Todos eles são parâmetros por referência. Certo Errado Questão 11 Prova: CESPE - 2009 - INMETRO - Analista Executivo em Metrologia e Qualidade - Redes - Parte II Considerando o código em linguagem C acima, julgue o item abaixo #include <stdio.h> #define SIZE 6 char *MyStr(char *s, int n, int i){ for(i=0;i<n/2;i++){ s[n]=*(s+i); s[i]=s[n-i-1]; } *(s+n-i-1)=*(s+n); *(s+n)='\0'; return s; } int main(void){ char str[SIZE]="abcde"; int i=0; printf("%s\n",MyStr(str,SIZE-1,i)); for(;i<sizeof(str);i++){ printf("%c",str[i]); } } A linha 8, que faz parte da função MyStr , poderia ser retirada sem prejuízo ao código e à saída gerada. Certo Errado Questão 11 Prova: CESPE - 2009 - INMETRO - Analista Executivo em Metrologia e Qualidade - Redes - Parte II Considerando o código em linguagem C acima, julgue o item abaixo #include <stdio.h> #define SIZE 6 char *MyStr(char *s, int n, int i){ for(i=0;i<n/2;i++){ s[n]=*(s+i); s[i]=s[n-i-1]; } *(s+n-i-1)=*(s+n); *(s+n)='\0'; return s; } int main(void){ char str[SIZE]="abcde"; int i=0; printf("%s\n",MyStr(str,SIZE-1,i)); for(;i<sizeof(str);i++){ printf("%c",str[i]); } } A linha 8, que faz parte da função MyStr , poderia ser retirada sem prejuízo ao código e à saída gerada. Certo Errado Questão 12 Prova: CESPE - 2009 - INMETRO - Analista Executivo em Metrologia e Qualidade - Redes - Parte II Considerando o código em linguagem C acima, julgue o item abaixo #include <stdio.h> #define SIZE 6 char *MyStr(char *s, int n, int i){ for(i=0;i<n/2;i++){ s[n]=*(s+i); s[i]=s[n-i-1]; } *(s+n-i-1)=*(s+n); *(s+n)='\0'; return s; } int main(void){ char str[SIZE]="abcde"; int i=0; printf("%s\n",MyStr(str,SIZE-1,i)); for(;i<sizeof(str);i++){ printf("%c",str[i]); } } Na linha 5,s[n] representa a posição do elemento que está na sexta posição do array *s. Certo Errado Questão 12 Prova: CESPE - 2009 - INMETRO - Analista Executivo em Metrologia e Qualidade - Redes - Parte II Considerando o código em linguagem C acima, julgue o item abaixo #include <stdio.h> #define SIZE 6 char *MyStr(char *s, int n, n int i){ for(i=0;i<n/2;i++){ s[n]=*(s+i); s[i]=s[n-i-1]; } *(s+n-i-1)=*(s+n); *(s+n)='\0'; return s; } int main(void){ char str[SIZE]="abcde"; int i=0; printf("%s\n",MyStr(str,SIZE-1 SIZE-1,i)); for(;i<sizeof(str);i++){ printf("%c",str[i]); } } Na linha 5,s[n] representa a posição do elemento que está na sexta posição do array *s. Certo Errado Questão 13 Prova: CESPE - 2009 - INMETRO - Analista Executivo em Metrologia e Qualidade - Redes - Parte II Considerando o código em linguagem C acima, julgue o item abaixo #include <stdio.h> #define SIZE 6 char *MyStr(char *s, int n, int i){ for(i=0;i<n/2;i++){ s[n]=*(s+i); s[i]=s[n-i-1]; } *(s+n-i-1)=*(s+n); *(s+n)='\0'; return s; } int main(void){ char str[SIZE]="abcde"; int i=0; printf("%s\n",MyStr(str,SIZE-1,i)); for(;i<sizeof(str);i++){ printf("%c",str[i]); } } A função MyStr retorna um ponteiro Certo Errado Questão 13 Prova: CESPE - 2009 - INMETRO - Analista Executivo em Metrologia e Qualidade - Redes - Parte II Considerando o código em linguagem C acima, julgue o item abaixo #include <stdio.h> #define SIZE 6 char *MyStr(char *MyStr *s, int n, int i){ for(i=0;i<n/2;i++){ s[n]=*(s+i); s[i]=s[n-i-1]; } *(s+n-i-1)=*(s+n); *(s+n)='\0'; return s; } int main(void){ char str[SIZE]="abcde"; int i=0; printf("%s\n",MyStr(str,SIZE-1,i)); for(;i<sizeof(str);i++){ printf("%c",str[i]); } } A função MyStr retorna um ponteiro Certo Errado Questão 14 Prova: CESPE - 2009 - INMETRO - Analista Executivo em Metrologia e Qualidade - Redes - Parte II Considerando o código em linguagem C acima, julgue o item abaixo #include <stdio.h> #define SIZE 6 char *MyStr(char *s, int n, int i){ for(i=0;i<n/2;i++){ s[n]=*(s+i); s[i]=s[n-i-1]; } *(s+n-i-1)=*(s+n); *(s+n)='\0'; return s; } int main(void){ char str[SIZE]="abcde"; int i=0; printf("%s\n",MyStr(str,SIZE-1,i)); for(;i<sizeof(str);i++){ printf("%c",str[i]); } } Esse código possui duas saídas, produzidas nas linhas 13 e 15, que são iguais. Certo Errado Questão 14 Prova: CESPE - 2009 - INMETRO - Analista Executivo em Metrologia e Qualidade - Redes - Parte II Considerando o código em linguagem C acima, julgue o item abaixo #include <stdio.h> #define SIZE 6 char *MyStr(char *s, int n, int i){ for(i=0;i<n/2;i++){ s[n]=*(s+i); s[i]=s[n-i-1]; } *(s+n-i-1)=*(s+n); *(s+n)='\0'; return s; } int main(void){ char str[SIZE]="abcde"; int i=0; printf("%s\n",MyStr(str,SIZE-1,i)); for(;i<sizeof(str);i++){ printf("%c",str[i]); } } Esse código possui duas saídas, produzidas nas linhas 13 e 15, que são iguais. Certo Errado Questão 15 Prova: CESPE - 2009 - TRE-GO - Programador de computador char *pc; float *px; float x; x=6.5; px=&x; pc = (char *)px; Considerando as definições em linguagem C mostradas acima, assinale a opção correta. a) A utilização de (char*) é um cast, que converte um tipo de dados em outro. b) As variáveis px e pc apontam para posições de memória diferentes. c) É correto afirmar que px + 1 e (*pc) + 1 apontam para as mesmas posições de memória. d) Se px é um ponteiro para a variável x de tipo float, a expressão px + 1 se refere ao byte seguinte na memória, a partir do endereço de x. Questão 15 Prova: CESPE - 2009 - TRE-GO - Programador de computador char *pc; float *px; float x; x=6.5; px=&x; pc = (char *)px; Considerando as definições em linguagem C mostradas acima, assinale a opção correta. a) A utilização de (char*) é um cast, que converte um tipo de dados em outro. The C Programming Language -- ANSI C Brian W. C. Kernighan & Dennis M. Ritchie Prentice Hall, 1988 (the (char*) in the last line is a ``cast'', which converts one data type to another), another) px and pc both point to the same location in memory--the address of x--but px + 1 and pc + 1 point to different memory locations. Questão 15 Prova: CESPE - 2009 - TRE-GO - Programador de computador char *pc; float *px; float x; x=6.5; px=&x; pc = (char *)px; Considerando as definições em linguagem C mostradas acima, assinale a opção correta. b) As variáveis px e pc apontam para posições de memória diferentes. The C Programming Language -- ANSI C Brian W. C. Kernighan & Dennis M. Ritchie Prentice Hall, 1988 (the (char*) in the last line is a ``cast'', which converts one data type to another), px and pc both point to the same location in memory--the memory address of x--but px + 1 and pc + 1 point to different memory locations. Questão 15 Prova: CESPE - 2009 - TRE-GO - Programador de computador char *pc; float *px; float x; x=6.5; px=&x; pc = (char *)px; Considerando as definições em linguagem C mostradas acima, assinale a opção correta. c) É correto afirmar que px + 1 e (*pc) + 1 apontam para as mesmas posições de memória. Nâo está comparando endereço de memória. Px é um endereço de memória e *pc é o valor num endereço de memória ! Questão 15 Prova: CESPE - 2009 - TRE-GO - Programador de computador char *pc; float *px; float x; x=6.5; px=&x; pc = (char *)px; Considerando as definições em linguagem C mostradas acima, assinale a opção correta. d) Se px é um ponteiro para a variável x de tipo float, a expressão px + 1 se refere ao byte seguinte na memória, a partir do endereço de x. The C Programming Language -- ANSI C Brian W. C. Kernighan & Dennis M. Ritchie Prentice Hall, 1988 (the (char*) in the last line is a ``cast'', which converts one data type to another), px and pc both point to the same location in memory--the address of x--but px + 1 and pc + 1 point to different memory locations. Questão 16 Prova: CESPE - 2009 - TRE-GO - Programador de computador #include <stdio.h> void exchange(int a, int b); int main(void) { int a = 5; int b = 7; exchange(a, b); printf("a= %d, b= %d \n", a, b); } void exchange(int a, int b) { int temp; temp = a; a = b; b = temp; printf("a= %d, b= %d \n", a, b); } Com relação à execução do código em linguagem C acima, assinale a opção correta. a) O código não será executado pois tem erros de sintaxe, o que resultará em erros de compilação. b) O programa imprimirá a = 7, b = 5 em uma linha e,na seguinte, a = 7, b = 5. c) O programa imprimirá a = 7, b = 5 em uma linha e,na linha seguinte, a = 5, b = 7. d) O programa imprimirá a = 7, b = 5 duas vezes na mesma linha. Questão 16 Prova: CESPE - 2009 - TRE-GO - Programador de computador #include <stdio.h> void exchange(int a, int b); int main(void) { int a = 5; int b = 7; exchange(a, b); printf("a= %d, b= %d \n", a, b); } void exchange(int a, int b) { int temp; temp = a; a = b; b = temp; printf("a= %d, b= %d \n", a, b); } Com relação à execução do código em linguagem C acima, assinale a opção correta. a) O código não será executado pois tem erros de sintaxe, o que resultará em erros de compilação. b) O programa imprimirá a = 7, b = 5 em uma linha e,na seguinte, a = 7, b = 5. c) O programa imprimirá a = 7, b = 5 em uma linha e,na linha seguinte, a = 5, b = 7. d) O programa imprimirá a = 7, b = 5 duas vezes na mesma linha. Questão 17 Prova: PUC-PR - 2010 - COPEL - Analista de Sistemas Júnior qual é o objetivo da função fwrite da linguagem C,que tem seu protótipo presente no arquivo stdio.h ? A) Descarregar o buffer pendente de gravação em uma stream. B) Gravar uma quantidade de bytes de uma região de memória em uma stream. C) Gravar uma região de memória em uma variável. D) Gravar uma String informada como parâmetro em um arquivo texto. Usará o caractere terminador “\0” para identificar o final da String. E) Gravar uma String informada como parâmetro em um Socket . Usará o caractere terminador “\0” para identificar o final da String. Questão 17 Prova: PUC-PR - 2010 - COPEL - Analista de Sistemas Júnior qual é o objetivo da função fwrite da linguagem C,que tem seu protótipo presente no arquivo stdio.h ? Os arquivos em C são denominados STREAM. Um STREAM é associado a um arquivo por uma operação de abertura do arquivo e, a partir da associação, todas as demais operações de escrita e leitura podem ser realizadas. fwrite() : Grava um conjunto de dados heterogêneos (struct) no arquivo Questão 17 Prova: PUC-PR - 2010 - COPEL - Analista de Sistemas Júnior qual é o objetivo da função fwrite da linguagem C,que tem seu protótipo presente no arquivo stdio.h ? A) Descarregar o buffer pendente de gravação em uma stream. B) Gravar uma quantidade de bytes de uma região de memória em uma stream. C) Gravar uma região de memória em uma variável. D) Gravar uma String informada como parâmetro em um arquivo texto. Usará o caractere terminador “\0” para identificar o final da String. E) Gravar uma String informada como parâmetro em um Socket . Usará o caractere terminador “\0” para identificar o final da String. Questão 18 Prova: NUCEPE - 2009 - SEDUC-PI - Professor - Informática Considere a instrução em linguagem C: int a = sizeof(float);. O valor armazenado em a é: a) 2. b) 4. c) 6 d) 8. e) 10. Questão 18 Prova: NUCEPE - 2009 - SEDUC-PI - Professor - Informática Considere a instrução em linguagem C: int a = sizeof(float);. O valor armazenado em a é: a) 2. b) 4. c) 6 d) 8. e) 10. char: 1 byte short: 2 bytes int: 4 bytes long: 4 bytes float: 4 bytes double : 8 bytes Questão 19 Prova: NUCEPE - 2009 - SEDUC-PI - Professor - Informática Assinale a alternativa que mostra o operador lógico OU em linguagem C: a) $$. b) ||. c) && d) Or. e) v. Questão 19 Prova: NUCEPE - 2009 - SEDUC-PI - Professor - Informática Assinale a alternativa que mostra o operador lógico OU em linguagem C: a) $$. b) ||. c) && d) Or. e) v. Questão 20 Prova: FUNIVERSA - 2012 - PC-DF - Perito Criminal - Informática Na maioria das linguagens de programação, as estruturas de controle de fluxo são fundamentais para a criação de programas elegantes e de fácil entendimento. Assinale a alternativa correta com relação aos comandos de controle de fluxo da linguagem C, sabendo que o comando for apresenta a seguinte forma geral: for (inicialização;condição;incremento) declaração; a) Não é permitido omitir a condição no comando for, pois não existiria maneira de parar o laço infinito. b) Pode-se omitir a declaração, e, mesmo assim, o comando for ainda será válido. c) Sem os comandos de controle de fluxo, só haveria uma maneira de o programa ser executado: de baixo para cima e comando por comando. d) O comando continue usado dentro de um laço executa a próxima linha de código independentemente do fato de ela estar dentro ou fora do laço. e) O comando for garante que o laço seja executado pelo menos uma vez. Questão 20 Prova: FUNIVERSA - 2012 - PC-DF - Perito Criminal - Informática Na maioria das linguagens de programação, as estruturas de controle de fluxo são fundamentais para a criação de programas elegantes e de fácil entendimento. Assinale a alternativa correta com relação aos comandos de controle de fluxo da linguagem C, sabendo que o comando for apresenta a seguinte forma geral: for (inicialização;condição;incremento) declaração; a) Não é permitido omitir a condição no comando for, pois não existiria maneira de parar o laço infinito. b) Pode-se omitir a declaração, e, mesmo assim, o comando for ainda será válido. c) Sem os comandos de controle de fluxo, só haveria uma maneira de o programa ser executado: de baixo para cima e comando por comando. d) O comando continue usado dentro de um laço executa a próxima linha de código independentemente do fato de ela estar dentro ou fora do laço. e) O comando for garante que o laço seja executado pelo menos uma vez. Questão 20 Prova: FUNIVERSA - 2012 - PC-DF - Perito Criminal - Informática Na maioria das linguagens de programação, as estruturas de controle de fluxo são fundamentais para a criação de programas elegantes e de fácil entendimento. Assinale a alternativa correta com relação aos comandos de controle de fluxo da linguagem C, sabendo que o comando for apresenta a seguinte forma geral: for (inicialização;condição;incremento) declaração; a) Não é permitido omitir a condição no comando for, pois não existiria maneira de parar o laço infinito. b) Pode-se omitir a declaração, e, mesmo assim, o comando for ainda será válido. c) Sem os comandos de controle de fluxo, só haveria uma maneira de o programa ser executado: de baixo para cima e comando por comando. d) O comando continue usado dentro de um laço executa a próxima linha de código independentemente do fato de ela estar dentro ou fora do laço. e) O comando for garante que o laço seja executado pelo menos uma vez. Questão 20 Prova: FUNIVERSA - 2012 - PC-DF - Perito Criminal - Informática Na maioria das linguagens de programação, as estruturas de controle de fluxo são fundamentais para a criação de programas elegantes e de fácil entendimento. Assinale a alternativa correta com relação aos comandos de controle de fluxo da linguagem C, sabendo que o comando for apresenta a seguinte forma geral: for (inicialização;condição;incremento) declaração; a) Não é permitido omitir a condição no comando for, pois não existiria maneira de parar o laço infinito. b) Pode-se omitir a declaração, e, mesmo assim, o comando for ainda será válido. c) Sem os comandos de controle de fluxo, só haveria uma maneira de o programa ser executado: de baixo para cima e comando por comando. d) O comando continue usado dentro de um laço executa a próxima linha de código independentemente do fato de ela estar dentro ou fora do laço. e) O comando for garante que o laço seja executado pelo menos uma vez. Questão 20 Prova: FUNIVERSA - 2012 - PC-DF - Perito Criminal - Informática Na maioria das linguagens de programação, as estruturas de controle de fluxo são fundamentais para a criação de programas elegantes e de fácil entendimento. Assinale a alternativa correta com relação aos comandos de controle de fluxo da linguagem C, sabendo que o comando for apresenta a seguinte forma geral: for (inicialização;condição;incremento) declaração; a) Não é permitido omitir a condição no comando for, pois não existiria maneira de parar o laço infinito. b) Pode-se omitir a declaração, e, mesmo assim, o comando for ainda será válido. c) Sem os comandos de controle de fluxo, só haveria uma maneira de o programa ser executado: de baixo para cima e comando por comando. d) O comando continue usado dentro de um laço executa a próxima linha de código independentemente do fato de ela estar dentro ou fora do laço. e) O comando for garante que o laço seja executado pelo menos uma vez. Questão 20 Prova: FUNIVERSA - 2012 - PC-DF - Perito Criminal - Informática Na maioria das linguagens de programação, as estruturas de controle de fluxo são fundamentais para a criação de programas elegantes e de fácil entendimento. Assinale a alternativa correta com relação aos comandos de controle de fluxo da linguagem C, sabendo que o comando for apresenta a seguinte forma geral: for (inicialização;condição;incremento) declaração; a) Não é permitido omitir a condição no comando for, pois não existiria maneira de parar o laço infinito. b) Pode-se omitir a declaração, e, mesmo assim, o comando for ainda será válido. c) Sem os comandos de controle de fluxo, só haveria uma maneira de o programa ser executado: de baixo para cima e comando por comando. d) O comando continue usado dentro de um laço executa a próxima linha de código independentemente do fato de ela estar dentro ou fora do laço. e) O comando for garante que o laço seja executado pelo menos uma vez. Questão 21 Exame Nacional para Ingresso na Pós-Graduação em Computação 30/09/2012 Nas linguagens de programação, uma questão importante é o escopo das declarações. Por exemplo, o escopo de uma declaração de x é a região do programa em que os usos de x se referem a essa declaração. Nesse sentido, a ligação de um nome a um escopo pode ser estática ou dinâmica. No programa C, a seguir, o identificador x é uma macro composta pela expressão ++y . Por ser uma macro, a resolução de x não é realizada somente em termos do texto do programa. Com base nessa execução, assinale a alternativa que apresenta, corretamente, a saída desse programa. a) 1 1 b) 1 2 c) 1 3 d) 2 2 e) 2 3 Questão 21 Exame Nacional para Ingresso na Pós-Graduação em Computação 30/09/2012 #include<stdio.h> #define x ++y int y = 2; void M() { int y = 1; printf("%d ", x); } void N() { printf("%d ", x); } int main() { M(); N(); return 0; } Questão 21 Exame Nacional para Ingresso na Pós-Graduação em Computação 30/09/2012 #include<stdio.h> int y = 2; void M() { int y = 1; printf("%d ",++y); } void N() { printf("%d ", ++y); } int main() { M(); N(); return 0; } Questão 21 Exame Nacional para Ingresso na Pós-Graduação em Computação 30/09/2012 Nas linguagens de programação, uma questão importante é o escopo das declarações. Por exemplo, o escopo de uma declaração de x é a região do programa em que os usos de x se referem a essa declaração. Nesse sentido, a ligação de um nome a um escopo pode ser estática ou dinâmica. No programa C, a seguir, o identificador x é uma macro composta pela expressão ++y . Por ser uma macro, a resolução de x não é realizada somente em termos do texto do programa. Com base nessa execução, assinale a alternativa que apresenta, corretamente, a saída desse programa. a) 1 1 b) 1 2 c) 1 3 d) 2 2 e) 2 3 Questão 22 Exame Nacional para Ingresso na Pós-Graduação em Computação 2013 Analise os trechos de código em linguagem de programação C a seguir (próximo slide) Com base nesses trechos, assinale a alternativa correta. a) O Trecho 1 imprimirá os valores da matriz mat e o Trecho 2 indicará um erro de sintaxe na inicialização do ponteiro. b) O Trecho 1 imprimirá os valores da matriz mat e o Trecho 2 indicará um erro de sintaxe no laço de repetição. c) O Trecho 1 imprimirá os valores da matriz mat e o Trecho 2 imprimirá valores desconhecidos alocados na memória. d) Ambos os trechos de código imprimirão o mesmo conteúdo na tela. e) Ambos os trechos de código indicarão erro de sintaxe na inicialização da matriz mat Questão 22 Exame Nacional para Ingresso na Pós-Graduação em Computação 2013 Trecho 1 Trecho 2 #include<stdio.h> #include<stdio.h> int main() { int main() { int mat[2][2] = {{1,2}, int mat[2][2] = { { 1, {3,4}}; 2 }, { 3, 4 } }; int i,j; int * p = &mat[0][0]; for (i=0;i<2;i++) int i; for (j=0;j<2;j++) for (i = 0; i < 4; i++) printf("%d\n",mat[i][j]); printf("%d\n", *(p + i)); } } Questão 22 Exame Nacional para Ingresso na Pós-Graduação em Computação 2013 Analise os trechos de código em linguagem de programação C a seguir (próximo slide) Com base nesses trechos, assinale a alternativa correta. a) O Trecho 1 imprimirá os valores da matriz mat e o Trecho 2 indicará um erro de sintaxe na inicialização do ponteiro. b) O Trecho 1 imprimirá os valores da matriz mat e o Trecho 2 indicará um erro de sintaxe no laço de repetição. c) O Trecho 1 imprimirá os valores da matriz mat e o Trecho 2 imprimirá valores desconhecidos alocados na memória. d) Ambos os trechos de código imprimirão o mesmo conteúdo na tela. e) Ambos os trechos de código indicarão erro de sintaxe na inicialização da matriz mat Conclusão Chegamos aqui ? FIM CIDADE IDIOMAS & CURSOS PREPARATÓRIOS CLN 113 - Bloco C - Sala 207 a 210 Asa Norte - Brasília - DF - CEP 70.763-503 Tel: (61) 3340-0433 / 9975-4464 / 8175-4509 E-mail:
[email protected] Site: www.iic.pro.br Skype: luizcidade Prof. Ricardo Sant'Ana