MC102 – Algoritmos e Programação Turma CD Professor ... › ~ra069320 › PED › MC102 ›...

12
MC102 – Algoritmos e Programação Turma CD Professor: Rafael Saracchini Respostas da Lista I 1) OBS: “<-” significa que variável recebeu um valor. a) a = b = c++     a = b = 2 ( c <- 3 )     a = 2 ( b <- 2 )     2 ( a <- 2 ) Valor das variáveis alteradas: a = 2 b = 2 c = 3 Valor da expressão: 2 b) m = n + (b%c)     m = n  + 1     m = 3.0     3.0 ( m <- 3.0 ) Valor das variáveis alteradas: m = 3.0 Valor da expressão: 3.0 c) ( b + a ) && ( b - n )      ( b + a) && ( 1 - 2.0 )      ( b + a ) && ( -1.0 )      ( 1 + 0 ) && ( -1.0 )       ( 1 ) && ( -1.0 )        0 Valor da expressão: 0 d) ( m == ( 3/c ) )     ( m == ( 3/2) ) (divisão inteira)     ( m == ( 1 ) )     ( 1.0 == 1 )     1 Valor da expressão: 1 e) ( m == ( 3/n ) )

Transcript of MC102 – Algoritmos e Programação Turma CD Professor ... › ~ra069320 › PED › MC102 ›...

Page 1: MC102 – Algoritmos e Programação Turma CD Professor ... › ~ra069320 › PED › MC102 › 1s... · ,N] ) verificar a resposta (igual, menor ou maior) e caso não tenha acertado,

MC102 – Algoritmos e Programação Turma CDProfessor: Rafael SaracchiniRespostas da Lista I

1)OBS: “<­” significa que variável recebeu um valor.

a) a = b = c++    a = b = 2 ( c <­ 3 )    a = 2 ( b <­ 2 )    2 ( a <­ 2 )

Valor das variáveis alteradas:a = 2b = 2c = 3Valor da expressão: 2

b) m = n + (b%c)    m = n  + 1    m = 3.0    3.0  ( m <­ 3.0 )

Valor das variáveis alteradas:m = 3.0Valor da expressão: 3.0

c) ( b + a ) && ( b ­ n )     ( b + a) && ( 1 ­ 2.0 )     ( b + a ) && ( ­1.0 )      ( 1 + 0 ) && ( ­1.0 )      ( 1 ) && ( ­1.0 )       0Valor da expressão: 0

d) ( m == ( 3/c ) )    ( m == ( 3/2) ) (divisão inteira)    ( m == ( 1 ) )    ( 1.0 == 1 )    1

Valor da expressão: 1

e) ( m == ( 3/n ) )

Page 2: MC102 – Algoritmos e Programação Turma CD Professor ... › ~ra069320 › PED › MC102 › 1s... · ,N] ) verificar a resposta (igual, menor ou maior) e caso não tenha acertado,

    ( m == ( 3/2.0 )    ( m == 1.5 )   ( 1.0 == 1.5 )   0

Valor da expressão: 0

f) a = b+= ++c   a = b+= 3  ( c <­ 3 )   a = b = 3 + b (“b+= x” é igual a “b = x + b” )   a = b = 3 + 1   a = b = 4   a = 4  ( b <­ 4 )   4 ( a <­ 4 )

Valor das variáveis alteradas:a = 4b = 4c = 3Valor da expressão: 4

g) ( b && c) || ( a && n)    ( b && c) || ( 0 && 2.0 )    ( b && c ) || 0    ( 1 && 2 ) || 0     1 || 0     1

Valor da expressão: 1     h) ( a || c ) && ( ( m ­ b )|| ( m /c ) )    ( a || c ) && ( ( m ­ b ) || ( 1.0/2 ) )    ( a || c ) && ( ( m ­ b ) ||  0 ) ( divisão inteira )    ( a || c ) && ( ( 1.0 – 1 ) || 0 )    ( a || c ) && ( 0.0 || 0 )    ( 0 || 2 ) && 0    1 && 0    0

Valor da expressão: 0

2)

a) Variáveis e constantes:

Page 3: MC102 – Algoritmos e Programação Turma CD Professor ... › ~ra069320 › PED › MC102 › 1s... · ,N] ) verificar a resposta (igual, menor ou maior) e caso não tenha acertado,

#DEFINE PI 3.14float R ; (R é o raio da esfera)

Expressão:(4/3.0)*(PI*R*R*R)

b)Variáveis e constantes:int N; (N é o número que queremos testar)

Expressão:( (N%3) == 0 )

c)Variáveis e constantes:int N,M,X; (X é o número que queremos testar)

(M e N são valores dos divisores)

