Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сортировка на Си. Критикуйте, пожалуйста / 23 сообщений из 23, страница 1 из 1
11.02.2014, 10:25
    #38556713
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
Здравствуйте.

Дошёл до главы 5.8 K&R Массивы указателей.
Увидел пример, и решил сделать задание сам. Ещё не прочитал как делают K&R, решил сам на листочке нарисовать алгоритм и запрограммировать.
У K&R сортируются месяцы и я решил также. На код ушло 30 минут, по причине того что забыл перед последним printf обнулить i.
Также хочется сократить функцию сравнения двух строк. Я не преследовал скорость, наверное этот алгоритм самый медленный из возможных, но если он правильный или близок к этому, уже хорошо.

В общем, код ниже.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
#include "stdafx.h"

int strcmp_cur(const char* f, const char* s)//функция лексиграфически сравнивает две строки 1 первая больше,если вторая -1, 0 ничья
{
	while (*f == *s)
	{
		if (*f++ == '\0' && *s++ != '\0')
		{
			return -1;
		}
		else if (*f++ != '\0' && *s++ == '\0')
		{
			return 1;
		}
		else if (*f++ == '\0' && *s++ == '\0')
		{
			return 0;
		}
	}
	return (*f - *s);
}


int _tmain(int argc, _TCHAR* argv[])
{
	char* m[13] =
	{ "jaunary", "february", "march", "april", "may", "june",
	"july", "august", "september", "october", "nobember", "december", 
	"buffer"
	};
	int i = 0;
	int temp = 0;
	while (temp != 11)
	{
		temp = 0;
		i = 0;
		while (i < 11)
		{
			if (strcmp_cur(m[i+1], m[i])>=0)
			{
				++temp;
			}
			else
			{
				m[12] = m[i + 1];
				m[i + 1] = m[i];
				m[i] = m[12];
			}
			++i;
		}
	}

	i = 0;
	while (i<12)
	{
		printf("%s  %i\n", m[i++],i);
	}

	return 0;
}
...
Рейтинг: 0 / 0
11.02.2014, 12:06
    #38556844
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
SashaMercury,

Лучше напиши словами алгоритм, который ты решил запрограммировать.

Например, самым наивным является метод пузырька, но я у тебя его не увидел

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
        size_t s = sizeof(a)/sizeof(a[0]);
for(size_t i = 0; i<(s-1); ++i)
    for(size_t j = (i+1); j<s; ++j)
        if( strcmp(a[i], a[j]) > 0 ) {
            const char* t = a[i];
            a[i] = a[j];
            a[j] = t;
        }



По поводу функции сравнения строк:

На сколько продвинется продвинется положение f и s после этой проверки

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
if (*f++ == '\0' && *s++ != '\0')
		{
			return -1;
		}
		else if (*f++ != '\0' && *s++ == '\0')
		{
			return 1;
		}
		else if (*f++ == '\0' && *s++ == '\0')
		{
			return 0;
		}


?

Если пока нет уверенности в правильном ответе на этот вопрос, то поступай наивно

- вычисли сначала длины f и s
- сравни их, если равны веди посимвольное сравнение, иначе верни либо -1, либо 1.

Или еще лучше используй strcmp, если это не является темой твоего упражнения.

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

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

Или именно это ты хотел получить?
...
Рейтинг: 0 / 0
11.02.2014, 13:47
    #38557048
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
SashaMercury,

может так всё же лучше ?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int strcmp_ziv(const char* f, const char* s)
//функция лексиграфически сравнивает две строки 1 первая больше,если вторая -1, 0 ничья
{
  for( ; *f == *s; ++f, ++s )
    {
      if (*f == '\0' && *s != '\0')
	return -1;
      else if (*f != '\0' && *s == '\0')
	return 1;
      else if (*f == '\0' && *s == '\0')
	return 0;
    }
  return *f - *s;
}



Твой код настолько мне лично не понятен, что я даже не могу его анализировать на предмет правильности.
У меня лично закипает моск.
Я всё же думаю, что лучше писать код в соответствии с принципами структурного программирования.

Можно кстати и так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
int strcmp_ziv(const char* f, const char* s)
//функция лексиграфически сравнивает две строки 1 первая больше,если вторая -1, 0 ничья
{
  for( ; *f == *s; ++f, ++s )
    {
      if (!*f && *s)
	return -1;
      else if (*f && !*s )
	return 1;
      else if (!*f && !*s )
	return 0;
    }
  return *f - *s;
}
...
Рейтинг: 0 / 0
11.02.2014, 14:12
    #38557103
