русс | укр

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

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Преобразования строковых типов.


Дата добавления: 2013-12-24; просмотров: 1730; Нарушение авторских прав


В) Примеры решения задач.

Б) Действия над типом String.

А) Основные понятия.

Строки как переменные типа AnsiString.

Русификация консольных приложений.

При работе в консольном приложении ввод-вывод выполняется в кодировке ASCII (см. тему "Кодирование символов", кодовые таблицы). В тексте же программы символы отображаются в принятой в Windows кодировке ANSI. Они совпадают только в первой половине кодов (от 0 до 127. Символы национального (русского) алфавита - вторая половина кодов, и поэтому в консоли они отображаются иначе, чем в тексте программы. Для устранения этой проблемы можно использовать:

функцию CharToOem(char *S1, char *S2) для преобразования символов из кодировки ANSI в кодировку ASCII (S1 - исходная строка, S2 - результат);

функцию OemToChar(char *S1, char *S2) для обратного преобразования (S1 - исходная строка, S2 - результат).

Эти функции находятся в библиотеке windows.h. Приведем пример их использования.

 

...

#include<windows.h>

char buf[100];

 

void main(void)

{ int a=2;

float r=5.5;

char s[]="Минск !", s1[256];

CharToOem(s, buf);

printf("\n %s ", buf);

printf("\n Vvedi string:");

gets(s1);

printf("\n %s ",s1);

CharToOem("\n Значение а = %d r = %f\n", buf);

printf(buf, a, r); //Вместо строковой вонстанты -

} // массив char

 

 

В оконных компонентах и функциях C++ Builder'а основным строковым типом является тип AnsiString, который обозначается также просто как String (первая буква большая! Тип string (с малой буквы) - это уже другой похожий тип, из библиотеки STL).

Работа с типом String чаще всего удобнее, чем с массивом char. Однако скорость выполнения операций при работе с большими объемами данных может быть ниже.



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

Отдельные символы, входящие в строку типа String, имеют тип char. К ним можно обращаться так же, как к элементам массива, но нумерация начинается с единицы:

 

String V="Привет!";

char c,d;

c=V[1]; // c='П'

d=V[7]; // c='!'

 

Текст в переменной типа String не обязательно заканчивается нуль-терминатором. Более того, попытка обращения к несуществующему символу строки (например, в вышеприведенном образце V[0], или V[8]) может вызвать ошибку (в то время как выход за границы массива не проверяется). Поэтому изменять длину строки (например, добавить в нее новый символ) нужно не присваиванием значений отдельным символам, а другими способами, описанными ниже.

 

В оконном приложении ввод-вывод строк типа String возможен через большинство компонентов (с использованием их соответствующих свойств, например для Edit - свойства Text) без специального преобразования типов:

 

String s=Edit1->Text;

Edit2->Text=s;

Memo1->Lines->Add(s);

 

 

Основными операциями с типом String являются:

 

1) Присваивание: S1=S2;

 

2) Сравнение: S1==S2, S1<=S2, S1!=S2 и т.д.

Здесь знак < означает предшествование по алфавиту (подробности см. выше в описании strcmp). Равенство означает точное совпадение строк.

 

3) Сцепление (конкатенация): S1+S2

Пример. Вывести в одну строку Memo1 переменные S1 и S2 типа String, разделяя их пробелом:

Memo1->Lines->Add(S1+" "+S2);

Допустимы и операции присваивания вида S1+=S2.

 

Заметим, что переменной типа String можно присваивать и значение большинства других типов: символьных (char, массив char), числовых (int, double и т.д.), при этом они автоматически преобразуются к типу String. Аналогично, если в бинарной операции первый операнд имеет тип String, второй также преобразуется к типу String:

 

S1="Пример:";

S2=23.5; // Равносильно S2=FloatToStr(23.5);

Memo1->Lines->Add(S1+" "+S2);

 

 

Многие другие операции над строками осуществляются с помощью методов типа String. Метод - это тип функций, вызываемых особым образом: для обращения к методу надо после имени переменной типа String поставить точку, а затем имя метода и круглые скобки (в которых, при необходимости, указываются параметры метода).

