Помогите пожалуйста. Что у меня не так? Допустим нажимаю на "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;
Здравствуйте! Объясните мне на пальцах, что такое конструктор и деконструктор классов. Сколько перечитал различных книг и статей, все-равно никак не пойму. С меня ++.
Здравствуйте! Объясните мне на пальцах, что такое конструктор и деконструктор классов. Сколько перечитал различных книг и статей, все-равно никак не пойму. С меня ++.
Конструктор класса - это функция, вызываемая после создания экземпляра этого класса. Деструктор класса - это функция, вызываемая перед уничтожением экземпляра этого класса. Например:
Код
#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
Конструктор класса - это функция, вызываемая после создания экземпляра этого класса. Деструктор класса - это функция, вызываемая перед уничтожением экземпляра этого класса.
Конструктор используется для начальной инициализации объекта в памяти, как не странно. С его помощью задаются начальные значния переменным (полям) класса, выделяется память и прочее. Деструктор в свою очередь используется для корректного освобождения выделенной памяти. Например, в конструкторе трехмерного вектора можно присваивать нуль всем переменным координат вектора, получая нуль-вектор. В деструкторе какого либо менеджера, можно корректно освободить память, выделенную под сущности, им управляемые. Псевдокод конструктора трехмернного вектора и деструктора менеджера объектов:
Код
CVector2D(void) : x(0), y(0), z(0) { }
~CObjectMgr(void) { for(it = objects.begin(); it != objects.end(); ++it) delete (*it); // Освобождаем каждый объект }
Доброго времени суток. Уселся я делать систему сейвов. И вопросы появились, надеюсь на Вашу помощь. Для примера вытащил сейв из одной старой игрушки. Вот текст сейва:
Хотелось бы сделать подобную систему. Сохранения данных в txt файле(пускай берутся они через cin в консоли) и их последующей загрузки из файла. Подскажите, как мне вычленять нужную информацию из сейва? Т.е из строки с регионом достать его название, из строки с уровнем - уровень и так далее. Спасибо.
Подскажите, как мне вычленять нужную информацию из сейва?
Если я не ошибаюсь, это *.ini файл, соответственно идём в гугл и ищем по запросу "Парсер ini файлов". Есть замечательный сайт habrahabr, на котором есть соответсвующая статья с подробным описанием. Читаем, размышляем, пишем, используем.
Сообщение отредактировал antonyvolkoff - Воскресенье, 08 Июня 2014, 01:19
Если структура файла именно такая, то можно воспользоваться (для начала) простым решением: считывать по слову из файла и записывать значения в ассоциативный массив. Вроде этого:
antonyvolkoff, Спасибо, почитаю. -l33t-h4xx-, Благодарю! Только подскажи, пожалуйста, что значит эта строка? Я не так давно программирую. "map <string, string> data;"
Ассоциативный массив стандартной библиотеки шаблонов. Хранит пары - ключ и данные. Отсортирован по ключу.
Цитата-l33t-h4xx- ()
Если структура файла именно такая, то можно воспользоваться (для начала) простым решением: считывать по слову из файла и записывать значения в ассоциативный массив. Вроде этого:
Я, конечно, всё понимаю, но твоя система загнется на этом *.ini файле:
Код
[test] value=testval
Это только начало. Гы-гы. Сначала идет секция, а не ключ. Обычно, ключи не повторяются. Секция может не иметь ключей со значениями или без значений - пустая секция. Обработка комментариев, пробельных символов - пробелов, переносов строк, табуляций?
Сообщение отредактировал antonyvolkoff - Воскресенье, 08 Июня 2014, 18:00
antonyvolkoff, для себя бы я, разумеется, сделал лучше. За пять минут все эти чудесные фичи не набросаешь, а мой велосипед, по крайней мере, будет какое-то время работать, пока разрабатываются более важные части программы. Со всеми вытекающими ограничениями, да. Как правильно задавать вопросы
Сообщение отредактировал -l33t-h4xx- - Понедельник, 09 Июня 2014, 07:56
Нужна срочная помощь с завершением программы (Visual Studio C++) Что программа должна делать: Считать строки из файла, в каждой строке несколько слов разделенных пробелами. Вывести в другой текстовый файл преобразованные строки по схеме: - если в каждом слове есть заданная подстрока, то без изменений, если есть, но не во всех - первое слово с подстрокой в начало строки, если ни одного - зеркально отобразить строку. Что делает мое... Кхм... Творение: Считывает строки, проверяет на наличие подстроки и выводит соостведственно 1 1 - во всех словах подстрока имеется 1 0 - есть, но не во всех 0 0 - в строке нед подстроки ни в одном слове (вывод для самопроверки)
Код ужасен, знаю, разбирался по ходу, гугля все что можно, у самого с программированием очень туго. За помощь с завершением программы буду благодарен.
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; }
"Счастье для всех, даром, и пусть никто не уйдет обиженный!" - Рэд Шухарт ("Пикник на обочине", Стругацкие А. и Б.) ***
Извиняюсь за часто появляющиеся "оЧеПЯтки", виной тому моя невнимательность...
Какая сложная и глупая задача! Небольшой совет: мешать С-строки (массивы char'ов) со строками С++ (объекты string) - всегда плохая идея. Правда, иногда в некоторых библиотеках встречаются функции, которые требуют именно С-строки в качестве аргумента, но для таких случаев есть метод c_str().
Вот так я попытался написать (ideone). Заодно узнал про stringstream, и жизнь моя озарилась новым светом.
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" } }
Есть функция, в качестве аргумента которой передаётся указатель типа char* ("путь к файлу") Но у меня в проге этот путь к файлу хранится в string'e. Как его преобразовать в нужный вид ?