עזרה בJAVA - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

עזרה בJAVA


נעמה.

Recommended Posts

יש לי שאלה:


: הדמיה של קו ייצור כסאות הכולל 4 עמדות עבודה המתבצעות במקביל.
העמדה הראשונה בונה את השלד של הכסא.
העמדה השניה מקבלת את השלד מהעמדה הראשונה וצובעת את השלד.
העמדה השלישית מקבלת את השלד הצבוע ומרכיבה עליו את המושב.
העמדה הרביעית מקבלת את השלד עם המושב ומרפדת את המושב.

[b]צריך לממש את היישום הכולל כמה תהליכים מקביליים המסונכרנים באמצעות תהליך ראשי.
הימנע מליצור תהליך בשלב שאינו פעיל.
אין קלט.[/b]

זו התכנית שרשמתי ויש לי בעיה, אשמח לעזרתכם: ??? ???


class BuildCheir extends Thread // build sheled

{
int numA,k;
public BuildCheir(int nb, int _k) // constructor
{
numA=nb;
k=_k;
start();
}

public void run ()
{
System.out.println("Build sheled of the cheir "+(k-1));
}
}

class PaintCheir extends Thread // paint the cheir
{
int numB,k;
public PaintCheir(int nb, int _k) // constructor
{
numB=nb;
k=_k;
start();
}

public void run ()
{
System.out.println ("Paint the sheled "+(k-2));
}
}

class PutMoshav extends Thread // put moshav on the cheir sheled
{
int numC,k;
public PutMoshav(int nb, int _k) // constructor
{
numC=nb;
k=_k;
start();
}

public void run ()
{
System.out.println ("Put moshav on the sheled "+k);
}
}

class PutRipud extends Thread // put ripud on the cheir moshav
{
int numB,k;
public PutRipud(int nb, int _k) // constructor
{
numB=nb;
k=_k;
start();
}

public void run ()
{
System.out.println ("Put ripud on the sheled "+(k-2));
}
}

public class Cheir
{
int n=4; // no of pieces.
int k; // nb turn

void rotable()
{
System.out.flush();
for(k=1 ; k<=(n+4); k++)
{
if (k==1)
BuildCheir build = new BuildCheir(n,k);

else if (k==2)
BuildCheir build = new BuildCheir(n,k);
PaintCheir paint = new PaintCheir(n,k);

else if (k==3)
BuildCheir build = new BuildCheir(n,k);
PaintCheir paint = new PaintCheir(n,k);
PutMoshav moshav = new PutMoshav(n,k);

else if (k==4)
BuildCheir build = new BuildCheir(n,k);
PaintCheir paint = new PaintCheir(n,k);
PutMoshav moshav = new PutMoshav(n,k);
PutRipud ripud = new PutRipud(n,k);

try
{
build.join(); paint.join(); moshav.join(); ripud.join();
} catch(InterruptedException excp) { }

System.out.println ("take new cheir ");
if (k>4)
System.out.println ("finish cheir no. "+(k-3));
}
}

public static void main (String args[])
{
Cheir rt= new Cheir();
rt.rotable();

while(true) {}; // hold screen
}
}

קישור לתוכן
שתף באתרים אחרים

קודם כל, בלי לקרוא את הקוד לעומק, את צריכה לתחום ב- {} בלוקי if ו else המכילים יותר משורה אחת.

הכוונה היא ש:

if (k==1)
BuildCheir build = new BuildCheir(n,k);

else if (k==2)
BuildCheir build = new BuildCheir(n,k);
PaintCheir paint = new PaintCheir(n,k);

else if (k==3)
BuildCheir build = new BuildCheir(n,k);
PaintCheir paint = new PaintCheir(n,k);
PutMoshav moshav = new PutMoshav(n,k);

else if (k==4)
BuildCheir build = new BuildCheir(n,k);
PaintCheir paint = new PaintCheir(n,k);
PutMoshav moshav = new PutMoshav(n,k);
PutRipud ripud = new PutRipud(n,k);

צריך להיות:

