С++ Проблемки с задачкой

111
25 августа 2019, 15:30

***Помогите решить проблему: Ввожу кол-во задач больше 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();
    }
}
Answer 1

Можно вот так:

#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);
}
Answer 2

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;

А после уже снова использовать

READ ALSO
Вектор ссылок С++

Вектор ссылок С++

Изучаю классы в C++В следующем коде я хочу реализовать общую функцию updateAge(), которая у каждого элемента класса People (т

107
Как хранить служебную информацию в табе?

Как хранить служебную информацию в табе?

Я создаю в QTabWidget динамические табы, в котором есть динамически созданные QLabel-ыУ каждого QLabel есть свой номер

108
C++ контейнеры map и set

C++ контейнеры map и set

Расжуйте пожалуйста эти строки:

119
Гетеры и сеттеры C++

Гетеры и сеттеры C++

Можете объяснить, как более правильно написать геттер для этого класса?

107