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


Автор: Samuele 23.11.2010, 12:14
В общем суть программы я думаю поймете из кода, если что-то будет не понятно конечно уточню.
Беда в том что перечитал уже много тем и пару книжек по данной теме и вроде бы правильно все сделал, но как обычно это бывает на начальном уровне работает не верно. А точнее говорю вместе вводимых в струтуру данных выводится какая-то ерунда  smile 
Код

#include <iostream.h>
#include <conio.h>

typedef struct cars
{
    char name[30];
    int year;
} ;


int main()
{    int i, n;

    cout<<"How many cars do you wish to catalog?";
    cin>>n;

    cars *p_car = new cars [n];
    car pp_car=p_car;
    for (i = 0; i < n; i++)
    {   cout<<"Car #"<<i+1<<':'<<endl;
        cout<<"Please enter the make: ";
        cin>>p_car->name;
        cout<<"Please enter the year made: ";
        cin>>p_car->year;
        p_car++;
    }

    p_car=pp_car;
    cout<<"Here is your collection:"<<endl;;
    for (i = 0; i < n; i++)
        {
        cout<<p_car->year<<' '<<p_car->name;
        p_car++;
        }

    getch();
    return 0;
}



заранее благодарю.

Автор: A5uKa 23.11.2010, 12:18
struct cars Больше похожа на struct car , то есть немного не понимаю как вы тут хотите работать с массивом таких структур.

хотя может конеяно это я чего-то не понимаю.

Добавлено через 1 минуту и 20 секунд
по крайней мере я в таких случаях использую векторы typedef std::vector<car*> cars;

Автор: Samuele 23.11.2010, 12:25
а какая разница назвать структуру cars или car?? думаю это не столь принципиально..суть в том что мне через указатель надо заполнять массив типа car с его полями..надеюсь правильно и понятно все объяснил...

Автор: A5uKa 23.11.2010, 12:36
Цитата(Samuele @ 23.11.2010,  12:25)
а какая разница назвать структуру cars или car?? думаю это не столь принципиально..суть в том что мне через указатель надо заполнять массив типа car с его полями..надеюсь правильно и понятно все объяснил...

Разницы никакой ... Но твоя структура описывает одну машину. Это путает немного.

а где у тебя массив типа кар ?
cars *p_car = new cars [n]; - это я вообще, честно говоря, не знаю что такое.

даже если сделать cars ** поучится своеобразный бред (хотя у меня были попытки), но всё же мне кажется векторы тут приминимы как минимум  smile

Добавлено через 2 минуты и 44 секунды
 smile 
Это ведь тупилдер ?  smile 

Автор: Samuele 23.11.2010, 12:39
векторы мне не известны...и к ним пока не хочу прикасаться...

cars *p_car= new cars [n]; //выделение динамической памяти под массив потому что я не знаю сколько машин будет описано в итоге.


 smile  может и тупилдер smile 

Автор: Crafty 23.11.2010, 12:54
Что это за строчка такая 
Код

 car pp_car=p_car;
?

Должно быть так 
Код

 cars* pp_car=p_car;


Добавлено @ 12:56
ну и 
Код

delete [] pp_car;
 добавьте.

А чтобы не было мусора используйте string, или если используете строки в стиле Си, то считывайте их через cin.get(p_car->year, 30);

Автор: Samuele 23.11.2010, 13:07
Crafty, это для того что бы помнить начала динамического массива.

вот в общем текст самой задачи...

6. Разработайте структуру под названием саr, в которой хранится
следующая информация об автомобиле: его марка в виде строки в
символьном массиве, а также год его выпуска в виде целого числа.
Напишите программу, которая запрашивает пользователя,
сколько автомашин следует ввести в каталог. Затем программа
должна использовать метод new для создания нового
динамического массива в соответствии с указанным количеством
структур саr. Далее она должна выдать приглашение на ввод со
стороны пользователя марки (которая может состоять из
нескольких слов) и года выпуска автомашины для каждой
структуры. Следует заметить, что этот процесс требует
некоторого внимания, поскольку при этом поочередно
осуществляется чтение строковых и числовых данных. И наконец,
программа должна отображать содержимое каждой структуры.
Результат выполнения такой программы должен выглядеть
следующим образом:
How many cars do you wish to catalog? 2
Car #1:
Please enter the make: Hudson Hornet
Please enter the year made: 1952
Car #2:
Please enter the make: Kaiser
Please enter the year made: 1951
Here is your collection:
1952 Hudson Hornetu
1951 Kaiser