if (k==1)
BuildCheir build = new BuildCheir(n,k);
else if (k==2)
{
BuildCheir build = new BuildCheir(n,k);
PaintCheir paint = new PaintCheir(n,k);
}
else if (k==3)
{
BuildCheir build = new BuildCheir(n,k);
PaintCheir paint = new PaintCheir(n,k);
PutMoshav moshav = new PutMoshav(n,k);
}
else if (k==4)
{
BuildCheir build = new BuildCheir(n,k);
PaintCheir paint = new PaintCheir(n,k);
PutMoshav moshav = new PutMoshav(n,k);
PutRipud ripud = new PutRipud(n,k);
}

קישור לתוכן
שתף באתרים אחרים

ודאי שב-Java צריך סוגריים. אפשר בלי סוגריים, אבל זה לא יעשה את אותו הדבר (בלי סוגריים, רק הפקודה הראשונה שאחרי ה-if תכלל בתוכו, והפקודות הבאות ייקראו בכל מקרה).

לגבי השגיאה שלך, כנראה יש לך טעות איפשהו מסביב לשורה הזו. כתבי כאן את השורה הזו וגם כמה שורות לפניה ואחריה, ונראה מה הבעיה.

קישור לתוכן
שתף באתרים אחרים

הנה זה:


// turn table for 3 parallel holemakers
// file name Table1.java Tishrey 5764
import java.io.*;

class BuildCheir extends Thread // build sheled

{
int numA,k;
public BuildCheir(int nb, int _k) // constructor
{
numA=nb;
k=_k;
start();
}

public void run ()
{
System.out.println("Build sheled of the cheir "+(k-1));
}
}

class PaintCheir extends Thread // paint the cheir
{
int numB,k;
public PaintCheir(int nb, int _k) // constructor
{
numB=nb;
k=_k;
start();
}

public void run ()
{
System.out.println ("Paint the sheled "+(k-2));
}
}

class PutMoshav extends Thread // put moshav on the cheir sheled
{
int numC,k;
public PutMoshav(int nb, int _k) // constructor
{
numC=nb;
k=_k;
start();
}

public void run ()
{
System.out.println ("Put moshav on the sheled "+k);
}
}

class PutRipud extends Thread // put ripud on the cheir moshav
{
int numB,k;
public PutRipud(int nb, int _k) // constructor
{
numB=nb;
k=_k;
start();
}

public void run ()
{
System.out.println ("Put ripud on the sheled "+(k-2));
}
}

public class Cheir
{
int n=4; // no of pieces.
int k; // nb turn

void rotable()
{
System.out.flush();
for(k=1 ; k<=(n+4); k++)
{
if (k==1)
BuildCheir build = new BuildCheir(n,k);

else if (k==2)
{
BuildCheir build = new BuildCheir(n,k);
PaintCheir paint = new PaintCheir(n,k);
}
else if (k==3)
{
BuildCheir build = new BuildCheir(n,k);
PaintCheir paint = new PaintCheir(n,k);
PutMoshav moshav = new PutMoshav(n,k);
}
else if (k==4)
{
BuildCheir build = new BuildCheir(n,k);
PaintCheir paint = new PaintCheir(n,k);
PutMoshav moshav = new PutMoshav(n,k);
PutRipud ripud = new PutRipud(n,k);
}
try
{
build.join(); paint.join(); moshav.join(); ripud.join();
} catch(InterruptedException excp) { }

System.out.println ("take new cheir ");
if (k>4)
System.out.println ("finish cheir no. "+(k-3));
}
}

static public void main (String args[])
{
Cheir rt= new Cheir();
rt.rotable();

while(true) {}; // hold screen
}
}

והטעויות שהקומפיילר רושם:



Z:\Cheir.java:81: not a statement
BuildCheir build = new BuildCheir(n,k);
^
Z:\Cheir.java:81: ';' expected
BuildCheir build = new BuildCheir(n,k);
^
Z:\Cheir.java:103: cannot resolve symbol
symbol : variable build
location: class Cheir
build.join(); paint.join(); moshav.join(); ripud.join();
^
Z:\Cheir.java:103: cannot resolve symbol
symbol : variable paint
location: class Cheir
build.join(); paint.join(); moshav.join(); ripud.join();
^
Z:\Cheir.java:103: cannot resolve symbol
symbol : variable moshav
location: class Cheir
build.join(); paint.join(); moshav.join(); ripud.join();
^
Z:\Cheir.java:103: cannot resolve symbol
symbol : variable ripud
location: class Cheir
build.join(); paint.join(); moshav.join(); ripud.join();
^
6 errors

----jGRASP wedge2: exit code for process is 1.
----jGRASP: operation complete.

קישור לתוכן
שתף באתרים אחרים

לגבי שתי השגיאות הראשונות אני לא בטוח, אבל נראה לי שלפני else אסור שיהיה ; (מומלץ שתעטפי גם את השורה הבודדת בסוגריים מסולסלים).

לגבי השגיאות האחרות:

על build, paint, moshav ו-ripud הצהרת בתוך ה-if-ים, ולכן אי אפשר לגשת אליהם מחוץ להם.

מה שקורה הוא שאובייקט "חי" רק בטווח (scope) בו הצהרת עליו.

קחי את הקוד הזה לדוגמה:

if (/* some condition */) {
int i = 10;
}

i = i + 1; // Error!

בקוד הזה, i הוגדר בתוך ה-if, ולכן כשמנסים לגשת אליו מחוץ ל-if אי אפשר.

אם בכל זאת נרצה להשתמש ב-i, נצטרך להגדיר אותו מחוץ ל-if, כך:

int i;
if (/* some condition */) {
i = 10;
}

i = i + 1; // Good!

שימי לב שיש מקרים שבהם את גם קוראת ל-join על אובייקטים שלא אותחלו (בכל המקרים ש-k בין 1 ל-3).

קישור לתוכן
שתף באתרים אחרים

להצהיר עליהם ב-main לא יעזור, כי הם עדיין יהיו מחוץ ל-scope.

את צריכה להצהיר עליהם או כאיברים בקלאס Cheir (ואז הם ישרדו גם מעבר לקריאה לפונקציה, אם תרצי), או שתצהירי עליהם בתחילת הפונקציה rotable.

(את יכולה גם להצהיר עליהם בתוך לולאת ה-for, היות ואת לא משתמשת בהם מחוץ לה)

הפונקציה join אומרת ל-thread הנוכחי לחכות ל-thread שכרגע רץ עד שיסתיים (כלומר ה-thread שבו רצה הפונקציה rotable יחכה ל-threadים של build,paint,moshav ו-ripud).

שימי לב שבמקרים שהם לא אותחלו, את בכלל לא צריכה לעשות להם join.

נניח, אם k == 2 אז רק build ו-paint רצים, כך שאי אפשר לעשות moshav.join או ripud.join.

רק משהו אחד לא בדיוק הצלחתי להבין - את מנסה בעצם "לבנות" ארבעה כסאות, כשבכל כיסא רק חלק מהשלבים קורים? כי מה שיקרה כרגע הוא בעצם שבכיסא הראשון רק ה-build ייקרא, בשני ה-build וה-paint ייקראו, וכן הלאה.

קישור לתוכן
שתף באתרים אחרים

אממממ לא!

אני צריכה לבנות מכונה שמייצרת כיסא, אבל שלא תעבוד על ריק <מתייחס רק עד להכנסת הכסא הרביעי>

כלומר: בפעם הראשונה רק יש שלד,

אח"כ שלד(לכיסא 2) וגם צביעה (כיסא 1)

אח"כ שלד (לכיסא 3) וגם צביעה (כיסא 2) וגם הוספת מושב (כיסא 1)

אח"כ שלד (לכיסא 4) וגם צביעה (כיסא 3) וגם הוספת מושב (כיסא 2) וריפוד (כיסא 1)

וחוזר חלילה בלי הפסקה.

מה אני צריכה לשנות כדי שזה יפעל ככה? :nixweiss:

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...