powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Сортировка на Си. Критикуйте, пожалуйста
23 сообщений из 23, страница 1 из 1
Сортировка на Си. Критикуйте, пожалуйста
    #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
Сортировка на Си. Критикуйте, пожалуйста
    #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
Сортировка на Си. Критикуйте, пожалуйста
    #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
Сортировка на Си. Критикуйте, пожалуйста
    #38557103
SS_phone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, Май не будет первым. Проверьте пожалуйста. Неужели настолько запутанно пишу код(
SS
...
Рейтинг: 0 / 0
Сортировка на Си. Критикуйте, пожалуйста
    #38557117
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SS_phone,

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

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

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

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

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

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


получил -98

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

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

Саша (ты же Саша?), выброси немедленно эту гадость и НИКОГДА не её тащи в рот к себе на комп.
...
Рейтинг: 0 / 0
Сортировка на Си. Критикуйте, пожалуйста
    #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
Сортировка на Си. Критикуйте, пожалуйста
    #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
Сортировка на Си. Критикуйте, пожалуйста
    #38557292
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСобственно, перечитал ещё раз ответ MasterZiv, он так и написал, в целом.


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

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

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

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


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

Сегодня я почувствовал определённый сдвиг.
Вывод дня: указатели чудо ^_^. Нравятся жутко
...
Рейтинг: 0 / 0
Сортировка на Си. Критикуйте, пожалуйста
    #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
Сортировка на Си. Критикуйте, пожалуйста
    #38557596
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСегодня я почувствовал определённый сдвиг.
Вывод дня: указатели чудо ^_^. Нравятся жутко
Хехе... у тебя еще всё впереди! Будешт ловить NPE, segfault,.. bsod и
кричать "Буть проклит тот день када я сел за баранку этово пылесоса!"
...
Рейтинг: 0 / 0
Сортировка на Си. Критикуйте, пожалуйста
    #38557622
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

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


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


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

mayton, спасибо)

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


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