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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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
    BagaBaga

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    juvaforza,
    спасибо. Об этом я не подумал (может, действительно кто захочет применить к такому указателю delete).
     
    karakurt2,
    Спасибо. Теперь я знаю, откуда у "метода" ноги растут. Хотя, наверняка, были и более ранние работы, но эта уж точно популяризировала этот метод.
     
    Есть любопытный вопрос про выделение памяти с new.
    Вроде как new должно порождать исключение, если выделить память не удалось (ну, или возвращать NULL-указатель при выделение памяти в С-стиле через nothrow).
     
    Так вот, если запросить на 32-разрядной системе
    new int [n]
    где sizeof(int)*n>2Gb (на реальном примере я "неглядя" попросил больше 4),
     
    то память "как бы" выделяется - ни исключения не порождается, ни NULL-указателя не выдаётся. Зато при попытках обращения (записи) уже в процессе выполнения происходит segmentation fault. Это нормальное поведение для new? Или же он должен был дать "отлуп"?

    Всего записей: 463 | Зарегистр. 14-11-2005 | Отправлено: 10:46 04-10-2012
    panda3

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Думаю, тут нет ошибки.
    new int [n]  эквивалентно (int*)operator new[](n * sizeof(int));
    аргумент operator new имеет тип size_t (32 бит).
    Проблема переполнения при умножении в C++ - это проблема программиста, а не компилятора.
    Если в компиляторе включена опция типа Smaller Type Check в MSVC, то ошибку можно словить, объявив n как unsigned long long (т.е. 64 бит).

    Всего записей: 203 | Зарегистр. 06-02-2007 | Отправлено: 14:37 04-10-2012
    BagaBaga

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот такой вопрос. "Раньше" при выводе в консоль "выводили строчку", потом 21 прерыванием её убирали и "рисовали на ёё месте" новую, эмулируя таким способом, например, таймер или счётчик. Реально ли повторить этот финт с использованием стандартных потоков ввода-вывода (cin/cout)? Или что попало, то "не отменить"?

    Всего записей: 463 | Зарегистр. 14-11-2005 | Отправлено: 14:19 05-10-2012
    adasiko



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    BagaBaga
    А если
    cout << "1%";
    cout << "\r2%";

    Всего записей: 1807 | Зарегистр. 30-06-2008 | Отправлено: 17:04 05-10-2012 | Исправлено: adasiko, 17:04 05-10-2012
    BagaBaga

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

    Всего записей: 463 | Зарегистр. 14-11-2005 | Отправлено: 23:41 05-10-2012
    BagaBaga

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Вот такой вопрос: не пойму, что произойдёт.
    Есть функция, принимающая ссылку на vector, и возвращающая ссылку на vector.
     
    vector& func(vector &vec){ return vec;}
     
    Так вот, что будет, если вызов будет сделан таким образом:
    vector &vv = func(vector(some)).
    Т.е. в том случае, когда экземпляр вектора передаётся в функцию через анонимную временную переменную (вызов конструктора vector происходит внутри '()' )? vv будет невалидным?

    Всего записей: 463 | Зарегистр. 14-11-2005 | Отправлено: 17:37 16-10-2012
    panda3

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Естественно, временный объект после вызова функции будет уничтожен, а у вас останется на него ссылка.

    Всего записей: 203 | Зарегистр. 06-02-2007 | Отправлено: 13:12 18-10-2012
    YuriyRR



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

    Цитата:
    vector(some)

    это никакой не вызов конструктора, а указание компилятору как воспринимать some. ничего не произойдет (

    Всего записей: 516 | Зарегистр. 07-06-2007 | Отправлено: 14:35 18-10-2012
    BagaBaga

    Full Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Погоди-погоди.
     
    std::vector <int> a; //объявляем вектор, вызывается конструктор по умолчанию
    std::vector <int> b(3); // объявляем вектор с указанием его размера, элементы инициируются значением по умолчанию
    std::vector <int> b(3,10); // объявляем вектор с указанием его размера, элементы инициируются значением 10
    std::vector с(b); // объявляем вектор, инициируем его значением другого вектора, если я ничего не путаю, вызывается конструктор копирования. Тип для специализации шаблона можно вроде как не указывать, т.к. компилятор может его вывести из b. Но можно "для уверенности" и указать.
     
    Теперь есть функция (для простоты пусть ничего не возвращает)
    void func(std::vector<int>& tmp) {return;} //Допустим, что оптимизатор не заменит её "пустым местом".
     
    Когда делается вызов
    func(std::vector<int> (b))  
    происходит создание анонимной временной переменной, которая инициализируется вектором b, ссылка на которую и передаётся в функцию.
     
    В принципе, можно сделать и без анонимной временной переменной, например
    std::vector<int> tmp_vec(b);
    func(tmp_vec);
    Тогда эта переменная не станет анонимной (т.к. мы явно её декларируем. В прочем, в данном примере ничего не изменится, если использовать исходную переменную b, а не вводить некую новую временную). Но тогда и мой вопрос (исходный) теряем смысл, т.к. такой вызов законен в пределах видимости переменной tmp_vec. Весть вопрос де-факто сводится к области видимости (если угодно - времени жизни) анонимной временной переменной (создаваемой при вызове функции).  

    Всего записей: 463 | Зарегистр. 14-11-2005 | Отправлено: 00:17 19-10-2012 | Исправлено: BagaBaga, 00:25 19-10-2012
    RoMiGoR



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Такой вопрос, есть задача http://informatics.mccme.ru/moodle/mod/statements/view3.php?id=5552&chapterid=111274 с Московской командной олимпиады, есть решение с предподсчётом:

    Код:
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
        ios::sync_with_stdio(false);
        long long Year[400] = {106, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 106, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 106, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 106, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 106, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 106, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 106, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 105, 105, 104, 104, 104, 104, 104, 105, 105, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 106, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 106, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 106, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 106, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 106, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 106, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 105, 105, 104, 104, 104, 104, 105, 105, 104, 104, 104, 104};
        long long n, year; //
        cin >> n;
        for (int i = 0; i < n; i++)
        {
            cin >> year;
            cout << Year[year % 400] << endl;
        }
        return 0;
    }
     

    Это решение работает 2.5 секунды на макс тестах, однако если cin поменять на scanf или cout на printf, она начинает проходить за 0.3 секунды, даже без убирания sync_with_stdio. Почему такое может происходить?

    Всего записей: 21 | Зарегистр. 24-11-2007 | Отправлено: 10:49 20-10-2012
    karakurt2



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

    Всего записей: 733 | Зарегистр. 06-12-2003 | Отправлено: 10:56 20-10-2012
    akaGM

    Platinum Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    "С -- ассемблер со структурами данных" (с)

    Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 14:20 20-10-2012
    Olgaolikl

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    #include "stdafx.h"
    #include <math.h>
    #include <stdio.h>
    #include <conio.h>
     
    void main()
    {
        ТИП  a=1000, b=0.0001, k, l, m, n;
     
        k=(a+b)*(a+b); printf("%f\n", k);
        l=a*a; printf("%f\n", l);
        n=2*a*b; printf("%f\n", n);
        m=b*b; printf("%f\n", m);
        printf("a=1000, b=0.0001\n");
        printf("((a+b)^2-(a^2+2ab))/b^2=%f\n", (k-(l+n))/m);
        getch();
    }
     
    почему итоги программы при ТИПе float настолько значительно отличается от типа double? (в float значение равно приблизительно 1248994.243, а в double 1.001)

    Всего записей: 1 | Зарегистр. 20-10-2012 | Отправлено: 17:31 20-10-2012
    karakurt2



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Olgaolikl
    printf ничего не знает о типах
    разбиритесь с форматной строкой

    Всего записей: 733 | Зарегистр. 06-12-2003 | Отправлено: 17:41 20-10-2012 | Исправлено: karakurt2, 17:42 20-10-2012
    adasiko



    Advanced Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    RoMiGoR
    Ну так потоки весьма сложная и непростая штука, в таких простеньких мини программах естественно c++ применять странно
    Olgaolikl
    переполнение при использовании хитрого вычисления с числами разного порядка. у типа float просто не хватает количества хранимых знаков

    Всего записей: 1807 | Зарегистр. 30-06-2008 | Отправлено: 08:46 21-10-2012
    JustAMaaan

    Member
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Скорее не переполнение, а потеря точности.

    Всего записей: 221 | Зарегистр. 17-09-2004 | Отправлено: 17:28 21-10-2012
    juvaforza

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Olgaolikl
    Если на пальцах, то в числителе вычитаются два числа порядка 10^6, а затем результат умножается на число порядка 10^8. Если точность одинарная, то абсолютная погрешность значения числителя будет порядка 10^(1+6-8). А если двойная, то порядка 10^(1+6-16). Т. е. значение числителя будет в первом случае порядка 10^(-1) (если сложить 10^(-8) и 10^(-1)), а втором - порядка 10^(-8) (если сложить 10^(-8) и 10^(-9)).
     
    Можете проверить конкр. значения, распечатав каждую ариф. операцию.
     
    P. S.
    Точнее, если относительная погрешность числа равна 10^(-x), то для числа 10^y абсолютная погрешность равна 10^(y-x). И если для типа double показатель х~=15.9 взять не 15 (как выше, просто счет по-другому), а 16, то результат деления может быть ~=1.01 (т. е. более правдоподобно). Для типа float - x~=7.2.

    Всего записей: 2895 | Зарегистр. 26-11-2005 | Отправлено: 20:05 21-10-2012 | Исправлено: juvaforza, 22:23 21-10-2012
    Kars25rus

    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    Доброго времени суток!
     
    Краткая предыстория: на предмете компьютерная геометрия и графика раздали кучу страшных, как атомная война, лаб:
     
    1. Написать программу для поворота отрезка прямой линии на произвольный угол относительно заданной точки.
    2. Реализовать процедуру отсечения. В заданном окне 20-50 концентрических прямоугольников, смещенных друг относительно друга на произвольный угол и на &#61508;R с использование процедуры отсечения.
    3. Реализовать рекуррентную процедуру. (Написать вариант программы дерево Пифагора (нерегулярная версия)).
    4. Написать программу, генерирующую полигон произвольной формы с n-вершинами (n=100).
    5. Написать программу для разбиения полигонов на треугольники (треугольники раскрасить разным цветом).
    6. Написать программу для вычерчивания проволочной модели куба в трехмерном пространстве. Начало мировых координат выбирается в центре куба.
    7. Вычертить сложную фигуру (куб, цилиндр, пирамида и т.п ).
    8. Написать программу для моделирования освещения объектов по Фонгу (двух сфер).
    9. Написать программу для отображения сложного объекта в динамике (вращение, приближение, удаление, освещенность).  
     
     
    Внимание, запрос: подскажите, пожалуйста, адекватные учебные пособия по С#(впрочем, все равно каком, лишь бы сделать, в C# проще ИМХО). Хотелось бы примерно такого стиля как здесь:http://stavkombez.ru/method/INFORMATICS/praktiki/6.htm или здесь http://hi-intel.ru/802/1.html. Книги, талмуды не хочу: нет столько времени и сил, чтобы пережевывать сотни страниц текста, когда мне по сути и надо-то всего ничего. Видеолекции/видеокурсы котируются, но хорошие. Опыт в программировании есть, неплохо справлялся в Delphi. Буду очень признателен.

    Всего записей: 22 | Зарегистр. 12-08-2010 | Отправлено: 20:27 21-10-2012
    juvaforza

    BANNED
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    RoMiGoR
    А endl тоже убирали?
     
    Kars25rus
    Вы, наверное, здесь хотели спросить.

    Всего записей: 2895 | Зарегистр. 26-11-2005 | Отправлено: 23:21 21-10-2012
    RoMiGoR



    Newbie
    Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
    juvaforza
    Да, с endl программа работает ~3 секунд, с '\n' ~2.5 секунд. В данном случае странно то, что cin работает быстрее scanf'a, а cout работает медленнеe printf'a.

    Всего записей: 21 | Зарегистр. 24-11-2007 | Отправлено: 00:23 22-10-2012
    Открыть новую тему     Написать ответ в эту тему

    Страницы: 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