С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
POWERR
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 27
1

Ввод данных пока строка не пустая

08.11.2016, 18:30. Просмотров 650. Ответов 20
Метки нет (Все метки)

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

Я создал класс, включил в него конструктор.
C++
1
2
3
4
5
bilet::bilet()
{
    lastname = new char[60];
    strcpy(lastname," ");
}
Функцию ввода данных...
и в main пишу и потом программа вылетает. Как правильно выделить память под этот объект?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    bilet *a;
    a = new bilet();
    for (int i = 0; i < 4; i++)
    {
        a[i].define();
    }
    for (int i = 0; i < 4; i++)
    {
        a[i].display();
    }
    return 0;
}
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.11.2016, 18:30
Ответы с готовыми решениями:

Пустая строка
Делал задание по перегрузке функций. Перегружаю функцию sum. В одном из заданий...

Вводится пустая строка
Здравствуйте, при выполнении моего кода выходит исключение от функции substr...

Пустая строка в функции
Имеется такая функция: int setgolf (golf &amp; g) { std::cout &lt;&lt; &quot;Введите...

Читается пустая строка
Имеется код, при его компилировании программа игнорирует взятие строки у...

Проверить, пустая ли строка. (fstream)
Добрый вечер, ув. форумчане. Допустим есть пример: void main() { ...

20
Hikari
Хитрая блондиночка $)
1451 / 964 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
08.11.2016, 18:33 2
Цитата Сообщение от POWERR Посмотреть сообщение
a[i]
А почему как к массиву обращаешься?
0
POWERR
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 27
08.11.2016, 18:51  [ТС] 3
Цитата Сообщение от Hikari Посмотреть сообщение
А почему как к массиву обращаешься?
Напутал все, я уже много способов пробовал как это исправить. Если обращаться через "->" то он всем значениям присваивает последние значения. Как это можно исправить? И еще вопрос, оператор new заново выделяет память под указатель или добавляет ее к уже имеющийся?(Если несколько раз его использовать)
0
Hikari
Хитрая блондиночка $)
1451 / 964 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
08.11.2016, 22:53 4
Я имела ввиду другое:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
    bilet a[4];
    for (int i = 0; i < 4; i++)    a[i] = new bilet();
    for (int i = 0; i < 4; i++)
    {
        a[i].define();
    }
    for (int i = 0; i < 4; i++)
    {
        a[i].display();
    }
    return 0;
}
Т.е. если нужен массив, то нужно его хотя бы создать и населить объектами.
0
POWERR
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 27
09.11.2016, 13:22  [ТС] 5
Hikari, Мне нужен динамический массив.У меня не получается это реализовать, как это можно сделать?
0
Hikari
Хитрая блондиночка $)
1451 / 964 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
09.11.2016, 15:57 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
#include <string>
#include <iostream>
#include <list>
using namespace std;
 
class bilet {
private:
    string FIO, Reis;
public:
    bilet() {
        cout << "FIO "; getline(cin,FIO);
        cout << "Reis "; getline(cin, Reis);
    };
    bool TheEnd() { 
        return FIO == ""; 
    };
    void write() {
        cout << "FIO "<<FIO<<'\t'<<"Reis "<<Reis<<endl;
    }
};
int main()
{
    list<bilet> bilets;
    for (;bilets.empty() || !bilets.back().TheEnd();) {
        bilets.push_back(bilet());
    };
    for (auto i : bilets) i.write();
    getchar();
    return 0;
}
Если очень упрощенно рассматривать как решение.
0
POWERR
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 27
09.11.2016, 16:16  [ТС] 7
Hikari,
Цитата Сообщение от Hikari Посмотреть сообщение
C++
1
2
3
4
5
list<bilet> bilets;
* * for (;bilets.empty() || !bilets.back().TheEnd();) {
* * * * bilets.push_back(bilet());
* * };
* * for (auto i : bilets) i.write();
Мы такое еще не изучали, а есть еще какой нибудь вариант? Через указатель и выделение под него памяти можно сделать?
0
Полурослик
2 / 2 / 5
Регистрация: 28.03.2016
Сообщений: 19
09.11.2016, 16:32 8
Цитата Сообщение от POWERR Посмотреть сообщение
Мы такое еще не изучали, а есть еще какой нибудь вариант? Через указатель и выделение под него памяти можно сделать?
Помню в универе заставляли динамический массив писать, все что помню - методы malloc и realloc - погугли их, мб поможет.
0
Hikari
Хитрая блондиночка $)
1451 / 964 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
09.11.2016, 17:03 9
Цитата Сообщение от POWERR Посмотреть сообщение
Мы такое еще не изучали
Ужас какой... Дают плюсы не давая никаких плюсов.
А хоть динамический список изучали?
0
POWERR
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 27
09.11.2016, 17:50  [ТС] 10
Hikari, Были списки, но очень поверхностно
0
Hikari
Хитрая блондиночка $)
1451 / 964 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
09.11.2016, 18:17 11
Пффф... Тогда не надейся. Без списков или динамического массива не решить.
А как перестраивать массив вас врядли учили.
0
POWERR
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 27
09.11.2016, 18:29  [ТС] 12
Hikari, Так динамический массив был или это тоже самое что динамический список?
0
Hikari
Хитрая блондиночка $)
1451 / 964 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
09.11.2016, 19:43 13
Нет. Это не тоже самое.
Под динамическим массивом я подразумеваю обычный массив который:
1) При подкидывании к нему нового элемента пересоздается заново с ячейкой для уже имеющихся элементов
2) Массив задается частями слябами, по заполнению сляба в его последнюю ячейку записывается адрес на новый сляб.
Не знаю как попроще объяснить, меня так учили.

