Войти

Показать полную графическую версию : Перенос части кода в функцию пользователя


ALEVER
18-04-2017, 13:42
Доброго времени суток.
Есть одномерный массив из 10 элементов (положительных и отрицательных), которые генерируются рандомно.
Ищется произведение одинаковых отрицательных нечетных элементов.
Есть верно работающий код:

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>

int main() {
system("cls");;
int ARR[10], i, j, k, n, P;
srand(time(NULL));

printf("\t\t\t\tARRAY\n");
for(i=0; i<10; i++) {
ARR[i]=rand() % 11 - 7;
printf("%i\t", ARR[i]);
}

printf("\n");

for (i = 0; i < 10; i++) {
if (ARR[i] < 0 && ARR[i]%2 != 0) {
j = 0;
while (j < i && ARR[j] != ARR[i]) j++;
if (j == i) {
n = 0;
for (k = i + 1; k < 10; k++) {
if (ARR[k] == ARR[i]) n++;
}

if (n != 0) {
P = ARR[i];
for (k = 0; k < n; k++) P *= ARR[i];

printf("\nNumber [%d] is repeated [%d] times. Result = [%d]", ARR[i], n+1, P);
}
}
}
}
return 0;
}


Например, для ряда:
1 -7 -7 -5 0 -2 -5 0 -7 -4
Получаем:
Number [-7] is repeated [3] times. Result = [-343]
Number [-5] is repeated [2] times. Result = [25]

Задача стоит вывести тоже самое, но использовав функции пользователя. Т.к. ф-ция может возвращать только лишь 1 значение, то соответственно выходит, что нужно 3 таких функции, одна вернет повторяющееся число, вторая - количество повторений и третья - результат. Но т.к. пар таких чисел может быть несколько, то нужна функция, которая их посчитает, а потом что, обернуть в мейне в цикл функции и вывод до кол-ва этих пар. И уже начиная с этого момента возникают трудности. Буду благодарен за любые подсказки и реализации. (Код можно изменять, например, вместо умножения с присваиваниям, возвести в степень число в ко-во повторений, но вывод должен остаться таким же).
Спасибо.

shisik
18-04-2017, 13:50
Т.к. ф-ция может возвращать только лишь 1 значение »

А если использовтаь структуру? Плюс можно передавать параметры по ссылкам. Вот и подсказки, как получить более одного результата из функции :)

ALEVER
18-04-2017, 16:15
shisik, можно использовать только циклы, условия. Структуры и дополнительные функции запрещены.

shisik
18-04-2017, 16:32
ALEVER, тогда перейдайте параметры по ссылкам, так получите несколько значений из одной функции.

дополнительные функции запрещены »

А как же тогда ваша идея с тремя функциями?

ALEVER
19-04-2017, 13:00
shisik, подразумевается запрет функций, например, для сортировки и прочего, а суть реализации через функцию(ии) пользователя.

shisik
19-04-2017, 14:45
подразумевается запрет функций, например, для сортировки и прочего, а суть реализации через функцию(ии) пользователя »

Ничего не понял. Что значит запрет функций, но реализация через функцию? :o

ALEVER
19-04-2017, 17:09
shisik, ок, перефразируем: реализовать тот же самый результат(вывод) с помощью функции(ий) пользователя, используя в них и мейне только проверки и циклы.

shisik
19-04-2017, 17:47
ALEVER, хорошо, тогда такой вопрос: вот функция main должна вызывать какую-то другую функцию, которая и будет производить все эти вычисления, так? Принимать эта функция должна исходный массив (это логично), так? А что она должна возвращать? Вывод должен остаться в main? В этом случае результатом должен быть массив, даже многомерный массив. Ну или массив структур.

Ну то есть варавнтов реализации на самом деле очень очень много. Только вот и это нельзя, и то нельзя... Условие не совсем понятно.

ALEVER
19-04-2017, 22:07
shisik, функция мейн передает в функции пользователя массив из 10 рандомных элементов. После чего эти функции должны вернуть в мейн нужные значения, а именно: число(а)(которое(ые) подходит условию), его кол-во повторений и результат, выводом из мейна должна быть строка "Number [%d] is repeated [%d] times. Result = [%d]", где 1 - нечетное отрицательное число, повторяемое 2 и более раз, 2 - кол-во повторений этого числа, 3 - результат перемножения этого числа кол-ва повторений, либо, проще говоря, возвести повторяемое число в кол-во этих повторений. При чем учесть, что таких пар повторяемых чисел может быть больше 1 и соответственно предусмотреть.

shisik
19-04-2017, 22:58
После чего эти функции должны вернуть в мейн нужные значения, а именно: число(а)(которое(ые) подходит условию) »

Тогда без массивов никак, раз чисел может быть несколько. Как насчёт такого? Я здесь использовал библиотечную функцию pow для возведения в степень. Надеюсь, это не запрпещено?

#include <iostream>
#include <cmath>

bool inArray(int *arr, int length, int number)
{
for (int i = 0; i < length; ++i)
if (arr[i] == number)
return true;
return false;
}

int filterRepeats(int *arr, int length, int *filtered)
{
int count = 0;
for (int i = 0; i < length; ++i)
if (!inArray(filtered, count, arr[i])) {
filtered[count] = arr[i];
++count;
}
return count;
}

int countNumbers(int *arr, int length, int number)
{
int count = 0;
for (int i = 0; i < length; ++i)
if (arr[i] == number)
++count;
return count;
}

int main()
{
int arr[10] = {1, -7, -7, -5, 0, -2, -5, 0, -7, -4};
int filtered[10];

int uniqueCount = filterRepeats(arr, 10, filtered);

for (int i = 0; i < uniqueCount; ++i) {
int number = filtered[i];

if (number >= 0 || number % 2 == 0) continue;

int count = countNumbers(arr, 10, number);

if (count < 2) continue;

std::cout << "Number [" << number << "] is repeated [";
std::cout << count << "] times. Result = [" << pow(number, count);
std::cout << "]" << std::endl;
}

return 0;
}

Вывод, разумеется, можно заменить на fprint.




© OSzone.net 2001-2012