Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Добавление записи в текстовый файл 
V
    Опции темы
Bestseller01
  Дата 23.12.2015, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 25.2.2014

Репутация: нет
Всего: нет



Помогите включить в этот список добавление новых студентов в уже существующий текстовый файл
Оценок должно быть 5
сам текстовый файл выглядит так:
Ф.И.О Алгебра Физика Химия Геометрия Русс. язык
Иванов И. И 3 4 4 4 5
Карпов И. С. 5 5 5 5 3
Петров С. К. 3 3 4 4 3
Борзенков А. А. 4 4 4 4 4
Константинов П. П. 5 5 5 5 5
Код

struct Student
{
    void fn_student_list()///Выводим список студентов
    {
        for(unsigned int i=0;i<vec_FIO.size();++i)cout<<vec_FIO[i]<<endl;
    }
    vector<string>vec_FIO;
    vector<int> vec_math,vec_physics,vec_chemistry,vec_geometry,vec_rus;
    void fn_student_exam_5()///Список студентов которые сдали все экзамены только на пять
    {
        bool five=false;
        for(unsigned int i=0;i<vec_FIO.size();++i)
        {
            unsigned int sum=0;
            if(vec_math[i]==5)sum+=5;
            if(vec_physics[i]==5)sum+=5;
            if(vec_chemistry[i]==5)sum+=5;
            if(vec_geometry[i]==5)sum+=5;
            if(vec_rus[i]==5)sum+=5;
            if(sum==25)
            {
                cout<<vec_FIO[i]<<endl;
                five=true;
            }
 
        }
        if(five==false)cout<<"Таких студентов нет :("<<endl;
    }
    void fn_student_exam_3()///Список студентов которые имеют хотя-бы одну тройку по экзаменам
    {
        bool three=false;
        for(unsigned int i=0;i<vec_FIO.size();++i)
        {
            unsigned int sum=0;
            if(vec_math[i]==3)sum++;
            if(vec_physics[i]==3)sum++;
            if(vec_chemistry[i]==3)sum++;
            if(vec_geometry[i]==3)sum++;
            if(vec_rus[i]==3)sum++;
            if(sum>=1)
            {
                cout<<vec_FIO[i]<<endl;
                three=true;
            }
        }
        if(three==false)cout<<"Таких студентов нет :("<<endl;
    }
    void fn_student_exam_2()///Список студентов у которых есть двойки
    {
        bool two=false;
        for(unsigned int i=0;i<vec_FIO.size();++i)///удаляем студентов у котороыъ больше одной двойки
        {
            int sum=0;
            if(vec_math[i]==2)sum++;
            if(vec_physics[i]==2)sum++;
            if(vec_chemistry[i]==2)sum++;
            if(vec_geometry[i]==2)sum++;
            if(vec_rus[i]==2)sum++;
            if(sum>=2)
            {
                vec_FIO.erase(vec_FIO.begin()+i);
                vec_math.erase(vec_math.begin()+i);
                vec_physics.erase(vec_physics.begin()+i);
                vec_chemistry.erase(vec_chemistry.begin()+i);
                vec_geometry.erase(vec_geometry.begin()+i);
                vec_rus.erase(vec_rus.begin()+i);
            }
        }
        for(unsigned int i=0;i<vec_FIO.size();++i)///Выводим список студентов
        {
            unsigned int sum=0;
            if(vec_math[i]==2)sum++;
            if(vec_physics[i]==2)sum++;
            if(vec_chemistry[i]==2)sum++;
            if(vec_geometry[i]==2)sum++;
            if(vec_rus[i]==2)sum++;
            if(sum>=1)
            {
                cout<<vec_FIO[i]<<endl;
                two=true;
            }
        }
        if(two==false)cout<<"Таких студентов нет :("<<endl;
    }
};
int main()
{
    Student student;
    string str,fstr;
    SetConsoleOutputCP(1251);
    int value,math,physics,chemistry,geometry,rus,number_of_students=0;
    ifstream in("file.txt");
    if(!in)///Если не смогли открыть файл
    {
        cout<<"Can't open file\n";
        return 1;
    }
    getline(in,str);
    while(in>>str)
    {
        fstr+=str+' ';
        for(int i=0;i<2;++i)
        {
            in>>str;
            fstr+=str+' ';
        }
        student.vec_FIO.push_back(fstr);
        fstr.clear();
        in>>math;
        student.vec_math.push_back(math);
        in>>physics;
        student.vec_physics.push_back(physics);
        in>>chemistry;
        student.vec_chemistry.push_back(chemistry);
        in>>geometry;
        student.vec_geometry.push_back(geometry);
        in>>rus;
        student.vec_rus.push_back(rus);
        number_of_students++;
        if(number_of_students==20)break;
    }
    in.close();///Закрыли файл
    start:cout<<"\n1. Список студентов (ФИО)"<<endl;
    cout<<"2. Список студентов которые сдали все экзамены только на пять."<<endl;
    cout<<"3. Список студентов которые имеют хотя-бы одну тройку по экзаменам."<<endl;
    cout<<"4. Список студентов у которых есть двойки."<<endl;
    cout<<"(если студент имеет больше одной двойки он исключается из списка)."<<endl;
    cout<<"5. Введите 'q' для выхода"<<endl;
    cout<<"Пожалуйста сделайте свой выбор: ";
    char c;
    cin>>c;
    switch(c)
    {
        case '1':
        {
            student.fn_student_list();
            goto start;
        }
        case '2':
        {
            student.fn_student_exam_5();
            goto start;
        }
        case '3':
        {
            student.fn_student_exam_3();
            goto start;
        }
        case '4':
        {
            student.fn_student_exam_2();
            goto start;
        }
        case 'q':
        {
                return 0;
        }
        default:
        {
            cout<<"Неверный ввод :( Попробуйте снова\n";
            goto start;
        }
    }
    return 0;
}

PM MAIL   Вверх
rudolfninja
Дата 23.12.2015, 20:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



Доброго времени суток.
Во-первых, у вас язык c++. В нем принято использовать классы для объединения данных и методов обработки этих данных, а у вас используется структура. Во-вторых, хорошим тоном программирования считается разделять класс на интерфейс и реализацию методов этого интерфейса, причем желательно что бы это все было в разных файлах: .h и .cpp соответственно.
Теперь по делу,  если вам надо реализовать функцию, которая добавляет информацию о студентах в конец файла, то вам нужно выполнить следующие шаги:
1) Записать куда-нибудь информацию о студенте. Тут хорошо подойдет структура, в которой будет строковое поле и целочисленный массив из 5 элементов. Пользователь программы заполняет эту структуру и переходит к шагу №2.
2) Записать информацию, полученную на шаге 1 в файл. Для этого файл надо открыть для записи в конец. В случае с файловыми потоками, нужно добавить флаг std::ios::app при открытии файла.
Дальше все просто, с помощью операторов вставки записываете в файл новую информацию.


PM MAIL Skype   Вверх
rudolfninja
Дата 25.12.2015, 11:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 341
Регистрация: 19.2.2013
Где: г. Минск

Репутация: 1
Всего: 6



В общем, сначала объявляем структуру студент, в которое содержится имя студента и массив оценок:
Код

struct student
{
    string name;
    int marks[5];
};


Для более удобной (наглядной) индексации массива было создано перечисление, в котором названиям предметов соответствуют числовые константы:
Код

enum DISCIPLINES {ALGEBRA = 0, PHYSICS = 1, CHEMISTRY = 2, GEOMETRY = 3, RUSSIAN_LANG = 4};


Для вывода названия предмета на экран (понадобиться при выводе двоичников/троичников) был создан массив с названием предметов:
Код

char* DISCIPLINE_NAMES[] = { "algebra", "physics", "chemistry", "geometry", "russian language" };


Ну а дальше начинаем создавать функции, которые нужны для работы программы по заданию:
Функция, которая определяет, все ли оценки студента - 5. В случае если студент отличник - функция возвращает true, иначе - false. В функцию передается объект структуры student:
Код

bool is_all_five(student st)
{
    for (DISCIPLINES ds = ALGEBRA; ds <= RUSSIAN_LANG;  ds = (DISCIPLINES)(ds + 1))
    {
        if (st.marks[ds] != 5)
            return false;
    }
    return true;
}


Функция, которая выводит студентов с заданной оценкой и пишет по какому предмету студент имеет заданную оценку. Функция возвращает false если студентов с заданной оценкой нет в списке, иначе - true и выводит на экран фамилии студентов и предмет, по которому заданная оценка. В функцию передается список студентов (по сути, обычный массив) и искомая оценка:
Код

bool print_students_with_mark(vector<student> list, int mark)
{
    bool result = false;

    for (size_t st_num = 0; st_num < list.size(); st_num++)
    {
        student st = list[st_num];
        for (DISCIPLINES ds = ALGEBRA; ds <= RUSSIAN_LANG; ds = (DISCIPLINES)(ds + 1))
        {
            if (st.marks[ds] == mark)
            {
                cout << "Student " << st.name << " has got " << mark << " for " << DISCIPLINE_NAMES[ds] << endl;
                result = true;
            }
        }
    }
    return result;
}


