Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Язык Си Керниган, Ричи

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4

Открыть новую тему     Написать ответ в эту тему

woffer

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1-22
>работа с текстом  
 
1-23
>1-22
>работа со стеком
 
S Leha ты просил намекнуть, боюсь лишнее писать

Всего записей: 935 | Зарегистр. 11-10-2002 | Отправлено: 22:59 06-08-2003
mymuss



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору

Цитата:
А ПМ это где?  

Вверху ссылка "Личный ящик"
 
PS: Кстати, у меня когда-то тоже возник этот вопрос Почему именно ПМ, а не ЛЯ? Private Messanging что ли...
 

Цитата:
Объясните мне вот эти упражнения. Мне не понятно само задание

1) Табуляция
Когда нажимаешь на клаве "TAB", оно отправляет специальный символ, который в функциях типа printf итд можно указывать при помощи \t
Исторически сложилось, что этот символ часто соответствует отступу на 8 символов (особенно в разных текстовых редакторах)
НО: тут подразумевают, что \t не всегда именно 8 символов, но всегда "выравнивает" текст по столбцу с номером кратным 8. Блин, хреновый из меня объяснятель
Короче пример: "123456789\t0" будет выглядеть так: "123456789       0" (пробелов 7, а не 8, потому что иначе было бы 9 цифр + 8 пробелов = 17 символов, не кратно 8)
 
2) "Сгибание"
Наверное, имелось ввиду wordwrap. Т.е. надо сделать переносы по словам (как в ворде).

----------
(a + b^n) / n = x, donc Dieu existe; répondez !
Euler

Всего записей: 709 | Зарегистр. 13-04-2003 | Отправлено: 05:00 07-08-2003 | Исправлено: mymuss, 05:13 07-08-2003
S Leha



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Все таки не могу я понять, что нужно сделать (DETAB). Объясните.

Всего записей: 108 | Зарегистр. 02-07-2003 | Отправлено: 22:32 09-08-2003
woffer

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
S Leha
Насколько я правильно понял (имхо криво написано ), нужно следущее
 
если ты вводишь "\t1234\t5",
должно получиться следущее: [8 пробелов]1234[4 пробела]5
то есть все '\t' должны оканчиваться на границе, кратной N (обычно 8, но не обязательно)
первый \t полный, ибо 8 кратно N;
второй - нет, потомучто 8+4+8=20 не кратно N, следовательно, отрезаем от него 4 пробела.

Всего записей: 935 | Зарегистр. 11-10-2002 | Отправлено: 00:18 10-08-2003
S_Leha



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Перенос строк, Detab, Entab я сделал.
А вот эти не могу.
 
Упражнение 1.23. Напишите программу, убирающую все комментарии из любой Си-    программы. Не забудьте должным образом обработать строки символов и строковые константы. Комментарии в Си не могут быть вложены друг в друга.  
 
Упражнение 1.24. Напишите программу, проверяющую Си-программы на элементарные синтаксические ошибки вроде несбалансированности скобок всех видов. Не забудьте о кавычках (одиночных и двойных), эскейп-последовательностях (\...) и комментариях. (Это сложная программа, если писать ее для общего случая.)  
 
Разве можно программой редактировать исходный текст?

Всего записей: 108 | Зарегистр. 02-07-2003 | Отправлено: 21:41 19-08-2003
BugFixer

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
S_Leha

Цитата:
Упражнение 1.23. Напишите программу, убирающую все комментарии из любой Си-    программы. Не забудьте должным образом обработать строки символов и строковые константы. Комментарии в Си не могут быть вложены друг в друга.  

1. Открываешь на чтение внешний файл, который будет правиться. Назовём его "вход".
2. Открываешь на запись ещё один внешний файл, в который будет писать исправленое. Назовём его "выход". (В принципе, это может быть один и тот же файл, но для начала сделай разные.)
3. Начинаешь читать "вход" байт за байтом, отыскивая комментарии. Пока не комментарий, прочитаный байт пишешь в "выход". Прочитал - проверил - записал.
3.1. Нашли комментарий типа "//" - перестаём писать то, что до конца строки. Т.е. вычитываем по прежнему, но ничего не пишем. При этом нам глубоко по барабану, какие символы там встретились, если это не конец строки. Нашли конец строки - записали его в "выход". Режим поиска изменили на поиск комментария. Опять же, не комментарий - прочитаный байт пишешь в "выход".  
3.2. Нашли комментарий типа "/*" Всё то же самое, но ищем не конец строки, а последовательность "*/" - "закрывающую скобку" При этом радостно пропускаем комментарии типа "//"и " /*" - они нас ничуть не интересуют!
3.3. Единственное исключение во всём этом - неожиданный конец файла "вход" (комментарий не закрыт - надо ругнуться!)
4. Добрели до конца файла "вход". Закрываем оба файла. Победа!
5. Открой файл "выход" и тщательно проверь.
 

Цитата:
Упражнение 1.24. Напишите программу, проверяющую Си-программы на элементарные синтаксические ошибки вроде несбалансированности скобок всех видов. Не забудьте о кавычках (одиночных и двойных), эскейп-последовательностях (\...) и комментариях. (Это сложная программа, если писать ее для общего случая.)  

По сути то же самое, что и комментарии "/*" и "*/". Только скобки бывают разные (сбалансированность надо проверять раздельно для каждого вида скобок и более тщательно расписывать, что у нас есть скобка )

Всего записей: 482 | Зарегистр. 02-08-2003 | Отправлено: 06:40 20-08-2003
albatros



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
S_Leha
У меня есть "The C Programming Language", 2nd edition, Kernighan and Ritchie Answers to Exercises, там есть решения для всех упражнений. Если надо, могу скинуть тебе на мыло, сабж маленький. Но лучше пользуйся им только когда сам все перепробовал и не получается все равно, а то пользы будет мало. Кроме того, одну и ту же задачу можно решить по разному: они решили так, ты можешь решить по другому.

Всего записей: 512 | Зарегистр. 28-12-2002 | Отправлено: 14:09 20-08-2003
S_Leha



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
BugFixer
Принцип я понял(за что спасибо), а вот
 
Цитата:
1. Открываешь на чтение внешний файл, который будет правиться. Назовём его "вход".  
2. Открываешь на запись ещё один внешний файл, в который будет писать исправленое. Назовём его "выход".

нет. Во всем том, что я прочел до этих заданий не было объяснений о работе с 2мя файлами.
 
albatros  
Если пришлешь, буду благодарен.  
Загляни в Личный ящик.
 
 
 

Всего записей: 108 | Зарегистр. 02-07-2003 | Отправлено: 20:03 20-08-2003
albatros



Full Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
S_Leha

Цитата:
albatros  
Если пришлешь, буду благодарен.  
Загляни в Личный ящик.

Послал на указанный адрес.
 
Добавлено
Кстати, в топике, где ты спрашивал о BCC 5.5 написано кам им пользоваться и как настроить http://forum.ru-board.com/topic.cgi?forum=33&bm=1&topic=1861#1

Всего записей: 512 | Зарегистр. 28-12-2002 | Отправлено: 20:12 20-08-2003
BugFixer

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
S_Leha

Цитата:
Принцип я понял(за что спасибо)

Замечательно!  
 

Цитата:
нет. Во всем том, что я прочел до этих заданий не было объяснений о работе с 2мя файлами.  

Да не важно, файлы или что ещё. Просто в случае, когда нужно внести изменения во что-то, есть последовательность байт, которую читаешь, а есть в общем-то другая последовательность, которую пишешь. В нашем случае длина последовательности, которую пишем, не больше той, которую читаем. (Они равны в случае отсутствия коментариев в исправляемом тексте). Поэтому можно писать в один и тот же поток (массив, буфер, файл - не суть важно). Но возможны случаи, когда на 1 прочитаный байт приходится записывать несколько (>1), и тогда запись в тот же массив уже опасна: мы можем потереть (т.е. исказаить) ещё не прочитаные байты.
 
А чем тебя так пугает работа с файлами?  
 
Ну и ладно! Давай представим, что это просто char b[2048], в который каким-то неинтересным в данный момент способом некто написал текст програмы, которую надо исправить  И - вперёд!

Всего записей: 482 | Зарегистр. 02-08-2003 | Отправлено: 06:51 21-08-2003
mymuss



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Глупый вопрос не совсем в тему (дабы не плодить топики).
 

Цитата:
 
For safety, programmers should use the snprintf() interface instead.  Unfortunately, this interface is not portable.
 

(man 3 snprintf (FreeBSD 4.8))
 
Если честно, я до недавнего времени думал что snprintf() входит в стандарт и использовал ее везде. Выходит, не совсем так Отсюда вопрос, какие распространенные реализации ее не поддерживают?
И вообще, что собственно делать? Может, ее можно найти отдельно?

----------
(a + b^n) / n = x, donc Dieu existe; répondez !
Euler

Всего записей: 709 | Зарегистр. 13-04-2003 | Отправлено: 07:16 21-08-2003
Bloody_Nokia_Adept



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mymuss

Цитата:
Если честно, я до недавнего времени думал что snprintf() входит в стандарт и использовал ее везде.

И правильно делал!

