Пятница, 29 Марта 2024, 18:50

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

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

Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
Just1uckyДата: Суббота, 24 Мая 2014, 22:19 | Сообщение # 1281
частый гость
Сейчас нет на сайте
Цитата anton-gar ()
Цитата Just1ucky ()
То есть while(1) надо вставить после цикла?

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


Ой, ну да, это же и есть цикл, который бесконечно повторяется.
vasua99Дата: Суббота, 24 Мая 2014, 22:35 | Сообщение # 1282
GNU follower
Сейчас нет на сайте
Цитата Just1ucky ()
Помогите пожалуйста. Что у меня не так? Допустим нажимаю на "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;

}


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

Код

#include <iostream>
#include <string>

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

const string months[] = {"January", "February", "March", "April", "May", "June", "July",      
                        "August", "September", "October", "November", "December"};

const string seasons[] = {"Winter", "Spring", "Summer", "Autumn"};

int main()
{
         int choice;
              
         while (true) {
             cout << "Enter the number of month(1-12): ";
             cin >> choice;
             if (choice < 1 || choice > 12) {
                  cout << "The number of month is invalid. Do you want continue?(y/n) ";
                  if (cin.get() == 'y')
                      continue;
                  break;
             }
             cout << "Month: " << months[choice - 1] << ", season: " << seasons[choice > 11 || choice < 3 ? 0 : (choice - 2) / 3 + 1] << '\n'
                    << "Do you want to continue(y/n);
             if (cin.get() == 'y')
                 continue;
             break;
         }

         cin.get(), cin.get();

         return 0;
}

Как то так) если есть вопросы - задавай)


Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)

Сообщение отредактировал vasua99 - Суббота, 24 Мая 2014, 22:39
Just1uckyДата: Суббота, 24 Мая 2014, 22:42 | Сообщение # 1283
частый гость
Сейчас нет на сайте
Цитата vasua99 ()
Как то так) если есть вопросы - задавай)


Спасибо большое:)


Сообщение отредактировал Just1ucky - Суббота, 24 Мая 2014, 23:27
ДиггерДата: Суббота, 07 Июня 2014, 16:27 | Сообщение # 1284
частый гость
Сейчас нет на сайте
Здравствуйте! Объясните мне на пальцах, что такое конструктор и деконструктор классов. Сколько перечитал различных книг и статей, все-равно никак не пойму. С меня ++.
antonyvolkoffДата: Суббота, 07 Июня 2014, 16:52 | Сообщение # 1285
был не раз
Сейчас нет на сайте
Цитата Диггер ()
Здравствуйте! Объясните мне на пальцах, что такое конструктор и деконструктор классов. Сколько перечитал различных книг и статей, все-равно никак не пойму. С меня ++.

Конструктор класса - это функция, вызываемая после создания экземпляра этого класса.
Деструктор класса - это функция, вызываемая перед уничтожением экземпляра этого класса.
Например:
Код
#include <iostream>

class CTest
{
public:

       // Конструктор
       CTest(void)
       {
           std::cout << "The instance is created!" << std::endl;
       }

       // Деструктор
       ~CTest(void)
       {
           std::cout << "The instance is destroyed!" << std::endl;
       }
};

int main(int argc, char** argv)
{
       CTest test; // Создаём экземпляр класса

       return 0; // Возвращаем нуль
}


После копипаста, сборки и запуска видим:
Код
The instance is created!
The instance is destroyed!


Сообщение отредактировал antonyvolkoff - Суббота, 07 Июня 2014, 16:58
-l33t-h4xx-Дата: Суббота, 07 Июня 2014, 16:59 | Сообщение # 1286
участник
Сейчас нет на сайте


Как правильно задавать вопросы
antonyvolkoffДата: Суббота, 07 Июня 2014, 17:04 | Сообщение # 1287
был не раз
Сейчас нет на сайте


