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

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

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

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

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

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

Цитата:
Сообщение от Базиля Посмотреть сообщение
NewLamer&Programer

В Цикле НЕ проверяются все записи.
В этом и вся проблема.

Не вижу смысла смотреть проект, если уже видно что функция работает некорректно.

Даже могу угадать, функция возвращает всегда 1-ую запись, так?
не угадал, всегда последнюю, и тогда объясните чем же вам так не нравиться проверка в цикле и как по вашему надо проверять...
NewLamer&Programer вне форума Ответить с цитированием
Старый 16.06.2013, 19:08   #12
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Функция не может возвращать последнюю запись.
Она всегда будет возвращать 0 индекс, т.е. первую запись.

Читаем назначение инструкции return и все вопросы отпадут.
Базиля вне форума Ответить с цитированием
Старый 17.06.2013, 10:12   #13
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

а вот таки возвращает, я же говорю, возможно дело в функции menu, использующей функцию Search, да посмотрите вы уже весь код... кстати до меня доперло что за бред про bool, в том то и смысл что мне надо возвращать не истина ложь, а номер найденной записи, просто NULL это я пытался как то обозначить то что запись не найдена, я не знал что это и есть 0, да думаю выход использовать отрицательное значение, и наконец опять же повторюсь ЧЕМ ВАМ НЕ НРАВИТЬСЯ ЦИКЛ??? почему по вашему он будет всегда возвращать первую запись???
NewLamer&Programer вне форума Ответить с цитированием
Старый 17.06.2013, 15:11   #14
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Вопрос:
Цитата:
Сообщение от NewLamer&Programer Посмотреть сообщение
почему по вашему он будет всегда возвращать первую запись???
Ответ:
Цитата:
Сообщение от Базиля Посмотреть сообщение
Читаем назначение инструкции return и все вопросы отпадут.
return
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.06.2013, 16:11   #15
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

BDA, не врубаюсь, да return осуществляет выход из функции, но если только попадется по условию ! а оно не попадется до тех пор пока не будет найдена (или не найдена) запись

п.с. да про "else return NULL" это лишнее, модифицировал так, но теперь все время пишит запись не найдена (то есть возвращает -1)

Код:
int Search(TPhoneBook *PB, int COUNT, char Text[100], int MainField, int SubField)
{
	for (int i = 0; i < COUNT-1; 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; 17.06.2013 в 16:21.
NewLamer&Programer вне форума Ответить с цитированием
Старый 17.06.2013, 16:33   #16
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

1) После каждого case нужен break, иначе будет сравнение и во всех последующих case:
Код:
case 1: if (strcmp(PB[i].Family,Text) == 0) return i;
break;
case 2: if (strcmp(PB[i].Name,Text) == 0) return i;
break;
http://msdn.microsoft.com/ru-ru/library/k0t5wee3.aspx
2) Может оказаться так, что text и поле действительно содержат разный текст (символы переноса строки, например).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 17.06.2013 в 16:37.
BDA вне форума Ответить с цитированием
Старый 17.06.2013, 16:48   #17
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
1) После каждого case нужен break, иначе будет сравнение и во всех последующих case:
Код:
case 1: if (strcmp(PB[i].Family,Text) == 0) return i;
break;
case 2: if (strcmp(PB[i].Name,Text) == 0) return i;
break;
зачем? ну и пусть сравнивает во всех case, так и было запланировано как бы... если найдет то выйдет из функции совсем, а не найдет продолжить сравнивать, это логично...
Цитата:
Сообщение от BDA Посмотреть сообщение
2) Может оказаться так, что text и поле действительно содержат разный текст (символы переноса строки, например).
если это намек на добавление ветки default, то насчет MainField можете не беспокоится, туда никогда не попадет ничего кроме этих чисел, а Text используется только в сравнении...
NewLamer&Programer вне форума Ответить с цитированием
Старый 17.06.2013, 16:55   #18
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Цитата:
Сообщение от NewLamer&Programer Посмотреть сообщение
зачем? ну и пусть сравнивает во всех case, так и было запланировано как бы... если найдет то выйдет из функции совсем, а не найдет продолжить сравнивать, это логично...
Вы предлагаете пользователю выбрать, по какому параметру осуществлять поиск. Если не сделать break, то поиск будет осуществляться не только по 1 параметру, но и по всем последующим.

Цитата:
Сообщение от NewLamer&Programer Посмотреть сообщение
если это намек на добавление ветки default, то насчет MainField можете не беспокоится, туда никогда не попадет ничего кроме этих чисел, а Text используется только в сравнении...
Это не намек на ветку default. "Привет" и "Привет\n" - разные строки. Для тестирования добавьте 1 запись в массив, затем в функции поиска побайтово выведите Text и поле, с которым собираетесь сравнивать.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.06.2013, 17:46   #19
NewLamer&Programer
Форумчанин
 
Регистрация: 23.11.2012
Сообщений: 428
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Вы предлагаете пользователю выбрать, по какому параметру осуществлять поиск. Если не сделать break, то поиск будет осуществляться не только по 1 параметру, но и по всем последующим.
имхо бред, как он будет по следующим осуществляться, если MainField допустим равен 2, то он глянет - ага равен 1, если нет, то продолжит, равно ли 2? да, значит значит надо сравнить, если тексты не равны, он продолжит, MainField = 3? если нет продолжит 4 и т.д...
Цитата:
Сообщение от BDA Посмотреть сообщение
Это не намек на ветку default. "Привет" и "Привет\n" - разные строки. Для тестирования добавьте 1 запись в массив, затем в функции поиска побайтово выведите Text и поле, с которым собираетесь сравнивать.
если у меня окажутся разные строки то он и вернет значение -1, что не понятно то? другой вопрос что такие символы как \n в строке все равно не будут присутствовать, т.к. строка вводиться с клавиатуры, откуда они там возьмутся, вот ввел ты и нажал Enter, через scanf строка считалась, откуда там такие символы возьмуться?
NewLamer&Programer вне форума Ответить с цитированием
Старый 17.06.2013, 17:51   #20
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,430
По умолчанию

Цитата:
Сообщение от NewLamer&Programer Посмотреть сообщение
имхо бред
Мое имхо - подтягивайте теорию. switch
Цитата:
Сообщение от NewLamer&Programer Посмотреть сообщение
если у меня окажутся разные строки то он и вернет значение -1, что не понятно то?
Так Ваша жалоба в том, что он должен найти запись, а он не находит. Мое предположение - строки различны, хотя Вы предполагаете, что одинаковы.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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