Премини към съдържанието
Форумът в приложение

По-лесно сърфиране. Научи повече.

Kaldata.com - Форуми

Приложение на форума на цял екран с push известия, значки и други.

За да инсталирате това приложение на iOS и iPadOS
  1. Докоснете Иконата за споделяне в Safari
  2. Превъртете менюто и докоснете Добавяне към началния екран.
  3. Докоснете Добавяне в горния десен ъгъл.
За да инсталирате това приложение на Android
  1. Докоснете менюто с 3 точки (⋮) в горния десен ъгъл на браузъра.
  2. Докоснете Добавяне към началния екран или Инсталиране на приложение.
  3. Потвърдете, като докоснете Инсталиране.

Добре дошли!

Добре дошли в нашите форуми, пълни с полезна информация. Имате проблем с компютъра или телефона си? Публикувайте нова тема и ще намерите решение на всичките си проблеми. Общувайте свободно и открийте безброй нови приятели.

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

 

Алгоритми в програмирането

Featured Replies

Май нещо много не си наясно що е това алгоритъм.

Но ако се пробваш да напишеш abs() метод, който да връща по-голямата стойност без да прави сравнение, може и да споделиш един алгоритъм без да разбереш, че си го направил. :P

 

Такива алгоритми са много подходящи за тази тема. :)

Преди по-сложните алгоритми може да се почне с по-базисните, като например итерацията - твоят пример плаче за някое друго цикълче. ;)

 

 

В този JavaScript пътеката до файлът не може ли да се задава директно в конструктора да се спести малко писане?

Не съм още про, за да знам дали мога с конструктор да ги направя, а за цикъл ако имаш идея как да задавам различни сорсове моля те сподели. ;)

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

  • Отговори 74
  • Прегледи 6,6k
  • Създадено
  • Последен отговор

 

5.Напишете програма, която чете от конзолата две цели числа и отпечатва по-голямото от тях. Реализирайте програмата без използва­нето на сравнение. Забележка: задачата изисква малко да помислите!

class mistake
{
    public static void main(String[] args) 
	{
		java.util.Scanner sc = new java.util.Scanner(System.in);
		System.out.print("\nInput the first integer: ");
		int a = sc.nextInt();
		System.out.print("\nInput the second integer: ");
		int b = sc.nextInt();
		a = (java.lang.Math.abs(a - b) + a + b) / 2;
		System.out.println("\nThe bigger number is " + a);
	}
}

Първо в даденият пример е използвано сравнение и второ не работи при задаване на определени числа поради ясни причини. Което прави задачата или условието грешни.

 

 

1. Посочи кои числа ?

 

2. Ако посочиш поне две, значи си прав. Е, разбира се без да предизвикваш препълване на типа.

 

3. Без сравнение е невъзможно да се определи, кое е по голямо, но нищо не пречи да приемем абсолютната стойност за даденост и да не се задълбочаваме в това, как се изчислява.

 

4. Иначе е некоректно да се предлагат на студентите нерешими задачи, като се дават грешни упътвания за решението им, все едно задачата е решима.

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

 

Аз създадох алгоритъм за галерия и искам да я споделя, но е още бъгава. Писана е на Javascript, jQuery. Някой може ли да я погледне и да даде мнение как да си подобри или промени?

 

Аз лично не видях защо ти трябва jQuery, освен за функцията ready().

 

Ето как се прави с чист JavaScript:

// работи за IE9+
function ready(fn) {
  if (document.readyState != 'loading'){
    fn();
  } else {
    document.addEventListener('DOMContentLoaded', fn);
  }
}

Опитай се да направиш решението по такъв начин, че да може да се преизползва. В момента, ако искам да добавя още 5 картинки, трябва да бутна кода на 10 места. Променливите step и caption_step правят едно и също, т.е. спокойно може да си спестиш едната от тях. Не виждам смисъл от два масива, които да държат url-овете и описанията, при положение, че можеш да използваш само един масив от тип picture, който да ги държи на едно място:

// конструктор
function Picture(pic) {
    this.url = pic.url;
    this.caption = pic.caption;
}

// инициализация на обекта
var pic = new Picture({
    url: 'http://example.com/picture.jpg',
    caption: 'This is a random picture.'
});

Грешно е данните да са част от имплементацията на функциите. Данните трябва да се подават като техен аргумент или да са част от обект и функциите да имат достъп до тях.

// това се въвежда от използващия галерията, някъде извън имплементацията ѝ
var picturesData = [
	{
		url: 'http://example.com/picture1.jpg',
		caption: 'This is random picture No.1'
	},
	{
		url: 'http://example.com/picture2.jpg',
		caption: 'This is random picture No.2'
	},
	{
		url: 'http://example.com/picture3.jpg',
		caption: 'This is random picture No.3'
	}
];

// конструктор на Gallery
function Gallery(picturesDataSource) {
	this.pictures = picturesDataSource || [];

	this.printPictures = function() {
		this.pictures.forEach(function(picture) {
			console.log(picture);
		});
	};
}

// инициализация на обект от тип Gallery
var gallery = new Gallery(picturesData);
gallery.printPictures();

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

Май нещо много не си наясно що е това алгоритъм.

Но ако се пробваш да напишеш abs() метод, който да връща по-голямата стойност без да прави сравнение, може и да споделиш един алгоритъм без да разбереш, че си го направил. :P

 

Май нещо се заяждаш. В x86 и x64 има инструкция с мнемоника fabs, надявам се няма да ме караш с микроскоп да изследвам чипа, за да разбера как е реализиран алгоритъма ?

1. Посочи кои числа ?

 

2. Ако посочиш поне две, значи си прав. Е, разбира се без да предизвикваш препълване на типа.

 

3. Без сравнение е невъзможно да се определи, кое е по голямо, но нищо не пречи да приемем абсолютната стойност за даденост и да не се задълбочаваме в това, как се изчислява.

 

4. Иначе е некоректно да се предлагат на студентите нерешими задачи, като се дават грешни упътвания за решението им, все едно задачата е решима.

Еми за вход се търсят стойности от тип Integer който поддържа стойности от -2,147,483,648 до 2,147,483,647 и при алгоритъм с сравнение тези стойности ще работят следователно трябва и при този да е така.

Но пробвай на 2те да сложиш по 2,000,000,000.

Най вероятно и в байт кода на Java има такава, и нищо чудно да я знаеш, но не можеш да се стърпиш.


Еми за вход се търсят стойности от тип Integer който поддържа стойности от -2,147,483,648 до 2,147,483,647 и при алгоритъм с сравнение тези стойности ще работят следователно трябва и при този да е така.

Но пробвай на 2те да сложиш по 2,000,000,000.

 

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

 

Освен това, имаш инструкция на микропроцесора, която директно изчислява абсолютна стойност на числа с плаваща запетая. Искаш да накараш начинаещите програмисти, да изследват как е реализирана функцията на хардуеър ли ?


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

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

При числата плаваща запетая е лесно - просто инструкцията нулира бита за знак. Но при цели числа отрицателните числа не се различават от положителните само по знак, а се представят в допълнителен код така че абсолютната стойност се намира или с: if (x<0) x=-x;  и с inline int abs(int x) {return (x>=0)?x:-x;}

Препълването е предизвикано от формулата не от входните данни.

class mistake
{
    public static void main(String[] args) 
	{
		java.util.Scanner sc = new java.util.Scanner(System.in);
		System.out.print("\nInput the first integer: ");
		int a = 2000000000;//sc.nextInt();
		System.out.print("\nInput the second integer: ");
		int b = 2000000001;//sc.nextInt();
		a = (java.lang.Math.abs(a - b) + a + b) / 2;
		System.out.println("\nThe bigger number is " + a);
		System.out.println(Integer.max(a, b));

		System.out.println("\n*The bigger number is " + ((a>=b)?a:b));
	}
}

 

Input the first integer:
Input the second integer:
The bigger number is -147483647
2000000001

*The bigger number is 2000000001

 

3. Без сравнение е невъзможно да се определи, кое е по голямо, но нищо не пречи да приемем абсолютната стойност за даденост и да не се задълбочаваме в това, как се изчислява.

 

Тук твърдят друго:

http://stackoverflow.com/questions/9772348/get-absolute-value-without-using-abs-function-nor-if-statement

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

Тук твърдят друго:

http://stackoverflow.com/questions/9772348/get-absolute-value-without-using-abs-function-nor-if-statement

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

 

На теб не може да ти се угоди. Като решиш да се заяждаш, си в състояние да изкараш, че цялата формула не е алгоритъм, а една част от нея е. Аз си записвам в тефтеря.

При числата плаваща запетая е лесно - просто инструкцията нулира бита за знак. Но при цели числа отрицателните числа не се различават от положителните само по знак, а се представят в допълнителен код така че абсолютната стойност се намира или с: if (x<0) x=-x;  и с inline int abs(int x) {return (x>=0)?x:-x;}

 

Ето на асемблер за x86 за цели числа и без сравнение

mov [intvalue],eax
fild [intvalue]
fabs
fistp [intvalue]


Къде е тук сравнението на Готирок. Никъде не е.

 

От това по ниско ниво накъде. Нямам намерение да му се бъркам из проводниците и железариите.

 

А и смисъла не е в това. Хората са сгрешили и вместо да подскажат за алгоритъм за проявяване на максимума, са подсказали за алгоритъм за размяна на стойностите.

 

Точно за това ми е поста. Къде задълбаха колегите и защо

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

Ето на c++ без сравнение, по алгоритъма на Инед.

 

Щото Джавата сега седнах да я чета и ми се опъва, но сигурно и там има начин.

# include <iostream>
using namespace std;

int main()
{
	int a;
	long long mask = 0x7fffffffffffffff;
	double x;
	long long* tol;
	
	cout << "Input an integer number: ";
	cin >> a;
	x = (double)a;
	tol = (long long*)(&x);
	*tol = (*tol) & mask;
        a = (int)x;
        cout << endl << "The absolute value is: " << a;	
}

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

Не ми кръщавай алгоритми, ако ще се минава през числа с плаваща запетая на C е: 

 

a = (int) fabs((double) a);

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

1. Превръща се цялото число в число с плаваща запетая с двойна точност - една машинна инструкция

2. Нулира се най старшия бит на числото с двойна точност - една машинна инструкция

3. Превръща се числото с двойна точност в цяло число - една машинна инструкция

 

Така полученото в точка 3. число е абсолютната стойност на числото от точка 1, тъй като, както казва колегата Инед, при типа дабъл, разликата между положителните и отрицателните числа е само в най старшия бит по стандарта IEEE 744.


Не ми кръщавай алгоритми, частта на семблер на C е:

 

a = (int) fabs((double) a);

 

Ами ти точно това каза и аз ти повярвах. Сега е късно да се отмяташ от думите си. Програмата, която написах по твоя алгоритъм работи както без сравнение, така и без използване нито на библиотечни функции, нито на машинната инструкция fabs

На теб не може да ти се угоди. Като решиш да се заяждаш, си в състояние да изкараш, че цялата формула не е алгоритъм, а една част от нея е. Аз си записвам в тефтеря.

 

Тц.

Просто правя разлика между алгоритъм, функция и операция.

Примерно, твоят алгоритъм използва функция abs(), която с определени операции връща стойност, която стойност се използва на определено място в алгоритъма. В случая, в Java abs() е нативен метод в клас и се ползва наготово, но това не отменя факта, че е добре да се знае какво стои зад abs() - алгоритъмът и програмният език са независими неща, така че недей да ги приравняваш. ;)

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

А на асемблер за х64, по същия алгоритъм става така, без фабс и без сравнение

............
section '.data' data readable writeable
..................................
longlong dq 7fffffffffffffffh
doublevalue dq ?
intvalue dd ?
......................................................

section '.code' code readable executable
.........................................
mov [intvalue],eax
fild [intvalue]
fstp [doublevalue]
mov rax,[longlong]
and [doublevalue],rax
fld [doublevalue]
fistp [intvalue]
mov eax,[intvalue]
.............................................

Тц.

Просто правя разлика между алгоритъм, функция и операция.

Примерно, твоят алгоритъм използва функция abs(), която с определени операции връща стойност, която стойност се използва на определено място в алгоритъма. В случая, в Java abs() е нативен метод в клас и се ползва наготово, но това не отменя факта, че е добре да се знае какво стои зад abs() - алгоритъмът и програмният език са независими неща, така че недей да ги приравняваш. ;)

 

Заяждането си е заяждане, откъдето и да го погледнеш, тъй като, дори и при събирането се използва сравнение.

 

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

 

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

 

От първия ми пост, който апострофира заядливо, ясно се вижда, че не сравнявам две програми, а сравнявам два алгоритъма, две упътвания.

 

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

 

Има само една програма в този пост, тази, която аз съм написал. С какво я сравняваш, за да направиш заключение, че сравнявам програми, а не алгоритми.

 

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

 

Как по ясно да ти докажа негативното ти отношение ?


За каквато и операция да става въпрос, на по ниско ниво в нея винаги има сравнение. Авторите явно не са имали предвид това, а може би са решили да покажат на обучаемите, че е необходимо да се мисли самостоятелно от време на време. В което не виждам нищо лошо.

 

Само поправих грешката. Не ги нападам. Ти защо ги защитаваш не ми е ясно.

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

Да оставим настрана алгоритмите,

знаете ли как са я решили задачата гадовете без да ползват условни оператори?
с MAX()   :shock11:

using System;
namespace WithoutIF
{
    class GreaterWithoutIF
    {
        static void Main(string[] args)
        {
            string inputStr = Console.ReadLine();
            decimal firstNum = decimal.Parse(inputStr);
            inputStr = Console.ReadLine();
            int secondNum = int.Parse(inputStr);
            decimal greater = Math.Max(firstNum, secondNum);
            Console.WriteLine(greater);
        }
    }
}

 

 

Да оставим настрана алгоритмите,

знаете ли как са я решили задачата гадовете без да ползват условни оператори?

с MAX()   :shock11:

using System;
namespace WithoutIF
{
    class GreaterWithoutIF
    {
        static void Main(string[] args)
        {
            string inputStr = Console.ReadLine();
            decimal firstNum = decimal.Parse(inputStr);
            inputStr = Console.ReadLine();
            int secondNum = int.Parse(inputStr);
            decimal greater = Math.Max(firstNum, secondNum);
            Console.WriteLine(greater);
        }
    }
}

Виж кода който сам дал по-горе съдържа и това решение.

 

Освен това това пак не е вярно защото Max е

return (a >= b) ? a : b;

А на мен ">=" ми изглежда точо като условен оператор.

Условния оператор е ?: - и решението не е мое, а на тея от книгата за Java.

После върви, че давай пари за подобни книги да се "учиш" на програмиране.

Конкретния пример наистина е интересно представен. И все пак упътването е по грешно от решението, а двете изобщо не съответстват едно на друго.

 

Но иначе книгата не е лоша.

#include <iostream>
using namespace std;

    int absolute(int n);

    int main() 
	{
		int a;
		int b;
		cout << "\nInput the first integer: ";
		cin >> a;
		cout << "\nInput the second integer: ";
		cin >> b;
		a = (absolute(a - b) + a + b) / 2;
		cout << "\nThe bigger number is " << a;
	}
	
	int absolute(int n)
	{
		unsigned* um;
		unsigned* up;
		unsigned* un;
		int m;
		int p;
		um = (unsigned*)&m;
		un = (unsigned*)&n;
		up = (unsigned*)&p;
		*um = *un & (0x80000000);
		*up = *um >> 31;
		*um = (*um >> 1) + (*um >> 2) + (*um >> 3) + (*um >> 4) + (*um >> 5) +
		        (*um >> 6) + (*um >> 7) + (*um >> 8) + (*um >> 9) + (*um >> 10) +
			(*um >> 11) + (*um >> 12) + (*um >> 13) + (*um >> 14) + (*um >> 15) +
			(*um >> 16) + (*um >> 17) + (*um >> 18) + (*um >> 19) + (*um >> 20) +
			(*um >> 21) + (*um >> 22) + (*um >> 23) + (*um >> 24) + (*um >> 25) +
			(*um >> 26) + (*um >> 27) + (*um >> 28) + (*um >> 29) + (*um >> 30) +
			(*um >> 31) + *um;
		*un = (*un ^ *um) + *up;
		return n;		
	}

На с++, без сравнения и без конвертиране и без цикли. Щото то като ще се заяждаме и цикли без сравнение няма. На джава не знам къде им са пойнтърите.

 

Иначе с конвертиране от 32 бита в 64 и обратно, ще стане с по малко код

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

С превръщане от 32 в 64 бита и шифтинг

#include <iostream>
using namespace std;

    int absolute(int n);
	

    int main() 
	{
		int a;
		int b;
		cout << "\nInput the first integer: ";
		cin >> a;
		cout << "\nInput the second integer: ";
		cin >> b;
		a = (absolute(a - b) + a + b) / 2;
		cout << "\nThe bigger number is " << a;
	}
	
	int absolute(int n)
	{
		int p;
		int convert[2];
		long long* longlongptr;
		longlongptr = (long long*) convert;
		*longlongptr = (long long)n;
		*longlongptr = (*longlongptr >> 31);
		p = convert[0] & 1;
		n = (n ^ convert[0]) + p;
		return n;		
	}

 

На предната страница имаше линк с доста по-добро решение.

	int absolute(int n)
	{
		int m=n>>31;
		return (n^m)-m;		
	}

 

А кой твърдеше, че няма прост алгоритъм за намиране на абсолютна стойност на цяло число, без да се прави сравнение.

Май не беше ти. Сякаш и аз не бях.

 

Е, аз по едно време, казах, че не може. Сигурно за това е бил постнат и линка.  Не съм го прочел. Иначе щях да вложа повече злоба.

 

Човек като реши да се заяжда, нищо не може да го спре.

Както и мен сега.

 

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

 

 

След това като казах, че не може нищо да се направи без сравнение, е изкопал и линка. Е, това е висш пилотаж.


А нищо чудно и преди това да го е знаел.

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

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

 

След това като казах, че не може нищо да се направи без сравнение, е изкопал и линка. Е, това е висш пилотаж.

А нищо чудно и преди това да го е знаел.

 

:)

 

Ако не съм го знаел, дали съм щял да ти напиша това:

Но ако се пробваш да напишеш abs() метод, който да връща по-голямата стойност без да прави сравнение, може и да споделиш един алгоритъм без да разбереш, че си го направил. :P

 

Все пак да спориш с един форумен дявол, се изискват доста големи умения, тъй като той винаги е с няколко хода пред теб. :P

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

:)

 

Ако не съм го знаел, дали съм щял да ти напиша това:

 

Все пак да спориш с един форумен дявол, се изискват доста големи умения, тъй като той винаги е с няколко хода пред теб. :P

 

Абе мене ако питаш, този път дявола си намери майстора. Но то се иска и логическо мислене за да разбере това. Само с дяволии не става.

Архивирана тема

Темата е твърде стара и е архивирана. Не можете да добавяте нови отговори в нея, но винаги можете да публикувате нова тема, в която да продължи дискусията. Регистрирайте се или влезте във вашия профил за да публикувате нова тема.

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

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

Дарение

  • Подкрепи съществуването на форума - направи дарение
    26%
    Дарени 256.00 EUR от нужните 1,000.00 EUR

Бюлетин

Получавайте известие, когато има важна промяна или новина свързана с форума.

Профил

Навигация

Търсене

Търсене

Конфигуриране на push известия в браузъра

Chrome (Android)
  1. Докоснете иконата на катинар до адресната лента.
  2. Докоснете Разрешения → Известия.
  3. Променете предпочитанията си.
Chrome (Desktop)
  1. Кликнете върху иконата на катинар в адресната лента.
  2. Изберете Настройки на сайта.
  3. Намерете Известия и коригирайте предпочитанията си.