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

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

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

Восстановить пароль
Повторная активизация e-mail

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

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

контрольная рабочая можите скопировать и запустить... две функции работают не корректно функция вставки после введного адреса и функция удаления после введеного адреса, в функции вставки все вроде с первого взгляда работает норм, но при тестировании нашел косяк когда вводишь вставить элемент после первого адреса, он вставляет не после него а перед ним, в других случаях все норм, помогите плиз исправить я уже задолбался с ней...
Код:
# include <iostream>			  // класс для работы с вводом-выводом
# include <windows.h>			  // для функции 	CharToOem();
# 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();// прототип функции ввод с экрана
void search(sp *list); // прототип функций поиск по имени и вывод в файл
void fsearch(sp *list); //прототип функции поиск файла с наибольшим количеством обращений
 //
sp* pind(sp *list); //прототип получения адреса
sp* del(sp *list,sp *adr);// прототип функции удаления файла
sp * vst(sp *list,sp *adr);// прототип фунции вставка файла
void zmn(sp *list); // прототип функции замена файла

void main()
{
   int v;
   sp *k;
   do{
	  cout<<Rus("  1: формирование списка из текстового файла")<<endl;
	  cout<<Rus("  2: формирование списка с экрана")<<endl;
	  cout<<Rus("  3: поиск по заданному полю с сохранением результатов в файле")<<endl;
	  cout<<Rus("  4: выборка файла с наибольшим количеством обращений")<<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);//цикл будет повтрятся
}

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

Код:
//ввод списка из текстового файла
sp* ft_enter(){
	char name[10];// символьный тип которое будет именем файла и его типом не больше 10знаков
	cout<<Rus("введи имя входн тип.файла")<<endl;
	cin>>name;// ввод имени и типа
	sp* list = new sp;    //создаем указатель на голову списка
	sp *ptr;  //указатель на элемент списка
	bool on=true; //флажок, который определяет, читаем ли мы первый элемент списка или последующие
	ifstream inf(name);//считывание файла по имени name в inf
	while (!inf.eof()){ // цикл пока не будет достигнут конец файла
		if(on){     //если до этого список был пуст, то
			ptr=list;  //записываем в него первый элемент
			on=false;
		}else{  //если список не пуст, то записываем в него текущий элемент (настраиваем указатель на след. элемент)
			ptr->next=new sp; //выделяем память под следующий элемент списка
			ptr=ptr->next;//ptr теперь указывает на тот элемент который был выделен строкой выше
		}
		inf>> ptr->elfile.name;   //читаем конкретные данные в текущий элемент списка
		inf>> ptr->elfile.data;
		inf>> ptr->elfile.upd;
		inf.ignore();
	}
	ptr->next=NULL; //для последнего элемента списка указатель на следующий элемент не определен/пуст (установлен в NULL)
	inf.close();//закрытие файла
	return list;  //  возвращаем указатель на первый элемент списка
}


//ввод списка с экрана
sp *fs_enter()
{
		sp *list, *ptr;
		char name;

		cout << Rus("Введиде имя, дату создания, кольчество обращений к файлу") << endl;
		list = ptr = new sp;
		name = 'y';
        while (name == 'y'){
			cin >> ptr->elfile.name;
			cin >> ptr->elfile.data;
			cin >> ptr->elfile.upd;
			cin.get();
			ptr->next=NULL;

			cout << Rus("ещё (y/n)") << endl;
            cin >> name;
			cin.get();
			if (name == 'y') {
				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);
}



//поиск файла по имени и вывод его в текстовый файл
void search(sp *list){
	sp *prt = list;
	char f[15],r[15];
	cout<<Rus("введите текст")<<endl;
	cin>>f;
	cout<<Rus("введите выходной файл")<<endl;
	cin>>r;
	ofstream inf(r);
	while (prt!=NULL){
		if(strstr(prt->elfile.name,f)){ // сравнивает имя файла введенное с теми что в списке, если совпадает то выводит о нем всю информацию в другой файл
		  inf<<prt->elfile.name<<"  ";
		  inf<<prt->elfile.data<<"  ";
		  inf<<prt->elfile.upd<<endl;
		  prt=NULL;
		} else{
		prt=prt->next;}//переход на другую строку
	}
}

//Файл с наибольшим кольчеством обращений
void fsearch(sp *list){
	 sp *prt = list;
	 int p=-1;
	 sp *r;
	 while (prt != NULL){
		if(prt->elfile.upd > p){//если первое обращение больше другого
			p = prt->elfile.upd; // присвоить его значение в р
			r = prt; //запомнить максимум

		prt=prt->next;
		}
		else
	 {
	 cout<<Rus("Файл с наиольшим кольчеством обращений")<<endl;
	 cout<<r->elfile.name<<" ";
	 cout<<r->elfile.data<<" ";
	 cout<<r->elfile.upd<<endl;
	 }} prt=NULL;
}

//получить адрес
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){// если номер совпал то...
		q=adr->next;
		pt=q;
		q=adr->next;//

	}else{
		q = adr;
		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){
		pt=q;
		pt->next=adr;
	}else{
		q->next= adr->next;
		adr->next=q;
	}
	return pt;
}

