Язык программирования Си


         

Хрестоматия по программированию на Си в Unix- часть 321


- 321 - Си в UNIX

main(){ char ch; /* 0377 - код последнего символа алфавита ASCII */ for (ch = 0100; ch <= 0377; ch++ ) printf( "%03o %s\n", ch & 0377, ch >= 0300 && ch < 0340 ? "yes" : "no" ); }

Какие неприятности ждут нас здесь? - во-первых, когда бит 0200 у ch установлен, в сравнении ch выступает как отрица-

тельное целое число (т.к. приведение к int делается расширением знакового бита), то есть у нас всегда печатается "no". Это мы можем исправить, написав unsigned char ch, либо используя ch в виде

(ch & 0377) или ((unsigned) ch)

- во-вторых, рассмотрим сам цикл. Пусть сейчас ch =='\377'. Условие ch <= 0377 истинно. Выполняется оператор ch++. Но ch - это байт, поэтому операции над ним производятся по модулю 0400 (0377 - это максимальное значение, которое можно хранить в байте - все биты единицы). То есть теперь значением ch станет 0. Но 0 < 0377 и условие цикла верно! Цикл продолжается; т.е. происходит зациклива- ние. Избежать этого можно только описав int ch; чтобы 0377+1 было равно 0400, а не 0 (или unsigned int, лишь бы длины переменной хватало, чтобы вместить число больше 0377).

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

слово один. слово два. --> Слово один. Слово два.

Эта программа может оказаться полезной для преобразования текста, набранного в одном регистре, в текст, содержащий буквы обоих регистров.

7.52. Напишите программу, исправляющую опечатки в словах (spell check): программе задан список слов; она проверяет - является ли введенное вами слово словом из списка. Если нет - пытается найти наиболее похожее слово из списка, причем если есть нес- колько похожих - выдает все варианты. Отлавливайте случаи: - две соседние буквы переставлены местами: ножинцы=>ножницы; - удвоенная буква (буквы): ккаррандаш=>карандаш; - потеряна буква: бот=>болт; - измененная буква: бинт=>бант; - лишняя буква: морда=>мода; - буквы не в том регистре - сравните с каждым словом из списка, приводя все буквы к маленьким: сОВОк=>совок;

Надо проверять каждую букву слова. Возможно вам будет удобно использовать рекурсию. Подсказка: для некоторых проверок вам может помочь функция match:

слово_таблицы = "дом"; if(strlen(входное_слово) <= strlen(слово_таблицы)+1 && match(входное_слово, "*д*о*м*") ... /* похоже */ *о*м* ?дом дом? *д*м* д?ом *д*о* до?м

Приведем вариант решения этой задачи:




Содержание  Назад  Вперед