Сообщение отредактировал antonyvolkoff - Суббота, 07 Июня 2014, 17:09
ДиггерДата: Суббота, 07 Июня 2014, 17:48 | Сообщение # 1288
частый гость
Сейчас нет на сайте
Цитата antonyvolkoff ()
Конструктор класса - это функция, вызываемая после создания экземпляра этого класса.
Деструктор класса - это функция, вызываемая перед уничтожением экземпляра этого класса.

Как раз это я понял. Но для чего они нужны?
antonyvolkoffДата: Суббота, 07 Июня 2014, 19:01 | Сообщение # 1289
был не раз
Сейчас нет на сайте
Цитата Диггер ()
Как раз это я понял. Но для чего они нужны?

Конструктор используется для начальной инициализации объекта в памяти, как не странно.
С его помощью задаются начальные значния переменным (полям) класса, выделяется память и прочее.
Деструктор в свою очередь используется для корректного освобождения выделенной памяти.
Например, в конструкторе трехмерного вектора можно присваивать нуль всем переменным координат вектора, получая нуль-вектор.
В деструкторе какого либо менеджера, можно корректно освободить память, выделенную под сущности, им управляемые.
Псевдокод конструктора трехмернного вектора и деструктора менеджера объектов:
Код
CVector2D(void) : x(0), y(0), z(0) { }

~CObjectMgr(void)
{
     for(it = objects.begin(); it != objects.end(); ++it)
         delete (*it); // Освобождаем каждый объект
}
VoreshДата: Суббота, 07 Июня 2014, 23:20 | Сообщение # 1290
частый гость
Сейчас нет на сайте
Доброго времени суток.
Уселся я делать систему сейвов.
И вопросы появились, надеюсь на Вашу помощь.
Для примера вытащил сейв из одной старой игрушки.
Вот текст сейва:

Хотелось бы сделать подобную систему. Сохранения данных в txt файле(пускай берутся они через cin в консоли) и их последующей загрузки из файла.
Подскажите, как мне вычленять нужную информацию из сейва?
Т.е из строки с регионом достать его название, из строки с уровнем - уровень и так далее.
Спасибо.
antonyvolkoffДата: Воскресенье, 08 Июня 2014, 01:19 | Сообщение # 1291
был не раз
Сейчас нет на сайте
Цитата Voresh ()
Подскажите, как мне вычленять нужную информацию из сейва?

Если я не ошибаюсь, это *.ini файл, соответственно идём в гугл и ищем по запросу "Парсер ini файлов".
Есть замечательный сайт habrahabr, на котором есть соответсвующая статья с подробным описанием.
Читаем, размышляем, пишем, используем.


Сообщение отредактировал antonyvolkoff - Воскресенье, 08 Июня 2014, 01:19
-l33t-h4xx-Дата: Воскресенье, 08 Июня 2014, 11:01 | Сообщение # 1292
участник
Сейчас нет на сайте
Если структура файла именно такая, то можно воспользоваться (для начала) простым решением: считывать по слову из файла и записывать значения в ассоциативный массив. Вроде этого:

Код
using namespace std;

ifstream file("save.txt");
map <string, string> data;

while (!file.eof())
{
            string key, eq, value;

            file >> key;

            file >> eq; // Между ключом и значением должно быть "="
            if (eq != "=") continue;

            file >> value;

            data[key] = value;
}


Потом нужные значения извлекаются из data и сохраняются куда следует.
Код
levelnumber = atoi(data["Level"].c_str()); // Да, я умею только в С-конверсию, простите
hero.name = data["Name"];


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

Сообщение отредактировал -l33t-h4xx- - Вторник, 10 Июня 2014, 07:03
VoreshДата: Воскресенье, 08 Июня 2014, 13:22 | Сообщение # 1293
частый гость
Сейчас нет на сайте
antonyvolkoff, Спасибо, почитаю.
-l33t-h4xx-, Благодарю! Только подскажи, пожалуйста, что значит эта строка? Я не так давно программирую. "map <string, string> data;"
antonyvolkoffДата: Воскресенье, 08 Июня 2014, 17:23 | Сообщение # 1294
был не раз
Сейчас нет на сайте
Цитата Voresh ()
"map <string, string> data;"

