Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Vex788
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 54
1

Как можно убрать последнее значение в динамическом массиве

04.01.2016, 20:31. Просмотров 847. Ответов 9
Метки c++ (Все метки)

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
void file()//////////////////////////////
{
    int size = 1, counter = 0;
    ifstream fin("students.txt");
    Data *info = new Data[size];
    ofstream fout("recording.txt");
 
    while (!fin.eof())
    {
        Data *info = new Data[size];
        size++;
        fin >> info[counter].lastname;
        fin >> info[counter].name;
        fin >> info[counter].mark;
 
        if (info[counter].mark >= 5)
        {
            HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
            SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
            cout << "На відрахування\n";
            cout << "Прізвище та ім'я студента : " << info[counter].lastname << " " << info[counter].name << endl;
            cout << "Кількість незаліків : " << info[counter].mark << endl << endl;
            SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
            fout << "На відрахування\n";
            fout << "Прізвище та ім'я студента : " << info[counter].lastname << " " << info[counter].name << endl;
            fout << "Кількість незаліків : " << info[counter].mark << endl << endl;
        }
        else
        {
            cout << "Прізвище та ім'я студента : " << info[counter].lastname << " " << info[counter].name << endl;
            cout << "Кількість незаліків : " << info[counter].mark << endl << endl;
            fout << "Прізвище та ім'я студента : " << info[counter].lastname << " " << info[counter].name << endl;
            fout << "Кількість незаліків : " << info[counter].mark << endl << endl;
        }
        counter++;
    }
 
    fin.close();
    fout.close();
    cout << endl;
}
0
Миниатюры
Как можно убрать последнее значение в динамическом массиве  
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2016, 20:31
Ответы с готовыми решениями:

В заданном целочисленном одномерном динамическом массиве переставить минимальный элемент на последнее место
Создать одномерный динамический массив размера n, где n вводит пользователь. Заполнить его...

Как в динамическом массиве найти наибольшее значение?
Как в динамическом массиве найти наибольшее значение? srand(time(NULL)); int n = 0; cin &gt;&gt; n;...

Найти максимальное значение элемента на промежутке [a; b] в динамическом массиве. Классы С++
найти максимальное значение элемента на промежутке в динамическом массиве. Классы. Посмотрите...

Мусорное значение в динамическом массиве в структуре. Что я делаю не так?
Здравствуйте! Делаю вычисление факториала от 21 до 30. Использую длинную арифметику....

Как исправить ошибку в динамическом массиве?
Задание таково: Дана целочисленная квадратная матрица размером NхN, найти такое k, что k-й рядок...

9
zss
Модератор
Эксперт С++
8937 / 7773 / 4802
Регистрация: 18.12.2011
Сообщений: 20,705
Завершенные тесты: 1
04.01.2016, 20:56 2
Лучший ответ Сообщение было отмечено Vex788 как решение

Решение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
void file()//////////////////////////////
{
    ifstream fin("students.txt");
    int size = 0;
    char tmp[500];
    while( fin.getline(tmp,500) ) // считаем к-во строк (предполагаем - одна запись на одной строке)
        size++;
    Data* info=new Data[size];
    fin.seekg(0,ios::beg);
    ofstream fout("recording.txt");
    for(counter=0;counter<size;counter++)
    {
        fin >> info[counter].lastname;
        fin >> info[counter].name;
        fin >> info[counter].mark;
        fin.get(); // пропуск символа '\n'
 
        if (info[counter].mark >= 5)
        {
            HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
            SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
            cout << "На відрахування\n";
            cout << "Прізвище та ім'я студента : " << info[counter].lastname << " " << info[counter].name << endl;
            cout << "Кількість незаліків : " << info[counter].mark << endl << endl;
            SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
            fout << "На відрахування\n";
            fout << "Прізвище та ім'я студента : " << info[counter].lastname << " " << info[counter].name << endl;
            fout << "Кількість незаліків : " << info[counter].mark << endl << endl;
        }
        else
        {
            cout << "Прізвище та ім'я студента : " << info[counter].lastname << " " << info[counter].name << endl;
            cout << "Кількість незаліків : " << info[counter].mark << endl << endl;
            fout << "Прізвище та ім'я студента : " << info[counter].lastname << " " << info[counter].name << endl;
            fout << "Кількість незаліків : " << info[counter].mark << endl << endl;
        }
        counter++;
    }
    delete[] info;
    fin.close();
    fout.close();
    cout << endl;
}
Кстати, для данной программы массив не нужен.
Можете просто написать
C++
1
 Data info;
