2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Упражнение из Кернигана-Ритчи
Сообщение21.07.2012, 13:26 
Аватара пользователя
Напишите программу для вывода всех строк входного потока, имеющих длину более 80 символов.

Это задание было после приведенного образца в книге, но я немного переделал его (пусть длина будет не 80, а 10 символов). Переделывание получилось слишком примитивным, то есть такое
код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <stdio.h>
#include <conio.h>

#define MAXLINE 1000

int getline(char line[], int maxline);
void copy(char to[], char from[]);

int main()
{
    int len;
    char line[MAXLINE];
    char longest[MAXLINE];            
   
    while ((len = getline(line, MAXLINE)) > 0)
          if (len > 10) {
             copy(longest, line);
             printf("%s", longest);
             }
   
    getch();
    return 0;
}
    /*описание функций*/
int getline(char s[], int lim)
{
    int c, i;      
    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
        s[i] = c;
    if (c == '\n') {
          s[i] = c;
          ++i;
          }
    s[i] = '\0';
    return i;
}

void copy(char to[], char from[])
{
     int i;
     i = 0;
     while((to[i] = from[i]) != '\0')
                  ++i;
}

Как сделать так, чтобы искомые строки вывелись у меня после того как их всех ввел? У меня как бы есть идея такая, чтобы создать функцию, которая сохраняла бы строки, длины которых больше 10, но вот вопрос, куда она будет сохранять эти строки? ведь строки это массивы, тогда мне надо куда-то сохранять массивы... или это уже дебри?

 
 
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение21.07.2012, 13:48 
Аватара пользователя

(Оффтоп)

У меня к вам личный совет. Керниган и Ричи - плохая книжка для изучения Си. В своё время она была хорошей. Сейчас сильно устарела. Долгое время она была "золотой" как справочник, описывающий стандартный вариант языка. Сейчас уже и эта её роль закончилась. Читая её, вы будете спотыкаться на нюансах, которые почти заведомо потом не понадобятся.


Dosaev в сообщении #597488 писал(а):
ведь строки это массивы, тогда мне надо куда-то сохранять массивы...

Для этого используются массивы массивов (в других языках они часто называются многомерными массивами). Скорее всего, в книге это ещё впереди.

 
 
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение21.07.2012, 14:00 
Аватара пользователя

(Оффтоп)

Тогда что вы можете посоветовать? Дело в том, она мне тоже не слишком нравится, но другого варианта изучения я не вижу, многие мне советовали эту книгу, говорили что она наоборот лучшая.

 
 
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение21.07.2012, 14:56 
Аватара пользователя
Dosaev в сообщении #597502 писал(а):
многие мне советовали эту книгу, говорили что она наоборот лучшая.

Она "лучшая" в объяснении концептуальных основ - что такое функции, массивы, и т. п. И то, не выдающаяся, а просто одна из середнячков. Традиционно уважаемая.

Dosaev в сообщении #597502 писал(а):
Тогда что вы можете посоветовать?

Пойти в ближайший крупный книжный. Найти там полку с учебниками C/C++ (если они занимают меньше полки, книжный недостаточно крупный). Выбрать самые начальные учебники, обращая внимание на те, которые предназначены для стандартного изучения в вузе. Какие это будут конкретные учебники в случае вашего книжного - предугадать не могу.

В русской Википедии предлагается такая литература:
Герберт Шилдт. C: полное руководство, классическое издание = C: The Complete Reference, 4th Edition. — М.: Вильямс, 2010. — С. 704. — ISBN 978-5-8459-1709-6
Прата С. Язык программирования С: Лекции и упражнения = C Primer Plus. — М.: Вильямс, 2006. — С. 960. — ISBN 5-8459-0986-4
Кочан С. Программирование на языке Си = Programming in C. — 3-е изд. — М.: Вильямс, 2006. — С. 496. — ISBN 0-672-32666-3
Гукин Д. Язык программирования Си для «чайников» = C For Dummies. — М.: Диалектика, 2006. — С. 352. — ISBN 0-7645-7068-4
По крайней мере, Шилдт и Прата - известные мне фамилии, должны быть нормальные учебники.

 
 
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение21.07.2012, 20:44 
Аватара пользователя
Спасибо за ваши советы и мнение. Я слышал, что Шилдт трудноват для начала, а вот Стивен Прата самый раз и он у меня есть в электронном виде. :wink:. Но я решил все-таки начать с классики. Пусть будет не в духе современности, но мне нужны лишь основы и понимание. Тем более я нашел решебник! -> http://clc-wiki.net/wiki/K%26R2_solutions

 
 
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение22.07.2012, 17:21 
Аватара пользователя
Это вам рано. Строка это масив символов. Причем строковые функции в Си прежпологают что строка заканчивается на ноль(символ численно равен 0, а не коду символа "0") Ноль в конце необходим чтобы измерить длину строки. Ты можешь в один большой массив симводов записать несколько строк. Чтобы обозначить конец массива строк можно опять таки использовать 0. Так у тебя в конце будет идти подряд два 0. Один отвечает за конец последней строкт второй отвечает за конец массива строк. Не лучший вариант. Но для примера сойдёт. Далее тебе надо будет изучать указатели. А после динамическую память. Сейчас так никто непишет в виду того что программисты неправильно рассчитывают длину под строки и вечно забывают про 0 в конце строки(особенно после выполнения конкатинации строк).

