1. C++ / Говнокод #6055

    +160

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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, 21 Марта 2011

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

    • Что такое 21? В языке нет конструкции, чтобы узнать размер массива?
      Ответить
      • Наверно так надо было: sizeof(str_mass)/sizeof(str_mass[0])
        Ответить
        • А точно будет размер массива, а не указателя?
          Ответить
          • Будет размер массива, т.к он указан явно.
            Ответить
        • sizeof str_mass / sizeof *str_mass
          Ответить
          • А чем отличается str_mass[0] от *str_mass ?
            Ответить
            • Ничем. Просто первое - это взятие первого элемента массива, а второе - взятие элемента по адресу.
              Ответить
            • Ничем. Просто '*' - более фундаментальная операция. И индексно-независимая, т.е. не вызывает вопросов о том, почему именно '[0]', а не, скажем, '[5]'.

              В конце концов это просто короче.
              Ответить
      • В смысле: никаких других проблем вы в коде не заметили? Я бы не сказал, что это '21' как-то выделяется на общем фоне.

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

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

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