Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2011, 17:39   #1
lexflax
Пользователь
 
Регистрация: 12.04.2011
Сообщений: 74
Восклицание исправление ошибки в функции

Люди помогите плиз!! Контрольная работа сделанная но две функции работают косячно, это функция вставки нового элемента после введного номера строки, и функция удаления элемента с введеным номером строки, тоесть при вставлении я ввожу номер строки 1 , тоесть в строке под номером два у меня должно появится новое поле, а в случае удаления я ввожу удалить первую строку значит он и должен удалить первую строку, в функции удаления строки косяк в том что первую строку он удаляет все норм, а если строк всего две и ввести удалить строку номер 2 , то он ни как не риагирует ну тоесть не удаляет ее, косяк в функции вставления в том что он новый элемент вводит не после номера, а перед ним...
ВОТ ЛИСТИНГ ВСЕЙ КОНТРОЛЬНОЙ не видел тут на форруме кнопку для отображения кода с++ так что код наверно будет не очень хорошо отображаться, хотя думаю модератор поправит его...
Код:
# include <iostream>	
# include <windows.h>	
# include <fstream>			  

using namespace std;
	char bufRus[256];
	char* Rus(const char* text)
	{
		CharToOem(text, bufRus);
	return bufRus;
	}

struct lfile{
	char name[15];
	char data[10];
	int upd;
};
struct sp{
	lfile elfile;	// поле данных
	sp *next;	// указатель
};

sp*print_list(sp *list);//


sp* ft_enter();//

sp* fs_enter();// прототип функции ввод с экрана

sp* pind(sp *list); //прототип получения адреса
sp* del(sp *list,sp *adr);// прототип функции удаления файла
sp * vst(sp *list,sp *adr);// прототип фунции вставка файла

void main()
{
   int v;
   sp *k;
   do{
	  cout<<Rus("  1: формирование списка из текстового файла")<<endl;
	  cout<<Rus("  2: формирование списка с экрана")<<endl;
	  cout<<Rus("  3: поиск по заданному полю с сохранением результатов в файле")<<endl;
	
	  cout<<Rus("  5: замена записи")<<endl;
	  cout<<Rus("  6: удаление записи после указанного адреса")<<endl;
	  cout<<Rus("  7: вставка записи после указанного адреса")<<endl;
	  cout<<Rus("  8: вывод списка")<<endl;
	  cout<<Rus("  9: выход")<<endl;
	  cout<<Rus("вариант ")<<endl;
	  cin>>v;
	  switch(v){
		case 1: k = ft_enter(); break;/*вызов функции ввод тектового файла в переменную к, чтоб по ней потом можно было делать сортировку, поиск и тд*/
		case 2: k = fs_enter(); break;// вызов функции ввод с экрана
		case 3: search(k);break;//вызов функции поиск по переменной к и сохранение в файл одной строки
		case 4: fsearch(k); break;//вызов функции поиск файла с наибольшим количеством обращений к нему
		case 5: zmn(k); print_list(k); break;//вызов функции замена строки по указаному номеру
		case 6: k = del(k,pind(k)); print_list(k); break;// вызов функции удаление строки после указанного номера
		case 7: k = vst(k,pind(k)); print_list(k); break;//вызов функции вставка строки после указанного номера
		case 8: print_list(k);break;//вызов функции вывод списка на экран
		case 9:return; break;

		}
	} while(true);//цикл будет повтрятся
}

//ввод списка с экрана
sp* fs_enter(){
	sp* list =new sp; //выделяем память под список
	sp *ptr; //указатель на элемент списка
	char name; // символьный тип которое будет именем файла и его типом
	cout<< Rus("Введиде имя, дату создания, кольчество обращений к файлу")<<endl;
	ptr=list; //теперь ptr указывает на список
	name='y';
	while (name=='y'){
		cin>>ptr->elfile.name;
		cin>>ptr->elfile.data;
		cin>>ptr->elfile.upd;
		cout<<Rus("ещё (y/n)")<<endl;
		cin>>name;
		cin.get();
		ptr->next=new sp; //выделяем память под строку
		ptr=ptr->next;//указываем на эту строку
	}
	return list; //возвращаем указатель на первый элемент списка
}

