Mudanças entre as edições de "PRG-2011"
(10 revisões intermediárias pelo mesmo usuário não estão sendo mostradas) | |||
Linha 630: | Linha 630: | ||
4) Questão "surpresa" onde será dado um programa e o aluno deverá escrever as saídas do programa. | 4) Questão "surpresa" onde será dado um programa e o aluno deverá escrever as saídas do programa. | ||
+ | |||
+ | |||
+ | * [http://tele.sj.ifsc.edu.br/~eraldo/prog/prova.pdf Prova] | ||
Soluções: | Soluções: | ||
+ | |||
+ | ---- | ||
Questão 1 | Questão 1 | ||
<syntaxhighlight lang=c> | <syntaxhighlight lang=c> | ||
+ | |||
#include <stdio.h> | #include <stdio.h> | ||
#include <string.h> | #include <string.h> | ||
Linha 695: | Linha 701: | ||
} | } | ||
− | <\ | + | </syntaxhighlight> |
+ | |||
+ | ---- | ||
+ | Questão 2 | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include "stdio.h" | ||
+ | |||
+ | float computar_media_maior_menor(float vetor[],int tamanho) | ||
+ | { | ||
+ | float media,maior,menor; | ||
+ | int i; | ||
+ | |||
+ | maior = vetor[0]; | ||
+ | menor = vetor[0]; | ||
+ | for (i=0;i<tamanho;i++) { /* i poderia começar em 1 se tamanho maior que 1 */ | ||
+ | if (maior<vetor[i]) | ||
+ | maior=vetor[i]; | ||
+ | if (menor>vetor[i]) | ||
+ | menor=vetor[i]; | ||
+ | } | ||
+ | media = (maior+menor)/2; | ||
+ | return media; | ||
+ | } | ||
+ | |||
+ | /* programa principal somente para fins de teste - nao faz parte da solucao */ | ||
+ | main() | ||
+ | { | ||
+ | float vetor_de_dados[50]={1.,4.,3.}; | ||
+ | |||
+ | printf ("media = %f\n", computar_media_maior_menor(vetor_de_dados, 3)); | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | ---- | ||
+ | Questão 3 | ||
+ | |||
+ | OBS 1: A entrada de ângulo é em radianos - como seria para entrar em graus??? | ||
+ | |||
+ | OBS 2: Para linkar com a biblioteca matematica fazer: gcc -lm prog.c -o prog | ||
+ | |||
+ | <syntaxhighlight lang=c> | ||
+ | #include <stdio.h> | ||
+ | #include <math.h> | ||
+ | |||
+ | /* Estrutura representando numero complexo | ||
+ | em coordenada polar */ | ||
+ | struct TComplexoPolar{ | ||
+ | float r; /* raio */ | ||
+ | float theta; /* angulo */ | ||
+ | }; | ||
+ | |||
+ | /* Estrutura representando numero complexo | ||
+ | em coordenada retangular */ | ||
+ | |||
+ | struct TComplexoRetangular{ | ||
+ | float x; | ||
+ | float y; | ||
+ | }; | ||
+ | |||
+ | main () | ||
+ | { | ||
+ | struct TComplexoPolar numPolar; | ||
+ | struct TComplexoRetangular numRet; | ||
+ | |||
+ | /* entrada de dados */ | ||
+ | |||
+ | printf("Entre com o raio\n"); | ||
+ | scanf("%f",&numPolar.r); | ||
+ | printf("Entre com o angulo (em radianos)\n"); | ||
+ | scanf("%f",&numPolar.theta); | ||
+ | |||
+ | /* converter */ | ||
+ | |||
+ | numRet.x = numPolar.r * cos(numPolar.theta); | ||
+ | numRet.y = numPolar.r * sin(numPolar.theta); | ||
+ | |||
+ | /* imprimir */ | ||
+ | |||
+ | printf ("Complexo em Polar\n"); | ||
+ | printf("raio = %f\n", numPolar.r); | ||
+ | printf("angulo = %f\n", numPolar.theta); | ||
+ | |||
+ | printf ("Complexo em Retangular\n"); | ||
+ | printf("REAL = %f\n", numRet.x); | ||
+ | printf("IMAGINARIO = %f\n", numRet.y); | ||
+ | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | ---- | ||
+ | |||
+ | Questão 4 | ||
+ | |||
+ | alfa = 1 | ||
+ | |||
+ | beta= 14 | ||
+ | |||
+ | gama= 2 | ||
+ | |||
+ | delta= 5 | ||
== 7/07: RECUPERAÇÃO == | == 7/07: RECUPERAÇÃO == |
Edição atual tal como às 20h45min de 6 de julho de 2011
Nome do Professor: Eraldo Silveira e Silva
email: eraldo@ifsc.edu.br
Material de Referência
- Apostila adotada: Curso de Linguagem C - Engenharia Elétrica - UFMG
Avaliação
Trabalhos: 30% Prova: 70%
Aulas
== 26/05:
01/06: Aula 1 e 2 do Curso UFMG
02/06: Cont.Aula 2 do Curso UFMG
08/06: Aula 2 do Curso UFMG
09/06: Aula 2 do Curso UFMG
15/06: Aula 3 do Curso UFMG
Propor resolver questão
Tarefa para casa:
1) Escrever um programa que leia como dados de entrada dois números inteiros positivos: "s" e "q". O programa deve computar os dez primeiros números da PG (progressão geométrica), onde "s" é o número inicial e "q" a razão da progressão.
Obs: Para PG tem-se:
- ou
2) Repetir para P.A (progressão aritmética). Obs:
3) Organizar (1) e (2) em um programa único, com uma função para PG e outra para PA. Enviar para o professor até 07/06 às 23:59!
Controle de Entrega de Trabalhos
Legenda:
- S: entregou
- N: não entregou
Aluno | Trabalho 1 | Trabalho 2 | Trabalho 3 | Trabalho 4 | Trabalho 5 | Trabalho 6 |
---|---|---|---|---|---|---|
Alfredo | ||||||
Ângelo | ||||||
Beatriz | S | |||||
Bruno da Silva | S | |||||
Bruno | S | |||||
Caroline | S | |||||
Danilo | ||||||
Dayze | S | |||||
Fabiana | S | |||||
Felipe | ||||||
Gabriel | S | |||||
Grazielle | ||||||
Jayson | ||||||
Juliano | ||||||
Leandro | ||||||
Leonardo |
16/06: Aula 7 do Curso UFMG
22/06: Semana de Telecomunicações
23/06: Feriado
29/06: Aula 4 e 5 do Curso UFMG
-revisão comando for
-comando while
-comando do
-comando switch
-revisão comandos break e continue;
EXERCÍCIOS
1) Fazer um programa para computar o número de caracteres de uma cadeia (string) lida pelo teclado.Use o comando for;
#include <stdio.h>
void main ()
{
char alfa[50];
int i;
printf ("Entre com a cadeia: ");
scanf("%s",alfa);
for (i=0;alfa[i]!=0;i++)
;
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);
}
2) Repetir (1) com while;
#include <stdio.h>
void main ()
{
char alfa[50];
int i;
printf ("Entre com a cadeia: ");
scanf("%s",alfa);
i=0;
while (alfa[i]!=0) {
i++;
}
printf ("\nNumero de caracteres em %s = %d \n", alfa, i);
}
3) Refazer o exercício 2 colocando a função que faz a computação do tamanho da cadeia em uma função;
#include <stdio.h>
int calc_tamanho(char cadeia[])
{
int i=0;
while (cadeia[i]!=0) {
i++;
}
return i;
}
void main ()
{
char alfa[50];
int tamanho;
printf ("Entre com a cadeia: ");
scanf("%s",alfa);
tamanho = calc_tamanho(alfa);
printf ("\nNumero de caracteres em %s = %d \n", alfa, tamanho);
}
4) Fazer um programa para ler duas cadeias de caracteres (strings) e dizer qual delas possui mais caracter que a outra;
#include <stdio.h>
int calc_tamanho(char cadeia[])
{
int i=0;
while (cadeia[i]!=0) {
i++;
}
return i;
}
void main ()
{
char alfa[50],beta[50];
int tam1,tam2;
/* Leitura dos dados */
printf ("\nEntre com a cadeia alfa: ");
scanf("%s",alfa);
printf ("Entre com a cadeia beta: ");
scanf("%s",beta);
/* Computação dos tamanhos das cadeias */
tam1=calc_tamanho(alfa);
tam2=calc_tamanho(beta);
/* Verificacão da cadeia maior */
if (tam1>tam2)
printf ("alfa maior que beta\n");
else
printf("beta maior que alfa\n");
}
5) Refazer (4) colocando a comparação em uma função.
#include <stdio.h>
int calc_tamanho(char cadeia[])
{
int i=0;
while (cadeia[i]!=0) {
i++;
}
return i;
}
int comparar_cadeias(char cadeia1[], char cadeia2[])
{
int tam1,tam2, condicao_retorno;
tam1 = calc_tamanho(cadeia1);
tam2 = calc_tamanho(cadeia2);
if (tam1 == tam2)
condicao_retorno = 0;
else if (tam1>tam2)
condicao_retorno = 1;
else
condicao_retorno = -1;
return condicao_retorno;
}
void main ()
{
char alfa[50],beta[50];
int condicao;
/* Leitura dos dados */
printf ("\nEntre com a cadeia alfa: ");
scanf("%s",alfa);
printf ("Entre com a cadeia beta: ");
scanf("%s",beta);
/*Comparar cadeias */
condicao = comparar_cadeias(alfa,beta);
/* Mostrar resultado da comparacao */
if (condicao==1)
printf("\nalfa MAIOR que beta\n");
else if (condicao==0)
printf("\nCadeias de igual tamanho\n");
else
printf("\nalfa MENOR que beta\n");
}
30/06: Finalizando conteúdo - EXERCÍCIOS
-Uso de biblioteca por exemplo: manipulação de strings
-Tipos construídos pelo usuário: struct
-O operador de endereços &
EXERCÍCIOS:
1) Construir uma função que recebe dois parâmetros: um vetor de floats e o tamanho do vetor. A função deve retornar a média dos valores deste vetor. O programa principal deve ler os elementos do vetor até um número negativo apareça. Este é o final da entrada de dados. A função deve ser chamada para computar a média.
ESQUELETO DA SOLUÇÃO
#include <stdio.h>
float calcular_media_vetor(float vetor[], int tamanho)
{
float SomaAcumulada=0;
int i;
for(i=0;i<tamanho;i++) {
SomaAcumulada = SomaAcumulada + vetor[i];
}
return (SomaAcumulada/tamanho);
}
void main()
{
float vetor_lido[50];
float auxiliar;
float media;
int i,tamanho_vetor_lido;
/* Ler vetor */
i = 0;
auxiliar = 0;
do {
printf("\nElemento[%d] = ",i);
scanf("%f",&auxiliar);
if (auxiliar < 0)
break;
else
vetor_lido[i++] = auxiliar;
} while(1);
tamanho_vetor_lido = i;
printf("\nFim da entrada de dados\n");
/* Calcular media */
media = calcular_media_vetor(vetor_lido,i);
/* Imprimir media */
printf ("Media = %f\n",media);
}
2) Repetir o exercício 1 descartando o menor e o maior número do vetor, para fins da computação da média.
3) Traduzir o programa contador de moedas da wiki do Prof.Marcelo Sobral para o C:
Contador de moedas: faça um programa que leia valores de moedas e some as quantidades de tipos de moedas informadas. Por exemplo, se o usuário digitar 25, 50, 25, 5, 10, 5, o programa deve informar: 2 moedas de 5 centavos, 1 moeda de 10 centavos, 2 moedas de 25 centavos, 1 moeda de 50 centavos. São aceitos apenas valores de moedas de 1, 5, 10, 25 e 50 centavos. Seu programa deve ler 10 valores de moedas, e então apresentar o resultado.
inicio
inteiro m1, m5, m10, m25, m50
inteiro moeda
inteiro n
enquanto n < 10 faz
escrever "Moeda: "
ler moeda
escolhe moeda
caso 1:
m1 <- m1 + 1
caso 5:
m5 <- m5 + 1
caso 10:
m10 <- m10 + 1
caso 25:
m25 <- m25 + 1
caso 50:
m50 <- m50 + 1
defeito:
escrever "Valor invalido ...\n"
n <- n - 1
fimescolhe
n <- n + 1
fimenquanto
escrever "Moedas de 1 centavo: ", m1
escrever "\nMoedas de 5 centavos: ", m5
escrever "\nMoedas de 10 centavos: ", m10
escrever "\nMoedas de 25 centavos: ", m25
escrever "\nMoedas de 50 centavos: ", m50
fim
SOLUÇÂO PROPOSTA:
#include <stdio.h>
int main()
{
int m1=0,
m5=0,
m10=0,
m25=0,
m50=0;
int moeda;
int n=0;
while (n++<10) {
printf("Moeda: ");
scanf("%d",&moeda);
switch (moeda){
case 1:
m1 = m1++;
break;
case 5:
m5 = m5++;
break;
case 10:
m10 = m10++;
break;
case 25:
m25 = m25++;
break;
case 50:
m50 = m50++;
break;
default:
n--;
printf("Valor invalido...\n");
break;
}
}
printf("Moedas de 1 centavo:%d\n",m1);
printf("Moedas de 5 centavos:%d\n",m5);
printf("Moedas de 10 centavos:%d\n",m10);
printf("Moedas de 25 centavos:%d\n",m25);
printf("moedas de 50 centavos:%d\n",m50);
return(n++);
}
4) Um número complexo possui uma parte imaginaria e uma parte real. Fazer um programa para ler dois números complexos e somá-los. Defina o tipo complexo como uma struct da forma:
PROPOSTA 1 - SEM USAR FUNÇÔES ADICIONAIS
#include <stdio.h>
struct TComplexo {
float real;
float imaginario;
};
main()
{
struct TComplexo Numero1,Numero2,Resultado;
/* Entrada de dados */
printf("\nEntre com a parte real do primeiro numero => ");
scanf ("%f",&Numero1.real);
printf("\nEntre com a parte imaginaria do primeiro numero => ");
scanf ("%f",&Numero1.imaginario);
printf("\nEntre com a parte real do primeiro numero => ");
scanf ("%f",&Numero2.real);
printf("\nEntre com a parte imaginaria do primeiro numero => ");
scanf ("%f",&Numero2.imaginario);
/* Soma dos complexos */
Resultado.real = Numero1.real + Numero2.real;
Resultado.imaginario = Numero1.imaginario + Numero2.imaginario;
/* imprimir resultado */
printf("Resultado da soma - Parte real = %f\n",Resultado.real);
printf("Resultado da soma - Parte imaginaria = %f\n",Resultado.imaginario);
}
PROPOSTA 2 - COM FUNÇÔES ADICIONAIS -
NOTA1: As estruturas são passadas por valor (cópias). O mais eficiente seria passar por referência (endereços). Infelizmente não tivemos tempo de ver.
NOTA2: Fazer a função de multiplicação indicada!
#include <stdio.h>
struct TComplexo {
float real;
float imaginario;
};
struct TComplexo SomarComplexos(struct TComplexo a, struct TComplexo b)
{
struct TComplexo Resultado;
Resultado.real = a.real + b.real;
Resultado.imaginario = a.imaginario + b.imaginario;
return Resultado;
}
struct TComplexo MultiplicarComplexos(struct TComplexo a, struct TComplexo b)
{
}
main()
{
struct TComplexo Numero1,Numero2,Resultado;
/* Entrada de dados */
printf("\nEntre com a parte real do primeiro numero => ");
scanf ("%f",&Numero1.real);
printf("\nEntre com a parte imaginaria do primeiro numero => ");
scanf ("%f",&Numero1.imaginario);
printf("\nEntre com a parte real do primeiro numero => ");
scanf ("%f",&Numero2.real);
printf("\nEntre com a parte imaginaria do primeiro numero => ");
scanf ("%f",&Numero2.imaginario);
/* Soma dos complexos */
//Resultado.real = Numero1.real + Numero2.real;
//Resultado.imaginario = Numero1.imaginario + Numero2.imaginario;
/* imprimir resultado */
Resultado = SomarComplexos(Numero1,Numero2);
printf("Resultado da soma - Parte real = %f\n",Resultado.real);
printf("Resultado da soma - Parte imaginaria = %f\n",Resultado.imaginario);
}
5) Fazer um programa para ler um vetor de inteiros não negativos (um negativo é o final da leitura) e copiar o vetor para outro vetor chamador vetor_crescente. Colocar este vetor_crescente na forma ordenada crescente. Imprimir os dois vetores.
PROPOSTA DE SOLUÇÂO
#include <stdio.h>
void imprimirVetor(int vetor[], int tamanho)
{
int i;
for (i=0;i<tamanho;i++) {
printf("\nElemento[%d] = %d",i,vetor[i]);
}
}
void ordenarMetodoInsertion(int vetor[], int tamanho)
{
int i,j,aux;
for (i=1;i< tamanho;i++) {
for (j=i;j>0 && vetor[j] < vetor[j-1];j--) {
aux=vetor[j-1];
vetor[j-1]=vetor[j];
vetor[j]=aux;
}
}
}
void main()
{
int vetor_lido[50],vetor_ordenado[50];
int i,auxiliar,tamanho_vetor;
/* Ler vetor */
i = 0;
auxiliar = 0;
do {
printf("\nElemento[%d] = ",i);
scanf("%d",&auxiliar);
if (auxiliar < 0)
break;
else
vetor_lido[i++] = auxiliar;
} while(1);
tamanho_vetor = i;
/* copiar o vetor para vetor ordenado */
for (i=0;i<tamanho_vetor;i++) {
vetor_ordenado[i]=vetor_lido[i];
}
/* ordenar vetor */
ordenarMetodoInsertion(vetor_ordenado,tamanho_vetor);
/* imprimir vetor nao ordenado */
printf("\nVETOR NAO ORDENADO");
imprimirVetor(vetor_lido,tamanho_vetor);
/* imprimir vetor ordenado */
printf("\nVETOR ORDENADO");
imprimirVetor(vetor_ordenado,tamanho_vetor);
printf("\nFinal do Programa\n");
}
6) Fazer um programa que define dois vetores de tamanho 50: um vetor de char e um vetor de inteiros. Imprimir os endereços das posições 0,1 e 2 de cada vetor no formato hexadecimal. Olhando os resultados
é possível inferir o tamanho de um char e de um int?
6/07: PROVA FINAL
Considerações sobre as questões da prova:
1) Será uma modificação do exercício 2 da prova do Tiago, envolvendo restrições no uso de caracteres (uso do switch) e de tamanho de senhas;
2) Será parecida com o exercício de calcular a média dos elementos de vetores quando foi retirado o menor e o maior número (uma outra restrição também pode ser considerada);
3) Envolverá structs, números complexos e possivelmente alguma coisa envolvendo soma, multiplicação ou conversão para a forma polar;
4) Questão "surpresa" onde será dado um programa e o aluno deverá escrever as saídas do programa.
Soluções:
Questão 1
#include <stdio.h>
#include <string.h>
char senha[50]="844136"; /* variavel global com senha atual */
void verificar_senha_atual()
{
char cadeia[50];
int retorno;
do {
printf("Entre com a senha atual\n");
scanf("%s",cadeia);
retorno = strcmp(senha,cadeia); /* strcmp retorna 0 se cadeias iguais */
if (retorno == 0)
break;
else
printf("Senha atual incorreta - tente novamente\n");
} while(1);
}
int verificar_regras(char vetor[])
{
int i;
int ret=1; /* variavel de apoio para retorno - se cadeia nao conforme ela vai a 0 */
if (strlen(vetor)==6){
for (i=0;i<6;i++) {
if (vetor[i]<'0' || vetor[i]>'9') { /* '0' equivale a 0x30 e '9' a 0x39 */
ret=0;
printf("senha com caracter nao numerico\n");
break; /* nao vale a pena continuar...*/
}
}
}else {
printf("tamanho inválido\n");
ret=0;
}
return ret;
}
void ler_nova_senha()
{
int retorno;
do {
printf("Entre com a nova senha\n");
scanf("%s",senha);
retorno = verificar_regras(senha); /* verifica conformidade com regras */
if (retorno == 1)
break;
else
printf("Senha nao conforme com as regras\n");
} while(1);
}
void main()
{
verificar_senha_atual(); /*fica eternamente esperando pela senha atual*/
ler_nova_senha(); /* fica eternamente esperando uma nova senha valida*/
}
Questão 2
#include "stdio.h"
float computar_media_maior_menor(float vetor[],int tamanho)
{
float media,maior,menor;
int i;
maior = vetor[0];
menor = vetor[0];
for (i=0;i<tamanho;i++) { /* i poderia começar em 1 se tamanho maior que 1 */
if (maior<vetor[i])
maior=vetor[i];
if (menor>vetor[i])
menor=vetor[i];
}
media = (maior+menor)/2;
return media;
}
/* programa principal somente para fins de teste - nao faz parte da solucao */
main()
{
float vetor_de_dados[50]={1.,4.,3.};
printf ("media = %f\n", computar_media_maior_menor(vetor_de_dados, 3));
}
Questão 3
OBS 1: A entrada de ângulo é em radianos - como seria para entrar em graus???
OBS 2: Para linkar com a biblioteca matematica fazer: gcc -lm prog.c -o prog
#include <stdio.h>
#include <math.h>
/* Estrutura representando numero complexo
em coordenada polar */
struct TComplexoPolar{
float r; /* raio */
float theta; /* angulo */
};
/* Estrutura representando numero complexo
em coordenada retangular */
struct TComplexoRetangular{
float x;
float y;
};
main ()
{
struct TComplexoPolar numPolar;
struct TComplexoRetangular numRet;
/* entrada de dados */
printf("Entre com o raio\n");
scanf("%f",&numPolar.r);
printf("Entre com o angulo (em radianos)\n");
scanf("%f",&numPolar.theta);
/* converter */
numRet.x = numPolar.r * cos(numPolar.theta);
numRet.y = numPolar.r * sin(numPolar.theta);
/* imprimir */
printf ("Complexo em Polar\n");
printf("raio = %f\n", numPolar.r);
printf("angulo = %f\n", numPolar.theta);
printf ("Complexo em Retangular\n");
printf("REAL = %f\n", numRet.x);
printf("IMAGINARIO = %f\n", numRet.y);
}
Questão 4
alfa = 1
beta= 14
gama= 2
delta= 5