***Помогите решить проблему: Ввожу кол-во задач больше 2 и у меня начинается бесконечный цикл. Я только обучаюсь, но не пойму в чем проблема в этой ситуации.
#include <iostream>
#include <cstring>
#include <stdio.h>
#include <fstream>
using namespace std;
int main()
{
int n;
int i;
struct land
{
char name[20];
int time;
char task[200];
}
s[n];
cout<<"Добро пожаловать в ежедневник!"<<endl;
ofstream fout;
fout.open("task.txt");
if (fout){
cout<< "Предлагаем написать задачи на сегодня: "<<endl;
cout<< "Введите коло-во задач:"<<endl;
cin>>n;
{
for (i=0;i<n;i++)
{
cout<<" Имя: ";
cin>> s[i].name;
cout<<" Время: ";
cin>> s[i].time;
cout<<" Задача: ";
cin>>s[i].task;
}
for (i=0;i<n;i++)
{
fout << "Имя: " << s[i].name <<endl;
fout << "Время: " << s[i].time <<endl;
fout << "Задача: " << s[i].task <<endl;
}
}
cout<<"Успех! Задачи успешно записаны!"<<endl;
fout.close();
}
}
Можно вот так:
#define NOMINMAX
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;
// Структура задачи
struct Task
{
std::string name;
std::string details;
std::string time;
};
// Тип действий
enum ActionType
{
NOT_SELECTED = 0,
VIEW_TASKS = 1,
CREATE_NEW_TASKS = 2,
DELETE_TASKS = 3,
APPEND_TASKS = 4,
EXIT = 5
};
// Добавить задачи
ActionType createNewTasks(bool recreate = false);
// Просмотр задач
ActionType viewTasks();
// Удалить задачи
ActionType deleteTasks();
// Выбрать действие
ActionType selectAction();
// Есть ли файл
bool fileExists(const std::string& name){
ifstream f(name.c_str());
return f.good();
}
/**
* \brief Точка входа
* \param argc Кол-во аргументов
* \param argv Аргументы
* \return
*/
int main(int argc, char* argv[])
{
// Текущее действие (не выбрано)
ActionType action = ActionType::NOT_SELECTED;
// Локаль
setlocale(LC_ALL, "Russian");
std::cout << "Добро пожаловать в ежедневник!" << std::endl;
// Если файла нет - действие "новые задачи"
if (!fileExists("tasks.txt")) action = ActionType::CREATE_NEW_TASKS;
// Вечный цикл
while (true)
{
// В зависимости от того, какое выбрано действие
switch(action)
{
case ActionType::EXIT:
return 0;
case ActionType::NOT_SELECTED:
action = selectAction();
break;
case ActionType::CREATE_NEW_TASKS:
action = createNewTasks(true);
break;
case ActionType::APPEND_TASKS:
action = createNewTasks(false);
break;
case ActionType::DELETE_TASKS:
action = deleteTasks();
break;;
case ActionType::VIEW_TASKS:
action = viewTasks();
break;
}
}
return 0;
}
//////////////////////////////////////////////////////////////////////////////////
// Добавить задачи
ActionType createNewTasks(bool recreate)
{
// Открытие файла для записи
// Либо затираем все, либо дописываем (в зависимости от recreate)
std::fstream f;
f.open("tasks.txt", recreate ? std::fstream::out : std::fstream::app);
// Ввод кол-ва
int qnt;
std::cout << "Введите кол-во задач : ";
std::cin >> qnt;
std::cin.ignore();
//Ввод задач
for(int i = 0; i < qnt; i++)
{
Task t;
std::cout << "Введите название задачи # " << i + 1 << ": ";
std::getline(std::cin, t.name);
std::cout << "Введите детали задачи # " << i + 1 << ": ";
std::getline(std::cin, t.details);
std::cout << "Введите время задачи # " << i + 1 << ": ";
std::getline(std::cin, t.time);
std::cout << std::endl;
f << t.name << " | " << t.details << " | " << t.time << std::endl;
}
// Закрыть
f.close();
return ActionType::NOT_SELECTED;
}
// Просмотр задач
ActionType viewTasks()
{
std::string line;
std::ifstream file("tasks.txt");
if (file.is_open()){
while (getline(file, line)){
std::cout << line << std::endl;
}
file.close();
}
return ActionType::NOT_SELECTED;
}
// Удалить задачи
ActionType deleteTasks()
{
// Открытие файла для записи c затиранием сожержимого
std::fstream f;
f.open("tasks.txt", std::fstream::out);
f.close();
return ActionType::NOT_SELECTED;
}
// Выбрать действие
ActionType selectAction()
{
int actionType;
std::cout << "1 - показать задачи" << std::endl;
std::cout << "2 - новые задачи" << std::endl;
std::cout << "3 - удалить задачи" << std::endl;
std::cout << "4 - добавить задачи" << std::endl;
std::cout << "5 - выход" << std::endl;
cin >> actionType;
actionType = std::min(actionType, 5);
actionType = std::max(actionType, 0);
return static_cast<ActionType>(actionType);
}
warning: variable 'n' is uninitialized when used here
[-Wuninitialized] s[n]; note: initialize the
variable 'n' to silence this warning int n; 1 warning generated.
Вот, что выводит компилятор.
Для статических массивов n должно быть константным значением, либо, если это динамический массив, то n вводится, и пример имеет вид :
int *s= new int[n];
Где *s -указатель на область памяти размером n
У вас же не задан ни один из перечисленных вариантов
Если вы хотите занять участок памяти, а потом использовать снова этот же участок памяти, то его для начало необходимо очистить
delete[] s;
А после уже снова использовать
Виртуальный выделенный сервер (VDS) становится отличным выбором
Изучаю классы в C++В следующем коде я хочу реализовать общую функцию updateAge(), которая у каждого элемента класса People (т
Я создаю в QTabWidget динамические табы, в котором есть динамически созданные QLabel-ыУ каждого QLabel есть свой номер