Sucet elementov vo venovom diagrame je K + I + B - K&I -K&B - I&B + K&I&B = 23;
K=8; I=9; B=6; K&I&B=2; K&B=1; K&I=2 => 23 - 8 - 9 - 6 - 2 + 1 + 2 = I&B = 1; => (c=2, a=4, b=1)
Sucet elementov vo venovom diagrame je K + I + B - K&I -K&B - I&B + K&I&B = 23;
K=8; I=9; B=6; K&I&B=2; K&B=1; K&I=2 => 23 - 8 - 9 - 6 - 2 + 1 + 2 = I&B = 1; => (c=2, a=4, b=1)
Nvyznam sa velmi do c, ale preco alokujes o 1 bit viac ako potrebujes? Nemoze byt problem s niecim ako zarovnanie pamate? Kedze pre pristup potrebujes prenasobit index velkostou daneho typu.
Vobec nerozumiem tomu kodu co si napisal, netvrdim ze to mas nutne zle, ale chcel by som vidiet viac, lebo podla mna tam mas syntakticku chybu. Typujem ze premennu hra nemas inicializovanu. Podla vsetkoeho to chces z nejakeho dovodu pisat podla mna takto:
class NovaHra { // tu si niesom isty preco je nova hra objektom ked uz je objektom samotna hra
private Pong hra;
public NovaHra(){
hra = new Pong(); // typujem ze toto nemas, ale pravdou je ze v tom co si napisal sa vobec nevyznam
}
public void crGui() {
JButton newGame = new JButton();
newGame.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
hra.initGame();
}
});
}
}
ak to chces spravit ako facotry metodu, z nejakeho dovodu, tak initGame daj static a return type daj Pong.
Doplietol som to, ale na to uz si zrejme prisiel:
for(int i=0; i < key.length(); i++){
sb.append(key.charAt(i));
}
Tak zalezi co chces mat ulozene, bud (asi vo vacsine pripadov pouzijes db ako bolo vyssie spomenute), alebo si napises server a klienta a server sa bude starat o tvoje premenne ulozene niekde na danej stanici.
Skus to nerobit cele staticke a rozdel to na 2 vlakna jedno co zapisuje do Socketu a druhe co z neho cita. Co som si vsimol u teba, tak program celu dobu iba caka na prijem spravy. Cize pokial ti niekto nieco neposle ty mu tiez nic neposles. Ak robis nieco ako echo server, ktory musi najskor nieco priat az potom nieco posle spat, tak ti to nepojde, myslim ze informatici tomu hovoria deadlock. Tu som napisal nieco, ako by som postupoval ja, nieje to dokonale a neskusal som to, ale mohlo by to s drobnymi upravami fungovat (a samozrejme s dopisanim kodu :D ). A malo by to posielat z lubovolneho vlakan, ktore ma referenciu na objekt Connection.
public class Connection{
private booelan connected = false;
private Socket connectionSocket = null;
private MyReader reader = null;
private MyWriter writer = null;
private Thread readerThread = null;
private Thread writerThread = null;
public Connection(String ip, int port){
connectTo(ip, port);
}
public void close(){
// uzavret porty
// a zastavit reader a writer
}
public void sendMsg(String msg){
writer.writeMsg(msg);
}
public Socket getSocket(){
return this.socket;
}
public String recieveMsg(){
return reader.readMsg();
}
public synchronized boolean isConnected(){
return connected;
}
private synchronized void setConnected(boolean connected){
this.connected = connected;
}
public void connectTo(String ip, int port){
try {
Socket client=new Socket(host,port);
setConnected(true);
reader = new MyReader(this);
readerThread = new Thread(reader);
readerThread.start();
writer = new MyWriter(this);
writerThread = new Thread(writer);
writerThread.start();
}
catch(IOException ioe){
// odhitit a spracovat vynimku
}
catch(UnknownHostException uhe){
// odhitit a spracovat vynimku
}
}
}
public class MsgReader implements Runnable{
private BufferedReader reader;
private Connection connection;
private Thread currentThread = null;
private String msg = null;
private boolean recieved = false;
public MsgReader(Connection connection){
this.connection = connection;
reader = new BufferedReader(new InputStreamReader(connection.getSocket()));
}
public void run(){
try{
while(connection.isConnected()){
String msg = reader.readLine(); // Zda sa mi ze sa blokuje do vtedy pokial nieje ready
setMessage(msg);
}
}
}
private synchornized setMessage(String msg){
recieved = true;
this.msg = msg;
}
private synchronized getMessage(){
recieved = false;
return this.msg;
}
private synchornized isRecieved(){
return this.recieved;
}
public String readMsg() throws InterruptedException{
currentThread = System.currentThread();
while(!isRecieved()){
currentThread.wait();
}
return getMessage();
}
public void close(){
currentThread.intrrupt();
currentThread = null;
reader.close();
}
}
public class MyWriter implements Runnable{
// podobne ako reader
}
Ahoj, mozno si si to uz vsimol, ale ty mas listModel, ktory vobec nema referenciu v JListe, ktory si prave nacital. Takze mas niekolko moznosti ako to vyriesit. bud z toho nahraneho JListu si vitiahnes jeho ListModel ( getModel() ). Alebo to nebudes ukladat, ako JList ale ako nejkau inu kolekciu a JList si za kazdym vytvoris.
Riesenie 1:
panelHorni = new JPanel();
JList listCtenaru = null;
ListModel listModel = null;
listScroll = new JScrollPane()
FileInputStream fis = new FileInputStream("myjlist.bin");
ObjectInputStream ois = new ObjectInputStream(fis);
try{
listCtenaru = (JList)ois.readObject();
listModel = listCtenaru.getModel();
}
catch(IOExceptio ioe){
// toto je ked nieco nebude fungovat, aby nedol listCtenaru a listModel nastavene na null
ioe.printStackTrace();
listModel = new DefaultListModel();
listCtenaru = new JList(listModel);
}
catch(ClassNotFoundExceptio cce){
cnfe.printStackTrace();
listModel = new DefaultListModel();
listCtenaru = new JList(listModel);
}
listScroll.add(listCtenaru);
// dalej to pokracuej normalen ako to mas
Riesenie 2:
// Pozor tato metoda neprecita ten subor co mas ty, lebo ty tam mas uplne iny Object
// Na to treba vytvorit iny subor.
public ArrayList<String> loadData(String fileName){
ArrayList<String> data = null;
try{
ObjectInputStream ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(fileName)));
try{
data = (ArrayList<String>) ois.readObject();
}
finally{
ois.close();
}
}
catch(IOException ioe){
ioe.printStackTrace();
data = new ArrayList<String>();
}
catch(ClassNotFoundException cnfe){
cnfe.printStackTrace();
data = new ArrayList<String>();
}
}
public void saveData(String fileName, ArrayList<String> data){
if(data == null)
return;
try{
ObjectOutputStream oos = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(fileName));
try{
oos.writeObject(data);
}
finally{
oos.close();
}
}
catch(IOException ioe){
ioe.printStackTrace();
}
}
JPanel panelHorni = new JPanel();
JListModel listModel = new JListMode();
JList list = new JList(listModel);
for(String readerName : loadData("citatelia.txt")){
listModel.add(readerName);
}
// a tak dalej
Neveim ci je to este aktualne, ale tu to uz riesili: http://stackoverflow.com/questions/4183853/encryption-message-in-java
Alebo mapisat metodu, ktora ti vrati aktualnu hodnotu, pozor treba ju synchronizovat.
class MyClass implements Runnable{
public int counter;
public MyClass(){
counter = 0;
}
public void run(){
// cyklus a v nom je niekde counter
// kod
}
public int synchronized getCount(){
return counter;
}
}
MyClass runableClass = new MyClass();
Thread thread = new Thread(runnableClass);
thread.start();
// v nejakom vlakne ktore ma referenciu na runnableClass
int currentState = runnableClass.getCount();
Alebo ako je vyssie spomenute mozes pouzit Observery, Listenery a ine ery... co len chces a ako len chces.
Neviem ci je tam metoda na vymedzenie a ak inc nenajdes mozes skusit nieco na tento sposob. Ze si vytvoris buffer a kreslis do neho:
Point selectionPosition = ...;
BufferedImage backBuffer = ...;
BufferedImage selctionBuffer = ...; // Ma presne tu istu velkost ako oblast
public Rectangle makeSelection(int x, int y, int w, int h){
selectionPosition = new Point(x,y);
selectionBuffer = backBuffer.getSubimage(x,y,w,h);
}
public void paintComponent(Graphics g){
render()
g.drawImage(backBuffer,0,0,null);
g.disopose();
}
public void render(){
Graphics g = backBuffer.getGraphics();
// kod toho co sa kresli v komponente
// pripadne sa to vobec nemusi prekreslovat ak netreba
if(selectionBuffer!=null){
renderSelection();
g.drawImage(slectionBuffer, selectionPosition.x, selectionPosition.y,null);
}
g.dispose();
}
public void renderSelection(){
int x = recalculate();
Graphics g = selectionBuffer.getGraphics();
// kreslis do vybranej oblasti.
g.dispose();
}
Aha, az teraz som si vsimol, ze si si vobec nevytvoril referenciu na ten novo vytvoreny object a stale pouzivas iba ten povodny, ktory nieje vymedzeny. Tu je riesenie, ktore mozno bude fungovat:
public void paint(Graphics g){
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
super.paint(g);
Graphics slectionGraphics = g.create(203, 80, screenSize.width-203,screenSize.height-80);
// Teraz kreslis do selectionGraphics.
// slectionGraphics.drawLine(0,10,100,10);
...
}
#2 Flowy
Objekt Graphics nepozna metodu fill(Shape s) na to treba pouzit Graphics2D. A navyse Rectangle ani Shape-om neni treba pouzit Rectangle2D.
#1 Jan Vesely
Prilis malo informacie si zadal, mozes to robit teda, ako Flowy naznacuje, alebo ak mas niekde ulozene ako ma ten rectangle vyzerat, resp co do neho nakreslit, atd... . Mozes to robit nasledovne :
// Nejaky object Canvasu
public void update(Graphics g){
// nejaky kod
rectangle.draw(g);
// iny kod
}
// Tu konci
class MyRectangle{
// premenne
// konstruktory
// metody
public void draw(Graphics g){
// Ak je fillOnly nastavene na true tak sa pouzije iba metoda g.fillRect
if(!fillOnly){
g.drawRect(x, y, w, h);
g.fillRect(x,y,w,h);
g.drawText(text, x, y);
}
else{
g.fillRect(x,y,w,h);
}
}
}
#9 jabupe
Ty len nevies ze v skutocnosti chces pouzit mapu. Alebo ako to neskor popisujes, chces Set naplnenny objektami ktore si drzia meno premennej a referenciu na nu. Daj si pozor na prepisanie equals, aj ked si myslim ze je to blbost a v skutocnosti chces uz niekolko krat spomenutu mapu.
Sak jednoducho potrebujes len nekonecne dlhu nabitu platnu s urcitou hustotou nabija, na vyrusenie gravitacneho pola, urcite nie taku kocku ako si nakreslil, ta nema take pole ako ty potrebujes. Popravde nechapem preco elektromagnet? No a potom potrebujes velmi slabucko nabitu sferu, jednoduche je spocitat ako velmi nabytu pri akej uhlovej rychlosti a v akej vzdialenosti.
#5 Gulam
Este je dolezite aby sa ti hybnost zachovavala (pozri aj Ciolkovskeho rovnicu). Dovod lebo ak stojis tak v tom stave zostanes, ak na teba nezaposobi nieco ine (To je tiez jedna zo skrytych fint klasickej mechaniky). V pripade rakety posobys na plyn ktory vymrstujes von nejakou rychlostou a ma nejaky objem, teda hybnost a ta je rovna hybnosti tvojej rakety. (MV)=(mv)
Ale ako som napisal, staci sa stat elmag. vlnou a budes si to svistat bez paliva po celom vesmire s celkom slusnou rychlostou, a z tvojho pohladu budes v najvzdialenejsom kute glalaxie okamzite (malo by tam fungovat nieco s tym ze vsetky udalosti nastavaju naraz.) ;)
Dufam ze myslis na toto http://en.wikipedia.org/wiki/Vacuum_tube_train a viem aj o inom staci sa stat vlnou a cestovat (podla popisu vyssie).
Sak si vytvor, ArrayList o velkosti n a taky ze tam nahadzes vsetky znaky. Teraz budes volat vzdy funkciu random() ktora ti nejakym sposobom bude davat cisla {0,1,2,3,...,n-k-1}, kde k je uz pocet vypisanych cisel do nejakeho noveho arraylistu do ktoreho ich budes kopirovat ale uz so zmenenym poradim. A nemusis mat ziadnu kontrolu nicoho, lebo neexistuje moznost ako by sa ti mohli opakovat ak sa ti neopakovali na zaciatku.
public List<Integer> createList(int size){
List<Integer> sList = new LinkedList<Integer>();
List<Integer> oList = new ArrayList<Integer>(size);
for(int i=0; i<size; i++){
sList.add(new Integer(i));
}
Random r = new Random();
for(int j=0; j<size; j++){
int k = r.nextInt(size - j);
oList.add(sList.remove(k)); // Z linkedlistu ti to bude vzdy tie
//prvky vyhadzovat a zapisovat ich do ArrayListu
}
return oList;
}
#2 ingiraxo
neviem ci ti to z nahody nevytvori pole Objektov Integer. Mozno nie, mozno na to existuje nejaka kniznica. Ja by sim si vypital velkost listu: list.size(). Spravil rovnako velke pole int[] primInt a zapisal do kazdej bunky patricnu hodnotu: primInt[index] = list.get(index).intValue(). Do arraylistu primitivnu premennu neulozis => nebude fungvat list.add(3), ked tak list.add(new Integer(3));
#3 CHARGER
Som si trocha zmenil zadanie. No tak skusim toto:
1.) Vies ze stvorec ma dlzku vsetkych stran rovnaku oznacme ju a;
2.) Zoberme tvoj trojuholnik vo vnutri tohto stvorca (trojuholnik BCD' ) D' deli stranu AD na polovicu. A urobme vysku na stranu BC (je to kolmica k niektorej strane a prechadza protilalhlim vrcholom). Teraz tato vyska vychadza z nejakeho bodu oznacme ho B' . Vies ze tato vyska ked je kolma na stranu BC je kolma aj na stranu AD a je rovnobezna so stranami AB a CD, takze ma velkost prave a co je dlzka strany trojuholnika.
3.) Kruznica je mnozina bodov rovnako vzdialenych od stredu v rovine. Z toho vyplyva ze vsetky vrcholi opisovaneho trojuholnika musia byt rovanko vzdialene od jej stredu. A z toho ze trojuholnik je osovo symetricky voci osi prechadzajucej B'D', vyplyva ze stred S bude lezat niekde na usecke B'D' (skus si to nakreslit).
4.) nech polomer kruznice opisujucej trojuholnik je R. Dlzka usecky B'D' (teda tej vysky trojuholnika) je R + ua teda R + u = a, lebo aj od tohto vrchola je stred S vzdialeny o R. Lenze tak isto je vzdialeny o R aj od ostatnych vrcholov a vieme, ze B'D' je kolme na BC. Lenze ak stred je vzdialeny od bodu D' o R tak potom strana BC (ta na druhej strane) je od stredu S vzdialena prave o u. BC je stranou B'D' rozdeleny na polovicu. Vieme ze trojuholnik B'SC je pravouhly a ta isto vieme ze R = vlekosti SC, u = velkosti B'S, a B'C je rovne a/2. Z toho vznikne rovnica:
R^2 = u^2 + (a/2)^2
5.) dajme sa smelo do vypoctu:
pouzime vzorec 1. R+u =a
u = a - R
u^2 = (a - R)^2 = a^2 - 2aR + R^2 // inak to ^2 znamena na druhu napr. R^2 = R*R
dosadme do druheho vzorca za u, to nas nezauima:
R^2 = a^2 - 2aR + R^2 +(a^2)/4 // tu uz som umocnil a/2 je to a na druhu deleno 4
2aR = a^2 (4+1)/4 // tu som od oboch stran odpocital R^2, 2aR som dal na druhu stranu a scital som (1+1/4)a^2 inak
// ako nasobenie nepisem medzi znakmi nic
R = (5/8) a // uz som len celu rovnicu predelil 2a
Dufam ze pochopis co mam na mysli ;) . Tu je obrazok:
skus to slusne obzatvorkovat a dopis tam:
if (len > 0) {
nacteno += new String(buffer, 0, len);
System.out.println("Nacteno: " + nacteno);
}
else
{
try {
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if ((System.currentTimeMillis() - start) > 5000)
break;
alebo nepuzivaj toto ale sprav to ako predtym ale vo while musi byt ina podmienka, lebo vyzera ze "length" odosiela spravne:
// tento riadok
while ((len = this.in.read(buffer)) == -1)
// nahrad
while ((len = this.in.read(buffer)) != -1)
ono by to malo fungovat spravne. A metoda read(byte[] a) by mala cakta dovtedy pokial nieco nedorazia nejake data. Inak vwlmi sa ospravedlunujem, ze som si nevsimol u teba == a potom som ta nevedomky plietol.
Stale mozes vytvorit /etc/X11/xorg.conf v ktorom si nastavis rozlisenia (ktory sa v dnesnej dobe KMS uz nepouziva). Pripadne ak mas nvidiu a mas nainstalovany nvidia-settings, tak tam mas na to klikatko ;) .
Ale co ti budem hovorit tu mas okrem vyssie spomenutych este dalsie 2 moznosti: https://wiki.ubuntu.com/X/Config/Resolution/
Co tak skusit nieco na sposob tohto: http://docs.oracle.com/javase/tutorial/essential/io/links.html a ak odkazuje o uroven nizsie niekde do tvojej cesty, tak ho rovno preskoc a pojdes na dalsi.
#5 johhan
to ti nepomoze znova ti to vrati v tvare int ... . Cize ked budes mat 3 otazkovy a 2 spravne tak budes mat 66.0% aj ked by si odcakaval 66.66666% co by mala byt aj spravna odpoved. Vhodne je este pred samotnou operaciu delenia mat aspon jednu z hodnot ulozenu ako float.
...
public static float vypocetHodnotenia(ina pocetOtazok, int pocetSpravnychOdpovedi){
return (float) pocetSpravnychOdpovedi / pocetOtazok * 100; // Som jave povedal ze si ma premennu ulozit ako float a tak sa k nej spravat
}
...
// pripadne sa to da aj
public static float vypocetHodnotenia(ina pocetOtazok, int pocetSpravnychOdpovedi){
return 100. * pocetSpravnychOdpovedi / pocetOtazok; // tu si znova medzivypocet 100. * pocetSpravnychOdpovedi ulozit ako float a potom znova deli float integerom co si ulozi ako float
}
Tu je zopar linkov:
Java 2D Trial: http://docs.oracle.com/javase/tutorial/2d/index.html
DoubleBuffereing: http://www.realapplets.com/tutorial/DoubleBuffering.html
VolatileImage: http://content.gpwiki.org/index.php/Java:Tutorials:VolatileImage
Graphics2D: http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Graphics2D.html
A co takto vytvorit objekt Label, ktory sa ti vykresli priamo do obrazka (pouzil by som VolatileImage ak sa to bude velmi casto prekreslovat) a obrazok(VolatileImage, BufferedImage) potom vykreslis do daneho JComponentu (Canvasu) pomocou Objektu Graphics, myslim ze sa tomu hovori double buffering.
To vykreslenie Labelov spravis velmi jednoducho a to tak ze si z obrazku vypytas objekt Graphics2D (Graphics) a do toho kreslis.
Sice to mozno pre tvoj pripad teraz nieje az tak nutne, ale moze sa stat ze budes chciet obrazko posuvat(res. sa cely nevlezie do okna a tak budes nuteny sa po nom presuvat) a navise, co je hlavne, tym odpada cely tvoj vyssie uvedeny problem a vzdialenosti budes pocitat uz iba na obrazku.
Nastuduj si nieco o knizniciach Graphics, Graphics2D, VolatileImage, DoubleBufferingu (BufferStrategy) atd...
toto teda fakt neviem ako ta napadlo spravit ax*bx*cx + ay*by*cy ... ale je to hlupost, tak nic nevypocitas. Skalarny sucin je zavedeny medzi dvomi vektormi, nie tromi.
Treba to pocitat nasledovne:
r=a-b+c - to mas predpisane
r=[11; 5; -7] - stlpcovi vektor
pouzijes vektor osi z:
e_z = [0, 0, 1] - riadkovy vektor
alpha = ArcCos( e_z.r / (|r|*|e_z|) )
alpha = ArcCos(-7 / 13,96424...) = 120,08....
Podla mna je omnoho jednoduchsie si vytvorit take intervali ze {I1, I2, I3, ..., In} a ze <0,1> = I1 zjednotenie I2 ... In a pre kazde 1<= k,l <=n kde k != l plati: Ik prienik Il = 0. Ik bude predstavovat pravdepodobnost padnutia k-teho prvku (napr. p_k%). Potom spustis random() alebo inak vygenerujes nahodne cislo od <0,1> (samozrejme s rovnomernim rozlozenim). To padne do urciteho intervalu ktoremu bude prisluchat urcite pismeno, cislo, Objekt. Cize by som to videl nasledovne:
.
.
.
public Object getRandObject(Object[] objs, double[] p){
double skalovanie = spocitaj(p); //spocitam vsetky pravdepodobnosti dohromady
p = skaluj(p,skalovanie); metoda ktora my to cele preskaluje aby sucet pravdepodobnosti bol 1.
double[] interval = vytvorIntervaly(p);
/*
* Metoda funguje tak ze interval[0]=0 interval[1]=p[0] interval[2]=p[1]+p[2] ... .
* To vytvori urcite hranice.
*/
double rand = Math.random(); // nahodne cislo mozes vygenerovat samozrejme aj inak
//alebo ho inak ziskat
int i = indexIntervalu(interval, rand);
// Metoda vrati index intervalu tak aby platilo interval[i]<= rand < interval[i+1]
return objs[i]; //Vrati i-ty objekt, ktory mal urcitu pravdepodobnost ze sa vrati p[i]
}
.
.
.
Tie indexy este skontroluj, lebo som nad tym vemy neuvazoval. Za pripadne chyby, aj gramaticke, sa ospravedlnujem.
Hmm a co takto implementovat ActionListener na cely Frame a potom overridnut jedinu metodu ActionPerformed(ActionEvent e) asi takto:
public class Xyz extends JFrame implements ActionListener {
...
JButton anoButton;
JButton nieButton;
...
...
@Override
public void ActionPerformed(ActionEvent e) {
if (e.getSource().equals(anoButton)) {
//co sa ma urobit
...
}
if (e.getSource().equals(nieButton)) {
//co sa ma v tomto pripade vykonat
...
}
}
}
Mozes, ale musis najskor vediet kde sa to pole nachadza a samozrejme musi exisotvat. Cize bud odosles pointer na to pole priamo do B alebo aspon na A. Cize videl by som to asi takto:
// toto moze byt v hociakom classe, ale tako cez ktory budes pristupovat do programu
public static main(String arg[]){
A a = new A(10);
// vlozis nejaky text
B b = new B(a);
C c = new C(a.text);
b.nacitaj(3);
c.nacitaj(8);
}
class A {
String[];
public A(int n) {
text = new String[n];
}
public void vlozText(String retzec){
// nejaky kod na vkladanie
}
}
class B {
A a;
public B(A a) {
this.a = a;
}
public String nacitaj(int i) {
return a.text[i];
}
}
class C {
String[] text;
public C(String[] text) {
this.text = text;
}
public String nacitaj(int i) {
return text[i];
}
}
pripadne ak by bolo pole String[] typu static tak mozes priamo a to A.text[i].
Jednoducho return caka na nieco co moze odoslat, co je v tomto pripade (fib(n-1)+fib(n-2)). Cize caka kym sa vypocita fib(n-1) a fib(n-2), spocita ich a odosle.
Inak pre o nieco malo rychlejsi vypocet clenov Fibbonacciho postupnosti existuje taky rekurentny vzorec : fib(n):=(1/sqrt(5))*(((1+sqrt(5))/2)^n+((1-sqrt(5))/2)^n)
No a co takto skusit vektorovi sucin? A obsah je z vysledneho vektora jeho velkost (skalarny sucin vektora sameho so sebou pod odmocninou ) predelena 2. 1. vektor bude v = ( x[1] - x[0], y[1]-y[0])^T a druhy u = (x[2] - x[0], y[2]-y[0])^T. spravis w =u x v a potom uz len staci S = (w.w)^1/2. No a predpokladam ze sa pohybujeme v dim U = 2, kde U je VP kde patri u,v, tak ti uplne vypadne ta cast s velkostou a odmocninou. Jedina vec ktoru bude treba osetrit bude zaporny obsah a to s=Math.abs(w[2]). Jo a nemusis robyt celi vektorovi sucin staci iba pre tretiu zlozku a to je w[2] = u[0]*v[1]-v[0]*u[1]; Cize kod by mohol vyzerat takto:
public int[] makeVector ( int[] sPoint, int[] ePoint )
{
int[] vect = new int[2];
for ( int i=0; i<2; i++) vect[i] = ePoint[i] - sPoint[i];
return vect;
}
public float volume ( int[] u, int[] v )
{
return Math.abs(u[0]*v[1]-v[0]*u[1])/2.0;
}
kde ako sPoint si zadas napr. suradnicu bodu A a ePoint budu suradnice bodov B a C. to ti vygeneruje 2 vektori AB a AC a ti hodis len do metody volume. Ak to budes chciet riesit v vo viac ako 2 rozmernom priestore budes potrebovat pocitat determinany (namiesto VSucinu), ten ti urci objem okamzite, kedze je to zobrazneie R^(n x n) -> R
Ja by som to robil bez dalsej metody jePrvocislo, lebo jej funkcnost vies pohodlne nahradit jednou premennou vo for cykle.
To KIIV: este by sa dal usetrit cas na tom mat tabulku prvocisel a testovat len delitelnost nimi.
Toto by malo bezat:
class PrimeNumber
{
int[] pNum;
int n = 0;
public static void main ( String[] args )
{
PrimeNumber pn = new PrimeNumber();
pn.getPrimeNumbers (10);
pn.printPrimeNumbers ( );
}
public PrimeNumber ( ){
pNum = new int[100];
}
public void getPrimeNumbers ( int max )
{
boolean isPNum;
for ( int sPNum = 2; sPNum < max; sPNum++ )
{
isPNum = true; //defaultne su vsetky prvocisla a potom len preverujes
for ( int j = 0; pNum[j]*pNum[j] <= sPNum && j<n; j++ ) // to j<n je tam kvoli prvocislu 2 ktore nieje riesenim napr. max = 1 a max =0 a max = Z- a pNum[j]^2 <= sPNum je inspirovane KIIV-om a Tchibo -m
isPNum &= (sPNum % pNum[j]!=0); //nahrada za metodu jePrvocislo()
if ( isPNum )
{
if ( n >= pNum.length ) expandArray (); // Zabrani indexOutOfBounds Exception
pNum[n] = sPNum;
n++;
}
}
}
public void printPrimeNumbers ( )
{
System.out.println ( "Prvocisiel je: " +n );
for ( int i =0; i < n; i++ ) System.out.println (pNum[i]);
}
public void expandArray ( )
{
int tmp[] = pNum;
pNum = new int[tmp.length + 200];
System.arraycopy ( tmp, 0, pNum, 0, tmp.length );
}
}
ono je to zrejme myslene v classe Uchazec:
class Uchazec
{
. // Tu su deklarovane globalne premenne pre triedu Uchazec
.
.
// ja by som tie konstruktory riesil tak, ze si vytvorim pomocnu privatnu metodu ktora dane premenne inicializuje, napr. newCandidate ( int cizlo ... ). Ale zrejme ani toto nieje idealne riesenie.
public Uchazec (int cislo, String prijmeni, String jmeno)
{
newCandidate ( cislo, "", "", 0, 0 );
}
public Uchazec ( int cislo )
{
newCandidate ( cislo, prijmeni, jmeno, 0, 0 );
}
// neviem ale ak by sa to robilo tak ako napisal vyssie liborb, tak zvykne javac obvykle papulovat, lebo nepozna metodu Uchazec
private void newCandidate ( int cislo, String prijmeni, String jmeno, int bodyTest, int bodyPohovor )
{
this.cislo = cislo;
this.prijmeni = prijmeni;
this.jmeno = jmeno;
this.bodyTest = bodyTest;
this.bodyPohovor = bodyPohovor;
}
.
. // Kod
.
// V 2. pripade, ako som uz napisal, sa mi zda ze by ta metody vyhovel() a getBody() mala byt vo vnutri class Uchazec. Ale ak nie tak potom treba zmenit konstantu MAX_BODY na Uchazec.MAX_BODY
public boolean vyhovel ( )
{
return (bodyTest>MAX_BODY/2) & (bodyPohovor > MAX_BODY/2);
}
public int getBody ( )
{
return bodyTest + bodyPohovor;
}
.
.
.
}
#1 PetrP
Tak napr. ja by som to riesil:
public class Main {
static int sum=0;
public static void main(String[] args) {
int[] a = {1,2,3,4,5};
psi ( 0, a, a.length );
System.out.println(sum);
}
public static void psi ( int l, int[] a, int n ){
for ( int k = l; k>=0; k-- ){
int[] c = new int[a.length];
c = switchNum(k, l, a);
if ( k!=l && a[0]!=1 ){ // sem mozte dodat dodatocne podmienky, ako napr. a[0]!=1
printA ( c );
sum++;
}
if (l+1 < n) psi ( l+1, c, n );
}
}
public static void printA ( int[] a ){
for(int i=0; i< a.length; i++)
System.out.print(a[i]+"\t");
System.out.println();
}
public static int[] switchNum ( int i, int j, int[] a ){
if(j==i) return a;
int tmp = a[i];
a[i] = a[j];
a[j] = tmp;
return a;
}
}
public String getString(String text, String begin, String end){
char[] cText = text.toCharArray();
int sIndex = text.indexOf(begin)+begin.length();
int eIndex = text.indexOf(end, sIndex);
// +- nejake drobne v zavislosti na tom co je v danom stringu okrem BEGIN:VCARD a END:VCARD
return String.copyValueOf(cText, sIndex, sIndex-eIndex);
}
max=30;
min=0;
boolean incr;//Nieco ako jezdeni;
if(x>max&incr){
x=max
}
elseif(x<min&!incr){
x=min
}
else{
if(incr){
x++;
}
else{
x--;
}
}
public double[] kvadRovnica(double[] koef){
double[] res = double[4];
double disc = koef[1]*koef[1]-4*koef[0]*koef[2];
for(int i=0; i<4;i++){
res[i]=Math.signum(-i+1.5f)*sqrtOrZero(Math.signum(-(i%2)+0.5)*disc);
res[i]=i<2?koef[1]/(2*koef[0]):0;
}
return res;
}
public double sqrtOrZero(double x){
if(x<=0)return 0;
return Math.sqrt(x);
}
A co takto to neosetrovat, ale iba vypocitat. To je tiez moznost.
private double[] nacitajKoeficienty(){
double[] koef = new double[3];
String[] udaj = {"prvy", "druhy", "treti"};
boolean valid = false;
int i =0;
do{
System.out.prinltn("Zadajte "+udaj[i]+" koeficient");
try{
koef[i] = readNumber();
i++;
valid = true;
}catch(IOException e){
System.out.println("Zadali ste neplatne cislo");
valid = false;
}
}while(!valid|i<3);
return koef;
}
Alebo tak nejako, lepsie to uz neupravim. Dufame ze to pre klud duse postaci ;)