Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

Открыть новую тему     Написать ответ в эту тему

Crazy_Shrike



Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вопросы по программированию на C/С++

 
  • Справочники, книги
  • Выбор IDE (среды программирования)
     
    Постарайтесь дать как можно больше информации о возникшей проблеме - это в конце концов в ваших же интересах чтобы вам помогли.

    Решения конкретных задач собираются и обсуждаются в теме Задачи по C/С++ .

    Прежде чем просить помощи в задании...
    Если позарез надо и вы даже готовы заплатить

    Как правильно задавать вопросы, если вы хотите получить ответ.

    Полезные ссылки:
    C++(eng)

  • Всего записей: 241 | Зарегистр. 25-03-2004 | Отправлено: 13:37 06-05-2004 | Исправлено: AZJIO, 19:45 12-05-2014
    LuckyELF

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот функции, м.б. какие нить помогут
     
    //---------------------------------------------------------------------------
    // Модуль генерации распределений  
     
    #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);

    Всего записей: 29 | Зарегистр. 06-03-2005 | Отправлено: 13:45 07-01-2007
    veronica b



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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;
    Сколько времени вы занимаетесь С++?
     

    Всего записей: 504 | Зарегистр. 04-12-2006 | Отправлено: 15:05 07-01-2007 | Исправлено: veronica b, 15:07 07-01-2007
    MFPSoftware



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

    ну изучать я начал с сентября, но фактически изучаю его неделю, перед сессией ^_^
     
    Насколько я знаю, остаток берется от деления числе, чаще всего для определения четности.
     
    А тут я вижу просто функцию - rand();. Где тут N и RAND_MAX ?
     
     
    А с массивами через функцию, насколько я понял, можно только по указателю работать?
     
    void mas (int *x); ?

    Всего записей: 576 | Зарегистр. 01-04-2005 | Отправлено: 16:10 07-01-2007
    veronica b



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MFPSoftware

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

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

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

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

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

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

    Всего записей: 504 | Зарегистр. 04-12-2006 | Отправлено: 17:04 07-01-2007
    MFPSoftware



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    veronica b

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

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

    Всего записей: 576 | Зарегистр. 01-04-2005 | Отправлено: 17:30 07-01-2007
    Labutin



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    MFPSoftware
    А ты в принципе понимаешь, что такое "остаток от деления" ?

    Всего записей: 935 | Зарегистр. 31-07-2001 | Отправлено: 17:40 07-01-2007
    MFPSoftware



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Labutin
    если это тоже самое, что и в алгебре, то да.

    Всего записей: 576 | Зарегистр. 01-04-2005 | Отправлено: 17:47 07-01-2007
    xdude



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    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;
     

    2.

    Код:
     
    int mix,max;
     // Получаем случайное число от 0 до RAND_MAX
    int rnd=rand();
    // Остаток от деления на max всегда будет лежать в интервале от 0 до max-1
    rnd=rnd % max;
    // Добавляем min чтобы "сместить" число в нужный нам интервал (от min до max-1)
    rnd+=min;
     

    Первый вариант предпочтителен в том случае, если нам нужно получить дробное значение (float или double), второй - если нас интересует целый результат.
     
    Добавлено
    Кстати, в случае 2. нужно помнить, что число будет лежать в интервале [min;max-1], т.е., если нам нужно число от 5 до 10, то min=5,max=11;

    ----------
    photocraft.com.ua

    Всего записей: 481 | Зарегистр. 04-11-2004 | Отправлено: 18:01 07-01-2007 | Исправлено: xdude, 18:10 07-01-2007
    Labutin



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    Тогда смотри:
    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
     

    Всего записей: 935 | Зарегистр. 31-07-2001 | Отправлено: 18:06 07-01-2007
    veronica b



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MFPSoftware

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

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

    Всего записей: 504 | Зарегистр. 04-12-2006 | Отправлено: 18:21 07-01-2007
    LuckyELF

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

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

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

    Всего записей: 29 | Зарегистр. 06-03-2005 | Отправлено: 18:29 07-01-2007
    MFPSoftware



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Сейчас тогда попрошу помощи в том, что я уже сделал, затем начну изучать то, что вы мне тут написали.
     
    Хотел я написать функцию умножение матрицы (целочисленного массива) на число, но что-то у меня не удается это сделать. Скажите, что не так?
     
    Объявил ее так:
    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 года.
     
    ЗЫ: извниняюсь, что так разрозненно отвечаю, просто сейчас сеть отключили, приходится с диалапа работать, все время онлайн быть не получается =(

    Всего записей: 576 | Зарегистр. 01-04-2005 | Отправлено: 18:51 07-01-2007
    xdude



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    MFPSoftware

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

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

    Всего записей: 481 | Зарегистр. 04-11-2004 | Отправлено: 20:35 07-01-2007 | Исправлено: xdude, 20:39 07-01-2007
    MFPSoftware



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    xdude
     
    спасибо. Теперь я понял.
     
    А не подскажешь, как написать функцию, которая бы перемножала все элементы целочисленного массива на определенное число?
     
    А то у меня с описанием указателей и потом работа с ними в функцях проблема. Когда это были простые переменные, то это еще куда ни шло, а когда массивы, то это вызывает затруднения.

    Всего записей: 576 | Зарегистр. 01-04-2005 | Отправлено: 21:57 07-01-2007
    veronica b



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    LuckyELF
    То что я вам написал, то это Си -ый код, кроме как по ссылке аргументы, или, какгворят сейчас "улучшенный Си". Есть люди, которые пишут "широкими мазками". Естественно это работает, но не красиво. Есть лишние строки.
     
    MFPSoftware
    В Си нет матриц, то есть двумерных массивов, есть массив, элементы которого есть также массив. В функцию надо передать указатель на указатель.

    Всего записей: 504 | Зарегистр. 04-12-2006 | Отправлено: 22:04 07-01-2007
    MFPSoftware



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    veronica b
    ну я так понял двумерный массив? Я его и имел ввиду.
     
    Вот только как бы я его не описывал, серавно возвращает ошибки...

    Всего записей: 576 | Зарегистр. 01-04-2005 | Отправлено: 22:33 07-01-2007
    Labutin



    Advanced Member
    Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
    MFPSoftware

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

    void func_name (int **m)
    {
    ...
    }

    Всего записей: 935 | Зарегистр. 31-07-2001 | Отправлено: 22:40 07-01-2007
    Abs62



    Gold Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    veronica b

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

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

    Всего записей: 6079 | Зарегистр. 22-10-2005 | Отправлено: 23:19 07-01-2007
    MFPSoftware



    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Ребят. У C++ или C есть какие-то стандартные способы, методы или что-либо еще по работе с векторами?
     
    А то у меня вопрос в билете:
     
    ====
    Векторы: сложение и разность, скалярное произведение.
    ====
     
    А я ни сном, ни духом. Подскажите, как быть?
    Может где-то про это написано? А то гуглом я не нашел (

    Всего записей: 576 | Зарегистр. 01-04-2005 | Отправлено: 00:54 08-01-2007
    Aleksi13



    Junior Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Заведи свой собственный класс вектор. Или структуру. Что такое векторное произведение знаешь?

    Всего записей: 114 | Зарегистр. 11-01-2006 | Отправлено: 01:25 08-01-2007
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322

    Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по программированию на C/С++


    Реклама на форуме Ru.Board.

    Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
    Modified by Ru.B0ard
    © Ru.B0ard 2000-2024

    BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

    Рейтинг.ru