Ещё тебе надо уяснить несколбко веще
й.

 
 
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение22.07.2012, 22:56 
Аватара пользователя
Pavia в сообщении #597951 писал(а):
Ещё тебе надо уяснить несколбко веще
й.

эм, каких это?

 
 
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение23.07.2012, 09:41 
Pavia в сообщении #597951 писал(а):
Так у тебя в конце будет идти подряд два 0. Один отвечает за конец последней строкт второй отвечает за конец массива строк. Не лучший вариант.

И это ещё очень мягко сказано. Что делать с пустыми строками?...

 
 
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение23.07.2012, 19:44 
Pavia в сообщении #597951 писал(а):
Сейчас так никто непишет в виду того что программисты неправильно рассчитывают длину под строки и вечно забывают про 0 в конце строки(особенно после выполнения конкатинации строк).

То, что не пишут — это вы больно оптимистичны.

Но все-таки действительно, ASCIIZ строки — один из самых неудачных способов хранить строку.

 
 
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение23.07.2012, 21:44 
Аватара пользователя
Joker_vD в сообщении #598367 писал(а):
Но все-таки действительно, ASCIIZ строки — один из самых неудачных способов хранить строку.

В свете современных взглядов на программирование. А в том контексте, в котором он появился, напротив, один из самых удачных.

 
 
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение23.07.2012, 23:00 
Munin
Ну да, процессор PDP-7 умел с этими строками работать. Но чем они хороши-то? Добавим лишний байт, и вот есть как-бы-паскалевская строка, которая может держать до 64 К символов, для которой сложность strlen$O(1)$, а не $O(n)$. Ладно, что уж сейчас спорить.

 
 
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение23.07.2012, 23:21 
Аватара пользователя
Joker_vD в сообщении #598454 писал(а):
Ну да, процессор PDP-7 умел с этими строками работать.

И Intel 8086 умел.

Joker_vD в сообщении #598454 писал(а):
Но чем они хороши-то?

Почти абсолютной переносимостью. Ни от порядка байтов в слове не зависит, ни от соглашения о длине слова, ни от других соглашений о формате хранения. Когда-то это было важно. Сейчас об этом только самые низкоуровневые телекоммуникационщики беспокоятся.

 
 
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение23.07.2012, 23:26 
Ну сделать
Используется синтаксис C
struct pString {
  char *string;
  size_t length;
};
И свой вагон pStrcpy, pStrlen и так далее. Правда, потерять возможность использовать указатели напрямую, чтобы неявно резать строки.

Си всё же низкоуровневый язык, синтаксическая поддержка тоже низкоуровневая. Если надо какие-то высокоуровневые прибамбахи — надо платить объёмом кода и сложностью использования низкоуровневого кода вместе с высокоуровневым.

 
 
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение24.07.2012, 06:38 
Аватара пользователя
Надо различать 2 способа представления строк. Это внутренний формат и внешний. Внешний это формат передачи такой как uTf-8. А внутренний это формат удобный для машинной обработки. Такой как Unicode windows.
Так вот ASCIIZ это что то среднее. А поэтому плохо пригодно везде. Нет явного указания на размер символа и порядок бит. Поэтому он плохо переносим надо стыковать каждое устройство с каждим. Что касается обработки таких строк, то если для барабана с лентой 0 это хорошо то для RAM(память с произвольным доступом) плохо. При разработки дельфи поступили правильно учтя обе особенности.

На старых машинах не была байта было машинное слово. И слово это было разной длинной 4,7,8,10,11,12,17,18 бит итд . А теперь попробуйте перенести код с одной машины на другую. В Си размер Char не определён. Код перенести просто, а вот данные уже сложнее.

 
 
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение24.07.2012, 15:14 
Аватара пользователя
Pavia в сообщении #598514 писал(а):
Нет явного указания на размер символа и порядок бит.

Эти детали выясняются ещё на уровне ASCII, вместе с контрольными битами и прочая. Когда соединение ACSII установлено, заботиться о них больше нет нужды.

 
 
 [ Сообщений: 15 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group