SS_phone
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
Нет, Май не будет первым. Проверьте пожалуйста. Неужели настолько запутанно пишу код(
SS
...
Рейтинг: 0 / 0
11.02.2014, 14:19
    #38557117
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
SS_phone,

я читал комментарий

int strcmp_cur(const char* f, const char* s)//функция лексиграфически сравнивает две строки 1 первая больше,если вторая -1, 0 ничья

"may" будет меньше всех указанных строк.

Но само тело функции будет работать как бог на душу положит, поскольку там модифицируется положение указателей входных строк несколько раз в зависимости от того, сработали или нет предыдущие условия.
...
Рейтинг: 0 / 0
11.02.2014, 14:35
    #38557156
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
Анатолий Широковя читал комментарий
там написано "лексиграфически сравнивает", т.е. 1 первая "лексиграфически" больше

ХЗ что за термин такой "лексиграфически", есть "ЛексиКОграфический порядок" (его использует strcmp())
...
Рейтинг: 0 / 0
11.02.2014, 14:41
    #38557169
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
вышел с компа.
Лексикографически. Опечатка
...
Рейтинг: 0 / 0
11.02.2014, 14:45
    #38557175
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
SashaMercury,

ну а почему strcmp не использовал? Ведь своя функция сравнения вроде бы не требовалась, чтобы попробовать алгоритм сортировки.
...
Рейтинг: 0 / 0
11.02.2014, 14:52
    #38557189
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
Потому что я изучаю K&R и там было показано как самому написать такую функцию. Мне нравится самому писать эти функции. Указатели чудо ^_^
...
Рейтинг: 0 / 0
11.02.2014, 14:55
    #38557195
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
Долго пытался понять код функции strcmp_cur() в итоге решил потестить:
Код: plaintext
1.
printf("%d\n", strcmp_cur("abc", "abc"));


получил -98

PS Надо тщательнее свои поделки проверять.
...
Рейтинг: 0 / 0
11.02.2014, 15:01
    #38557204
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
Я проверял...честно...много раз..попробуйте %i/
Блин, сейчас скачаю компилятор. Быть не может, я честно её тестил
...
Рейтинг: 0 / 0
11.02.2014, 15:21
    #38557236
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
Скачал Borland C++ 3.1, вернула 98..и я уже понял в чём ошибка, много раз сдвигаю указатель в if -else if. Но почему в Visual Studio 2013 Express всё ок ?(
...
Рейтинг: 0 / 0
11.02.2014, 15:32
    #38557265
Анатолий Широков
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
SashaMercuryПотому что я изучаю K&R и там было показано как самому написать такую функцию. Мне нравится самому писать эти функции. Указатели чудо ^_^

Это ты молодец. Просто, смотри - так тебе помимо того, что ты сейчас пытаешься поупражняться в сортировке, надо еще тестировать функцию, которая требует сама по себе отдельного внимания. В итоге ты распыляешься. Сосредоточься сейчас на чем-то одном. Сортировка - значит пока можно использовать и стандартную strcmp. Если функция сравнения, то функция сравнения.
...
Рейтинг: 0 / 0
11.02.2014, 15:37
    #38557277
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
SashaMercuryСкачал Borland C++ 3.1, вернула 98..(

Саша (ты же Саша?), выброси немедленно эту гадость и НИКОГДА не её тащи в рот к себе на комп.
...
Рейтинг: 0 / 0
11.02.2014, 15:37
    #38557278
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
Dima_T, я исправил C: Но самое хорошее всё-таки, что понял свою предыдущую ошибку, а значит учусь
вот код.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
int strcmp_cur(const char* f, const char* s)//функция лексиграфически сравнивает две строки 1 первая больше,если вторая -1, 0 ничья
{
	while (*f == *s)
	{
		if (*f == '\0' && *s != '\0')
		{
			return -1;
		}
		else if (*f != '\0' && *s == '\0')
		{
			return 1;
		}
		else if (*f == '\0' && *s == '\0')
		{
			return 0;
		}
		*f++;
                *s++;
	}
	return (*f - *s);
}



Собственно, перечитал ещё раз ответ MasterZiv, он так и написал, в целом.
PS Почему на VisualStudio всё отработало ??ведь ошибка очевидная со сдвигом указателя..Завтра ещё раз проверю старый код
...
Рейтинг: 0 / 0
11.02.2014, 15:41
    #38557286
m_Sla
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
int strcmp_cur1(const char* f, const char* s)//функция лексиграфически сравнивает две строки 1 первая больше,если вторая -1, 0 ничья
{	
        while(true)
	{
	    if(*f != *s)
	    {
	        if(*f > *s) return 1;
                else return -1;
	    }

	    if(!*f) return 0;

	    f++; s++;
	}
}
...
Рейтинг: 0 / 0
11.02.2014, 15:43
    #38557292
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
SashaMercuryСобственно, перечитал ещё раз ответ MasterZiv, он так и написал, в целом.


Не, я не так написал. Я for написал.

SashaMercuryPS Почему на VisualStudio всё отработало ??ведь ошибка очевидная со сдвигом указателя..Завтра ещё раз проверю старый код

Глюки. Твои или ... Да нет, скорее всего, твои.
Надо на такие функции писать Unit-тесты, много, штук 20.
...
Рейтинг: 0 / 0
11.02.2014, 15:48
    #38557304
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
MasterZiv, да, Саша.
У меня htc раздаёт интернет на ноутбук. Скорость не высокая. Потому скачал минимальный по размерам дистрибутив. Завтра принесу другой компилятор.

Анатолий Широков, вы правы) Но для меня это как конструктор, интересно самому, вот и стараюсь по-минимуму пользоваться библиотеками. В следующий раз подумаю как поступить


Dima_T, MasterZiv, Анатолий Широков, всем спасибо за ответы и советы C:

Сегодня я почувствовал определённый сдвиг.
Вывод дня: указатели чудо ^_^. Нравятся жутко
...
Рейтинг: 0 / 0
11.02.2014, 16:15
    #38557345
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
SashaMercuryDima_T, я исправил C: Но самое хорошее всё-таки, что понял свою предыдущую ошибку, а значит учусь
вот код.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
int strcmp_cur(const char* f, const char* s)//функция лексиграфически сравнивает две строки 1 первая больше,если вторая -1, 0 ничья
{
	while (*f == *s)
	{
		if (*f == '\0' && *s != '\0')
		{
			return -1;
		}
		else if (*f != '\0' && *s == '\0')
		{
			return 1;
		}
		else if (*f == '\0' && *s == '\0')
		{
			return 0;
		}
		*f++;
                *s++;
	}
	return (*f - *s);
}



Собственно, перечитал ещё раз ответ MasterZiv, он так и написал, в целом.
MasterZiv другое написал. А тебе советую внимательно посмотреть на свой код и найти фрагменты которые никогда не выполнятся, а только будут вхолостую тратить процессорное время.
и * лишняя тут
Код: plaintext
1.
2.
*f++;
*s++;


хотя работает правильно.

SashaMercuryPS Почему на VisualStudio всё отработало ??ведь ошибка очевидная со сдвигом указателя..Завтра ещё раз проверю старый код
Скорее всего дал параметры с которыми результат оказался правильный.
...
Рейтинг: 0 / 0
11.02.2014, 19:01
    #38557596
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
SashaMercuryСегодня я почувствовал определённый сдвиг.
Вывод дня: указатели чудо ^_^. Нравятся жутко
Хехе... у тебя еще всё впереди! Будешт ловить NPE, segfault,.. bsod и
кричать "Буть проклит тот день када я сел за баранку этово пылесоса!"
...
Рейтинг: 0 / 0
11.02.2014, 19:17
    #38557622
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
mayton,

что такое bsod ?
...
Рейтинг: 0 / 0
11.02.2014, 19:22
    #38557624
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
B(lue)S(creen)O(f)D(eadh)
...
Рейтинг: 0 / 0
12.02.2014, 02:19
    #38557950
SashaMercury
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сортировка на Си. Критикуйте, пожалуйста
Dima_TСкорее всего дал параметры с которыми результат оказался правильный.


MasterZivГлюки. Твои или ... Да нет, скорее всего, твои.


верно)
хорошо что хотя бы компилятор не глючит

mayton, спасибо)

надеюсь, это было бы здорово и интересно
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сортировка на Си. Критикуйте, пожалуйста / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]