2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Упражнение из Кернигана-Ритчи
Сообщение21.07.2012, 13:26 
Аватара пользователя


26/02/11
332
Напишите программу для вывода всех строк входного потока, имеющих длину более 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 
Заслуженный участник
Аватара пользователя


30/01/06
72407

(Оффтоп)

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


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

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

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


26/02/11
332

(Оффтоп)

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

 Профиль  
                  
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение21.07.2012, 14:56 
Заслуженный участник
Аватара пользователя


30/01/06
72407
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 
Аватара пользователя


26/02/11
332
Спасибо за ваши советы и мнение. Я слышал, что Шилдт трудноват для начала, а вот Стивен Прата самый раз и он у меня есть в электронном виде. :wink:. Но я решил все-таки начать с классики. Пусть будет не в духе современности, но мне нужны лишь основы и понимание. Тем более я нашел решебник! -> http://clc-wiki.net/wiki/K%26R2_solutions

 Профиль  
                  
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение22.07.2012, 17:21 
Аватара пользователя


31/10/08
1244
Это вам рано. Строка это масив символов. Причем строковые функции в Си прежпологают что строка заканчивается на ноль(символ численно равен 0, а не коду символа "0") Ноль в конце необходим чтобы измерить длину строки. Ты можешь в один большой массив симводов записать несколько строк. Чтобы обозначить конец массива строк можно опять таки использовать 0. Так у тебя в конце будет идти подряд два 0. Один отвечает за конец последней строкт второй отвечает за конец массива строк. Не лучший вариант. Но для примера сойдёт. Далее тебе надо будет изучать указатели. А после динамическую память. Сейчас так никто непишет в виду того что программисты неправильно рассчитывают длину под строки и вечно забывают про 0 в конце строки(особенно после выполнения конкатинации строк).

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

 Профиль  
                  
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение22.07.2012, 22:56 
Аватара пользователя


26/02/11
332
Pavia в сообщении #597951 писал(а):
Ещё тебе надо уяснить несколбко веще
й.

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

 Профиль  
                  
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение23.07.2012, 09:41 
Заслуженный участник


11/05/08
32166
Pavia в сообщении #597951 писал(а):
Так у тебя в конце будет идти подряд два 0. Один отвечает за конец последней строкт второй отвечает за конец массива строк. Не лучший вариант.

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

 Профиль  
                  
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение23.07.2012, 19:44 
Заслуженный участник


09/09/10
3729
Pavia в сообщении #597951 писал(а):
Сейчас так никто непишет в виду того что программисты неправильно рассчитывают длину под строки и вечно забывают про 0 в конце строки(особенно после выполнения конкатинации строк).

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

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

 Профиль  
                  
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение23.07.2012, 21:44 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Joker_vD в сообщении #598367 писал(а):
Но все-таки действительно, ASCIIZ строки — один из самых неудачных способов хранить строку.

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

 Профиль  
                  
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение23.07.2012, 23:00 
Заслуженный участник


09/09/10
3729
Munin
Ну да, процессор PDP-7 умел с этими строками работать. Но чем они хороши-то? Добавим лишний байт, и вот есть как-бы-паскалевская строка, которая может держать до 64 К символов, для которой сложность strlen$O(1)$, а не $O(n)$. Ладно, что уж сейчас спорить.

 Профиль  
                  
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение23.07.2012, 23:21 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Joker_vD в сообщении #598454 писал(а):
Ну да, процессор PDP-7 умел с этими строками работать.

И Intel 8086 умел.

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

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

 Профиль  
                  
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение23.07.2012, 23:26 


23/07/12
1
Ну сделать
Используется синтаксис C
struct pString {
  char *string;
  size_t length;
};
И свой вагон pStrcpy, pStrlen и так далее. Правда, потерять возможность использовать указатели напрямую, чтобы неявно резать строки.

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

 Профиль  
                  
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение24.07.2012, 06:38 
Аватара пользователя


31/10/08
1244
Надо различать 2 способа представления строк. Это внутренний формат и внешний. Внешний это формат передачи такой как uTf-8. А внутренний это формат удобный для машинной обработки. Такой как Unicode windows.
Так вот ASCIIZ это что то среднее. А поэтому плохо пригодно везде. Нет явного указания на размер символа и порядок бит. Поэтому он плохо переносим надо стыковать каждое устройство с каждим. Что касается обработки таких строк, то если для барабана с лентой 0 это хорошо то для RAM(память с произвольным доступом) плохо. При разработки дельфи поступили правильно учтя обе особенности.

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

 Профиль  
                  
 
 Re: Упражнение из Кернигана-Ритчи
Сообщение24.07.2012, 15:14 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Pavia в сообщении #598514 писал(а):
Нет явного указания на размер символа и порядок бит.

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group