WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Вот задачка...

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Вот задачка...
barrettau опубликован 07-02-2002 01:29 MSK   Click Here to See the Profile for barrettau   Click Here to Email barrettau  
Вот задачка вроде задана для начинаюших
но я ни как не пойму как ее решить, помогите!!!

Надо написать прогу на С(не на С++ или еще чем). Которая принимает строки символов
и в конце возврашает самую длиную строку.
Что я не знаю как сделать в этой проге
это то что надо сделать так что бы не было ограничения на размер возрашаемой строки.

Так что помогите новичку своим опытом.


П.С. Задача не предусматривает использования пойнтеров.

Drunkard опубликован 07-02-2002 02:17 MSK     Click Here to See the Profile for Drunkard  Click Here to Email Drunkard     
"что бы не было ограничения на размер возрашаемой строки."

Стандартный метод:
Динамическое выделение памяти. Описано во множестве учебников.
Сколько трэба, столько подгружай, пока всю не засрешь своей строкой. :))

А чё такое "пойнтеры"? Это указатели что ли?
Если да, то в Си они отлично применяются, без всяких С++.

barrettau опубликован 07-02-2002 02:26 MSK     Click Here to See the Profile for barrettau  Click Here to Email barrettau     
То что указатели сушествуют в С я это знаю вот
только в задаче они не должны использоватся.
Поскольку задачка идет до этой темы(книга Кернихан
и Ритчи).
И по своему опыту я знаю что когда начинаеш изучать
новый язык и встречаеш задачки которые можно решить
с помошью всех возможностей языка програмирования
это не значит что ее нельзя решить более простыми способами(поскольку на эта задачка предшествует в книге им).

Это значит что можно найти решение этой задачки более простое и возможно более верное.

eyes опубликован 07-02-2002 02:38 MSK     Click Here to See the Profile for eyes  Click Here to Email eyes     
Ну тут без динамического выделения памяти не обойтись => без указателей тоже (что там new возвращает? пойнтер, вроде)
Drunkard опубликован 07-02-2002 03:23 MSK     Click Here to See the Profile for Drunkard  Click Here to Email Drunkard     
Глазам<
"new" - это уже запрещено, т.к. С++ :))

Самый простой способ - в лоб!
Дописывай в файл! Тут у тебя нет почти никаких ограничений. Пока весь "винчестер" не засрешь. И выводить на экран самую большую строку можно, читая по одному байту последовательно из этого файла.

Посплю, потом еще подумаю :) Мож, чаво и приснится.

eyes опубликован 07-02-2002 03:57 MSK     Click Here to See the Profile for eyes  Click Here to Email eyes     
а я там еще приписать хотел malloc, но запарился... Она-то хоть чистА сишная, так?

*У меня тут классная сауна с Scripting'ом*

ValeRRR опубликован 07-02-2002 21:52 MSK     Click Here to See the Profile for ValeRRR  Click Here to Email ValeRRR     
мне кажется эту задачу можно решить без выделения памяти и буферов. Есть в Сях простая функция getc() или getch() возвращает символ введенный с консоли. так вот нужно их в цикле вызывать пока не прийдет символ '\n' и считать количество символов. ну и соответственно запоминать самый большой счетчик
rivitna опубликован 07-02-2002 22:47 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
Если нельзя в памяти, сделай на диске:

Работай с двумя файлами, допустим max и temp.
С помощью getc и fputc считывай строку в temp.
Ну и далее, если длина temp больше длины max, то temp скопировать в max (или переименовать файл - сам придумай).
В конце просто выведи содержимое файла max

barrettau опубликован 07-02-2002 23:40 MSK     Click Here to See the Profile for barrettau  Click Here to Email barrettau     
Спасибо всем за ответы.
Идея с использованиями файлов очень интересная.

П.С. 2ValeRRR Ты не совсем понял, задача была выдавать максимальную строку а не ее длину.
То что ты описал это оригинальный алгоритм проги которую требовалось модернизировать.

Drunkard опубликован 08-02-2002 03:46 MSK     Click Here to See the Profile for Drunkard  Click Here to Email Drunkard     
Так ничё и не приснилось. :)
А если файлы устраивают, то и флаг тебе в руки!
server_mouse опубликован 08-02-2002 15:28 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
FILE *fopen(.....)

