powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / K&R 5.8 Массивы указателей
25 сообщений из 54, страница 1 из 3
K&R 5.8 Массивы указателей
    #38559284
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Решил начать новую тему. Предыдущая содержит много ошибок не по теме.

Вот собственно мой код.

Код: 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.
int strcmp_cur(const char* f, const char* s)//лексикографически сравнивает две строки 1 первая больше,если вторая -1, 0 ничья
{
	while (*f == *s)
	{
		if (*f=='\0') return 0;
		f++; s++;
	}
	return (*f - *s);
}

void sort_cur(char* a_start[], int weight_array)/*2*/
{
	int i = 0, temp = 0;
	char* ptr_temp;//для хранения значения адреса массива во время его "замещения"
	while (temp != weight_array-1)//пока все элементы не упорядоченны 
	{
		temp = 0, i = 0;
		while (i < weight_array-1)//цикл по всем "соседям по парте" в массиве
		{
			if (strcmp_cur(*(a_start+i+1), *(a_start+i)) >= 0)
			{
				++temp;
			}
			else
			{
				ptr_temp = *(a_start + i + 1);
				*(a_start+i+1) = *(a_start+i);
				*(a_start+i) = ptr_temp;
			}
			++i;
		}
	}
}

int _tmain(int argc, _TCHAR* argv[])
{

	char* m[12] =
	{ "jaunary", "february", "march", "april", "may", "june",
	"july", "august", "september", "october", "nobember", "december" 
	};
	int i = 0;
    //вывод на экран до
	while (i < 12) /*1.1*/
	{
		printf("%p  %p  %i \n", (m+i),  *(m+i), i);
		++i;
	}

	//сортировка и вывод на экран
	sort_cur(m, 11);
	i = 0;/*1.2*/
	while (i<12)
	{
		printf("%s  %i\n", *(m+i), i);
		++i;
	}
	return 0;
}
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559292
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.1-1.2 -это побочный эффект, верно ? как бы мне внутри while объявлять i чтобы он не изменял внешнюю переменную. Или как бы сделать так, чтобы при использовании переменной внутри while, на выходе её значение становилось прежним по умолчанию.
может f e существует идентификатор при объявлении
smth_ident int i=0;

2. Как бы правильно назвать размерность массива, подходит ли моё название ?
не совсем в тему, но кстати, используете ли вы венгерскую нотацию ?

2. Хочу передавать только адрес первого элемента массива и кол-во элементов, но пока не получилось написать функцию. Возможно ли это ? если да, то не подсказывайте как, хочу ещё сам подумать.

3. Алгоритм сортировки верный ?
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559293
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вот ещё
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559295
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая максимальная размерность массива указателей ? Мне нравятся, мощная штука. А ещё можно сделать массив указателей который замыкается на себе ? вроде можно, но для чего это будет использоваться ? (не одномерный, одномерный видимо для стэка fifo,lifo и тп )
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559300
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury1.1-1.2 -это побочный эффект, верно ? как бы мне внутри while объявлять i чтобы он не изменял внешнюю переменную. Или как бы сделать так, чтобы при использовании переменной внутри while, на выходе её значение становилось прежним по умолчанию.
может f e существует идентификатор при объявлении
smth_ident int i=0;
используй цикл for()
Код: plaintext
1.
2.
int i;
for(i = 0; i < 12; i++) printf("%p  %p  %i \n", (m+i),  *(m+i), i);



SashaMercury2. Как бы правильно назвать размерность массива, подходит ли моё название ?
не совсем в тему, но кстати, используете ли вы венгерскую нотацию ?
Массив указателей
Венгерская нотация никому хуже код не сделала. Лучше использовать.

SashaMercury2. Хочу передавать только адрес первого элемента массива и кол-во элементов, но пока не получилось написать функцию. Возможно ли это ? если да, то не подсказывайте как, хочу ещё сам подумать.
Да

SashaMercury3. Алгоритм сортировки верный ?
Сам как думаешь? На скриншот свой посмотри.
SashaMercuryИ вот ещё
Не надо лезть за пределы массива, там неинициализированная память, там вообще может не оказаться реальной памяти.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559302
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
декабрь совсем не там !
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559304
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нужно
Код: plaintext
1.
while (i < weight_array)
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559309
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima_TНе надо лезть за пределы массива, там неинициализированная память, там вообще может не оказаться реальной памяти.



Он мне всегда следующим элементов выводит CCCC CCCC что это ? а что он тогда выводит если там не реальной памяти ? откуда берёт значения?
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559310
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какая максимальная размерность массива указателей ?

любая. пока памяти хватит.


Мне нравятся, мощная штука. А ещё можно сделать массив указателей который замыкается на себе ? вроде можно, но для чего это будет использоваться ? (не одномерный, одномерный видимо для стэка fifo,lifo и тп )

как же тебя плющит...
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559318
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryDima_TНе надо лезть за пределы массива, там неинициализированная память, там вообще может не оказаться реальной памяти.



Он мне всегда следующим элементов выводит CCCC CCCC что это ? а что он тогда выводит если там не реальной памяти ? откуда берёт значения?
Там есть реальная память (иначе бы прога вылетела), а что там записано и какой программой неважно. Ты просил массив из 12 элементов - тебе его выделили, не надо лезть в 13-й.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559321
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

напиши подробные комментарии к каждой строчке кода.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559325
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скорее всего CCCC CCCC ставит компилятор.
Зачем точно не скажу, могу предположить скорее всего своеобразная защита от ошибок в коде, чтобы программа гарантированно вылетела при попытке обратится по этому адресу.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559334
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
int strcmp_cur(const char* f, const char* s)//лексикографически сравнивает две строки 1 первая больше,если вторая -1, 0 ничья
{
	while (*f == *s)//пока значения символов равны
	{
		if (*f=='\0') return 0; //если обе строки закончились то строки равны
		f++; s++;//переходим к следующему элементу
	}
	return (*f - *s);//возвращаем разниу между символами по ASCII после первого различия в символах 
}


void sort_cur(char* a_start[], int weight_array)/*2*/
{
	int i = 0, temp = 0;
	char* ptr_temp;//ячейка для временного хранения одного адреса из массива
	while (temp != weight_array-1)//пока все пары не расположны в верном порядке
		//(фактически в скобках число пар где всё норм, таких пар должно быть на 1 меньше 
		//чем элементов в массиве)
	{
		temp = 0, i = 0;
		while (i < weight_array)//цикл по всем "соседям по парте" в массиве,
			//аналогичный цикл выше, только по другом написан
		{
			if (strcmp_cur(*(a_start+i+1), *(a_start+i)) >= 0) //сравниваю две строки, если их порядок верен
			{
				++temp; // то добавляю единицу к коэф по которому определяется что массив отсортирован
			}
			else //если два элемента не упорядочены
			{
				ptr_temp = *(a_start + i + 1);//пишу во временный указатель значение адреса хранящегося в элементе 
				//массива, то есть не сам адрес массива, а значение которое записано по этому адресу,\
				// и которое определяет начало строки
				*(a_start+i+1) = *(a_start+i);//меняю местами значения адресов
				*(a_start+i) = ptr_temp;//меняю местами значения адресов
			}
			++i;//проверяю все пары до конца
		}
	}
}
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559358
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Эта строчка правильно написана?
SashaMercury
Код: plaintext
1.
2.
	//сортировка и вывод на экран
	sort_cur(m, 11);
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559373
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нелогично что 11, согласен. Но правильно вроде-бы
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559375
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryнелогично что 11, согласен. Но правильно вроде-бы
почему правильно?
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559384
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неправильно. Должно быть 12
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559386
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryНеправильно. Должно быть 12
почему?
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559404
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
while (i < weight_array)



