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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2013, 23:46   #31
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

попробовал просто COUNT, не помогло, а кстати до меня дошло, все правильно я сказал, нумерация с нуля, 3 записи значит от 0 до 2 то есть до COUNT-1
NewLamer&Programer вне форума Ответить с цитированием
Старый 17.06.2013, 23:54   #32
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

1) В Text записано 456
2) Если запись такая < COUNT - 1, то последняя рассмотренная запись будет COUNT - 2 (последняя запись в массиве имеет номер COUNT - 1)
Соглашусь, что нумерация с 0, но цикл все же нужно исправить
3) Приведите текущий код функции поиска
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 18.06.2013, 00:01   #33
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

Код:
int Search(TPhoneBook *PB, int COUNT, char Text[100], int MainField, int SubField)
{
	for (int i = 0; i < COUNT; i++)
	switch(MainField)
	{
		case 1: if (strcmp(PB[i].Family,Text) == 0) return i;
		case 2: if (strcmp(PB[i].Name,Text) == 0) return i;
		case 3: if (strcmp(PB[i].Patronymic,Text) == 0) return i;
		case 4: switch(SubField)
				{
					case 1: if (strcmp(PB[i].Phone.Home,Text) == 0) return i;
					case 2: if (strcmp(PB[i].Phone.Work,Text) == 0) return i;
					case 3: if (strcmp(PB[i].Phone.Mobile,Text) == 0) return i;
				}
		case 5: switch(SubField)
				{
					case 1: if (strcmp(PB[i].Address.Country,Text) == 0) return i;
					case 2: if (strcmp(PB[i].Address.City,Text) == 0) return i;
					case 3: if (strcmp(PB[i].Address.Street,Text) == 0) return i;
					case 4: if (strcmp(PB[i].Address.N_Home,Text) == 0) return i;
					case 5: if (strcmp(PB[i].Address.N_Apartment,Text) == 0) return i;
				}
		case 6: if (strcmp(PB[i].Email,Text) == 0) return i;
	}
	return -1;
}
NewLamer&Programer вне форума Ответить с цитированием
Старый 18.06.2013, 00:11   #34
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

и все таки мне кажется вы не правы, да последняя запись имеет номер COUNT-1, но я же ее и беру !

Последний раз редактировалось NewLamer&Programer; 18.06.2013 в 00:13.
NewLamer&Programer вне форума Ответить с цитированием
Старый 18.06.2013, 00:51   #35
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Если записать for (int i = 0; i < COUNT; i++), то запись COUNT - 1 будет обработана.
Я нашел ошибку - MainField и SubField имеют значения, отличные от тех, что заданы в case.
Код:
int Search(TPhoneBook *PB, int COUNT, char Text[100], int MainField, int SubField)
{
	unsigned int offset;
	switch(MainField - '0')
	{
		case 1: offset = (unsigned int)&PB[0].Family;
			break;
		case 2: offset = (unsigned int)&PB[0].Name;
			break;
		case 3: offset = (unsigned int)&PB[0].Patronymic;
			break;
		case 4: switch(SubField - '0')
				{
					case 1: offset = (unsigned int)&PB[0].Phone.Home;
						break;
					case 2: offset = (unsigned int)&PB[0].Phone.Work;
						break;
					case 3: offset = (unsigned int)&PB[0].Phone.Mobile;
				}
			break;
		case 5: switch(SubField - '0')
				{
					case 1: offset = (unsigned int)&PB[0].Address.Country;
						break;
					case 2: offset = (unsigned int)&PB[0].Address.City;
						break;
					case 3: offset = (unsigned int)&PB[0].Address.Street;
						break;
					case 4: offset = (unsigned int)&PB[0].Address.N_Home;
						break;
					case 5: offset = (unsigned int)&PB[0].Address.N_Apartment;
				}
			break;
		case 6: offset = (unsigned int)&PB[0].Email;
	}
	offset -= (unsigned int)PB;
	for (int i = 0; i < COUNT; i++)
		if (!strcmp((char *)(&PB[i]) + offset, Text)) return i;
	return -1;
}
Этот грязный хак вычисляет сдвиг относительно начала структуры, чтобы в дальнейшем быстро высчитывать начало строки для сравнения. Кстати, в меню выбора параметра и самой функции поиска не совпадает нумерация (в меню 1 пункт - поиск по номеру, а в функции - по фамилии).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 18.06.2013 в 01:10.
BDA вне форума Ответить с цитированием
Старый 18.06.2013, 08:13   #36
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

