Skip to content

Software-Engineering-Laboratory-Sharif/SE-Lab-5

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 

Repository files navigation

SE-Lab-5

سوال اول

برنامه را با ورودیهای 4 و 7 و 9 اجرا میکنیم و میفهمیم که تابع temp بیشترین زمان اجرا را دارد:

image

همچنین میفهمیم که تابع add بیشترین زمان اجرا را گرفته که به دلیل داینامیک بودن 'ArrayList' زیاد طول می‌کشد. همچنین به مشکل کمبود حافظه هم خوردیم.

image

بجای آنکه از آرایه داینامیک استفاده کنیم، از آرایه با اندازه ثابت استفاده می‌کنیم. چون اندازه آرایه‌ای که در این تابع وجود دارد ثابت است.

int[] a = new int[10000 * 20000];
int index = 0;
for (int i = 0; i < 10000; i++)
{
    for (int j = 0; j < 20000; j++) {
        a[index] = i + j;
        index++;
    }
}

حال میبینیم که میزان استفاده CPU و زمان اجرا خیلی بهتر شده است و اینکه به مشکل هم نخوردیم و برنامه با موفقیت اجرا می‌شود.

image image

سوال دوم

برای این سوال کدی را نوشتیم که اعداد اول از 1 تا 10000 را پیدا کند. کد زیر کد اولیه است(PrimeCalculator.java):

public class PrimeCalculator {
    public static void main(String[] args) {
        final int UPPER_LIMIT = 10000;
        printPrimeNumbers(UPPER_LIMIT);
    }

    private static void printPrimeNumbers(int upperLimit) {
        System.out.println("First prime numbers up to " + upperLimit + ":");
        for (int number = 2; number <= upperLimit; number++) {
            if (checkPrime(number)) {
                System.out.print(number + " ");
            }
        }
    }

    private static boolean checkPrime(int num) {
        if (num <= 1) return false;

        for (int i = 2; i < num; i++) {
            if (multipleFound(num, i)) return false;
        }
        return true;
    }

    private static boolean multipleFound(int num, int factor) {
        for (int j = 1; j <= factor; j++) {
            if (factor * j == num) {
                return true;
            }
        }
        return false;
    }
}

شکلهای زیر عملکرد کد را نشان می‌دهند: image image image

حال کد را به این شکل بهینه می‌کنیم که که فقط اعداد فرد را بررسی کند و اینکه تا جذر آن عدد هم بررسی می‌کنیم آیا عدد مورد نظر ما بر هیچکدام بخش پذیر است یا نه:

public class PrimeCalculator {
    public static void main(String[] args) {
        final int UPPER_LIMIT = 10000;
        printPrimeNumbers(UPPER_LIMIT);
    }

    private static void printPrimeNumbers(int upperLimit) {
        System.out.println("Prime numbers up to " + upperLimit + ":");
        for (int number = 2; number <= upperLimit; number++) {
            if (isPrime(number)) {
                System.out.print(number + " ");
            }
        }
    }

    private static boolean isPrime(int num) {
        if (num <= 1) return false;
        if (num == 2) return true;
        if (num % 2 == 0) return false;

        for (int i = 3; i * i <= num; i += 2) {
            if (num % i == 0) {
                return false;
            }
        }
        return true;
    }
}

مجدد کد را اجرا می‌کنیم و درمی‌یابیم که در میزان مصرف CPU کاهش قابل توجهی داشتیم. image image image

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages