Информационные системы и технологии

Перевод чисел из одной системы счисления в другую. Основы машинной арифметики с двоичными числами. Особенности сложения чисел в обратном и дополнительном кодах. Работа с операционной системой в режиме командной строки. Работа с массивами и строками.

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 31.01.2014
Размер файла 490,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

DEL [диск:][маршрут]имя_файла [/P]

ERASE [диск:][маршрут]имя_файла [/P]

Параметр [диск:][маршрут]имя_файла задает расположение файла или набора файлов для удаления. /P перед удалением файла выводит запрос на подтверждение.

Например, чтобы удалить файл PRINT1.TMP в каталоге OUT на диске C вы можете воспользоваться командой:

del c:\out\print1.tmp

О восстановлении удаленного файла рассказывается в описании команды UNDELETE, а об удалении каталога - в команде RMDIR. Об удалении каталога вместе с его файлами и всеми подкаталогами вы можете прочитать в описании команды DELTREE.

При указании параметра /P DEL выводит имя файла и подсказку с сообщением вида:

filename, Delete (Y/N)?

(имя_файла, удалить (Да/Нет)?)

Для подтверждения удаления нажмите Y, а для отмены и вывода следующего имени файла (при задании группы) - N. Нажатие CTRL+C останавливает работу DEL.

Набрав команду DEL с параметром [диск:]маршрут, вы можете удалить все файлы в каталоге. Чтобы удалить сразу несколько файлов, можно также использовать трафаретные символы (* и ?). Однако, чтобы избежать непреднамеренного удаления файлов, такой командой следует пользоваться внимательно. Сначала лучше дать команду DIR с теми же трафаретными символами и просмотреть список этих файлов. Команда del *.* приводитквыводунаэкранзапроса:

All files in directory will be deleted! Are you sure (Y/N)?

(Будут удалены все файлы в каталоге! Вы уверены (Да/Нет)?)

Чтобы удалить все файлы в текущем каталоге, нажмите Y и затем ENTER. Для отмены удаления - N и ENTER.

См. также команду UNDELETE.

Команда UNDELETE

Восстанавливает файлы, удаленные ранее по команде DEL. Команда UNDELETE предлагает три уровня защиты от непреднамеренного удаления.

UNDELETE [[диск:][маршрут]имя_файла] [/DT /DS /DOS]

UNDELETE [/LIST /ALL /PURGE[диск] /STATUS /LOAD /UNLOAD

/S[диск] /Tдиск[-записи]]

Параметр [диск:][маршрут]имя_файла задает расположение и имя файла или набора восстанавливаемых файлов. По умолчанию UNDELETE восстанавливает все удаленные файлы в текущем каталоге.

Параметр /LIST перечисляет удаленные файлы, которые можно восстановить, но не восстанавливает их. Получаемым листингом управляют параметры [диск:][маршрут]имя_файла и параметры /DT, /DS и /DOS.

/ALL восстанавливает удаленные файлы, не выводя для каждого файла запрос на подтверждение. UNDELETE использует три метода восстановления: DeleteSentry, DeleteTracker и стандартный (см. ниже). В последнем случае UNDELETE восстанавливает файлы из каталога DOS, подставляя в качестве первого символа имени файла (#). Если файл уже имеется, то используется один из следующих символов: #%&0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ (пока не будет получено уникальное имя).

UNDELETE не может восстановить удаленный каталог и файлы в нем. Однако, если это непосредственные подкаталоги корневого каталога, то можно использовать команду UNFORMAT для восстановления каталога, а затем команду UNDELETE для восстановления файлов в нем.

undelete d:\*.dat /all

Команда TYPE

Выводит на экран содержимое текстового файла. Используйте эту команду для вывода содержимого файла без его модификации.

TYPE [диск:][маршрут]имя_файла

Параметр [диск:][маршрут]имя_файла задает расположение и имя файла, который вы хотите просмотреть.

Если вы выводите на экран двоичный файл или файл, созданный программой, то можете увидеть "странные" символы, включая перевод формата и управляющие символы, которые представляют управляющие коды в двоичном файле. В общем случае следует этого избегать.

Команда PRINT

Печатает текстовый файл при использовании других команд MS-DOS. Данная команда работает в фоновом режиме при подключенном к параллельному или последовательному порту устройству вывода.

PRINT [/D:устройство] [/B:размер] [/Q:разм_оч] [/T]

[[диск:][маршрут]имя_файла[...]] [/C] [/P]

Для установки PRINT с параметрами по умолчанию или вывода на экран содержимого очереди печати дайте команду PRINT без параметров.

Параметр [диск:][маршрут]имя_файла задает расположение и имя файла или набора файлов, которые вы хотите напечатать. В одной команде вы можете задать до 10 файлов.

Параметр /D:устройство задает имя устройства печати. Для параллельных портов допускаются значения LPT1, LPT2 и LPT3, а для последовательных - COM1, COM2, COM3 и COM4. По умолчанию задается значение LPT1 (PRN). Параметр /D должен предшествовать в командной строке именам файлов.

/B:размер задает размер (в байтах) внутреннего буфера, который используется для записи данных перед выводом их на принтер. Минимальное значение - 512 (по умолчанию), максимальное - 16384. Увеличение данного значения уменьшает объем доступной памяти, но увеличивает скорость работы команды PRINT.

/Q:разм_оч задает максимальное число файлов в очереди печати. Допускаются значения от 4 до 32 (по умолчанию - 10).

Параметр /T удаляет все файлы из очереди печати.

Параметр /C удаляет файлы из очереди печати. Параметры /C и /P можно указывать в одной командной строке. Когда параметр /C указывается после списка имен файлов в командной строке, он применяется ко всем файлам, после которых указывается, пока PRINT не встречает параметр /P. В этом случае /P применяется к файлам, имена которых предшествуют /P.

Параметр /P добавляет файлы к очереди печати.

Параметры /D, /B, /U, /M, /S и /Q можно задавать только при первом использовании команды PRINT после запуска MS-DOS. Чтобы задать один из этих параметров в последующем, нужно перезапустить MS-DOS.

Для печати файлов, созданных программой, следует пользоваться командами печати этой программы.

По команде print без параметров MS-DOS выводит на экран имя печатаемого файла (если он имеется), имена файлов в очереди и возможное сообщение об ошибке.

Следующая команда удаляет из очереди файл file1.txt и добавляет к очереди file2.txt:

print file1.txt /c file2.txt /p

Команды работы с каталогами

Команда DIR

Выводит список файлов и подкаталогов, находящихся в заданном каталоге. Если команда задается без параметров, то выводится метка диска и его номер, имена файлов и каталогов (по одному на строку), включая расширения, а также дату и время их последней модификации. После этого выводится число файлов в каталоге, общий объем (в байтах), занимаемый файлами, и объем свободного пространства на диске.

DIR [диск:][маршрут][имя_файла] [/P] [/W]

[A[[:]атрибуты]][/O[[:]сортировка]] [/S] [/B] [/L] [/C]

Параметр [диск:][маршрут] задает диск и каталог, содержимое которого вы хотите видеть на экране. Параметр [имя_файла] задает группу файлов или файл, которые нужно включить в список.

При указании параметра /P выводится по одному экрану списка файлов. Чтобы увидеть следующий экран, нужно нажать любую клавишу.

Параметр /W выводит перечень файлов в широком формате с максимально возможным числом имен файлов/каталогов на каждой строке.

/A[[:] атрибуты] выводит имена только тех каталогов и файлов, которые имеют заданные атрибуты. Если этот параметр опущен, то DIR выводит все файлы, кроме скрытых и системных. Если этот параметр задан без указания атрибутов, DIR выводит имена всех файлов, включая скрытые и системные. Двоеточие не обязательно. Комбинация значений, которые можно использовать в качестве атрибутов, показана в следующей таблице. Значения не разделяются пробелами.

Значение

Смысл

H

Скрытые файлы.

-H

Не скрытые файлы.

S

Системные файлы.

-S

Файлы, отличные от системных.

D

Каталоги.

-D

Только файлы (не каталоги).

A

Файлы, готовые для архивизации.

-A

Файлы, не измененнные после последней архивизации.

R

Файлы, доступные только по чтению.

-R

Файлы, не имеющие доступа только по чтению.

Параметр /O[[:] сортировка] управляет порядком сортировки каталога при выводе его командой DIR. Если он опущен, DIR сортирует имена файлов и каталогов в том порядке, в котором они содержатся в каталоге. Если не указан параметр "сортировка", то DIR выводит имена в алфавитном порядке. Значение, которые вы можете использовать в параметре "сортировка", описаны в следующей таблице. При комбинировании их не нужно разделять пробелами.

Значение

Смысл

N

Сортировка по алфавиту (по имени).

-N

В порядке, обратном алфавитному (Z - A).

E

В алфавитном порядке по расширению.

-E

По расширению в порядке, обратном порядке.

D

По дате и времени (начиная с более ранних).

-D

По дате и времени, начиная с поздних.

S

По возрастанию размера.

-S

По убыванию размера.

C

По коэффициенту компрессии, начиная с меньшего.

-C

По коэффициенту компрессии, начиная с большего.

Параметр /S перечисляет каждое вхождение файла в заданном каталоге и всех подкаталогах.

/B перечисляет каталоги и имена файлов по одному на строку (включая расширение). Выводится основная информация, без итоговой. /B переопределяет параметр /W.

/L выводит неотсортированные имена файлов и каталогов в нижнем регистре. Расширенные символы в нижний регистр не преобразуются.

/C[H] выводит коэффициент компрессии файлов, компрессированных с помощью Doublespace, на основе размера кластера 8К. Необязательный параметр H выводит эту информацию на основе размера кластера основного диска. При использовании параметра /W или /B параметр /C[H] игнорируется.

О выводе структуры каталога или диска рассказывается в описании команды TREE, а о компрессированных дисках - в описании DBLSPACE.

Для вывода подмножества файлов и каталогов вы можете использовать трафаретные символы (* и ?).

Если задается более одного значения порядка сортировки, DIR сортирует файлы по первому критерию, затем по второму и т.д.

Используемый DIR формат даты и времени зависит от установки страны в файле CONFIG.SYS. Если команда COUNTRY не используется, форматы соответствуют форматам США.

Чтобы передать вывод команды DIR в файл, вы можете использовать символ перенаправления (>) или конвейеризации (|). Перед этим следует установить в файле AUTOEXEC.BAT переменную операционной среды TEMP. В противном случае временный файл будет выводится в списке каталога.

Предположим, вы хотите использовать DIR для вывода одного листинга каталога за другим, пока не выведется содержимое каждого каталога текущего диска, и хотите упорядочить каждый каталог по алфавиту, вывести его в широком формате и делать паузу после вывода каждого экрана. Для этого, находясь в корневом каталоге, дайте команду dir /s/w/o/p. Чтобы при этом не выводились имена каталогов, используйте команду dir /s/w/o/p/ a: -d. Чтобы распечатать вывод, используйте символ переназначения: dir>prn.

Команда CHDIR (CD)

Выводит на экран имя текущего каталога или изменяет текущий каталог.

CHDIR [диск:][маршрут]

CHDIR[..]

CD [диск:][маршрут]

CD[..]

Например, команда cd \progs изменяет текущий каталог на подкаталог PROGS. Чтобы вывести буквенную метку текущего диска и имя каталога, дайте команду CHDIR или CD без параметров.

Параметр [диск:][маршрут] задает диск (если он отличен от текущего) и каталог, куда вы хотите перейти. При этом.. определяет переход в порождающий каталог. Чтобы перейти в корневой каталог (вершину иерархии каталогов), наберите команду CD \.

Задав в команде CHDIR или CD буквенную метку диска, вы можете сменить текущий каталог на другом диске. Эту команду удобно также использовать для копирования файлов (см. команду COPY).

Команда MKDIR (MD)

Создает каталог. Команду MKDIR или MD можно использовать для создания многоуровневой структуры каталогов.

MKDIR [диск:]маршрут

MD [диск:]маршрут

Параметр "диск:" задает диск, на котором вы хотите создать каталог. "Маршрут" задает имя и расположение нового каталога. Максимальная длина одного маршрута от корневого каталога до нового каталога - 63 символа (включая \).

Об удалении каталога рассказывается в описании команды RMDIR, а об изменении - в описании CHDIR.

Предположим, вы хотите создать на текущем диске новый каталог и сохранить в нем информацию о доходах. Чтобы создать каталог с именем INCOME наберите команду mkdir \income.

Команда RMDIR (RD)

Удаляет каталог. Перед удалением каталога нужно удалить в нем все файлы и подкаталоги (он должен быть пуст).

RMDIR [диск:]маршрут

RD [диск:]маршрут

Параметр [диск:]маршрут задает расположение и имя удаляемого каталога.

О создании каталога рассказывается в описании команды MKDIR, о скрытых файлах - в описании ATTRIB и DIR /A, а об удалении файлов - в описании DEL. См. также команду DELTREE.

Удалить каталог со скрытыми или системными файлами вы не можете. При попытке удаления каталога, в котором содержатся файлы, выводится сообщение:

Invalid path, not directory, or directory not empty

(Недопустимый маршрут, это не каталог, или каталог не пуст)

При указании перед первым именем в маршруте символа обратной косой черты (\) MS-DOS интерпретирует каталог как подкаталог корневого каталога (независимо от текущего каталога). Если обратная косая черта не указывается, каталог интерпретируется как подкаталог текущего каталога.

Нельзя использовать RMDIR для удаления текущего каталога (нужно перейти сначала в другой каталог), иначе выводится сообщение:

Attempt to remove current directory - диск:маршрут

(Попытка удалить текущий каталог)

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

Команда DELTREE

Удаляет каталог и все файлы и подкаталоги, которые в нем содержатся.

DELTREE [/Y] [диск:]маршрут

Параметр "диск:маршрут" задает имя удаляемого каталога. Команда DELTREE будет удалять все файлы в заданном каталоге, а также все файлы в его подкаталогах. Параметр /Y выполняет команду DELTREE без вывода запроса на подтверждение удаления.

Об удалении каталога рассказывается в описании команды RMDIR, а об удалении файлов - в описании команды DEL.

DELTREE удаляет все файлы в каталоге или подкаталоге независимо от атрибутов. При успешном удалении возвращается нулевое значение ERRORLEVEL.

В команде DELTREE можно использовать трафаретные символы, но делать это нужно внимательно. Если вы зададите трафаретный символ, совпадающий как с именами каталогов, так и с именами файлов, то удаляются и каталоги, и файлы. Перед заданием трафаретных символов лучше дать команду DIR, указав те же символы, и просмотреть имена файлов и каталогов, которые вы будете удалять.

Команда TREE

Графически показывает на экране структуру каталога.

TREE [диск:][маршрут] [/F] [/A]

Параметр [диск:][маршрут] задает диск и маршрут, для которого вы хотите вывести структуру каталога. Параметр /F выводит имена файлов в каждом каталоге. /A задает использование для вывода связей каталогов вместо графических символов текстовые. Используйте его для наборов символов, не поддерживающих графические символы, и вывода на принтеры, которые не интерпретируют должным образом псевдографику.

Выводимая структура каталога зависит от параметров, заданных в командной строке. Если диск или маршрут не указываются, TREE выводит на экран структуру, начиная с текущего каталога на текущем диске. Для вывода имен всех подкаталогов на текущем диске дайте команду tree \.

О выводе содержимого каталога рассказывается в описании команды DIR.

Прочие команды

Команда TIME

Выводит системное время или устанавливает его значение. MS-DOS использует информацию о времени при обновлении файла или каталога.

TIME [часы:[минуты[:секунды[.сотые_сек]]][A P]]

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

Параметр "часы" задает значение часов (от 0 до 23), "минуты" задает минуты (от 0 до 59), "секунды" - секунды (от 0 до 59), а "сот_сек" - сотые доли секунды от 0 до 99. A P задает для 12-часового формата A.M (до полудня) или P.M. (после полудня). По умолчанию используется A (A.M.).

Об изменении текущей даты рассказывается в описании команды DATE, а о формате времени - в описании COUNTRY.

Если вы укажете время в недопустимом формате, MS-DOS выводит сообщение:

Invalid time

Enter new time:_

и ждет, пока вы введете время.

Если вы хотите, чтобы MS-DOS выводила вам запрос на ввод времени, при запуске системы, добавьте команду TIME в файл AUTOEXEC.BAT.

Команда DATE

Выводит дату и подсказку для ее возможного изменения. MS-DOS записывает для каждого создаваемого или изменяемого файла текущую дату, которая указывается после имени файла в списке каталога.

DATE [мм-чч-гг]

Параметр "мм-чч-гг" устанавливает заданную вами дату. Значения даты должны разделяться точками (.), минусом (-) или косой чертой (/). Формат даты зависит от установки COUNTRY в файле CONFIG.SYS. Месяц (мм), число (чч) и год (гг) может иметь следующие значения:

мм - от 1 до 12

чч - от 1 до 31

гг - от 80 до 99 или 1980 до 2099

Об изменении текущего времени рассказывается в описании команды TIME.

MS-DOS корректно изменяет даты в соответствии с числом дней в месяце.

Команда PROMPT

Изменяет вид командной подсказки. Вы можете задать вывод в командной подсказке любого нужного текста, включая имя текущего каталога, дату и время и номер версии MS-DOS.

PROMPT [текст]

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

$Q =

$$ $

$T Текущее время

$D Текущая дата

$P Текущий диск и маршрут

$V Версия MS-DOS

$N Текущий диск

$G >

$L <

$B |

$_ ENTER-LINEFEED

$E ESC-код ASCII (27)

$H Backspace (для удаления введенного в командной подсказке символа)

Об установке текущей даты и времени рассказывается в описании команд DATE и TIME, а об управляющих последовательностях ANSI - в описании ANSI.SYS.

При задании команды PROMPT без параметра она сбрасывает командную подсказку в значение по умолчанию - буквенную метку текущего диска с последующим символом >.

При включении в текстовый параметр символа $P MS-DOS после каждой команды проверяет текущий диск и маршрут. Это требует дополнительного времени, особенно для гибких дисков.

При использовании MicrosoftWindows 3.1 вы можете изменить командную подсказку с помощью переменной операционной среды WINPMT.

Приведем некоторые примеры. Команда prompt $p$g задает в качестве командной подсказки текущий диск, маршрут и символ >. Команда prompttime: $t$_date: $d задает подсказку из двух строк на первой строке выводится текущая дата, а на второй - текущее время. Если в CONFIG.SYS у вас загружается ANSI.SYS, вы можете использовать в подсказке управляющие последовательности ANSI, например, вывести ее в обратном видеорежиме.

Команда PATH

Указывает, в каких каталога MS-DOS должна искать выполняемые файлы. По умолчанию маршрут поиска ограничивается только текущим каталогом.

PATH [[диск:]маршрут[;...]]

Для выводе текущего маршрута поиска дайте команду:

PATH

Чтобы сбросить все установки маршрута и оставить только заданный по умолчанию, используйте команду:

PATH;

Параметр [диск:]маршрут задает диск, каталог и подкаталоги для поиска.

Поиск по заданным маршрутам MS-DOS всегда начинает с текущего каталога. Максимальная длина команды PATH ограничена 127 символами. Для задания более длинных маршрутов используйте команды SUBST и APPEND /X:ON command.

В одном каталоге вы можете хранить файлы с одинаковыми именами, но разными расширениями. MS-DOS ищет выполняемые файлы по расширениям в следующем порядке:.COM,.EXE и.BAT. Поэтому, чтобы выполнить файл.BAT с тем же именем, что и файл.EXE, нужно указать его имя полностью. Поиск по каталогам происходит в том порядке, в котором они заданы в маршруте. Если в маршруте PATH задается несколько каталогов, то они разделяются точкой с запятой, например:

path c:\user1\progs; c:\sys\suppl; d:\utils\dos

Команду PATH удобно поместить в файл AUTOEXEC.BAT. При этом MS-DOS автоматически инициирует заданный маршрут поиска при каждом запуске системы.

Задание 3.1 Создать.batфайл содержащий команды для выполнения предложенного набора действий.

Вариант 1

Используя команды MSDOS, необходимо:

1. Просмотреть иерархическую структуру диска С:.

2. Создать в своем каталоге на диске D: подкаталог VERS.

3. Создать текстовый файл my_text1.txt. с произвольным текстом в 4…5 строк.

4. Скопировать файл my_text1.txt с именем my_text2.txt.

5. Просмотреть содержимое файла my_text1.txt.

6. Перейти на диск D: в подкаталог OBUCH\DOSHELP.

7. Скопировать в подкаталог VERS все файлы из подкаталога OBUCH\DOSHELP с расширением.dat.

8. Очистить экран.

9. Вывести на экран номер версии DOS.

10. Соединитьфайлы my_text1.txt и my_text2.txt вфайл add.dat.

11. Переименовать my_text2.txt в text2.dat.

12. Вывести на экран текущую дату.

13. Вывести на экран текущее время.

14. Удалить с диска D: подкаталог VERS.

Вариант 2

1. Создать на диске D: в каталоге USERS в подкаталоге 11-TE подкаталог BYDANS.

2. Скопировать в подкаталог BYDANS все файлы с расширением.dat из подкаталога OBUCH\DOSHELP диска D:.

3. Удалить из подкаталога BYDANS файл DHELP6.DAT.

4. Скопировать в подкаталог BYDANS файл readme.txt подкаталога DD2 каталога OBUCH диска D:.

5. Переименовать файл readme.txt в подкаталоге BYDANS в файл msvopr.

6. Просмотреть содержимое файла msvopr.

7. Сравнить файл msvopr из подкаталога BYDANS с файлом D:\OBUCH\DD2\README.TXT.

8. Вывести на экран карту используемой памяти компьютера.

9. Вывести на экран иерархическую структуру диска С:.

10. Удалить подкаталог BYDANS.

11. Вывести на экран метку диска D:.

Вариант 3

1. Перейти на диск С:.

2. Просмотреть иерархическую структуру диска С:.

3. Создать на диске D: в каталоге USERS в подкаталоге 11-TE подкаталог DRIMTON.

4. Скопировать в подкаталог DRIMTON каталог OBUCH\DD диска D:.

5. Удалить из скопированного подкаталога все файлы с расширением.exe.

6. Просмотреть содержимое файла readme.txt подкаталога OBUCH\DD2 диска D:.

7. Скопировать файл readme.txt подкаталога OBUCH\DD2 диска D: в подкаталог DRIMTON.

8. Переименовать файл readme.txt.

9. Удалить с диска D: переименованный файл.

10.Удалить подкаталог DRIMTON.

11. Очистить экран.

Вариант 4

1. Создать на диске D: в каталоге USERS в подкаталоге 11-TE подкаталог VERS.

2. Вывести на экран номер версии MSDOS.

3. Просмотреть иерархическую структуру диска D:.

4. Очистить экран.

5. Перейти на диске D: в подкаталог OBUCH\DOSHELP.

6. Скопировать в подкаталог VERS все файлы из подкаталога OBUCH\DOSHELP с расширением.dat.

7. Очистить экран.

8. Просмотреть содержимое файла readme.txt подкаталога OBUCH\DD2 диска D:.

9. Вывести на экран текущую дату.

10.Вывести на экран карту оперативной памяти компьютера.

11.Удалить подкаталог VERS.

Вариант 5

1. Создать на диске D: в каталоге USERS в подкаталоге 11-TE подкаталог UNION.

2. Скопировать в него все файлы с именем trk из подкаталога OBUCH\TRK диска D:.

3. Вывести на экран текущее время.

4. Вывести на экран содержимое корневого каталога диска С:.

5. Перейти в подкаталог DD2 каталога OBUCH диска D:.

6. Скопировать файл readme.txt подкаталога OBUCH\DD2 диска D: в подкаталог UNION.

7. Переименовать файл readme.txt.

8. Просмотреть содержимое переименованного файла.

9. Вывести на экран иерархическую структуру диска D:.

10. Удалить подкаталог UNION.

4. Язык программирования С. Работа с массивами и строками

двоичный арифметика операционный массив

Символы, строки, тексты

Как мы уже знаем, базовый тип данных char понимается двояко: как байт -минимальная адресуемая единица представления данных в компьютере, и как символ текста. Это возможно по той причине, что в архитектуре компьютера (клавиатуре, экране, принтере, обслуживающих их программах -драйверах) в соответствии с общепринятым стандартом установлено соответствие между символами и присвоенными им значениями целой переменной (таблица ASCII кодов). Любое устройство, отображающее символьные данные, при получении любого кода выводит соответствующий ему символ. Аналогично клавиатура (совместно с драйвером) кодирует нажатие любой клавиши с учетом регистровых и управляющих клавиш в соответствующий ей код.

' ' - 0x20, 'B' - 0x42,

'*' - 0x2A, 'Y' - 0x59,

'0' - 0x30, 'Z' - 0x5A,

'1' - 0x31, 'a' - 0x61,

'9' - 0x39, 'b' - 0x62,

'A' - 0x41, 'z' - 0x7A.

Таким образом, символы преобразуются в цифровую форму, доступную для обработки в компьютере. Тип данных char не имеет никаких ограничений на выполнение операций, допустимых для целых переменных: от операций сравнения и присваивания до арифметических операций и операций с отдельными битами. Но за исключением редких случаев знание кодов символов не требуется. Для представления отдельных символов можно пользоваться символьными (литерными) константами, которые представляют собой символ, заключенный в одинарные кавычки (апострофы). Транслятор вместо такой константы всегда подставляет код соответствующего символа, например:

char c;

for (c= 'A'; c <= 'Z'; c++)...

for (c=0x41; c <=0x5A; c++)...

Имеется ряд кодов так называемых неотображаемых символов, которым соответствуют определенные действия при вводе-выводе символьных данных. Например, символу с кодом 0x0D (“возврат каретки”) соответствует перевод курсора в начало строки. Для их представления в программе используются символьные константы, начинающиеся с обратной косой черты:

Константа Код Название Действие

\a 0x07 bel Звуковой сигнал

\b 0x08 bs Курсор на одну позицию назад

\f 0x0C ff Переход к началу (перевод формата)

\n 0x0A lf Переход на одну строку вниз (перевод строки)

\r 0x0D cr Возврат на первую позицию строки

\t 0x09 ht Переход к позиции, кратной 8 (табуляция)

\v 0x0B vt Вертикальная табуляция по строкам

\\ \' \” \? Представление символов \, ', ", ?

\Onn Символ с восьмеричным кодом nn

\xnn Символ с шестнадцатеричным кодом nn

\0 Символ с кодом 0

Некоторые программы и стандартные функции обработки символов и строк (isdigit,isalpha) используют тот факт, что цифры, прописные и строчные (маленькие и большие) латинские буквы имеют упорядоченные по возрастанию значения кодов:

'0' - '9' 0x30 - 0x39

'A' - 'Z' 0x41 - 0x5A

'a' - 'z' 0x61 - 0x7A

Ниже приводится ряд фрагментов, использующих эти особенности кодирования.

Получить символ десятичной цифры из значения целой переменной, лежащей в диапазоне 0..9:

int n; char c; c = n + '0';

Получить символ шестнадцатеричной цифры из значения целой переменной, лежащей в диапазоне 0..15:

if (n <=9) c = n + '0'; else c = n - 10 + 'A';

Получить значение целой переменной из символа десятичной цифры:

if (c >='0' && c <='9') n = c - '0';

Получить значение целой переменной из шестнадцатеричной цифры:

if (c >='0' && c <='9')

n = c - '0';

else

if (c >='A' && c <='F')

c = c - 'A' + 10;

Преобразовать маленькую латинскую букву в большую:

if (c >='a' && c <='z') c = c - 'a' + 'A';

СТРОКОЙ называется последовательность символов, ограниченная символом с кодом 0, то есть '\0'. Из ее определения видно, что она является объектом переменной размерности. Поскольку в Си допускаются переменные только фиксированной размерности, то единственным допустимым способом представления строки является массив символов. Здесь сразу проясним суть взаимоотношений между строкой и массивом символов:

· строка хранится в массиве символов, массив символов может быть инициализирован строкой, а может быть заполнен программно:

char A[20] = { 'С','т','р','о','к','а','\0' };

int i;

char B[80];

for (i=0; i<20; i++) B[i] = 'A';

B[20] = '\0';

· строка представляет собой последовательность, ограниченную символом '\0', поэтому работать с ней можно, просматривая ее от начала до конца, пока не встретится символ '\0':

for (i=0; B[i] !='\0'; i++)...

· соответствие размерности массива и длины строки транслятором не контролируется, за это несет ответственность программа (программист, ее написавший):

char C[20];

// следить за переполнением массива

// и ограничить строку его размерностью

for (i=0; i<19 && B[i]!='\0'; i++)

C[i] = B[i];

C[i]='\0';

СТРОКОВОЙ КОНСТАНТОЙ называется последовательность символов, заключенная в двойные кавычки. Допустимо использование неотображаемых символов. Строковая константа автоматически дополняется символом '\0', ею можно инициализироваться массив, в том числе такой, размерность которого определяется размерностью строки:

char A[80] = "123456\r\n";

char B[] = "aaaaa\033bbbb";

..."Это строка"...

Непосредственное использование строковых констант в выражениях связано с указателями и поэтому рассматривается в 4.1.

Стандартная библиотека ввода-вывода

Стандартная библиотека ввода-вывода (stdio) имеет функции, работающие как с символами, так и со строками. Если функция имеет в качестве параметра символ, то это функция посимвольного ввода, если массив символов, то строчного. Заметим, что символ конца строки в построчном вводе (\0) формируется функцией ввода, обычно в последовательности символьном потоке для ограничения строки используется символ \n - “перевод строки”. Кроме того, построчный ввод иногда бывает форматным, то есть вводит символы строки до первого ограничителя (пробела, запятой, точки и т.п..).

#include <stdio.h>

// Собственнаяфункцияgets(chars[])

void my_gets(char s[]) {

int i;

char c;

for (i=0; i < 79 && (c=getchar()) !=EOF && c !='\n'; i++)

s[i] = c;

s[i]='\0';

}

#include <iostream.h>

charc,s[80];

// Пример использования объектов потокового ввода

voidmain()

{

cin>> c; // Посимвольный ввод

cin>> s; // Построчный форматированный ввод

cin.getline(s,80);// Построчный неформатируемый ввод

}

Работа со строкой

Поскольку строка представляет собой последовательность символов, большинство программ, обрабатывающих строки, используют последовательный просмотр символ за символом - ПОСИМВОЛЬНЫЙ ПРОСМОТР СТРОКИ. Если же в процессе обработки строки предполагается изменение ее содержимого, то проще всего организовать его в виде посимвольного переписывание входной строки в выходную. При этом нужно помнить, что каждой строке требуется отдельный индекс, если для входной строки он может изменяться в заголовке цикла посимвольного просмотра, то для выходной строки он меняется только в моменты добавления очередного символа. Кроме того, не нужно забывать “закрывать” выходную строку символом конца строки. В качестве примера рассмотрим функцию УДАЛЕНИЯ ЛИШНИХ ПРОБЕЛОВ.

// Удаление лишних пробелов при посимвольном переписывании

#include <stdio.h>

voidnospace(c1[],c2[])

{

inti,j;

for (j=0,i=0;c1[i]!=0;i++)// Посимвольный просмотр строки

{

if (c1[i]!=' ') // Текущий символ - не пробел

{

if (i!=0 && c1[i-1]==' ') // Первый в слове -

c2[j++]=' '; // добавить пробел

c2[j++]=c1[i]; // Перенести символ слова

} // в выходную строку

}

c2[j]=0;

}

Заметим, что контекст c1[j++]= имеет вполне определенный смысл: добавить к выходной строке очередной символ и переместиться к следующему.

Рассмотрим еще один пример - поиск СЛОВА МАКСИМАЛЬНОЙ ДЛИНЫ. Несмотря на ярко выраженный “словный” характер алгоритма его можно реализовать путем посимвольного просмотра. Для этого можно использовать принцип, уже реализованный ранее при определении максимальной длины последовательности возрастающих значений. Достаточно использовать счетчик, который увеличивает свое значение на каждый символ слова и сбрасывает его при обнаружении пробела. Дополнительно в момент сбрасывания счетчика фиксируется его максимальное значение, а также индекс начала слова.

// Поиск слова максимальной длины - посимвольная обработка

// Функция возвращает индекс начала слова или -1, если нет слов

int find(char s[])

{

inti,n,lmax,imax;

for (i=0,n=0,lmax=0,imax=-1; s[i]!=0; i++)

{

if (s[i]!=' ') n++; // символ слова - увеличить счетчик

else // перед сбросом счетчика

{ // фиксация максимального значения

if (n>lmax) { lmax=n; imax=i-n; }

n=0;

}

} // то же самое для последнего слова

if (n >lmax) { lmax=n; imax=i-n; }

returnimax;

}

Такая форма представления программы позволяет одним циклом “убить всех зайцев”, но не является наглядной. В другой версии ПОСЛОВНОЙ ОБРАБОТКИ ТЕКСТА циклов больше, то есть имеются “архитектурные излишества”, зато структура программы отражает в полной мере сущность алгоритма.

// Поиск слова максимальной длины - пословная обработка

// Функция возвращает индекс начала слова или -1, если нет слов

int find(char in[])

{

int i=0, k, m, b;

b=-1;

m=0;

while (in[i]!=0) // Цикл пословного просмотра строки

{

while (in[i]==' ') i++; // Пропуск пробелов перед словом

for (k=0;in[i]!=' ' && in[i]!=0; i++,k++);

// Подсчет длины слова

if (k>m)

{

m=k;

b=i-k;

}

}

return b;

}

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

// Сортировка слов в строке в порядке убывания (выбором)

void sort(char in[], char out[])

{

inti,k;

i=0;

while((k=find(in))!=-1) // Получить индекс очередного слова

{

for (; in[k]!=' ' && in[k]!=0; i++,k++)

{ // Переписать с затиранием

out[i]=in[k]; in[k]=' ';

}

out[i++]=' '; // После слова - добавить пробел

}

out[i]=0;

}

Ввод-вывод целых чисел

Функции и объекты стандартных потоков ввода/вывода могут, в частности, вводить и выводить целые числа, представленные в десятичной, восьмеричной и шестнадцатеричной системах счисления. При этом происходят некоторые преобразования, связанные с различной формой представления целого в памяти (внутренняя) и устройствах символьного ввода-вывода (внешняя форма представления).

int a

char s[20]

1052 (0x041C)

'1'

'0'

'5'

'2'

….

'\0'

Так, при выводе на экран или вводе с клавиатуры целое число представлено строкой символов в виде последовательности цифр числа (в нашем примере "1052"). В памяти это же число представлено целой переменной (машинным словом), которое хранит двоичный эквивалент десятичного числа 1052 (в шестнадцатеричной системе -0x041C). Преобразования при вводе и выводе целых чисел заключаются в переходе от символа-цифры к значению целой переменной, соответствующему этой цифре, и наоборот:

char c; int n;

n = c - '0';

c = n + '0';

ВНУТРЕННЯЯ ФОРМА ПРЕДСТАВЛЕНИЯ ЧИСЛА - представление числа в виде целой (int,long) или вещественной переменной.

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

ВНЕШНЯЯ ФОРМА ПРЕДСТАВЛЕНИ ЧИСЛА - представление числа в виде строки символов - цифр, соответствующих числу в заданной системе счисления.

Таким образом, о системе счисления имеет смысл говорить только во внешней форме представления числа.

Ввод целого числа

В преобразовании используется тот факт, что при добавлении к числу очередной цифры справа старое значение увеличивается в 10 раз и к нему добавляется значение новой цифры, например:

Число: '123' '1234'

Значение: 123 1234 = 123 * 10 + 4

Тогда в основе алгоритма лежит итерационный цикл просмотра всех цифр числа слева направо, в котором значение числа на текущем шаге цикла получается умножением на 10 результата предыдущего цикла и добавлением значения очередной цифры:

n = n * 10 + c[i] - '0';

где s[i]-'0' -двоичное значение цифры, представленной символом c[i].

//---Преобразование внешней формы во внутреннюю в 10СС

int StringToInt(char c[])

{

int n,i;

for (i=0; !(c[i]>='0' && c[i]<='9'); i++)

if (c[i]=='\0') return(0); // Поискпервойцифры

for (n=0; c[i]>='0' && c[i]<='9'; i++)

// Накопление целого

n = n * 10 + c[i] - '0'; // "цифра за цифрой"

return n;

}

Вывод двоичного числа

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

//Преобразование внутренней формы во внешнюю в 10СС

void IntToString(char c[], int n)

{ int nn,k;

for (nn=n, k=1; nn!=0; k++, nn/=10); // Подсчетколичества

c[k] = '\0'; // цифр числа

for (k-; k >=0; k-, n /= 10) // Получение цифр числа

c[k] = n % 10 + '0'; // в обратном порядке

}

Представление текста

Текст является упорядоченным множеством строк, и наш уровень работы с данными не позволяет предложить для его хранения что-либо иное, кроме массива символов:

char A[20][80];

char B[][40] = { "Строка","Еще строка","0000","abcdef"};

Первый индекс двумерного массива соответствует номеру строки, второй -номеру символа в нем:

int i,k;

for (k=0; A[i][k] !='\0'; k++)

{} // Работа c i-й строкой

Упорядоченные строки

При работе со строками часто возникает необходимость их сравнения в алфавитном порядке. Простейший способ состоит в сравнении кодов символов, что при наличии последовательного кодирования латинских букв и цифр дает гарантию их алфавитного упорядочения (цифры, прописные латинские, строчные латинские).

// Функция сравнивает две строки по значениям

// кодов (гарантированный алфавитный порядок для

// латинских букв). Результат сравнения:

// 0 - строки одинаковы,

// -1 - первая строка "меньше" по алфавиту, либо

// строки равны, но первая короче

// 1 - то же самое, но для второй строки

Int Compare1(unsigned char s1[],unsigned char s2[])

{

int n;

for (n=0; s1[n]!='\0' && s2[n]!='\0'; n++)

if (s1[n] != s2[n]) break;

if (s1[n] == s2[n]) return 0;

if (s1[n] < s2[n]) return -1;

return 1;

}

Обратите внимание на то, что массивы символов указаны как беззнаковые. В противном случае коды с весом более 0x80 (символы кириллицы) будут иметь отрицательные значения и располагаться в алфавите "раньше" латинских, имеющих положительные значения кодов (кроме того, еще и в обратном порядке, от Я к А). Чтобы устранить этот и другие недостатки, необходимо установить свой порядок следования символов в алфавите и использовать порядковый номер символа в последовательности (индекс в массиве) в качестве его "веса":

//-- Сравнение строк с заданными "весами" символов

char ORD[] = "АаБбВвГгДдЕе1234567890";

int Carry(char c)

{

int n;

if (c=='\0') return(0);

for (n=0; ORD[n]!='\0'; n++)

if (ORD[n]==c) break;

return n+1;

}

int Compare2(char s1[],char s2[])

{

int n;

char c1,c2;

for (n=0; (c1=Carry(s1[n]))!='\0' &&(c2=Carry(s2[n]))!='\0'; n++)

if (c1 != c2) break;

if (c1 == c2) return 0;

if (c1 < c2) return -1;

return 1;

}

Контекстная замена

Контекстная замена -поиск и замена в строке фрагментов, заданных одной строкой (контекста) на фрагмент, заданный другой, например:

Исходная строка Заменяемая Заменяющая Результат

строка строка

"abc234pe4234e" "234" "_00_" "abc_00_pe4_00_e"

Особенность программы: обработка строки производится не путем ее переписывания, а с помощью сдвига “хвоста” строки вправо или влево. Ввиду сложности алгоритма приведем его в пошаговой детализации.

Шаг 1: Исходные данные и результат. Строки заданы массивами символов s,s1,s2. Результирующая строка размещается в том же массиве, что и исходная. Контроль размерности не производится:

void Context(chars[], chars1[], chars2[]) {...}

Шаг 2: Основной цикл программы состоит в посимвольной проверке строки на вхождение в нее подстроки, начиная с текущего символа. В случае вхождения производится замена:

void Context(chars[], chars1[], chars2[])

{

int n;

for (n=0; s[n] !='\0'; n++)

{

// Если начиная с n-го символа расположена

// подстрока s1, заменить ее на s2 в строке

}

}

Шаг 3: Проверка утверждения, что начиная с n-го символа в строке s расположена подстрока s2:

int i;

for (i=0; s[n+i] !='\0' && s1[i] !='\0'; i++)

if (s[n+i] != s1[i]) break;

if (s1[n+i]=='\0')

{

// заменить s1 на s2 в строке, начиная с s[n]

}

Шаг 4: Замена подстроки s1 на s2, начиная с n-го символа строки s, заключается перемещении "хвоста" строки s вправо или влево в зависимости от знака разности длин строк и в переписывании строки s2 на место строки s1. Для получения длины строки воспользуемся стандартной функцией strlen:

intl2,dd,k;

l2 = strlen(s2)

dd = l2 - strlen(s1);

if (dd != 0)

{

// сдвинуть "хвост" строки s на dd символов

}

for (k = 0; k < l2; k++)

s[n+k] = s2[k];

Шаг 5: Для сдвига всего "хвоста" (для простоты, начиная с n-го символа) влево (dd< 0) необходимо все символы, начиная с n+dd перенести на dd позиций влево. Для перемещения вправо нужно сначала найти конец строки, чтобы от него производить перемещения символов с убывающим индексом

if (dd< 0)

{

for (k=n; s[k+dd]!='\0'; k++)

s[k] = s[k+dd];

s[k]='\0';

}

else

{

for (k=n; s[k]!='\0'; k++);

for (; k != n; k-)

s[k+dd] = s[k];

}

Примечание: в случае удачной замены проверка возможности последующей замены производится, начиная со следующего символа. Тогда при наличии замен вида "nnn" на "nnnn..." программа будет расширять строку до бесконечности.

Выделение вложенных фрагментов

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

Пример: a{b{c}b}a{d{e{g}e}d}a => {c}{b1b}{g}{e3e}{d4d}a2a5a

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

// функция возвращает индекс скобки “{” для самой внутренней // пары {}

int find(char c[])

{

int i; // Индексвстроке

int k; // Счетчик вложенности

intmax; // Максимум вложенности

int b; // Индексмаксимальной “{”

for (i=0, max=0, b=-1; c[i]!=0; i++)

{

if (c[i]=='}') k-;

if (c[i]=='{')

{

k++;

if (k>max) { max=k; b=i; }

}

}

if (k!=0) return 0; // Защита “от дурака”, нет парных скобок

return b;

}

Другой вариант функции ищет первую внутреннюю пару скобок. Запоминается позиция открывающейся скобки, при обраружении закрывающейся скобки возвращается индекс последней открывающейся. Заметим, что его также сожно использовать, просто последовательность извлечения фрагментов будет другая.

// функция возвращает индекс скобки “{” для первой внутренней пары {}

int find(char c[])

{

inti; // Индексвстроке

intb; // Индексмаксимальной “{”

for (i=0, b=-1; c[i]!=0; i++)

{

if (c[i]=='}') return b;

if (c[i]=='{') b=i;

}

return b;

}

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

void copy(char c1[], char c2[])

{

int i=0; // Индекс в выходной строке

int k; // Индекс найденного фрагмента

int n; // Запоминание начала фрагмента

int m; // Счетчик фрагментов

for (m=1; (k=find(c1))!=-1; m++) // Пока есть фрагменты

{

for (n=k; c1[k]!='}'; k++, i++) c2[i]=c1[k];

c2[i++] = c1[k++]; // Переписать фрагмент

if (m/10!=0) c1[n++] = m/10 + '0'; // На его место - две цифры

c1[n++] = m%10 + '0'; // номера во внешней форме

for (;c1[k]!=0; k++, n++) c1[n]=c1[k];

c1[n]=0; // сдвинуть “хвост” к началу

}

for (k=0; c1[k]!=0; k++, i++) c2[i]=c1[k];

c2[i]=0; // перенести остаток входной строки

}

Практический совет - избегать сложные вычисления над индексами. Лучше всего для каждого фрагмента строки заводить свой индекс и перемещать их независимо друг от друга в нужные моменты. Что, например, сделано выше при “уплотнении” строки.

Форматирование строки

Форматирование строки - размещение ее в выходном массиве заданной размерности таким образом, чтобы интервалы между соседними словами отличались не более, чем на 1.

Шаг 1: Исходные данные и результат. Входная строка произвольной длины в массиве IN[], отформатированная строка длины n в массиве OUT[]. Выходная строка отвечает следующим требованиям:

· слово -любая последовательность символов, кроме пробела;

· после форматирования число пробелов между словами различается не более чем на 1;

· первое и последнее слово расположены по краям строки. Шаг 2: Форматирование включает в себя последовательность из трех действий:

void format(char IN[], char OUT[], int n)

{

// Собрать исходные данные по строке,

// необходимые для форматирования;

// Проверить возможность форматирования;

// Разместить слова в выходной строке.

}

Шаг 3: Данные по строке, необходимые для форматирования: -количество слов в строке -nw; -общее количество символов во всех словах -ns; -стандартное количество пробелов между словами при форматировании -np; -оставшееся количество пробелов, добавляемых по одному между словами -nr. На этом шаге детализируется проверка возможности форматирования и определяются взаимосвязанные параметры.

void format(char IN[], char OUT[], int n)

{ intnw, ns, np, nr;

// Определение nw, ns...

OUT[0] = '\0';

if (nw< 2) return; // Мало слов в строке

np = (n - ns) / (nw - 1);

if (np<= 0) return; // Много символов в словах

nr = (n - ns) % (nw - 1);// Остаточное число пробелов

// Размещение слов в выходной строке

}

Шаг 4: Просмотр строки при определении параметров и форматировании можно выполнить, используя:

· -цикл в цикле: цикл просмотра всех слов, в который включен цикл посимвольного просмотра интервала между словами и самого слова;

· -цикл посимвольного просмотра строки, с использованием признака нахождения внутри слова или вне его - inword.

Выберем второй вариант. При этом необходимо учесть, что символ конца строки может рассматриваться как конец слова (разделитель), поэтому проверку на выход из цикла нужно делать после выполнения тела цикла.

Шаг 5: Определениеns,nw:

for (i=0,ns=0,nw=0,inword =0;; i++)

{

// Анализ символа IN[i] и подсчет параметров;

if (IN[i] =='\0') break;

}

Шаг 6: Размещение слов в выходной строке:

{

for (i=0,j=0,inword =0;; i++)

{

// Анализ символа IN[i] и форматирование

// (переносв OUT[j]);

}

if (IN[i] =='\0') break;

}}

Шаг 7: Анализ символа состоит в выделении 4 вариантов по двум сравнениям -признака inword и типа символа IN[i] - разделителя или символа слова:

{

if (IN[i]==' ' || IN[i]=='\0')

if (inword)

{ nw++; inword =0; } // Конецслова

else

{} // Продолжение разделителя

else

{ ns++;

if (inword)

{} // Продолжение слова

else

{ inword =1; } // Начало слова

}}

Шаг 8: Анализ символа IN[i] и форматирование:

{

if (IN[i]==' ' || IN[i]=='\0')

if (inword)

{ // Конецслова

for (k=0; k<np; k++) // Включение "np"

OUT[j++]=' '; // пробелов

if (nr- >0) // Включение

OUT[j++]=' '; // дополнительного пробела

}

else

{} // Продолжение разделителя

else

if (inword)

OUT[j++]=IN[i]; // Продолжение слова

else

{ // Началослова

OUT[j++]=IN[i];

inword =1;

}}

Окончательный вариант с оптимизацией (исключение лишних ветвей):

//---Форматированиестроки

void format(char IN[], char OUT[], int n)

{

intnw, ns, np, nr, i, j, k, inword;

for (i=0,ns=0,nw=0,inword =0;; i++)

{

if (IN[i]==' ' || IN[i]=='\0')

{ if (inword) { nw++; inword =0; } }

else

{ ns++; inword=1; }

if (IN[i] =='\0') break;

}

OUT[0] = '\0';

if (nw< 2) return;

np = (n - ns) / (nw - 1);

if (np<= 0) return;

nr = (n - ns) % (nw - 1);

for (i=0,j=0,inword=0;; i++)

{

if (IN[i]==' ' || IN[i]=='\0')

{ if (inword)

{

for (k=0; k<np; k++) OUT[j++]=' ';

if (nr- >0) OUT[j++]=' ';

}

}

else

{ OUT[j++]=IN[i]; inword =1; }

if (IN[i] =='\0') break;

}

}

Массивы

Массивы - это группа элементов одинакового типа (double, float, int и т.п.). Из объявления массива компилятор должен получить информацию о типе элементов массива и их количестве. Объявление массива имеет два формата:

спецификатор-типа описатель [константное - выражение];

спецификатор-типа описатель [ ];

Описатель - это идентификатор массива.

Спецификатор-типа задает тип элементов объявляемого массива. Элементами массива не могут быть функции и элементы типа void.

Константное-выражение в квадратных скобках задает количество элементов массива. Константное-выражение при объявлении массива может быть опущено в следующих случаях:

· при объявлении массив инициализируется,

· массив объявлен как формальный параметр функции,

· массив объявлен как ссылка на массив, явно определенный в другом файле.

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

Каждое константное-выражение в квадратных скобках определяет число элементов по данному измерению массива, так что объявление двухмерного массива содержит два константных-выражения, трехмерного - три и т.д. Отметим, что в языке СИ первый элемент массива имеет индекс равный 0.

Примеры:

int a[2][3]; /* представлено в виде матрицы

a[0][0] a[0][1] a[0][2]

a[1][0] a[1][1] a[1][2] */

double b[10]; /* вектор из 10 элементов имеющих тип

double */

intw[3][3] = { { 2, 3, 4 },

{ 3, 4, 8 },

{ 1, 0, 9 } };