А чё такое FILE со звёздочкой???
Чё за звезда я спрашиваю???
Какой в жопу указатель?! Не знаю я никаких указателей!

SUnteXx опубликован 08-02-2002 16:05 MSK     Click Here to See the Profile for SUnteXx  Click Here to Email SUnteXx     
2server_mouse:
FILE * - HFILE или Handle на File или указатель на файл! А что тут не понять и причем здесь это? НЕ про это ж этот топик!
barrettau опубликован 09-02-2002 19:35 MSK     Click Here to See the Profile for barrettau  Click Here to Email barrettau     
2Drunkard Идея с файлами конечно не то что я искал для решения этой задачи.
Поскольку задачку надо(по книге) решать базовыми операторами(которые описаны до этой главы в книге), так что я думаю должно быть еще одно решение, и намного простое.

А насчет идеи файлов она просто показалась мне интересной на будушее.

П.С. Задача взята с книги "Язык програмирования С"(Кернихан Ритчи)
Третие издание.
Задача под номером 1.16
Я привел это для тех кому будет интересно.

dvorobjov опубликован 09-02-2002 20:12 MSK     Click Here to See the Profile for dvorobjov  Click Here to Email dvorobjov     
Как можно оперировать строками без указателей, да к тому же еще и без ограничения на размер. Я думаю что barrettau неверно понял задачу: наверное нельзя пользоваться указателями для определения длины строки (? есть libная ф-ция!) а для ссылок на строку можно. В противном случае при передаче ее в какую либо ф-цию придется ее pushить в стек целиком. malloc здесь идеальное решение. На первом этапе отъедаешь mallocом памяти столько, чтобы на любую твою строку хватило, после копирования строки в эту память определяешь ее размер и делаешь realloc. Потом снова malloc. и т.д. и т.п.
Без указателей эта задача смысла, кроме как поставить программиста в тупик, не имеет.
ValeRRR опубликован 09-02-2002 21:45 MSK     Click Here to See the Profile for ValeRRR  Click Here to Email ValeRRR     
2barrettau
Специально поднял первоисточник. В моем варианте K&R 16 упражнение выглядит следующим образом:
Упражнение 1-16.
Напишите программу, которая будет удалять из каждой
строки стоящие в конце пробелы и табуляции, а также строки,
целиком состоящие из пробелов.

Напиши после какой главы ты эту задачу нашел

SUnteXx опубликован 10-02-2002 01:36 MSK     Click Here to See the Profile for SUnteXx  Click Here to Email SUnteXx     
Точно не знаю вопроса, но мне кажется, что если у нас есть текст, то просто самому искать символа аля "\0" "\r" "\n", считая сколько символов до этого было с конца прошлой строки. Найдя номер самой длинной строки ищем ее начало и ее конец, копируем, ... Я так на файлом настроек в своей проге делаю, причем много чего еще со строками делаю, но строки нахожу только так! Иначе не знаю как:(
server_mouse опубликован 10-02-2002 19:37 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
Лана, забили на FILE*....
А как мы записываем в файл? А читаем из него? Нука, попробуйте-ка без указателей? Ничегошеньки не получится:
fwrite(void* buffer, .....
Как не пытайся, а передать тебе придётся АДРЕС, он же УКАЗАТЕЛЬ.
Вопрос ведь был "как не используя УКАЗАТЕЛИ". Т.е. IMHO в тексте программы напрочь должны отсутствовать выражения типа buffer*, &buffer, а не просто динамическое распределение памяти. С использованием файлов, от указателей избавится "impossible mr. Karabasov!"(c).
rivitna опубликован 10-02-2002 20:16 MSK     Click Here to See the Profile for rivitna  Click Here to Email rivitna     
Special for server_mouse:

Дубль 2:
"Работай с двумя файлами, допустим max и temp.
С помощью getc и fputc считывай строку в temp.
Ну и далее, если длина temp больше длины max, то temp скопировать в max (или переименовать файл - сам придумай).
В конце просто выведи содержимое файла max"

server_mouse опубликован 10-02-2002 23:13 MSK     Click Here to See the Profile for server_mouse  Click Here to Email server_mouse     
2rivitna: Лана, согласен. Недогнал....

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.