Премини към съдържанието

Препоръчан отговор


Здравейте :) 

 

Тъй като не видях тема, да има задачи за младите програмисти, искам да основа темата точно за това.

Ако някой има задача по програмиране, не зависимо каква, моля да го сподели.

 

Целя темата да е поучителна, за тези които наистина искат да програмират, a не за тези, които искат само на готово!

 

За целта трябва задачи, който имат : 

Дадено : условието на задачата

Вход-Изход : 2-3 примера за вход и изхода на програмата ( например задачата за намиране на периметъра на триъгълник, което следва Входа му да е -> 2  3  4 (например) и Изхода: 9 )

Може и трикове и съвети за решение на задачата също така и цялото решението на задачата(сорс кода)

 

Благодария! :)

 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Здравейте :)

 

Тъй като не видях тема, да има задачи за младите програмисти, искам да основа темата точно за това.

Ако някой има задача по програмиране, не зависимо каква, моля да го сподели.

 

Целя темата да е поучителна, за тези които наистина искат да програмират, a не за тези, които искат само на готово!

 

За целта трябва задачи, който имат : 

Дадено : условието на задачата

Вход-Изход : 2-3 примера за вход и изхода на програмата ( например задачата за намиране на периметъра на триъгълник, което следва Входа му да е -> 2  3  4 (например) и Изхода: 9 )

Може и трикове и съвети за решение на задачата също така и цялото решението на задачата(сорс кода)

 

Благодария! :)

Има специална тема. И във форума не се толерира да се дават целите решения, така човека няма да научи нищо!

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Има специална тема. И във форума не се толерира да се дават целите решения, така човека няма да научи нищо!

може би аз не можах да я намерия тази тема, може ли линк

 

еми в училище не ни дават формулите и задачата и да ни казват  хайде решете така че мисля триковете и решенията че са нещо което учат, щото може да има нещо, което не  знаеш, някакъв начин за извършване на определено действие 

според мен това за начинаещите(аз също) е много добре, защото така ще натрупат опит и ще разберат програмирането много по-бързо

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

може би аз не можах да я намерия тази тема, може ли линк

 

еми в училище не ни дават формулите и задачата и да ни казват  хайде решете така че мисля триковете и решенията че са нещо което учат, щото може да има нещо, което не  знаеш, някакъв начин за извършване на определено действие 

според мен това за начинаещите(аз също) е много добре, защото така ще натрупат опит и ще разберат програмирането много по-бързо

Ааа, значи говорим за алгоритми. Ами нещо математика, числени методи не учите ли. То тези неща там се обясняват.

Иначе ако темата ще е за алгоритми й промени заглавието

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Ааа, значи говорим за алгоритми. Ами нещо математика, числени методи не учите ли. То тези неща там се обясняват.

Иначе ако темата ще е за алгоритми й промени заглавието

Може би ще е добре, освен корекция на заглавието, темата да се премести и в по - общ раздел. Тъй като алгоритмите не се обвързват с който и да е програмен език, съм по - скоро склонен да вярвам, че повечето дискусии ще са писания с псевдо-код, блок-схеми и/или чисто и просто текстови обяснения.

 

Това е просто като идея :)

 

Поздрави !

Редактирано от soundtracker (преглед на промените)

  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Може би ще е добре освен заглавието да се премести и в по - общ раздел. Тъй като алгоритмите не се обвързват с който и да е програмен език, съм по - скоро склонен да вярвам, че повечето дискусии ще са писания с псевдо-код, блок-схеми и/или чисто и просто текстови обяснения.

 

Това е просто като идея :)

 

Поздрави !

Добра идея. Аз преименувах темата, сега ще я преместя в "Други" езици поради липса на по-подходящо място :)

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

1. Намиране на Юлиянския ден по зададена грегорианска дата.

 

По определение юлиянския ден е разстоянието в дни от някоя дата до 1 януари -4712 година точно в 12 часа на обяд по юлиянския календар. Където -4712 година е математическия вариант на историческата 4713 година преди новата ера. 

 

Структура на датата по Гринуич

година

месец

ден

час

минута 

секунда

край на структурата

 

Ако месец <= 2 (януари или февруари) то месец = месец + 12 и година = година - 1

 

минута = минута + секунда / 60

час = час + минута / 60

ден = ден + час / 24

 

Грегорианска поправка

 

А = цялото число от (година / 100)

В = 2 - А + цялото число от (А / 4)

 

край на грегорианската поправка

 

Юлиянски Ден = цяло число(365.25(година + 4716)) + цяло число(30.6001(месец + 1)) + ден + B - 1524.5

 

 

2. Намиране на юлиянския ден по зададена юлиянска дата.

 

Алгоритъма е същия, с тази разлика, че не се отчита "грегорианска поправка" и в крайната формула се полага "В = 0"

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

1. Намиране на Юлиянския ден по зададена грегорианска дата.

 

....

Има едно много сериозно допълнение: датата трябва винаги да се смята базирано на локала (на ОС или експлицитно дефинирана държава или локал) защото преминаването към Грегориански календар става в различно време в различните държави (това по спомени)

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
struct GMT
{
	int year;
	int month;
	int day;
	int hour;
	int minute;
	int second;
	int weekday;
	int yearday;
}gt;

double julianday (GMT* gmt)
{
	int a;
	int b;
	double day;
	double jd;
	if (gmt->month <= 2)
	{
		gmt->month = gmt->month + 12;
		gmt->year = gmt->year - 1;
	}
	a = (gmt->year)/100;
	b = 2 - a + int(a/4);
	day = double (gmt->day) + double ((gmt->hour)/24.0) + double ((gmt->minute)/24.0/60.0) + double ((gmt->second)/24.0/60.0/60.0); 
	jd = (int)(365.25*((gmt->year) + 4716)) + (int)(30.6001*((gmt->month) + 1)) + day + b - 1524.5;	
	return jd;
}

Има едно много сериозно допълнение: датата трябва винаги да се смята базирано на локала (на ОС или експлицитно дефинирана държава или локал) защото преминаването към Грегориански календар става в различно време в различните държави (това по спомени)

 

Да, за историческите дати е различно за различните държави.

 

А иначе Папа Григорий въвежда реформата през октомври 1582 година

Редактирано от Реджеп Иведик (преглед на промените)
  • Харесва ми 2

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Вчера докато разбера как се прави на Джава скрипт, полето за въвеждане от потребителя да приема само числа, загубих доста време.

 

Алгоритъма на пръв поглед е прост.

 

1. Създава се функция, която се задейства при събитието "въвеждане на текст от потребителя".

2. Функцията извлича в променлива въведения текст.

3. Изтрива всички въведени символи различни от символите в интервала "0-9".

4. Записва така променения текст отново в полето за въвеждане.

 

И тук се опетлах. Защото, ако чакам събитието в елемента "BODY", и използвам във функцията - "event.target.value" за да извлека текста, се получава така, че процедурата се изпълнява за всички текстови полета за въвеждане, а аз искам да има такива, в които може да се въвежда и текст.

 

А думата "this" се оказа, че е много коварна в джава скрипт и не е за хора със слаби сърца. За да работи функцията правилно е необходимо "this" да се подаде като параметър, от текстовото поле, в което се чака да настъпи събитието.

<script>
function onlydigits(obj) 
{
   var a;
   var b;
   a = (obj.value);
   b = a.replace(/[^0-9]/g,"");
   obj.value = b;
}
</script>

<pre>
<form style = "float:right">
year :  <input type="text" oninput = "onlydigits(this)" id="year" />
month:  <input type="text" oninput = "onlydigits(this)" id="month" />
day:    <input type="text" oninput = "onlydigits(this)" id="day" />
hour:   <input type="text" oninput = "onlydigits(this)" id="hour" />
minute: <input type="text" oninput = "onlydigits(this)" id="minute" />
second: <input type="text" oninput = "onlydigits(this)" id="second"/>
</form>
</pre>

Видях, че има и контрол "number", но той не върши май никаква работа, само пречи. 

Редактирано от Реджеп Иведик (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

А думата "this" се оказа, че е много коварна в джава скрипт и не е за хора със слаби сърца. За да работи функцията правилно е необходимо "this" да се подаде като параметър, от текстовото поле, в което се чака да настъпи събитието.

Да, важно е да се отбележи, че за разлика от повечето ООП езици, this в javascript реферира към контекста в който се извършва даденото действие. Т.е. this във Вашите случай ще са input елементите, където се извиква функцията.

Това е свързано до някаква степен със closure-ите и ownership-овете, които идват от самия JS. Въпреки, че изглеждат доста откачени и завъртени, това спомага на JS да се пише изключително гъвкав и decoupled код (съжелявам, думата "разделен"/"отделен" на български някак не ми се връзва).

 

Поздрави !

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Изчисляване на датата на православния Великден

    делимо          делител            частно           остатък
   
    година             4                 -                а
    година             7                 -                б
    година            19                 -                в
    19*в+15           30                 -                г
2*а + 4*б – г + 34     7                 -                д
  г + д + 114         31                 е                ж

 Където "е" е номера на месеца, а "ж+1" е номера на деня. Получената дата е по юлианския
 календар и е необходимо да се поправи с григорианската поправка, която в последните 200 години
 има стойност -13, но в общия случай може да се изчисли по следния начин

 и = цяло число (година / 100)
 й = 2 - и + цяло число (и / 4)

 Когато вадим григорианската поправка, която е отрицателна, всъщност събираме и можем да
 получим число, което е по голямо от 31 за март и 30 за април съответно. За това правим 
 следните проверки:

1. Ако ден > 31 и заедно с това месец = март, тогава ден = ден - 31 и месец = април.
2. Ако ден > 30 и заедно с това месец = април, тогава ден = ден - 30 и месец = май.

Да изчислим ръчно за 2015 година
а = остатък(2015/4) = 3
б = остатък(2015/7) = 6
в = остатък(2015/19) = 1
г = остатък((19*1+15)/30) = 4
д = остатък((2*3 + 4*6 - 4 + 34)/7) = 4
е = частно((4 + 4 + 114)/31) = 3
ж = остатък((4 + 4 + 114)/31) = 29

Имаме месец = е = 3
      ден = ж + 1 = 30

Или получаваме дата 30. март по юлиянския календар. Остава да извадим григорианската поправка

и = цяло число(2015/100) = 20 
й = 2 - 20 + цяло число (20 / 4) = -18 + 5 = -13

30 - (-13) = 30 + 13 = 43 или получаваме 43. март =43 - 31 април = 12. април

Примерно решение на джава скрипт

function remainder(x,y)
{
        var z;
	var sign;
	var rem;
	z = x/y;
	sign = z/Math.abs(z);
	rem = (Math.abs(z)-Math.floor(Math.abs(z)))*Math.abs(y) + 0.01;
	rem = Math.floor(rem)*sign;
	return rem;
}

function quotient(x,y)
{
        var z;
	var sign;
	z = x/y;
	sign = z/Math.abs(z);
	return (Math.floor(Math.abs(z))*sign);
}


function calculatevelikden(year)
{
        var a,b,c,d,e,month,day,p,q;
	a = remainder(year,4);
	b = remainder(year,7);
	c = remainder(year,19);
	d = remainder(19*c+15,30);
	e = remainder(2*a + 4*b - d + 34,7);
	month = quotient(d + e + 114,31);
	day = remainder(d + e + 114,31)+1;
	if (month == 3) month = "март";
	else month = "април";
	
	//григорианска поправка
	q = Math.floor(year / 100);
        p = 2 - q + Math.floor(q / 4);
	
	if ((day-p > 31)&&(month == "март"))
	{
	    month = "април";
	    day = day-p-31;
	}
	if ((day-p > 30)&&(month == "април"))
	{
	    month = "май";
	    day = day-p-30;
	}
	document.getElementById("velikden").innerHTML = day.toString()+". "+month;
}





Редактирано от Реджеп Иведик (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Поправката dT за привеждане от универсално време UT (GMT) към динамично време DT, по принцип се определя емпирично и се публикуват таблици. Но много математици търсят зависимости в табличните данни, за да могат да съставят удобни формули за определяне на поправката за минали и бъдещи периоди и с достатъчна точност за настоящето.

 

По определение dT = DT - UT

 

Един от най добрите алгоритми за определяне на dT  е така нареченият "Канон на петте хилядолетия". Представлява няколко полиномни формули, които служат за определяне на dT за период от 5 000 години --- от 2000 година преди новата ера (- 1999 астрономическа година) до 3000 година от новата ера.

Метод на петте хилядолетия

В началото, чрез годината (year) и месецът (month) се определя числото y:

y = year + (month - 0.5) / 12

По нататък:

За годините от -1999 до -500:

u  = (y - 1820) / 100 
ΔT = -20 + 32 * u^2


За годините от -500 до +500:

u  = y / 100
ΔT = 10583.6 - 1014.41 * u + 33.78311 * u^2 - 5.952053 * u^3
   - 0.1798452 * u^4 + 0.022174192 * u^5 + 0.0090316521 * u^6


За годините от +500 до +1600:

u  = (y - 1000) / 100
ΔT = 1574.2 - 556.01 * u + 71.23472 * u^2 + 0.319781 * u^3
   - 0.8503463 * u^4 - 0.005050998 * u^5 + 0.0083572073 * u^6


За годините от +1600 до +1700:

t  = y - 1600
ΔT = 120 - 0.9808 * t - 0.01532 * t^2 + t^3 / 7129


За годините от +1700 до +1800:

t  = y - 1700
ΔT = 8.83 + 0.1603 * t - 0.0059285 * t^2 + 0.00013336 * t^3 - t^4 / 1174000

За годините от +1800 до +1860:

t  = y - 1800
ΔT = 13.72 - 0.332447 * t + 0.0068612 * t^2 + 0.0041116 * t^3 - 0.00037436 * t^4
   + 0.0000121272 * t^5 - 0.0000001699 * t^6 + 0.000000000875 * t^7


За годините от +1860 до +1900:

t  = y - 1860
ΔT = 7.62 + 0.5737 * t - 0.251754 * t^2 + 0.01680668 * t^3
   -0.0004473624 * t^4 + t^5 / 233174


За годините от +1900 до +1920:

t  = y - 1900
ΔT = -2.79 + 1.494119 * t - 0.0598939 * t^2 + 0.0061966 * t^3- 0.000197 * t^4


За годините от +1920 до +1941:

t  = y - 1920
ΔT = 21.20 + 0.84493 * t - 0.076100 * t^2 + 0.0020936 * t^3


За годините от +1941 до +1961:

t  = y - 1950
ΔT = 29.07 + 0.407 * t - t^2/233 + t^3 / 2547


За годините от +1961 до +1986:

t  = y - 1975
ΔT = 45.45 + 1.067 * t - t^2 / 260 - t^3 / 718


За годините от +1986 до +2005:

t  = y - 2000
ΔT = 63.86 + 0.3345 * t - 0.060374 * t^2 + 0.0017275 * t^3 + 0.000651814 * t^4
     + 0.00002373599 * t^5


За годините от +2005 до +2050:

t  = y - 2000
ΔT = 62.92 + 0.32217 * t + 0.005589 * t^2


За годините от +2050 до +2150:

ΔT = -20 + 32 * ((y - 1820) / 100)^2 - 0.5628 * (2150 - y)


За годините от +2150 до +3000:

u  = (y - 1820) / 100
ΔT = -20 + 32 * u^2

Джава скрипт код

function calculatedt(year,month)
{
        var y;
	var u;
	var dT;
	var temp;
	temp = document.getElementById("dT");
	y = year + (month - 0.5) / 12;
	
	if ((year >= -1999)&&(year <= -500))
	{
            u  = (y - 1820) / 100;
            dT = -20 + 32 * u*u;
	}
	else if ((year > -500)&&(year <= 500))
	{
            u  = y / 100
            dT = 10583.6 - 1014.41 * u + 33.78311 * Math.pow(u,2) 
		     - 5.952053 * Math.pow(u,3) - 0.1798452 * Math.pow(u,4) 
			 + 0.022174192 * Math.pow(u,5) + 0.0090316521 * Math.pow(u,6);
	}
	else if ((year > 500)&&(year <= 1600))
	{ 
            u  = (y - 1000) / 100;
            dT = 1574.2 - 556.01 * u + 71.23472 * Math.pow(u,2) 
		     + 0.319781 * Math.pow(u,3) - 0.8503463 * Math.pow(u,4) 
			 - 0.005050998 * Math.pow(u,5) 
			 + 0.0083572073 * Math.pow(u,6);
	}
	else if ((year > 1600)&&(year <= 1700))
	{
            u = y - 1600;
            dT = 120 - 0.9808 * u - 0.01532 * Math.pow(u,2) + Math.pow(u,3) / 7129;
        }
	else if ((year > 1700)&&(year <= 1800))
	{
	    u  = y - 1700
            dT = 8.83 + 0.1603 * u - 0.0059285 * Math.pow(u,2) 
	        + 0.00013336 * Math.pow(u,3) - Math.pow(u,4) / 1174000;
        }
	else if ((year > 1800)&&(year <= 1860))
	{
            u  = y - 1800;
            dT = 13.72 - 0.332447 * u + 0.0068612 * Math.pow(u,2)
    	        + 0.0041116 * Math.pow(u,3) - 0.00037436 * Math.pow(u,4)
                + 0.0000121272 * Math.pow(u,5) - 0.0000001699 * Math.pow(u,6)
		    + 0.000000000875 * Math.pow(u,7);
	}
	else if ((year > 1860)&&(year <= 1900))
	{
	    u = y - 1860;
            dT = 7.62 + 0.5737 * u - 0.251754 * Math.pow(u,2)
    	        + 0.01680668 * Math.pow(u,3) - 0.0004473624 * Math.pow(u,4)
		    + Math.pow(u,5) / 233174;
	}
	else if ((year > 1900)&&(year <= 1920))
	{
	    u  = y - 1900
            dT = -2.79 + 1.494119 * u - 0.0598939 * Math.pow(u,2)
    	        + 0.0061966 * Math.pow(u,3) - 0.000197 * Math.pow(u,4);
	}
	else if ((year > 1920)&&(year <= 1941))
	{
	    u  = y - 1920;
            dT = 21.20 + 0.84493 * u - 0.076100 * Math.pow(u,2)
		    + 0.0020936 * Math.pow(u,3);
		
	}
	else if ((year > 1941)&&(year <= 1961))
	{
	    u  = y - 1950;
            dT = 29.07 + 0.407 * u - Math.pow(u,2)/233
		    + Math.pow(u,3) / 2547;
        }
	else if ((year > 1961)&&(year <= 1986))
	{
            u = y - 1975;
            dT = 45.45 + 1.067 * u - Math.pow(u,2) / 260
    		- Math.pow(u,3) / 718;
        }
	else if ((year > 1986)&&(year <= 2005))
	{
            u  = y - 2000;
            dT = 63.86 + 0.3345 * u - 0.060374 * Math.pow(u,2)
    		+ 0.0017275 * Math.pow(u,3) + 0.000651814 * Math.pow(u,4)
                + 0.00002373599 * Math.pow(u,5);
   	}    
        else if ((year > 2005)&&(year <= 2050))
        {
            u  = y - 2000;
            dT = 62.92 + 0.32217 * u + 0.005589 * Math.pow(u,2);
        }
        else if ((year > 2050)&&(year <= 2150))
        {
            dT = -20 + 32 * Math.pow(((y - 1820) / 100),2) - 0.5628 * (2150 - y);
        }
        else if ((year > 2150)&&(year <= 3000))
        {
            u = (y - 1820) / 100;
            dT = -20 + 32 * Math.pow(u,2); 
        }
        else dT = "Годината е извън интервала -1999/+3000";
        temp.innerHTML = dT.toString();	
}

Редактирано от Реджеп Иведик (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Алгоритъм за изчисляване положението на слънцето - sun position algorithm SPA
 
 
Линк към алгоритъма. От този линк може да се свали пдф файл с алгоритъма и сорс код на езика С
http://rredc.nrel.gov/solar/codesandalgorithms/spa/
 
Примерно решение на Джава скрипт и ХТМЛ
 

<!DOCTYPE html>
<html>

<head>
<title>Намиране на положението на слънцето</title>
<meta charset="utf-8">
<script>
function selectone (obj)
{
    if (obj.value == "1")
	{
	    obj.focus();
		obj.select();
	}
}


function myfunction(event,obj)
{
    var x;
	x = event.keyCode;
	if ((x ==46)||(x==8)||(x==48)) selectone(obj);
}

function onlysign(obj)
{
    if (obj.value.slice(obj.value.length-1) == "-") obj.value = "-";
    else obj.value = "+";
}

function digitsandsign(obj)
{
    var a;
	var b;
	var c;
	a = obj.value;
	c = a.slice(0,1);
	b = c.replace(/[^0-9|+|-]/,"");
	c = a.slice(1,a.length);
	b = b + c.replace(/[^0-9]/g,"");
	obj.value = b
}

function digitspoint(obj)
{
    var a;
	var b;
	var c;
    a = obj.value;
    c = a.slice(0,1);
    b = c.replace(/[^0-9]/,"");
    c = a.slice(1,a.length);
	c = c.replace(/[^0-9,.]/g,"");
    if (c.indexOf(".") != c.lastIndexOf("."))
    {
        c = c.slice(0,c.lastIndexOf(".")) + c.slice(c.lastIndexOf(".") + 1, c.length);
    }
    obj.value = b + c;	
}

function signpointdigits(obj)
{
    var a,c,d;
	a = obj.value;
	c = a.slice(0,1);
	d = a.slice(1,a.length);
    c = c.replace(/[^0-9,+,-]/,"");
	d = d.replace(/[^0-9,.]/g,"");
	if (d.indexOf(".") != d.lastIndexOf("."))
    {
        d = d.slice(0,d.lastIndexOf(".")) + d.slice(d.lastIndexOf(".") + 1, d.length);
    }
	if (((c=="+")||(c=="-"))&&(d==".")) obj.value = c;
	else obj.value = c + d;
}
	

function onlydigits(obj)
{
   var a;
   var b;
   a = (obj.value);
   b = a.replace(/[^0-9]/g,"");
   obj.value = b;
   if (document.getElementById("month").value == "0") document.getElementById("month").value = "1";
   if (document.getElementById("month").value == "") document.getElementById("month").value = "1";
   if (document.getElementById("day").value == "0") document.getElementById("day").value = "1";
   if (document.getElementById("day").value == "") document.getElementById("day").value = "1";
}   
   
function northsouth(obj)
{
    if ((obj.value.slice(obj.value.length-1) == "S")||(obj.value.slice(obj.value.length-1) == "s")) obj.value = "S";
    else obj.value = "N";
}

function eastwest(obj)
{
    if ((obj.value.slice(obj.value.length-1) == "W")||(obj.value.slice(obj.value.length-1) == "w")) obj.value = "W";
    else obj.value = "E";
}

var jme,jce,jc,dt,jde,jd,ewTZ,timezone,year,month,day,hour,minute,second;
var l0,l1,l2,l3,l4,l5,l;
var b0,b1,b;
var r0,r1,r2,r3,r4,r;
var i,a,b,c;
var tita,beta;
var x = [];
var deltapsi,deltaepsilon;
var dpsi = [];
var depsilon = [];
var U, epsilon, epsilon0;
var dtau, lambda;
var niu0,niu,alfa;
var aziA,aziN;
var pi = 3.1415926535898;
var suma;
var delta;
var h,hp;
var ksi,u,hiks,igrek,alfap,dalfa,oe;
var deltap;
var e0,e,de,P,T,zenith;
var I,gama,omega;
var M,E;
var l0a = [
	0,
175347046,
0,
0,
1,
3341656,
4.6692568,
6283.07585,
2,
34894,
4.6261,
12566.1517,
3,
3497,
2.7441,
5753.3849,
4,
3418,
2.8289,
3.5231,
5,
3136,
3.6277,
77713.7715,
6,
2676,
4.4181,
7860.4194,
7,
2343,
6.1352,
3930.2097,
8,
1324,
0.7425,
11506.7698,
9,
1273,
2.0371,
529.691,
10,
1199,
1.1096,
1577.3435,
11,
990,
5.233,
5884.927,
12,
902,
2.045,
26.298,
13,
857,
3.508,
398.149,
14,
780,
1.179,
5223.694,
15,
753,
2.533,
5507.553,
16,
505,
4.583,
18849.228,
17,
492,
4.205,
775.523,
18,
357,
2.92,
0.067,
19,
317,
5.849,
11790.629,
20,
284,
1.899,
796.298,
21,
271,
0.315,
10977.079,
22,
243,
0.345,
5486.778,
23,
206,
4.806,
2544.314,
24,
205,
1.869,
5573.143,
25,
202,
2.458,
6069.777,
26,
156,
0.833,
213.299,
27,
132,
3.411,
2942.463,
28,
126,
1.083,
20.775,
29,
115,
0.645,
0.98,
30,
103,
0.636,
4694.003,
31,
102,
0.976,
15720.839,
32,
102,
4.267,
7.114,
33,
99,
6.21,
2146.17,
34,
98,
0.68,
155.42,
35,
86,
5.98,
161000.69,
36,
85,
1.3,
6275.96,
37,
85,
3.67,
71430.7,
38,
80,
1.81,
17260.15,
39,
79,
3.04,
12036.46,
40,
75,
1.76,
5088.63,
41,
74,
3.5,
3154.69,
42,
74,
4.68,
801.82,
43,
70,
0.83,
9437.76,
44,
62,
3.98,
8827.39,
45,
61,
1.82,
7084.9,
46,
57,
2.78,
6286.6,
47,
56,
4.39,
14143.5,
48,
56,
3.47,
6279.55,
49,
52,
0.19,
12139.55,
50,
52,
1.33,
1748.02,
51,
51,
0.28,
5856.48,
52,
49,
0.49,
1194.45,
53,
41,
5.37,
8429.24,
54,
41,
2.4,
19651.05,
55,
39,
6.17,
10447.39,
56,
37,
6.04,
10213.29,
57,
37,
2.57,
1059.38,
58,
36,
1.71,
2352.87,
59,
36,
1.78,
6812.77,
60,
33,
0.59,
17789.85,
61,
30,
0.44,
83996.85,
62,
30,
2.74,
1349.87,
63,
25,
3.16,
4690.48];
var l1a = [0,
628331966747,
0,
0,
1,
206059,
2.678235,
6283.07585,
2,
4303,
2.6351,
12566.1517,
3,
425,
1.59,
3.523,
4,
119,
5.796,
26.298,
5,
109,
2.966,
1577.344,
6,
93,
2.59,
18849.23,
7,
72,
1.14,
529.69,
8,
68,
1.87,
398.15,
9,
67,
4.41,
5507.55,
10,
59,
2.89,
5223.69,
11,
56,
2.17,
155.42,
12,
45,
0.4,
796.3,
13,
36,
0.47,
775.52,
14,
29,
2.65,
7.11,
15,
21,
5.34,
0.98,
16,
19,
1.85,
5486.78,
17,
19,
4.97,
213.3,
18,
17,
2.99,
6275.96,
19,
16,
0.03,
2544.31,
20,
16,
1.43,
2146.17,
21,
15,
1.21,
10977.08,
22,
12,
2.83,
1748.02,
23,
12,
3.26,
5088.63,
24,
12,
5.27,
1194.45,
25,
12,
2.08,
4694,
26,
11,
0.77,
553.57,
27,
10,
1.3,
6286.6,
28,
10,
4.24,
1349.87,
29,
9,
2.7,
242.73,
30,
9,
5.64,
951.72,
31,
8,
5.3,
2352.87,
32,
6,
2.65,
9437.76,
33,
6,
4.67,
4690.48];
var l2a = [
0,
52919,
0,
0,
1,
8720,
1.0721,
6283.0758,
2,
309,
0.867,
12566.152,
3,
27,
0.05,
3.52,
4,
16,
5.19,
26.3,
5,
16,
3.68,
155.42,
6,
10,
0.76,
18849.23,
7,
9,
2.06,
77713.77,
8,
7,
0.83,
775.52,
9,
5,
4.66,
1577.34,
10,
4,
1.03,
7.11,
11,
4,
3.44,
5573.14,
12,
3,
5.14,
796.3,
13,
3,
6.05,
5507.55,
14,
3,
1.19,
242.73,
15,
3,
6.12,
529.69,
16,
3,
0.31,
398.15,
17,
3,
2.28,
553.57,
18,
2,
4.38,
5223.69,
19,
2,
3.75,
0.98];
var l3a = [
	0,
289,
5.844,
6283.076,
1,
35,
0,
0,
2,
17,
5.49,
12566.15,
3,
3,
5.2,
155.42,
4,
1,
4.72,
3.52,
5,
1,
5.3,
18849.23,
6,
1,
5.97,
242.73];
var l4a = [
0,
114,
3.142,
0,
1,
8,
4.13,
6283.08,
2,
1,
3.84,
12566.15];
var b0a = [0,
280,
3.199,
84334.662,
1,
102,
5.422,
5507.553,
2,
80,
3.88,
5223.69,
3,
44,
3.7,
2352.87,
4,
32,
4,
1577.34];
var b1a = [0,
9,
3.9,
5507.55,
1,
6,
1.73,
5223.69];
var r0a = [0,
100013989,
0,
0,
1,
1670700,
3.0984635,
6283.07585,
2,
13956,
3.05525,
12566.1517,
3,
3084,
5.1985,
77713.7715,
4,
1628,
1.1739,
5753.3849,
5,
1576,
2.8469,
7860.4194,
6,
925,
5.453,
11506.77,
7,
542,
4.564,
3930.21,
8,
472,
3.661,
5884.927,
9,
346,
0.964,
5507.553,
10,
329,
5.9,
5223.694,
11,
307,
0.299,
5573.143,
12,
243,
4.273,
11790.629,
13,
212,
5.847,
1577.344,
14,
186,
5.022,
10977.079,
15,
175,
3.012,
18849.228,
16,
110,
5.055,
5486.778,
17,
98,
0.89,
6069.78,
18,
86,
5.69,
15720.84,
19,
86,
1.27,
161000.69,
20,
65,
0.27,
17260.15,
21,
63,
0.92,
529.69,
22,
57,
2.01,
83996.85,
23,
56,
5.24,
71430.7,
24,
49,
3.25,
2544.31,
25,
47,
2.58,
775.52,
26,
45,
5.54,
9437.76,
27,
43,
6.01,
6275.96,
28,
39,
5.36,
4694,
29,
38,
2.39,
8827.39,
30,
37,
0.83,
19651.05,
31,
37,
4.9,
12139.55,
32,
36,
1.67,
12036.46,
33,
35,
1.84,
2942.46,
34,
33,
0.24,
7084.9,
35,
32,
0.18,
5088.63,
36,
32,
1.78,
398.15,
37,
28,
1.21,
6286.6,
38,
28,
1.9,
6279.55,
39,
26,
4.59,
10447.39];
var r1a = [0,
103019,
1.10749,
6283.07585,
1,
1721,
1.0644,
12566.1517,
2,
702,
3.142,
0,
3,
32,
1.02,
18849.23,
4,
31,
2.84,
5507.55,
5,
25,
1.32,
5223.69,
6,
18,
1.42,
1577.34,
7,
10,
5.91,
10977.08,
8,
9,
1.42,
6275.96,
9,
9,
0.27,
5486.78];
var r2a = [0,
4359,
5.7846,
6283.0758,
1,
124,
5.579,
12566.152,
2,
12,
3.14,
0,
3,
9,
3.63,
77713.77,
4,
6,
1.87,
5573.14,
5,
3,
5.47,
18849.23];
r3a = [0,
145,
4.273,
6283.076,
1,
7,
3.92,
12566.15];
var y = [0,
0,
0,
0,
1,
-171996,
-174.2,
92025,
8.9,
-2,
0,
0,
2,
2,
-13187,
-1.6,
5736,
-3.1,
0,
0,
0,
2,
2,
-2274,
-0.2,
977,
-0.5,
0,
0,
0,
0,
2,
2062,
0.2,
-895,
0.5,
0,
1,
0,
0,
0,
1426,
-3.4,
54,
-0.1,
0,
0,
1,
0,
0,
712,
0.1,
-7,
0,
-2,
1,
0,
2,
2,
-517,
1.2,
224,
-0.6,
0,
0,
0,
2,
1,
-386,
-0.4,
200,
0,
0,
0,
1,
2,
2,
-301,
0,
129,
-0.1,
-2,
-1,
0,
2,
2,
217,
-0.5,
-95,
0.3,
-2,
0,
1,
0,
0,
-158,
0,
0,
0,
-2,
0,
0,
2,
1,
129,
0.1,
-70,
0,
0,
0,
-1,
2,
2,
123,
0,
-53,
0,
2,
0,
0,
0,
0,
63,
0,
0,
0,
0,
0,
1,
0,
1,
63,
0.1,
-33,
0,
2,
0,
-1,
2,
2,
-59,
0,
26,
0,
0,
0,
-1,
0,
1,
-58,
-0.1,
32,
0,
0,
0,
1,
2,
1,
-51,
0,
27,
0,
-2,
0,
2,
0,
0,
48,
0,
0,
0,
0,
0,
-2,
2,
1,
46,
0,
-24,
0,
2,
0,
0,
2,
2,
-38,
0,
16,
0,
0,
0,
2,
2,
2,
-31,
0,
13,
0,
0,
0,
2,
0,
0,
29,
0,
0,
0,
-2,
0,
1,
2,
2,
29,
0,
-12,
0,
0,
0,
0,
2,
0,
26,
0,
0,
0,
-2,
0,
0,
2,
0,
-22,
0,
0,
0,
0,
0,
-1,
2,
1,
21,
0,
-10,
0,
0,
2,
0,
0,
0,
17,
-0.1,
0,
0,
2,
0,
-1,
0,
1,
16,
0,
-8,
0,
-2,
2,
0,
2,
2,
-16,
0.1,
7,
0,
0,
1,
0,
0,
1,
-15,
0,
9,
0,
-2,
0,
1,
0,
1,
-13,
0,
7,
0,
0,
-1,
0,
0,
1,
-12,
0,
6,
0,
0,
0,
2,
-2,
0,
11,
0,
0,
0,
2,
0,
-1,
2,
1,
-10,
0,
5,
0,
2,
0,
1,
2,
2,
-8,
0,
3,
0,
0,
1,
0,
2,
2,
7,
0,
-3,
0,
-2,
1,
1,
0,
0,
-7,
0,
0,
0,
0,
-1,
0,
2,
2,
-7,
0,
3,
0,
2,
0,
0,
2,
1,
-7,
0,
3,
0,
2,
0,
1,
0,
0,
6,
0,
0,
0,
-2,
0,
2,
2,
2,
6,
0,
-3,
0,
-2,
0,
1,
2,
1,
6,
0,
-3,
0,
2,
0,
-2,
0,
1,
-6,
0,
3,
0,
2,
0,
0,
0,
1,
-6,
0,
3,
0,
0,
-1,
1,
0,
0,
5,
0,
0,
0,
-2,
-1,
0,
2,
1,
-5,
0,
3,
0,
-2,
0,
0,
0,
1,
-5,
0,
3,
0,
0,
0,
2,
2,
1,
-5,
0,
3,
0,
-2,
0,
2,
0,
1,
4,
0,
0,
0,
-2,
1,
0,
2,
1,
4,
0,
0,
0,
0,
0,
1,
-2,
0,
4,
0,
0,
0,
-1,
0,
1,
0,
0,
-4,
0,
0,
0,
-2,
1,
0,
0,
0,
-4,
0,
0,
0,
1,
0,
0,
0,
0,
-4,
0,
0,
0,
0,
0,
1,
2,
0,
3,
0,
0,
0,
0,
0,
-2,
2,
2,
-3,
0,
0,
0,
-1,
-1,
1,
0,
0,
-3,
0,
0,
0,
0,
1,
1,
0,
0,
-3,
0,
0,
0,
0,
-1,
1,
2,
2,
-3,
0,
0,
0,
2,
-1,
-1,
2,
2,
-3,
0,
0,
0,
0,
0,
3,
2,
2,
-3,
0,
0,
0,
2,
-1,
0,
2,
2,
-3,
0,
0,
0];    
    

function calculateHeliocentricEarthLongitude()
{
    for (i = 0; i <= 63*4; i = i + 4)
	{
	    a = i+1;
		b = i+2;
		c = i+3;
		l0a[i] = l0a[a]*Math.cos(l0a[b] + l0a[c]*jme);
	}
	l0 = 0;
	for (i = 0; i <= 63*4; i = i + 4)
	{
	    l0 = l0 + l0a[i];
	}
	for (i = 0; i <= 33*4; i = i + 4)
	{
	    a = i+1;
		b = i+2;
		c = i+3;
		l1a[i] = l1a[a]*Math.cos(l1a[b] + l1a[c]*jme);
	}
	l1 = 0;
	for (i = 0; i <= 33*4; i = i + 4)
	{
	    l1 = l1 + l1a[i];
	}
    for (i = 0; i <= 19*4; i = i + 4)
	{
	    a = i+1;
		b = i+2;
		c = i+3;
		l2a[i] = l2a[a]*Math.cos(l2a[b] + l2a[c]*jme);
	}
	l2 = 0;
	for (i = 0; i <= 19*4; i = i + 4)
	{
	    l2 = l2 + l2a[i];
	}
    for (i = 0; i <= 6*4; i = i + 4)
	{
	    a = i+1;
		b = i+2;
		c = i+3;
		l3a[i] = l3a[a]*Math.cos(l3a[b] + l3a[c]*jme);
	}
	l3 = 0;
	for (i = 0; i <= 6*4; i = i + 4)
	{
	    l3 = l3 + l3a[i];
	}
    for (i = 0; i <= 2*4; i = i + 4)
	{
	    a = i+1;
		b = i+2;
		c = i+3;
		l4a[i] = l4a[a]*Math.cos(l4a[b] + l4a[c]*jme);
	}
	l4 = 0;
	for (i = 0; i <= 2*4; i = i + 4)
	{
	    l4 = l4 + l4a[i];
	}
    l5 = Math.cos(3.14);
    l = (l0 + l1*jme + l2*Math.pow(jme,2) + l3*Math.pow(jme,3) + l4*Math.pow(jme,4) + l5*Math.pow(jme,5))/Math.pow(10,8);
	l = l * 180 / 3.1415926535898;
	if (l >= 0) l = (l / 360 - Math.floor(l / 360)) * 360;	 
	else l = 360 + (l / 360 - Math.ceil(l / 360)) * 360;
}


function calculateHeliocentricEarthLatitude()
{
    for (i = 0; i <= 4*4; i = i + 4)
	{
	    a = i+1;
		b = i+2;
		c = i+3;
		b0a[i] = b0a[a]*Math.cos(b0a[b] + b0a[c]*jme);
	}
	b0 = 0;
	for (i = 0; i <= 4*4; i = i + 4)
	{
	    b0 = b0 + b0a[i];
	}
    for (i = 0; i <= 1*4; i = i + 4)
	{
	    a = i+1;
		b = i+2;
		c = i+3;
		b1a[i] = b1a[a]*Math.cos(b1a[b] + b1a[c]*jme);
	}
	b1 = 0;
	for (i = 0; i <= 1*4; i = i + 4)
	{
	    b1 = b1 + b1a[i];
	}
    b = (b0 + b1*jme)/Math.pow(10,8);
	b = b * 180 / 3.1415926535898;
}


function calculateEarthRadiusVector()
{
  for (i = 0; i <= 39*4; i = i + 4)
	{
	    a = i+1;
		b = i+2;
		c = i+3;
		r0a[i] = r0a[a]*Math.cos(r0a[b] + r0a[c]*jme);
	}
	r0 = 0;
	for (i = 0; i <= 39*4; i = i + 4)
	{
	    r0 = r0 + r0a[i];
	}
    for (i = 0; i <= 9*4; i = i + 4)
	{
	    a = i+1;
		b = i+2;
		c = i+3;
		r1a[i] = r1a[a]*Math.cos(r1a[b] + r1a[c]*jme);
	}
	r1 = 0;
	for (i = 0; i <= 9*4; i = i + 4)
	{
	    r1 = r1 + r1a[i];
	}
    for (i = 0; i <= 5*4; i = i + 4)
	{
	    a = i+1;
		b = i+2;
		c = i+3;
		r2a[i] = r2a[a]*Math.cos(r2a[b] + r2a[c]*jme);
	}
	r2 = 0;
	for (i = 0; i <= 5*4; i = i + 4)
	{
	    r2 = r2 + r2a[i];
	}
    for (i = 0; i <= 4; i = i + 4)
	{
	    a = i+1;
		b = i+2;
		c = i+3;
		r3a[i] = r3a[a]*Math.cos(r3a[b] + r3a[c]*jme);
	}
	r3 = 0;
	for (i = 0; i <= 4; i = i + 4)
	{
	    r3 = r3 + r3a[i];
	}
    r4 = 4*Math.cos(2.56 + 6283.08*jme);
    r = (r0 + r1*jme + r2*Math.pow(jme,2) + r3*Math.pow(jme,3) + r4*Math.pow(jme,4))/Math.pow(10,8);
}

function calculateSunGeocentricLatitude()
{
	beta = - (Number(document.getElementById("b").value))
}

function calculateSunGeocentricLongitude()
{
    tita = l + 180;
	if (tita > 360) tita = tita - 360; 
}

function NutationInLongitudeAndObliquity()
{
    x[0] = 297.85036 + 445267.111480 * jce - 0.0019142 * Math.pow(jce,2) + Math.pow(jce,3)/189474;
	x[1] = 357.52772 + 35999.050340 * jce - 0.0001603 * Math.pow(jce,2) - Math.pow(jce,3)/300000;
	x[2] = 134.96298 + 477198.867398 * jce + 0.0086972 * Math.pow(jce,2) + Math.pow(jce,3)/56250;
    x[3] = 93.27191 + 483202.017538 * jce - 0.0036825 * Math.pow(jce,2) + Math.pow(jce,3)/327270;
	x[4] = 125.04452 - 1934.136261 * jce + 0.0020708 * Math.pow(jce,2) + Math.pow(jce,3)/450000;
	for (i = 0; i <= 62*9; i = i + 9)
    {
        suma = x[0]*y[i] + x[1]*y[i+1] + x[2]*y[i+2]+ x[3]*y[i+3]+ x[4]*y[i+4];
		suma = suma*3.1415926535898/180;
		dpsi[i/9] = (y[i+5]+y[i+6]*jce)*Math.sin(suma);
		depsilon[i/9] = (y[i+7]+y[i+8]*jce)*Math.cos(suma);
    }
    deltapsi = 0;
    deltaepsilon = 0;
    for (i = 0; i <= 62; i++)
    {
        deltapsi = deltapsi + dpsi[i];
		deltaepsilon = deltaepsilon + depsilon[i];
    }
    deltapsi = deltapsi / 36000000;
    deltaepsilon = deltaepsilon / 36000000;	
}

function calculateTrueObliquity()
{
    U = jme / 10;
	epsilon0 = 84381.448 - 4680.93*U +
	         1.55*Math.pow(U,2) + 1999.25*Math.pow(U,3) -
			 51.38*Math.pow(U,4) - 249.67*Math.pow(U,5) -
			 39.05*Math.pow(U,6) + 7.12*Math.pow(U,7) +
			 27.87*Math.pow(U,8) + 5.79*Math.pow(U,9) +
			 2.45*Math.pow(U,10);
	epsilon = epsilon0/3600 + deltaepsilon;		
}


function calculateApparentSunLongitude()
{
    dtau = -20.4898/3600/r;
	lambda = tita + deltapsi + dtau;
}

function GeocentricRightAscension()
{
    niu0 = 280.46061837 + 
	     360.98564736629*(jd-2451545) +
         0.000387933*Math.pow(jc,2) -
         Math.pow(jc,3)/38710000;
	if (niu0 >= 0) niu0 = (niu0 / 360 - Math.floor(niu0 / 360)) * 360;	 
	else niu0 = 360 + (niu0 / 360 - Math.ceil(niu0 / 360)) * 360;	
    niu = niu0 + deltapsi*Math.cos(epsilon*pi/180);
    alfa = Math.atan2(Math.sin(lambda*pi/180)*Math.cos(epsilon*pi/180) -
	       Math.tan(beta*pi/180)*Math.sin(epsilon*pi/180), Math.cos(lambda*pi/180));
    alfa = alfa*180/pi;
    if (alfa < 0) alfa = alfa + 360;
}


function calculateGeocentricDeclination()
{
    delta = Math.asin(Math.sin(beta*pi/180)*Math.cos(epsilon*pi/180) + 
	       Math.cos(beta*pi/180)*Math.sin(epsilon*pi/180)*Math.sin(lambda*pi/180));
	delta = delta*180/pi;
}


function calculateLHA()
{
    h = niu + longitude - alfa;
	if (h >= 0) h = (h / 360 - Math.floor(h / 360)) * 360;	 
	else h = 360 + (h / 360 - Math.ceil(h / 360)) * 360;
}

function topocentricRightAscension()
{
    ksi = 8.794/3600/r;
	u = Math.atan(0.99664719*Math.tan(latitude*pi/180));
	hiks = Math.cos(u) + oe*Math.cos(latitude*pi/180)/6378140;
	igrek = 0.99664719*Math.sin(u)+
	       oe*Math.sin(latitude*pi/180)/6378140;
	dalfa = Math.atan2(-hiks*Math.sin(ksi*pi/180)*Math.sin(h*pi/180),
          Math.cos(delta*pi/180)-
		  hiks*Math.sin(ksi*pi/180)*Math.cos(h*pi/180));
	dalfa = dalfa*180/pi;
    alfap = alfa + dalfa;
}


function topocentricDeclination()
{
    deltap = Math.atan2((Math.sin(delta*pi/180) -
	        igrek*Math.sin(ksi*pi/180))*Math.cos(dalfa*pi/180),
            Math.cos(delta*pi/180) -
			hiks*Math.sin(ksi*pi/180)*Math.cos(h*pi/180));
    deltap = deltap*180/pi;			
}

function topocentricLHA()
{
    hp = h - dalfa;
}


function calculateZenith()
{
    e0 = Math.asin(Math.sin(latitude*pi/180)*Math.sin(deltap*pi/180) +
       	Math.cos(latitude*pi/180)*Math.cos(deltap*pi/180)*Math.cos(hp*pi/180));
	e0 = e0*180/pi;
    de = (P*283*1.02)/(1010*(273+T)*60*Math.tan((e0+10.3/(e0+5.11))*pi/180));	
	e = e0 + de;
    if (e<0) e = e0;
    zenith = 90 - e;
}


function navigationAzimuth()
{
    aziA = Math.atan2(Math.sin(hp*pi/180),(Math.cos(hp*pi/180)*Math.sin(latitude*pi/180) -
		 Math.tan(deltap*pi/180)*Math.cos(latitude*pi/180)));
	aziA = aziA*180/pi;
	aziN = aziA + 180;
    if (aziA < 0) aziA = aziA +360;
}


function incidenceAngle()
{
    I = Math.acos(Math.cos(zenith*pi/180)*Math.cos(omega*pi/180) +
	    Math.sin(zenith*pi/180)*Math.sin(omega*pi/180)*
	    Math.cos((aziA - gama)*pi/180));
	I = I*180/pi;
}


function equationOfTime()
{
    M = 280.4664567 +
	   360007.6982779*jme +
	   0.03032028*Math.pow(jme,2) +
	   Math.pow(jme,3)/49931 -
	   Math.pow(jme,4)/15300 -
	   Math.pow(jme,5)/2000000;
	if (M >= 0) M = (M / 360 - Math.floor(M / 360)) * 360;	 
	else M = 360 + (M / 360 - Math.ceil(M / 360)) * 360;
	E = M - 0.0057183 - alfa +
        deltapsi*Math.cos(epsilon*pi/180);
    E = E * 4;
}

function calculatedt(year,month)
{
    var y;
	var u;
	var dT;
	y = year + (month - 0.5) / 12;
	if ((year >= -1999)&&(year <= -500))
	{
        u  = (y - 1820) / 100;
        dT = -20 + 32 * u*u;
	}
	else if ((year > -500)&&(year <= 500))
	{
        u  = y / 100
        dT = 10583.6 - 1014.41 * u + 33.78311 * Math.pow(u,2) 
		     - 5.952053 * Math.pow(u,3) - 0.1798452 * Math.pow(u,4) 
			 + 0.022174192 * Math.pow(u,5) + 0.0090316521 * Math.pow(u,6);
	}
	else if ((year > 500)&&(year <= 1600))
	{ 
        u  = (y - 1000) / 100;
        dT = 1574.2 - 556.01 * u + 71.23472 * Math.pow(u,2) 
		     + 0.319781 * Math.pow(u,3) - 0.8503463 * Math.pow(u,4) 
			 - 0.005050998 * Math.pow(u,5) 
			 + 0.0083572073 * Math.pow(u,6);
	}
	else if ((year > 1600)&&(year <= 1700))
	{
        u = y - 1600;
        dT = 120 - 0.9808 * u - 0.01532 * Math.pow(u,2) + Math.pow(u,3) / 7129;
    }
	else if ((year > 1700)&&(year <= 1800))
	{
	    u  = y - 1700
        dT = 8.83 + 0.1603 * u - 0.0059285 * Math.pow(u,2) 
	        + 0.00013336 * Math.pow(u,3) - Math.pow(u,4) / 1174000;
    
    }
	else if ((year > 1800)&&(year <= 1860))
	{
    u  = y - 1800;
        dT = 13.72 - 0.332447 * u + 0.0068612 * Math.pow(u,2)
    	    + 0.0041116 * Math.pow(u,3) - 0.00037436 * Math.pow(u,4)
            + 0.0000121272 * Math.pow(u,5) - 0.0000001699 * Math.pow(u,6)
		    + 0.000000000875 * Math.pow(u,7);
	}
	else if ((year > 1860)&&(year <= 1900))
	{
	    u = y - 1860;
        dT = 7.62 + 0.5737 * u - 0.251754 * Math.pow(u,2)
    	    + 0.01680668 * Math.pow(u,3) - 0.0004473624 * Math.pow(u,4)
		    + Math.pow(u,5) / 233174;
	}
	else if ((year > 1900)&&(year <= 1920))
	{
	    u  = y - 1900
        dT = -2.79 + 1.494119 * u - 0.0598939 * Math.pow(u,2)
    	    + 0.0061966 * Math.pow(u,3) - 0.000197 * Math.pow(u,4);
	}
	else if ((year > 1920)&&(year <= 1941))
	{
	    u  = y - 1920;
        dT = 21.20 + 0.84493 * u - 0.076100 * Math.pow(u,2)
		    + 0.0020936 * Math.pow(u,3);
		
	}
	else if ((year > 1941)&&(year <= 1961))
	{
	    u  = y - 1950;
        dT = 29.07 + 0.407 * u - Math.pow(u,2)/233
		    + Math.pow(u,3) / 2547;
    }
	else if ((year > 1961)&&(year <= 1986))
	{
        u = y - 1975;
        dT = 45.45 + 1.067 * u - Math.pow(u,2) / 260
    		- Math.pow(u,3) / 718;
        
    }
	else if ((year > 1986)&&(year <= 2005))
	{
        u  = y - 2000;
        dT = 63.86 + 0.3345 * u - 0.060374 * Math.pow(u,2)
    		+ 0.0017275 * Math.pow(u,3) + 0.000651814 * Math.pow(u,4)
            + 0.00002373599 * Math.pow(u,5);
   	}   
    else if ((year > 2005)&&(year <= 2050))
	{
        u  = y - 2000;
        dT = 62.92 + 0.32217 * u + 0.005589 * Math.pow(u,2);
    }
    else if ((year > 2050)&&(year <= 2150))
	{
        dT = -20 + 32 * Math.pow(((y - 1820) / 100),2) - 0.5628 * (2150 - y);
	}
    else if ((year > 2150)&&(year <= 3000))
	{
        u = (y - 1820) / 100;
        dT = -20 + 32 * Math.pow(u,2); 
	}
	return dT;
}


function tranzitRizeSet()
{
    var niu0UT;
	var alfa0,alfam1,alfap1,delta0,deltam1,deltap1;
	var m0,m1,m2;
	var h0;
	var niu0,niu1,niu2;
	var n0,n1,n2;
	var alfapr0,alfapr1,alfapr2,deltapr0,deltapr1,deltapr2,a,b,c,ap,bp,cp;
	var hp0,hp1,hp2;
	var hash0,hash1,hash2;
	var T,R,S;
	var th, tm, ts, rh, rm, rs, sh, sm, ss;
    hour = 0;
	minute = 0;
	second = 0;
	calculate();
	niu0UT = niu;
	second = second-dt;
	calculate();
	alfa0 = alfa;
	delta0 = delta;
	day = day - 1;
	calculate();
	alfam1 = alfa;
	deltam1 = delta;
	day = day + 2;
	calculate();
	alfap1 = alfa;
	deltap1 = delta;
	m0 = (alfa0 - longitude - niu0UT)/360;
	h0 = Math.acos((Math.sin(-0.8333*pi/180) - Math.sin(latitude*pi/180)*
	   Math.sin(delta0*pi/180)) / Math.cos(latitude*pi/180)/Math.cos(delta0*pi/180));
	h0 = h0*180/pi;
    if (h0 >= 0) h0 = (h0 / 180 - Math.floor(h0 / 180)) * 180;	 
	else h0 = 180 + (h0 / 180 - Math.ceil(h0 / 180)) * 180;	
	m1 = m0 - h0/360;
	m2 = m0 + h0/360;
	if (m0 >= 0) m0 = (m0 - Math.floor(m0));	 
	else m0 = 1 + (m0 - Math.ceil(m0));
	if (m1 >= 0) m1 = (m1 - Math.floor(m1));	 
	else m1 = 1 + (m1 - Math.ceil(m1));
	if (m2 >= 0) m2 = (m2 - Math.floor(m2));	 
	else m2 = 1 + (m2 - Math.ceil(m2));
	T = m0;
	R = m1;
	S = m2;
	th = Math.floor(T*24);
	tm = Math.floor((T*24-th)*60);
	ts = Math.floor(((T*24-th)*60-tm)*60);
	document.getElementById("T").value = th.toString()+":"+tm.toString()+":"+ts.toString();
	rh = Math.floor(R*24);
	rm = Math.floor((R*24-rh)*60);
	rs = Math.floor(((R*24-rh)*60-rm)*60);
	document.getElementById("R").value = rh.toString()+":"+rm.toString()+":"+rs.toString();
	sh = Math.floor(S*24);
	sm = Math.floor((S*24-sh)*60);
	ss = Math.floor(((S*24-sh)*60-sm)*60);
	document.getElementById("S").value = sh.toString()+":"+sm.toString()+":"+ss.toString();
}


function calculate1()
{
    longitude = Number(document.getElementById("longsec").value)/3600;
	longitude = longitude + Number(document.getElementById("longmin").value)/60;
	longitude = longitude + Number(document.getElementById("longdeg").value);
	if (document.getElementById("ew").value == "W") longitude = longitude*(- 1);
	latitude = Number(document.getElementById("latsec").value)/3600;
	latitude = latitude + Number(document.getElementById("latmin").value)/60;
	latitude = latitude + Number(document.getElementById("latdeg").value);
	if (document.getElementById("ns").value == "S") latitude = latitude*(- 1);
	year = Number(document.getElementById("year").value);  
    month = Number(document.getElementById("month").value);
	day = Number(document.getElementById("day").value);
	hour = Number(document.getElementById("hour").value);
	minute = Number(document.getElementById("minute").value);
	second = Number(document.getElementById("second").value);
	omega = Number(document.getElementById("slope").value);
	gama = Number(document.getElementById("slopeazi").value);
	P = Number(document.getElementById("pressure").value);
	T = Number(document.getElementById("temperature").value);
	oe = Number(document.getElementById("abovesea").value);
	timezone = Number(document.getElementById("TZ").value);
	ewTZ = document.getElementById("ewTZ").value;
	if (ewTZ == "W") timezone = timezone*(-1);
	hour = hour - timezone;
	if (hour >= 24)
    {
        hour = hour - 24;
		day = day + 1;
    }	
	else if (hour < 0)
    {
        hour = hour + 24;
		day = day - 1; 
    }	
	jd = julian1582 (year, month, day, hour, minute, second);
	document.getElementById("jd").value = jd.toString();
	dt = calculatedt(year,month);
	document.getElementById("dt").value = dt.toString();
	jde = jd + dt / 86400;
	jc = (jd - 2451545) / 36525;
	jce = (jde - 2451545) / 36525;
	jme = jce / 10;	
	calculateHeliocentricEarthLongitude();
	document.getElementById("l").value = l.toString();
	calculateHeliocentricEarthLatitude();
	document.getElementById("b").value = b.toString();
    calculateEarthRadiusVector();
	document.getElementById("r").value = r.toString();
	calculateSunGeocentricLatitude();
	calculateSunGeocentricLongitude();
	document.getElementById("beta").value = beta.toString();
	document.getElementById("tita").value = tita.toString();
	NutationInLongitudeAndObliquity();
	document.getElementById("deltapsi").value =  deltapsi.toString();         
	document.getElementById("deltaepsilon").value = deltaepsilon.toString();
	calculateTrueObliquity();
	document.getElementById("epsilon").value = epsilon.toString();
	calculateApparentSunLongitude();
	document.getElementById("lambda").value = lambda.toString();
	GeocentricRightAscension();
	document.getElementById("alfa").value = alfa.toString();
	calculateGeocentricDeclination();
	document.getElementById("delta").value = delta.toString();
	calculateLHA();
	document.getElementById("h").value = h.toString();
	topocentricRightAscension();
	document.getElementById("alfap").value = alfap.toString();
	topocentricDeclination();
	document.getElementById("deltap").value = deltap.toString();
	topocentricLHA();
	document.getElementById("hp").value = hp.toString();
	calculateZenith();
	document.getElementById("zenith").value = zenith.toString();
	navigationAzimuth();
	document.getElementById("aziN").value = aziN.toString();
	incidenceAngle();
	equationOfTime();
	document.getElementById("E").value = E.toString(); 
	document.getElementById("M").value = M.toString();
    tranzitRizeSet();	
}

function calculate()
{
    jd = julian1582 (year, month, day, hour, minute, second);
	jde = jd + dt / 86400;
	jc = (jd - 2451545) / 36525;
	jce = (jde - 2451545) / 36525;
	jme = jce / 10;	
	calculateHeliocentricEarthLongitude();
	calculateHeliocentricEarthLatitude();
	calculateEarthRadiusVector();
	calculateSunGeocentricLatitude();
	calculateSunGeocentricLongitude();
	NutationInLongitudeAndObliquity();
	calculateTrueObliquity();
	calculateApparentSunLongitude();
	GeocentricRightAscension();
	calculateGeocentricDeclination();
	calculateLHA();
	topocentricRightAscension();
	topocentricDeclination();
	topocentricLHA();
	calculateZenith();
	navigationAzimuth();
	incidenceAngle();
	equationOfTime();
}


function julianday (year, month, day, hour, minute, second)
{
    var a;
    var b;	
	var jd;
    if (month <= 2)
	{
        month = month + 12;
		year = year - 1;
    }
	day = day + hour/24 + minute/60/24 + second/60/60/24;
    a = Math.floor(year/100);
    b = 2 - a + Math.floor(a / 4);
    jd = Math.floor(365.25*(year + 4716)) + Math.floor(30.6001*(month + 1)) + day + b - 1524.5;	
	return jd;
}

function julianjulian (year, month, day, hour, minute, second)
{
    var jd;
    if (month <= 2)
	{
        month = month + 12;
		year = year - 1;
    }
	day = day + hour/24 + minute/60/24 + second/60/60/24;
    jd = Math.floor(365.25*(year + 4716)) + Math.floor(30.6001*(month + 1)) + day - 1524.5;	
	return jd;
}

function julian1582 (year, month, day, hour, minute, second)
{
    if (year > 1582) return (julianday (year, month, day, hour, minute, second));
	if (year < 1582) return (julianjulian (year, month, day, hour, minute, second));
	if (month > 10) return (julianday (year, month, day, hour, minute, second));
	if (month < 10) return (julianjulian (year, month, day, hour, minute, second));
	if (day >= 15) return (julianday (year, month, day, hour, minute, second));
	else return (julianjulian (year, month, day, hour, minute, second));
}

</script>
</head>
               
<body>
<h1>Изчисляване на положението на слънцето по метода SPA </h1>
<table width = 100%>
<tr>
<td width = 60%>
<pre>
<form style = "float:right;">
                                       година: <input type="text" onblur = "calculate1()" oninput = "digitsandsign(this)" id="year" style = "width:15%; text-align:center;"/>
                                        месец: <input type="text" value = "1" onblur = "calculate1()" oninput = "onlydigits(this)" onkeyup="myfunction(event, this)" onfocus = "selectone(this)" id="month" style = "width:15%; text-align:center;"/>
                                          ден: <input type="text" value = "1" onblur = "calculate1()" oninput = "onlydigits(this)" onkeyup="myfunction(event, this)" onfocus = "selectone(this)" id="day" style = "width:15%; text-align:center;"/>
                                          час: <input type="text" onblur = "calculate1()" oninput = "onlydigits(this)" id="hour" style = "width:15%; text-align:center;"/>
                                       минута: <input type="text" onblur = "calculate1()" oninput = "onlydigits(this)" id="minute" style = "width:15%; text-align:center;"/>
                                      секунда: <input type="text" onblur = "calculate1()" oninput = "onlydigits(this)" id="second" style = "width:15%; text-align:center;"/>
                    географска ширина градуси: <input type="text" onblur = "calculate1()" oninput = "digitspoint(this)" id="latdeg" style = "width:15%; text-align:center;"/>
                                       минути: <input type="text" onblur = "calculate1()" oninput = "digitspoint(this)" id="latmin" style = "width:15%; text-align:center;"/>
                                      секунди: <input type="text" onblur = "calculate1()" oninput = "digitspoint(this)" id="latsec" style = "width:15%; text-align:center;"/>
                             север / юг N / S: <input type="text" onblur = "calculate1()" oninput = "northsouth(this)" id="ns" style = "width:15%; text-align:center;"/>
                   географска дължина градуси: <input type="text" onblur = "calculate1()" oninput = "digitspoint(this)" id="longdeg" style = "width:15%; text-align:center;"/>
                                       минути: <input type="text" onblur = "calculate1()" oninput = "digitspoint(this)" id="longmin" style = "width:15%; text-align:center;"/>
                                      секунди: <input type="text" onblur = "calculate1()" oninput = "digitspoint(this)" id="longsec" style = "width:15%; text-align:center;"/>
                          изток / запад E / W: <input type="text" onblur = "calculate1()" oninput = "eastwest(this)" id="ew" style = "width:15%; text-align:center;"/> 
                                  часови пояс: <input type="text" onblur = "calculate1()" oninput = "digitspoint(this)" id="TZ" style = "width:15%; text-align:center;"/>
                            часови пояс E / W: <input type="text" onblur = "calculate1()" oninput = "eastwest(this)" id="ewTZ" style = "width:15%; text-align:center;"/> 
                     надморска височина метри: <input type="text" onblur = "calculate1()" oninput = "signpointdigits(this)" id="abovesea" style = "width:15%; text-align:center;"/>
                     наклон на склона градуси: <input type="text" onblur = "calculate1()" oninput = "digitspoint(this)" id="slope" style = "width:15%; text-align:center;"/>
                            налягане милибари: <input type="text" onblur = "calculate1()" oninput = "digitspoint(this)" id="pressure" style = "width:15%; text-align:center;"/>
                        температура по Целзий: <input type="text" onblur = "calculate1()" oninput = "digitspoint(this)" id="temperature" style = "width:15%; text-align:center;"/>
                          азимут на склона гр: <input type="text" onblur = "calculate1()" oninput = "signpointdigits(this)" id="slopeazi" style = "width:15%; text-align:center;"/>
   разлика между времевите скали dT в секунди: <input type="text" id = "dt" readonly />
                                 юлиански ден: <input type="text" id = "jd" readonly />
     хелиоцентрична дължина на Земята градуси: <input type="text" id = "l" readonly />
      хелиоцентрична ширина на Земята градуси: <input type="text" id = "b" readonly />
       радиус вектор в астрономически единици: <input type="text" id = "r" readonly />
   геоцентрична дължина на слънцето в градуси: <input type="text" id = "tita" readonly />
    геоцентрична ширина на слънцето в градуси: <input type="text" id = "beta" readonly />
             поправка на дължината за нутация: <input type="text" id = "deltapsi" readonly />
поправка на наклона на еклиптиката за нутация: <input type="text" id = "deltaepsilon" readonly />
               истински наклон на еклиптиката: <input type="text" id = "epsilon" readonly />
                   видима дължина на слънцето: <input type="text" id = "lambda" readonly />
     геоцентрично право изгряване на слънцето: <input type="text" id = "alfa" readonly />
           геоцентрично склонение на слънцето: <input type="text" id = "delta" readonly />
            местен часови ъгъл на наблюдателя: <input type="text" id = "h" readonly />
    топоцентрично право изгряване на слънцето: <input type="text" id = "alfap" readonly />
          топоцентрично склонение на слънцето: <input type="text" id = "deltap" readonly />
             топоцентричен местен часови ъгъл: <input type="text" id = "hp" readonly />
                   топоцентричен зенитен ъгъл: <input type="text" id = "zenith" readonly />
                          навигационен азимут: <input type="text" id = "aziN" readonly />
                   дължина на средното слънце: <input type="text" id = "M" readonly />
                         уравнение на времето: <input type="text" id = "E" readonly /> 
                            дневна кулминация: <input type="text" id = "T" readonly />
                                       изгрев: <input type="text" id = "R" readonly />
                                        залез: <input type="text" id = "S" readonly /> 
</form>
</pre>
</td>
<td width = 40%>
</td>
</tr>
</table>
</body>
</html>

Редактирано от Реджеп Иведик (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Да, важно е да се отбележи, че за разлика от повечето ООП езици, this в javascript реферира към контекста в който се извършва даденото действие. Т.е. this във Вашите случай ще са input елементите, където се извиква функцията.

Това е свързано до някаква степен със closure-ите и ownership-овете, които идват от самия JS. Въпреки, че изглеждат доста откачени и завъртени, това спомага на JS да се пише изключително гъвкав и decoupled код (съжелявам, думата "разделен"/"отделен" на български някак не ми се връзва).

 

Поздрави !

 

Не съвсем. this в JS зависи от това как е извикана дадена функция, не от контектста в който се извиква. 

За пример: 

var obj = {
    f : function() {
        return this;
    }
};

console.log(obj.f() === obj); //true

var f = obj.f;
console.log(f() === obj); //false 

Ако някой е заинтересован как всичко това работи в дълбочина да погледне Reference Type в ECMAScript. 

 

В случая на автора, this сочи към input елементите защото като се реализира събитието вътрешно се извиква хендлъра като нещо такова: 

obj.oninput(); 
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)

Вчера четох за алгоритми в нета. Оказа се, че моя си алгоритъм, дето съм си го измислил и си го ползвам за намиране на минималното и максималното число в несортиран масив е много по бърз и от най бързите, които предлагат по сайтовете.

 

За това ще го издам на всеослушание.

#include <stdio.h>

int main()
{
        int myarray [5] = { 4, 3, 1, 2, 5 };
	int minnumber, maxnumber, indexmaxnumber, indexminnumber;
	int i;
	if (myarray[0] > myarray[1])
	{
		maxnumber = myarray[0];
		indexmaxnumber = 0;
		minnumber = myarray[1];
		indexminnumber = 1;
	}
	else
	{
		maxnumber = myarray[1];
		indexmaxnumber = 1;
		minnumber = myarray[0];
		indexminnumber = 0;
	}
	i = 2;
	while (true)
	{
	    if (myarray[i] > maxnumber)
	    {
		    maxnumber = myarray[i];
		    indexmaxnumber = i;
		    i++;
		    if (i >= 5) break;
		    continue;
	    }
	    if (myarray[i] < minnumber)
	    {
		    minnumber = myarray[i];
		    indexminnumber = i;
		    i++;
		    if (i >= 5) break;
		    continue;
	    }
	    i++;
	    if (i >= 5) break;
	    continue;
	}
	printf("\nminnumber = %u\tindexminnumber = %u\tmaxnumber = %u\tindexmaxnumber = %u\t",minnumber,indexminnumber,maxnumber,indexmaxnumber);
	return 0;
}
Редактирано от Реджеп Иведик (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)

аз щото съм Тома Неверни взех че го проверих с колко точно е много по-бърз

това ми беше тестовата прогама

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int NUM[]={1000000, 10000000, 100000000};

int ultrafast(int myarray[], int n) {
	int minnumber, maxnumber, indexmaxnumber, indexminnumber;
	int i;
	if (myarray[0] > myarray[1])
	{
		maxnumber = myarray[0];
		indexmaxnumber = 0;
		minnumber = myarray[1];
		indexminnumber = 1;
	}
	else
	{
		maxnumber = myarray[1];
		indexmaxnumber = 1;
		minnumber = myarray[0];
		indexminnumber = 0;
	}
	i = 2;
	while (1)
	{
	    if (myarray[i] > maxnumber)
	    {
		    maxnumber = myarray[i];
		    indexmaxnumber = i;
		    i++;
		    if (i >= n) break;
		    continue;
	    }
	    if (myarray[i] < minnumber)
	    {
		    minnumber = myarray[i];
		    indexminnumber = i;
		    i++;
		    if (i >= n) break;
		    continue;
	    }
	    i++;
	    if (i >= n) break;
	    continue;
	}
	printf("\nultra fast min = %d [%d]\tmax = %d [%d]",minnumber,indexminnumber,maxnumber,indexmaxnumber);
	return 0;
}

int normal(int arr[], int n) {
    int mx, nx, mi, ni, i;
    mx=arr[0]; mi=0;
    nx=arr[0]; ni=0;
    for (i=1; i<n; i++) {
        if (arr[i]>mx) {
            mx=arr[i];
            mi=i;
            continue;
        }
        if (arr[i]<nx) {
            nx=arr[i];
            ni=i;
        }
    }
    printf("\nnormal     min = %d [%d]\tmax = %d [%d]",nx,ni,mx,mi);
	return 0;
}

int random(int arr[], int n) {
    int i;

    for (i=0; i<n; i++) 
        arr[i]=(rand()*4096+rand())%n;
    return 0;
}

int main() {
    clock_t timer;
    int i, n, *array;
    
    array = (int *) malloc(NUM[2]*sizeof(int));
    srand(time(NULL));
    for (i=0; i<3; i++) {
        n = NUM[i];
        printf("\nArray size %d", n);
        random(array, n);
        timer=clock();
        ultrafast(array, n);
        timer=clock()-timer;
        printf("\ttime = %d", timer);
        
        timer=clock();
        normal(array, n);
        timer=clock()-timer;
        printf("\ttime = %d", timer);
    }
    free(array);
}

резултатите:

Array size 1000000
ultra fast min = 0 [191021]     max = 999998 [112424]   time = 1
normal     min = 0 [191021]     max = 999998 [112424]   time = 1
Array size 10000000
ultra fast min = 0 [617536]     max = 9999999 [4022275] time = 10
normal     min = 0 [617536]     max = 9999999 [4022275] time = 10
Array size 100000000
ultra fast min = 3 [16557593]   max = 99999999 [11122455]       time = 102
normal     min = 3 [16557593]   max = 99999999 [11122455]       time = 102
Редактирано от ined (преглед на промените)
  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)

int ultrafast(int myarray[], int n) {

Това се казва именуване :lol6:

П.П. К'ва е таз любов към continue, какво му е лошото на else if?

П.П2. random функцията ти нещо прелива ми се струва.

Редактирано от flare (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

На мен лично горната "оптимизация" ми се струва доста безмислена след като не променя time complexity. Ако трябва многократно да се търси минимален/максимален елемент в променяща се структура от данни, то тогава далече по-добре е да се ползва heap, където времето за намиране на минимален/максимален е O(1) а добавянето/изтриването е O(log N).  

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Много ясно, че ще са еднакви резултатите, какъв е смисъла изобщо да се тества със същата програма, само че написана по нечетливо.

 

Намери по бърз да видим 

Сподели този отговор


Линк към този отговор
Сподели в други сайтове
публикувано (редактирано)

Търсене на позицията на зададено число в сортиран масив по двоичния метод. Методът се нарича двоичен, тъй като поради подредеността на масива, като се извърши проверка със средния елемент, на практика се проверява изведнъж половината от масива. След това в цикъл се проверява на половината половината докато накрая се стигне до позицията на числото и функцията върне индекса на който това число трябва да се вмъкне за да си остане масива подреден, ако останалите по големи или равни числа се преместят с едно нагоре.

#include <stdio.h>

int findplace(int number, int minindex, int maxindex, int* aptr ) // the sorted array is between minindex and maxindex
{
	int midindex;                            // current average = (current minindex + current Maxindex)/2
	int minindexp = minindex;                // store the initial values of minindex and maxindex
	int maxindexp = maxindex;
	while (true)
	{
		midindex = (minindex + maxindex)/2;    // find the index of the middle array member
		if (midindex == minindex)              // check for the end of searching and doing the final stuff
		{
			if (number <= aptr[minindex])
			{
				return (minindex);
			}
			else
			{
				if (number <= aptr[maxindex])
				{
					return (maxindex);
				}
				else
				{
					return (maxindex + 1);
				}
			}
		}
		if (number > aptr[midindex])        // if the value is bigger, continue checking with the middle of 
		{                                    // the upper half
			minindex = midindex;
		}
		else if (number == aptr[midindex])
		{
			return (midindex);
		}
		else                                 // if the value is smaller, continue checking with the middle of
		{                                    // the lower half
			maxindex = midindex;
		}
		
	}
}

int main()
{
	int myarray[10] = {2,4,6,8,10,12,14,16,18,20};
	int n;
	scanf("%u",&n);
	printf("\n%u",findplace(n,0,9,myarray));
	return 0;
} 
Редактирано от Реджеп Иведик (преглед на промените)

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

 

Търсене на позицията на въведено число в сортиран масив по двоичния метод. Методът се нарича двоичен, тъй като поради подредеността на масива, като се извърши проверка със средния елемент, на практика се проверява изведнъж половината от масива. След това в цикъл се проверява на половината половината докато накрая се стигне до позицията на числото и функцията върне индекса на който това число трябва да се вмъкне за да си остане масива подреден, ако останалите по големи или равни числа се преместят с едно нагоре.

Една идея. Вместо делене по средата ползвай делете в златно сечение. По спомени така алгоритъма става по-бърз :)

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Една идея. Вместо делене по средата ползвай делете в златно сечение. По спомени така алгоритъма става по-бърз :)

 

Това си е premature optimization отвсякъде. Ако му трябва по-бързо търсене от двоичното, определено няма да ползва таква структура от данни. Хеш таблица с O(1) lookup е моя фаворит в случая. За стрингове може да ползва още по-просто решение като prefix tree. 

  • Харесва ми 1

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Това си е premature optimization отвсякъде. Ако му трябва по-бързо търсене от двоичното, определено няма да ползва таква структура от данни. Хеш таблица с O(1) lookup е моя фаворит в случая. За стрингове може да ползва още по-просто решение като prefix tree. 

Възможно е, не съм се занимавал с подобни алгоритми поне 30-тина години. Но в предложените от вас имам чувството че има друга особеност. И двата предполагат наличието на допълнителна памет. Така че при конкретно приложение на алгоритмите може да бъде избран по-бавния алгоритъм заради по-консервативно използване на паметта

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Възможно е, не съм се занимавал с подобни алгоритми поне 30-тина години. Но в предложените от вас имам чувството че има друга особеност. И двата предполагат наличието на допълнителна памет. Така че при конкретно приложение на алгоритмите може да бъде избран по-бавния алгоритъм заради по-консервативно използване на паметта

 

Така е. Може ли да си говорим на ти, че някак си дискусията го предполага. 

Всеки път когато чета подобна тема се сещам за "The Elements Of Programming Style". Там хората казваха нещо много ценно, че ако трябва да се правят оптимизации, то ако не може да се подобри сложността на алгоритъма почти винаги е безмислено. В случая с деление на златното сечение, за big O няма особено голямо значение. Сложността ще си остане O(log N) тъй като константните стойности се игнорират. 

Като цяло в алгоритмите и структурите от данни, няма silver bullet и универсално решение. Всичко е до преценка на програмиста. В случая на хеш таблицата не е задължително да се използва безразборно количество памет. Много зависи от хеширащия алгоритъм. За prefix tree си прав, но това е една от структурите, които са много подценявани а имат невероятно бърз достъп до елементите.

 

Относно двоичното търсене, в стандартната библиотека на C има bsearch, който е много удобен. Проблема като цяло на този тип структури е добавянето на нови елементи. В масив това би било с O(N) време. Хубав аналог на двоичното търсене в масив е BST, където и добавянето е с O(log N) освен ако дървото не се е изродило в свързан списък. Въобще двоичното търсене е един от любимите ми алгоритми, който илюстрира техниката разделяй и владей, но си идва с недостатъците. В сериозни приложения трябва да се имат предвид тези неща и ако се държи на двоично търсене с минамелен разход на памет, то тогава червено-черно дърво е един от много подходящите подходи.  

Сподели този отговор


Линк към този отговор
Сподели в други сайтове

Регистрирайте се или влезете в профила си за да коментирате

Трябва да имате регистрация за да може да коментирате това

Регистрирайте се

Създайте нова регистрация в нашия форум. Лесно е!

Нова регистрация

Вход

Имате регистрация? Влезте от тук.

Вход

  • Разглеждащи това в момента   0 потребители

    Няма регистрирани потребители разглеждащи тази страница.

  • Горещи теми в момента

  • Подобни теми

    • от Chris Panov
      Здравейте, 
      В момента пиша една програма, в която в една от функциите ми се налага да излезна по-рано при определено условие. Функцията връща string впрочем.
      Ето кодът:
       
      #include "stdafx.h" #include <iostream> #include <string> #include <sstream> #include <vector> #define CONSOLE_LOG(x) std::cout << x #define COMMAND_END command[0] #define COMMAND_SUM command[1] #define COMMAND_SUBTRACT command[2] #define COMMAND_CONCAT command[3] #define COMMAND_DISCARD command[4] #define COMMAND_DISPSEQ command[5] template <typename T> void top_back(std::vector<T>& v) {     v.erase(v.end() - 1); } std::string sum(std::string& x, std::string& y, std::vector<std::string>& vec) {     int xInt = atoi(x.c_str());     int yInt = atoi(y.c_str());     int result = xInt + yInt;     std::ostringstream os;     std::string strResult;     os << result;     strResult = os.str();     top_back(vec);     top_back(vec);     return strResult; } std::string subtract(std::string& x, std::string& y, std::vector<std::string>& vec) {     int xInt = atoi(x.c_str());     int yInt = atoi(y.c_str());     int result = xInt - yInt;     std::ostringstream os;     std::string strResult;     os << result;     strResult = os.str();     top_back(vec);     top_back(vec);     return strResult; } std::string concat(std::string& x, std::string& y, std::vector<std::string>& vec) {     if (atoi(x.c_str()) < 0)     {         return;     }     else {         std::string concatStr = y + x;         top_back(vec);         top_back(vec);         return concatStr;     } } void dispseq(std::vector<std::string>& vec) {     std::vector<std::string>::const_iterator iter;     for (iter = vec.begin(); iter != vec.end(); iter++)     {         std::cout << *iter << std::endl;     } } void enterSequence() {     std::vector<std::string> command =     {         "end",         "sum",         "subtract",         "concat",         "discard",         "dispseq"     };     std::vector<std::string> sequence;     std::string input;     std::string a;     std::string b;     do     {         std::cin >> input;         sequence.emplace_back(input);         if (input == COMMAND_END)         {              top_back(sequence);         }         if (input == COMMAND_SUM)         {             top_back(sequence);             a = sequence[sequence.size() - 1];             b = sequence[sequence.size() - 2];             sequence.emplace_back(sum(a, b, sequence));         }         if (input == COMMAND_SUBTRACT)         {             top_back(sequence);             a = sequence[sequence.size() - 1];             b = sequence[sequence.size() - 2];             sequence.emplace_back(subtract(a, b, sequence));         }         if (input == COMMAND_CONCAT)         {             top_back(sequence);             a = sequence[sequence.size() - 1];             b = sequence[sequence.size() - 2];             sequence.emplace_back(concat(a, b, sequence));         }         if (input == COMMAND_DISCARD)         {             top_back(sequence);             top_back(sequence);         }         if (input == COMMAND_DISPSEQ)         {             top_back(sequence);             dispseq(sequence);         }     } while (input != COMMAND_END); } int main() {     enterSequence();     std::cin.get();     std::cin.get();     return 0; } И ето проблемната функция:
       
      std::string concat(std::string& x, std::string& y, std::vector<std::string>& vec) {     if (atoi(x.c_str()) < 0)     {         return;     }     else {         std::string concatStr = y + x;         top_back(vec);         top_back(vec);         return concatStr;     } }  
      Както виждате ако стрингът x(който естествено го превръщам в интиджър) е по-малък от 0, теоритично трябва да излезна от функцията, и това е единственият начин за който се сетих, с return;, обаче пък компилаторът иска функцията да връща стойност, понеже е от тип стринг.
      Как да съчетая двете? - да връща стринг ако всичко е по план, и да излиза ако е по-малко от 0.
    • от Chris Panov
      Здравейте,
      В момента имам сериозен проблем със взимането на броят на елементи в даден вектор.
      vec.size(); и  
      sizeof(vec) / sizeof(vec[0]); не работят. Програмата те пита за брой ключове за даден тест, въвеждаш ключовете, после въвеждаш и отговорите, които са били дадени, и програмата ги сравнява и в зависимост от това колко верни отговори имаш ти дава точки. Ключовете и дадените отговори са тип char. ("A", "B", "C" etc.)
      Ето го и кода, като повечето съм го направил на коментар за да си тествам само функцията която извежда броя на елементите.
      #include "stdafx.h" #include <iostream> #include <vector> #define CONSOLE_LOG(x) std::cout << x; std::vector<char> keys = {'A', 'B', 'C', 'D', 'E'}; std::vector<char> studentAnswers; int n, points = 0; char key, answer; template <typename T> T vecSize(std::vector<T>& vec) { T size = vec.size(); return size; } /* template <typename T1> void enterKeys(std::vector<T1>& k) { CONSOLE_LOG("Please enter the number of keys: "); std::cin >> n; for (int i = 0, counter = 1; i < n, counter <= n; i++, counter++) { CONSOLE_LOG("Key " << counter << ": "); std::cin >> key; k.emplace_back(key); } } template <typename T2> void enterAnswers(std::vector<T2>& stAns) { for (int i = 0, counter = 1; i < n, counter <= n; i++, counter++) { CONSOLE_LOG("Answer " << counter << ": "); std::cin >> answer; stAns.emplace_back(answer); } } template <typename T3> void getGrade(std::vector<T3>& x, std::vector<T3>& y) { for (int i = 0; i < n; i++) { if (x[i] == y[i]) { points++; } } CONSOLE_LOG("Points: " << points); } */ int main() { /* enterKeys(keys); enterAnswers(studentAnswers); getGrade(studentAnswers, keys); */ std::cout << keys.size() << std::endl; std::cout << vecSize(keys) << std::endl; std::cin.get(); std::cin.get(); std::cin.get(); return 0; } Опитах всевъзможни начини, и пак не става. Идеята е да заместя n променливата със броя на елементите от вектора. Програмата върви по един и същи начин, защото все пак в n променливата запазваме големината на вектора, но бих искал да си го направя с функция.
      Както виждате на края на програмата си извеждам тестове. Първият, който си е по конвенционалният метод си работи сам по себе си, но пък във for цикъл не бачка.
      А вторият е функцията която съм направил. Проблемът е че ми извежда непознат символ - "�"
      Проблемът е че типът на елементите във вектора е char, защото като го направих с int тип си работеше както трябва.
      Бих бил изключително благодарен ако някой може да ме насочи и да ми бутне едно рамо :)
    • от Goshko
      Да се напише програма, която създава структура "Book" като имате следните полета - Title(заглавието на книгата), Автор(Author), Цена(Price) и уникален номер на книгата(ISBN-num). Да се ваведе цяло число n и след него n на брой данни за ученика. Да се изведе на монитора данните за книгата с цена по-висока от предварително зададена.
    • от Нели Николова
      Здравейте, имам две готови задачи, но не мога да ги компилирам. Дали може да ги проверите?
      зад.1 Да се състави програма, която да сортира едномерен масив от цели числа тип short  с име X състоящ се от 19 елемента. Сортирането да се извърши във възходящ ред чрез метода пряка селекция.
      #include <iostream>
      using namespace std;
      void sortAsc(short[]);
      int main() {
          short x[] = {123,13,23,31,1,55,36,17,8,9,10,11,6,12,14,15,16,35,184,19};
           
          sortAsc(x);
          
          return 0;
      }
      void sortAsc(short x[]){
          for(short i = 0; i < 19 ; i++) {
              for(short j = i; j < 19; j++) {
                  if(x[j] < x) {
                      swap(x[j], x);
                  }
              }    
          }
          
          for(int i=0; i<19; i++)
          {
              cout << x << endl;
          }
      }
      зад. 2 Да се състави програма,която реализира динамичен стек от реални числа тип float. Стекът да се преобразува в два нови стека, един стек P за четните и един стек O за нечетните числа от стек едно. Стековете да се извеждат на екрана.
      int main() {
          stack<float>numbers;
          stack<float>p;
          stack<float>o;
          
          for(short i = 1; i <= 200; i++) {
              numbers.push(i);
          }  
          
          numbers.push(200.64);
          numbers.push(203.34);
          
          while(!numbers.empty()) {
              int number = numbers.top();
              
              if (number % 2 == 0) {
                  p.push(number);
              } else {
                  o.push(number);
              }
              numbers.pop();
          }
          
          cout << "EVEN NUMBERS:" << endl;
          
          while(!p.empty()) {
              cout << p.top() << endl;
              p.pop();
          }
          
          cout << "ODD NUMBERS:" << endl;
          
          while(!o.empty()) {
              cout << o.top() << endl;
              o.pop();
          }
          
      }
      Много Ви благодаря :)
       
    • от Georgi Kirchev
      Здравейте имам да предам курсова работа утре ,но не мога да я реша , ще бъда изключително благодарен ако може някой да ми помогне.

      Дефинирайте клас Телевизор, който да е родител на клас Самсунг и клас Сони. Клас Телевизор да има цена и брой продадени за година в сектор private. Класовете Самсунг и Сони да имат в сектор public функции за определяне на общата сума от продажби за година (цена * брой продадени за година). Всички класове да имат конструктори по подразбиране.
       
      Благодаря предварително !
  • Дарение

×

Информация

Поставихме бисквитки на устройството ви за най-добро потребителско изживяване. Можете да промените настройките си за бисквитки, или в противен случай приемаме, че сте съгласни с нашите условия за ползване.