Перейти к содержанию
Old Phone Forum
  • Вход

    Вы сейчас не залогинены на форуме.

    Для возможности комментариев, загрузки файлов, подписок на ответы - вам надо войти.

Как проверить правильность одной функции на С++ ?


Рекомендуемые сообщения

Проблема у меня такая.

 

Там где я учусь, проходил зачёт по информатике.

Суть его в том, что нужно было написать на БУМАГЕ функцию, которая высчитывает последовательность от дроби.

Я написал её, а мне НИЗАЧООТ.

Посмотреть ошибки нельзя было.

Я по памяти написал код и задание, а как правильность проверить - не знаю... подскажите пожалуйста.

 

Короче была дана дробь. Перед ней знак суммы, снизу n=1, а сверху m. Типа значения n меняются от 1 до m. Надо было сделать так, чтобы при каждом значении n (оно возрастает) вычислялась эта дробь (формула ниже), потом сравнение, не стало ли значение меньше чем 0.0001 (десять в минус пятой степени), если стало, то прекратить подсчёт суммы, а так нужно , чтобы постоянно вычислялась сумма при меняющемся n и складывалось в переменную S.

 

ЗНАК

СУММЫ, где значения меняются от n=1 до m у дроби 1\ (n^3 + [корень из X+n])

 

Вот код за который мне НИЗАЧООТ.

 

 

 

double DROB (DOUBLE, INT); // объявляем функцию

double DROB (DOUBLE S, INT m) // вызываем её

{

int n;

double K,L,P,R,X,T; // объявляем кучу переменных

K = n * n * n;

L = X + n;

n=1;

P = double sqrt (double L); // создаём знаменатель у дроби

T = 0.0001; // 0.0001 = 10 в минус 5-й степени

while (n<m) // организовываем цикл, пока n не превысит m

{S=0.0

R = 1 / K + P; // считаем дробь

If (R<T) // а не меньше ли её значение чем 0.0001 ?

{break;} // если меньше, то цикл прерываем

else // если же нет, то суммируем в переменную S

{S=S+R

n++ // затем увеличиваем значение n на единицу и снова начинаем цикл

return S;}

}

}

Изменено пользователем Позитрон

Двери есть везде, нужно просто знать как в них войти!

Ссылка на комментарий
Поделиться на другие сайты

Я бы только за стиль написания кода да за этот замечательный абзац

int n;

double K,L,P,R,X,T; // объявляем кучу переменных

K = n * n * n;

L = X + n;

n=1;

сразу отправил на повторный курс. Ни одно из значений результирующих не будет правильным, пройдись по объявлению переменных и найди не синтаксическую, а смысловую ошибку.

 

ЗЫ Без компилятора могу тебе сказать, что у тебя компилятор ругнётся в строке R = 1 / K + P; при работе программы, ругнётся на деление на ноль.

Бывших SGH`овцев не бывает.

Глупый модератор применяет наказания для самоутверждения.

Умный - для поддержания порядка. Мудрый - не применяет вообще!

 

Убийцу можно понять, но нельзя простить. Предателя можно простить, но нельзя понять. Бойтесь равнодушных - именно с их молчаливого согласия совершаются все предательства и убийства на земле.

Ссылка на комментарий
Поделиться на другие сайты

Твоя функция вообще в корне неправильная:

1) Переменные K,L и P тебе нужно вычислять на каждой итерации цикла. А здесь они у тебя вычисляются один раз, да ещё причём для неизвестного n. Переменная n у тебя не определена и равна мусору.

2) Обнуление и возврат S надо делать не в цикле, а за ним. А так у тебя цикл выпонится один раз, и на првой же итерации возвратится s.

Здесь однозначно незачёт, даже спорить нечего.

 

Вот как бы я написал без компилятора эту функцию:

#include <math.h>
#define lim 0.0001

float func(float x,int m)
{
 int n=1;
 float s=0,rez;
 do
{
  rez=1/(n*n*n+sqrt(x+n));
  s+=rez;
}
 while((n++)<m && rez>=lim);
 return s;
}

Ссылка на комментарий
Поделиться на другие сайты

сразу отправил на повторный курс.

 

Очень гуманно...

 

 

 

 

Вот немного модифицировал, лучше ли, чем было?

 

 

double SUMMA (int m, double x) // вызываем функцию, которой даны аргументы m и x

{

double S=0.0; // присваиваем S начальное значение

double LIM=0.0001;

for (int n=1, n<m, n++)

{ S = S + (1/(n*n*n + sqrt(n+x))); // вычисляем сумму

if (S<LIM) // а не меньше ли она переменной LIM ?

{

break; // если да, то прекращаем цикл

}

return S;

}

 

 

 

Вот только вопрос неясен, допустимо ли во так S = S + (1/(n*n*n + sqrt(n+x))); или надо вот так

R = (1/(n*n*n + sqrt(n+x)));

S = S + R;

 

?

Двери есть везде, нужно просто знать как в них войти!

Ссылка на комментарий
Поделиться на другие сайты

Вот только вопрос неясен, допустимо ли во так S = S + (1/(n*n*n + sqrt(n+x))); или надо вот так

допустимо, приоритет присваивания самый низкий, но тебе нужно (1/(n*n*n + sqrt(n+x))) сравнить с LIM, поэтому всё же логичнее хранить его в отдельной переменной.

 

Научись правильно форматировать код, плохо структурированный код работать нормально не будет.

Бывших SGH`овцев не бывает.

Глупый модератор применяет наказания для самоутверждения.

Умный - для поддержания порядка. Мудрый - не применяет вообще!

 

Убийцу можно понять, но нельзя простить. Предателя можно простить, но нельзя понять. Бойтесь равнодушных - именно с их молчаливого согласия совершаются все предательства и убийства на земле.

Ссылка на комментарий
Поделиться на другие сайты

Проблема у меня такая.

Там где я учусь, проходил зачёт по информатике.

Суть его в том, что нужно было написать на БУМАГЕ функцию, которая высчитывает последовательность от дроби.

Я написал её, а мне НИЗАЧООТ.

Посмотреть ошибки нельзя было.

Я по памяти написал код и задание, а как правильность проверить - не знаю... подскажите пожалуйста.

 

А у меня есть подозрение, что я знаю, где ты учишься :53:

Или не только в нашем универе заставляют проги на бумаге писать??? :idea:

Надеюсь тебе объяснили, как надо было писать :idea: а то я давно этим занимался :128:

Лучше работать завтра, чем сегодня...

Ссылка на комментарий
Поделиться на другие сайты

Учусь я в Аэрокосмическом универе.

 

А проги на бумаге пишем, хоть там отстроили целый корпус под медиацентр. с компами.

 

Я ж не знаю, скомпилируется она или нет, а препод когда проверяет - как будто прям в уме компилирует

Двери есть везде, нужно просто знать как в них войти!

Ссылка на комментарий
Поделиться на другие сайты

Позитрон,

когда научишься писать на бумаге - на компе будет меньше времени уходить на исправление ошибок при компиляции кода. Мы весь 1 курс писали на бумаге :)

Ссылка на комментарий
Поделиться на другие сайты

хм.. а я думал такое только у нас... вот же... оказывается, везде так пишут...

Лучше работать завтра, чем сегодня...

Ссылка на комментарий
Поделиться на другие сайты

когда научишься писать на бумаге - на компе будет меньше времени уходить на исправление ошибок при компиляции кода. Мы весь 1 курс писали на бумаге

Прям ДАО, "Научись кушать без еды, потом с едой будет проще" 8)

Бывших SGH`овцев не бывает.

Глупый модератор применяет наказания для самоутверждения.

Умный - для поддержания порядка. Мудрый - не применяет вообще!

 

Убийцу можно понять, но нельзя простить. Предателя можно простить, но нельзя понять. Бойтесь равнодушных - именно с их молчаливого согласия совершаются все предательства и убийства на земле.

Ссылка на комментарий
Поделиться на другие сайты

"Научись кушать без еды, потом с едой будет проще"

ну да, типа того 8)

Ссылка на комментарий
Поделиться на другие сайты

Раз уж одну из 2-х функций я кое-как добил, то попробовал другую сделать.

 

 

Вторая:

В массиве из 500 чисел типа double найти минимальное по модулю значение.

Надо чтобы в качестве возвращаемого значения был порядковый номер найденного числа в массиве, а массив принимается как параметр.

 

Вот что я насочинял

 

double MASSIVE (double A[500]) // функция, которой дан массив из пятисот значений

{

int N = 0;

double MIN = A[0];

if (MIN < 0)

{MIN = -MIN;

}

else { ; }

for (int i=0; i<500; i++)

{

if ( A < 0)

{ A = -A;

if (A < MIN)

{ MIN = A;

N = i;}

else

{N = 0;}

 

else

{ if (A < MIN)

{ MIN = A;

N=i; }

else

{N=0;} }

}

RETURN N;

}

}

 

 

 

Вопрос

 

Если требуют "результат проверки присвоить булевской переменной"

то это например так делается

 

bool K;

if (условие выполняется)

{ K = true; }

else

{ K = false;}

return K;

 

 

?

 

 

 

das,

 

Если я хочу портировать патч, то сначала мне это надо сделать на бумаге?

Двери есть везде, нужно просто знать как в них войти!

Ссылка на комментарий
Поделиться на другие сайты

Если я хочу портировать патч, то сначала мне это надо сделать на бумаге?

это уже совсем другое :132:

Ссылка на комментарий
Поделиться на другие сайты

#include "stdio.h"
#include "math.h"


#define ARR_SIZE 500

// return position of fabs(min element)
int MinValGetter( const double * pArr, int iSize );

int main()
{
double dValues[ARR_SIZE];

//init array here

int iMinElemPost = MinValGetter( dValues, ARR_SIZE );

return 0;
}

int MinValGetter( const double * pArr, int iSize )
{
int iCount = 0;

//set first element of sequence as min element
int iMinValuePos = 0; 
double dTempMinValue = fabs(pArr[0]); 

while ( iCount < iSize )
{
	if ( dTempMinValue > fabs(pArr[iCount]) )
	{
		dTempMinValue = pArr[iCount];
		iMinValuePos = iCount;
	}

	iCount++;
}

return iMinValuePos;
}

 

Я так понимаю, что STL использовать нельзя, написал без него. Оптимизировать можно, но лень. Сложность алгоритма О(N).

 

Если требуют "результат проверки присвоить булевской переменной"

то это например так делается

 

bool bMyBoolFlag;

if (/*true*/)
{
bMyBoolFlag = true;
}
else
{
bMyBoolFlag = false;
}

return bMyBoolFlag;

 

Ставь отступы правильно. Внимательно глянь на то, как пишешь код ты и как его НУЖНО ПИСАТЬ. Ты через две недели такой криво написанный код будешь разбирать НАМНОГО дольше, чем написанный хоть каким-то стилем.

Бывших SGH`овцев не бывает.

Глупый модератор применяет наказания для самоутверждения.

Умный - для поддержания порядка. Мудрый - не применяет вообще!

 

Убийцу можно понять, но нельзя простить. Предателя можно простить, но нельзя понять. Бойтесь равнодушных - именно с их молчаливого согласия совершаются все предательства и убийства на земле.

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйте новый аккаунт в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти


×
×
  • Создать...