Expressão:( ( (X%N) == 0 )  && ( (X%M) != 0 ) )

d)Variáveis e constantesfloat a,Vi,t; (a – aceleração, Vi – velocidade inicial )

( t – tempo )

Expressão:(Vi + ( (a*t*t)/2.0) )

e)Variáveis e constantes:float R,L; ( R – raio do círculo)

( L – lado do quadrado)

Expressão:( R < ( L / 2.0 ) )

f)Variáveis e constantes:float X,Y; (X e Y – números a serem testados)

Expressão:( (X > 0 ) && (Y > 0) && ((X*Y) > 0) )ou ( (X*Y) > 0 ) && (X > 0 )

Page 4: MC102 – Algoritmos e Programação Turma CD Professor ... › ~ra069320 › PED › MC102 › 1s... · ,N] ) verificar a resposta (igual, menor ou maior) e caso não tenha acertado,

Note que não é necessário testar Y > 0, pois se um dos dois for negativo X*Y será < 0 , fazendo a expressãotoda ser falsa.

3)

a)Planejamento:1 – ler os 3 números2 – Calcular os 3 produtos (xy, xz, yz)3 – Escolher um maior valor arbitrariamente (ex: xy) e definir como par maior os componentes do produto (nocaso, x e y)4 – Comparar maior valor com os outros produtos. Se maior produto for menor que o produto comparado,atualizar valor e pares para novo maior produto  

Código­Fonte:

#include <stdio.h>

int main(void){int x,y,z;// 1 – ler os 3 númerosscanf(“%d %d %d”, &x,&y,&z);  xint xy,xz,yz;// 2 – calcular os 3 produtosxy = x*y;xz = x*z;yz = y*z;// 3 – escolher um maior valor e par arbitrariamenteint maior = xy;char p1,p2;p1 = 'x';p2 = 'y';// 4 – Compara com outros produtosif( maior < xz){

// atualiza maior e par se produto é maior que o maior maior = xz;p1 = 'x';p2 = 'z';

}if( maior < yz){

// atualiza maior e par se produto é maior que o maior maior = yz;p1 = 'y';p2 = 'z';

}

Page 5: MC102 – Algoritmos e Programação Turma CD Professor ... › ~ra069320 › PED › MC102 › 1s... · ,N] ) verificar a resposta (igual, menor ou maior) e caso não tenha acertado,

printf(“O par com maior produto é (%c , %c) = %d”, p1,p2,maior);return 0;

}

b)Planejamento:

1 – ler número N do teclado2 – inicializar com valor 1 número de números lidos3 – inicializar maior e menor com N4 – inicializar com N somatório5 – Enquanto N for diferente de zero faça

5.1 – Ler N do teclado5.2 – Somar N ao somatório5.3 – verificar se N é maior que o maior, atualizando­o se isso for verdade5.4 – verificar se N é menor que o menor, atualizando­o se isso for verdade5.5 – incrementar contador de números lidos

6 – Calcular a média (somatorio/ n. de elementos lidos)

Código­fonte:

#include <stdio.h>

int main(void){int cont,sum;int N;int maior,menor;float media;scanf(“%d”,&N);cont = 1;maior = menor = N;sum = N;while ( N != 0){

scanf(“%d”,&N);sum+= N;if( N > maior){ maior = N; }if( N < menor){ menor = N; }cont++;

}media = sum/(float)cont; // (float) força div. real  pois não queremos div. Inteira !printf(“ Maior %d Menor %d Média %f “, maior, menor, media);return 0;

}

c)

Page 6: MC102 – Algoritmos e Programação Turma CD Professor ... › ~ra069320 › PED › MC102 › 1s... · ,N] ) verificar a resposta (igual, menor ou maior) e caso não tenha acertado,

Planejamento:

1 – ler N, o número de somas a ser realizado2 – Inicializa somatorio com elemento neutro da adição ( 0 )3 – Repita N vezes (contador I ) 

3.1 – Inicializa produtorio com elemento neutro do produto (1 )3.3 – repita I vezes (contador J )

3.3.1 – multiplique  produtorio com contador J3.4 – calcule 1/produtorio e adicione ao somatório. (obs: produtório possui valor de I!)

4 – Imprima o valor de somatório

Código­fonte:

#include <stdio.h>

int main(void){float e_aprox;int N;scanf(“%d”,&N);e_aprox = 0;int i;for( i = 0; i <= N­1; i++){

float fat = 1;int j;for( j = 1; j <=i; j++){  fat*= j; }e_aprox+= (1/fat);

}printf(“ A aproximação de e com %d repetições é %f”, N, e_aprox);return 0 ; 

d)A idéia neste caso é olhar a primeira e a última letra da frase, se forem iguais, temos que comparar a segundacom a penúltima e assim sucessivamente. As comparações terminam quando ou encontramos um par de letrasque diferem (não é palíndromo)  ou chegamos no meio da palavra (é palíndromo). Utilizando as variáveis inicio efim para marcar as posições, podemos saber que chegamos ao meio da palavra quando início for maior que fim.Note que basta um teste falhar para afirmarmos que a palavra não é um palíndromo, mas todos devem se bemsucedidos para que a mesma o seja.

Planejamento:

1 – ler N2 – Ler sequência de  N caracteres3 – marcar posiçao início = 0  e fim= N­13 – definir frase como palindromo 

Page 7: MC102 – Algoritmos e Programação Turma CD Professor ... › ~ra069320 › PED › MC102 › 1s... · ,N] ) verificar a resposta (igual, menor ou maior) e caso não tenha acertado,

4 – enquanto inicio  < = fim e frase for um palíndromo repita4.1 – se caracter em posição inicio for diferente ao caracter na posição fim

Verdadeiro – 4.1.1 – define frase como não sendo palíndromoFalso – 4.1.2 – incrementa início e decrementa fim

5 – Diz se é palíndromo ou não de acordo com a definição

Código­fonte:

#include <stdio.h>

int main(void){int N;scanf(“%d”,&N);char auxiliar;scanf(“%c”,&auxiliar); /*

OBS – variável “auxiliar” utilizada para capturar o ENTER digitado depois do scanf de N, caso isto não seja feito, o ENTER será lido como caracter pelo primeiro scanf do “for” abaixo, fazendo o programa funcionar incorretamente.Isto não é parte do algoritmo, é detalhe de implementação.

*/char frase[N];int i;for( i = 0 ; i < N; i++){

scanf(“%c”,&frase[i]);}int inicio = 0;int fim = N – 1;int e_palindromo = 1;while( (inicio < fim) && (e_palindromo) ){

if( frase[inicio] != frase[fim] ){e_palindromo = 0;

}else{inicio++;fim­­;

}}if( e_palindromo ){

printf(“ A frase é um palíndromo !”);}else{

printf(“A frase não é um palíndromo...”);}return 0;

}

Page 8: MC102 – Algoritmos e Programação Turma CD Professor ... › ~ra069320 › PED › MC102 › 1s... · ,N] ) verificar a resposta (igual, menor ou maior) e caso não tenha acertado,

e)O princípio desta resolução baseia­se no seguinte princípio: chutar um número entre um intervalo(inicialmente [0,N] ) verificar a resposta (igual, menor ou maior) e caso não tenha acertado, estabelecer um novo intervalo deacordo com a resposta. Note que até o momento não aprendemos como gerar um chute aleatório, logo um bomchute pode ser exatamente o valor médio de um intervalo . A solução apresentada funciona para inteiros , porémpara números reais podem ser necessários infinitos chutes.

Outra coisa importante é notar que o programa só funciona se o usuário responder honestamente. Paraler a resposta do usuário podem ser utilizadas diversas abordagens, nesta vamos assumir que o usuário digitaum número. 0 significa que o chute está correto, 1 que o chute é  maior e 2 que o chute é menor que o númeropensado.

Planejamento:

1 – ler N2 – Estabelecer início do intervalo como 03 – Estabelecer fim do intervalo como N4 – Enquanto não acertar número pensado pelo usuário faça:

4.1– Chutar valor pensado como meio do intervalo:          ((fim – inicio)/2) + inicio ­> calculo do meio do intervalo4.2 ­ Ler resposta do usuário4.3 ­ Verificar se acertou

(Verdadeiro) 4.3.1 – Termina repetição       (Falso) 4.3.2 – Se chute for maior , fim do intervalo agora é o valor do chute  

        (Não é possível que o valor pensado seja maior que o chute)      (Falso) 4.3.3 – Se chute for menor, início do intervalo agora é o valor do chute     (Valor pensado não pode ser menor que o chute) 

5 – Dizer número pensado

Código­fonte:

#include <stdio.h.>

int main(void){int N;printf(“Digite o valor de N:”);scanf(“%d”,&N);int inicio = 0;int fim = N;int chute;int resp; // assume valor 0  se chute for igual, 1 se for maior, 2 se for menordo{

chute = ((fim – inicio)/2) + inicio;printf(“Valor e %d ?\n”,chute);scanf(“%d”,&resp);

Page 9: MC102 – Algoritmos e Programação Turma CD Professor ... › ~ra069320 › PED › MC102 › 1s... · ,N] ) verificar a resposta (igual, menor ou maior) e caso não tenha acertado,