Автор: Crafty 23.11.2010, 13:10
Цитата(Samuele @  23.11.2010,  13:07 Найти цитируемый пост)
это для того что бы помнить начала динамического массива.
 это понятно, но почему ты хранишь его не в указателе?

Автор: Samuele 23.11.2010, 13:18
хорошо, исправил на
Код

cars* pp_car=p_car;


но это явно не конец моих мучений с этой прогой...я чувствую что где то допустил тупую ошибку но понять где опыта не хватает...((

Автор: Crafty 23.11.2010, 13:37
Код

#include <iostream>

using namespace std;

typedef struct cars
{
    char name[30];
    int year;
} ;
int main()
{    int i, n;
    cout<<"How many cars do you wish to catalog?";
    cin>>n;
    cars *p_car = new cars [n];
    cars *pp_car=p_car;
    for (i = 0; i < n; i++)
    {   
        cout<<"Car #"<<i+1<<':'<<endl;
        cout<<"Please enter the make: ";
        cin.ignore(256,' ');
        cin.getline(p_car->name,30);
        cout<<"Please enter the year made: ";
        cin>>p_car->year; 
        p_car++;
    }
    p_car=pp_car;
    cout<<"Here is your collection:"<<endl;;
    for (i = 0; i < n; i++)
    {
        cout<<p_car->year<<' '<<p_car->name<<endl;
        p_car++;
    }
    return 0;
}


Добавлено @ 13:38
Тут можно про ф-ции почитать
http://www.cplusplus.com/reference/iostream/istream/ignore/
http://www.cplusplus.com/reference/iostream/istream/getline/

Автор: Samuele 23.11.2010, 13:48
может вопрос покажется странным...но вы пробовали у себя данный код? просто я его тупо скопипастил а толку ноль...

Автор: Crafty 23.11.2010, 13:58
Samuele, да у меня работает всё, у вас просто компилятор старый.

Добавлено через 1 минуту и 8 секунд
как-то так в старом
Код

#include <iostream.h>

typedef struct cars
{
    char name[30];
    int year;
} ;
int main()
{    int i, n;
    cout<<"How many cars do you wish to catalog?";
    cin>>n;
    cars *p_car = new cars [n];
    cars *pp_car=p_car;
    for (i = 0; i < n; i++)
    {   
        cout<<"Car #"<<i+1<<':'<<endl;
        cout<<"Please enter the make: ";
        cin.ignore(256,' ');
        cin.getline(p_car->name,30);
        cout<<"Please enter the year made: ";
        cin>>p_car->year; 
        p_car++;
    }
    p_car=pp_car;
    cout<<"Here is your collection:"<<endl;;
    for (i = 0; i < n; i++)
    {
        cout<<p_car->year<<' '<<p_car->name<<endl;
        p_car++;
    }
    return 0;
}

Автор: Samuele 23.11.2010, 14:06
не думаю что CodeGear 2007 можно назвать старым компилятором))
спасибо за помощь.

Автор: Crafty 23.11.2010, 14:21
Цитата(Samuele @  23.11.2010,  14:06 Найти цитируемый пост)
не думаю что CodeGear 2007 можно назвать старым компилятором))

Можно если он не переваривает код последнего стандарта (2003 года).

Автор: Samuele 23.11.2010, 14:29
код он переваривает, ошибок не выдает. но вот результат не верный выдает. и кто бы знал в чем причина...

Автор: Crafty 23.11.2010, 14:59
Вот так попробуйте
Код

#include <iostream>
using namespace std;
typedef struct cars
{
    char name[30];
    int year;
} ;
int main()
{    int i, n;
    cout<<"How many cars do you wish to catalog?";
    cin>>n;
    cin.ignore(1,'\n');
    cars *p_car = new cars [n];
    cars *pp_car=p_car;
    for (i = 0; i < n; i++)
    {   
        cout<<"Car #"<<i+1<<':'<<endl;
        cout<<"Please enter the make: ";
        cin.get(p_car->name,30);
        cout<<"Please enter the year made: ";
        cin>>p_car->year; 
        cin.ignore(1,'\n');
        p_car++;
    }
    p_car=pp_car;
    cout<<"Here is your collection:"<<endl;;
    for (i = 0; i < n; i++)
    {
        cout<<p_car->year<<' '<<p_car->name<<endl;
        p_car++;
    }
    return 0;
}

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