![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 21.04.2008
Сообщений: 164
|
![]()
Есть задача - Напишите программу, которая использует генерацию случайных чисел для сохдания предложений. Программа должна использовать 4 массива указателей на char (см. ниже код).
Программа должна создавать предложения, случайно выбирая слова из каждого массива в следующем порядке(порядок см. ниже в коде). Как только слово выбрано, оно должно быть подсоединено к предыдущему слову в массиве, который достаточно велик для того, чтобы вместить все предложение. Слова должны быть разделены пробелами. При выводе окончательного предложения(готового) оно должно начинаться с заглавной буквы и заканчиваться точкой. Программа должна генерировать 20 таких предложений. То что я написал не работает ![]() Код: Код:
|
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,091
|
![]()
Так пойдёт?
Код:
|
![]() |
![]() |
![]() |
#3 | ||
Форумчанин
Регистрация: 21.04.2008
Сообщений: 164
|
![]() Цитата:
Цитата:
Я думал что надо строку, перекинуть в массив, а потом уже передавать адрес 1 элемента (константный адрес - имя массива). вот так я и сделал Код:
Код:
Код:
ЗЫ Ваш код пока не тестировал (проблемы с компом)но думаю он рабочий. ![]() |
||
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,091
|
![]()
Увеличивается указатель на строку article[rnd_word], т.е. по факту вы "забываете" про первый символ, а звёздочка разыменовывает указатель, т.е. результатом будет первый символ строки article[rnd_word]
Код:
Код:
Код:
|
![]() |
![]() |
![]() |
#5 | |
Форумчанин
Регистрация: 21.04.2008
Сообщений: 164
|
![]()
Спасибо pu4koff ! Ваш код работает...лол...там такой бред сгенерировался
![]() ![]() ![]() Цитата:
И я не понял, в вашем примере, куда исчезают буквы из 1 элемента (1 строки) // article[0] == "the" // article[0] == "he" // article[0] == "e" Насколько я понял, таким образом *article[rnd_word]++ при каждом увеличении я разыменовываю следующею букву. А в втором случае, из вашего объяснения и примера я понял что эта строка*article[rnd_word++] указывает (с каждым увеличением)) на другую строку.(Поправте если я не прав). |
|
![]() |
![]() |
![]() |
#6 | |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,091
|
![]() Цитата:
Для такой реализации надо заводить временную переменную: Код:
|
|
![]() |
![]() |
![]() |
#7 | |
Форумчанин
Регистрация: 21.04.2008
Сообщений: 164
|
![]() Цитата:
Может я чего то недопонял в самом процессе разыменования... |
|
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 22.05.2007
Сообщений: 9,091
|
![]()
Никуда не деваются. Просто фишка в следующем. Строка - есть массив символов. Массив - это кусок памяти и имеется у нас для доступа только указатель на первый элемент. Когда пишете инкремент ++, то переходите на следующий символ, т.е. указатель на наш массив символов смещается на 1 байт и тем самым теряем первый символ. Он никуда не пропадает, но указатель на него мы теряем.
Ну это как если пришли за квартиру платить, а там очередь. Вы спрашиваете: кто первый? У первого потом спрашиваете: кто за тобой? И запоминаете этого человека уже как первого. Так проходите всю очередь и в итоге первым запомнили последнего, а кто первый уже забыли. Для поиска первого уже придется последнего спрашивать: кто перед тобой? и так до первого дойдем ![]() Если без временной переменной, которая будет хранить указатель на n-й символ строки, то либо работать со строкой как с массивом символов: Код:
или так: Код:
Разыменование в принципе ничего не делает. Просто компилятору говорим, что нужен не адрес, а то что по этому адресу записано. |
![]() |
![]() |
![]() |
#9 | |
Форумчанин
Регистрация: 21.04.2008
Сообщений: 164
|
![]() Цитата:
Если подвести итог получается: 1)*article[rnd_word]++ - Эта строка инкрементирует указатель на первый элемент, n-ой строки. 2)*article[rnd_word++] - Это строка инкрементирует указатель на строку(с каждым увеличением указатель указывает на 1 символ следующей строки). |
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Помогите найти ошибку! | junkie | Паскаль, Turbo Pascal, PascalABC.NET | 2 | 03.05.2009 14:22 |
Помогите найти ошибку (С++) | Alex1991 | Помощь студентам | 1 | 11.04.2009 15:19 |
Помогите найти ошибку (С++). | TheWanderer | Помощь студентам | 1 | 19.03.2009 15:00 |
помогите найти ошибку! | Picaso18 | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 24.01.2009 15:32 |