Софтуерно Инженерство
Loading...
+ Нов въпрос
zzerro avatar zzerro 11 Точки

Интерполация (от упражненията)

Здравейте!

В упражненията беше даден този цикъл, който извършва същинската интерполция:

    double step = dataSize / (double) numSamples;

    int posInResult = 0;

    for (double pos = 0; pos < dataSize; pos += step) {
        int actualPos = (int) pos;

        result [posInResult] = data [actualPos];
        posInResult++;
    }

Също така ставаше дума и за добра четимост. Искам да предложа още един вариант със съвсем познат вид на цикъла:

    double step = dataSize / (double) numSamples;

    double posInResult = 0;

    for (int i = 0; i < numSamples; i++) {
        result [i] = (int) posInResult;
        posInResult = posInResult + step;
    }

0
C++ Programming 15/03/2017 12:32:05
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

Искаш да кажеш:

double step = dataSize / (double) numSamples;

double posInResult = 0; double posInData = 0;

for (int i = 0; i < numSamples; i++) {
    result [i] = (int) posInResult; result[i] = data[(int)posInData];
    posInResult = posInResult + step; posInData = posInData + step;
}

предполагам ;) Ние на ръка тествахме с числа, които съвпадаха с индексите, но ако са други числата, твоето няма да работи. Но предполагам е просто недоглеждане.

Иначе да, това също е добър вариант на кода за тази задача :)

Поздрави,

Жоро

0
zzerro avatar zzerro 11 Точки

Благодаря за бързия отговор!

Все пак въпросът е какво точно искаме да получим чрез интерполацията: индексите в testData[] (моят вариант) или направо стойностите (лекцията). Всичко си работи, но изходът трябва да се оправи:

    for(int i = 0; i < 10; i++) {
        cout << samples[i] << endl;     cout << testData [ samples[i] ] << endl;
    }

Поздрави и на теб!

0
georgi.stef.georgiev avatar georgi.stef.georgiev 921 Точки

А, да, сега разбирам, да - ако го ползваш така, ще работи както трябва. Още една причина, поради която трябваше да кръстя по време на упражнението резултата на функцията sampledData (и тогава ти щеше да кръстиш твоя вариант sampledIndices, или нещо такова), за да е по-ясно

0
zzerro avatar zzerro 11 Точки

result [i] = (int) posInResult; result [i] = data [ (int) posInData ];

ето това май е най-доброто за копиране на стойности...

Ама аз имам друг въпрос. По време на упражненията до мен седеше едно момче от Сърбия и ме попита защо функцията е със звезда: int *getSamples(int data[], int dataSize, int numSamples).... Тръгнах да му обяснявам, че не можем да върнем пойнтер, ако функцията е от друг вид, т.е. всяка функция връща точно и само типа, в който е декларирана. Обаче се запънах, защото в мен се породи съмнение за въпросния нов масив, който създаваме в нея. Мислех си няма ли да стане същото, ако го направим като обикновен масив и запазим само пойнтера към него? Бях му обещал да направя тема във форума - и ето я laugh Досега се мъчих, обаче ако направим масив по обикновения начин, то в него не остават нито индекси, нито стойности пренесени от testData []. Ако някой иска да пробва (или има друга идея - нека я предложи), ето какво опитвах:


    int* result = new int[numSamples]; // работещ вариант

    int indexData[numSamples]; //неработещ
    int* result = indexData;        //вариант. След излизане от функцията всичко се губи.

0