Цитата:
ISO/IEC 9899:1999 (E)


Цитата:
7.19.6.6 The sprintf function
Synopsis
1 #include <stdio.h>
int sprintf(char * restrict s,
const char * restrict format, ...);
Description
2 The sprintf function is equivalent to fprintf, except that the output is written into
an array (specified by the argument s) rather than to a stream. A null character is written
at the end of the characters written; it is not counted as part of the returned value. If
copying takes place between objects that overlap, the behavior is undefined.
Returns
3 The sprintf function returns the number of characters written in the array, not
counting the terminating null character, or a neg ative value if an encoding error occurred.

Так что это проблемы

Цитата:
(man 3 snprintf (FreeBSD 4.8))

а никак не твоего кода, который использует стандартные функции.

Всего записей: 785 | Зарегистр. 27-11-2002 | Отправлено: 18:38 21-08-2003
mymuss



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Bloody_Nokia_Adept

Цитата:
я до недавнего времени думал что snprintf()  

 
Меня в snprintf() прет то, что какой-бы формат ей не подсунули, она возвращает кол-во символов, которое оно бы напечатало, если бы приемник был бесконечным. Это круто.


----------
(a + b^n) / n = x, donc Dieu existe; répondez !
Euler

Всего записей: 709 | Зарегистр. 13-04-2003 | Отправлено: 19:04 21-08-2003
Bloody_Nokia_Adept



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mymuss

Подслеповат стал на старости лет...  
snprintf, так snprintf - получайте!

Цитата:
7.19.6.5 The snprintf function
Synopsis
1 #include <stdio.h>
int snprintf(char * restrict s, size_t n,
const char * restrict format, ...);
Description
2 The snprintf function is equivalent to fprintf, except that the output is written into
an array (specified by argument s) rather than to a stream. If n is zero, nothing is written,
and s may be a null pointer. Otherwise, output characters beyond the n-1st are
discarded rather than being written to the array, and a null character is written at the end
of the characters actually written into the array. If copying takes place between objects
that overlap, the behavior is undefined.
Returns
3 The snprintf function returns the number of characters that would have been written
had n been sufficiently large, not counting the terminating null character, or a neg ative
value if an encoding error occurred. Thus, the null-terminated output has been
completely written if and only if the returned value is nonnegative and less than n.

Вот и подтверждение твоих слов в п. 3

Всего записей: 785 | Зарегистр. 27-11-2002 | Отправлено: 19:19 21-08-2003
mymuss



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Bloody_Nokia_Adept
А есть линк на первоисточник? (ISO/IEC 9899:1999 (E) )?

----------
(a + b^n) / n = x, donc Dieu existe; répondez !
Euler

Всего записей: 709 | Зарегистр. 13-04-2003 | Отправлено: 04:25 22-08-2003
Bloody_Nokia_Adept



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
mymuss

Цитата:
А есть линк на первоисточник? (ISO/IEC 9899:1999 (E) )?

Вот страница скачки (там есть и другие стандарты )
Клуб программистов Весельчак У

Всего записей: 785 | Зарегистр. 27-11-2002 | Отправлено: 10:29 22-08-2003
S_Leha



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Опять застрял. Дошел до главы "2.9 Побитовые операторы". Здесь я вообще ничего не понял. Конечно сообразить что ...& - это побитовое И... или ... ^ - это побитовое исключающее ИЛИ...  можно. Но вот понять как это работает и как это выглядит в тексте, программе я не могу. Мне нужно это как то разжувать, объяснить или показать на примере что ли. Непонятны мне вот эти операторы:
&
|
^
<<
>>
~
 
На всяк помещу саму главу:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
 
 2.9 Побитовые операторы
В Си имеются шесть операторов для манипулирования с битами. Их можно применять только к целочисленным операндам, т. е. к операндам типов char, short, int и long, знаковым и беззнаковым.  
 
& - побитовое И
| - побитовое ИЛИ
^ - побитовое исключающее ИЛИ.  
<< - сдвиг влево.  
>> - сдвиг вправо.
~ - побитовое отрицание (унарный).
 
Оператор & (побитовое И) часто используется для обнуления некоторой группы разрядов. Например  
 
n = n & 0177;
 
обнуляет в n все разряды, кроме младших семи.  
 
Оператор | (побитовое ИЛИ) применяют для установки разрядов; так,  
 
x = x | SET_ON;
 
устанавливает единицы в тех разрядах x, которым соответствуют единицы в SET_ON.  
 
Оператор ^ (побитовое исключающее ИЛИ) в каждом разряде установит 1, если соответствующие разряды операндов имеют различные значения, и 0, когда они совпадают.  
 
