PRG-2011-2

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

Horário de Atendimento Paralelo

Quarta das 16 às 17h.

Aulas

3/08/2011:

Objetivos da Aula

-apresentar plano de ensino;

-conceitos básicos de programação e algoritmos (até pg 10 da apostila)

-apresentar o básico do fluxograma para ler 3 números e fazer a média;

5/08/2011:

1.Considere um algoritmo para calcular o comprimento de uma circunferência. Quem são os dados de entrada e os dados de saída. Fazer um fluxograma para resolver o problema.

2.Modifique o algoritmo acima para calcular, além do comprimento, a área da circunferência.

3.Construir um fluxograma para ler 3 números e calcular a média dos dois maiores números lidos.

4.Refazer o exercício 3 para calcular a média do maior e do menor número entre os 3 lidos.

10/08/2011

Objetivos

-Trabalhar estruturas de decisão e repetição simples

Exercícios

  1. Escreva um programa que leia N números e calcule a média deles;
  2. Retrabalhar o exercício 4 da aula anterior para deixá-lo genérico: média entre o maior e o menor de n n números. Supor que n é o primeiro núumero lido.

Solução 1: Usando um loop estilo GOTO

12/08/2011

Troca das turmas

-Trabalhar estruturas de decisão e repetição simples

Exercícios

  1. Você trabalha na Airbus e deve construir programa que lê as informações do manche quando ele é empurrado ou puxado (é um airbus antigo, os novos tem joystick) e gera um alarme quando o ângulo de arfagem é maior ou menor que 45 graus. O comando de leitura é LerProfundor(variavel). Ver http://pt.wikipedia.org/wiki/Profundor
  2. Um estudo sobre sensibilidade de pessoas a temperaturas da água identificou que a maioria das pessoas considera fria a água com temperaturas abaixo de 25 graus, morna entre 25 e 30 graus, e quente acima de 30 graus. Escreva um algoritmo que mostre as palavras "fria", "morna" ou "quente" dependendo da temperatura da água que for informada.
  3. Faça um algoritmo para fazer a divisão de dois números reais. Antes de dividi-los deve ser feito um teste de validade. Caso não seja possível dividi-los, deve ser mostrada uma mensagem de erro. Se for possível, deve-se mostrar o resultado da divisão.
  4. Escreva um programa que leia cinco números do teclado e mostre os dois maiores números.

17/08/2011

19/08/2011

24/08/2011

Avaliação surpresa.

26/08/2011

Não teve aula

31/08/2011

Objetivos

  1. continuar o trabalho com fluxogramas;
  2. tipo cadeia de caracteres;
  3. vetor de caracteres;

Desenvolvimento da Aula

-Apresentação do tipo vetor de caracteres (string);

Um caracter pode ser armazenado em uma "caixa" de memória correspondente a um byte. Basta usar uma codificação adequada, Por exemplo, o uso de código ASCII permite representar a letra A como o byte 41H.

Uma cadeia de caracteres (string) pode ser implementada como uma sequência de caracteres, ou seja, um vetor de caracteres. Para marcar o final da cadeia, muitas linguagens (o C, por exemplo) se utilizada do 0 (NULL) no final da cadeia.

Do ponto de vista de nossas representações em fluxogramas, vamos tratar uma cadeia de caracteres como uma variável única, referenciada por um nome.

Exercícios

1.Elaborar um fluxograma que permite controlar o acionamento de uma porta através de uma senha. Se a senha fornecida pelo usuário corresponde a uma senha previamente armazenada, a porta deve ser aberta. Caso não corresponda, uma mensagem será mostrada indicando que a senha não confere.

2.Incrementar a solução do exercício 1 para um sistema que permite armazenar até 10 senhas diferentes em um vetor de senhas.

3.Incrementar a solução do exercício 2 para um sistema que armazena em uma tabela, o nome de usuários e outra tabela que armazena as senhas. A linha correspondente ao usuário é a mesma linha que corresponde a senha na tabela de senhas.

02/09/2011

Objetivos

  1. continuar o uso de fluxogramas;
  2. apresentar a caixa correspondente ao for (laços controlados);
  3. exercícios combinando vetores de cadeias com vetores de reais e inteiros,
  4. procura por padrões em uma cadeia;

Referência adicional sobre fluxogramas

Fluxogramas

Exercícios

1.Implementar o exercício 3 da aula anterior usando a caixa de laços controlados.

2.Implementar um fluxograma que permite acrescentar senhas no caso do exercício 2 da aula anterior. Suponha que quando for fornecida uma senha de valor "1234", o sistema desvia o fluxo para entrada de nova senha. Uma senha somente pode ser inserida se existir espaço livre na tabela. Espaços livres contem senhas vazias do tipo "".

