Автор
|
Тема: Вот задачка...
|
barrettau |
опубликован 07-02-2002 01:29 MSK
Вот задачка вроде задана для начинаюших но я ни как не пойму как ее решить, помогите!!!Надо написать прогу на С(не на С++ или еще чем). Которая принимает строки символов и в конце возврашает самую длиную строку. Что я не знаю как сделать в этой проге это то что надо сделать так что бы не было ограничения на размер возрашаемой строки. Так что помогите новичку своим опытом. П.С. Задача не предусматривает использования пойнтеров.
|
Drunkard
|
опубликован 07-02-2002 02:17 MSK
"что бы не было ограничения на размер возрашаемой строки."Стандартный метод: Динамическое выделение памяти. Описано во множестве учебников. Сколько трэба, столько подгружай, пока всю не засрешь своей строкой. :)) А чё такое "пойнтеры"? Это указатели что ли? Если да, то в Си они отлично применяются, без всяких С++.
|
barrettau
|
опубликован 07-02-2002 02:26 MSK
То что указатели сушествуют в С я это знаю вот только в задаче они не должны использоватся. Поскольку задачка идет до этой темы(книга Кернихан и Ритчи). И по своему опыту я знаю что когда начинаеш изучать новый язык и встречаеш задачки которые можно решить с помошью всех возможностей языка програмирования это не значит что ее нельзя решить более простыми способами(поскольку на эта задачка предшествует в книге им).Это значит что можно найти решение этой задачки более простое и возможно более верное. |
eyes
|
опубликован 07-02-2002 02:38 MSK
Ну тут без динамического выделения памяти не обойтись => без указателей тоже (что там new возвращает? пойнтер, вроде) |
Drunkard
|
опубликован 07-02-2002 03:23 MSK
Глазам< "new" - это уже запрещено, т.к. С++ :))Самый простой способ - в лоб! Дописывай в файл! Тут у тебя нет почти никаких ограничений. Пока весь "винчестер" не засрешь. И выводить на экран самую большую строку можно, читая по одному байту последовательно из этого файла. Посплю, потом еще подумаю :) Мож, чаво и приснится. |
eyes
|
опубликован 07-02-2002 03:57 MSK
а я там еще приписать хотел malloc, но запарился... Она-то хоть чистА сишная, так?*У меня тут классная сауна с Scripting'ом* |
ValeRRR
|
опубликован 07-02-2002 21:52 MSK
мне кажется эту задачу можно решить без выделения памяти и буферов. Есть в Сях простая функция getc() или getch() возвращает символ введенный с консоли. так вот нужно их в цикле вызывать пока не прийдет символ '\n' и считать количество символов. ну и соответственно запоминать самый большой счетчик |
rivitna
|
опубликован 07-02-2002 22:47 MSK
Если нельзя в памяти, сделай на диске:Работай с двумя файлами, допустим max и temp. С помощью getc и fputc считывай строку в temp. Ну и далее, если длина temp больше длины max, то temp скопировать в max (или переименовать файл - сам придумай). В конце просто выведи содержимое файла max |
barrettau
|
опубликован 07-02-2002 23:40 MSK
Спасибо всем за ответы. Идея с использованиями файлов очень интересная.П.С. 2ValeRRR Ты не совсем понял, задача была выдавать максимальную строку а не ее длину. То что ты описал это оригинальный алгоритм проги которую требовалось модернизировать. |
Drunkard
|
опубликован 08-02-2002 03:46 MSK
Так ничё и не приснилось. :) А если файлы устраивают, то и флаг тебе в руки! |
server_mouse
|
опубликован 08-02-2002 15:28 MSK
FILE *fopen(.....)А чё такое FILE со звёздочкой??? Чё за звезда я спрашиваю??? Какой в жопу указатель?! Не знаю я никаких указателей! |
SUnteXx
|
опубликован 08-02-2002 16:05 MSK
2server_mouse: FILE * - HFILE или Handle на File или указатель на файл! А что тут не понять и причем здесь это? НЕ про это ж этот топик! |
barrettau
|
опубликован 09-02-2002 19:35 MSK
2Drunkard Идея с файлами конечно не то что я искал для решения этой задачи. Поскольку задачку надо(по книге) решать базовыми операторами(которые описаны до этой главы в книге), так что я думаю должно быть еще одно решение, и намного простое.А насчет идеи файлов она просто показалась мне интересной на будушее. П.С. Задача взята с книги "Язык програмирования С"(Кернихан Ритчи) Третие издание. Задача под номером 1.16 Я привел это для тех кому будет интересно. |
dvorobjov
|
опубликован 09-02-2002 20:12 MSK
Как можно оперировать строками без указателей, да к тому же еще и без ограничения на размер. Я думаю что barrettau неверно понял задачу: наверное нельзя пользоваться указателями для определения длины строки (? есть libная ф-ция!) а для ссылок на строку можно. В противном случае при передаче ее в какую либо ф-цию придется ее pushить в стек целиком. malloc здесь идеальное решение. На первом этапе отъедаешь mallocом памяти столько, чтобы на любую твою строку хватило, после копирования строки в эту память определяешь ее размер и делаешь realloc. Потом снова malloc. и т.д. и т.п. Без указателей эта задача смысла, кроме как поставить программиста в тупик, не имеет. |
ValeRRR
|
опубликован 09-02-2002 21:45 MSK
2barrettau Специально поднял первоисточник. В моем варианте K&R 16 упражнение выглядит следующим образом: Упражнение 1-16. Напишите программу, которая будет удалять из каждой строки стоящие в конце пробелы и табуляции, а также строки, целиком состоящие из пробелов.Напиши после какой главы ты эту задачу нашел |
SUnteXx
|
опубликован 10-02-2002 01:36 MSK
Точно не знаю вопроса, но мне кажется, что если у нас есть текст, то просто самому искать символа аля "\0" "\r" "\n", считая сколько символов до этого было с конца прошлой строки. Найдя номер самой длинной строки ищем ее начало и ее конец, копируем, ... Я так на файлом настроек в своей проге делаю, причем много чего еще со строками делаю, но строки нахожу только так! Иначе не знаю как:( |
server_mouse
|
опубликован 10-02-2002 19:37 MSK
Лана, забили на FILE*.... А как мы записываем в файл? А читаем из него? Нука, попробуйте-ка без указателей? Ничегошеньки не получится: fwrite(void* buffer, ..... Как не пытайся, а передать тебе придётся АДРЕС, он же УКАЗАТЕЛЬ. Вопрос ведь был "как не используя УКАЗАТЕЛИ". Т.е. IMHO в тексте программы напрочь должны отсутствовать выражения типа buffer*, &buffer, а не просто динамическое распределение памяти. С использованием файлов, от указателей избавится "impossible mr. Karabasov!"(c). |
rivitna
|
опубликован 10-02-2002 20:16 MSK
Special for server_mouse:Дубль 2: "Работай с двумя файлами, допустим max и temp. С помощью getc и fputc считывай строку в temp. Ну и далее, если длина temp больше длины max, то temp скопировать в max (или переименовать файл - сам придумай). В конце просто выведи содержимое файла max"
|
server_mouse
|
опубликован 10-02-2002 23:13 MSK
2rivitna: Лана, согласен. Недогнал.... |