if( resp == 1){fim = chute;

}else if( resp == 2){inicio = chute;

}} while ( resp != 0);

printf(“ O número pensado é %d \n”, chute);return 0;

}

f)Para desenhar um “X”  de tamanho N (N ímpar) basta desenhar N linhas com N caracteres, onde em sua grandeparte são espaços em branco. Na primeira linha os  asteriscos são localizados na primeira e na última posição.Na segunda ficam na segunda e na penultima posição... segundo a lógica, podemos fazer dois índices queindicam a posição dos asteriscos para cada linha. Para cada avanço no contador de linhas avançamos umíndice e retrocedemos  o outro.Note que devemos impedir N  de possuir um valor par ou zero. Utilize o recurso a seu gosto. Neste programa aleitura será repetida até o usuário digitar um número ímpar.

Planejamento:

1 – Ler N2 – Inicializar i1 com 1 e i2 com N (posições onde asterisco será escrito)3 – Repetir N vezes

3.1 – Repetir  N vezes3.1.1 – Se for o i1­ésimo ou i2­ésimo caracter

(verdadeiro) 3.1.1.1 – Escrever asterisco(falso)  3.1.1.2 – Escrever espaço em branco

3.1.2 – incrementar i1 e decrementar i23.1.3 ­  iniciar nova linha

Código­fonte:

#include <stdio.h>

int main(void){int N;do{

scanf(“%d”,&N);}while( (N%2) != 1); // expressão que testa se N é ímpar ou nãoint i1,i2;i1  = 1;i2 = N;int i,j;

Page 10: MC102 – Algoritmos e Programação Turma CD Professor ... › ~ra069320 › PED › MC102 › 1s... · ,N] ) verificar a resposta (igual, menor ou maior) e caso não tenha acertado,

for (i = 1; i <= N; i++){for( j = 1; j <= N ; j++){

if( (j == i1) && (j == i2) ){printf(“*”);

}else{printf(“ “);

}

}i1++;i2­­;printf(“\n”);

}return 0;

}

g)Planejamento:

1 – Ler tamanho dos vetores2 – Ler vetores3 – Supor que vetores são iguais (ex, por meio de variável)4 – varrer os N elementos (contador i)

4.1 – se V1[i] for diferente de V2[i](Verdadeiro) 4.1.1 – definir vetores como diferentes

5 – Imprimir resposta

Código­fonte:

#include <stdio.h>

int main(void){int N;scanf(“%d”, &N);int* V1 =  (int*) malloc(sizeof(int)*N);int* V2 =  (int*) malloc(sizeof(int)*N);if( (V1 == NULL) || (V2 == NULL) ){

printf(“Erro ao alocar vetores\n”);return 1;

}int i;for( i = 0; i < N; i++){

scanf(“%d”,&V1[i]);}for( i = 0; i < N; i++){

Page 11: MC102 – Algoritmos e Programação Turma CD Professor ... › ~ra069320 › PED › MC102 › 1s... · ,N] ) verificar a resposta (igual, menor ou maior) e caso não tenha acertado,

scanf(“%d”,&V2[i]);}int e_igual = 1;for( i = 0; i < N; i++){

if ( V1[i] != V2[i] ){ e_igual = 0; }}if( e_igual){

printf(“Os vetores são iguais\n”);}else{

printf(“Os vetores não são iguais\n”);}free(V1);free(V2);return 0;

}

h)Dois vetores in Rn são perpendiculares quando o produto escalar dos mesmo é igual a zero.A fórmula do produto escalar é dada por:

O que precisamos fazer é calcular o produto e verificar se o mesmo é zero.

Planejamento:

1 – Ler N2 – Ler os 2 vetores3 – Inicializar somatório com 04 – Repetir N vezes (com contador i)

4.1 – adicionar ao somatório a[i]*b[i]5 – Verificar se somatório é igual a zero(verdadeiro) 5.1 – Dizer que são perpendiculares(falso )         5.2 – Dizer que não são perpendiculares

Código­fonte:

#include <stdio.h>

int main(void){int N;scanf(“%d”,&N);float a[N];float b[N];

Page 12: MC102 – Algoritmos e Programação Turma CD Professor ... › ~ra069320 › PED › MC102 › 1s... · ,N] ) verificar a resposta (igual, menor ou maior) e caso não tenha acertado,

int i;for( i = 0; i < N; i++){

scanf(“%f %f”,&a[i],&b[i]);}float sum = 0;for( i = 0; i < N; i++){

sum+= a[i]*b[i];}if( sum == 0){

printf(“São perpendiculares”);}else{

printf(“Não são perpendiculares”);}return 0;

}