Первое может выглядеть так:
C++
1
2
3
4
5
6
7
8
bilet *b=0;
bilet *Add(bilet *NewObj,bilet *Array,int &n){
 bilet *temp=new bilet[n+1];
 for(int i=0;i<n;i+) temp[i]=Array[i];
 temp[n++]=NewObj;
 delete [] Array;
 return temp;
}
И его использование
C++
1
2
3
4
5
6
bilet *Bilettes=new bilet();
int n=1;
Bilettes=Add(new bilet(),Bilettes,n); //Добавили билет
Bilettes=Add(new bilet(),Bilettes,n); //И еще
Bilettes=Add(new bilet(),Bilettes,n); //И снова
...
Это с коленки, и не думай что пример правильный. Я так никогда не писала (ибо STL), посему максимум что - доношу механизм перевоссоздания динамического массива.
1
POWERR
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 27
10.11.2016, 12:57  [ТС] 14
Hikari, Спасибо, буду разбираться дальше
0
MrGluck
Модератор
Эксперт CЭксперт С++
8106 / 4958 / 1436
Регистрация: 29.11.2010
Сообщений: 13,454
10.11.2016, 13:58 15
POWERR, если количество элементов не должно увеличиваться по ходу работы программы, вам динамический список не нужен.
Если известно количество элементов на стадии компиляции - подойдет обычный массив (Type[]).
Если количество вводиться с клавиатуры, а потом не меняется - используйте динамический массив (new Type[]).
Если количество заранее неизвестно - можно использовать расширяющийся динамический массив (std::vector), либо список(std::list). Если STL нельзя, то писать ручками. В этом плане список, конечно, попроще.

Добавлено через 5 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
#include <vector>
 
struct Ticket
{
    int flightNumber;
    std::string surname;
};
 
int main()
{
    std::vector<Ticket> tickets;
    int number = 0;
    for (std::string surname; std::cout << "Enter surname: " && std::getline(std::cin, surname) && !surname.empty(); tickets.push_back({number++, surname}));
    for (const auto &t : tickets)
        std::cout << t.flightNumber << ": " << t.surname << std::endl;
}
Добавлено через 3 минуты
Возможно, проще для понимания будет такой переписанный вариант:
C++
1
2
3
4
5
6
7
8
std::string surname;
do
{
    std::cout << "Enter surname: ";
    std::getline(std::cin, surname);
    if (!surname.empty())
        tickets.push_back(Ticket{number++, surname});
} while (!surname.empty());
Добавлено через 1 минуту
Кстати, меняется на список (std::list) с помощью замены всего лишь в объявлении контейнера (и загол. файле)
1
POWERR
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 27
17.11.2016, 16:43  [ТС] 16
bilet()- конструктор.define() - функция для ввода своих значений.
Программа не дает 2-ой раз ввести фамилию и после второй строчки заканчивает работать, почему?

C++
1
2
3
4
5
6
7
8
    vector<bilet> bilets;
    do
    {
        bilets.push_back(bilet());
        bilets.back().define();
    } while (!bilets.back().last());
    for (int i = 0; i < bilets.size(); i++)
        bilets[i].display();
0
MrGluck
Модератор
Эксперт CЭксперт С++
8106 / 4958 / 1436
Регистрация: 29.11.2010
Сообщений: 13,454
17.11.2016, 16:52 17
Цитата Сообщение от POWERR Посмотреть сообщение
bilet()- конструктор.define() - функция для ввода своих значений.
Всё сразу стало понятно..
Код выкладывайте
0
POWERR
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 27
17.11.2016, 16:55  [ТС] 18
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
bilet::bilet()
{
    lastname = " ";
    number = 0;
}
void bilet::define()
{
    cout << "Vvedite familiu:";
    getline(cin, lastname);
    cout << endl << "vvedite nomer reisa";
    cin >> number;
 
}
0
MrGluck
Модератор
Эксперт CЭксперт С++
8106 / 4958 / 1436
Регистрация: 29.11.2010
Сообщений: 13,454
17.11.2016, 17:04 19
Цитата Сообщение от POWERR Посмотреть сообщение
getline(cin, lastname);
После считывания строки, в потоке остается символ '\n', который съедается при следующем считывании getline.
Используйте cin.ignore().
0
POWERR
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 27
17.11.2016, 22:32  [ТС] 20
MrGluck, А почему если в первый раз в фамилию ввести всего один символ,то программа завершается, а если дальше вводить туда один символ, то все работает?
0
17.11.2016, 22:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2016, 22:32

Hot. Как узнать пустая ли строка?
Добрый день. Уже как часа бьюсь с одной проблемой. Есть текст, удаляются...

Переход на строку и пустая строка в файле
Условие. Создайте два выходных файла: в один перепишите из каждой строки первые...

Проверка, пустая строка или нет
Здравствуйте, подскажите как реализовать проверку на пустую строку?? #include...


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

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

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