ЛАБ 01

Програм Хангамжийн Бүтээлт

3.1 Бэлтгэл шаардлага (Requirements)

Энэ лабораторид та Java хэл дээр анхны програмаа бичиж, Software Construction-ий суурь зарчмуудыг практикт хэрэгжүүлнэ.

Шаардлагатай зүйлс:

  1. Java JDK 17+ суулгасан байх (https://adoptium.net)
  2. Eclipse IDE for Enterprise Java and Web Developers суулгасан байх (https://www.eclipse.org/downloads/packages/)
  3. Компьютер дээр интернэт холболт

3.2 Алхам 1: Java болон IDE суулгах

Java JDK суулгах:

  1. https://adoptium.net хуудас руу орно
  2. "Latest LTS Release" товч дарна
  3. Өөрийн үйлдлийн системд тохирох хувилбарыг (Windows/Mac/Linux) татна
  4. Суулгагчийг ажиллуулж, зааврын дагуу суулгана
  5. Терминал/Command Prompt нээж шалгана:
java --version   # Java хувилбар харагдах ёстой
javac --version  # Java компайлер хувилбар харагдах ёстой

Eclipse IDE суулгах:

  1. https://www.eclipse.org/downloads/packages/ хуудас руу орно
  2. "Eclipse IDE for Enterprise Java and Web Developers" хувилбарыг татна
  3. Суулгагчийг ажиллуулж, workspace фолдер сонгоно

3.3 Алхам 2: Анхны Java төсөл үүсгэх

  1. Eclipse IDE-г нээнэ
  2. File → New → Java Project сонгоно
  3. Дараах тохиргоог хийнэ:
    • Project name: SoftwareConstructionLab01
    • JRE: JavaSE-17 (суулгасан хувилбар)
    • Project layout: Create separate folders for sources and class files
  4. "Finish" дарна

3.4 Алхам 3: "Hello World" — Анхны програм

src фолдер дотор Main.java файл үүсгэж дараах кодыг бичнэ:

public class Main {                          // Main нэртэй класс зарлаж байна (програмын эхлэх цэг)
    public static void main(String[] args) { // main функц — Java програм эндээс эхэлдэг
        System.out.println("Сайн байна уу! Энэ бол миний анхны Java програм!");  // Дэлгэцэнд текст хэвлэх
    }
}

Ажиллуулах: Main.java файл дээр баруун товч → Run As → Java Application эсвэл Ctrl + F11

3.5 Алхам 4: Нарийн төвөгтэй байдлыг багасгах зарчмыг практикт хэрэгжүүлэх

Муу кодыг сайн код болгон өөрчлөх жишээ:

// ===== МУУ КОД (Нарийн төвөгтэй, ойлгоход хэцүү) =====
public class BadExample {
    public static void main(String[] args) {
        int a = 85;                           // a юу гэсэн үг вэ? Тодорхойгүй!
        if (a >= 90) {                        // 90 юу гэсэн үг вэ? Тодорхойгүй!
            System.out.println("A");
        } else if (a >= 80) {
            System.out.println("B");
        } else if (a >= 70) {
            System.out.println("C");
        } else if (a >= 60) {
            System.out.println("D");
        } else {
            System.out.println("F");
        }
    }
}

// ===== САЙН КОД (Энгийн, ойлгомжтой, стандартын дагуу) =====
public class GoodExample {

    // Тогтмол утгуудыг нэрлэсэн тогтмолд (named constant) хадгалах
    private static final int GRADE_A_THRESHOLD = 90;  // "A" үнэлгээний доод хязгаар
    private static final int GRADE_B_THRESHOLD = 80;  // "B" үнэлгээний доод хязгаар
    private static final int GRADE_C_THRESHOLD = 70;  // "C" үнэлгээний доод хязгаар
    private static final int GRADE_D_THRESHOLD = 60;  // "D" үнэлгээний доод хязгаар

    public static void main(String[] args) {
        int studentScore = 85;                         // Оюутны оноо — нэр нь утгатай
        String grade = calculateGrade(studentScore);   // Тусдаа функцэд үнэлгээ тооцуулах
        System.out.println("Үнэлгээ: " + grade);      // Үр дүнг хэвлэх
    }

    /**
     * Оюутны оноогоор үнэлгээ тооцоолох функц.
     * @param score оюутны оноо (0-100)
     * @return үнэлгээ (A, B, C, D, F)
     */
    public static String calculateGrade(int score) {   // Тусдаа функц — нэг үүрэгтэй
        if (score >= GRADE_A_THRESHOLD) return "A";    // Тогтмол ашигласан — утга тодорхой
        if (score >= GRADE_B_THRESHOLD) return "B";
        if (score >= GRADE_C_THRESHOLD) return "C";
        if (score >= GRADE_D_THRESHOLD) return "D";
        return "F";
    }
}

Юу сайжирсан бэ?

  • Хувьсагчийн нэр утгатай болсон (astudentScore)
  • Шидэт тоонууд (magic numbers) тогтмол болсон (90GRADE_A_THRESHOLD)
  • Логик тусдаа функцэд гарсан → Дахин ашиглаж болно, тестлэхэд хялбар

3.6 Алхам 5: Exception Handling практик

import java.util.Scanner;                              // Хэрэглэгчээс оролт авах сан

public class ExceptionDemo {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);       // Оролт авах объект үүсгэх

        System.out.print("Эхний тоо оруулна уу: ");
        try {                                           // Алдаа гарч болох хэсгийг try-д оруулна
            int num1 = Integer.parseInt(scanner.nextLine()); // Текстийг тоо руу хөрвүүлэх
            System.out.print("Хоёр дахь тоо оруулна уу: ");
            int num2 = Integer.parseInt(scanner.nextLine());

            int result = divide(num1, num2);            // Хуваах функцийг дуудах
            System.out.println("Үр дүн: " + result);

        } catch (NumberFormatException e) {             // Тоо биш зүйл оруулсан бол
            System.out.println("Алдаа: Зөвхөн бүхэл тоо оруулна уу!");
        } catch (ArithmeticException e) {               // Тэгд хуваасан бол
            System.out.println("Алдаа: Тэгд хуваах боломжгүй!");
        } finally {
            scanner.close();                            // Нөөцийг чөлөөлөх (үргэлж хийгдэнэ)
        }
    }

    /**
     * Хоёр тоог хуваах функц — Defensive Programming жишээ
     * @param a хуваагдагч
     * @param b хуваагч (0 байж болохгүй)
     * @return хуваалтын үр дүн
     */
    public static int divide(int a, int b) {
        if (b == 0) {                                   // Урьдчилсан нөхцөл шалгах (precondition)
            throw new ArithmeticException("Хуваагч тэг байж болохгүй");
        }
        return a / b;
    }
}

3.7 Алхам 6: Энгийн нэгж тест бичих (JUnit ашиглахгүйгээр)

public class SimpleTest {
    public static void main(String[] args) {
        // Тест 1: A үнэлгээ шалгах
        testGrade(95, "A", "Тест 1");    // 95 оноо → "A" байх ёстой

        // Тест 2: B үнэлгээ шалгах
        testGrade(85, "B", "Тест 2");    // 85 оноо → "B" байх ёстой

        // Тест 3: F үнэлгээ шалгах
        testGrade(50, "F", "Тест 3");    // 50 оноо → "F" байх ёстой

        // Тест 4: Хилийн утга шалгах (boundary)
        testGrade(90, "A", "Тест 4");    // Яг 90 → "A" байх ёстой
        testGrade(89, "B", "Тест 5");    // 89 → "B" байх ёстой

        System.out.println("Бүх тест дууслаа!");
    }

    /**
     * Тест хийх туслах функц
     * @param score шалгах оноо
     * @param expected хүлээгдэж буй үр дүн
     * @param testName тестийн нэр
     */
    public static void testGrade(int score, String expected, String testName) {
        String actual = GoodExample.calculateGrade(score);  // Бодит үр дүнг авах
        if (actual.equals(expected)) {                      // Хүлээгдэж буй ба бодит ижил үү?
            System.out.println("✅ " + testName + " ДАВЛАА");
        } else {
            System.out.println("❌ " + testName + " БҮТЭЛГҮЙ — Хүлээсэн: "
                + expected + ", Гарсан: " + actual);
        }
    }
}