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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.10.2016, 13:31   #1
Vitami
Пользователь
 
Регистрация: 22.10.2016
Сообщений: 18
По умолчанию Как сравнить 2 слова лексикографически?

У меня есть 2 массива. В каждом по одному слову. Как их сравнить лесикографически? Подозреваю, что нужно использовать ASCII, вот только как? Можно использовать только стандартную библиотеку <stdio.h>
Vitami вне форума Ответить с цитированием
Старый 30.10.2016, 13:39   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Так и в чем именно проблема?
Просто по порядку сравнивать символы слов пока один из них не будет меньше или больше или одно из слов не закончится.
https://ru.wikipedia.org/wiki/%D0%9B...B4%D0%BE%D0%BA
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 30.10.2016, 14:03   #3
Vitami
Пользователь
 
Регистрация: 22.10.2016
Сообщений: 18
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Так и в чем именно проблема?
Просто по порядку сравнивать символы слов пока один из них не будет меньше или больше или одно из слов не закончится.
https://ru.wikipedia.org/wiki/%D0%9B...B4%D0%BE%D0%BA
Т.е. если мне нужна функция, которая возвращает значение 1 если слово из массива a лексикографически мешьше слова из массива b, то функция сравнения каждой буквы будет выглядеть примерно так:
Код:
bool sravnenie(char *a,char*b){  
for (i=0; a[i]!='\0'||b[i]!='\0'; i++){
if( a[i]>b[i]){
break;
return 0;
     }
  }
return 1;
}
Я правильно понимаю?

Последний раз редактировалось Vitami; 30.10.2016 в 14:09.
Vitami вне форума Ответить с цитированием
Старый 30.10.2016, 14:12   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Форматируйте код нормально.
Например так
Код:
bool(char *a,char*b) {
    for (i=0; a[i]!='\0'||b[i]!='\0'; i++) {
        if( a[i]>b[i]) {
            break;
        }
        return 0;
    }
    return 1;
}
Вы ж тут всегда возвращаете 0 если не <. Но оно может быть либо =, либо >.
И ваш цикл никогда не пройдет дальше первой итерации.

Обычно возвращают 1 если a > b, -1 если a < b, 0 если a == b.
Но естественно нельзя возвращать 0 на первой итерации, только когда проверите все символы и они все окажутся равными.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 30.10.2016 в 14:19.
Alex11223 вне форума Ответить с цитированием
Старый 30.10.2016, 14:32   #5
Vitami
Пользователь
 
Регистрация: 22.10.2016
Сообщений: 18
По умолчанию

В случае вывода слова из первого массива, если оно лексикографичеки меньше слова во втором:
Код:
bool sravnenie(char *a,char*b){  
for (i=0; a[i]!='\0'||b[i]!='\0'; i++){
if( a[i]>b[i])//если буква из первого массива больше чем из второго
{
break;//конец цикла
return false;// если буквы из первого массива лексикографически больше чем из второго
     }//if
  }//for
return true;//если мы прошли цикл и буквы из первого массива лексикографически меньше чем из второго
}//sravnenie
Разве не так?

Последний раз редактировалось Alex11223; 30.10.2016 в 14:36.
Vitami вне форума Ответить с цитированием
Старый 30.10.2016, 14:39   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Тут тоже фигня написана. Во-первых return false никогда не произойдёт потому что до него break. И если a[i] не > b[i], то это значит что либо a[i] == b[i], либо a[i] < b[i], а не только второе.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 30.10.2016, 14:49   #7
Vitami
Пользователь
 
Регистрация: 22.10.2016
Сообщений: 18
По умолчанию

Если a[i] == b[i], мне нужно проверять следующие буквы (цикл повторяется, i++), а если a[i]<b[i], то я могу возвращать значение true. Тогда так :
Код:
bool sravnenie(char *a, char*b) {
	int i = 0;
	for (i; a[i] != '\0' || b[i] != '\0'; i++) {
		if (a[i]>b[i]) {
			return 0;
		}
		if (a[i] < b[i])
		{
			return 1;
		}
	}
}
______________________
Используйте тег [CODE] (кнопка с решеткой # в форме сообщения) при вставке кода на форум.
Vitami вне форума Ответить с цитированием
Старый 30.10.2016, 14:51   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А если одинаковые слова?
Или одно короче.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 30.10.2016, 14:59   #9
Vitami
Пользователь
 
Регистрация: 22.10.2016
Сообщений: 18
По умолчанию

Тогда, нужно возвращать False
Код:
bool sravnenie(char *a, char*b) {
	int i = 0;
	for (i; a[i] != '\0' || b[i] != '\0'; i++) {
		if (a[i] != b[i]) {
			if (a[i] > b[i) {
				return 0;
			}//if
			if (a[i] < b[i])
			{
				return 1;
			}//if
		}//if
	}//for
	return 0;
}//sravnenie
Vitami вне форума Ответить с цитированием
Старый 30.10.2016, 15:06   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

В for проверка завершения неправильная, будет выход за пределы массива если одно слово короче.

И если одно слово короче и при этом все символы до конца короткого равны, то значит другое "больше". (AA < AAA)
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Упорядочить строки матрицы D (m. n) Лексикографически по неубыванию первых k элементов строки Анатолий171 Помощь студентам 123 04.07.2014 18:46
Даны два слова. Получить третье слово из неповторяющихся символов, входящих как в первое, так и во второе слова. dlinkz Паскаль, Turbo Pascal, PascalABC.NET 8 01.02.2012 11:09
TASM. Сравнить слова в строке S1av0k Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 13.12.2011 10:14
Как составить слова из букв заданного слова(Паскаль) lirikoff Помощь студентам 1 22.12.2010 10:21
Как удалить текст до слова, потом от слова ? littlecoder Общие вопросы Delphi 7 29.12.2008 00:57