UNIVERSIDADE DA BEIRA INTERIOR Programação MIEA 1º Semestre Frequência Resolução 13/12/2016 1. Escreva uma expressão lógica em linguagem C para cada uma das seguintes condições: (a) o valor da variável do tipo real N deve estar fora do intervalo [10, 100[; N < 10 N >= 100 (b) o valor da variável do tipo inteiro N não deve ser um múltiplo do valor da variável do tipo inteiro k; N % k!= 0 Escreva uma instrução de atribuiçao em linguagem C para cada uma das seguintes acções: (c) atribuir à variável X o valor da expressão 4Y + 3Y 2 + 2 sen(z) + Y, com Y e Z variáveis; X = 4 * Y + 3 * Y * Y + 2 * sin(z) + sqrt(y) (d) atribuir à variável do tipo inteiro P o valor 10 se N for par e 20 se N for ímpar; P = 10 * (N % 2 + 1) (e) atribuir à variável do tipo inteiro CENTENAS o algarismo das centenas da variável do tipo inteiro A. CENTENAS = (N / 100) % 10 ou CENTENAS = (N % 1000) / 100 Supondo que x = 10, y = -15 e z = -5, determine o valor de cada uma das seguintes expressões. Justifique, apresentando todos os cálculos efetuados (operador a operador e pela ordem apresentada). (f) x >= 8 x < 10 && z > -10 10 >= 8 ou 10 < 10 e -5 > -10 V ou F e V V e V V (g) y < z * 3 + 2 && x!= -2 * z -15 < -5 * 3 + 2 e 10!= -2 * (-5) -15 < -13 e 10!= 10 V e F F (h) y + x * (0.5 * 6 / 4) / 3-15 + 10 * (3.0 / 4) / 3-15 + 10 * 0.75 / 3-15 + 7.5 / 3-15 + 2.5-12.5
2. Usando um fluxograma, construa um algoritmo que execute as seguintes ações: - peça ao utilizador e leia um número inteiro N entre 100 e 500, inclusive; - peça ao utilizador e leia N números inteiros positivos não nulos; - determine quantos números pares foram inseridos pelo utilizador (dos N números); - mostre o resultado obtido com uma mensagem adequada. Resolução (sem fluxograma) 1) Inicio 2) Escrever( Insira um número inteiro entre 100 e 500 ) 3) Ler(N) 4) Se (N < 100 ou N > 500) Então 5) Regressar a 2) Senão 6) continuar 7) k 1 8) pares 0 9) Se (k <= N) Então 10) Escrever( Insira um número inteiro positivo não nulo ) 11) Ler(X) 12) Se (X > 0) Então 13) Se (X é par) Então 14) pares pares + 1 15) k k + 1 16) Regressar a 9) Senão 17) Continuar 18) escrever( Quantidade de pares =, pares) 19) Fim
3. Construa uma função em C que dados dois números inteiros positivos não nulos, N e K, leia N números inteiros positivos não nulos e determine e devolva a soma dos números (dos N lidos) que são múltiplos de K. (Nota: A é múltiplo de B, se o resto da divisão de A por B é zero) int somamultiplos (int N, int K) { int i, A, soma; soma = 0; i = 1; while (i <= N) { printf( Insira um inteiro positivo não nulo: ); scanf( %d, &A); if (A > 0) { if (A % K == 0) soma = soma + A; i = i + 1; return soma; 4. Considere as seguintes funções já implementadas e que se encontram no ficheiro «Frequencia.h»: int lervalorvalido (int inf, int sup) // devolve um valor inteiro no conjunto { inf,, sup void lervetor (int X[], int Dim) // lê um vetor X com Dim valores inteiros void AlterarVetor (int X[], int Dim, int A, int B) // se X[k] = A então X[k] B, para k = 0,, Dim-1 int maiorelementopositivo (int X[], int Dim) // devolve o maior elemento positivo de X (-1 se não existe) a) Implemente uma função em C que dado um vetor X com Dim números inteiros e um número inteiro Num, determine e devolva o número de elementos de X que são maiores que Num. Use o seguinte cabeçalho: int numeroelementosmaiores (int X[], int Dim, int Num) { int k, cont = 0; for (k = 0; k < Dim, k++) if (X[k] > Num) cont = cont + 1; return cont;
b) Usando as funções dadas e a construída em a), e supondo que estas funções se encontram implementadas no ficheiro «Frequencia.h», escreva um programa em C que: - peça um valor inteiro N entre 100 e 500, inclusive (usar funções anteriores), - leia um vetor A de números inteiros positivos de tamanho N (usar funções anteriores), - peça um valor inteiro K entre 1 e 10, inclusive (usar funções anteriores), - calcular o número de elementos de A são iguais a cada um dos K-ésimos maiores elementos positivos de A, se existirem (usar funções anteriores), - mostre os resultados obtidos. Ex: N = 10, A = [-2 4 7 3-8 7 9 4 7 2] e K = 3 => maior = 9 (1); 2º maior = 7 (3); 3º maior = 4 (2) #include <stdio.h> #include Frequencia.h main () { int N, K, i, A[500], nummaior, maior; N = lervalorvalido(100, 500); lervetor(a, N); K = lervalorvalido(1, 10); for (i = 1; i <= K; i = i + 1) { maior = maiorelementopositivo(a, N); if (maior >= 0) { nummaior = numeroelementosmaiores(a, N, maior-1); AlterarVetor(A, N, maior, -1); // todos os elementos iguais a maior passam a -1 printf( %d-esimo maior = %d; numero de elementos iguais = %d\n, i, maior, nummaior);
5. Implemente uma função em C que dados um vetor A com N números inteiros e um inteiro positivo não nulo K, construa um vector B com todos os k maiores elementos negativos de A, com k = 1, 2,, K (se existirem). Ex: A = [-15 32-23 -15 15-23 -32 32] => B = [-15-23 -32]. int vetorkmaioresnegativos (int A[], int N, int B[],int K) { int maiorneg, tamb, i, k; tamb = 0; for (kk = 1; kk <= K; kk++) { // determinar o primeiro elemento negativo de A maiorneg = 0; k = 0; while (k <= N-1 && A[k] >= 0) k = k + 1; if (k <= N-1) { // se existe pelo menos um negativo em A // determinar o maior negativo a partir da posição/indice k maiorneg = A[k]; for (i = k+1; i <= N-1; i = i + 1) if (A[i] < 0 && A[i] > maiorneg) maiorneg = A[i]; // adicionar mais um elemento ao vetor B if (maiorneg < 0) { tamb = tamb + 1; B[tamB-1] = i; // passar todos os elementos iguais ao menor negativo a positivo for (i = 0; i <= N-1; i = i + 1) if (A[i] == maiorneg) A[i] = (-1) * maiorneg; return tamb; // devolver o tamanho de B