3.Considere que uma cadeia de caracteres já está armazenada em vetor X. Esta cadeia é terminada em NULL. Elabore um fluxograma que permita ler um caracter do mundo externo e contar o número de caracteres existentes na cadeia.

07/09/2011

Feriado

09/09/2011

Objetivos

  1. Revisão Geral: tipos de dados (inteiro,real,caracteres, vetores, strings); constantes e variáveis; expressões;estruturas de controle: decisão e controle;
  2. Teste relâmpago;
  3. Apresentação do Portugol: tipos de dados, definição de variáveis, entrada e saída de dados, estrutura de decisão SE.

Teste relâmpago

Portugol (extraído da página do Prof.Marcelo Sobral e Tiago Semprebom)

As aulas de Lógica de Programação usarão um software de auxílio ao ensino de algoritmos chamado Portugol, desenvolvido na Escola Superior de Engenharia do Instituto Politécnico de Tomar, em Portugal.

Guia rápido de instalação e utilização do Portugol

Abaixo segue uma breve ajuda de como obtê-lo, instalá-lo e usá-lo. Esse guia assume que você esteja usando o Ubuntu Linux 9.04 ou superior.

  1. Faça o download do Portugol.
  2. Descompacte-o com o seguinte comando:
    tar xzf portugol23.tar.gz
    
  3. Repare que existe agora um subdiretório portugol no diretório onde você o descompactou. Execute o Portugol com o seguinte comando:
    java -jar portugol/Portugol.jar
    
    Obs: você precisará ter Java instalado. Caso não o tenha, execute o comando:
    sudo apt-get install openjdk-6-jre
    
  4. Copie esse arquivo para poder ver fluxogramas coloridos, e grave-o no memso diretório onde está o Portugol.
  5. Veja a ajuda do Portugol, e use-a sempre que tiver dúvidas !


A tela inicial do Portugol segue abaixo, junto com um programa demonstrativo.

Editor-Portugol.png

Exemplos de programas iniciais em Portugol:

  1. Lendo um número e mostrando-o na tela em seguida:
    Inicio
      inteiro x
    
      Escrever "Digite um numero: ",
      Ler X
      Escrever "Numero digitado: ", x
    Fim
    
  2. Lendo dois números, somando-os e mostrando o resultado na tela:
    Inicio
      inteiro x, y
    
      Escrever "Digite um numero: ",
      Ler x
      Escrever "Digite outro numero: ",
      Ler y
      Escrever "Soma = ", x+y
    Fim
    
    O programa abaixo é equivalente:
    Inicio
      inteiro x, y, z
    
      Escrever "Digite um numero: ",
      Ler x
      Escrever "Digite outro numero: ",
      Ler y
      z <- x + y
      Escrever "Soma = ", z
    Fim
    

Problema base: Entrar com o seu nome e com a sua idade e apresentar um texto dizendo se voce tem mais ou menos que vinte anos.

Tipos de Dados e definição de varáveis e constantes

Ver:

Estrutura de Decisão SE

Ver:

Exercícios

1.Fazer em Portugol um programa para calcular a área de um círculo. Definir o PI como constante.

2.Refazer o exercício anterior com a opção de calcular a área ou a circunferência.

14/09/2011

OBJETIVOS

  1. Estruturas de Repetição: ENQUANTO, PARA, REPETE, FAZ ENQUANTO
  2. Tipos de Dados Básicos;
  3. Tipos Estruturados (arrays)

Estrutura ENQUANTO

inicio
    inteiro contador
    contador <- 0
    enquanto contador < 10 faz
        escrever contador , "\t"
        contador <- contador + 1
    fimenquanto
fim

Estrutura PARA

inicio
    inteiro contador
    para contador de 0 ate 9 passo 1
        escrever contador , "\t"
    proximo
fim

Estrutura REPETE

inicio
    inteiro mes
    repete
        escrever "introduza um mes :"
        ler mes
    ate mes > 0 e mes < 13
    escrever "\nmes introduzido :" , mes
fim

Estrutura FAZ ENQUANTO

inicio
    inteiro mes
    faz
        escrever "introduza um mes :"
        ler mes
    enquanto mes < 0 ou mes > 13
    escrever "\nmes introduzido :" , mes
fim


Tipos de Dados Básicos

ver página de ajuda do Portugol

Tipos de Dados Estruturados

ver página de ajuda do Portugol

Exercícios

  1. Ler um vetor de 10 reais e calcular a média dos elementos do vetor. Faça um fluxograma de apoio.
inicio
     constante inteiro TAM_MAX_VETOR <- 10
     real vetor_x[TAM_MAX_VETOR], media,soma
     inteiro i
     
     // Leitura dos dados para o vetor
     para i de 0 ate TAM_MAX_VETOR-1 passo 1
         escrever "Entre com vetor_x[", i, "]\n"
         ler vetor_x[i]
     proximo
     
     //Totalização da soma dos elementos
     soma <- 0
     para i de 0 ate TAM_MAX_VETOR-1 passo 1
         soma <- soma + vetor_x[i]
     proximo    
     
     //Calculo da media
     media <- soma/10
     escrever "\nmedia=", media  
  
fim
  1. Ler um vetor de N reais e calcular a média dos elementos do vetor. Defina um vetor de um certo tamanho. Leia inicialmente o número N. Teste N em relação ao tamanho definido. Faça um fluxograma de apoio.
  2. Ler um vetor de N reais e calcular a média entre o maior e o menor. Faça um fluxograma de apoio.

16/09/2011

OBJETIVOS DA AULA

Avaliação Básica de Portugol

Problemas base para a avaliação de amanhã

OBS: Note que além de ser avaliado o programa, também será avaliada a desenvoltura do aluno em executar passo-a-passo o programa, explicando as instruções.

1.Fazer um programa para ler 2 números reais em variáveis chamadas alfa e beta. No caso de elas apresentarem valores iguais, o programa deve imprimir a mensagem:

"As variáveis possuem valores iguais"

caso contrário a mensagem a ser impressa é:

"A variável <nome_variavel> possui o maior número"

2.Fazer um programa para ler um número inteiro para uma variável. Se o número for positivo, o programa deverá então imprimir todos os números inteiros entre 0 e o valor da variável. Caso contrário deverá apresentar a mensagem "Número negativo" e o programa se encerra. Exemplo: suponha que o usuário entre com o número 5, então a saída do programa é:

0 1 2 3 4 5

Se o usuário fornecer -3, então a saída é simplesmente a mensagem "Número negativo". Se o número for 0 a mensagem deve ser "ZERO!"

21/09/2011

OBJETIVOS

  1. Arrays no Portugol
  2. Exercícios

Arrays no Portugol

Exercícios

1-Implementar em Portugol, o algoritmo já implementado para abrir uma porta dado uma senha.

inicio
    variavel texto senha_armazenada <- "Inter"
    variavel texto senha_lida
    enquanto 1 = 1 faz
        ler senha_lida
        se senha_lida = senha_armazenada entao
            escrever "abrir porta\n"
        senao
            escrever "senha nao confere\n"
        fimse    
    fimenquanto
fim

2-Refazer o exercício para uma tabela com 10 senhas.

inicio
    constante inteiro tam_tabela <- 10
    constante texto tabela_senhas [ tam_tabela ] <- {"Inter" , "Gremio" , "Figueira" , "Avai" , "Coritiba" , "AtleticoPR" , "SaoPaulo" , "Palmeiras" , "Flamengo" , "Vasco"}
    variavel texto senha_lida
    variavel inteiro contador
    enquanto 1 = 1 faz
        contador <- 0
        ler senha_lida
        enquanto ( contador < 10 ) E ( tabela_senhas [ contador ] =/= senha_lida ) faz
            contador <- contador + 1
        fimenquanto
        se contador < 10 entao
            escrever "abrir porta\n"
        senao
            escrever "senha nao conta na lista de senhas\n"
        fimse
    fimenquanto
fim

3-Refazer o exercício para uma tabela de 10 usuários com uma tabela de 10 senhas.

inicio
    constante inteiro tam_tabela <- 10
    constante texto tabela_usuarios[ tam_tabela ] <- {"joao","maria", "jose","lara","vera","lucia","carlos","sofia","lourdes","odilon"}
    constante texto tabela_senhas [ tam_tabela ] <- {"Inter" , "Gremio" , "Figueira" , "Avai" , "Coritiba" , "AtleticoPR" , "SaoPaulo" , "Palmeiras" , "Flamengo" , "Vasco"}
    variavel texto senha_lida, usuario
    variavel inteiro contador
    enquanto 1 = 1 faz
        contador <- 0
        ler usuario
        enquanto ( contador < tam_tabela ) E ( tabela_usuarios [ contador ] =/= usuario ) faz
            contador <- contador + 1
        fimenquanto
        se contador < tam_tabela entao
            ler senha_lida
            se tabela_senhas[contador] = senha_lida entao
                escrever "abrir porta\n"
            senao
                escrever "Senha nao confere\n"
            fimse
        senao
            escrever "usuario nao conta na lista de senhas\n"
        fimse
    fimenquanto
fim

4-Refazer o exercício para incluir uma opção para incluir senhas. Suponha que quando for fornecido um usuario de valor "1234", o sistema desvia o fluxo para entrada de novo usuário/senha. Uma senha somente pode ser inserida se existir espaço livre na tabela de usuários. Espaços livres contem senhas vazias do tipo "".

23/09/2011

OBJETIVOS

  1. Arrays Multi dimensionais
  2. Exercícios

