Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Помогите дописать (https://javascript.ru/forum/misc/23748-pomogite-dopisat.html)

Любознательный 04.12.2011 18:16

Помогите дописать
 
Написать программу перевода чисел от 1 до 9 в римскую систему счисления на языке
switch (num) {
case 1:
number = 'I';
break;
case 2:
number = 'II';
break;
case 3:
number = 'III';
break;
case 4:
number = 'IV';
break;
case 5:
number = 'V';
break;
case 6:
number = 'VI';
break;
case 7:
number = 'VII';
break;
case 8:
number = 'VIII';
break;
case 9:
number = 'IX';
break;
default:
number = '_'
}

Gvozd 04.12.2011 19:14

Здравствуйте!

Судя по вашему сообщению, вы ну совсем не знаете javascript.

Освойте основы языка и вопрос отпадет сам, полностью или частично.
А с чем не справитесь - поможем.

На сайте javascript можно начать изучать с учебника, раздел Основы javascript.
Возможно, вам также понадобится HTML - учебник есть, например, здесь: http://ru.html.net/tutorials/html/

Задавайте конкретные вопросы по ходу дела.

Gvozd 04.12.2011 19:15

Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

nerv_ 04.12.2011 19:16

Вот на VBA я писал 12/09/2011. Понимаю, что не в тему :D, но зато переводит любые (в пределах разумного) римские числа. Сейчас попробую на js перевести...
Public Function RomanToArabic2(ByVal RStr As String) As Long
Dim i%, h%, j As Byte
RStr = UCase(RStr)
For j = 1 To Len(RStr)
    i = InStr("IVXLCDM", Mid(RStr, j, 1))
    i = IIf(i, Choose(i, 1, 5, 10, 50, 100, 500, 1000), 0)
    h = IIf(h < i, i - h * 2, i): RomanToArabic2 = RomanToArabic2 + h
Next
End Function

оу... Не доглядел. Нужно наоборот) Но все равно мне интересно для изучения будет попробовать)

nerv_ 04.12.2011 21:14

Переводит римские числа в арабские. Пример взят отсюда Википедия/Римские_цифры
// Переводит римские числа в арабские
var num = prompt("Введите римское число", "ammmCMXCIX"); // default - 3999
if(num) alert(RomanToArabic(num));
			
function RomanToArabic() {
	var i, alph = { I:1, V:5, X:10, L:50, C:100, D:500, M:1000 };
	for(var h = 0, j = 0, n = 0; j < arguments[0].length; j++) {
		i = alph[arguments[0].charAt(j).toUpperCase()];
		if(i) n += h = (h < i ? i - (h << 1) : i);
	}
	return n;
}

nerv_ 07.12.2011 20:23

Потихоньку синтаксис js осваиваю. Любознательный, вроде как решил Вашу задачку ;)
// Переводит арабские числа в римские 
var num = prompt("Введите число", 19); // default - 19
if(num) alert(ArabicToRoman(num));

function ArabicToRoman() {
	var alph = [["I",1], ["IV",4], ["V",5], ["IX",9], ["X",10], ["XL",40], ["L",50], ["XC",90], ["C",100], ["CD",400], ["D",500], ["CM",900], ["M",1000]];
	for(var j = alph.length - 1, i = arguments[0], n = ""; j != -1; j--) {
		if(~~(i / alph[j][1]) > 0) { n += alph[j][0]; i -= alph[j][1]; j++; }
	}
	return n;
}

melky 07.12.2011 22:13

if(~~(i / alph[j][1]) > 0) { n += alph[j][0]; i -= alph[j][1]; j++; }

красава. на хабре говорят, что за такое нужно отрывать руки.

вы для людей код пишите? вы добровольно решаете задачу, выкладываете решение на форум.. да, для людей! так почему не следуете стилю написания?

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

а попытки ручного преобразования в байт-код оставьте для второй версии скрипта, которая называется "минифицированной" и после всех ухищрений ещё и сжата в GCC.

.. наболело. если я вас коим образом задел, прошу меня извинить.

PS если вы не знаете, что такое стильный код - то это такой код, который очень легко и приятно читать.
PSS если выложите код в двух версиях - для разработчиков (с комментариями и со всем порядочным) и для пользователей (минифицированная), то я поставлю вам плюсик, если это важно :)

trikadin 07.12.2011 22:28

melky, не злись)

У меня тоже был бзик на минимальность кода) Понял, что это фигня, когда через месяц мне было проще переписать всё, чем разбирать то, что написал.

melky 07.12.2011 22:34

Цитата:

Сообщение от trikadin (Сообщение 141291)
melky, не злись)

У меня тоже был бзик на минимальность кода) Понял, что это фигня, когда через месяц мне было проще переписать всё, чем разбирать то, что написал.

у меня тоже было. да оно у всех есть. только надо это вовремя пресекать, чтобы не было дальше разочаровния, что так делать некруто

trikadin 07.12.2011 22:39

Цитата:

Сообщение от melky
у меня тоже было. да оно у всех есть. только надо это вовремя пресекать, чтобы не было дальше разочаровния, что так делать некруто

Ну, от разочарования никуда не денешься, так или иначе. Нельзя сразу писать идеально))

devote 07.12.2011 22:50

ну да, особенно вот это для новичков чаще всего не понятно: "~~"

trikadin 07.12.2011 22:59

Цитата:

Сообщение от devote
ну да, особенно вот это для новичков чаще всего не понятно: "~~"

Нас препод (не по js, нет - по C++), помнится, специально заставлял использовать побитовые операторы - чтобы в будущем хоть представляли, что это.

nerv_ 08.12.2011 18:00

Цитата:

Сообщение от melky
вы для людей код пишите? вы добровольно решаете задачу, выкладываете решение на форум.. да, для людей! так почему не следуете стилю написания?

в данном случае такое написание мне кажется более логичным :)
Цитата:

Сообщение от melky
а попытки ручного преобразования в байт-код оставьте для второй версии скрипта, которая называется "минифицированной" и после всех ухищрений ещё и сжата в GCC.

Вы заблуждаетесь, попыток обфускации я не предпринимал. За ссылку спасибо)
melky, да, в js я новичок и скорее всего у меня еще нет чувства стиля именно в нем. Но, я пишу так, как понятно мне и как мне кажется наиболее логичным.

Тут надо внести ясность: если бы я знал, что этот код придется кому-нибудь сопровождать, то написал бы по другому (отчасти) и дополнил его комментариями ;)

Цитата:

Сообщение от melky
PSS если выложите код в двух версиях - для разработчиков (с комментариями и со всем порядочным) и для пользователей (минифицированная), то я поставлю вам плюсик, если это важно

Поставите - спасибо, нет - ну значит нет) Для меня сейчас главное врубиться в синтаксис js, его особенности и нюансы; попытаться понять причуды браузеров.

Думается мне, что большинство из Вас "пришло" в js уже зная C, C++, Java или какой-нибудь другой язык со схожим синтаксисом. К сожалению, это не про меня. trikadin, и вообще, я самоучка, препод мне никогда не чего не объяснял) Самостоятельно изучал Assembler (к сожалению не очень долго), VBA, html, css, bat (немного). Так что, "багаж" у меня совсем скромный :yes:

Всех Вас я уважаю и мне очень интересно (и познавательно) наблюдать за Вашими советами/ответами и решениями. Надеюсь, что скоро смогу вступать с Вами в полноценные дискуссии по js :)

melky, уж не знаю, пригодится или нет, в следующих двух постах приведенные выше алгоритмы с комментариями. Надеюсь, ни чего не напутал ^_^

nerv_ 08.12.2011 18:03

// Переводит римские числа в арабские
var num = prompt("Введите римское число", "ammmCMXCIX"); // default - 3999
if(num) alert(RomanToArabic(num));
			
function RomanToArabic() {
	// объявляем переменные, инициализируем объект
	var i, alph = { I:1, V:5, X:10, L:50, C:100, D:500, M:1000 };
	// j - счетчик символов
	// h - результат предыдущих вычислений
	// n - возвращаемое число
	// По буквам строки/римского числа
	for(var h = 0, j = 0, n = 0; j < arguments[0].length; j++) {
		// используем объект как ассоциативный массив - по римской цифре определяем арабскую
		i = alph[arguments[0].charAt(j).toUpperCase()];
	/*	// строку ниже, в данном случае, можно записать так:
				if(i != undefined) {		// римская цифра?
					if(h < i) {				// предыдующая цифра < текущей, вычитаем
						h = i - h * 2;		// т.е. h = i - (h << 1)
					}
					else {					// предыдующая цифра >= текущей, получаем эту цифру			
						h = i;
					}
					n += h;					// собираем число
				}							*/
		if(i) n += h = (h < i ? i - (h << 1) : i);
	}
	// возвращаем число
	return n;
}

nerv_ 08.12.2011 18:03

// Переводит арабские числа в римские 
var num = prompt("Введите число", 19); // default - 19
if(num) alert(ArabicToRoman(num));

function ArabicToRoman() {
	// массив соответствий римских и арабских чисел
	var alph = [["I",1], ["IV",4], ["V",5], ["IX",9], ["X",10], ["XL",40], ["L",50], ["XC",90], ["C",100], ["CD",400], ["D",500], ["CM",900], ["M",1000]];
	// j - счетчик эл. массива
	// i - число (арабское), кот. требуется перевести
	// n - возвращаемое римское число
	// По элементам массива -> от большего к меньшему
	for(var j = alph.length - 1, i = arguments[0], n = ""; j != -1; j--) {
	/*	строку ниже можно записать следующим образом
		if(~~(i / alph[j][1]) > 0) { 	// целочисленное деление и сравнение с 0
			n += alph[j][0];			// собираем римское число
			i -= alph[j][1];			// корректируем арабское число на то, кот. определили
			j++;						// проверяем пару (эл. массива) еще раз
		}							*/					
		if(~~(i / alph[j][1]) > 0) { n += alph[j][0]; i -= alph[j][1]; j++; }
	}
	// возвращаем римское число
	return n;
}

melky 08.12.2011 22:30

Цитата:

Сообщение от nerv_ (Сообщение 141425)
melky, да, в js я новичок и скорее всего у меня еще нет чувства стиля именно в нем. Но, я пишу так, как понятно мне и как мне кажется наиболее логичным.

код перестанет быть таким через месяц :)

я сейчас изменил стиль на более подробный ... и спустя месяц (проект застыл, дела. сейчас снова будет работать) я сел смотреть код. доя меня было радостным событием: я смог с первой попытки понять, что он делает !

торжественно! хотя что за файлы и каково их содержимое, я перестал помнить по истечении недели паузы разработки.
Цитата:

Сообщение от nerv_ (Сообщение 141425)
Думается мне, что большинство из Вас "пришло" в js уже зная C, C++, Java или какой-нибудь другой язык со схожим синтаксисом. К сожалению, это не про меня. trikadin, и вообще, я самоучка, препод мне никогда не чего не объяснял) Самостоятельно изучал Assembler (к сожалению не очень долго), VBA, html, css, bat (немного). Так что, "багаж" у меня совсем скромный :yes:

я изучал html+css+php на уровне гавнокода. потом сел за C#, в котором понимал многопоточность 2 дня (!!!!полностью допёрло,как это использовать. помню кстати до сих пор эти проклятые new Thread(), myth.start() и myth.reportProgress(a,b,c,d) .....)

а потом пересел на JS и читал про него днями (!)... так сильно мне понравился этот язык.

Цитата:

Сообщение от nerv_ (Сообщение 141425)
Всех Вас я уважаю и мне очень интересно (и познавательно) наблюдать за Вашими советами/ответами и решениями. Надеюсь, что скоро смогу вступать с Вами в полноценные дискуссии по js :)

+1 собеседник. было бы неплохо! обращайся, если будут вопросы :)

PS начал учить JS осенью 2010

/////////////////// по делу //////////////////////////////
кстати,
~~(i / alph[j][1]) > 0

лучше бы заменить на
(i / alph[j][1])|0

тоже "приведение к числу", но быстрее.

это одно и то же , что и
parseInt(i / alph[j][1])

B@rmaley.e><e 08.12.2011 23:01

Цитата:

Сообщение от melky
(i / alph[j][1])|0

Только | 0 нужно писать внутри скобок.
alert( [2/2 | 0 > 1, (2/2 | 0) > 1] )
Цитата:

Сообщение от melky
это одно и то же , что и

Не совсем.
alert([1/3 * 1e10, parseInt(1/3 * 1e10), 1/3 * 1e10 | 0].join('\n'))

trikadin 08.12.2011 23:19

nerv_, а я тоже, считай, сам всё изучал. Препод был по теории алгоритмов, а не по JS. Да и то недолго, ибо не школьный он был.

Кстати, по теме - js был первым языком, на котором я стал писать что-то сложнее print("Hello, world"). А нормально (то есть очень усиленно, с прочтением кучи литературы, тематических сайтов и т.д.) я его изучаю... Ну, полгода, наверное. Так что мы с вами в одном положении, можно сказать)

Цитата:

Сообщение от nerv_
Думается мне

Хех) Одна из моих любимых фраз)

melky 08.12.2011 23:35

Цитата:

Сообщение от B@rmaley.e><e (Сообщение 141486)
Только | 0 нужно писать внутри скобок.
alert( [2/2 | 0 > 1, (2/2 | 0) > 1] )

в вышестоящем примере была проверка на положительное число, поэтому можно таки опустить.
Цитата:

Сообщение от B@rmaley.e><e (Сообщение 141486)
Не совсем.
alert([1/3 * 1e10, parseInt(1/3 * 1e10), 1/3 * 1e10 | 0].join('\n'))

спасибо за пример. почему так происходит ?

B@rmaley.e><e 09.12.2011 01:16

Цитата:

Сообщение от melky
в вышестоящем примере была проверка на положительное число, поэтому можно таки опустить.

?
alert( [-2/2 | 0 > 0, (-2/2 | 0) > 0] )
Цитата:

Сообщение от melky
спасибо за пример. почему так происходит ?

Согласно стандарту, у побитовых операторов есть такой шаг как вызов ToInt32. Т.е. каждый из аргументов приводится к 32-х битовому знаковому числу. В то время как обычно JS оперирует 64-битными числами двойной точности (IEEE 754). Отсюда и получается сужение множества значений.

melky 09.12.2011 22:15

я это имел в виду.
Boolean(-2/2 | 0) === (-2/2 | 0) > 0

за обьяснение спасибо.

nerv_ 09.12.2011 23:00

Да, да, да, всем большое спасибо) Если не ошибаюсь, из той же оперы:
var x = [];
x[0] = ~~1.7;
x[1] = 1.7 | 0;
x[2] = 1.7 ^ 0;
x[3] = 1.7 >> 0;
x[4] = 1.7 << 0;
x[5] = 1.7 >>> 0;
x[6] = parseInt(1.7);
alert(x.join('\n'));

Цитата:

Сообщение от melky
тоже "приведение к числу", но быстрее.

Согласен. Одна операция вместо двух)


Часовой пояс GMT +3, время: 17:13.