Функция, которая  выводит список студентов на экран. Функция принимает на вход список студентов (массив из элементов структуры student):
Код

void print_students_list(vector<student> list)
{
    for (size_t st_num = 0; st_num < list.size(); st_num++)
    {
        cout << "Student: " << list[st_num].name << endl;
        for (DISCIPLINES ds = ALGEBRA; ds <= RUSSIAN_LANG; ds = (DISCIPLINES)(ds + 1))
            cout << "\t" << DISCIPLINE_NAMES[ds] << ": " << list[st_num].marks[ds] << endl;

    }
}


Функция, которая добавляет список студентов в конец текстового файла. Функция возвращает значение типа bool, в случае если такого файла не существует - возвращаемое значение будет false и список студентов никуда не будет записан. Если файл существует, то список студентов будет добавлен в конец файла. Поэтому важно убедиться, что требуемый файл существует (его следует создать вручную перед использованием программы):
Код

bool append_students_to_file(vector<student> list, char* filename)
{
    ofstream out(filename, ios::app);

    if (!out.is_open())
        return false;

    for (size_t st_num = 0; st_num < list.size(); st_num++)
    {
        student st = list[st_num];
        out << st.name << ' ';
        for (DISCIPLINES ds = ALGEBRA; ds <= RUSSIAN_LANG; ds = (DISCIPLINES)(ds + 1))
        {
            out << st.marks[ds] << ' ';
        }
        out << endl;
    }
    out.close();

    return true;
}


Функция, которая добавляет студента в список. В функцию надо передать ссылку на список, в который будет добавлен студент. Сначала будет предложено заполнить данные о студенте и потом он будет добавлен в список:
Код

void add_student_to_list(vector<student>& list)
{
    student st;
    cout << "Input students name: ";
    cin.ignore();
    getline(cin, st.name);
    cout << "Input 5 marks (algebra physics chemistry geometry russian): ";
    for (DISCIPLINES ds = ALGEBRA; ds <= RUSSIAN_LANG; ds = (DISCIPLINES)(ds + 1))
        cin >> st.marks[ds];
    list.push_back(st);
}


Функция вывода меню на экран. Возвращаемое значение - выбор пользователя:
Код

int menu()
{
    char buf[10];
    int option;
    do {
        cout << "-------------------------" << endl;
        cout << "1- Add student to list" << endl;
        cout << "2- Print list of all students" << endl;
        cout << "3- Print students with all marks equal to 5" << endl;
        cout << "4- Print students with at least one mark equal to 3" << endl;
        cout << "5- Print students with at least one mark equal to 2" << endl;
        cout << "6- Append list to file" << endl;
        cout << "7- Exit" << endl;
        cin >> buf;
        option = atoi(buf);
    } while (!option);
    return option;
}


Ну и функция main, в которой собрано все то, что описано выше, в требуемой последовательности:
Код

int _tmain(int argc, _TCHAR* argv[])
{
    vector<student> list;
    bool is_exit = false;

    while (!is_exit)
    {
        switch (menu())
        {
        case 1:
            add_student_to_list(list);
            break;
        case 2:
            print_students_list(list);
            break;
        case 3:
        {
                  for (size_t st_num = 0; st_num < list.size(); st_num++)
                  {
                      if (is_all_five(list[st_num]))
                          cout << list[st_num].name << endl;
                  }
                  break;
        }
        case 4:
            if (!print_students_with_mark(list, 3))
                cout << "There are no students with at lease one mark \'3\' in the list" << endl;
            break;
        case 5:
            if(!print_students_with_mark(list, 2))
                cout << "There are no students with at lease one mark \'2\' in the list" << endl;
            break;
        case 6:
            if (!append_students_to_file(list, "E:\\students.txt"))
                cout << "File doesn't exist" << endl;
            break;
        case 7:
            is_exit = true;
            break;
        }
    }

    return 0;
}


Вам осталось только создать проект и вставить туда весь этот код. Не забудьте подключить нужные заголовочные файлы:
Код

#include <string>
#include <vector>
#include <iostream>
#include <fstream>

using namespace std;


На всякий случай прикрепил к сообщению .cpp файл программы, в котором содержится полный исходный код рабочего приложения.

Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  students_list.cpp 3,94 Kb
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1103 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.