отработает до 11 элемента, а в теле индексация на единицу увеличит, то учту все элементы массива
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559423
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
while (i < weight_array)



отработает до 11 элемента, а в теле индексация на единицу увеличит, то учту все элементы массива
почти угадал :)

Надо четко понимать чего ты пишешь.
Ты при описании кода ни слова не написал про строку
Код: plaintext
1.
void sort_cur(char* a_start[], int weight_array)/*2*/


а она одна из не многих требующих обязательного описания
при описании функции обязательно надо описать что она получает в параметрах
В твоем случае
char* a_start[] - начало сортируемого массива
int weight_array - размер массива
У тебя размер изначально 12 (char* m[12]) вот и надо передавать 12.

И имена переменным надо давать соответствующие: weight переводится как "вес", по-русски ты же нигде не пишешь "вес массива", уместнее слово size - размер.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559431
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно конечно написать в описании weight_array - это индекс последнего элемента массива.
тогда вызов sort_cur(m, 11) будет правильным, только так обычно никто не пишет, принято передавать указатель на начало и размер.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559668
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
while (i < weight_array)



отработает до 11 элемента, а в теле индексация на единицу увеличит, то учту все элементы массива

Так не пишут. Не ошибка, конечно, но начинают с нуля и бегут до N-1. В цикле for .

Код: plaintext
1.
2.
3.
4.
5.
6.
#define N 256
int a[256];
for( int i = 0; i < N; ++i )
{
  printf( "a[%d] = %d", i, a[i] );
}
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559700
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
2.
3.
4.
5.
6.
			else
			{
				ptr_temp = *(a_start + i + 1);
				*(a_start+i+1) = *(a_start+i);
				*(a_start+i) = ptr_temp;
			}





Вот это пиши лучше не через указатели, а через смещение в массиве. Как будто указатель -- это массив.
Проче, понятнее, короче.

Код: plaintext
1.
2.
3.
4.
5.
6.
			else
			{
				ptr_temp = a_start[ i + 1 ];
				a_start[i+1] = a_start[i];
				a_start[i] = ptr_temp;
			}




Также давай переменным осмысленные имена.

Объявляй переменные в месте их первого использования, если обратное не требуется по семантике программы (если не нужно вынести переменную из блока). Это НЕ classic C style, но очень хорошая позитивная привычка нормального C++-ника. Ты же не собираешься наверное на голом С останавливаться ? Думаю, нет.

Используй правильно циклы. Если у тебя есть явная инициализация цикла, условие завершения и выражение смещения к следующей итерации, выполняемое безусловно, то нужно использовать FOR (если есть хотя бы два из этих трёх условий).
Для циклов с постусловием используй do ... while, в остальных случаях -- while.

Вместь
Код: plaintext
1.
*f=='\0' 

можно писать просто
Код: plaintext
1.
!*f

, вместо
Код: plaintext
1.
*f=='\0' 

можно писать
Код: plaintext
1.
*f

. Это тебе не Java.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559708
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
++temp; // то добавляю единицу к коэф по которому определяется что массив отсортирован



На сколько я помню, в пузырьке достаточным условием выхода из сортировки является просто то, что за проход не пришлось ничего переставлять.
Можешь справиться в википедии.
...
Рейтинг: 0 / 0
K&R 5.8 Массивы указателей
    #38559994
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,Dima_T спасибо C:

а операция *(a+i) будет одинаково по скорости с a[i] вычисляться ? мне почему-то нравится писать *(a+i), я как-будто бы руками щупаю память, а не в перчатках. Хотя вы правы, читабельней ваш вариант.
Завтра ещё раз утром всё перечитаю

А вот сейчас функция принимает только один указатель? Но она понимает что указатель на начало массива ?
...
Рейтинг: 0 / 0
25 сообщений из 54, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / K&R 5.8 Массивы указателей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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