UNIVASF Disciplina: Introdução à Programação Perı́odo: 2010.1 - Turma: Questões de revisão - 25 de Maio Assunto da prova 2: • Conceito de funções e passagem de parâmetros, valores de retorno e escopo de variáveis, passagem de parâmetros por valor e por referência. recursividade • Introdução aos ponteiros • Vetores e matrizes • Redirecionamento da entrada/saı́da padrão • Aritmética de ponteiros • Funções para manipulação de strings • Parâmetros formais da função main() • Arquivos texto. Comandos para abrir, fechar, salvar e ler informações do arquivo. Questão 1 (Arquivos texto) Quando k resistores estão ligados em paralelo como mostrado na Fig. 1, o resistor equivalente tem uma resistência Rp que obedece a relação (1). Rp Rk R2 ... Vs I R1 Vs I Figura 1: Resistores em paralelo. X 1 1 1 1 1 = = + + ... + Rp Ri R1 R2 Rk i=1 k (1) No arquivo dados.txt, estão armazenados: na primeira linha, a tensão (em V) sobre a resistência em paralelo; e nas linhas seguintes, um número desconhecido de valores de resistências ligadas em paralelo. Implemente um programa em C para • ler o valor da tensão (em V) sobre a resistência em paralelo e armazene numa variável do tipo double • ler os valores de cada resistência Ri (em ohms) até o término do arquivo • calcule a resistência equivalente Rp • calcule a corrente I que passa pela resistência em paralelo • e imprima, num arquivo resultados.txt, em notação cientı́fica, os valores calculados Resultados esperados: dados.txt: 4.0 1000.0 2000.0 2000.0 resultados.txt A resist^ encia equivalente a associacao de resistores em paralelo eh 5.000000e+02 ohms. A corrente é 8.000000e-03 A. 1 Questão 2 (Arquivos texto) No arquivo log.txt está armazenado em cada linha o uso de cada núcleo de uma CPU de dois núcleos (Core 2 Duo) a cada 0,1 segundo. As frequências de operação (em Hz) possı́veis para cada núcleo são: saulo@saulo-laptop:~$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies 1733000 1333000 1067000 800000 saulo@saulo-laptop:~$ cat /sys/devices/system/cpu/cpu1/cpufreq/scaling_available_frequencies 1733000 1333000 1067000 800000 Se deseja um gerenciado de energia que, como ilustrado na Fig. 2: • Se o uso da CPU for maior que 80%, a frequência será a maior possı́vel, ou seja, 173300Hz, pois a CPU necessita desempenho • Se o uso da CPU for menor que 60%, a frequência será a menor possı́vel, ou seja, 800000Hz, pois a carga de trabalho está baixa e é possı́vel economizar energia • Se o uso da CPU for maior ou igual que 60% e menor ou igual a 80%, a frequência decresce, ou seja, 173300Hz → 1333000Hz → 1067000Hz → 800000Hz Figura 2: Gerenciamento de energia. Escreva num arquivo comandos.txt, em cada linha, o comando para cada núcleo da CPU. Resultados esperados (extraı́dos de dados reais: uso da CPU de /proc/stat, comandos escritos em /sys/devices/system/cpu/cpuX/cpufreq/scaling_cur_freq, onde X é 0 ou 1): log.txt: comandos.txt: usoCPU[0] usoCPU[1] comandoCPU[0] comandoCPU[1] 0.545455 0.200000 800000 800000 0.363636 0.090909 800000 800000 0.300000 0.000000 800000 800000 0.000000 0.000000 800000 800000 0.090909 0.083333 800000 800000 0.583333 0.461538 800000 800000 0.300000 0.200000 800000 800000 0.181818 0.000000 800000 800000 0.923077 0.000000 1733000 800000 0.636364 0.363636 1333000 800000 0.600000 0.090909 1067000 800000 0.000000 0.090909 800000 800000 0.000000 0.000000 800000 800000 0.090909 0.083333 800000 800000 0.000000 0.076923 800000 800000 0.272727 0.083333 800000 800000 Questão 3 (Redirecionamento da entrada/saı́da padrão) Escreva um programa em C para ler e contar os caracteres da entrada padrão enquanto o caractere lido for diferente de ’\n’. À medida que os caracteres são lidos, imprima cada um na saı́da padrão. Ao final, imprima também o número de caracteres lidos. Redirecione um arquivo texto.txt para a entrada padrão. Redirecione um arquivo saida.txt para a saı́da padrão. 2 Questão 4 (Vetores, matrizes, funções, aritmética de ponteiros) Um elemento z[i][j] de uma matriz é dito ponto de sela da matriz z se, e somente se, z[i][j] for ao mesmo tempo o menor elemento da linha i e o maior elemento da coluna j. Faça um programa que carregue um vetor x com valores ponto-flutuante −10, −9, −8, . . . , 10, um vetor y com valores ponto-flutuante −10, −9, −8, . . . , 10, e uma matriz z com cada elemento calculado como z[i][j] = f (x[j], y[i]) = (x[j]−2.5)2 −(y[i]+2.8)2 . Um gráfico de z é mostrado na Fig. 3. Implemente a função void f(double *z, double *x, double *y, int numLinhas, int numColunas) para calcular os elementos de z. Encontre pelo menos um elemento ponto de sela de z. 200 z 100 0 −100 −200 10 5 10 0 5 0 −5 −5 y −10 −10 x Figura 3: Valores da matriz z. Resultado esperado: z = 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | | | | | | | | | | | | | | | | | | | | | 0 104.41 117.81 129.21 138.61 146.01 151.41 154.81 156.21 155.61 153.01 148.41 141.81 133.21 122.61 110.01 95.41 78.81 60.21 39.61 17.01 -7.59 1 80.41 93.81 105.21 114.61 122.01 127.41 130.81 132.21 131.61 129.01 124.41 117.81 109.21 98.61 86.01 71.41 54.81 36.21 15.61 -6.99 -31.59 2 58.41 71.81 83.21 92.61 100.01 105.41 108.81 110.21 109.61 107.01 102.41 95.81 87.21 76.61 64.01 49.41 32.81 14.21 -6.39 -28.99 -53.59 Ponto de sela: z[7][12] = 3 38.41 51.81 63.21 72.61 80.01 85.41 88.81 90.21 89.61 87.01 82.41 75.81 67.21 56.61 44.01 29.41 12.81 -5.79 -26.39 -48.99 -73.59 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 20.41 4.41 -9.59 -21.59 -31.59 -39.59 -45.59 -49.59 -51.59 -51.59 -49.59 -45.59 -39.59 -31.59 -21.59 -9.59 4.41| 33.81 17.81 3.81 -8.19 -18.19 -26.19 -32.19 -36.19 -38.19 -38.19 -36.19 -32.19 -26.19 -18.19 -8.19 3.81 17.81| 45.21 29.21 15.21 3.21 -6.79 -14.79 -20.79 -24.79 -26.79 -26.79 -24.79 -20.79 -14.79 -6.79 3.21 15.21 29.21| 54.61 38.61 24.61 12.61 2.61 -5.39 -11.39 -15.39 -17.39 -17.39 -15.39 -11.39 -5.39 2.61 12.61 24.61 38.61| 62.01 46.01 32.01 20.01 10.01 2.01 -3.99 -7.99 -9.99 -9.99 -7.99 -3.99 2.01 10.01 20.01 32.01 46.01| 67.41 51.41 37.41 25.41 15.41 7.41 1.41 -2.59 -4.59 -4.59 -2.59 1.41 7.41 15.41 25.41 37.41 51.41| 70.81 54.81 40.81 28.81 18.81 10.81 4.81 0.81 -1.19 -1.19 0.81 4.81 10.81 18.81 28.81 40.81 54.81| 72.21 56.21 42.21 30.21 20.21 12.21 6.21 2.21 0.21 0.21 2.21 6.21 12.21 20.21 30.21 42.21 56.21| 71.61 55.61 41.61 29.61 19.61 11.61 5.61 1.61 -0.39 -0.39 1.61 5.61 11.61 19.61 29.61 41.61 55.61| 69.01 53.01 39.01 27.01 17.01 9.01 3.01 -0.99 -2.99 -2.99 -0.99 3.01 9.01 17.01 27.01 39.01 53.01| 64.41 48.41 34.41 22.41 12.41 4.41 -1.59 -5.59 -7.59 -7.59 -5.59 -1.59 4.41 12.41 22.41 34.41 48.41| 57.81 41.81 27.81 15.81 5.81 -2.19 -8.19 -12.19 -14.19 -14.19 -12.19 -8.19 -2.19 5.81 15.81 27.81 41.81| 49.21 33.21 19.21 7.21 -2.79 -10.79 -16.79 -20.79 -22.79 -22.79 -20.79 -16.79 -10.79 -2.79 7.21 19.21 33.21| 38.61 22.61 8.61 -3.39 -13.39 -21.39 -27.39 -31.39 -33.39 -33.39 -31.39 -27.39 -21.39 -13.39 -3.39 8.61 22.61| 26.01 10.01 -3.99 -15.99 -25.99 -33.99 -39.99 -43.99 -45.99 -45.99 -43.99 -39.99 -33.99 -25.99 -15.99 -3.99 10.01| 11.41 -4.59 -18.59 -30.59 -40.59 -48.59 -54.59 -58.59 -60.59 -60.59 -58.59 -54.59 -48.59 -40.59 -30.59 -18.59 -4.59| -5.19 -21.19 -35.19 -47.19 -57.19 -65.19 -71.19 -75.19 -77.19 -77.19 -75.19 -71.19 -65.19 -57.19 -47.19 -35.19 -21.19| -23.79 -39.79 -53.79 -65.79 -75.79 -83.79 -89.79 -93.79 -95.79 -95.79 -93.79 -89.79 -83.79 -75.79 -65.79 -53.79 -39.79| -44.39 -60.39 -74.39 -86.39 -96.39 -104.39 -110.39 -114.39 -116.39 -116.39 -114.39 -110.39 -104.39 -96.39 -86.39 -74.39 -60.39| -66.99 -82.99 -96.99 -108.99 -118.99 -126.99 -132.99 -136.99 -138.99 -138.99 -136.99 -132.99 -126.99 -118.99 -108.99 -96.99 -82.99| -91.59 -107.59 -121.59 -133.59 -143.59 -151.59 -157.59 -161.59 -163.59 -163.59 -161.59 -157.59 -151.59 -143.59 -133.59 -121.59 -107.59| 0.21. Questão 5 (Vetores, matrizes, funções, parâmetros formais da função main(), aritmética de ponteiros) O campo elétrico entre duas cargas elétricas q e −q é mostrado na Fig. 4. Se situarmos a carga q no plano xy ~ = (Ex , Ey ) no plano é como mostrado na Fig. 5. no ponto (0, 0), e −q no ponto (5, 0), então o campo elétrico E Faça um programa que • obtenha, a partir dos parâmetros formais da função main(), um número double d • carregue um vetor x com valores ponto-flutuante −2, −1, 0, . . . , 6 • carregue um vetor y com valores ponto-flutuante −2, −1, 0, 1, 2 • carregue uma matriz Ex com cada elemento calculado como Ex[i][j] = x[j] − d x[j] − (x[j]2 + y[i]2 )3/2 ((x[j] − d)2 + y[i]2 )3/2 • carregue uma matriz Ey com cada elemento calculado como Ey[i][j] = y[i] y[i] − (x[j]2 + y[i]2 )3/2 ((x[j] − d)2 + y[i]2 )3/2 3 • implemente a função void f(double *Ex, double *Ey, double *X, double *Y, int numLinhas, int numColunas) para calcular os componentes de Ex e Ey do campo elétrico. Utilize a função de math.h: double pow( double base, double exp ); Resultado esperado para d = 5: Ex = | -0.0702 | -0.1591 | -0.2296 | -0.1591 | -0.0702 -0.0657 -0.3269 -0.9722 -0.3269 -0.0657 0.0320 0.0377 nan 0.0377 0.0320 0.1342 0.4106 1.0625 0.4106 0.1342 0.1524 0.2738 0.3611 0.2738 0.1524 0.1524 0.2738 0.3611 0.2738 0.1524 0.1342 0.4106 1.0625 0.4106 0.1342 0.0320 0.0377 nan 0.0377 0.0320 -0.0657| -0.3269| -0.9722| -0.3269| -0.0657| Ey = | -0.0832 | -0.0866 | 0.0000 | 0.0866 | 0.0832 -0.1710 -0.3491 0.0000 0.3491 0.1710 -0.2372 -0.9925 nan 0.9925 0.2372 -0.1565 -0.3393 0.0000 0.3393 0.1565 -0.0457 -0.0578 0.0000 0.0578 0.0457 0.0457 0.0578 0.0000 -0.0578 -0.0457 0.1565 0.3393 0.0000 -0.3393 -0.1565 0.2372 0.9925 nan -0.9925 -0.2372 0.1710| 0.3491| 0.0000| -0.3491| -0.1710| 2.5 2 1.5 1 y 0.5 0 −0.5 −1 −1.5 −2 −2.5 −2 Figura 4: Campo elétrico no espaço entre duas cargas elétricas q e −q. −1 0 1 2 x 3 4 5 6 Figura 5: Campo elétrico no plano entre duas cargas elétricas q e −q. 4