Ассоциативный массив стандартной библиотеки шаблонов.
Хранит пары - ключ и данные. Отсортирован по ключу.
Цитата -l33t-h4xx- ()
Если структура файла именно такая, то можно воспользоваться (для начала) простым решением: считывать по слову из файла и записывать значения в ассоциативный массив. Вроде этого:

Я, конечно, всё понимаю, но твоя система загнется на этом *.ini файле:
Код
[test]
value=testval

Это только начало. Гы-гы.
Сначала идет секция, а не ключ. Обычно, ключи не повторяются.
Секция может не иметь ключей со значениями или без значений - пустая секция.
Обработка комментариев, пробельных символов - пробелов, переносов строк, табуляций?


Сообщение отредактировал antonyvolkoff - Воскресенье, 08 Июня 2014, 18:00
-l33t-h4xx-Дата: Понедельник, 09 Июня 2014, 07:50 | Сообщение # 1295
участник
Сейчас нет на сайте
antonyvolkoff, для себя бы я, разумеется, сделал лучше. За пять минут все эти чудесные фичи не набросаешь, а мой велосипед, по крайней мере, будет какое-то время работать, пока разрабатываются более важные части программы. Со всеми вытекающими ограничениями, да.

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

Сообщение отредактировал -l33t-h4xx- - Понедельник, 09 Июня 2014, 07:56
Eyks001Дата: Воскресенье, 15 Июня 2014, 21:41 | Сообщение # 1296
Эйкс. Просто Эйкс.
Сейчас нет на сайте
Нужна срочная помощь с завершением программы (Visual Studio C++)
Что программа должна делать:
Считать строки из файла, в каждой строке несколько слов разделенных пробелами. Вывести в другой текстовый файл преобразованные строки по схеме:
- если в каждом слове есть заданная подстрока, то без изменений, если есть, но не во всех - первое слово с подстрокой в начало строки, если ни одного - зеркально отобразить строку.
Что делает мое... Кхм... Творение:
Считывает строки, проверяет на наличие подстроки и выводит соостведственно
1 1 - во всех словах подстрока имеется
1 0 - есть, но не во всех
0 0 - в строке нед подстроки ни в одном слове (вывод для самопроверки)

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

Код

#define _CRT_SECURE_NO_WARNINGS //игнорируем предупреждения
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string.h>

using namespace std;
typedef char strok[100];
strok s[100];
FILE *out;

int readfl(int &i){       
  FILE *in;
  if ((in = fopen("input.txt", "rt")) == NULL)
  {
   fprintf(stderr, "Can't open input.txt \n");
   return 1;
  }
  while (!feof(in)){     //пока не конец файла
   fgets(s[i], 100, in);   //читаем строку из input.txt в s[i]
   cout<<s[i];      //Выводим ее
   i++;
  }
  cout<<endl;       //переходим на новую строку, очищаем поток данных
  fclose(in);        
  return 0;
}

void Find(char* s1, char* podstr)// s1 - строка, str - подстрока
{
  string s2,s3;
  s3 = podstr;
  char* out[100];  
  bool one,all;
  one = false;
  all = true;
  int i = 0;
   
  ofstream F("output.txt", ios::app);
   
  char * pch = strtok(s1, " \n"); // во втором параметре указаны разделители (пробел, переход на след. строку)
  while (pch != NULL)                         // пока есть слова
  {
   if (pch != s3)   //если не было найдено ни одной подстроки, а слово не совпадает с подстрокой
   {
    s2 = pch;
    size_t pos = s2.find(s3);
    if (pos != string::npos)    // если подстрока имеется в слове
    {
     one = true;
    }
   }
   else if (pch == s3)
   {
    one = true;
   }
   else all = false;//если хоть в одном слове нет подстроки, то найдено не для всех
   if (one == false)
    all = false;  
   pch = strtok(NULL, " ");
  }

  cout << one << " " << all << "\n";
   
}

