Форум программистов, компьютерный форум CyberForum.ru

Как применить new, точнее для чего это нужно? - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Fooly
 Аватар для Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
10.06.2012, 21:15     Как применить new, точнее для чего это нужно? #1
Выполняю упражнение с книги. Условие можно увидеть на скрине
ниже представлен код.
Возникли следующие вопросы:
1. как применить new, точнее для чего это нужно, если и так программа работает нормально? Допустим я добавлю строчку
car * rio = new car
Я вот не пойму для чего мне это нужно будет дальше?
2. проблема в строчке 23. При попытке ввода названия, состоящего из двух слов, программа мгновенно выдаёт оставшиеся строчки запроса (Автомобиль №, введите производителя, укажите год выпуска) и закрывается.
не получается с помощью cin.get =(
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
#include <iostream>
#include <string>
using namespace std;
struct car
    {
        string name;
        int year;
    };
int main()
{
    
    setlocale (LC_ALL, "Russian");
    
    int kol;
    cout << "Сколько автомобилей поместить в каталог? ";
    cin >> kol;
    car bibiki [100];
    for (int i=0; i<kol; i++)
    {
        cout << "\nАвтомобиль №" << i+1 <<":" <<
            "\nВведите производителя: ";
        cin >> bibiki[i].name;
        cout << "Укажите год выпуска: ";
        cin >> bibiki[i].year;
    };
    cout << "\nВот ваша коллекция: \n";
    for (int j=0; j<kol; j++)
        cout << bibiki[j].year << " " << bibiki[j].name << endl;
    
    for (int j=0; j<100; j++)
        cin.get();
    return 0;
}
Миниатюры
Как применить new, точнее для чего это нужно?  
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.06.2012, 21:15     Как применить new, точнее для чего это нужно?
Посмотрите здесь:

Прроблемы с шифрованием,а точнее с тем как это закодить C++
C++ Для чего это в программе?
C++ нужно создать таблицу из 3 строк и 4 столбцов и заполнить её (любой информацией,это неважно) . Как это можно сделать ?
C++ Для чего нужно писать в int main() в скобках всякие args потом объявлять переменные, и прочее. Для чего если можно в сборках это все обьявлять.
Параметр rhs, что это и для чего (конструктор-копировщик) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6904 / 5144 / 253
Регистрация: 10.12.2010
Сообщений: 22,621
Записей в блоге: 17
10.06.2012, 21:29     Как применить new, точнее для чего это нужно? #2
А в конец пробовал вставлять строчку
C++
1
system("pause");
Еще наверное следует прописывать cin.sync(); после
C++
1
cin >> kol;
ну и везде после ввода , перед выводом
Fooly
 Аватар для Fooly
21 / 17 / 1
Регистрация: 26.03.2012
Сообщений: 147
10.06.2012, 22:00  [ТС]     Как применить new, точнее для чего это нужно? #3
Спасибо cin.sync(); помог =) Переписал код., поняв как использовать new, а то голова уже ватная - не мог думать. Сейчас только разберусь, что делает этот sync

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
#include <iostream>
#include <string>
using namespace std;
struct car
    {
        string name;
        int year;
    };
