Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/40: Рейтинг темы: голосов - 40, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 28

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

08.11.2016, 18:30. Показов 8230. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.11.2016, 18:30
Ответы с готовыми решениями:

Ввод чисел по одному в строке, пока не встретится пустая строка
Добрый день! Начали в универе проходить Си. И на дом. задание дали несколько заданий. Условиями одной задачи стоит &quot;Вводятся...

Добавлять строку в список до тех пор, пока не введена пустая строка
Входные данные: пользователь вводит с консоли произвольное количество строк. Формат одной строки: одно шестизначное число. Ввод...

Записывать строки в файл то тех пор, пока не будет введена пустая строка
Есть код var f:text; st:string begin assign (f,'file1.txt'); rewrite (f); repeat begin write ('введите строку для записи');...

20
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
08.11.2016, 18:33
Цитата Сообщение от POWERR Посмотреть сообщение
a[i]
А почему как к массиву обращаешься?
0
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 28
08.11.2016, 18:51  [ТС]
Цитата Сообщение от Hikari Посмотреть сообщение
А почему как к массиву обращаешься?
Напутал все, я уже много способов пробовал как это исправить. Если обращаться через "->" то он всем значениям присваивает последние значения. Как это можно исправить? И еще вопрос, оператор new заново выделяет память под указатель или добавляет ее к уже имеющийся?(Если несколько раз его использовать)
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
08.11.2016, 22:53
Я имела ввиду другое:
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
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 28
09.11.2016, 13:22  [ТС]
Hikari, Мне нужен динамический массив.У меня не получается это реализовать, как это можно сделать?
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
09.11.2016, 15:57
Кхм... Хорошо, а почему тогда не хочешь на плюсах делать?
Например с коленки вот так:
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
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 28
09.11.2016, 16:16  [ТС]
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
71 / 55 / 24
Регистрация: 28.03.2016
Сообщений: 171
09.11.2016, 16:32
Цитата Сообщение от POWERR Посмотреть сообщение
Мы такое еще не изучали, а есть еще какой нибудь вариант? Через указатель и выделение под него памяти можно сделать?
Помню в универе заставляли динамический массив писать, все что помню - методы malloc и realloc - погугли их, мб поможет.
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
09.11.2016, 17:03
Цитата Сообщение от POWERR Посмотреть сообщение
Мы такое еще не изучали
Ужас какой... Дают плюсы не давая никаких плюсов.
А хоть динамический список изучали?
0
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 28
09.11.2016, 17:50  [ТС]
Hikari, Были списки, но очень поверхностно
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
09.11.2016, 18:17
Пффф... Тогда не надейся. Без списков или динамического массива не решить.
А как перестраивать массив вас врядли учили.
0
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 28
09.11.2016, 18:29  [ТС]
Hikari, Так динамический массив был или это тоже самое что динамический список?
0
Хитрая блондиночка $)
 Аватар для Hikari
1472 / 988 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
09.11.2016, 19:43
Нет. Это не тоже самое.
Под динамическим массивом я подразумеваю обычный массив который:
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
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 28
10.11.2016, 12:57  [ТС]
Hikari, Спасибо, буду разбираться дальше
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
10.11.2016, 13:58
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
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 28
17.11.2016, 16:43  [ТС]
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
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.11.2016, 16:52
Цитата Сообщение от POWERR Посмотреть сообщение
bilet()- конструктор.define() - функция для ввода своих значений.
Всё сразу стало понятно..
Код выкладывайте
0
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 28
17.11.2016, 16:55  [ТС]
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
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8216 / 5047 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.11.2016, 17:04
Цитата Сообщение от POWERR Посмотреть сообщение
getline(cin, lastname);
После считывания строки, в потоке остается символ '\n', который съедается при следующем считывании getline.
Используйте cin.ignore().
0
0 / 0 / 0
Регистрация: 15.07.2015
Сообщений: 28
17.11.2016, 22:32  [ТС]
MrGluck, А почему если в первый раз в фамилию ввести всего один символ,то программа завершается, а если дальше вводить туда один символ, то все работает?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.11.2016, 22:32
Помогаю со студенческими работами здесь

Вернуться к вводу если строка пустая (ввод через scanner)
Пытался организовать проверку на пустую строчку и если она пустая вернуться к вводу строки. Пробовал через через (do while) не получается...

При занесении данных в файл сначала создаётся пустая строка
Появилась такая ошибка, когда я открываю файл и пытаюсь занести туда данные, сначала создаётся пустая строка, а за ней уже строка с теми...

При загрузке данных из БД в Memo постоянно появляется пустая строка в конце
Приветствую. Такой вопрос: Есть база с полем типа Text, в него сохраняется значение из Memo, вот так: If Self.Memo1.Lines.Count=0...

Datagridview как узнать, что текущая строка последняя (пустая для ввода новых данных пользователем)
у меня, например, в datagridview 3 стоки и 4-ая со звездочкой для ввода новых данных пустая свойство DBGrid1.CurrentCell.RowIndex не...

Строка: Организовать ввод строковых значений до тех пор, пока пользователь не введет слово "хватит".
Организовать ввод строковых значений до тех пор, пока пользователь не введет слово &quot;хватит&quot;. При этом выводить длину введенных...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru