תרגיל ב-#C על קונסטרקטור - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

תרגיל ב-#C על קונסטרקטור


sku4no

Recommended Posts

בתרגיל הזה היינו צריכים לבנות מחלקות למורה שמציגה לכיתה של 20 תלמידים ממוצע של כל תלמיד (שזה מה שעשיתי פה) וגם ממוצע כיתתי לכל מקצוע שאני אעשה אחר כך, הבעיה לא בזה. אני חושב שמבחינת הלוגיקה הכול בסדר (וזה בכל מקרה לא ממש מאיים) אבל יש כנראה איזשהי בעיה עם הסינטקס. כשאני מריץ את התוכנית הוא מציג על המסך פקודה לרשום את שם התלמיד הראשון אבל נתקע אחרי שמקבל קלט. אחרי כל מיני ניסיונות אני די בטוח שהבעיה עם המערך מטיפוס Grade. חשבתי שאולי כדאי לאפס אותו אבל זה לא עזר. כל פקודה שעירבה את המערך הזה הביאה לשגיאה וסיום התוכנית, למרות שהתוכנה עצמה לא מתריעה על שום שגיאה מה שלא ממש עוזר לי. מה הבעיה כאן?

תודה לעוזרים..

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
public class Grade
{
private string name;
private double mathGrade;
private double hebrewGrade;
public void Grades(string name, int mathGrade, int hebrewGrade)
{
this.name = name;
this.mathGrade = mathGrade;
this.hebrewGrade = hebrewGrade;
}
public string getName()
{
return name;
}
public void setName(string name)
{
this.name = name;
}
public void setMathGrade(int mathGrade)
{
this.mathGrade = mathGrade;
}
public double getMathGrade()
{
return mathGrade;
}
public void setHebrewGrade(int hebrewGrade)
{
this.hebrewGrade = hebrewGrade;
}
public double getHebrewGrade()
{
return hebrewGrade;
}
public double getStudentAverage()
{
return (mathGrade + hebrewGrade) / 2;
}
public double getClassAverage(int[] a)
{
int counter = 0;
for (int i = 0; i < 20; i++)
counter += a[i];
return counter / 20;
}
}
class Program
{
static void Main(string[] args)
{
Grade[] grades = new Grade[20];
for (int i = 0; i < grades.GetLength(0); i++)
{
Console.WriteLine("Enter student's name: ");
grades[i].setName(Console.ReadLine());
}
for (int i = 0; i < grades.GetLength(0); i++)
{
Console.WriteLine("Enter student's math grade: ");
grades[i].setMathGrade(int.Parse(Console.ReadLine()));
}
for (int i = 0; i < grades.GetLength(0); i++)
{
Console.WriteLine("Enter student's hebrew grade: ");
grades[i].setHebrewGrade(int.Parse(Console.ReadLine()));
}
for (int i = 0; i < grades.GetLength(0); i++)
{
grades[i].getStudentAverage();
}
}
}
}

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

כשאתה יוצר מערך של טיפוס כלשהו, הוא מאותחל ב-null. כלומר, אחרי שאתה יוצר את המערך אתה חייב לאתחל כל איבר במערך באמצעות new.

זה מפתיע שהתוכנה לא מתריעה לך על שום שגיאה, כי אם אתה מריץ אותה מתוך ה-visual studio אז היא אמורה להודיע שיש לך Null Reference Exception.

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

דבר ראשון ב- console.readline אתה מפעיל מתודה של המחלקה GRADE מבלי לייצר בכלל אובייקט.

לפני ה-console.readline אתה צריך new grade... ואז להכניס אותו למערך ורק אז להפעיל בו את המתודה setName .

דבר שני אין לך בנאי ברירת מחדל - ברגע שבנית בנאי שמקבל פרמטרים אז הקומפיילר לא נותן לך בנאי ברירת מחדל אלא אתה צריך לכתוב אותו וזה גם הבנאי שאיתו אתה צריך להשתמש לפני ה-console.readline (כי אין לך עדיין את הנתונים שדורש הבנאי שאתה כתבת).

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

נכון..שכחתי לגמרי מ-new..דווקא בג'אווה אני תמיד עושה ככה. אבל, כשאני עושה אתחול כזה:

Grade[] grades ={

new Grade("Petya", 93, 86),

new Grade("Vova", 88, 94),

};

הוא אומר שלא קייםGrade שמקבל 3 פרמטרים, אבל new Grade() הוא לא אומר שגיאה. השוותי את זה עם איך שעשיתי בג'אווה ויצא שם הכול בסדר וככה זה בדיוק שם. איפה הטעות?

דבר ראשון ב- console.readline אתה מפעיל מתודה של המחלקה GRADE מבלי לייצר בכלל אובייקט.

לפני ה-console.readline אתה צריך new grade... ואז להכניס אותו למערך ורק אז להפעיל בו את המתודה setName .

דבר שני אין לך בנאי ברירת מחדל - ברגע שבנית בנאי שמקבל פרמטרים אז הקומפיילר לא נותן לך בנאי ברירת מחדל אלא אתה צריך לכתוב אותו וזה גם הבנאי שאיתו אתה צריך להשתמש לפני ה-console.readline (כי אין לך עדיין את הנתונים שדורש הבנאי שאתה כתבת).

לא כל כך הבנתי למה אתה מתכוון אבל אני די בטוח שבאמת יש לי בעיה עם הבנאי שצריך לכתוב אותו אבל בכל זאת לא הבנתי למה אתה מתכוון.

ד"א על Null Reference Exception התוכנה לא הודיעה ישירות אלא רק לאחר השגיאה בהרצה, בגלל זה גם ניסיתי לאתחל את המערך (למרות ששכחתי מניו).

תודה מראש..

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

בבירור את ה-null reference exception התוכנית תודיע רק בזמן הריצה.

שמתי לב לעוד טעות קטנה שלך - את הבנאי הגדרת public void Grades, ולא public Grade (השם לא נכון, ולבנאי אסור לשים שום ערך החזרה, אפילו לא void).

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

תודה!

שכחתי בכלל מvoid..טעות לא ממש קטנה

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

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

ארכיון

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

×
  • צור חדש...