You are on page 1of 11

Mestrado Integrado em Engenharia Electrotcnica e Computadores

Teste de Programao de Microcomputadores


1 Teste 6 Novembro de 2010 10:00 h. Durao: 2 h 00 1 [2] Tenha em ateno os seguintes pedaos de cdigo e indique qual vai ser o resultado no cran: a. if (!(1 && !(0 || !1))) printf(resultado 1\n); else printf(resultado 2\n); (0||!1) -> F !F -> T 1&&T -> T !T -> F -- resultado 2 b. if ( (1 || 0) && 0==0) printf(resultado 1\n); else printf(resultado 2\n); 1||0 == T T&&0==F F==0 -> T resultado 1

2 [1] Sejam os seguintes programas em Linguagem C: #include <stdio.h> int main () { int x, y; if (x > y) printf("Maior"); else printf("Menor"); } } #include <stdio.h> int main () { int x, y; if (x < y) printf("Menor"); else printf("Maior");

Diga justificadamente se os dois programas tm o mesmo comportamento? O comportamento igual desde que os nmeros sejam diferentes. Caso os nmeros sejam iguais o comportamento diferente. Seja o caso de x = 2 e y = 2. No programa da esquerda escrito Menor e no da direita Maior.

3 [2] Seja o seguinte programa em Linguagem C: int main() { int x,y,z; if (z) if (y) printf("A"); else printf("C"); else if (x) printf("B"); if (x) printf("C"); return 0; } Qual vai ser o valor de cada uma das variveis x,y,z, para cada uma das sadas A, B,e C.

Primeiro seria bom colocar o programa com a identao correcta: int main() { int x,y,z; if (z) if (y) printf("A"); else printf("C"); else if (x) printf("B"); if (x) printf("C"); } um programa com duas instrues IF. A escrito quando z e y tm valor lgico 1 ou VERDADE -- A z && y B escrito quando z tem valor lgico 0 (FALSO) e x valor lgico Verdade B !z && x C escrito quando Z VERDADE e Y FALSO ou quando X VERDADE C (z && !y) || x

4 [3] Seja o seguinte programa em Linguagem C: #include <stdio.h> int main() { int cnt = 1; while (cnt % 2) { if (cnt < 15) { cnt += 2; continue; } else cnt++; printf("%d ",cnt); } } Qual o resultado da execuo deste programa? Justifique. O resultado : 16. O truque deste problema est em conhecer o funcionamento da instruo continue, que executada sempre que cnt < 15. O contador inicia-se a 1. Enquanto o nmero for mpar fica no loop while. No entanto, enquanto o nmero for inferior a 15, cnt incrementado de 2 (cnt += 2) passando ao nmero mpar seguinte e, ao apanhar a instruo de continue vai para o fim do while directo sem executar a instruo printf("%d ",cnt).Ao testar novamente a condio e como cnt impar, o ciclo continua. Quando cnt chegar a 15, 15 no menor que 15 e como tal incrementado de 1 e passa a 16. Mas agora ao terminar o else executa a instruo printf("%d ",cnt) e como tal escreve 16.

5 [1] Seja o seguinte programa em Linguagem C: #include <stdio.h> int main() { int i,x; scanf("%c",&x); for(i=x;i<x+3;i++) printf("%c ",i); printf("%c ", A+i-x); } Qual o resultado da execuo deste programa, supondo que carrego na tecla X? A primeira coisa a fazer ajustar a identao. #include <stdio.h> int main() { int i,x; scanf("%c",&x); for(i=x;i<x+3;i++) printf("%c ",i); printf("%c ", A+i-x); } O resultado X Y Z D Ao carregar na tecla X a varivel x vai ficar com o valor ASCII do caracter X que 88. Assim na instruo for o i vai ser inicializado com 88 e como i < 88+3 ento a instruo printf("%c ",i); vai ser executada colocando o caracter X no cran. Repare que o i tem 88 que vai ser escrito como caracter e como tal escreve o cdigo ASCII de 88 que X. De seguida o i incrementado passando a ter o valor 89 que ainda menor que 91. Como tal escreve agora o valor ASCII de 89 que Y. O i incrementado e passa a 90 que ainda menor que 91 e escreve ento o valor ASCII de 90 que Z. Agora o i incrementado passando a 91 que no menor que 91 e como tal a instruo for termina. Repare que nesta altura o i tem o valor de 91. Na instruo printf("%c ", A+i-x); o valor ASCII que vai ser escrito A + 91 x. Ora x tem o valor de 88. Ento o valor ser A + 91 88 = A + 3. Como os caracteres ASCII esto em sequncia A+3 = D que ser o caracter que aparece no cran.

6 [2] Seja o seguinte programa em Linguagem C: int main () { int i, x, y; double res = 1; scanf("%d %d",&x, &y); for (i=0; i < y; i++) res = res * x; printf("%.0f\n",res); } Escreva por palavras suas o resultado da execuo deste programa? O resultado do programa a operao matemtica xy. O programa comea por pedir 2 nmeros inteiros ao utilizador, que ficam armazenados na varivel x e y. De seguida devemos concentrarmo-nos na instruo for que tem uma operao multiplicao no seu corpo. Podemos entao ter a certeza que a operao a realizar no loop ser res = ((res*x)*x)*x....*x. Como se chega a esta concluso? Por iterao. Na primeira iterao res1 = resinicial * x, na segunda iterao res2 = res1 * x, mas como res1 era resinicial * x, fica ento res2 = resinicial * x * x. Na terceira ser res3 = res2 * x, mas como res2 era resinicial * x * x, fica ento res3 = resinicial * x * x * x. E assim sucessivamente. Repare que como resinicial = 1 ento temos res3 = 1 * x * x * x = x * x * x. A questo est em saber quantas vezes o loop da instruo for executado. Para isso temos de olhar para a condio de paragem do for que i < x. Quer isto dizer que na verdade o loop vai ocorrer y vezes j que o i inicializado a 0. Ento a operao x*x vai ocorrer y vezes. Ora isto o resultado de xy. Suponha que o utilizador digitou 2 e 3, ficando x com 2 e y com 3. res1 = 1 * 2 com i = 0; Neste caso 0 < 3 res2 = 1 * 2 * 2 com i = 1; Neste caso 1 < 3 res3 = 1 * 2 * 2 * 2 com i = 2; Neste caso 2 < 3 De seguida i fica com 3 e 3 < 3 fica falso, logo o loop no se realiza e o programa vai executar a instruo printf("%.0f\n",res) que d resultado 8 que 23.

7 [2] Seja o seguinte programa em Linguagem C: #include <stdio.h> int main () { long i; int j; for(i = 1; 1; i++) { for(j=1; j<=10; j++) if(i%j) break; else continue; if (j==11) { printf ("O numero e %d\n", i); break; } } return 0; } Escreva por palavras suas o resultado da execuo deste programa?

O programa afixa no cran o menor dos inteiros maiores que 0 que divisvel por todos os nmeros de 1 a 10. O primeira instruo for um loop infinito uma vez que o teste da condio 1, ou seja sempre verdadeiro. A segunda instruo for dentro do loop anterior destina-se a testar os nmero de 1 a 10, por isso j inicia-se a 1 e a condio j <= 10. Para ver se o nmero i divisvel por um dos valores de 1 a 10 usa-se a condio i%j. Quando o nmero i divisvel por j o resultado de i%j 0, ou seja falso. Ento quando o nmero i divisvel por j acontece a instruo continue, ou seja vai-se para j++. N averdade o que se est dizer que se o nmero i for divisvel por j ento passa-se a testar se ele agora divisvel por j+1 e assim sucessivamente. Se o nmero i no for divisvel por um dos nmeros entre 1 e 10 ento no vale a pena continuar a testar j+1, da que se faa break, pois i%j nesta situao d resto 1, ou seja TRUE. O break, como se sabe, quebra a execuo da instruo for interior e como tal vai ser executada a instruo: if (j==11) { printf ("O numero e %d\n", i); break; } Se houve um break no for anterior quer dizer que concerteza o valor de j neste porto ter um valor entre 1 e 10 e como tal no satisfaz a questo do nmero i ser divisvel por todos os nmeros de 1 a 10. Ento a instruo anterior (if) no faz nada e como tal passa-se ao for inicial, ou seja a i++. Quando por acaso o i for divisvel por todos os nmeros de 1 a 10, o segundo for quebrado, no por break, mas porque no se verifica mais a condio j <= 10, e j nesta altura ter 11. Quando se executar o if a seguir ao segundo for, ento sero executadas as instrues: { printf ("O numero e %d\n", i); break; } Assim sendo escrito o nmero i que divisvel por todos os nmeros de 1 a 10 e, ao ser executada a instruo break, o primeiro for infinito quebrado e o programa termina. Quanto ao return 0 no interessa para nada nesta fase. J agora, o programa afixa o menor dos inteiros porque o i comeou em 1 e vai testando em sentido crescente. Quando apanhar o nmero que divisvel por todos os nmeros entre 1 e 10, ento esse o menor nmero que responde referida condio.

8 [1] Seja o seguinte programa em Linguagem C: #include <stdio.h> int main () { int i, j, ndig; int cnt = 0; double limsup = 1; double liminf = 1; double val; scanf("%d",&ndig); for (i=0; i < ndig; i++) limsup = limsup * 10; for (i=0; i < ndig - 1; i++) liminf = liminf * 10; for(i = 1; 1; i++) { for (j=0, val = 1; j < ndig; j++) val = val * i; if ( val < liminf) continue; else if ( val < limsup) { printf("O Numero e %d %.0f\n", i, val); cnt++; } else break; } printf("Foram %d vezes",cnt); return 0; } Escreva por palavras suas o resultado da execuo deste programa?

A chave deste problema est em identificar que for (i=0; i < ndig; i++) limsup = limsup * 10; Este for semelhante ao problema 6 ou seja faz 10ndig . for (i=0; i < ndig - 1; i++) liminf = liminf * 10; Este for semelhante ao problema 6 ou seja faz 10ndig-1 . Por outro lado o for dentro do terceiro for: for (j=0, val = 1; j < ndig; j++) val = val * i; semelhante ao problema 6 ou seja faz indig .

Vamos ento simplificar o problema: #include <stdio.h> int main () { int i, j, ndig; int cnt = 0; double limsup = 1; double liminf = 1; double val; scanf("%d",&ndig); limsup = 10ndig liminf = 10ndig-1 for(i = 1; 1; i++) { val = indig if ( val < liminf) continue; else if ( val < limsup) { printf("O Numero e %d %.0f\n", i, val); cnt++; } else break; } printf("Foram %d vezes",cnt); return 0; } Agora j temos uma ideia mais correcta do que faz o programa. Na verdade comea por calcular quais so os limites para um nmero com n digitos. Por exemplo se ndig = 2, ento os valores de sero os nmeros entre 10 e 99. 10ndig= 100 e 10ndig-1= 10. Temos ento uma forma de saber qual o intervalo de valores para nmeros com n digitos. De seguida calcula-se se val = indig est dentro destes limites, o que feito pelas instrues if dentro do loop. Ento o que o programa est a fazer verificar quais os nmeros que so potncia de ndigitos que fazem parte do intervalo de nmeros com n digitos. A instruo for(i = 1; 1; i++) est a gerar todas as potncias, atravs da frmula indig Por exemplo, se n = 2 ento os valores sero 42, 52, 62, 72, 82, 92

9 [2] Faa um programa que seja capaz de ler valores do teclado at que a soma dos valores inseridos seja superior a 100. No entanto tenha em ateno que a soma s acontecer se o valor que estiver a ser lido for maior que o valor que tenha sido inserido at essa altura, caso contrrio a soma no ser realizada. Por exemplo, se a sequncia de entrada for: 10 20 30 45, o programa termina. Com efeito 10+20+30+45 maior que 100. No entanto, com a sequncia 10 20 15 30 23 18 25 45 o programa necessitou de mais nmeros para terminar. Repare que os nmeros 15, 23, 18 e 25 no contaram para a soma. Vamos comear por reduzir este problema a supor que o que eu quero apenas ler nmeros at que a soma dos nmeros introduzidos seja superior a 100. Isto corresponde a simplificar o problema. A soluo a seguinte: #include <stdio.h> int main () { int num; int soma = 0;

do { printf("introduza um nmero -> "); scanf("%d",&num); soma = soma + num; } while (soma <= 100); printf ("A soma e %d ", soma); } Repare que a questo fundamental est em ter um ciclo que vai pedindo nmero ao utilizador, some esse nmero ao resultado anterior e repita o ciclo at que a soma dos nmeros introduzidos seja superior a 100.

Mas o que queremos no bem isto, mas adicionar a complexidade de testar se o nmero introduzido superior ao maior nmero introduzido at essa altura. Assim sendo, vamos ter de memorizar o maior nmero introduzido e compar-lo com o nmero que foi introduzido, ou seja a soluo passa a ser:

#include <stdio.h> int main () { int num; int soma = 0; int maior = 0;

do { printf("introduza um nmero -> "); scanf("%d",&num); if (num > maior) { maior = num; soma = soma + num; } } while (soma <= 100); printf ("A soma e %d ", soma); }

10 [2] Implemente um programa em Linguagem C que calcule a soma dos digitos de um nmero do tipo 2nbits . O programa pedir ao utilizador quantos bits tem o nmero. Por exemplo, caso a resposta ao pedido de nbits seja 8, o resultado do programa dever ser 13, pelo facto de 28 ser 256 e 2+5+6=13. O importante neste problema perceber muito bem o que se pretende. Primeiramente h que determinar qual o valor de 2nbits . Mas isto no mais do que xy , que foi mostrado no problema 6. Depois de sabermos qual o nmero ento podemos passar a somar os seus digitos. Para isso precisamos de saber como obter os digitos individuais de um dado nmero, o que se consegue recorrendo a operaes aritmticas simples e conhecidas. Por exemplo, seja o nmero 1024. 1024 % 10 4 102 % 10 2 10 % 10 0 1 % 10 1 Se repararem consegui obter todos os digitos de um dado nmero s com a opero mod (%). No entanto, reparem que de cada vez tive de ir dividindo (diviso inteira) o nmero por 10. No caso anterior: 1024 / 10 102 102 / 10 10 10 / 10 1 1 / 10 0

Ou seja vou realizando a operao at o resultado da diviso inteira ser 0.

Ou seja em pseudo cdigo posso fazer a seguite: Calcula num = 2nbits Repetir digito = digito % 10 num = num / 10 soma = soma + digito ate que num == 0 Escreve soma Ou seja em C ser: #include <stdio.h> int main () { long num = 2; int nbits, I, digito; int soma = 0; printf("Qual o numero de bits -> "); scanf("%d",&nbits); /* calcula 2nbits */ for(i=1; i<nbits;i++) num = num * 2; do { digito = digito % 10; num = num / 10; soma = soma + digito; } while (num); printf ("A soma e %d ", soma); return 0; }

11 [2] Implemente um programa em Linguagem C, utilizando uma das instrues de loop da linguagem, que apresente no ecr a seguinte sequncia. ----1------2-2----3-3-3--4-4-4-45-5-5-5-5 #include <stdio.h> #define MAX 5 int main () { int i, j;

for (i=1; i<=MAX; i++) { /* Faz o primeiro conjunto de traos */ for (j=MAX-i; j>0;j--) putchar('-'); /* Escreve os nmeros interiores */ /* Nao se esqueam que o nmero de caracteres entre os primeiros - e os segundos tem um valor igual a i + i-1. Por exemplo na linha 1 esse valor e 1, pois apenas o caracter 1 escrito. Na linha 2 aparece 2-2, ou seja 3 caracteres. Na linha 3 aparece 3-3-3 ou seja 5 = 3+2. Depois so e necessario saber quando se escreve um - ou um nmero. Como o nmero de caracteres sempre mpar usa-se j%2 para detectar essa situao */ for (j=i+(i-1); j>0; j--) if (j % 2 == 0) putchar('-'); else printf("%d",i); /* Faz o ultimo conjunto de traos */ for (j=MAX-i;j>0; j--) putchar('-'); /* Apos fazer uma linha tem que mudar de linha para fazer a proxima */ printf("\n"); } }

You might also like