Arrays no Portugol

EXERCÍCIOS

1.Elaborar um programa em Portugol para ler duas matrizes de reais, A e B, ambas de dimensão MxN e calcular a uma matriz C que é a soma destas duas matrizes. Fazer um fluxograma antes de implementar.

inicio

   constante inteiro M<-5,N<-6
   variavel real A[M][N]
   variavel inteiro i,j
   para i de 0 ate M-1 passo 1
       para j de 0 ate N-1 passo 1
           escrever "\nA[",i,"]","[",j,"] = "
           ler A[i][j]
       proximo
   proximo

fim


2.Elaborar um programa para ler duas matrizes de reais, A e B, de dimensões MxN e NxP e então calcular a matriz C que é a multiplicação das duas. Lembrar que

26/09/2011

Adiantado do dia 30/09.

OBJETIVOS

Exercícios gerais sobre portugol.

EXERCÌCIOS

1.Implementar um programa em portugol que permita armazenar as notas de 4 avaliações de uma turma com 15 alunos. Defina uma tabela (array com duas dimensões) que permita realizar este armazenamento. Suponha que cada aluno é identificado por um número inteiro. O programa inicia solicitando as notas para o primeiro aluno e segue até o último.

2.Incrementar o programa anterior para inserir um menu que permite inserir as notas de um usuário especificamente ou de toda a turma.

3.Melhorar a proposta para incluir no menu uma opção de listar as notas de toda turma ou de um aluno especificamente.

4.Incluir uma opção para calcular a média de um aluno

5.Incluir uma opção para calcular a média de toda a turma por avaliação.

6.Incluir uma opção para calcular a média de toda a turma em todas as avaliações

28/09/2011

NÂO HOUVE AULA. Encaminhamentos doutorado.

30/09/2011

NÃO HOUVE AULA. Aula dada em 26/09

05/10/2011

OBJETIVOS

  1. Introdução a linguagem C
  2. Aula 1 e 2 do Curso UFMG
  3. Representação de funções/subpramas no fluxograma

Ferramentas GNU

Compilando um programa:

 gcc teste.c -o teste

Compilando para depuração

 gcc teste.c -g -o teste

EXERCÍCIOS

07/10/2011

OBJETIVOS

  1. Introdução a linguagem C
  2. Aula 2 do Curso UFMG: Introdução Básica às Entradas e Saídas, Introdução a Alguns Comandos de Controle de Fluxo

Observações

Explicar strings NULL terminated com detalhes;

14/10/2011

Exercícios de Preparação para Avaliação

1.Elaborar um fluxograma de um procedimento para ler N números reais para um vetor e, em seguida, computar a média de todos os números maiores ou iguais a 5. A média deve ser impressa. Mostrar na memória, as variáveis utilizadas.

2.Elaborar um fluxograma de um procedimento para ler o comprimento de dois catetos de um triângulo retângulo. O procedimento deve então computar a hipotenusa. Assuma que existe uma função SQRT que retorna a raiz quadrada de um número. Exemplo: Y=SQRT(4) faz com que Y assuma o valor 2.

3.Elaborar um fluxograma de um procedimento para ler um número inteiro para uma variável. Se o número for positivo, o programa deverá então imprimir todos os números inteiros entre 0 e o valor da variável.

4.Suponha que em um sistema de registro escolar JÁ existem duas tabelas disponíveis. Uma primeira chamada ALUNOS é um vetor de cadeias de caracteres com 15 alunos já registrados. Uma outra tabela chamada NOTAS é uma matriz onde a linha corresponde a um aluno e cujas colunas em número de 4 são as notas bimestrais já atualizadas. Uma mesma linha na tabela ALUNOS e na tabela NOTAS corresponde ao mesmo aluno. Elabore um fluxograma para imprimir a as notas bimestrais de um aluno específico e a média destes quatros bimestres. Note que a primeira ação a ser realizada é ler o nome do aluno. Na sequência, deve ser determinada a linha correspondente a este aluno na tabela ALUNOS. Com este índice (linha), pode-se acessar a tabela NOTAS.

AVALIAÇÂO

19/10/2011

  1. Introdução a linguagem C
  2. Aula 2 do Curso UFMG: comandos if e for
  3. Aula 3: Tipos do C, Variáveis, Operadores Aritméticos e de Atribuição, Operadores Lógicos.

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) Fazer uma função para implementar o exercício (1), retornando o tamanho (tipo inteiro). Chamar a função de str_len;


21/10/2011

OBJETIVOS

  1. Introdução a linguagem C
  2. Exercícios
  3. Aula 3: Tipos do C, Variáveis, Operadores Aritméticos e de Atribuição, Operadores Lógicos.

EXERCÍCIOS

