Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > динамический массив структур


Автор: loopz 3.9.2012, 13:18
посмотрел существующее вроде такое не встретил 
вопрос---цель создание структуры определенного типа(марка машины и год производства) это просто но есть еще цель спрашивать у пользователя количество машин то есть сделать так что в программе число структур (массив) зависел от введенного числа то есть мысль такая
Код

#include "stdafx.h"
#include<iostream>
using namespace std;
struct car{
    char name[40];
    int year;
};
int main(){
    int a;
    cout<<"How many cars you want to add ?" <<endl;
    cin>>a;
    car *type[a]= new car[a];
...........

но идет ошибка---что число массивов при объявлении должно быть константой ...по идее логично что программа хочет знать кол выделяемой памяти так вот как можно обойти эту проблему или что я делаю не так???

Автор: azesmcar 3.9.2012, 13:46
замени
Код

car *type[a]= new car[a];

на
Код

car *type= new car[a];

Автор: loopz 3.9.2012, 15:08
Цитата(azesmcar @ 3.9.2012,  13:46)
замени
Код

car *type[a]= new car[a];

на
Код

car *type= new car[a];

пробовал...но возникла проблемы адрессации .....
Код

#include "stdafx.h"
#include<iostream>
using namespace std;
struct car{
    char name[40];
    int year;
};
int main(){
    int a;
    cout<<"How many cars you want to add ?" <<endl;
    cin>>a;
    cin.get();
    car *type= new car[a];
    int i;
    for(i=1;i<=a;i++){
        cout<<"Please enter the mark"<<endl;
        cin.getline((*type).name,39);
        //cin.get();
        cout<<"Please enter the year of made " <<endl;
        cin>>(*type).year;
        cin.get();
    }
            cout <<"here your choise "<< (*type).year <<" "<<(*type).name<<endl;
    delete []type;

    return 0;
}


выводит только последнее ....что весьма логично) пока моя мысля тормозит...может быть применить смещение по адресу &(*type).name + ----на размер используемого типа влево\вправо

Автор: bsa 3.9.2012, 17:28
Код
    for(i = 0; i < a; ++i){
        cout<<"Please enter the mark"<<endl;
        cin.getline(type[i].name,39);
        //cin.get();
        cout<<"Please enter the year of made " <<endl;
        cin>>type[i].year;
        cin.get();
    }
    do {
       cout << "Please input car #: " << flush;
       cin >> i;
    } while((i < 1) || (i > a));
    --i;
    cout << "You select " << type[i].year << " " << type[i].name << endl;

Автор: loopz 4.9.2012, 07:34
спасибо за помощь ) это немного не то что я хотел но очень интересно в плане чего то нового) а мой код окончательный такой 
Код

int main(){
    int a;
    cout<<"How many cars you want to add ?" <<endl;
    cin>>a;
    cin.get();
    car *type= new car[a];
    int i;
    for(i = 0; i < a; ++i){
        cout<<"Please enter the mark"<<endl;
        cin.getline(type[i].name,39);
        cout<<"Please enter the year of made " <<endl;
        cin>>type[i].year;
        cin.get();
    }
    int b;
    cout<<"here your choise  "<<endl;
    for(b=0;b<a;b++){
    cout<<type[b].year << "  "<< type[b].name <<endl;
}

просто была цель выводить все введенные данные сразу вот) спасибо

Автор: borisbn 4.9.2012, 08:52
loopz, не хватает только удаления выделенного массива в конце
Код
delete [] type;

и ещё... так... повыделываться... как ты считаешь, по именам переменных, которые ты выбрал, можно понять за что они отвечают ?

Автор: loopz 4.9.2012, 10:35
ну да но это просто урок из книги стивена прата ) а так там еще и комментов не хватает ))) воот а так да делет у меня есть конечно ) я просто до этого тему про new читал ...воот 

Автор: borisbn 4.9.2012, 10:37
Цитата(loopz @  4.9.2012,  10:35 Найти цитируемый пост)
я просто до этого тему про new читал

насколько я понимаю, там должно было быть про соответствующий delete  smile 

Автор: bsa 4.9.2012, 10:39
loopz, комментарии пишут там, где алгоритм достаточно сложен. Если алгоритм прост, то достаточно просто самодокументируемого кода. А чтобы он был таким необходимо и достаточно давать разумные имена константам, переменным и функциям.

Автор: loopz 4.9.2012, 11:53
спасибо учту)

Автор: borisbn 4.9.2012, 12:07
loopz, сравни свой код и этот
Код
#include<iostream>

using namespace std; // кстати, не советую. лучше так:
//using std::cout;
//using std::cin;
//using std::endl;

struct Car {
    char name[40];
    int year;
};

int main()
{
    int carsCount;
    cout << "How many cars you want to add ?" << endl;
    cin >> carsCount;
    cin.get();
    Car * cars = new Car[ carsCount ];
    for ( int i = 0; i < carsCount; ++i ) {
        cout << "Please enter the mark" << endl;
        cin.getline( cars[ i ].name, 39 );
        cout << "Please enter the year of made " << endl;
        cin >> cars[ i ].year;
        cin.get();
    }
    cout << "here your choise  " << endl; // придираться, так с музыкой - а почему "here" с маленькой буквы ? :-)
    for ( int i = 0; i < carsCount; ++i ) {
        cout << cars[ i ].year << "  " << cars[ i ].name << endl;
    }
    delete [] cars;
}


Добавлено через 7 минут и 1 секунду
ну и напоследок...
"How many cars you want to add" - неправильно. нужно "How many cars do you want to add"
"Please enter the mark" - наверное, правильнее будет "model" или "brand"... хотя, могу ошибаться
"here your choise" - неправильно. нужно "here is your choise"

Автор: loopz 4.9.2012, 14:00
Кстати о птичках спс за советы ) все по делу а вот у меня тогда еще вопрос ---
Код

#include<iostream>
using namespace std; // кстати, не советую. лучше так:
//using std::cout;
//using std::cin;
//using std::endl;

чем так лучше?? какие есть риски в объявлении всего пространства имен ??? 

Автор: bsa 4.9.2012, 19:58
loopz, риски в том, что у тебя в глобальное пространство имен попадает куча всего, что тебе не нужно. Таким образом, снижается количество "свободные" названий для функций и переменных. Более того, даже этот способ не рекомендуется. Нужно или всегда указывать пространство имен, или открывать нужные символы в очень узких областях видимости (внутри блока {}), или давать псевдонимы для пространств имен (например: namespace popt = boost::program_options и в дальнейшем использовать popt вместо boost::program_options).

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)