Воскресенье, 26 Января 2020, 05:24

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Форум игроделов » Программирование » C/C++ » Вопрос-Ответ (C++) (Вопросы по С++ задаём здесь.)
Вопрос-Ответ (C++)
KornivalДата: Воскресенье, 04 Сентября 2011, 19:10 | Сообщение # 1
The Witcher
Сейчас нет на сайте
Чтобы не создавать отдельную тему на каждый глупый вопрос, предлагаю задавать их здесь.

Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
GameMixДата: Понедельник, 12 Мая 2014, 08:00 | Сообщение # 1261
старожил
Сейчас нет на сайте
Цитата OpenGOO
Что ты этим
if (number == 0) continue;
хотел добиться?

Однажды у меня не сработал оператор прерывания цикла break, и я использовал такой способ выхода из ситуации. Если внутри do не проверять, что за число ввёл пользователь, то 0 тоже запишется в массив, но мне это не нужно, т.к. 0 тут - лишь команда smile

Storm54, не понял тебя. Что обнулять?


Steel Standoff - 2D аркада.
Мои статьи


Сообщение отредактировал GameMix - Понедельник, 12 Мая 2014, 08:01
last2424Дата: Понедельник, 12 Мая 2014, 08:15 | Сообщение # 1262
30 мл. блоков
Сейчас нет на сайте
GameMix, если я правильно понимаю, то надо обнулять number, но может надо обнулить массив попробуй и то, и то.

Добавлено (12.05.2014, 08:15)
---------------------------------------------
GameMix,

Цитата
Однажды у меня не сработал оператор прерывания цикла break, и я использовал такой способ выхода из ситуации. Если внутри do не проверять, что за число ввёл пользователь, то 0 тоже запишется в массив, но мне это не нужно, т.к. 0 тут - лишь команда smile

if - это не цикл. Это условие.


Предупреждение: всё что я написал в зачёркнутом виде является шуткой и никак не пытает обидеть того к кому обращаются.(нет)
-l33t-h4xx-Дата: Понедельник, 12 Мая 2014, 12:04 | Сообщение # 1263
участник
Сейчас нет на сайте
Цитата GameMix ()
Да, пусть велосипед, но хочется решить такую задачку без стандартных структур данных:

Я так считаю: велосипед - не велосипед, но если человек не может как следует решить такую задачу самостоятельно, без помощи форума, то нечего ему и браться за такую задачу. Пусть подрастёт, подучится, а там и решит её когда-нибудь.

Алгоритм предельно простой: закончился массив - создай новый, копируй в него старый, удаляй старый, etc. Не умеешь так - ну и Бог с тобой, однажды научишься. Пока что вот ты С++ знаешь очень плохо, и что из этого выходит? Мы перед тобой пляшем, ты не можешь толком объяснить, в чём затруднение, задача до сих пор не решена, и никто в итоге не доволен. Не надо так.


Как правильно задавать вопросы
GameMixДата: Понедельник, 12 Мая 2014, 13:04 | Сообщение # 1264
старожил
Сейчас нет на сайте
Цитата last2424 ()
if - это не цикл. Это условие.


last2424, теперь ты меня не понял smile

-l33t-h4xx-, воу-воу, тон поубавь, ок? Я не писал тебе в ЛС с просьбой помочь мне. Не хочешь со мной возиться, проходи мимо. Одними учебниками много не научишься, на форумах можно узнать такое, какого в книгах не видел. Не согласен? -Не пытайся меня переубедить smile


Steel Standoff - 2D аркада.
Мои статьи
Storm54Дата: Понедельник, 12 Мая 2014, 14:31 | Сообщение # 1265
постоянный участник
Сейчас нет на сайте
Вот моя реализация. Решил не заморачиваться с шаблонами и сделать класс только для целых чисел. Так же не стал писать деструктор.


Более 10 лет опыта разработки на разных языках высокого уровня.
Отличные знания .NET, Unity.
Разбираюсь в протоколах TCP, UDP.
Наличие выпущенных коммерческих проектов.
Занимаюсь разработкой WebGL проекта (с применением технологии WebSocket)
Пишите в Л.С.


Сообщение отредактировал Storm54 - Понедельник, 12 Мая 2014, 14:50
OpenGOOДата: Понедельник, 12 Мая 2014, 14:42 | Сообщение # 1266
почти ветеран
Сейчас нет на сайте
Цитата GameMix ()
Однажды у меня не сработал оператор прерывания цикла break, и я использовал такой способ выхода из ситуации.

Для тебя программирование это магия -)

Алгоритм динамического массива для блондинок -)

1. Создаем емкость например на 10 стаканов.
2. Наливаем стакан.
3. Если емкость заполнена, то создаём новую емкость двойного объёма, переливаем содержимое из меньшей емкость в большую. Старую емкость утилизируем.
5. Переходим к пункту 2.

Примечание для продвинутых блондинок -)
Стратегию роста объема ёмкости нужно оптимизировать.


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.1772]
Storm54Дата: Понедельник, 12 Мая 2014, 15:18 | Сообщение # 1267
постоянный участник
Сейчас нет на сайте
Кстати, моя реализация в 10 раз медленнее стандартного вектора smile

Более 10 лет опыта разработки на разных языках высокого уровня.
Отличные знания .NET, Unity.
Разбираюсь в протоколах TCP, UDP.
Наличие выпущенных коммерческих проектов.
Занимаюсь разработкой WebGL проекта (с применением технологии WebSocket)
Пишите в Л.С.


Сообщение отредактировал Storm54 - Понедельник, 12 Мая 2014, 15:20
SaiteiДата: Вторник, 13 Мая 2014, 02:54 | Сообщение # 1268
старожил
Сейчас нет на сайте
Storm54, я особо в код не вчитывался, но очень уж смахивает на реализацию однонаправленного списка. И конечно же это будет медленно работать, т.к. чтобы добраться до сотого элемента надо пройти через 99 предыдущих


GameMix, в теме уже кто-то написал дельный комментарий. Когда мы делаем new, мы говорим что нам нужен непрерывный участок памяти из программной кучи. Хорошо, мы взяли такой участок в 8 байт. Захотели положить ещё 4 байта. Следовательно что значит "положить"? По логике вещей это значит продлить этот участок, т.е. добавить рядышком ещё 4 байта и склеить всё "в нечто одно". Однако мы не в сказке живём, участки памяти справа\слева могут быть заняты другими программами.
Следовательно: как бы мы ни крутились, придется заново выделять память под массив. std::vector работает аналогично, просто берет массив с "запасом". Для того, чтобы добавить элемент в массив надо:
1)Создать временный массив и скопировать в него значения
2)Для первоначального вновь выделить память, но так, чтобы в него поместился ещё один элемент
3)В первоначальный массив положить старые значения
4)В последний элемент записать значение, которое нужно
5)(в зависимости от способа хранения промежуточных данных)освободить память, выделенную под промежуточный массив


Цитата GameMix ()
-l33t-h4xx-, воу-воу, тон поубавь, ок? Я не писал тебе в ЛС с просьбой помочь мне. Не хочешь со мной возиться, проходи мимо. Одними учебниками много не научишься, на форумах можно узнать такое, какого в книгах не видел. Не согласен? -Не пытайся меня переубедить smile

Я тоже не согласен :)


Сообщение отредактировал Saitei - Вторник, 13 Мая 2014, 03:01
-l33t-h4xx-Дата: Вторник, 13 Мая 2014, 07:21 | Сообщение # 1269
участник
Сейчас нет на сайте
Цитата GameMix ()
Одними учебниками много не научишься, на форумах можно узнать такое, какого в книгах не видел.

Я бы на этом месте запросто согласился и замолчал, если бы твой код не был белой горячкой. Вот наугад программирует, а потом возмущается, что кто-то смеет его поучать.

Чтобы не оффтопить, приложу своё видение решения. Нет remove.
Код
#include <iostream>
#include <cassert>

using namespace std;

/****************************************************************/

class Vec {
        public:
       int get(int index);
       int insert(int number);
       int len();
       Vec(int size, int incr);
       ~Vec();
        private:
       int size;
       int last;
       int incr;
       int *data;
       void resize(int inc);
};

/****************************************************************/

Vec :: Vec (int siz = 64, int inc = 64)
{
       data = new int[siz];
       size = siz;
       incr = inc; // Число, на которое увеличивается размер массива
       last = 0;
}

/****************************************************************/

Vec :: ~Vec ( )
{
       cout << "Final size: " << size << endl;
       delete [] data;
}

/****************************************************************/

int Vec :: get (int index)
{
       assert(index >= 0 && index < last);
       return data[index];
}

/****************************************************************/

int Vec :: insert (int number)
{
       if (last >= size)
        resize(incr);
       data[last++] = number;
}

/****************************************************************/

int Vec :: len ( )
{
       return last;
}

/****************************************************************/

void Vec :: resize (int inc)
{
       int newsize = size + inc;
       int *newdata = new int[newsize];

       for (int i = 0; i < last; i++)
       {
        newdata[i] = data[i];
       }

       delete [] data;

       size = newsize;
       data = newdata;
}

/****************************************************************/

int main ( )
{
       Vec vec(4, 4); // Числа произвольные

       for (int i = 0; i < 16; i++)
       {
        vec.insert(i);
        cout << vec.get(i) << " ";
       }

       cout << endl;
}


Как правильно задавать вопросы

Сообщение отредактировал -l33t-h4xx- - Вторник, 13 Мая 2014, 07:45
gaserdДата: Вторник, 13 Мая 2014, 10:08 | Сообщение # 1270
был не раз
Сейчас нет на сайте
Ребята появился вопрос ( очередной вопрос от нуба) использовать в реализации своей 2д игры OpenGl+c++ или XNA+C# , и в том и в том случае опыта мало, хотя с OpenGL немного побольше знаком, но все равно пока что мало(на уровне : отрисовки примитивов 2D/3D, анимация , свет, только недавно начал изучать текстурирование) ..И вот вопрос как посоветуете поступить, остаться на плюсах и подтянуть свое программирование со дна на них или остаться в XNA в котором тоже мало чего знаю, конечно же мне предпочтительнее плюсы из-за того, что я очень много вакансий на них вижу, то есть если даже пойду дальше не в игрострой , а просто работать программистом , т оя думаю что они мне будут полезней. Так что нид ваша помощь..

[url=http://diablodisplay.com/][img]http://diablodisplay.com/uploads/posts/2011-09/1315831364_diablo3-userbar-19.jpg[/img][/url]
OpenGOOДата: Вторник, 13 Мая 2014, 14:19 | Сообщение # 1271
почти ветеран
Сейчас нет на сайте
Провёл исследование как растет vector (gcc 4.5.6).

Слева количество элементов, справа размер массива.


Мои проекты:
- Свободный и открытый клон World Of Goo
- TrueEngine2D (2D игровой фреймворк основанный на FreeBASIC)

[GameMaker: Studio v1.4.1772]
Storm54Дата: Вторник, 13 Мая 2014, 15:06 | Сообщение # 1272
постоянный участник
Сейчас нет на сайте
Цитата Saitei ()
Storm54, я особо в код не вчитывался, но очень уж смахивает на реализацию однонаправленного списка. И конечно же это будет медленно работать, т.к. чтобы добраться до сотого элемента надо пройти через 99 предыдущих

Там я добавил указатель на последний элемент. smile


Более 10 лет опыта разработки на разных языках высокого уровня.
Отличные знания .NET, Unity.
Разбираюсь в протоколах TCP, UDP.
Наличие выпущенных коммерческих проектов.
Занимаюсь разработкой WebGL проекта (с применением технологии WebSocket)
Пишите в Л.С.
SaiteiДата: Вторник, 13 Мая 2014, 18:50 | Сообщение # 1273
старожил
Сейчас нет на сайте
Цитата Storm54 ()

Там я добавил указатель на последний элемент. smile

Но это не отменяет того факта, что это реализация списка, а не вектора) Если придется идти к среднему элементу будет точно так же..)
OpenGOO, дело в том, что вектор берет элементы с "запасом", чтобы зря не перевыделять память.
Т.е:
Цитата OpenGOO ()
3 4

если, имея 3 элемента, мы сделаем push_back, то память выделяться не будет, элемент всего лишь встанет в конец smile
GameMixДата: Воскресенье, 18 Мая 2014, 12:23 | Сообщение # 1274
старожил
Сейчас нет на сайте
OpenGOO, спасибо за алгоритм для блондинок. Реализовал - работает нормально, пока хватит и его :)
-l33t-h4xx-, спасибо за пример, пригодится.

Больше вопросов пока нет :)
PAMCECДата: Воскресенье, 18 Мая 2014, 14:33 | Сообщение # 1275
был не раз
Сейчас нет на сайте
Почему у меня не компилируется эта программа
Код
#include <iostream>
#include <conio.h>

using std::cout;
using std::cin;

int main()
{
     long A;
     setlocale(LC_ALL,"Russian");
     cout<<"Ââåäèòå ÷èñëî ÿáëîê ";
     cin>>A;
     switch(A%10)
     {
         sase 1: cout<<" ÿáëîêî";break;
     }
     getch();
     return 0;
}
cry


PAMCEC II
Storm54Дата: Воскресенье, 18 Мая 2014, 15:41 | Сообщение # 1276
постоянный участник
Сейчас нет на сайте
Научись читать ошибки компилятора.
Цитата
sase
Написал.


Более 10 лет опыта разработки на разных языках высокого уровня.
Отличные знания .NET, Unity.
Разбираюсь в протоколах TCP, UDP.
Наличие выпущенных коммерческих проектов.
Занимаюсь разработкой WebGL проекта (с применением технологии WebSocket)
Пишите в Л.С.
Just1uckyДата: Суббота, 24 Мая 2014, 22:05 | Сообщение # 1277
частый гость
Сейчас нет на сайте
Помогите пожалуйста. Что у меня не так? Допустим нажимаю на "1", он показывает январь и после чего пишет "нажмите любую клавишу для завершения". А как сделать так, чтобы я мог не перезапускать каждый раз программу, а вводить много раз числа за один?
Код
#include <iostream>
using namespace std;

int main()
{
  setlocale(LC_ALL, ".1251");
  int n;
  cout << "Введите номер месяца: ";
  cin >> n;
  cout << endl;
  switch (n)
    
  {
    
  case 1: cout << "Месяц: январь, время года: зима"; break;
  case 2: cout << "Месяц: февраль, время года: зима"; break;
  case 3: cout << "Месяц: март, время года: весна"; break;
  case 4: cout << "Месяц: апрель, время года: весна"; break;
  case 5: cout << "Месяц: май, время года: весна"; break;
  case 6: cout << "Месяц: июнь, время года: лето"; break;
  case 7: cout << "Месяц: июль, время года: лето"; break;
  case 8: cout << "Месяц: август, время года: лето"; break;
  case 9: cout << "Месяц: сентябрь, время года: осень"; break;
  case 10: cout << "Месяц: октябрь, время года: осень"; break;
  case 11: cout << "Месяц: ноябрь, время года: осень"; break;
  case 12: cout << "Месяц: декабрь, время года: зима"; break;
  default: cout << "Номер месяца должен быть в пределах от 1 до 12";
  }
  cout << endl << endl;
  system("pause");
  return 0;
   
}
anton-garДата: Суббота, 24 Мая 2014, 22:13 | Сообщение # 1278
WEBmaster
Сейчас нет на сайте
Цитата Just1ucky ()
Помогите пожалуйста. Что у меня не так? Допустим нажимаю на "1", он показывает январь и после чего пишет "нажмите любую клавишу для завершения". А как сделать так, чтобы я мог не перезапускать каждый раз программу, а вводить много раз числа за один?


В цикле бахни!

Добавлено (24.05.2014, 22:13)
---------------------------------------------
Например, в бесконечном.
while(1)
{
//.......
}


Just1uckyДата: Суббота, 24 Мая 2014, 22:13 | Сообщение # 1279
частый гость
Сейчас нет на сайте
Цитата anton-gar ()
Цитата Just1ucky ()
Помогите пожалуйста. Что у меня не так? Допустим нажимаю на "1", он показывает январь и после чего пишет "нажмите любую клавишу для завершения". А как сделать так, чтобы я мог не перезапускать каждый раз программу, а вводить много раз числа за один?

В цикле бахни!


То есть while(1) надо вставить после цикла?


Сообщение отредактировал Just1ucky - Суббота, 24 Мая 2014, 22:14
anton-garДата: Суббота, 24 Мая 2014, 22:17 | Сообщение # 1280
WEBmaster
Сейчас нет на сайте
Цитата Just1ucky ()
То есть while(1) надо вставить после цикла?

Что? По-твоему что такое вайл?


Форум игроделов » Программирование » C/C++ » Вопрос-Ответ (C++) (Вопросы по С++ задаём здесь.)
Поиск:

Все права сохранены. GcUp.ru © 2008-2020 Рейтинг