Procurando algo?

quinta-feira, 28 de outubro de 2010

O Jantar dos Filósofos

Tenho aprendido muita coisa na faculdade. Estou no 3º semestre de Análise e Desenvolvimento de Sistemas na FATEC, e na disciplina de Sistemas Operacionais o professor, que é tarado por Java, propôs que resolvêssemos o clássico problema dos filósofos jantando (criado por Dijkstra) em Java. (óbvio)

Eis minha implementação inicial:

Classe principal (Jantar)
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.util.concurrent.Semaphore;

import javax.swing.*;

public class Jantar {
public static int maxComendo, comendo;
public static JLabel lblMaxn;
public static int nFil;
public static Semaphore mutex;
public static Filosofo[] filosofos;

public static void main(String[] args) {
maxComendo = comendo = 0;

nFil = Integer.parseInt(JOptionPane.showInputDialog(null, 
"Quantos filósofos vão jantar?", 
"Quantidade de filósofos", 
JOptionPane.QUESTION_MESSAGE));
System.out.println("Quantidade de filósofos: " + nFil);

JFrame mesa = new JFrame("Mesa de jantar");

mutex = new Semaphore(1);
filosofos = new Filosofo[nFil];

JPanel info = new JPanel();
info.add(new JLabel("Filósofos: " + nFil + "    "));
JLabel lblMaxtxt = new JLabel("Máximo Comendo: "); 
lblMaxn = new JLabel("0");
info.add(lblMaxtxt);
info.add(lblMaxn);
mesa.add(info, BorderLayout.NORTH);

popularMesa(mesa,filosofos);
mesa.setVisible(true);

for (int i = 0; i < filosofos.length; i++) {
   filosofos[i].start();
  }
 }

 private static void popularMesa(JFrame mesa, Filosofo[] filosofos) { 
  JPanel painel = new JPanel();
  painel.setLayout(
    new GridLayout(
      (int)Math.ceil(Math.sqrt(nFil)), 
      (int)Math.ceil(Math.sqrt(nFil))));
  
  for (int i = 0; i < nFil; i++) {
   System.out.println("Adicionando filósofo " + (i+1) + " à mesa.");
   filosofos[i] = new Filosofo();
   filosofos[i].setNumero(i);
   painel.add(filosofos[i].label);
  }
  
  mesa.add(painel);
  mesa.pack();
  mesa.setLocationRelativeTo(null);
  mesa.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }

}
Classe Filósofo
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.util.concurrent.Semaphore;

import javax.swing.*;

public class Jantar {
public static int maxComendo, comendo;
public static JLabel lblMaxn;
public static int nFil;
public static Semaphore mutex;
public static Filosofo[] filosofos;

public static void main(String[] args) {
maxComendo = comendo = 0;

nFil = Integer.parseInt(JOptionPane.showInputDialog(null, 
"Quantos filósofos vão jantar?", 
"Quantidade de filósofos", 
JOptionPane.QUESTION_MESSAGE));
System.out.println("Quantidade de filósofos: " + nFil);

JFrame mesa = new JFrame("Mesa de jantar");

mutex = new Semaphore(1);
filosofos = new Filosofo[nFil];

JPanel info = new JPanel();
info.add(new JLabel("Filósofos: " + nFil + "    "));
JLabel lblMaxtxt = new JLabel("Máximo Comendo: "); 
lblMaxn = new JLabel("0");
info.add(lblMaxtxt);
info.add(lblMaxn);
mesa.add(info, BorderLayout.NORTH);

popularMesa(mesa,filosofos);
mesa.setVisible(true);

for (int i = 0; i < filosofos.length; i++) {
   filosofos[i].start();
  }
 }

 private static void popularMesa(JFrame mesa, Filosofo[] filosofos) { 
  JPanel painel = new JPanel();
  painel.setLayout(
    new GridLayout(
      (int)Math.ceil(Math.sqrt(nFil)), 
      (int)Math.ceil(Math.sqrt(nFil))));
  
  for (int i = 0; i < nFil; i++) {
   System.out.println("Adicionando filósofo " + (i+1) + " à mesa.");
   filosofos[i] = new Filosofo();
   filosofos[i].setNumero(i);
   painel.add(filosofos[i].label);
  }
  
  mesa.add(painel);
  mesa.pack();
  mesa.setLocationRelativeTo(null);
  mesa.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 }

}
Quer o programa pronto ou o código fonte?

quarta-feira, 15 de setembro de 2010

Primeiras letras maiúsculas

Que tal um pouco de C#?

Bom, hoje tive uma curiosidade e pesquisei sobre métodos de tornar a primeira letra de cada palavra maiúscula.

Ví soluções diferentes, e a que mais tem um usando cadeia caracteres. Vejam:
private string Maiuscula(string value)

{

 char[] resultado = value.ToCharArray();

 
 // Torna o primeiro caracter maiúsculo
 resultado[0] = char.ToUpper(resultado[0]);

 for (int i = 1; i < resultado.Length; ++i)

 {
  if (char.IsWhiteSpace(resultado[i - 1]))
   // Torna o caracter maiúsculo se precedido de espaço

   resultado[i] = char.ToUpper(resultado[i]);
  else

   // Torna todos os outros caracteres minúsculos
   resultado[i] = char.ToLower(resultado[i]);

 }

 return new string(resultado);

}


Interessante, não? Também pode-se utilizar no .NET uma classe chamada StringBuilder, que é muito boa para formar strings de outras strings. Vejam:


public static string Maiuscula(string value)

{
 StringBuilder result = new StringBuilder(value);

 
 // Torna o primeiro caracter maiúsculo
 resultado[0] = char.ToUpper(resultado[0]);


 for (int i = 1; i < result.Length; ++i)

 {
  if (char.IsWhiteSpace(resultado[i - 1]))
   // Torna o caracter maiúsculo se precedido de espaço
   resultado[i] = char.ToUpper(resultado[i]);
  else
   // Torna todos os outros caracteres minúsculos

   resultado[i] = char.ToLower(resultado[i]);

 }
 return resultado.ToString();

}



E aí, qual acham que é mais eficiente e tem melhor performance?

terça-feira, 19 de janeiro de 2010

Pagode japonês


Não acredito na letra hahahaha

O Grupo se chama Y-no e a música é "Querido meu amor" (O.O)