RESPOSTAS DOS EXERCÍCIOS – LISTA 1

10  24  Download (0)

Full text

(1)

RESPOSTAS DOS EXERCÍCIOS – LISTA 1

[1]

Nos programas abaixo, qual será a saída mostrada na tela ao se executar o programa? Não é necessário incluir a parte onde o system(“PAUSE”) solicita que se pressione qualquer tecla para continuar...

(a) #include <stdio.h>

#include <stdlib.h> #include <math.h>

int main(void) {

int i = 10; float aux = 1; do

{

aux = pow(aux,i)*sqrt(i); i--;

}while(i != 3); printf("%d\n",i); system("PAUSE"); return 0;

}

(b) #include <stdio.h>

#include <stdlib.h>

int main(void) {

int i,j,aux=0;

for(i=0,j=10;i < 10;i++,j--) {

aux += i*j; }

printf("%d\n",aux); system("PAUSE"); return 0;

}

(c) #include <stdio.h>

#include <stdlib.h>

int main(void) {

int i,j,aux=0;

for(i=0,j=10;i < 10;i++,j--) {

aux += i*j; if(j == 6) break; }

printf("%d\n",aux); system("PAUSE"); return 0;

(2)

(d) #include <stdio.h> #include <stdlib.h>

int main(void) {

int i,j,aux=0;

for(i=0,j=10;i < 10;i++,j--) {

if(j == 6) continue; aux += i*j;

}

printf("%d\n",aux); system("PAUSE"); return 0;

}

(e) #include <stdio.h>

#include <stdlib.h>

int main(void) {

int i,aux=0;

for(i=0;i < 10;i++) {

((i%3)!=0)?(aux = aux + i):(aux = aux - i); }

printf("%d\n",aux); system("PAUSE"); return 0;

}

[2]

Considerando apenas operações com inteiros, realize as operações que seguem:

a) 5 / 3 = 1

b) (9 > 6) = 1

c) (3 > 8) = 0

d) 3 / 2 = 1

e) (2 > 8)||(9 != 1) = 1

f) (543 && 1) = 1

g) 34 % 2 = 0

h) 43 % 2 = 1

i) (56 / 34) = 1

j) ~(2 < 6) = 0

k) 99 % 50 = 49

l) 342 % 100 = 42

[3]

Considere um grupo de variáveis declaradas e com os valores atribuídos como segue:

float y,f; int a,b,c; a = 2; b = 30; c = 5; f = 0.33;

Qual será o valor final atribuído a y nas seguintes expressões:

a)

y = (

float

)a/c+c*f;

y = 2.05

b)

y = f*(c/a);

y = 0.66

(3)

[4]

Faça uma função que calcula e retorna o valor da reatância de um indutor (X

L

). A função

deverá receber a indutância L (em Henrry) e a frequência f (em Hz) e retornar a reatância

em Ohms.

2

L

X

=

ω

L

=

π

f L

float calcReat(float L, float f) {

return 2*M_PI*f*L; //M_PI está definido em math.h

}

[5]

Escreva um programa que calcula a reatância de um indutor para várias frequências. O

programa deverá variar a frequência de 1

μHz at

é 1MHz de forma a formar as chamadas

décadas de frequência (10

-6

, 10

-5

, 10

-4

, 10

-3

, 10

-2

, 10

-1

, 10

-0

, 10

1

, 10

2

, 10

3

, 10

4

, 10

5

, 10

6

). O

programa deverá ler do teclado a indutância e imprimir a frequência e a respectiva

reatância para todos os casos.

#include <stdio.h> #include <stdlib.h> #include <math.h>

float calcReat(float L, float f) {

return 2*M_PI*f*L; }

int main(void) {

int i;

float Xl, freq, ind;

printf("Digite Indutancia: ");

scanf("%f",&ind); //efetua leitura da indutância

for (i = -6;i < 7;i++) {

freq = pow(10,i); //frequência é 10 na i...

Xl = calcReat(ind,freq); //Calculo a reatância...

printf("f = %.1e Xl = %.5e\n",freq,Xl); }

system("PAUSE"); return 0;

(4)

[6]

Faça uma função que substitui todos os valores ímpares de uma matriz por zeros. A função

deverá retornar o número de valores ímpares encontrados. Use, obrigatoriamente

#include <stdio.h>

,

ponteiros para percorrer a matriz. A função deverá receber as dimensões da matriz como

parâmetros da função para poder percorrê-la evitando ultrapassar seus limites.

#include <stdlib.h> #include <math.h>

#define NC 2 #define NL 3

//esta função considera que a matriz tem exatamente o tamanho //da matriz declarada... para um programa que considera matrizes //com tamanho diferente da matriz declarada ver arquivo:

//PNA_DUVIDA_MATRIZ

int substitui(int *p, int l, int c) {

int i,cont = 0;

for(i = 0;i < l*c;i++) //O for percorre n*l elementos da matriz

{

if(*p % 2) {

*p = 0; //zera o valor apontado

cont++; //incrementa contador

} p++; }

return cont; //retorna contador

}

//Programa para teste da função

int main(void) {

int mat[NL][NC],i,j,trocas; for(i = 0;i < NL; i++) {

for (j = 0;j < NC; j++) {

printf("Digite o termo (%d,%d) da matriz: ",i,j); scanf("%d",&mat[i][j]); }

}

trocas = substitui(&mat[0][0],NL,NC);

for(i = 0;i < NL; i++) {

for (j = 0;j < NC; j++) {

printf("%5d",mat[i][j]); }

putchar('\n'); }

printf("Foram realizadas %d trocas\n",trocas); system("PAUSE");

(5)

[7]

Faça uma função que retorne uma string contendo a extensão de um arquivo. A função

deverá receber uma string com o nome inteiro do arquivo (incluindo extensão). O

programa deverá localizar o último caractere ponto da string e retornar apenas a string

com a extensão do arquivo. Por exemplo. Se o nome do arquivo for: super.mega.tabela.xls

a função deverá retornar apenas o endereço para a string xls.

#include <stdio.h> #include <stdlib.h>

#define MAX 30

char *getExt(char *p) //esta função retorna um ponteiro (endereço)

{

char *c = NULL; //guardará o endereço da letra após o ponto.

while(*p != '\0') //enquanto não chegar ao final da string...

{

if(*p == '.') c = p + 1; //se achar um ponto, põe em c o end.

p++; //do próximo caractere em c...

}

return c; //se não achar um ponto retorna NULL (ver declaração...)

}

int main(void) {

char str[30],*s; while(1)

{

printf("Digite nome de arquivo de no maximo %d caracteres:\n",MAX); gets(str);

s = getExt(&str[0]); //chama função e poe endereço retornado em s

if(s == NULL) printf("Arquivo sem extensao...\n"); else

{

printf("A extensao e': ");

puts(s); //como str era string, a função imprime a string apenas

} //a partir do endereço retornado pela função

}

system("PAUSE"); return 0;

(6)

/* Este programa faz a mesma coisa, porém possui algumas verificações adicionais como opção para fechar o programa e testes de tamanho da string para evitar problemas... */

#include <stdio.h> #include <stdlib.h> #include <string.h>

#define MAX 30

char *getExt(char *p) {

char *c = NULL; //guardará o endereço da letra após o ponto.

while(*p != '\0') //enquanto não chegar ao final da string...

{

if(*p == '.') c = p + 1; //se achar um ponto, coloca em c o end.

p++; //do próximo caractere em c...

}

return c; //se não achar um ponto retorna NULL (ver declaração...)

}

int main(void) {

char str[30],*s; while(1)

{ do {

printf("Digite nome de arquivo de no maximo %d caracteres. ",MAX); printf("(Digite exit para encerrar o programa)\n",MAX);

gets(str);

if(!strcmp(str,"exit")) return 0;

if(strlen(str) == 0) printf("Ao menos digite algo...\n"); else if(strlen(str) > MAX) printf("String muito grande... \n");

else break; //sai do loop infinito se o tamanho da string estiver certo

}while(1); //senão volta a solicitar que a string seja digitada

s = getExt(&str[0]); //chama função e poe endereço retornado em s

if(s == NULL) printf("Arquivo sem extensao...\n"); else

{

printf("A extensao e': ");

puts(s); //como str era string, a função imprime a string apenas

} //a partir do endereço retornado pela função

}

system("PAUSE"); return 0;

(7)

[8]

Amplificadores de som Classe A são os que possuem a melhor qualidade por operarem

sempre na região linear. Quando implementados com amplificadores operacionais,

normalmente consegue-se uma excursão total que equivale a aproximadamente a tensão

de alimentação menos 3 volts. Assim sendo, faça uma função que retorne a potência de

um amplificador classe A, sabendo que:

3V

2

g pk

V

V

=

Onde V

pk

é a tensão de pico da onda na máxima excursão e V

g

é a tensão total de

alimentação.

A potência eficaz pode ser obtida pela relação abaixo:

2

2

2

2

pk

pk RMS

V

V

P

R

R

=

=

Onde R é a resistência do alto-falante.

A função deverá receber como parâmetros a tensão de alimentação do amplificador

Classe A e a resistência do alto-falante utilizado. Faça um programa que teste a função.

#include <stdio.h> #include <stdlib.h> #include <math.h>

float Prms(float Vg, float R) {

float Vpk;

Vpk = (Vg - 3)/2; //calculo Vpk

return pow(Vpk,2)/(2*R); //retorno Prms

}

//simples programa de teste...

int main(void) {

printf("Potencia RMS e' %f Watts\n",Prms(50, 4)); //lembre-se de que é possível

system("PAUSE"); //utilizar diretamente a func.

return 0; //no comando printf...

(8)

[9]

O conversor CC-CC Buck-Boost é amplamente utilizado em fontes chaveadas.

Esse conversor possui uma função de transferência estática que depende do modo de operação do conversor

(Modo de Condução Contínuo - MCC ou Modo de Condução Descontínuo - MCD). Abaixo são apresentadas as

possíveis funções de transferência estática para o conversor Buck-Boost:

1

Para o MCC 1

Para o MCD o i o i V D G V D V D G V D  = =     = =  Onde: 1

2L f D

R

⋅ ⋅ =

G é o ganho estático, D é a razão cíclica, Vo a tensão de saída, Vi é a tensão de entrada do conversor. L é o

valor da indutância deste conversor. R é a resistência de carga e f é a frequência de comutação. O modo de

condução pode facilmente ser obtido com o cálculo de D1. Se o valor de D1 somado com D for maior que 1, a

condução é contínua, e a primeira relação do ganho estático é válida. Se a soma D + D1 for menor do que 1, a

condução é descontínua, e vale a segunda relação de ganho.

Faça uma função que calcula e retorna o ganho estático G do conversor CC-CC Buck-Boost. A função deverá

receber como parâmetros a razão cíclica D, a indutância L, a resistência de carga R e a frequência de

comutação f.

Faça um programa para testar a função. O programa deverá ler do teclado Vi, f, L e R. Varie a razão cíclica de

0 até 1 com o número de passos que desejar. Imprima o valor da tensão de entrada, o valor da razão cíclica, o

valor do ganho estático e o valor da tensão de saída para cada passo dado pela razão cíclica.

#include <stdio.h> #include <stdlib.h> #include <math.h>

#define PASSOS 20

float calcG(float D, float L, float R, float f) {

float D1;

D1 = sqrt((2*L*f)/R); //calculo D1

if((D1+D) > 1) return (D/(1-D)); return D/D1;

}

int main(void) {

float vi,ind,freq,res,razao_cic,G;

printf("Digite a tensao de entrada (Vi): ");

scanf("%f",&vi); //vi pode ser praticamente qualquer valor

printf("Digite a indutancia (L): ");

scanf("%f",&ind); //geralmente entre 1e-9 a 1e-1

printf("Digite a frequencia de comutacao (f): "); scanf("%f",&freq); //geralmente entre 1e4 a 5e4

printf("Digite a resistencia de carga (R): ");

scanf("%f",&res); //em princípio pode ser qualquer valor...

for(razao_cic = 0; razao_cic <= 1; razao_cic += 1.0/PASSOS)

{ //No 1.0/PASSOS o .0 é para indicar que quero um resultado em ponto //flutuante para a razão cíclica

G = calcG(razao_cic,ind,res,freq);

printf("Vi = %.3f D = %.3f G = %.3f Vo = G*Vi = %.3f\n", vi, razao_cic, G, G*vi); }

system("PAUSE"); return 0;

(9)

[10]

Crie uma estrutura de dados que represente um resistor (deverá possuir valor, tolerância e potência). Crie uma função que indique a máxima tensão (nominal) que pode ser aplicada ao resistor. Crie uma função que

indique a máxima corrente (nominal) que pode ser aplicada ao resistor. Crie uma função que retorna o valor

máximo possível para a resistência do resistor. Crie uma função que retorna o valor mínimo possível de

resistência. As funções deverão receber, logicamente, uma variável do tipo igual ao da estrutura criada.

#include <stdio.h> #include <stdlib.h> #include <math.h>

struct resistor //crio a estrutura de dados

{

float val,tol,pot; };

typedef struct resistor res; //utilizo typedef para facilitar minha vida

float calcMaxCor(res aux); float calcMaxTen(res aux); float calcMaxRes(res aux); float calcMinRes(res aux);

int main(void) {

res r; //aqui crio uma variável para testar as funções.

float var; r.val = 10000; r.tol = 0.05; r.pot = 1.0/4;

printf("Dados: R = %.3f +- %.2f%%, %.3fW\n",r.val,r.tol*100,r.pot); //aqui eu imprimo a tolerancia em %. para mostrat % utiliza-se %%.

var = calcMaxCor(r);

printf("Corrente Maxima: %.4fA\n",var); var = calcMaxTen(r);

printf("Tensao Maxima: %.4fV\n",var); var = calcMaxRes(r);

printf("Resistencia Maxima: %.4f Ohms\n",var); var = calcMinRes(r);

printf("Resistencia Minima: %.4f Ohms\n",var); system("PAUSE"); return 0;

}

float calcMaxCor(res aux) {

return sqrt(aux.pot/aux.val); }

float calcMaxTen(res aux) {

return sqrt(aux.pot*aux.val); }

float calcMaxRes(res aux) {

return aux.val*(1+aux.tol); }

float calcMinRes(res aux) {

(10)

Figure

Updating...

References