//заменить поле
void zmn(sp *list){
	sp *prt = list;
	int i=1,j=0;
	cout<<Rus("Введите номер")<<endl;
	cin>>j; // номер поля которое заминить
	while (prt != NULL){
		if(i==j){// если номер есть тоесть равен то..
		cout << Rus (" Введите имя нового файла");
	cin>>prt->elfile.name;
	cout << Rus (" Введите дату создания файла");
	cin>>prt->elfile.data;
	cout << Rus (" Введите количество обращений к файлу");
	cin>>prt->elfile.upd;
			break;
		}
		prt=prt->next;

		i++;
	}
}

//------------------------

Последний раз редактировалось Stilet; 06.11.2011 в 11:26.
lexflax вне форума Ответить с цитированием
Старый 06.11.2011, 12:15   #3
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Код:
//вставка нового элемента после элемента с адресом 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){
		pt=q;
		pt->next=adr;
	}else{
		q->next= adr->next;
		adr->next=q;
	}
	return pt;
}
Вас не затруднит привести комментарии ко всем строкам отцитированного кода - что именно, по Вашему мнению, в них происходит?
Abstraction вне форума Ответить с цитированием
Старый 06.11.2011, 16:09   #4
lexflax
Пользователь
 
Регистрация: 12.04.2011
Сообщений: 74
По умолчанию

со вставкой разобрался работает как надо))) с удалением не понимаю посмотрите плиз
//удаление элемента с адресом adr
sp* del(sp *list,sp *adr){
sp *pt=list, *q;
if(adr==list){// если номер совпал то...
q=list// указывает на тот список который совпал с адресом
pt=q;// указывает опять же на него только уже pt
//

}else{

}
delete(q); //удаляет строку указанного номера
return pt;
} не работает вообще
lexflax вне форума Ответить с цитированием
Старый 06.11.2011, 16:21   #5
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Код:
//удаление элемента с адресом adr
sp* del(sp *list,sp *adr){
    sp *pt=list, *q;
    if(adr==list){// если номер совпал то...
        q=list// указывает на тот список который совпал с адресом
        pt=q;// указывает опять же на него только уже pt
        //
    }else{

    }
    delete(q); //удаляет строку указанного номера
    return pt;
}
Описание работы: на вход функции передаются два указателя - list и adr. Если так случилось, что они совпали, то для этого указателя вызывается delete (т.е. память, на которую он указывает, становится недействительной), а его (уже "ведущее в никуда") значение возвращается вызвавшему коду.
Инструкция pt=q на этой ветке очевидно избыточна, так как в pt уже хранится значение list.
Если (что, по всей видимости, достаточно частый случай) значения list и adr не совпадают, вызывается delete для произвольного указателя (что может иметь самые разные последствия, вплоть до падения программы), после чего возвращается значение list.

Теперь вопрос: а что Вы хотели сделать в этой функции?
Abstraction вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задачи по паскалю, очень нужна помощ! (6) Bushel Помощь студентам 4 17.11.2010 17:02
ОЧЕНЬ НУЖНА ПОМОЩ!!! BOOFER Помощь студентам 0 18.06.2010 23:49
Очень нужна ваша помощ.. Функции Hustler Помощь студентам 1 30.05.2010 17:43
Очень нужна помощь c матрицами, макросами в Excel. Заранее благодарен(поверьте, очень-очень нужна помощь) Farridjan Помощь студентам 1 03.07.2009 12:24