int main(int argc, char* argv[])
  {
   int n = 0;
   char podstr[10], stroki[100];
   readfl(n);
   cout << "\npodstr=";
   cin>>podstr;
   cout<<"\n";
   for (int i = 0; i<n; i++)
    {
    strcpy(stroki, s[i]); //копируем в переменную stroki n-ную строку
    Find(stroki, podstr); // ищем в ней подстроку
    }
  cin>>n;

  return 0;
}



"Счастье для всех, даром, и пусть никто не уйдет обиженный!" - Рэд Шухарт
("Пикник на обочине", Стругацкие А. и Б.)
***

Извиняюсь за часто появляющиеся "оЧеПЯтки", виной тому моя невнимательность...
-l33t-h4xx-Дата: Пятница, 20 Июня 2014, 11:36 | Сообщение # 1297
участник
Сейчас нет на сайте
Какая сложная и глупая задача!
Небольшой совет: мешать С-строки (массивы char'ов) со строками С++ (объекты string) - всегда плохая идея. Правда, иногда в некоторых библиотеках встречаются функции, которые требуют именно С-строки в качестве аргумента, но для таких случаев есть метод c_str().

Вот так я попытался написать (ideone). Заодно узнал про stringstream, и жизнь моя озарилась новым светом.
Код
#include <iostream>
#include <sstream>
#include <string>
#include <cstring>

using namespace std;

void process (string line, string substring)
{
  istringstream linestream(line);

  int wordcount = 0;
  int matchcount = 0;
  string first;

  // Ищем substring в каждом слове
  while (!linestream.eof())
  {
   string word;
   linestream >> word;
   wordcount++;

   if (word.find(substring) != string::npos)
   {
    matchcount++;
    if (matchcount == 1) first = word;
   }
  }

  // Выводим согласно условию

  if (matchcount == 0)
  {
   string reversedline = string(line.rbegin(), line.rend());
   // ^ ^ ^ Жуткий на вид хак с итераторами, обращающий строку.
   //       С ним лучше разобраться.
   cout << reversedline << endl;
   return;
  }

  if (wordcount == matchcount)
  {
   cout << line << endl;
   return;
  }
  else // Не все слова имеют подстроку
  {
   cout << first << endl;
   return;
  }
}

int main ( )
{
  while (!cin.eof())
  {
   string line;
   getline(cin, line);
   process(line, "foo"); // Ищем "foo"
  }
}


Как правильно задавать вопросы
Eyks001Дата: Воскресенье, 22 Июня 2014, 23:46 | Сообщение # 1298
Эйкс. Просто Эйкс.
Сейчас нет на сайте
Как реализовать вывод графики в C++? Графика примитивная - отрисовка отрезков по координатам вершин, в плоскости.

Добавлено (22.06.2014, 23:46)
---------------------------------------------
Уже не нужно.



"Счастье для всех, даром, и пусть никто не уйдет обиженный!" - Рэд Шухарт
("Пикник на обочине", Стругацкие А. и Б.)
***

Извиняюсь за часто появляющиеся "оЧеПЯтки", виной тому моя невнимательность...
AlkoshaДата: Воскресенье, 29 Июня 2014, 22:03 | Сообщение # 1299
участник
Сейчас нет на сайте
Есть функция, в качестве аргумента которой передаётся указатель типа char* ("путь к файлу")
Но у меня в проге этот путь к файлу хранится в string'e. Как его преобразовать в нужный вид ?
SnuuxДата: Воскресенье, 29 Июня 2014, 22:48 | Сообщение # 1300
постоянный участник
Сейчас нет на сайте
#include <sstream>
#include <string>
stringstream ss;
string s;
char c = 'a';
ss << c;
ss >> s;

Или

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

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