int main()
{
    
    setlocale (LC_ALL, "Russian");
    
    int kol;
    cout << "Сколько автомобилей поместить в каталог? ";
    cin >> kol;
    car * rio = new car [100];
    string str;
    for (int i=0; i<kol; i++)
    {
        cout << "\nАвтомобиль №" << i+1 <<":" <<
            "\nВведите производителя: ";
        cin >> rio[i].name;
        cin.sync();
        cout << "Укажите год выпуска: ";
        cin >> rio[i].year;
    };
    cout << "\nВот ваша коллекция: \n";
    for (int j=0; j<kol; j++)
        cout << rio[j].year << " " << rio[j].name << endl;
    
    for (int j=0; j<100; j++)
        cin.get();
    system("pause");
    return 0;
}
Только не пойму почему нельзя использовать
cin.get(rio[i].name, 20);
Все равно подчеркивает точку после cin =( даже если просто прописать cin.getline(); без операторов
vpnwz151
 Аватар для vpnwz151
10 / 11 / 1
Регистрация: 03.11.2011
Сообщений: 129
11.06.2012, 15:02     Как применить new, точнее для чего это нужно? #4
Создается новый массив для записи данных
C++
1
car * rio = new car
metagalaxy
7 / 7 / 2
Регистрация: 18.02.2012
Сообщений: 61
04.07.2013, 22:33     Как применить new, точнее для чего это нужно? #5
Цитата Сообщение от Fooly Посмотреть сообщение
Только не пойму почему нельзя использовать Все равно подчеркивает точку после cin =( даже если просто прописать cin.getline(); без операторов
Потому, что rio - указатель. Надо использовать операцию членства через указатель ->
т.е. cin.get(rio->name, 20);
Либо через операцию разыменования: cin.get((*rio).name, 20);

Добавлено через 31 минуту
Кстати нужно освободить память после new, для этого после system("pause"); впиши delete [] rio;

Добавлено через 40 минут
Вот моя версия(тоже обучаюсь по книге)):

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
#include <iostream>
 
struct car
{
       char name[15];
       int year;
};
 
int main()
{
    using namespace std;
    int auto_num;
    cout << "How many cars will be included into catalog? ";
    cin >> auto_num;
    car * cars = new car[auto_num];
    for (int i = 1; i <= auto_num; i++)
    {
             cout << "Auto #" << i << "\n" 
                  << "Enter machine brand: ";
             cin >> cars[i].name;
             cout << "Enter date of issue: ";
             cin >> cars[i].year;
    }
    for (int c = 1; c <= auto_num; c++)
    {
        cout << "Here's your collection: \n" 
        << cars[c].year << " " << cars[c].name << "\n";
    }
    delete [] cars;
    cin.get();
    cin.get();
    return 0;
}
metagalaxy
7 / 7 / 2
Регистрация: 18.02.2012
Сообщений: 61
04.07.2013, 22:56     Как применить new, точнее для чего это нужно? #6
Как применить new, точнее для чего это нужно?
Подправил код, теперь 1 строчка Here's your collection%)
metagalaxy
7 / 7 / 2
Регистрация: 18.02.2012
Сообщений: 61
04.07.2013, 23:04     Как применить new, точнее для чего это нужно? #7
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
#include <iostream>
 
struct car
{
       char name[15];
       int year;
};
 
int main()
{
    using namespace std;
    int auto_num;
    cout << "How many cars will be included into catalog? ";
    cin >> auto_num;
    car * cars = new car[auto_num];
    for (int i = 1; i <= auto_num; i++)
    {
             cout << "Auto #" << i << "\n" 
                  << "Enter machine brand: ";
             cin >> cars[i].name;
             cout << "Enter date of issue: ";
             cin >> cars[i].year;
    }
    cout << "Here's your collection: \n"; 
    for (int c = 1; c <= auto_num; c++)
        cout << cars[c].year << " " << cars[c].name << "\n";
    delete [] cars;
    cin.get();
    cin.get();
    return 0;
}
хотя я думаю итак понятно
Нету имени
177 / 22 / 2
Регистрация: 16.05.2013
Сообщений: 181
05.07.2013, 15:31     Как применить new, точнее для чего это нужно? #8
metagalaxy,
Цитата Сообщение от metagalaxy Посмотреть сообщение
C++
1
for (int c = 1; c <= auto_num; c++)
почему с 1, а не с 0 ???
metagalaxy
7 / 7 / 2
Регистрация: 18.02.2012
Сообщений: 61
05.07.2013, 15:49     Как применить new, точнее для чего это нужно? #9
Цитата Сообщение от Нету имени Посмотреть сообщение
metagalaxy,

почему с 1, а не с 0 ???

Потому, что начинается так: Автомобиль #1, Автомобиль #2 и тп., а не с 0)
Нету имени
177 / 22 / 2
Регистрация: 16.05.2013
Сообщений: 181
05.07.2013, 15:59     Как применить new, точнее для чего это нужно? #10
metagalaxy, массивы с 0 начинаются, у тебя cars[0] - пустым остаётся
а чтобы нам выводил, как "Атомобиль #1" например тут
C++
1
2
3
4
5
6
7
8
    for (int i = 1; i <= auto_num; i++)
    {
             cout << "Auto #" << i << "\n"    // <- вот тут, можно написать ' i+1 ', чтобы посчет был, более понятный
                  << "Enter machine brand: ";
             cin >> cars[i].name;
             cout << "Enter date of issue: ";
             cin >> cars[i].year;
    }
И я наверное ошибаюсь, но последний элемент массива должен оставаться пустым
metagalaxy
7 / 7 / 2
Регистрация: 18.02.2012
Сообщений: 61
05.07.2013, 17:13     Как применить new, точнее для чего это нужно? #11
Цитата Сообщение от Нету имени Посмотреть сообщение
metagalaxy, массивы с 0 начинаются, у тебя cars[0] - пустым остаётся
а чтобы нам выводил, как "Атомобиль #1" например тут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Код C++
1
2
3
4
5
6
7
8
* * for (int i = 1; i <= auto_num; i++)
* * {
* * * * * * *cout << "Auto #" << i << "\n" * *// <- вот тут, можно написать ' i+1 ', чтобы посчет был, более понятный
* * * * * * * * * << "Enter machine brand: ";
* * * * * * *cin >> cars[i].name;
* * * * * * *cout << "Enter date of issue: ";
* * * * * * *cin >> cars[i].year;
* * }
И я наверное ошибаюсь, но последний элемент массива должен оставаться пустым
А ты попробуй сделай то, что ты написал и запусти) Цикл получится не правильный. Но насчет cars[0] ты прав, я щас думаю как сделать правильно.

