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;
(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
[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
LX
=
ω
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;
[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");
[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;
/* 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;
[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...
[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;
[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 queindique 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) {