//Функция вывода списка на экран, как параметр берёт указатель на список.
sp* print_list(sp *list){
	sp *prt = list;
	int i=0;
	do {
		cout<<++i<<"  ";// первый файл
		cout<<prt->elfile.name<<"      ";
		cout<<prt->elfile.data<<"      ";
		cout<<prt->elfile.upd<<endl;
		prt=prt->next;//следующий

	} while (prt!=0);
}

//получить адрес
sp* pind(sp *list){
	sp *prt = list;
	int i=1,j=0;
	cout<<Rus("Введите номер")<<endl;
	cin>>j; //номер строки
	while (prt != NULL){
		if(i==j){
			return prt; //строка под этим номером
			break;
		}
		prt=prt->next;
		i++;
	} }

//удаление элемента с адресом adr
sp* del(sp *list,sp *adr){
	sp *pt=list, *q;
	if(adr==list){// если номер совпал то...
		pt=adr->next;//  перейти на другую строку
		q=adr;// запомнить ее
	}else{
		q = adr->next;
		adr=adr->next;
	 }
	delete(q); //удаляет строку после указанного номера
	return pt;
}

//вставка нового элемента после элемента с адресом adr
sp * vst(sp *list,sp *adr){
	lfile rab;
	sp *pt=list,*q=new sp;
	cout<<"name=";
	cin>>rab.name;
	cout<<"data=";
	cin>>rab.data;
	cout<<"up=";
	cin>>rab.upd;
	q->elfile=rab;// в список на который ссылался q присваиваем строки rab
	if(adr==list->next){
		pt=q;
		q->next=adr;
	}else{
		q->next= adr->next;
		adr->next=q;
	}
	return pt;
}

} // можите запустить и сами увидите как работает, пару функций удалил оставил только ввод удаление вставку и вывод

Последний раз редактировалось Stilet; 05.11.2011 в 11:40.
lexflax вне форума Ответить с цитированием
Старый 05.11.2011, 03:39   #2
lexflax
Пользователь
 
Регистрация: 12.04.2011
Сообщений: 74
По умолчанию

Люди ну кто нибудь должен ведь понимать подскажите плиз очень надо
lexflax вне форума Ответить с цитированием
Старый 05.11.2011, 08:48   #3
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

нормально сформулируй вопрос и используй теги для выделения кода. Я понял что 2 функции работают неправильно, приведи исходный код этих функций(тут помимо этого куча всего лишнего, мне лень искать). Описание структур тоже оставь.

Отформатируй код нормально(чтобы отступы были).

посмотрел функцию удаления - полный бред:
Код:
sp* del(sp *list,sp *adr){
	sp *pt=list, *q;
	if(adr==list){		// если номер совпал то...
		pt=adr->next;	// перейти на другую строку
		q=adr;		// запомнить ее
	}else{
		q = adr->next;
		adr=adr->next;
	}
	delete(q); 		//удаляет строку после указанного номера
	return pt;
}
функция судя по описанию должна удалять элемент с заданным адресом. Значит адрес задан и не должен меняться. Опиши его как const и получишь ошибку на этой строке:
Код:
adr=adr->next;
Но это далеко не единственная ошибка в этой функции.
Чтобы удалить элемент в списке, нужно сначала его найти. Чтобы найти элемент нужно обойти список. Чтобы обойти список нужен цикл или рекурсивный вызов, где это?

При удалении элемента нужно изменить ссылки, которые указывали на удаляемый элемент - после удаления элемента они будут указывать не понятно на что. У вас нет даже намека на это.

Еще раз подумай о том, что хочешь сделать и посмотри на то что сделал.
Найди в интернетах готовую функцию удаления и сравни со своей.

Последний раз редактировалось Stilet; 05.11.2011 в 11:42.
rrrFer вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исправление ошибки 215 в коде Stefansson Помощь студентам 3 20.01.2011 23:13
Исправление ошибки Adriana Microsoft Office Access 1 17.10.2010 19:45
Исправление ошибки bee_uk Общие вопросы C/C++ 1 02.06.2009 13:43
Исправление ошибки в MS VS 2005 NatCa Помощь студентам 6 03.12.2008 18:23
Ошибки функции FtpPutFile ZYRGiX Win Api 5 29.08.2007 20:08