Кресты / Говнокод #6055 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
#include <iostream>
#include <string>
using namespace std;
int main()
{
	const int hz_limit = 20000;
	string str;
	string str_mass[] = {"a", "b", "ais", "h", "ces", "c", "his", "cis", "des",
		"d", "dis", "es", "e", "fes", "f", "eis", "fis", "ges", "g", "gis", "as"};
	begin:
	while (cin>>str)
	{
		for (size_t ix = 0; ix != str.size(); ++ix)
		{
			str[ix] = tolower(str[ix]);
		}
		size_t f = 0;
		for (size_t ix = 0; ix != 21; ++ix)
		{
			if(str == str_mass[ix])
			{
				f = ix;
			}
		}
		if (str != str_mass[f])
		{
			goto begin;
		}
		double mass[] = {27.500, 29.135, 29.135, 30.868, 30.868, 32.703, 32.703, 34.648, 34.648,
		36.708, 38.891, 38.891, 41.203, 41.203, 43.654, 43.654, 46.249, 46.249, 48.999, 51.913, 51.913};
		for (; mass[f] < hz_limit; mass[f] *= 2)
			{
				cout<<mass[f]<<" Hz"<<endl;
			}
	}
	return 0;
}

Моя первая прога. Выводит частоты на которых находится введенная нота...

Запостил: Extrawelt Extrawelt, (Updated )

Комментарии (28) RSS

  • Что такое 21? В языке нет конструкции, чтобы узнать размер массива?
    Ответить
      • Он инициализируется в цикле по вполне понятной причние: значение одного из элементов будет портиться в процессе генерации результата. Поэтому хочешь-не хочешь, а надо переинициализировать. Так что тут придраться не к чему 🙂
        Ответить
        • Модифицируется - да. Но логичнее было бы вынести массив из цикла, а в цикле использовать временную переменную.
          Плюс - нелепая проверка на отсутствие совпадений в 25 строке и выход из цикла чтения. А ещё, мне кажется, что автору повезло использовать string и проверку на равенство строк, с char* такое бы не прокатило. Новички на этом часто попадаются.
          Ответить
          • Разумеется, логичнее бы было вынести массив из цикла. Но это бы сущеcтвенно уменьшило своеобразную прелесть данного кода.
            Ответить
  • Для равномерно темперированного строя, массив вообще не нужен.
    Отношение между частотами соседних нот(пол-тона) константа - exp( (1./12.) * ln(2.) ) .
    Ответить
      • Что именно не видно?

        Нет необходимости хранить все частоты, тем более повторяющиеся, достаточно хранить только одну(обычно это нота ля - 440hz).
        Ответить
      • Если же вопрос в том, что конкретно данный массив нельзя просто сходу заменить формулой(из-за повторяющихся частот), то тут можно немного ухитриться: легко заметить патерн - четыре пары(внутри пары одинаковые частоты), потом одиночная частота, и т.д. формула просто будет немного сложней 😛
        Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8