Programming and Java Fundamentals
Project: Build a Console-Based Grade Calculator
আপনি একটি free preview lesson দেখছেন।
Project Overview
এই practical project-এ আমরা একটি interactive console-based grade calculator তৈরি করব।
Programটি user-এর কাছ থেকে:
- Student name
- Subject count
- প্রতিটি subject-এর mark
নেবে এবং calculate করবে:
- Total marks
- Average mark
- Highest mark
- Lowest mark
- Passed subject count
- Failed subject count
- Final grade
- Final result
- Performance message
Programটি menu-driven হবে। User চাইলে:
- Grade calculation করতে পারবে
- Grade rules দেখতে পারবে
- Program exit করতে পারবে
Concepts Used
এই project-এ Module 1-এর প্রায় সব গুরুত্বপূর্ণ concept ব্যবহার করা হবে:
- Variables
- Constants
- Primitive data types
String- Operators
- Type conversion
Scannerif-elseswitchforloopwhileloopdo-whileloopbreakcontinue- Input validation
- String formatting
Learning Objectives
এই project শেষ করার পর আপনি পারবেন:
- একটি complete console application তৈরি করতে
- User input collect এবং validate করতে
- Loop ব্যবহার করে multiple marks পড়তে
- Accumulator দিয়ে total calculate করতে
- Highest এবং lowest value track করতে
- Subject-wise pass/fail determine করতে
- Average থেকে grade calculate করতে
- Menu-driven program তৈরি করতে
switch,breakএবংcontinuepracticalভাবে ব্যবহার করতে- Program output readableভাবে format করতে
Project Requirements
Program-এর main menu হবে:
=== Grade Calculator ===
1. Calculate student result
2. View grade rules
3. Exit
Student Information
Calculation option select করলে program নেবে:
Student name
Number of subjects
Mark for each subject
Subject Count Rules
Subject count হতে হবে:
1 to 10
Invalid value দিলে program আবার input চাইবে।
Mark Validation Rules
প্রতিটি mark হতে হবে:
0 to 100
Invalid mark দিলে program একই subject-এর mark আবার চাইবে।
Passing Rule
প্রতিটি subject-এর passing mark:
40
একটি subject-এও mark 40-এর কম হলে student-এর final result হবে:
Failed
Grade Rules
Student সব subject pass করলে average অনুযায়ী grade হবে:
| Average Mark | Grade |
|---|---|
80–100 | A |
70–79.99 | B |
60–69.99 | C |
50–59.99 | D |
40–49.99 | E |
কোনো subject fail করলে:
Grade: F
Result: Failed
Program Flow
Start
↓
Display menu
↓
Read menu option
↓
Option 1?
├─ Yes → Read student information
│ ↓
│ Read and validate marks
│ ↓
│ Calculate result
│ ↓
│ Display report
│
↓
Option 2?
├─ Yes → Display grade rules
│
↓
Option 3?
├─ Yes → Exit
│
↓
Return to menu
Complete Java Program
import java.util.Scanner;
public class Main {
static final int CALCULATE_RESULT_OPTION = 1;
static final int VIEW_RULES_OPTION = 2;
static final int EXIT_OPTION = 3;
static final int MINIMUM_SUBJECT_COUNT = 1;
static final int MAXIMUM_SUBJECT_COUNT = 10;
static final int MINIMUM_MARK = 0;
static final int MAXIMUM_MARK = 100;
static final int PASSING_MARK = 40;
public static void main(String[] args) {
Scanner scanner =
new Scanner(System.in);
int menuOption = 0;
do {
System.out.println();
System.out.println(
"=== Grade Calculator ==="
);
System.out.println();
System.out.println(
CALCULATE_RESULT_OPTION
+ ". Calculate student result"
);
System.out.println(
VIEW_RULES_OPTION
+ ". View grade rules"
);
System.out.println(
EXIT_OPTION
+ ". Exit"
);
System.out.println();
System.out.print(
"Choose an option: "
);
if (!scanner.hasNextInt()) {
String invalidInput =
scanner.nextLine();
System.out.println(
"Invalid option: "
+ invalidInput
);
System.out.println(
"Enter a whole number from 1 to 3."
);
continue;
}
menuOption =
scanner.nextInt();
scanner.nextLine();
switch (menuOption) {
case CALCULATE_RESULT_OPTION -> {
System.out.println();
System.out.println(
"--- Student Information ---"
);
String studentName;
while (true) {
System.out.print(
"Enter student name: "
);
studentName =
scanner
.nextLine()
.strip();
if (studentName.isBlank()) {
System.out.println(
"Student name is required."
);
continue;
}
break;
}
int subjectCount = 0;
while (true) {
System.out.print(
"Enter number of subjects "
+ "("
+ MINIMUM_SUBJECT_COUNT
+ "-"
+ MAXIMUM_SUBJECT_COUNT
+ "): "
);
if (!scanner.hasNextInt()) {
String invalidInput =
scanner.nextLine();
System.out.println(
"Invalid subject count: "
+ invalidInput
);
System.out.println(
"Enter a whole number."
);
continue;
}
subjectCount =
scanner.nextInt();
scanner.nextLine();
if (
subjectCount
< MINIMUM_SUBJECT_COUNT
|| subjectCount
> MAXIMUM_SUBJECT_COUNT
) {
System.out.println(
"Subject count must be between "
+ MINIMUM_SUBJECT_COUNT
+ " and "
+ MAXIMUM_SUBJECT_COUNT
+ "."
);
continue;
}
break;
}
int totalMarks = 0;
int highestMark = -1;
int lowestMark = 101;
int passedSubjectCount = 0;
int failedSubjectCount = 0;
System.out.println();
System.out.println(
"--- Enter Subject Marks ---"
);
for (
int subjectNumber = 1;
subjectNumber <= subjectCount;
subjectNumber++
) {
int mark = 0;
while (true) {
System.out.print(
"Enter mark for subject "
+ subjectNumber
+ " ("
+ MINIMUM_MARK
+ "-"
+ MAXIMUM_MARK
+ "): "
);
if (!scanner.hasNextInt()) {
String invalidInput =
scanner.nextLine();
System.out.println(
"Invalid mark: "
+ invalidInput
);
System.out.println(
"Enter a whole number."
);
continue;
}
mark =
scanner.nextInt();
scanner.nextLine();
if (
mark < MINIMUM_MARK
|| mark > MAXIMUM_MARK
) {
System.out.println(
"Mark must be between "
+ MINIMUM_MARK
+ " and "
+ MAXIMUM_MARK
+ "."
);
continue;
}
break;
}
totalMarks += mark;
if (mark > highestMark) {
highestMark = mark;
}
if (mark < lowestMark) {
lowestMark = mark;
}
if (mark >= PASSING_MARK) {
passedSubjectCount++;
} else {
failedSubjectCount++;
}
}
double averageMark =
totalMarks
/ (double) subjectCount;
boolean passedAllSubjects =
failedSubjectCount == 0;
String finalResult =
passedAllSubjects
? "Passed"
: "Failed";
String grade;
if (!passedAllSubjects) {
grade = "F";
} else if (averageMark >= 80) {
grade = "A";
} else if (averageMark >= 70) {
grade = "B";
} else if (averageMark >= 60) {
grade = "C";
} else if (averageMark >= 50) {
grade = "D";
} else {
grade = "E";
}
String performanceMessage =
switch (grade) {
case "A" ->
"Excellent performance";
case "B" ->
"Very good performance";
case "C" ->
"Good performance";
case "D" ->
"Satisfactory performance";
case "E" ->
"Passed, but improvement is needed";
case "F" ->
"One or more subjects were failed";
default ->
"Result unavailable";
};
System.out.println();
System.out.println(
"=== Student Result ==="
);
System.out.println(
"Student: "
+ studentName
);
System.out.println(
"Subjects: "
+ subjectCount
);
System.out.println(
"Total marks: "
+ totalMarks
+ " out of "
+ (
subjectCount
* MAXIMUM_MARK
)
);
System.out.println(
"Average mark: "
+ "%.2f".formatted(
averageMark
)
);
System.out.println(
"Highest mark: "
+ highestMark
);
System.out.println(
"Lowest mark: "
+ lowestMark
);
System.out.println(
"Passed subjects: "
+ passedSubjectCount
);
System.out.println(
"Failed subjects: "
+ failedSubjectCount
);
System.out.println(
"Grade: "
+ grade
);
System.out.println(
"Result: "
+ finalResult
);
System.out.println(
"Performance: "
+ performanceMessage
);
}
case VIEW_RULES_OPTION -> {
String gradeRules = """
=== Grade Rules ===
Passing mark per subject: 40
Average 80-100 → Grade A
Average 70-79 → Grade B
Average 60-69 → Grade C
Average 50-59 → Grade D
Average 40-49 → Grade E
If any subject mark is below 40:
Grade F and final result Failed
""";
System.out.println();
System.out.println(gradeRules);
}
case EXIT_OPTION ->
System.out.println(
"Grade calculator closed."
);
default ->
System.out.println(
"Invalid option. "
+ "Choose 1, 2, or 3."
);
}
} while (menuOption != EXIT_OPTION);
scanner.close();
}
}
Program Walkthrough
Constants
static final int PASSING_MARK = 40;
Constants এমন rules represent করে, যেগুলো program চলার সময় পরিবর্তন হওয়া উচিত নয়।
Menu options:
static final int CALCULATE_RESULT_OPTION = 1;
static final int VIEW_RULES_OPTION = 2;
static final int EXIT_OPTION = 3;
Validation rules:
static final int MINIMUM_SUBJECT_COUNT = 1;
static final int MAXIMUM_SUBJECT_COUNT = 10;
static final int MINIMUM_MARK = 0;
static final int MAXIMUM_MARK = 100;
Meaningful constants magic numbers কমায়।
Main Menu Loop
do {
// Display and process menu
} while (menuOption != EXIT_OPTION);
do-while ব্যবহার করা হয়েছে কারণ menu অন্তত একবার display করতে হবে।
User option 3 select না করা পর্যন্ত menu repeat হবে।
Validating the Menu Option Type
if (!scanner.hasNextInt()) {
String invalidInput =
scanner.nextLine();
System.out.println(
"Invalid option: "
+ invalidInput
);
continue;
}
User integer ছাড়া অন্য text দিলে:
one
program crash না করে invalid input consume করে next menu iteration শুরু করে।
Consuming the Remaining Newline
menuOption =
scanner.nextInt();
scanner.nextLine();
nextInt() integer token পড়ে, কিন্তু Enter-এর newline রেখে দিতে পারে।
Extra:
scanner.nextLine();
remaining newline consume করে।
Non-Blank Student Name
while (true) {
studentName =
scanner
.nextLine()
.strip();
if (studentName.isBlank()) {
continue;
}
break;
}
Flow:
- Blank name হলে
continue - Valid name হলে
break
Validating the Subject Count
if (
subjectCount < MINIMUM_SUBJECT_COUNT
|| subjectCount > MAXIMUM_SUBJECT_COUNT
) {
continue;
}
Subject count range-এর বাইরে হলে same prompt আবার দেখানো হয়।
Valid হলে:
break;
validation loop শেষ করে।
Reading Multiple Marks
for (
int subjectNumber = 1;
subjectNumber <= subjectCount;
subjectNumber++
) {
// Read one valid mark
}
Subject count আগে জানা, তাই for loop suitable।
Validating Each Mark
প্রতিটি subject-এর জন্য একটি while loop ব্যবহার করা হয়েছে।
while (true) {
// Read mark
if (invalid) {
continue;
}
break;
}
Invalid mark হলে current subject-এর input আবার নেওয়া হয়।
Calculating the Total
totalMarks += mark;
Equivalent:
totalMarks =
totalMarks + mark;
totalMarks accumulator হিসেবে কাজ করে।
Finding the Highest Mark
if (mark > highestMark) {
highestMark = mark;
}
Initial value:
int highestMark = -1;
Valid mark minimum 0, তাই প্রথম valid mark অবশ্যই -1-এর চেয়ে বড়।
Finding the Lowest Mark
if (mark < lowestMark) {
lowestMark = mark;
}
Initial value:
int lowestMark = 101;
Valid mark maximum 100, তাই প্রথম valid mark অবশ্যই 101-এর চেয়ে ছোট।
Counting Passed and Failed Subjects
if (mark >= PASSING_MARK) {
passedSubjectCount++;
} else {
failedSubjectCount++;
}
প্রতিটি mark অনুযায়ী appropriate counter update হয়।
Calculating the Average
double averageMark =
totalMarks
/ (double) subjectCount;
subjectCount-কে double cast করা হয়েছে, যাতে integer division না হয়।
Without casting:
totalMarks / subjectCount
fractional result হারাতে পারত।
Determining the Final Result
boolean passedAllSubjects =
failedSubjectCount == 0;
একটিও failed subject না থাকলে:
passedAllSubjects = true
Then:
String finalResult =
passedAllSubjects
? "Passed"
: "Failed";
Determining the Grade
if (!passedAllSubjects) {
grade = "F";
} else if (averageMark >= 80) {
grade = "A";
}
Subject failure আগে check করা হয়েছে।
Student-এর high average থাকলেও একটি subject fail করলে final grade হবে:
F
Performance Message with Switch Expression
String performanceMessage =
switch (grade) {
case "A" ->
"Excellent performance";
case "B" ->
"Very good performance";
default ->
"Result unavailable";
};
Grade একটি exact category, তাই switch expression suitable।
Formatting the Average
"%.2f".formatted(
averageMark
)
Average দুই decimal place-এ দেখায়।
Example:
83.3333333333
Formatted:
83.33
Sample Run 1: Passed with Grade A
=== Grade Calculator ===
1. Calculate student result
2. View grade rules
3. Exit
Choose an option: 1
--- Student Information ---
Enter student name: Sakib
Enter number of subjects (1-10): 3
--- Enter Subject Marks ---
Enter mark for subject 1 (0-100): 90
Enter mark for subject 2 (0-100): 85
Enter mark for subject 3 (0-100): 80
=== Student Result ===
Student: Sakib
Subjects: 3
Total marks: 255 out of 300
Average mark: 85.00
Highest mark: 90
Lowest mark: 80
Passed subjects: 3
Failed subjects: 0
Grade: A
Result: Passed
Performance: Excellent performance
Sample Run 2: Failed Subject
Enter student name: Rahim
Enter number of subjects (1-10): 3
Enter mark for subject 1 (0-100): 90
Enter mark for subject 2 (0-100): 35
Enter mark for subject 3 (0-100): 85
Calculation:
Total = 210
Average = 70
Average Grade B range-এর মধ্যে হলেও একটি subject failed।
Output:
Grade: F
Result: Failed
Performance: One or more subjects were failed
Sample Run 3: Invalid Subject Count
Enter number of subjects (1-10): 0
Subject count must be between 1 and 10.
Enter number of subjects (1-10): 15
Subject count must be between 1 and 10.
Enter number of subjects (1-10): 4
Program valid value না পাওয়া পর্যন্ত repeat করবে।
Sample Run 4: Invalid Mark
Enter mark for subject 1 (0-100): 150
Mark must be between 0 and 100.
Enter mark for subject 1 (0-100): -5
Mark must be between 0 and 100.
Enter mark for subject 1 (0-100): 80
Invalid mark subject count-এর মধ্যে include হয় না।
Sample Run 5: Invalid Text Input
Choose an option: calculate
Invalid option: calculate
Enter a whole number from 1 to 3.
আরেকটি example:
Enter mark for subject 1 (0-100): eighty
Invalid mark: eighty
Enter a whole number.
Important Edge Cases
One Subject
Subject count: 1
Mark: 75
Result:
Total: 75
Average: 75.00
Highest: 75
Lowest: 75
Grade: B
Highest এবং lowest একই হবে।
Mark Exactly 40
Mark: 40
Subject passed।
Condition:
mark >= PASSING_MARK
Average Exactly 80
Average: 80.00
Grade:
A
Average Exactly 70
Grade:
B
All Marks Zero
0
0
0
Result:
Total: 0
Average: 0.00
Grade: F
Result: Failed
High Average but One Failed Subject
Marks:
100
100
39
Average:
79.67
Final:
Grade: F
Result: Failed
কারণ একটি subject-এর mark passing mark-এর কম।
Testing Checklist
Program test করুন:
- Menu option
1 - Menu option
2 - Menu option
3 - Invalid menu number
- Non-numeric menu input
- Blank student name
- Subject count
0 - Subject count
1 - Subject count
10 - Subject count
11 - Non-numeric subject count
- Mark
-1 - Mark
0 - Mark
39 - Mark
40 - Mark
79 - Mark
80 - Mark
100 - Mark
101 - Non-numeric mark
- All subjects passed
- One subject failed
- All subjects failed
- One subject only
- Same highest and lowest mark
Common Mistakes
Integer Division
Wrong:
double average =
totalMarks / subjectCount;
Correct:
double average =
totalMarks
/ (double) subjectCount;
Giving Grade Before Checking Failed Subjects
Wrong:
if (averageMark >= 80) {
grade = "A";
}
এতে একটি subject fail হলেও high average-এর কারণে Grade A হতে পারে।
Correct:
if (!passedAllSubjects) {
grade = "F";
} else if (averageMark >= 80) {
grade = "A";
}
Initializing Highest Mark to 100
Wrong:
int highestMark = 100;
তারপর কোনো mark 100-এর চেয়ে বড় না হওয়ায় value change হবে না।
Correct:
int highestMark = -1;
Initializing Lowest Mark to Zero
Wrong:
int lowestMark = 0;
Valid marks negative নয়। তাই lowest mark change নাও হতে পারে।
Correct:
int lowestMark = 101;
Forgetting to Consume Newline
menuOption =
scanner.nextInt();
String studentName =
scanner.nextLine();
studentName empty হতে পারে।
Correct:
menuOption =
scanner.nextInt();
scanner.nextLine();
Processing Invalid Marks
Wrong:
totalMarks += mark;
if (mark < 0 || mark > 100) {
continue;
}
Invalid mark already total-এর মধ্যে যোগ হয়েছে।
Correct order:
if (mark < 0 || mark > 100) {
continue;
}
totalMarks += mark;
Breaking the Wrong Loop
Mark validation-এর মধ্যে break nearest while loop শেষ করে।
while (true) {
if (validMark) {
break;
}
}
এটি outer for loop শেষ করে না।
Project Improvement Exercises
Exercise 1: Percentage
Calculate করুন:
percentage =
total marks
÷ maximum possible marks
× 100
Output:
Percentage: 85.00%
Exercise 2: Distinction Count
Mark 80 বা বেশি হলে subject distinction হিসেবে count করুন।
Output:
Distinction subjects: 2
Exercise 3: Subject Position
Highest mark কোন subject number-এ পাওয়া গেছে, track করুন।
Example:
Highest mark: 95
Highest subject: 3
Exercise 4: Lowest Subject
Lowest mark-এর subject number track করুন।
Exercise 5: Custom Passing Mark
Menu থেকে user passing mark define করতে পারবে।
Range:
1 to 100
Exercise 6: Calculate Multiple Students
এক calculation শেষ হলে জিজ্ঞাসা করুন:
Calculate another student? yes/no
yes হলে নতুন student result calculate করুন।
Exercise 7: Class Statistics
Multiple student result থেকে calculate করুন:
- Total students
- Passed students
- Failed students
- Class average
- Highest student average
Exercise 8: Grade Point
Grade অনুযায়ী grade point দিন:
| Grade | Grade Point |
|---|---|
A | 5.0 |
B | 4.0 |
C | 3.0 |
D | 2.0 |
E | 1.0 |
F | 0.0 |
Switch expression ব্যবহার করুন।
Exercise 9: Letter-Based Menu
Numeric menu-এর পরিবর্তে commands ব্যবহার করুন:
calculate
rules
exit
Input normalize করুন:
.strip()
.toLowerCase()
Exercise 10: Result Summary Text Block
Text block এবং .formatted() ব্যবহার করে complete result report তৈরি করুন।
Knowledge Check
Question 1
এই project-এ do-while কেন ব্যবহার করা হয়েছে?
Question 2
Subject marks পড়তে for loop কেন suitable?
Question 3
প্রতিটি mark validate করতে while কেন ব্যবহার করা হয়েছে?
Question 4
Invalid input হলে continue কী করে?
Question 5
Valid input পাওয়া গেলে break কী করে?
Question 6
Average calculation-এ cast প্রয়োজন কেন?
Question 7
Highest mark-এর initial value -1 কেন?
Question 8
Lowest mark-এর initial value 101 কেন?
Question 9
একটি subject fail হলে grade F কেন?
Question 10
Performance message-এর জন্য switch suitable কেন?
Question 11
hasNextInt() কী check করে?
Question 12
nextInt()-এর পরে nextLine() কেন call করা হয়েছে?
Question 13
totalMarks কী ধরনের variable?
Question 14
passedSubjectCount কীভাবে update হয়?
Question 15
Menu loop কখন শেষ হয়?
Knowledge Check Answers
Answer 1
Menu অন্তত একবার display করতে হবে এবং exit option না দেওয়া পর্যন্ত repeat করতে হবে।
Answer 2
Subject count আগে জানা থাকে।
Answer 3
একটি valid mark না পাওয়া পর্যন্ত একই subject-এর input repeat করতে হয়।
Answer 4
Current validation iteration skip করে আবার input prompt-এ যায়।
Answer 5
Nearest validation loop শেষ করে।
Answer 6
Integer division avoid করে decimal average পাওয়ার জন্য।
Answer 7
সব valid marks 0 বা তার বেশি। তাই প্রথম valid mark অবশ্যই -1-এর চেয়ে বড়।
Answer 8
সব valid marks 100 বা তার কম। তাই প্রথম valid mark অবশ্যই 101-এর চেয়ে ছোট।
Answer 9
Project rule অনুযায়ী সব subject individually pass করা বাধ্যতামূলক।
Answer 10
Grade একটি fixed exact category:
A, B, C, D, E, F
Answer 11
পরবর্তী input token valid integer কি না।
Answer 12
Integer পড়ার পর remaining newline consume করতে।
Answer 13
Accumulator।
Answer 14
Mark passing mark বা তার বেশি হলে:
passedSubjectCount++;
Answer 15
User menu option 3 select করলে।
Project Summary
এই project-এ আমরা:
- Menu-driven console application তৈরি করেছি
Scannerদিয়ে user input নিয়েছি- Numeric এবং text input validate করেছি
do-whileদিয়ে menu repeat করেছিwhileদিয়ে valid input নিশ্চিত করেছিforloop দিয়ে multiple subject marks পড়েছিcontinueদিয়ে invalid input skip করেছিbreakদিয়ে validation loop শেষ করেছি- Accumulator দিয়ে total calculate করেছি
- Highest এবং lowest mark track করেছি
- Passed এবং failed subject count করেছি
- Type casting দিয়ে decimal average calculate করেছি
if-elseদিয়ে grade determine করেছিswitchexpression দিয়ে performance message তৈরি করেছি- Formatted result report print করেছি
- Boundary এবং invalid input cases test করেছি
Next Lesson
পরবর্তী lesson হবে Module 1-এর final review:
Module Review and Exercises
আমরা review করব:
- Programming fundamentals
- Java execution
- JDK, JRE, JVM, and bytecode
- Java syntax
- Variables and constants
- Primitive data types
- Strings
- Operators
- Type conversion
- User input
- Conditional statements
- Switch
- Loops
- Break and continue
- Mixed practice problems
- Module assessment