Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: LuckyELF
Дата сообщения: 07.01.2007 12:45
Вот функции, м.б. какие нить помогут

//---------------------------------------------------------------------------
// Модуль генерации распределений

#pragma hdrstop

#include "Generate.h"

//---------------------------------------------------------------------------
// Генерация случайной величины, равномерно распреденной в интервале [0, 1]
double GetRand()
{
double r=rand();
r/=RAND_MAX;

return r;
}

//---------------------------------------------------------------------------
// Генерация случайной величины, равномерно распределенной в интервале [a, b]
double GetRand(double a, double b)
{
double r=GetRand();

r=a+(b-a)*r;

return r;
}

//---------------------------------------------------------------------------
// Вычисление обратной функции стандатного нормального распределения
// p - доверитеьный уровень
double InverseNormalDistribution(double p)
{
bool flag=true; // Параметр для учета симметрии распределения
double t;

if (p < 0.5)
p=1-p;
else if (p==0.5)
return 0.0;
else flag=false;

// Разложение в ряд
t=sqrt(-2.0*log(1.0-p));
t-=(2.515517+0.802853*t+0.010328*t*t)/(1.0+1.432788*t+0.189269*t*t+0.001308*t*t*t);

if (!flag)
return t;
else
return -t;
}

//---------------------------------------------------------------------------
// Генерация случайной величины, нормально распределенной с параметрами [0, 1]
double GetNormalDistribution()
{
double r=GetRand();

r=InverseNormalDistribution(r);

return r;
}

//---------------------------------------------------------------------------
// Генерация случайной величины, нормально распределенной с параметрами [m, s*s]
// m - математическое ожидание
// s - среднеквадратическое оклонение
double GetNormalDistribution(double m, double s)
{
double r=GetNormalDistribution();

r=m+s*r;

return r;
}

#pragma package(smart_init)


Добавлено:

Цитата:
ЗЫ: неужели никто не знает, как написать прототип функции, которая бы в качестве параметров должна была бы принять массив и на выходе тоже возвращала массив.


int* my_function (int* nMass);
Автор: veronica b
Дата сообщения: 07.01.2007 14:05
LuckyELF
Есть несколько замечаний по вашему коду.


Цитата:
// Генерация случайной величины, равномерно распреденной в интервале [0, 1]
double GetRand()
{
double r=rand();
r/=RAND_MAX;

return r;
}


Я бы написал вот так

inline double GetRand()
{
return double(rand())/RAND_MAX;
}


Цитата:
// Генерация случайной величины, равномерно распределенной в интервале [a, b]
double GetRand(double a, double b)
{
double r=GetRand();

r=a+(b-a)*r;

return r;
}


Я бы написал так

double GetRand(const double& high = 1.0, const double& low = 0.0)
{
return low + (high - low)*(double(rand())/RAND_MAX) ;
}

В С++ любой объект, размером больше 4-х байт рекомендуется передовать по ссылке. Кстати, теперь и первая функция не нужна.
Вот этот код

Цитата:
if (!flag)
return t;
else
return -t;


я бы написал вот так.
return flag ? -t : t;
Сколько времени вы занимаетесь С++?

Автор: MFPSoftware
Дата сообщения: 07.01.2007 15:10

Цитата:
Сколько лет вы занимаетесь языком Си?

ну изучать я начал с сентября, но фактически изучаю его неделю, перед сессией ^_^

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

А тут я вижу просто функцию - rand();. Где тут N и RAND_MAX ?


А с массивами через функцию, насколько я понял, можно только по указателю работать?

void mas (int *x); ?
Автор: veronica b
Дата сообщения: 07.01.2007 16:04
MFPSoftware

Цитата:
ну изучать я начал с сентября, но фактически изучаю его неделю, перед сессией

Вы меня развесилили. Я его тоже начал учить в сентябре, но 1993 года. Начал далеко не с нуля и только через три года, занимаясь почти каждый день, что я его знаю. Правда. я ещо и учил программирование под Windows.

Цитата:
А тут я вижу просто функцию - rand();. Где тут N и RAND_MAX ?


N - это просто обозначение любого числа.
RAND_MAX - это постоянная, определенная в файле stdlib.h, который вы должны также подключить.

Цитата:
А с массивами через функцию, насколько я понял, можно только по указателю работать?

Все правильно.

Автор: MFPSoftware
Дата сообщения: 07.01.2007 16:30
veronica b

Цитата:
Вы меня развесилили. Я его тоже начал учить в сентябре, но 1993 года. Начал далеко не с нуля и только через три года, занимаясь почти каждый день, что я его знаю. Правда. я ещо и учил программирование под Windows.

А что тут смешного? В институте его заставили учить. Сейчас пытаюсь разобраться в некоторых его особенностях.

Серавно я не понимаю, как же так задать диапазон... Похоже ты просто не понимаешь то, что я пытаюсь спросить... Как связаны с этой функцией переменные N и RAND_MAX ? Как с помощь них задается диапозон?
Автор: Labutin
Дата сообщения: 07.01.2007 16:40
MFPSoftware
А ты в принципе понимаешь, что такое "остаток от деления" ?
Автор: MFPSoftware
Дата сообщения: 07.01.2007 16:47
Labutin
если это тоже самое, что и в алгебре, то да.
Автор: xdude
Дата сообщения: 07.01.2007 17:01
MFPSoftware

Цитата:
Серавно я не понимаю, как же так задать диапазон...

Блин, ребята, причем тут программирование в общем и C в частности? Это реально чистейшая математика, если не сказать арифметика.
По определению, функция rand() возвращает случайное число в диапазоне от 0 до RAND_MAX (RAND_MAX - это константа, равная 32767 в мелкосовтовских компиляторах, MS VC++ например, и 2147483647 в GNU C library). В нашем случае, конкретное значение RAND_MAX роли не играет.
Чтобы полученный результат лежал в нужном нам интервале (например, от min до max), нужно произвести некоторое преобразование. Здесь можно пойти двумя путями:

1.

Код:
double min,max;
// Получаем случайное число от 0 до RAND_MAX
double rnd=rand();
// "Масштабируем" полученное число, чтобы оно "влезло" в интервал от 0 до (max-min)
rnd=(((double) rand() / (double) RAND_MAX) * (max-min));
// Добавляем min чтобы "сместить" число в нужный нам интервал (от min до max)
rnd+=min;
Автор: Labutin
Дата сообщения: 07.01.2007 17:06
Тогда смотри:
rand() возвращяет число от 0 до RAND_MAX (константа, заданная в файле в stdlib.h и равна 32767 - это тебе не изменить.
Но тебе нужно число в другом диапазоне.
Если взять остаток от деления любого числа на N, то получится некоторое другое число в диапазоне от 0 до N-1 (это и в алгебре и в программировании одинакого)
Теперь понятно, почему тут:

Цитата:
( value % 100 ) is in the range 0 to 99

получается число от 0 до 99 ?
Т.о. образом для тебя:

Цитата:
как заставить функцию rand вернуть случайное значение от 0 до 6?

ответом будет:
x = rand() % 7

Автор: veronica b
Дата сообщения: 07.01.2007 17:21
MFPSoftware

Цитата:
А что тут смешного? В институте его заставили учить. Сейчас пытаюсь разобраться в некоторых его особенностях

Я просто удивляюсь наивности преподователей верующих, что Си, я не говорю о Си++, можно выучить за семестр. Вам я могу только посочувствовать и помочь чем могу. Кстати, а что вы изучаете?
Автор: LuckyELF
Дата сообщения: 07.01.2007 17:29

Цитата:
LuckyELF
Есть несколько замечаний по вашему коду.

Код не мой, знакомый делал модель, а его друг помогал ему, я у него потом исходники взял посмотреть.
А собственно с чего вы взяли что код именно С++?
Насколько я знаю, эти функции писал человек имеющий международный диплом по С, на самом деле мне по фиг, все работало, друг мой диплом защитил на отлично

На сколько я вижу все изменения это примочки С++, я почти также писал бы.

Добавлено:
Кстати я вообще сам не пойму сколько я занимаюсь С++, начал в 98 году учить Си. Спустя года 3 учили С++, совсем чуть-чуть, сдали экзамен и забыли
По скольку программирую чисто для себя и довольно мало, то код у меня получается в перемешку Си и С++, вот так
Автор: MFPSoftware
Дата сообщения: 07.01.2007 17:51
Сейчас тогда попрошу помощи в том, что я уже сделал, затем начну изучать то, что вы мне тут написали.

Хотел я написать функцию умножение матрицы (целочисленного массива) на число, но что-то у меня не удается это сделать. Скажите, что не так?

Объявил ее так:
void CON (int* x, int n)
{
    while (*x != NULL)
        *x *= n;
    
}

Вызываю так:
#define M 4
#define N 3 // кстати, можно это как-то уместить в одну строку?

int A[M][N] = {{1, 2, 3}, {1, 2, 3}, {1, 2, 3}, {1, 2, 3}};
CON(A, 2); //умножить каждый элемент массива на 2.

Пишет, что не может преобразовать int[4][3] к типу инт.

Добавлено:
xdude
Labutin
спасибо вам. До меня просто не доходило, что вместо того, что бы задавать параметры генератору, нужно просто обработать число, которое оно вернет, таким образом, что бы оно попало в этот промежуток. Я просто думал, что таким диким образом задаются параметры генератору, вот и не мог понять ничего ^_^.

Теперь насчет предложенных вариаций на тему рэндома.
xdude
Насколько я понял, второй способ можно заменить вот такой штукой - rand() %7 +1; (должно было быть с единицы до 6, но на практике это не так, потому что когда прибавляешь к нему минимум, он уже гарантированно будет выше него, но уже может быть и выше максимума, если бы, например, шестеркой.

veronica b


Цитата:
Я просто удивляюсь наивности преподователей верующих, что Си, я не говорю о Си++, можно выучить за семестр. Вам я могу только посочувствовать и помочь чем могу. Кстати, а что вы изучаете?

Он не пытается нас все за семестр заставить нас выучить, просто сейчас сессия будет и все это нужно сдавать, что мы прошли за этот семестр. А изучать Си нам еще 3-4 года.

ЗЫ: извниняюсь, что так разрозненно отвечаю, просто сейчас сеть отключили, приходится с диалапа работать, все время онлайн быть не получается =(
Автор: xdude
Дата сообщения: 07.01.2007 19:35
MFPSoftware

Цитата:
Насколько я понял, второй способ можно заменить вот такой штукой - rand() %7 +1

Можно, но немного не так. Универсальный вариант будет выглядеть так:
res=min + rand() % (max +1);


Добавлено:
Блин, пиво
на самом деле, вот так:
res = min + rand() % (max - min + 1);
Автор: MFPSoftware
Дата сообщения: 07.01.2007 20:57
xdude

спасибо. Теперь я понял.

А не подскажешь, как написать функцию, которая бы перемножала все элементы целочисленного массива на определенное число?

А то у меня с описанием указателей и потом работа с ними в функцях проблема. Когда это были простые переменные, то это еще куда ни шло, а когда массивы, то это вызывает затруднения.
Автор: veronica b
Дата сообщения: 07.01.2007 21:04
LuckyELF
То что я вам написал, то это Си -ый код, кроме как по ссылке аргументы, или, какгворят сейчас "улучшенный Си". Есть люди, которые пишут "широкими мазками". Естественно это работает, но не красиво. Есть лишние строки.

MFPSoftware
В Си нет матриц, то есть двумерных массивов, есть массив, элементы которого есть также массив. В функцию надо передать указатель на указатель.
Автор: MFPSoftware
Дата сообщения: 07.01.2007 21:33
veronica b
ну я так понял двумерный массив? Я его и имел ввиду.

Вот только как бы я его не описывал, серавно возвращает ошибки...
Автор: Labutin
Дата сообщения: 07.01.2007 21:40
MFPSoftware

Цитата:
Вот только как бы я его не описывал, серавно возвращает ошибки...

void func_name (int **m)
{
...
}
Автор: Abs62
Дата сообщения: 07.01.2007 22:19
veronica b

Цитата:
Есть люди, которые пишут "широкими мазками". Естественно это работает, но не красиво. Есть лишние строки.

Просто это два разных подхода к написанию исходников - писать компактно, или писать наглядно. Если пишешь небольшую утилитку для себя, можно писать и компактно, чисто для эстетического удовольствия. А вот если в исходнике не слишком малых размеров придётся разбираться другим людям (да даже и самому, несколько лет спустя, когда ужё сам забыл, что писал), наглядный подход вне конкуренции. Стоит пару раз поразбирать очень компактно написанные исходники, матеря всеми словами автора, и в этом убеждаешься на всю жизнь.
Автор: MFPSoftware
Дата сообщения: 07.01.2007 23:54
Ребят. У C++ или C есть какие-то стандартные способы, методы или что-либо еще по работе с векторами?

А то у меня вопрос в билете:

====
Векторы: сложение и разность, скалярное произведение.
====

А я ни сном, ни духом. Подскажите, как быть?
Может где-то про это написано? А то гуглом я не нашел (
Автор: Aleksi13
Дата сообщения: 08.01.2007 00:25
Заведи свой собственный класс вектор. Или структуру. Что такое векторное произведение знаешь?
Автор: MFPSoftware
Дата сообщения: 08.01.2007 00:31
Aleksi13
я занимаюсь всего пол года и мы таких вещей, как собственный класс не проходили, по этому работать с ними предполагается как-то по другому.

В некоторых листинках я видел такой тип, как вектор. Объявлялся что-то вроде этого:

vector V;

Вот только как работать с ним - я не знаю (
Автор: Aleksi13
Дата сообщения: 08.01.2007 00:44
Скорее всего это одномерный массив.
Например vector<int> a;
Автор: MFPSoftware
Дата сообщения: 08.01.2007 01:16
А для чего он тогда нужен, если можно создать обычный массив?
Вот тут я кое-что нашел про векторы, но это что-то довольно специализированно на гейм девелоперстве ( http://alenacpp.blogspot.com/2005/06/vector_30.html )

ЗЫ: снова попытался сделать функцию по умножению матрицы на число, но так ничего и не получилось. Вот код:


Код:
#include <iostream>

using namespace std;

void mas(int **x, int n);

int _tmain(int argc, _TCHAR* argv[])
{
int M[3][3] = {1,2,3,4,5,6,7,8,9};
mas(M, 2);
return 0;
}

void mas(int **x, int n)
{
int i, j;
for (i=0; i<3; i++)
for (j=0; j<3; j++)
*x[i][j] *= n;
}
Автор: LuckyELF
Дата сообщения: 08.01.2007 01:22

Цитата:
veronica b


Цитата:
То что я вам написал, то это Си -ый код, кроме как по ссылке аргументы, или, какгворят сейчас "улучшенный Си". Есть люди, которые пишут "широкими мазками". Естественно это работает, но не красиво. Есть лишние строки.


М.б. так и есть, но только я думал, что

Цитата:
inline


Цитата:
const double& high = 1.0


Цитата:
flag ? -t : t;


исключительно С++ вещи, чтоже век живи век учись.
Работает и некрасиво, этот показатель не особо катит, у каждого свои понятия о красоте, кому-то нравится все одну длиннючую строчку, с кучей операций, а кому-то лучше когда операции разбиты по строчкам.
А лишних строк ваще быть не может, выкинь хоть одну и все перестанет работать, если конечно ее не заменить другой, но тогда она не была лишней, иначе бы ее не пришлось заменять

В общем-то работает и ладно, никто не просил красивого кода, нужен был работающий
Автор: xdude
Дата сообщения: 08.01.2007 03:34
MFPSoftware
Попробуй вот здесь:

Цитата:
*x[i][j] *= n;

убрать вначале *, получится x[i][j] *= n;
Должно сработать, по идее.

Добавлено:
MFPSoftware

Цитата:
В некоторых листинках я видел такой тип, как вектор. Объявлялся что-то вроде этого:
vector V;

На самом деле, это темплейт класса из стандартной библиотеки темплейтов для C++ (STL). Очень полезная и многофункциональная штука. Например, если нужен вектор целых чисел, то его можно объявить как vector<int> vc, ну и соответственно vector<double> vc - это вектор вещественных чисел. В этом классе много полезных методов, например, vc.push_back(2) добавит в конец массива число 2. Очень полезно, если размер массива заранее неизвестен, и его нужно пестепенно заполнять значениями по мере их поступления (например, при вводе с клавиатуры). Ну и соответственно из него можно слепить двухмерный массив (то есть массив массивов), приблизительно так:
vector<vector<int>> vt;
Хотя сам я не пробовал, но по идее должно сработать.
Все это описывается в #include <vector> в пространстве имен std (т.е., нужно использовать директиву using namespace std). А в #include <algorithm> можно найти массу полезных функций для различных преобразований массивов, например, сортировку и т.д.
Автор: veronica b
Дата сообщения: 08.01.2007 08:13
LuckyELF
Я вижу что немножко обиделтсь за парня с международным дипломом по Си. Честно говоря, я об этом не слышал. Конечно, "inline " и "const double& high = 1.0" это и есть улучшенный Си. Все, что не использует классы, есть улучшенный Си. Но вот эта конструкция

Цитата:
flag ? -t : t;

есть самый "чистый" Си, как говорят K&R.


Цитата:
В общем-то работает и ладно, никто не просил красивого кода, нужен был работающий

В общем, это не правильная тенденция, в Си "красивый", именно Си шный код на порядок имеет меньше ошибок.
Автор: LuckyELF
Дата сообщения: 08.01.2007 11:58

Цитата:
veronica b


Цитата:
Я вижу что немножко обиделтсь за пврня с международным дипломом по Си.

Честно - не понял кто за что и на кого обиделся
Я к сожалению не знаю четких границ между Си и С++, не тот уровень у меня, собственно по фиг работает и ошибок там нет, что еще нужно?

Человек на самом деле вполне востребованный и без этого диплома, хотя программировать ему уже надоело , вообще на сколько я понял в россии, по крайней мере в глубинке этот диплом на фиг не кому не нужен, в их контроре на стене висело 2 или 3 диплома (Си, HTML и еще что-то), и не фига ими никто не пользовался, на сколько я знаю получали они их через интеренет, типа регистрируешься отвечаешь на кучу вопросов по стандарту скажем Си, если сдал тебе высылают диплом, ну в общем если интересно я могу спросить что да как.
Автор: Labutin
Дата сообщения: 08.01.2007 12:05

Цитата:
получали они их через интеренет, типа регистрируешься отвечаешь на кучу вопросов по стандарту скажем Си, если сдал тебе высылают диплом

Видимо http://www.brainbench.com/
В России на эти дипломы практически никто не обращает внимания
Автор: veronica b
Дата сообщения: 08.01.2007 13:35
LuckyELF

Цитата:
Честно - не понял кто за что и на кого обиделся

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


Цитата:
Я к сожалению не знаю четких границ между Си и С++, не тот уровень у меня, собственно по фиг работает и ошибок там нет, что еще нужно?


По первому приближению, если используется классы, то это Си++.
Автор: LuckyELF
Дата сообщения: 08.01.2007 13:42

Цитата:
Ну лично на вас я не как немог обидется. Сдать по интернету экзамен, это просто "для себя". Как можно удостоверится, тот ли человек, чья фамилия в дипломе, сдавал экзамен? Я, любого нормального человека за месяц научу языку Си, а вот будет ли он писать программы, достойные оплаты, зависит от его способностей.


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

Добавлено:

Цитата:
Видимо http://www.brainbench.com/
В России на эти дипломы практически никто не обращает внимания


м.б.
в любом случае им это пошло только на пользу, знания полученные при подготовке можно всегда применить.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.