Добавлено через 1 час 0 минут
Кое как сделал то ли бошка не варит, то ли хз..
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
#include <iostream>
 
struct car
{
       char name[15];
       int year;
       };
 
int main()
{
    using namespace std;
    int auto_num;
    cout << "How many cars will be included into catalog? ";
    cin >> auto_num;
    car * cars = new car[auto_num];
    for (int i = 0, j = 1; i, j <= auto_num; i++, j++)
    {        
             cout << "Auto #" << j << "\n"
                  << "Enter machine brand: ";
             cin >> cars[i].name;
             cout << "Enter the date of issue: ";
             cin >> cars[i].year;
             }
    --auto_num;
    cout << "Here's your collection: \n"; 
    for (int c = 0; c <= auto_num; c++)
        cout << cars[c].year << " " << cars[c].name << "\n";
    delete [] cars;
    cin.get();
    cin.get();
    return 0;
}
Нету имени
177 / 22 / 2
Регистрация: 16.05.2013
Сообщений: 181
05.07.2013, 17:31     Как применить new, точнее для чего это нужно? #12
metagalaxy, а так подходит вариант
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int main( int argc, char * argv[] ) {
    int auto_num;
    
    std::cout << "How many cars will be included into catalog? ";   std::cin >> auto_num;
    
    car * cars = new car[auto_num];
    
    for (int i=0; i<auto_num; i++){        
        std::cout << "Auto #" << i+1 << "\n"
             << "Enter machine brand: ";
        std::cin >> cars[i].name;
        std::cout << "Enter the date of issue: ";
        std::cin >> cars[i].year;
    }
    
    cout << "Here's your collection: \n"; 
    for (int c = 0; c < auto_num; c++)
        cout << cars[c].year << " " << cars[c].name << "\n";
    delete [] cars;
    std::cin.get();
    std::cin.get();
    return 0;
}
metagalaxy
7 / 7 / 2
Регистрация: 18.02.2012
Сообщений: 61
05.07.2013, 17:35     Как применить new, точнее для чего это нужно? #13
Цитата Сообщение от Нету имени Посмотреть сообщение
metagalaxy, а так подходит вариант
Нет конечно, запусти у себя зачем гадать-то?)))
Нету имени
177 / 22 / 2
Регистрация: 16.05.2013
Сообщений: 181
06.07.2013, 06:48     Как применить new, точнее для чего это нужно? #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
metagalaxy, я запустил и не пойму что не так?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.07.2013, 07:48     Как применить new, точнее для чего это нужно? #15
Цитата Сообщение от metagalaxy Посмотреть сообщение
Сообщение от Fooly
Только не пойму почему нельзя использовать cin.get(rio[i].name, 20); Все равно подчеркивает точку после cin =( даже если просто прописать cin.getline(); без операторов
Потому, что rio - указатель. Надо использовать операцию членства через указатель ->
т.е. cin.get(rio->name, 20);
Либо через операцию разыменования: cin.get((*rio).name, 20);
rio - указатель, но на массив, а элемент массива не указатель, а объект, поэтому такая запись верна: rio[i].name.
А cin.get() и cin.getline() не хотят работать потому, что не умеют читать в объект string, для них нужен указатель на массив char. Можно использовать глобальную getline():
C++
1
getline(cin, rio[i].name);
Добавлено через 5 минут
А чтобы getline() не выдавала ошибку в цикле (для извлечения '\n' после cin>>):
C++
1
2
cout << "Укажите год выпуска: ";
(cin >> rio[i].year).get();
metagalaxy
7 / 7 / 2
Регистрация: 18.02.2012
Сообщений: 61
06.07.2013, 15:05     Как применить new, точнее для чего это нужно? #16
Цитата Сообщение от alsav22 Посмотреть сообщение
rio - указатель, но на массив, а элемент массива не указатель
Я уже понял)
Цитата Сообщение от alsav22 Посмотреть сообщение
А cin.get() и cin.getline() не хотят работать потому, что не умеют читать в объект string, для них нужен указатель на массив char. Можно использовать глобальную getline()
для работы со строками cin можно использовать, как аргумент:
C++
1
getline(cin, str);
Где str - строка=)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2013, 23:27     Как применить new, точнее для чего это нужно?
Еще ссылки по теме:

Связанный список. Как это делается и зачем это нужно? C++
C++ Для чего это надо?
Нужно написать генерацию исключений для методов, как это делается? C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
06.07.2013, 23:27     Как применить new, точнее для чего это нужно? #17
Цитата Сообщение от metagalaxy Посмотреть сообщение
для работы со строками cin можно использовать, как аргумент:
Если это вопрос, то да. Для глобальной getline(), первый аргумент - поток чтения, а cin - поток чтения с консоли.
Yandex
Объявления
06.07.2013, 23:27     Как применить new, точнее для чего это нужно?
Ответ Создать тему
Опции темы

Текущее время: 02:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru