Вы находитесь на странице: 1из 96

Preparatório EsFCEx

TÉ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: cursocidade@iic.pro.br
Site: www.iic.pro.br
Skype: luizcidade
Prof. Ricardo Sant'Ana