Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Массивы указателей на функции.


Автор: Hqw33 3.4.2012, 07:31
Пишу в Microsoft Visual Studio ->Win32 Console application ->C++.

Помогите пожалуйста "написать":

Реализовать 3 функции, каждая из которых принимает указатель на массив и количество элементов и возвращает указатель на новый массив. Первая функция ищет простые числа и заносит их в новый массив, вторая – все числа кратные трем, третья – все четные числа. В программе создайте массив из 3-х указателей на эти функции. Добавьте меню, в котором пользователь может выбрать желаемую операцию.

Автор: borisbn 3.4.2012, 08:57
У тебя закралась ошибка:
Цитата(Hqw33 @  3.4.2012,  07:31 Найти цитируемый пост)
Помогите пожалуйста "написать":

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

Автор: borisbn 3.4.2012, 10:50
Ты когда тему создавал это видел ?
user posted image

Автор: bsa 3.4.2012, 12:22
Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 

Автор: borisbn 3.4.2012, 15:02
Код

#include <math.h>
#include <stdlib.h>
#include <iostream>

bool is_prime( int n ) {
    double sqrt_n = sqrt( n );
    for ( int i = 2; i <= sqrt_n; i++) {
        if (n % i == 0) {
              return false;
        }
    }
    return true;
}

int * get_primes( const int * array, int count, int & outCount ) {
    int * result = new int[ count ];
    outCount = 0;
    for ( int i = 0; i < count; i++ ) {
        if ( is_prime( array[ i ] ) ) {
            result[ outCount ] = array[ i ];
            outCount++;
        }
    }
    return result;
}

int * get_divisible_3( const int * array, int count, int & outCount ) {
    int * result = new int[ count ];
    outCount = 0;
    for ( int i = 0; i < count; i++ ) {
        if ( array[ i ] % 3 == 0 ) {
            result[ outCount ] = array[ i ];
            outCount++;
        }
    }
    return result;
}

int * get_even( const int * array, int count, int & outCount ) {
    int * result = new int[ count ];
    outCount = 0;
    for ( int i = 0; i < count; i++ ) {
        if ( array[ i ] % 2 == 0 ) {
            result[ outCount ] = array[ i ];
            outCount++;
        }
    }
    return result;
}

typedef int * (*function_t)( const int * , int , int & );
function_t functions[ 3 ] = { get_primes, get_divisible_3, get_even };

const int COUNT = 100;
int array[ COUNT ];

void print_array( int * array, int count ) {
    for ( int i = 0; i < count; i++ ) {
        std::cout << array[ i ] << " ";
    }
    std::cout << std::endl;
}

int main()
{
    for ( int i = 0; i < COUNT; i++ ) {
        array[ i ] = rand() % 100;
    }
    std::cout << "init array: " << std::endl;
    print_array( array, COUNT );
    unsigned int code;
    do {
        std::cout << "0 - prime, 1 - div 3, 2 - even. 3 - exit" << std::endl;
        std::cin >> code;
        if ( code < 3 ) {
            int outCount;
            int * p = functions[ code ]( array, COUNT, outCount );
            print_array( p, outCount );
            delete []p;
        }
    } while( code != 3 );
}


Автор: Hqw33 10.4.2012, 19:53
Большое спасибо за всю проделанную работу! 
Но прошу вас о помощи еще раз(
Данный "код" не работает, подчеркивается sqrt в начале.

Автор: borisbn 11.4.2012, 08:18
Цитата(Hqw33 @  10.4.2012,  19:53 Найти цитируемый пост)
подчеркивается sqrt в начале.

какой компилятор ?
какая ошибка (только точно) ?

Автор: Hqw33 11.4.2012, 11:53
http://s1.ipicture.ru/

Автор: borisbn 11.4.2012, 11:57
Hqw33,
1) ты так и не показал ошибку. Она выводится в окне Output
2) ты изменил подключаемые h-ники с math.h на cmath и stdlib.h на cstdlib, а используемые функции не изменил.

поставь std:: перед sqrt

Автор: Hqw33 11.4.2012, 12:45
http://s2.ipicture.ru/

Автор: borisbn 11.4.2012, 12:54
Hqw33, у меня gprs-модем... ты не мог просто скопировать текст ошибки и вставить его сюда ???

да... на самом деле std:: перед sqrt не нужно. просто компилятор не может понять, какую из перегруженных функций нужно вызвать. сделай вот так
Код
double sqrt_n = sqrt( (double)n );

Автор: Hqw33 11.4.2012, 13:01
Извиняюсь, огромное вам спасибо! 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)