Язык Си в примерах/Верхний регистр: различия между версиями

Содержимое удалено Содержимое добавлено
../ASCII коды символов/ (была: ../Максимум/), упрощено; →‎Задания: новый раздел.
→‎Кроме латиницы: Новый раздел.
Строка 4:
; Надо: вывести на [[w:Стандартные потоки#Стандартный вывод |стандартный вывод]] исходный текст, заменив в нем строчные буквы латиницы (''a, …, z'') прописными (''A, …, Z'').
; Указание: воспользоваться особенностью [[w:ASCII#Кодировка |кодовой таблицы ASCII]]: коды прописных букв отличаются от кодов соответствующих строчных на постоянную величину (а именно: 32.)
; Дополнительно: предполагая поддержку средой русскоязычной ''локали'', реализуйте аналогичное преобразование для кириллических текстов (используя [[w:C11 |стандартные]] функции языка.)
 
== Решение ==
Строка 65 ⟶ 66 :
}
</source>
 
== Кроме латиницы ==
 
[[w:C11 |Стандарт]] предусматривает также ряд средств для поддержки письменностей, отличных от «базовой» (26-символьной) латиницы. В основе такой поддержки — два следующих понятия:
# ''локаль'' — набор сведений о письменности, языке и культуре, включающий, помимо прочего, таблицы соответствия символов верхнего и нижнего регистров;
# ''широкие символьные типы'' (<code >wchar_t</code>, <code >wint_t</code>; англ. {{lang |en|wide character}}) — для представления ряда письменностей (например — основанных на [[w:Иероглиф |иероглифах]]), а равно для представления текстов на нескольких языках, «байтового» типа <code >char</code> оказывается недостаточно; как следствие, в задачах, связанных с обработкой ''многоязычных'' текстов, его заменяет тип <code >wchar_t</code>; аналогично, в операциях ввода-вывода используется тип <code >wint_t</code> (и константа <code >WEOF</code>.)
 
Соответственно, [[#toupper.c |в исходный вариант]] вносятся следующие изменения.
# Появляется вызов <source lang="c" enclose="none" >setlocale (LC_ALL, "")</source>, ''инициализирующий'' локаль в соответствии с текущими настройками. (По-умолчанию, при запуске программы полагается <source lang="c" enclose="none" >setlocale (LC_ALL, "C")</source> — установка «стандартной» локали.)<ref name="setlocale" />
# Функции <code >getwchar</code>, <code >towupper</code>, <code >putwchar</code> заменяют соответствующие для «узких» символов (<code >getchar</code>, <code >toupper</code>, <code >putchar</code>.) Соответственно меняются тип (<code >int</code> → <code >wint_t</code>) и константа признака исчерпания входного потока (<code >EOF</code> → <code >WEOF</code>.)<ref name="getwchar" /><ref name="towupper" /><ref name="putwchar" />
# Включаются соответствующие ''заголовки'' (<code >locale.h</code>, <code >wchar.h</code>, <code >wctype.h</code>.)
 
{{Якорь |towupper.c}}
<source lang="c">
#include <assert.h>
#include <locale.h>
#include <stdio.h>
#include <wchar.h>
#include <wctype.h>
 
int
main ()
{
char *rl
= setlocale (LC_ALL, "");
assert (rl != 0);
 
wint_t c;
while ((c = getwchar ()) != WEOF) {
putwchar (towupper (c));
}
assert (! ferror (stdin));
 
return 0;
}
</source>
 
Отметим, впрочем, что принятые в конкретном языке правила обращения со строчными и заглавными могут оказаться сложнее простой зависимости символ—символ, <em >предполагаемой</em> в данном примере. Так, например, правила немецкого языка ставят в соответствие строчной «ß» <em >пару</em> заглавных — «SS» (например: {{lang |de|[[wikt:Straße#Немецкий |Straße]] → STRASSE}}), что ни коим образом не может быть реализовано функцией <code >towupper</code>.
 
== Задания ==
 
# Проверьте работу программы вводом строк <code >Hello!</code> и <code >Привет!</code>. Удостоверьтесь, что «базовые» варианты решения выполняют заданное преобразование лишь для для первой из них, выполняетсяв заданноето преобразованиевремя как [[#Кроме латиницы |«интернационализованное»]] решение действует и в отношении кириллического ввода.
# Разработайте варианты программы, выполняющие (вновь для латиницы) a. преобразование <em >верхнего</em> регистра в нижний и b. «переключение» регистра — <code >Hello!</code> → <code >hELLO!</code>. (Указание: воспользуйтесь [[w:C11 |стандартными]] функциями <code >islower</code> и <code >isupper</code>.<ref name="islower" /><ref name="isupper" />)
 
Строка 75 ⟶ 114 :
* [[../ASCII коды символов/]]
* {{w |ASCII}}
* {{w |UTF-8}}
* {{w |Заглавная буква эсцет}}
 
== Примечания ==
Строка 84 ⟶ 125 :
<ref name="isupper" >{{Cite web | title = 7.4.1.11 The isupper function | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=221 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
<ref name="getchar" >{{Cite web | title = 7.21.7.6 The getchar function | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=350 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
<ref name="getwchar" >{{Cite web | title = 7.29.3.7 The getwchar function | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=442 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
<ref name="putchar" >{{Cite web | title = 7.21.7.8 The putchar function | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=351 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
<ref name="putwchar" >{{Cite web | title = 7.29.3.9 The putwchar function | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=443 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
<ref name="setlocale" >{{Cite web | title = 7.11.1.1 The setlocale function | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=242 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
<ref name="towupper" >{{Cite web | title = 7.30.3.1.2 The towupper function | url = http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf#page=471 | work = WG14 N1570 Committee Draft | publisher = ISO/IEC | datepublished = 2011-04-12 | lang = en | accessdate = 2012-11-19}}</ref>
}}