и info[counter] заменить на info
1
Nosey
1376 / 403 / 144
Регистрация: 22.10.2014
Сообщений: 872
Завершенные тесты: 2
04.01.2016, 21:34 3
Vex788, Это конечно не то что вы просили, но пожалуйста:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <iterator>
 
struct Student
{
    std::string field1 = "";
    std::string field2 = "";
    std::string field3 = "";
};
 
std::ostream& operator<<(std::ostream& strem, const Student& stud)
{
    // тут корректируем вывод в файл зависимости от оценок, или что там нужно.
    strem << stud.field1 << " ";
    strem << stud.field2 << " ";
    strem << stud.field3;
    return strem;
}
 
std::istream& operator>>(std::istream& strem, Student& stud)
{
    strem >> stud.field1;
    strem >> stud.field2;
    strem >> stud.field3;
    return strem;
}
 
int main()
{
    // прочитали из файла в вектор студентов:
    std::ifstream fin("students.txt");
    std::vector<Student> studs = std::vector<Student>(std::istream_iterator<Student>(fin), std::istream_iterator<Student>());
    fin.close();
 
    // перебрали студентов и вывели на экран
    for (auto& stud : studs)
    {
        // сделать что-нить по вкусу.
        std::cout << stud << std::endl;
    }
 
    // вывели массив студентов в другой файл.
    std::ofstream fout("recording.txt");
    std::copy(studs.begin(),studs.end(),std::ostream_iterator<Student>(fout, "\n"));
    fout.close();
}
0
Vex788
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 54
04.01.2016, 22:01  [ТС] 4
Без массива, но проблема та же. Можно как-то минусовать последнее значение?
Или while (!fin.eof()) может условие не правильное?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void file()//////////////////////////////
{
    ifstream fin("students.txt");
    Data info;
    ofstream fout("recording.txt");
 
    while (!fin.eof())
    {
        fin >> info.lastname;
        fin >> info.name;
        fin >> info.mark;
 
        if (info.mark >= 3)
        {
            HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
            SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
            cout << "На відрахування\n";
            cout << "Прізвище та ім'я студента : " << info.lastname << " " << info.name << endl;
            cout << "Кількість незаліків : " << info.mark << endl << endl;
            SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
            fout << "На відрахування\n";
            fout << "Прізвище та ім'я студента : " << info.lastname << " " << info.name << endl;
            fout << "Кількість незаліків : " << info.mark << endl << endl;
        }
        else
        {
            cout << "Прізвище та ім'я студента : " << info.lastname << " " << info.name << endl;
            cout << "Кількість незаліків : " << info.mark << endl << endl;
            fout << "Прізвище та ім'я студента : " << info.lastname << " " << info.name << endl;
            fout << "Кількість незаліків : " << info.mark << endl << endl;
        }
    }
 
    fin.close();
    fout.close();
    cout << endl;
}
0
04.01.2016, 22:01
Nosey
1376 / 403 / 144
Регистрация: 22.10.2014
Сообщений: 872
Завершенные тесты: 2
04.01.2016, 22:09 5
Лучший ответ Сообщение было отмечено Vex788 как решение

Решение

Vex788,
C++
1
2
3
4
5
6
7
8
9
10
while (!fin.eof()) // проверили что мы не в конце файла( с 99.9999% вероятностью даже после последней записи будет находиться либо пробел либо перенос строки. -> мы зайдём в цикл лишний раз.
{
// читаем данные из файла
        fin >> info.lastname;
        fin >> info.name;
        fin >> info.mark;
// если используя оператор >> мы не смогли прочитать из файла данных он будет в неюзабельном состоянии и после четения можно это проверить вот так:
if (fin) // прочитали верно.
else // неверно - лишняя строчка, выходим из цикла (break;)
}
1
Vex788
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 54
04.01.2016, 22:30  [ТС] 6
Пасиб, пашет)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
void file()//////////////////////////////
{
    int counter = 0, size = 0;
    ifstream fin("students.txt");
    Data info;
    ofstream fout("recording.txt");
 
    while (!fin.eof())
    {
        fin >> info.lastname;
        fin >> info.name;
        fin >> info.mark;
 
        if (fin)
        {
            if (info.mark >= 3)
            {
                HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
                SetConsoleTextAttribute(hConsole, FOREGROUND_RED);
                cout << "На відрахування\n";
                cout << "Прізвище та ім'я студента : " << info.lastname << " " << info.name << endl;
                cout << "Кількість незаліків : " << info.mark << endl << endl;
                SetConsoleTextAttribute(hConsole, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
                fout << "На відрахування\n";
                fout << "Прізвище та ім'я студента : " << info.lastname << " " << info.name << endl;
                fout << "Кількість незаліків : " << info.mark << endl << endl;
            }
 
            else
            {
                cout << "Прізвище та ім'я студента : " << info.lastname << " " << info.name << endl;
                cout << "Кількість незаліків : " << info.mark << endl << endl;
                fout << "Прізвище та ім'я студента : " << info.lastname << " " << info.name << endl;
                fout << "Кількість незаліків : " << info.mark << endl << endl;
            }
        }
        else
        {
            break;
        }
    }
 
    fin.close();
    fout.close();
    cout << endl;
}
0
zss
Модератор
Эксперт С++
8937 / 7773 / 4802
Регистрация: 18.12.2011
Сообщений: 20,705
Завершенные тесты: 1
05.01.2016, 09:48 7
Цитата Сообщение от Vex788 Посмотреть сообщение
Без массива, но проблема та же.
Я предлагал ее решить так
C++
1
2
while( fin.getline(tmp,500) ) // считаем к-во строк (предполагаем - одна запись на одной строке)
        size++;
Почему не подошло?
1
Vex788
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 54
05.01.2016, 09:56  [ТС] 8
Ваш ответ тоже отличный но я подумал что будет лучше будет подправить условие чтобы лишний раз не трогать указатель файла
0
zss
Модератор
Эксперт С++
8937 / 7773 / 4802
Регистрация: 18.12.2011
Сообщений: 20,705
Завершенные тесты: 1
05.01.2016, 10:00 9
Ну тогда Вам правильно заметили, что чтение последней записи происходит за концом файла,
соответственно ее обрабатывать не надо.
Можно еще написать так
C++
1
2
3
4
5
while (fin >> info.lastname)
{
   fin >> info.name;
   fin >> info.mark;
....
1
Vex788
0 / 0 / 0
Регистрация: 01.12.2015
Сообщений: 54
05.01.2016, 17:50  [ТС] 10
Я и не знал что так можно в условии писать) Каждый день что то новое узнаю)
Пасиб)
0
05.01.2016, 17:50
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.01.2016, 17:50

Как переставить строки в динамическом двумерном массиве?
Нужно было написать программу, которая переставляет строки матрицы так, чтобы значения в столбце K...

Как поменять местами столбцы в двумерном динамическом массиве?
нужно столбцы с четными номерами поменять местами с нечетными, помогите исправить ошибку int...

Как вывести последнее значение массива, не зная сколько в этом массиве значений?
Подскажите как сделать. Вот создал например мой друг массив с неизвестным мне кол-ом значений. И...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.