В последнем примере объявлен массив w[3][3]. Списки, выделенные в фигурные скобки, соответствуют строкам массива, в случае отсутствия скобок инициализация будет выполнена неправильно.

В языке СИ можно использовать сечения массива, как и в других языках высокого уровня (PL1 и т.п.), однако на использование сечений накладывается ряд ограничений. Сечения формируются вследствие опускания одной или нескольких пар квадратных скобок. Пары квадратных скобок можно отбрасывать только справа налево и строго последовательно. Сечения массивов используются при организации вычислительного процесса в функциях языка СИ, разрабатываемых пользователем.

Примеры:

int s[2][3];

Если при обращении к некоторой функции написать s[0], то будет передаваться нулевая строка массива s.

int b[2][3][4];

При обращении к массиву b можно написать, например, b[1][2] и будет передаваться вектор из четырех элементов, а обращение b[1] даст двухмерный массив размером 3 на 4. Нельзя написать b[2][4], подразумевая, что передаваться будет вектор, потому что это не соответствует ограничению наложенному на использование сечений массива.

Пример объявления символьного массива.

charstr[] = "объявление символьного массива";

Следует учитывать, что в символьном литерале находится на один элемент больше, так как последний из элементов является управляющей последовательностью '\0'.

Задание 4.1 Разработать программу решающую приведенную в варианте задачу

Примечание для заданий с 1 по 11: размеры матриц вводятся с клавиатуры и не должны превышать ; при вводе соответствующего члена матрицы на экране должен высвечиваться его номер. Сразу после окончания ввода должна быть осуществлена очистка экрана и введённая матрица (матрицы) должна быть выведена на экран в прямоугольном виде. Если в результате выполнения программы получена новая матрица, она должна быть выведена на экран также в прямоугольном виде.


Подобные документы

  • Преимущества позиционных систем счисления: наглядность представления чисел и простота выполнения вычислений. Правила выполнения арифметических действий над двоичными числами в прямом, обратном и дополнительном кодах. Перевод в другие системы счисления.

    курсовая работа [59,9 K], добавлен 31.05.2009

  • Понятие и классификация систем счисления. Перевод чисел из одной системы счисления в другую. Перевод правильных и неправильных дробей. Выбор системы счисления для применения в ЭВМ. Навыки обращения с двоичными числами. Точность представления чисел в ЭВМ.

    реферат [62,0 K], добавлен 13.01.2011

  • Определение понятия и видов систем счисления - символического метода записи чисел, представления чисел с помощью письменных знаков. Двоичные, смешанные системы счисления. Перевод из одной системы счисления в другую и простейшие арифметические операции.

    курсовая работа [232,6 K], добавлен 16.01.2012

  • Порождение целых чисел в позиционных системах счисления. Почему мы пользуемся десятичной системой, а компьютеры - двоичной (восьмеричной и шестнадцатеричной)? Перевод чисел из одной системы в другую. Математические действия в различных системах счисления.

    конспект произведения [971,1 K], добавлен 31.05.2009

  • Запись прямого и обратного кода для числа 10010 и -10010. Получение дополнительного кода числа для 16-разрядной ячейки. Перевод в двоичную систему счисления десятичных чисел: 10, 45, 7, 33. Запись в обратном и дополнительном кодах числа -67, -43, -89.

    практическая работа [13,7 K], добавлен 19.04.2011

  • Примеры правила перевода чисел с одной системы в другую, правила и особенности выполнения арифметических операций в двоичной системе счисления. Перевод числа с десятичной системы в двоичную систему счисления. Умножение целых чисел в двоичной системе.

    контрольная работа [37,3 K], добавлен 13.02.2009

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

    контрольная работа [824,4 K], добавлен 17.11.2010

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

    презентация [516,8 K], добавлен 23.10.2015

  • Общее представление о системах счисления. Перевод чисел в двоичную, восьмеричную и шестнадцатеричную системы счисления. Разбивка чисел на тройки и четверки цифр. Разряды символов числа. Перевод из шестнадцатеричной системы счисления в десятичную.

    практическая работа [15,5 K], добавлен 19.04.2011

  • Системы счисления: понятие и содержание, классификация и типы, отличительные свойства и принципы. Перевод чисел из одной системы счисления в другую, виды программного обеспечения. Возможности программы сканирования и распознавания текста Fine Reader.

    контрольная работа [37,2 K], добавлен 15.12.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.