Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Перенос части кода в функцию пользователя (http://forum.oszone.net/showthread.php?t=326062)

ALEVER 18-04-2017 13:42 2730333

Перенос части кода в функцию пользователя
 
Доброго времени суток.
Есть одномерный массив из 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 2730336

Цитата:

Цитата ALEVER
Т.к. ф-ция может возвращать только лишь 1 значение »

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

ALEVER 18-04-2017 16:15 2730390

shisik, можно использовать только циклы, условия. Структуры и дополнительные функции запрещены.

shisik 18-04-2017 16:32 2730396

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

Цитата:

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

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

ALEVER 19-04-2017 13:00 2730670

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

shisik 19-04-2017 14:45 2730703

Цитата:

Цитата ALEVER
подразумевается запрет функций, например, для сортировки и прочего, а суть реализации через функцию(ии) пользователя »

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

ALEVER 19-04-2017 17:09 2730747

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

shisik 19-04-2017 17:47 2730751

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

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

ALEVER 19-04-2017 22:07 2730801

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

shisik 19-04-2017 22:58 2730820

Цитата:

Цитата ALEVER
После чего эти функции должны вернуть в мейн нужные значения, а именно: число(а)(которое(ые) подходит условию) »

Тогда без массивов никак, раз чисел может быть несколько. Как насчёт такого? Я здесь использовал библиотечную функцию 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.


Время: 15:02.

Время: 15:02.
© OSzone.net 2001-