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
Download

Exercicios aulas 25/05 e 26/05