Основные методы типа String (и типы их результатов, если они есть):

 

int Length() - длина строки (количество символов в ней);

 

String SubString(int i, int n) - копирует из строки подстроку, начиная с i-ой позиции, длиной n символов. Исходная строка не изменяется. (Если в исходной строке, начиная с i-ой позиции, содержится меньше n символов, метод выделяет столько символов, сколько есть).

Пример: Вывести все символы строки, кроме первого:

Edit1->Text=s.SubString(2, s.Length()-1);

Insert(String S2, int i) - вставляет строку S2 в середину строки, начиная с i-ой позиции;

Delete(int i, int n) - удаляет из строки n символов, начиная с i-ой позиции. (Если в исходной строке, начиная с i-ой позиции, содержится меньше n символов, метод удаляет имеющиеся символы с i-ой позиции).

Пример: Заменить в строке S символы с 3-го по 7-ой на многоточие.

 

S.Delete(3,5);

S.Insert("...",3);

int Pos(String S2) - ищет первое вхождение подстроки S2 в данной строке. Результат - номер позиции, начиная с которой в строке содержится S2, либо 0, если S2 в ней не содержится.

Пример:

S1="Ababab", S2="ab";

i=S1.Pos(S2); // i=3

 

char * c_str() - преобразует строку к типу "массив char" (см. ниже).

 

Наконец, наряду с методами, для типа String существуют также функции, например функции преобразования к заданному регистру. Они преобразуют не только латинские, но и русские буквы. Они могут применяться с целью регистро-нечувствительного сравнения:

String AnsiUpperCase (String S); ее результат получается из строки S преобразованием всех букв к верхнему регистру (большие буквы);

String AnsiLowerCase (String S); ее результат получается из строки S преобразованием всех букв к нижнему регистру (малые буквы);

Пример:

 

S1="Язык - Java";

S2=AnsiUpperCase(S1); // S2="ЯЗЫК - JAVA"

 

 

Задача 5. В Edit1 заменить все пробелы на символы подчеркивания.

 

String S=Edit1->Text;

for (int i=1; i<=S.Length(); i++)

if (S[i]==' ') S[i]='_';

Edit1->Text=S;

 

Задача 6. Заменить в строке все слова "NO" на "YES" (заменять только целые слова):

 

s=" "+s+" "; // иначе 1-е и последнее слова не узнает

while(i=s.Pos(" NO ")) { //Пока Pos!=0, i присв. Pos

s.Delete(i,4);

s.Insert(" YES ",i);

}

s=s.SubString(2,s.Length()-2);//теперь удаляем пробелы

 

 

Задача 7. Заменить в строке все слова "NO" (без учета регистра) на "YES" (большими буквами); заменять только целые слова:

 

s=" "+s+" "; // иначе 1-е и последнее слова не узнает

while(i=AnsiUpperCase(s).Pos(" NO ")) {

s.Delete(i,4);

s.Insert(" YES ",i);

}

s=s.SubString(2,s.Length()-2);//теперь удаляем пробелы

 

 

Задача 8. Ввести строку, состоящую из слов, разделенных пробелами. Вывести эти слова в обратном порядке, при этом самое первое по алфавиту (независимо от регистра) из них записать только большими буквами.

 

String s,t,r,w[90];

int i,j,n=0,k;

s=Edit1->Text+" ";

for (i=1; i<=s.Length(); i++)

if (s[i]!=' ')

t+=s[i];

else

if (t!="") {

w[n++]=t;

t="";

}

 

for (k=i=0; i<n; i++)

if (AnsiUpperCase(w[i])< AnsiUpperCase(w[k])) k=i;

w[k]=AnsiUpperCase(w[k]);

 

for (i=n-1; i>=0; i--)

r+=w[i]+(i==0? "" : " " );

Edit1->Text=r;

 

 



<== предыдущая лекция | следующая лекция ==>
Е) Примеры работы со строками - массивами char. | Сущность и предназначение функций.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.372 сек.