1) Fazer um programa para ler duas cadeias de caracteres (strings) e dizer qual delas possui mais caracter que a outra.

#include <stdio.h>
 
int str_len (char alfa[]) 
{
   int i;
   for (i=0;alfa[i]!=0;i++)
	;
   return i;
 
}

void main()
{
  char vetor1[50];
  char vetor2[50];
  int tam1,tam2;

  /* Entrada das strings */
  printf ("Entre com a cadeia: ");
  scanf("%s",vetor1);
  printf ("Entre com a cadeia: ");
  scanf("%s",vetor2);

  /* Computação do tamanho das strings */
  tam1 = str_len(vetor1);
  tam2 = str_len(vetor2);

  /* Comparação do tamanho das strings */
  if (tam1 > tam2) {
     printf ("\nString 1 maior que String2\n");
  } else {
     printf ("\nString 1 menor OU igual ao tamanho de String2\n");
  }
}

2) Modificar o exercício anterior implementando uma função de apoio str_len_cmp para comparar o tamanho de duas strings. A função retorna 1 se as strings tiverem o mesmo tamanho e 0 caso contrário.

#include <stdio.h>
 
int str_len (char alfa[]) 
{
   int i;
   for (i=0;alfa[i]!=0;i++)
	;
   return i;
 
}

int str_len_cmp(char cadeia1[], char cadeia2[])
{
}

void main()
{
  char vetor1[50];
  char vetor2[50];
  int tam1,tam2;

  /* Entrada das strings */
  printf ("Entre com a cadeia: ");
  scanf("%s",vetor1);
  printf ("Entre com a cadeia: ");
  scanf("%s",vetor2);
  if (str_len_cmp(vetor1,vetor2) == 0) {
     printf ("Cadeias iguais\n");
  } else {
     printf ("Cadeias diferentes\n");
  }
}

3) Implementar uma função chamada str_cmp para comparar duas strings. A função retorna 1 se as cadeias forem iguais e retorna 0 se forrem diferentes.

26/10/2011

OBJETIVOS

  1. Aprofundar tipos, variáveis, expressões no C;
  2. Aula 3 da UFMG: Tipos do C, Variáveis, Operadores Aritméticos e de Atribuição, Operadores Lógicos.

04/11/2011

OBJETIVOS

  1. Entregar e corrigir avaliação 1
  2. Converter fluxogramas em programa C (3 primeiros da avaliação);
  3. Continuar aula Aula da UFMG: Tipos do C, Variáveis, Operadores Aritméticos e de Atribuição, Operadores Lógicos.

FLUXOGRAMAS DA AVALIAÇÃO

Solução ex1 da avaliação usando caixa de repetição

Flux1 aval1.png

Solução ex2 da avaliação usando caixa de repetição

Flux2 aval2.png


Exercícios

  1. Implementar o ex1 da avaliação na forma de um programa em C. Sol:
    #include <stdio.h>
    
    #define N 3
    
    void main()
    {
      float y[N],media;
      float x, soma;
      int i, cont;
    
      printf ("Entre com x: ");
      scanf("%f",&x);
      for(i=0;i<N;i++) {
           printf ("\nEntre com y[%d]: ", i);
           scanf("%f", &y[i]);	
      }
      soma = 0;
      cont = 0;
      for(i=0;i<N;i++) {
           if (y[i]<x) {
    	  soma=soma+y[i];
              cont = cont + 1;
           }
      }
      if (cont) {
        media = soma/cont;
        printf ("media = %f", media);
      } else {
        printf ("Não existem itens menores que 0");    
      }
    }
    
  2. Implementar o ex2 da avaliação na forma de um programa em C.
  3. Refazer o fluxograma do ex1 usando caixa de decisão simples.
  4. Refazer o fluxograma do ex2 usando caixa de decisão simples.

09/11/2011

OBJETIVOS

  1. Finalizar aula 3 UFMG;
  2. Apresentar a aula 4 UFMG.

Exercícios

  1. Fazer um fluxograma para o código C abaixo. Use as expressões em C nas caixas.
    #include <stdio.h>
    main ()
    {
      int x,y;
      scanf ("%d",&x);
      if (x==1) {
         x=x+2;
         y=x++;
      } else if ( x > 90) {
         y = x * 2;
      } else if (x < -80) {
         y = --x;
         if ( x*2 == 4) {
            y--;
         } else {
            y++;
         }
         y = y%2;
      }else {
         y = x * 5;
      }
      printf("\ny=%d",y);
    }
    
  2. Implemente o programa anterior e teste as saídas para os valores de x=2,95,-81 e 1.
  3. Fazer um fluxograma para o código C abaixo. Use as expressões em C nas caixas.
    #include <stdio.h>
    main ()
    {
      int x,y;
      scanf ("%d",&x);
      y=(x>5)?x*5:(3*x+2);
    }
    
  4. Escreva um programa que pede para o usuário entrar um número correspondente a um dia da semana e que então apresente na tela o nome do dia. utilizando o comando switch. (extraído da aula 4 UFMG.
  5. Represente o programa anterior na forma de um fluxograma.
  6. Faça um programa usando o comando for para inverter uma string: inicialmente ele le uma string com scanf e, em seguida, armazena invertida em outra string. Use o comando for para varrer a string até o seu final.
  7. Repita o exercício anterior utilizando o comando while.
  8. Repita o exercício anterior utilizando o comando do while. Qual a dificuldade encontrada?
  9. Usando o comando do while implemente um jogo de adivinhação que pergunta para você entrar com um número de 1 a 10. O programa escolhe randomicamente um número inteiro nesta faixa e diz se você acertou ou errou. Se você entrar com um número negativo o programa se encerra, mostrando o número de jogadas realizadas e o número de acertos. Usa a função rand() da forma x = rand() % 10 + 1 para computar um número inteiro x entre 1 e 10. Para usar a função rand() fazer include de stdlib.h

LINK PARA O EDITOR YED

Se baixar o zip com o java, descompactar, entrar no diretório e executar com:

 java -jar yed.jar

11/11/2011

OBJETIVOS

  1. Apresentar a aula 5 UFMG.

Exercício

16/11/2011

OBJETIVOS

  1. Finalizar a aula 5 UFMG.
  2. Exercícios sobre matrizes.

EXERCÍCIOS

  1. Fazer um fluxograma e descobrir o que o programa abaixo faz.
    #include <stdio.h>
    #include <string.h>
    int main ()
    {
       char s[]="Instituto Federal de SC";
       int c, i, j;
       for (i=0, j=strlen(s)-1; i<j; i++, j--)
       {
           c = s[i];
           s[i] = s[j];
           s[j] = c;
       }
       return 0;
    }
    
  2. Implementar um programa em C para ler duas matrizes de inteiros de dimensão 2x2 e, na sequência, computar a soma das duas, colocando o resultado em uma terceira matriz.
  3. Implementar um programa em C que define duas matrizes (matA e matB) e as inicializa na definição. A primeira de dimensão 3x2 e a segunda de dimensão 2x3. Na sequência deve ser computada uma matriz matC que é a multiplicação de matA e matB.
  4. Implementar um programa para controlar o acionamento de uma porta através de uma senha. Se a senha fornecida pelo usuário corresponde a uma senha previamente armazenada, a porta deve ser aberta. Caso não corresponda, uma mensagem será mostrada indicando que a senha não confere. Substitua a entrada de senha por scanf e o acionamento por um printf. Considere a senha pré-definida.
  5. Melhorar a soluçaõ para um sistema que permite armazenar até 10 senhas diferentes em um vetor de senhas.
  6. Melhorar a solução para um sistema que armazena em uma tabela, o nome de usuários e outra tabela que armazena as senhas. A linha correspondente ao usuário é a mesma linha que corresponde a senha na tabela de senhas.

18/11/2011

OBJETIVOS

  1. Ponteiros (aula 6 UFMG)

Anotação de sala: problema que pode ocorrer no uso de ponteiros para áreas de memória não mais alocadas para o processo.

Aula1 1.jpeg

23/11/2011

Exercícios

  1. Implementar a função strlen usando ponteiro para caracter;
  2. Implementar a função strcmp usando ponteiro para caracter;
  3. Implementar uma função que recebe como parâmetros um ponteiro para float e o número de floats. A função retorna a média dos números;
    float media_floats(float *pVetor, int num_floats);
    
  4. Implementar uma função para zerar uma área de memória. Use o seguinte protótipo como referência:
    void zerar_mem (char *pInicio, int tamanho_area)#Implementar uma função que retorna 1 se existe a ocorrência de um determinado caracter na memória e 0 caso não exista. Use o seguinte protótipo como referência:<syntaxhighlight lang=c>
    int detector_caracter (char *pInicio, int tam_area, char caracter)
    
  5. Modifique a função para que ela retorne o número de caracteres encontrados;

25/11/2011

  1. Avaliação
  1. Construa um fluxograma para o seguinte código:
main()
{
  int i,x;
  x=1;
  for (i=2;i<10;i=i+1)
       x=y++;
}
  1. Construa um fluxograma para o seguinte código
main()
{
  int y,x;
  
  scanf ("%d", &x);
  switch (x) {
   case 1:
         y=x;
         y++;
         if (y>10) {
            x++;
         }
         break;
   case 2:
         y=2*x;
         break;
   default:
         y=1;
   } 
   if (x++ < 1)
       y=y+2;
}
  1. Construir um fluxograma para o código:
main()
{
  int i,j,k,w;

  for (i=10,j=2;j<6 && i>4;j++,i--) {
       if (i>6) {
           x=--i;
       } else {
           x=i++;
           y=2*x;
           do {
              k++;
              w=k;
           } while (k<10);
       }
  }
}

30/12/2011

OBJETIVOS

Apresentar o projeto final: Batalha Naval versão simplificada

Metodologia de Desenvolvimento

Existem várias metodologias para o desenvolvimento de software. Neste trabalho usaremos um método bastante convencional que é o modelo cachoeira ou waterfall model:

A Especificação do Sistema

Neste ponto descrevemos O QUE o sistema deve fazer sem se preocupar em COMO vai fazer. Vamos fazer esta especificação de forma textual:

O projeto visa desenvolver um software que permite a um usuário jogar contra o computar o famoso jogo de batalha naval. Por questões de simplicidade, o jogo será simplificado nesta primeira versão.

Ao ser colocado em execução, o software inicialmente apresenta um tabuleiro de 20x20 casas vazias. A interface utilizada é em modo texto. Cada linha e coluna são rotuladas com seus números. Ao lado do tabuleiro é indicado o número de navios afundados. o total de navios da frota e o número de tiros realizados. Cada navio ocupará exatamente uma casa (linha,coluna) e o total de navios colocados são 10. A posição dos navios é determinada pelo software de forma fixa no início do jogo.

Abaixo do tabuleiro é solicitado que o o usuário entre com o tiro da seguinte forma: inicialmente a linha é perguntada e depois a coluna. Se o tiro for sobre um navio já apontado, o tiro é invalidado e a pergunta é novamente realizada. O mesmo comportamento se aplica se o tiro for fora do tabuleiro. Caso o tiro seja sobre uma casa onde não exista navio então a casa aparece visualmente com um 'o'. Caso a o tiro acerte um navio a casa deve visualmente aparecer com um 'x'. Ao final de cada tiro a tela deve ser atualizada. Se ao final de um tiro não houver mais navios então uma mensagem de FROTA afundada com \<num\> tiros. Entre com qualquer tecla para encerrar.

O Projeto

Não vamos nos aprofundar em uma metodologia de projeto. Vamos tentar focar inicialmente em duas modelagens: de dados e da estrutura do código.

Modelagem de Dados

Vamos tentar enumerar e definir as principais estruturas de dados que serão manipuladas pelo programa. Na prática, as variáveis. A primeira vista precisaríamos:

  1. uma estrutura que represente o tabuleiro. Poderia ser uma matriz de 20x20 de inteiros. Se um elemento tiver 0 significa uma casa sem navio e ainda não selecionada para o tiro. Se tiver o valor 1 é uma casa com um navio ainda não selecionado para tiro. Caso uma casa seja selecionada para tiro pode-se representar o elemento da matriz somado com um determinado valor. Por exemplo 10. Neste caso, se uma casa possuir o valor 10 significa uma casa sem navio que já foi selecionada para tiro. Se a casa possuir valor 11 então significa que é um casa com navio já selecionada por um tiro. NOTA: observe que o fato de concebermos uma estrutura de dados impacta diretamente nos módulos (código) a serem implementados.
  2. uma variável simples do tipo inteiro que represente o número de tiros já realizados. Ela deve ser iniciada com 0.
  3. uma variável simples do tipo inteiro que represente o número de navios ainda não afundados. Ela deve ser iniciada com o valor 10.

PERGUNTA 1: Será que estas duas últimas variáveis são realmente necessárias? Elas poderiam ser dispensadas? Em princípio, a resposta é sim pois tanto o número de tiros dados, como o número de navios ainda não afundados (ou afundados) podem ser determinados a partir do tabuleiro. Mas o bom senso indica que elas são necessárias para facilitar a computação do jogo evitando processamento desncessário de pesquisa no tabuleiro.

PERGUNTA 2: Será que as variáveis acima devem ser globais?

PERGUNTA 3: Existirão outras variáveis necessárias para o jogo? Com certeza sim, mas a importância é localizada. Por exemplo, o armazenamento da posição de um determinado tiro.

Modelagem da Estrutura do Sistema

Neste ponto, em função de uma visão inicial das estruturas de dados, pode-se propor uma primeira estrutura do sistema. Primeiramente, vamos tentar ver se o sistema poderia ser decomposto em alguns subsistemas ou partes ou ainda módulos.

  1. Módulo principal: chama os demais e realiza um controle geral sobre o sistema. Pode ser mapeado na função main;
  2. Módulo de inicialização do sistema. Inicia o tabuleiro e estruturas de dados principais com valores conhecidos.
  3. Módulo de apresentação do estado do tabuleiro e de dados (interface com o usuário).
  4. Módulo de processamento do tiro: verifica se um navio foi acertado e, se for o caso computa os acertos e realiza as devidas marcações.

Caso não exista mais navios retorna um código de finalização para o programa principal.

A implementação

Esqueleto inicial:

#include <stdio.h>

#define NLINHAS 20
#define NCOLUNAS 20
#define FALSE 0
#define TRUE  1
#define NUM_NAVIOS 10

int tabuleiro[NLINHAS][NCOLUNAS];
int tiros;
int navios_afundados;

void iniciar_dados()
{
  tiros=0;
  navios_afundados=0;
  tabuleiro[0][4]=1;
  tabuleiro[3][7]=1;
}

/* testa se o tiro está fora do tabuleiro OU              */
/* se o tiro foi sobre uma casa onde já foi feito um tiro */
/* retorna 1 se tiro válido e 0 se inválido               */ 

int validar_tiro(int linha,int coluna)
{
  
}

void ler_tiro(int *linha, int*coluna)
{
   int fim=FALSE
   while(fim==FALSE) {
     scanf("%d", linha);
     scanf("%d", coluna);
     if (validar_tiro(*linha,*coluna))
        fim=TRUE;
   }
}

void main()
{
  int linha_tiro, coluna_tiro;
  int fim=FALSE;

  iniciar_dados();
  while (fim==FALSE) {
      mostrar_tabuleiro_estatistica();
      ler_tiro(&linha_tiro, &coluna_tiro);
      if (processar_tiro(linha_tiro,coluna_tiro))
          fim=TRUE;
  }  
}

02/12/2011

OBJETIVOS

  1. Estruturas de dados (structs)

EXERCÍCIO DE REFERÊNCIA

#include <math.h>

struct TComplexo {
   float real;
   float imag;
}gamma;

struct TComplexoPolar{
   float modulo;
   float angulo;
};

struct TComplexoPolar convert_ret_pol(struct TComplexo par1)
{
  struct TComplexoPolar res;
  res.modulo = sqrt(par1.real*par1.real + par1.imag*par1.imag);
  res.angulo = atan(par1.real/par1.imag);
  return res;
}

struct TComplexo somar_complexo(struct TComplexo par1, struct TComplexo par2)
{
  struct TComplexo result;
  result.real = par1.real + par2.real;
  result.imag = par1.imag + par2.imag;
  return result;
}


main()
{
   struct TComplexo alfa,beta,delta;
   struct TComplexoPolar epson;
   struct TComplexoPolar *p;
   alfa.real = 5.5;
   alfa.imag = 6.7;
   beta.real = 2.3;
   beta.imag = 4.0;
   /*delta.real = alfa.real + beta.real;*/
   /*delta.imag = alfa.imag + beta.imag;*/
   delta = somar_complexo(alfa,beta);
   epson = convert_ret_pol(delta);
   p = &epson;
   p->angulo = 50.0;
}

EXERCÍCIOS

  1. Implementar uma função para converter do formato retangular para polar;
  2. Implementar uma função para multiplicar dois números complexos no formato polar;
  3. Implementar uma função para somar dois números complexos no formato retangular usando ponteiros como parâmetros.

07/12/2011

OBJETIVOS

  1. Alocação dinâmica de memória;
  2. Finalizar etapa 1 do trabalho.

09/12/2011

OBJETIVOS

  1. Finalizar etapa 1 do trabalho
  2. Iniciar etapa 2

ADENDOS PARA ETAPA 2

  1. Colocação automática e aleátória de peças;
  2. 3 tipos de navios
  3. super torpedo (1 disponível acertando 4 casas em cruz em torno do

tiro. Somente o tiro central deve ser considerado para fins de validação).

14/12/2011

16/12/2011

Recuperação

20/12/2001

Prova de Recuperação - Exercícios de Base

  1. Elaborar um fluxograma para o código abaixo e computar o valor de x e y :
    void main()
    {
     int x,y,i;
     x = 1;
     y = 2;
     for(i=0;i<3;i++) {
        if (i==2) {
           x = y+x;
           y = 5;
        } else {
           y++;
        }
     }
    }
    
  2. Computar o valor de w e y para o código abaixo, no momento da execução do printf:
    int alfa(int x)
    {
      return (x+1);
    }
    void main()
    {
      int x,w;
      x = 0;
      y = 1;
      while (x<2) {
          x = alfa(x);
          w = x*2;
          if (w>3) {
             y = 4;
          else {
             y = 5;
          }
      }
      print ("FIM");
    }
    
  3. Elaborar um fluxograma para o código abaixo:
    void main()
    {
      int x,y;
      scanf ("%d",&x);
      y = 1;
      switch (x) {
      case 1: y=2;
              break;
      case 2: y = 3;
      case 3: x = x + y;
              break;
      default : y = 5 * x;
                if (y==5) 
                    x = 7;
                break;  
      }
    }