Professional Documents
Culture Documents
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
#include <stdio.h>
int main(){
int i=9;
i^=15;
i>>=1;
i<<=2;
printf("%d",i);
return 0;
}
Introdução
}
Introdução
}
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;
}
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;
}
<?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]);
}
}
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.