Поразрядные операторы & и | следует отличать от логических операторов && и ||, которые при вычислении слева направо дают значение истинности. Например, если x равно 1, а y равно 2, то x & y даст нуль, а x && y - единицу.  
 
Операторы << и >> сдвигают влево или вправо свой левый операнд на число битовых позиций, задаваемое правым операндом, который должен быть неотрицательным. Так, x << 2 сдвигает значение x влево на 2 позиции, заполняя освобождающиеся биты нулями, что эквивалентно умножению x на 4. Сдвиг вправо беззнаковой величины всегда сопровождается заполнением освобождающихся разрядов нулями. Сдвиг вправо знаковой величины на одних машинах происходит с распространением знака ("арифметический сдвиг”), на других - с заполнением освобождающихся разрядов нулями ("логический сдвиг”).  
 
Унарный оператор ~ поразрядно "обращает” целое т. е. превращает каждый единичный бит в нулевой и наоборот. Например  
 
x = x & ~077
 
обнуляет в x последние 6 разрядов. Заметим, что запись x & ~077 не зависит от длины слова, и, следовательно, она лучше, чем x & 0177700, поскольку последняя подразумевает, что x занимает 16 битов. Не зависимая от машины форма записи ~077 не потребует дополнительных затрат при счете, так как ~077 - константное выражение, которое будет вычислено во время компиляции.  
 
Для иллюстрации некоторых побитовых операций рассмотрим функцию getbits(x, p, n), которая формирует поле в n битов, вырезанных из x, начиная с позиции p, прижимая его к правому краю. Предполагается, что 0-й бит - крайний правый бит, а n и p- осмысленные положительные числа. Например, getbits(x,4,3) вернет в качестве результата 4, 3 и 2-й биты значения x, прижимая их к правому краю. Вот эта функция:  
 
/* getbits: получает n бит, начиная с p-й позиции */
unsigned getbits(unsigned x, int p, int n)
{
    return (x >> (p+1-n)) & ~(~0 << n);
}
 
Выражение x >> (р+1-n) сдвигает нужное нам поле к правому краю. Константа ~0 состоит из одних единиц, и ее сдвиг влево на n бит (~0 << n) приведет к тому, что правый край этой константы займут n нулевых разрядов. Еще одна операция побитовой инверсии ~ позволяет получить справа n единиц.  
 
 

Всего записей: 108 | Зарегистр. 02-07-2003 | Отправлено: 22:02 24-08-2003 | Исправлено: S_Leha, 22:04 24-08-2003
mymuss



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
S_Leha
У тебя проблемы не с С, а с математикой (тут в каком-то соседнем топике мне еще втирали что программисту математика не нужна).
 
Я, к сожалению, не знаю какие сейчас есть хорошие книги. Из старого (найденного в своих залежах) могу лишь посоветовать:
1) Касаткин В.Н. Введение в кибернетику. К., Рад. Шк. 1986., (Глава 1,2,3).
2) Лавров С.С. Введение в программирование. М., Наука, 1977 (Глава 3, 11, в остальном книга так себе).
3) Еще есть Том Сван "Освоение Turbo Assembler", Там в Главе 3 очень кратко и доступно объясняется двоичная арифметика. Там буквально 7 страниц, все остальное тебе никогда не пригодится, так что покупать ее не стоит, а вот отксерить у кого-нибудь можно.
4) Ну и практически любые книги по дискретной математике в которых есть глава про булевы функции.

----------
(a + b^n) / n = x, donc Dieu existe; répondez !
Euler

Всего записей: 709 | Зарегистр. 13-04-2003 | Отправлено: 01:20 25-08-2003
BugFixer

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
S_Leha

Цитата:
n = n & 0177;  

 
Пусть n == 367 например.
 
Давай посмотрим x = n & 0xff  (255 ):
 
101101111   // n
011111111  // 0xff
========
001101111  // 0x6f
 
Итого x  == 111 (или 0x6f)
 
Примерно то же и с остальными  - матлогика в полный рост!

Всего записей: 482 | Зарегистр. 02-08-2003 | Отправлено: 13:35 25-08-2003 | Исправлено: BugFixer, 13:37 25-08-2003
mymuss



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
BugFixer

Цитата:
Примерно то же и с остальными   - матлогика в полный рост!

угу...
 
только одно "но": с матлогикой мало общего... матлогика посложнее будет. как вспомню все эти теории первого порядка... жуть.

----------
(a + b^n) / n = x, donc Dieu existe; répondez !
Euler

Всего записей: 709 | Зарегистр. 13-04-2003 | Отправлено: 15:33 25-08-2003
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Язык Си Керниган, Ричи


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru