PRG-2011

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar

Nome do Professor: Eraldo Silveira e Silva

email: eraldo@ifsc.edu.br

Material de Referência

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

7/07: RECUPERAÇÃO