Игнорировать пробел

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

б_д_в
Сообщения: 20
Зарегистрирован: 17 сен 2009, 12:11

Сбрасываю абсолютно весь код:

Код: Выделить всё


#include<string.h> 
#include<iostream.h>

#include <conio.h>
#include <stdlib.h>


struct card 
{
	char *author; 
	char *title;  
	char *city;   
	char *firm;   
	int year;     
	int pages;    
};

//Ф-ция печати сведений о книге
void printbook(card &car)
{
	static int count = 0;
	cout << "\n" << ++count << ". " << car.author;
	cout << ' ' << car.title << ".- " << car.city;
	cout << ": " << car.firm << ", ";
	cout << "\n" << car.year << ".- " << car.pages << " c.";
}

struct record 
{
	card book;
	record *prior;
	record *next;
};

//Исходные данные о книгах
card books[] = 
{
	{ "Winer R.S.", "Jasik Turbo C++", "M", "Mir", 1991, 384 },
	{ "Stroustrup B.", "Jasik C++", "Kiev", "DiaSoft", 1993, 560 },
	{ "Turbo C++", "Rukovodstvo programmista", "M", "INTKV", 1991, 394 },
	{ "Lippman S.B.", "C++ dlj nachinauchih", "M", "GELION", 1993, 496 }
};


void main()
{
	card add;

	int m = 0, j = 0, ch;

	record *begin = NULL, //указатель на начало списка
		   *last = NULL,  //указатель на очередную запись
		   *list;         //указатель на элементы списка

	do
	{
		_cputs( "Prodolzhit ili vyiti (D-prodolzhit; V-vyiti)? " ); 

		ch = _getch(); 

		_cputs( "\r\n" );

		if( toupper( ch ) == 'V' ) 
			exit( 1 ); 

	}while(toupper( ch ) != 'D');


	cout << "Skolko dobavit sapisey: "; 
	cin >> j; //какую цифру введем, столько и будет добавлено записей

	//n - кол-во записей в списке
	int n = sizeof(books)/sizeof(books[0]);
	m = n;

	for(int i = 0; i < m+j; ++i)
	{
        //Создать новую запись (элемента списка)
		last = new(record);

		if( m <= i )
		{
			add.author = new char[50];
			cin.getline(add.author, 50); 
			books[n].author = add.author;

			add.title = new char[30];
			cin.getline(add.title, 30); 
			books[n].title = add.title;

			add.city = new char[20];
			cin.getline(add.city, 20); 
			books[n].city = add.city;

			add.firm = new char[20];
			cin.getline(add.firm, 20); 
			books[n].firm = add.firm;

			cin >> add.year;
			books[n].year = add.year;

			cin >> add.pages;
			books[n].pages = add.pages;

			n++;
		}

        //Занести сведения о книге в новую запись
		(*last).book.author = books[i].author;
		(*last).book.title = books[i].title;
		last->book.city = books[i].city;
		last->book.firm = books[i].firm;
		last->book.year = books[i].year;
		last->book.pages = books[i].pages;

		if(begin == NULL) 
		{
			last->prior = NULL;
			begin = last; 
			last->next = NULL;
		}
		else 
		{ 
			list = begin;

			while(list)
			{
				if(list->next == NULL)
				{
					last->next = NULL;
					last->prior = list;
					list->next = last;

					break;
				}

				list = list->next;

			} 

		} 
	}

	list = begin;
	cout << '\n';
	while(list)
	{
		printbook(list->book);
		list = list->next;
	}


	if( j != 0 )
	{
		delete [] add.author;
		delete [] add.title;
		delete [] add.city;
		delete [] add.firm;
	}


	cout << endl << endl;
}
Albor
Сообщения: 491
Зарегистрирован: 06 сен 2004, 13:34
Откуда: Днепропетровск

б_д_в писал(а):Сбрасываю абсолютно весь код:
Твой цикл

Код: Выделить всё

for(int i = 0; i < m+j; ++i)
    {
        //Создать новую запись (элемента списка)
        last = new(record);
        if( m <= i )
        {
            add.author = new char[50];
            cin.getline(add.author, 50);
            books[n].author = add.author;
//.........
записывает данные за пределы books, имеющего всего 4 элемента (от 0 до 3, если по индексу), а переменная n в первой итерации содержит 4. Что можно ожидать от этой программы кроме разрушения своих же данных.
Разберись с логикой работы своей программы. Куда ты записываешь добавляемые записи? Сначала за пределы статического массива(:confused :) , потом в список. А за указателями на строки следишь? Накопировал их в несколько объектов, а потом delete []add...(а на момент удаления содержится в add лишь последняя добавляемая запись, а остальное, что навыделял как будет удаляться?) .
Сделай в своём коде следующее: Ctrl+A, Delete, после этого напиши всё заново, только немного думая о том что делаешь.
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Я ему на эти проблемы уже указывал соседней другой теме. Смотрю, а воз и ныне там :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Ответить