#c #algorithm
#c #алгоритм
Вопрос:
Это для задания, поэтому я не был бы признателен за прямые ответы; скорее, любая логическая помощь с моими алгоритмами (или указание на какие-либо логические недостатки) была бы невероятно полезна и оценена!
У меня есть программа, которая получает от пользователя «n» количество элементов для помещения в одномерный массив. В массиве используются случайно сгенерированные числа. То есть: если пользователь вводит 88, генерируется список из 88 случайных чисел (каждое от 1 до 100).). Максимальное значение «n» равно 100.
Я должен написать 2 функции.
Функция # 1:
Determine the percentage of numbers that appear in the array of "n" elements.
So any duplicates would decrease the percentage.
And any missing numbers would decrease the percentage.
Thus if n = 75, then you have a maximum possible %age of 0.75
(this max %age decreases if there are duplicates)
This function basically calls upon function #2.
FUNCTION HEADER(GIVEN) = "double coverage (int array[], int n)"
Функция # 2:
Using a linear search, search for the key (key being the current # in the list of 1 to 100, which should be from the loop in function #1), in the array.
Return the position if that key is found in the array
(IE: if this is the loops 40th run, it will be at the variable "39",
and will go through every instance of an element in the array
and if any element is equal to 39, all of those positions will be returned?
I believe that is what our prof is asking)
Return -1 if the key is not found.
Given notes = "Only function #1 calls function #2,
and does so to find out if a certain value (key) is found among the first n elements of the array."
FUNCTION HEADER(GIVEN) = "int search (int array[], int n, int key)"
С чем мне действительно нужна помощь, так это с логикой алгоритма.
Я был бы признателен за любую помощь в этом, поскольку я бы подошел к этой проблеме совершенно иначе, чем хочет наш профессор.
Моей первой мыслью было бы выполнить цикл через функцию # 1 для всех переменных ключей от 1 до 100. И в этом цикле перейдите к функции поиска (функция # 2), в которой цикл просматривал бы каждое число в массиве и добавлял к счетчику, если число было (1) дубликатом или (2) отсутствовало в массиве. Затем я бы вычел этот счетчик из 100. Таким образом, если бы в массив были включены все числа, за исключением #40 и # 41, а затем # 77 был дубликатом, общий процент покрытия был бы равен 100 — 3 = 97%.
Хотя, когда я набираю это, я думаю, что это само по себе может быть ошибочным? ^ Потому что при максимальном количестве элементов в массиве 100, если единственное отсутствующее число равно 99, то вы бы вычли 1 из-за отсутствия этого числа, а затем, если бы был дубликат, вы бы вычли еще 1, и, таким образом, ваш процент покрытия был бы равен (100-2) = 98, когда явно должно быть 99.
И именно поэтому я был бы ОЧЕНЬ признателен за любую логическую помощь. 🙂
Я знаю, что у меня возникают некоторые проблемы с логическим подходом к этому.
Я думаю, что смогу разобраться с кодированием с относительной легкостью; больше всего я затрудняюсь с тем, какие шаги предпринять. Так что любые идеи псевдокода были бы потрясающими!
(Я могу опубликовать весь свой программный код до сих пор, если кому-то необходимо, просто спросите, но на данный момент это довольно длинный, поскольку у меня есть много других функций, выполняющих другие задачи в программе)
Комментарии:
1. Спасибо Theolodis за исправление моих цитат из блоков.:) Не уверен, как я переключился с простого ввода «>» на нажатие CMD K. Ха-ха.
2. Не имеет смысла «перебирать функцию # 1». Функция # 1 вычисляет окончательный ответ, поэтому вы хотите вызвать ее только один раз. Однако описание функции # 1 предполагает, что для вычисления результата следует вызвать функцию # 2 из реализации функции # 1.
3. Насколько я понимаю, основываясь на заметках моего профессора (он дал нам заголовки функций), мы должны использовать функцию # 1 для перебора чисел от 1 до 100. И используйте функцию поиска # 2, чтобы сравнить текущее число в диапазоне от 1 до 100 со всеми числами в массиве. // Заголовок функции, указанный для функции # 2, — «int search (int array[], int n, int key)». Заголовок для функции # 1 — «двойное покрытие (int array[], int n)»
4. Да, я все это понимаю… возможно, вы переоцениваете это. Вопрос заключается в том, чтобы просто подсчитать количество уникальных целых чисел в данной коллекции. Это не должно быть больше нескольких строк.
5. Ну, мне нужна помощь по логике, потому что у меня был такой небольшой опыт работы с C , и, к сожалению, я испытываю трудности, поскольку в учебнике не так много указаний. И поскольку класс онлайн, нет рабочих часов и нет взаимодействия с профессором. Я могу придумать более простые способы выполнения задания, но не с учетом рекомендаций нашего профессора. Больше всего меня смущает необходимость возвращать позицию элемента в функции # 2? D:
Ответ №1:
Возможно, я ошибаюсь, но, как я прочитал, все, что вам нужно сделать, это:
- напишите функцию, которая перебирает массив из n элементов, чтобы найти в нем заданное число. Это вернет индекс первого появления или отрицательное значение в случае, если число не может быть найдено в массиве.
- напишите цикл для вызова функции для всех чисел от 1 до 100 и подсчитайте количество найденных. Затем разделите результат на 100.
Ответ №2:
Я не уверен, правильно ли я все это понимаю, но 1 функция, вы можете это сделать, если вас не волнует скорость, лучше поместить массив в vector
, выполнить цикл 1.. 100 и использовать функцию поиска boosthttp://www.boost.org/doc/libs/1_41_0/doc/html/boost/algorithm/find_nth.html. Там вы можете сравнить текущее значение со вторым значением записи в векторе, если оно содержит уменьшение, а не не уменьшается, если вы хотите определить, есть ли уникальное число в массиве, используйте http://www.cplusplus.com/reference/algorithm/find /. Я не понимаю, как уменьшается процент, так что решайте сами, и я не совсем понимаю вторую функцию, но если использовать ее линейный поиск, снова найдите. P.S. Векторное описание http://www.cplusplus.com/reference/vector/vector/begin /.
Комментарии:
1. Спасибо за ответ! К сожалению, я должен соблюдать рекомендации на 100%. Ха-ха. Я знаю, что неприятно так строго придерживаться чего-то, когда, возможно, есть более простой способ что-то сделать. :(Мы еще не касались векторов в классе и, следовательно, не можем их использовать. Я потеряю очки, если сделаю это. Ого!
Ответ №3:
Вы хотите знать, сколько чисел в диапазоне [1, 100] появляется в вашем заданном массиве. Вы можете искать каждое число по очереди:
size_t count_unique(int array[], size_t n)
{
size_t result = 0;
for (int i = 1; i <= 100; i)
{
if (contains(array, n, i))
{
resu<
}
}
return resu<
}
Все, что вам все еще нужно, это реализовать проверку локализации contains(array, n, i)
и преобразовать количество уникальных значений в процент (с помощью деления).