:facepalm: убейте меня если я понял хоть что то >_< можно подробные комментарии построчно?

п.с. но как ни странно работает спасибо
NewLamer&Programer вне форума Ответить с цитированием
Старый 18.06.2013, 12:16   #37
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Ну построчные не напишу - напишу идею.
С помощью MainField и SubField определяется поле структуры, по которому будет проводиться сравнение. У всех полей фиксированный сдвиг от начала структуры. Чтобы его найти, берем адрес требуемого поля и вычитаем адрес начала структуры. Благодаря этому, достаточно добавить этот сдвиг к адресу начала структуры, чтобы попасть на начало требуемой строки-поля.

Если захотите сделать еще более "кошерно", то друг посоветовал (я про это забыл) сделать массив сдвигов, в котором по индексам MainField и SubField будут храниться предрасчитанные сдвиги (при запуске программы будет один раз производиться расчет).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 18.06.2013 в 13:04.
BDA вне форума Ответить с цитированием
Старый 18.06.2013, 14:52   #38
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

нефига не понял что за сдвиг

ладно пофиг, пытался тут вот еще усовершенствовать пункт меню поиска, чтобы еще искал по номеру (ну а точнее просто выводил по номеру), все время выбивает ошибку записи на scanf, почему не понимаю, вроде int Index и %d...

Код:
		case '5': //Поиск по БД
			{
				printf("Поиск по полю:\n\n");
				Index = FieldMenu(); Sub = 0;
				if (Index == '1')
				{
					printf("Введите слово для поиска: ");
					scanf("%d",Index);
					system("cls");
					Show(PB[Index],Index);
					goto Start;
				}
				if (Index == '5') Sub = PhoneMenu();
				if (Index == '6') Sub = AddressMenu();
				printf("Введите слово для поиска: ");
				scanf("%s",Text);
				Index = Search(PB,*COUNT,Text,Index-1,Sub);
				system("cls");
				if (Index == -1)
				printf("Запись не найдена\n\n");
				else Show(PB[Index],Index);
				goto Start;
			}
NewLamer&Programer вне форума Ответить с цитированием
Старый 18.06.2013, 15:07   #39
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Цитата:
Сообщение от NewLamer&Programer Посмотреть сообщение
нефига не понял что за сдвиг
Пример из жизни:
На полке стоят одинаковые книги
Вы хотите посмотреть, как пропечатана 3 глава
Берете первую книгу и смотрите страницу (сдвиг)
После этого открываете следующие книги сразу на этой странице

Некоторая полезная информация - http://habrahabr.ru/post/142662/.

По второму вопросу - scanf("%d", &Index);.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 18.06.2013, 20:44   #40
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

еще такая неприятность: пока проверял на всякой ерунде типа 123, 456 все работало, когда ввел пару записей типа Петров Петр, Иванов Иван... говорит память не может быть read
NewLamer&Programer вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с поиском в ворде Aleksey1989 Общие вопросы Delphi 2 09.08.2013 14:24
проблема с поиском решения valek00794 Microsoft Office Excel 2 04.06.2013 23:00
Проблема с поиском, лол. Caxap_ok Microsoft Office Excel 3 16.08.2011 01:02
Проблема с поиском в БД Evgenii БД в Delphi 15 25.06.2009 00:14
Проблема с поиском Zeraim Microsoft Office Access 2 04.06.2008 05:42