WWW.DISSERS.RU

БЕСПЛАТНАЯ ЭЛЕКТРОННАЯ БИБЛИОТЕКА

   Добро пожаловать!


Pages:     | 1 |   ...   | 3 | 4 || 6 | 7 |   ...   | 11 |

char str_R[133]="АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЪЬЭЮЯ" "абвгдежзийклмнопрстуфхцчшщыъьэюя";

cout<

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

Поскольку строка символов является массивом, нельзя присвоить одну строку другой – необходимо выполнить операцию присваивания для каждого элемента. Точно так же нельзя сравнивать строки. Для выполнения этих и других операций со строками можно использовать встроенные функции, объявленные в файле string.h. В частности, присваивание символьных массивов реализуется функцией strcpy(s1,s2), сравнение – функцией strcmp(s1,s2), важнейшая для строк операция склеивания (конкатенация) выполняется функцией strcat(s1,s2), для вычисления длины строки введена функция strlen(s). Поиск в содержимом строки можно выполнить с помощью функций strchr(s,ch) и strstr(s1,s2). Использование указанных функций проиллюстрировано дальнейшими примерами.

Пример. Ввод строки с клавиатуры. Длина введенной строки вычисляется с помощью strlen(), затем выполняется копирование с помощью функции strcpy().

char month[10], temp[10];;

cout<<"\n Vvodim: " ; cin>>month;

cout<

strcpy(temp,month);// копируем month в temp cout<

Замечание. Функция strlen() подсчитывает количество символов в строке без учета символа '\0'.

Пример. Ввод строки с клавиатуры средствами языка C.

char month[10], temp[10];

printf("\n Vvodim: "); scanf("%s",month);

printf("\n %s Dlina=%d",month,strlen(month));

strcpy(temp,month);

printf("\n %s Dlina=%d\n",temp,strlen(temp));

Пример. Объединение введенных строк с помощью strcat().

// Конкатенация строк char month[10], day[10], result[21];

cout<<"\n month: " ; cin>>month;

cout<<"\n day: " ; cin>>day;

strcpy(result,month);

strcat(result," ");// добавили пробел strcat(result,day);

cout<<"\n result= "<

При вводе могут возникнуть ошибки, если количество введенных символов окажется больше, чем выделено памяти для строки. Например, если в программе предыдущего примера ввести "September-" (строка заканчивается символом '-'), то будет сообщено об ошибке, поскольку для хранения month выделено 10 байт, а введенные данные, с учетом нулевого символа, требуют 11 байт. Отметим, что начальные и терминальные пробелы при вводе игнорируются и не вызовут проблем.

Аналогично, недостаток выделенной памяти может привести к ошибке и при выполнении других операций со строками.

Пример. Сравнение строк с помощью функции strcmp(s1,s2).

Сравнение производится посимвольно от начала строк, сравниваются коды символов. Функция возвращает 0, если строки s1 и s2 совпадают, отрицательное значение, если s1s2. При сравнении учитывается регистр.

// Сравнение строк char s1[]="Progress";

char s2[]="Progress";

char s3[]="Programm";

// Проверка на равенство строк:

if(strcmp(s1, s2)==0) cout<<"\n"<

// или, что гораздо лучше:

if(!strcmp(s1, s2)) /* отрицание '!', т.к. при равенстве результат = 0 */ cout<<"\n"<

// кто раньше в алфавитном порядке:

int p=strcmp(s2, s3);

if(!p) cout<<"\n s2=s3";

else if(p>0) cout<<"\n"<"<

else cout<<"\n"<

Замечание. При повторном использовании результата одной и той же функции это значение сохраняют в локальной переменной (в примере – переменная p). Это важное правило позволяет сделать код эффективнее (в книге Голуб А. Правила программирования на Си и Си++ оно обозначено как Избегайте дублирования усилий).

Пример. Сравнение строк с помощью функции strncmp(s1,s2,n).

Сравниваются только n начальных символов строк.

// Сравнение начальных отрезков строк char sa[]="Progress";

char sb[]="Programm";

cout<<"\nsa="<

cout<<"\nsb="<

cout<<"\n strncmp(sa, sb,5)="<

cout<<"\n strncmp(sa, sb,6)="<

cout<<"\n strncmp(sb, sa,6)="<

Первые 5 символов сравниваемых строк совпадают, поэтому strncmp(sa, sb,5) возвращает 0. Отрезки из 6 символов уже отличаются, значения функций strncmp(sa, sb,6) и strncmp(sb, sa,6) будет понятно, если отметить, что код символа 'e' равен 101, а код символа 'a' равен 97.

Пример. Поиск подстроки с помощью функции strstr(s1,s2).

Функция возвращает указатель на позицию первого вхождения строки s1 в s2, или NULL, если s1 не содержит s2.

// Поиск подстроки char s1[]="Photograpy";

char s2[]="hot";

char *ps=strstr(s1,s2);

cout<<"\n s1="<

cout<<"\n s2="<

if (ps) // ps != NULL, т.е. нашли cout<<"\n strstr(s1,s2)="<

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

Пример. Конвертация символьных массивов в числовые типы.

Функция atoi()преобразует строку, указанную как параметр, в целое число, а функция atof() преобразует строку в число с плавающей точкой.

Функции вернут 0, если преобразование невозможно.

#include #include #include using namespace std;

int main () { setlocale(LC_CTYPE, "rus"); // русификация консоли char chislo [10];



cout << " Ввести целое число ";

cin>>chislo;

// преобразуем символы в целое число:

int n;

n=atoi(chislo); // в целое // cout<<"\n n="<

cout << " Ввести число "; cin>>chislo;

// преобразуем символы в число с плав. точкой:

double x=atof(chislo); // в double cout<<"\n x="<

return 0;

} Если преобразование из строки в число невозможно, программа все равно работает, но с числами, равными 0.

Пример. Преобразование числовых данных в строку с помощью функции sprintf(). Эта функция устроена так же, как функция printf(), но вывод производится не на экран, а в строку, укзанную первым параметром.

// Конвертация числовых данных в строки int n=1001; double x=12340000.00;

// преобразование целого числа в строку char sn[12];

sprintf(sn,"%d",n);// печать в строку printf("\n n=%d sn=%s\n",n,sn);

// преобразование числа с плав. точкой в строку char sd[22];

sprintf(sd,"%e",x);// печать в строку printf("\n x=%e sd=%s\n",x,sd);

char sdd[22];

sprintf(sdd,"%f",x);// печать в строку printf("\n x=%e sdd=%s\n",x,sdd);

char sddd[22];

sprintf(sddd,"%10.1f",x);// печать в строку printf("\n x=%e sddd=%s\n\n",x,sddd);

В следующих примерах показано как символьные массивы передаются в функции.

Пример. Символьный массив – параметр функции. Функция ansi2oem() преобразует символы строки, переданной в качестве параметра, из кодировки cp1251 (ANSI) в кодировку cp866 (OEM-866 или DOS-кодировка).

#include using namespace std;

void ansi2oem(char *stroka);

int main() { char str_Rc[]="АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЫЪЬЭЮЯ";

cout<<"\nDo: str_Rc="<

ansi2oem(str_Rc);

cout<<"\nPosle: str_Rc="<

char str_Rs[]="абвгдежзийклмнопрстуфхцчшщыъьэюя";

cout<<"\nDo: str_Rs="<

ansi2oem(str_Rs);

cout<<"\nPosle: str_Rs="<

char str_Ec[]="ABCDEFGHIJKLMNOPRSTUVWZ";

cout<<"\nDo: str_Ec="<

ansi2oem(str_Ec);

cout<<"\nPosle: str_Ec="<

char str_Es[]="abcdefghijklmnoprstuvwz";

cout<<"\nDo: str_Es="<

ansi2oem(str_Es);

cout<<"\nPosle: str_Es="<

return 0;

} void ansi2oem(char *stroka) { int cnt,i=0;

char ch;

while((ch=stroka[i])!='\0') { cnt=ch;

if ((ch>='а') && (ch<='п')) cnt-=64;

else if ((ch>='р') && (ch<='я')) cnt-=16;

else if (ch=='') cnt=241;

else if (ch=='Ё') cnt=240;

else if ((ch>='А') && (ch<='Я')) cnt-=64;

stroka[i]=cnt; i++;

} } Пример. Функция copy_string() содержит 2 параметра в виде символьных массивов. Символы из строки s_in копирутся в строку s_out.

#include using namespace std;

void copy_string (char [], char []);

int main () { char name [30];

copy_string(name,"Alexandra");

cout << name<<"\n";

return 0;

} void copy_string(char s_out [], char s_in []) { int i=0;

do { s_out[i] = s_in[i];

} while (s_in[i++] != '\0');

Пример. Пожалуй, cpy() - самая короткая функция копирования (см. Стауструп Б. Язык программирования C++.).

#include using namespace std;

void cpy (char *, char *);

int main () { char s1 [30];

char s2 [] = "September";

cpy(s1,s2);

cout << s1<<"\n";

cpy(s2,"November");

cout << s2<<"\n";

return 0;

} void cpy(char *p, char *q) { while (*p++ = *q++); } В языке C++ для строковых данных введен также класс string. Класс содержит методы, упрощающие обращение со строками – строки можно сравнивать, присоединять, выполнять поиск в содержимом строк. Вполне обоснованной является рекомендация Б. Страуструпа (см. Язык программирования C++) – свести к минимуму использование массивов символов, использовать класс string.

Пример. Создание строк – объектов класса string.

string s1("Progress");

string s2 ="Programm";

string s3(s1); // s3 создается такой же, как sstring s4,s5;

cout<<"\n s1="<

cout<<"\n s2="<

cout<<"\n s3="<

// Присваивание строк:

s4=s2;

cout<<"\n s4=s2="<

// Ввод строк:

cout<<"\n Type: "; cin>>s5;

cout<<"\n s5="<

Пример. Сравнение строк.

// сравнение строк string s1("Progress");

string s2 ="Programm";

string s3(s1);

cout<<"\n s1="<

cout<<"\n s2="<

cout<<"\n s3="<

if(s3==s1) cout<<"\n s3 = s1";

else cout<< cout<<"\n s3 != s1";

if (s1>s2) cout<<"\n s1 > s2";

else cout<<"\n s1 <= s2";

Пример. Сравнение строк с кириллицей.

setlocale(LC_CTYPE, "rus");//русификация консоли string s1("Прогресс");

string s2 ="Программа";

string s3(s1);

cout<<"\n s1="<

cout<<"\n s2="<

cout<<"\n s3="<

if(s3==s1) cout<<"\n s3 = s1";

else cout<< cout<<"\n s3 != s1";

if (s1>s2) cout<<"\n s1 > s2";

else cout<<"\n s1 <= s2";

Пример. Конкатенация строк.

setlocale(LC_CTYPE, "rus");//русификация консоли string s1("Программирование");

string s2 ="C++";

string s3=s1 +" на " + s2;

cout<<"\n s3 = "<

Замечание. Следующий код воспринимается компилятором как ошибочный.





string str;

str="Programming " + " C++";

cout<<"\n str = "<

Хотя проблема, в каком-то смысле, надуманная – можно просто слить строки, передвинув кавычки, – укажем ещ одно решение (раскрывающее объектную природу этого вопроса).

string str;

str=string("Programming ") + " C++";

cout<<"\n str = "<

Здесь был вызван конструктор класса string и создан неименованный объект этого класса. Хотя старый синтаксис приведения типа string str;

str=(string)"Programming " + " C++";

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

На самом деле, код s3=s1+sозначает s3.operator = (s1.operator +=(s2));

т. е. является вызовом перегруженных функций.

Пример. Замена части строки операцией replace(n,m,s), где n – позиция в строке, с которой производится замена, m – количество заменяемых символов, а s – замещающая строка. В примере замещающий текст равен "abcd" – эти 4 символа будут вставлены с 5 позиции вместо символов строки str.

// Замена части строки string str("0123456789");

cout<<"\n str="<

str.replace(5,2,"abcd");

cout<<"\n str="<

Пример. Удаление части строки операцией erase(n,m), где n – позиция в строке, начиная с которой выполняется операция, а – m количество удаляемых символов.

// Удаление части строки string str("0123456789");

cout<<"\n str="<

str.erase(3,5); // 5 символов, начиная с 3-го cout<<"\n str="<

cout<<"\n";

Пример. Выделение подстроки операцией substr(n,m), где n – позиция в строке, начиная с которой выполняется операция, а – m количество выделяемых символов.

// Выделение части строки string str1("0123456789");

cout<<"\n str1="<

string str2;

str2=str1.substr(5,4);// 4 символа, начиная с 5-го cout<<"\n str2="<

cout<<"\n";

Пример. Поиск вхождения символов в строку с помощью операции find().

// Поиск в строке string str("abcdefgh");

cout<<"\n str="<

char ch='g';

int ind_ch = str.find(ch); // cout<<"\n ch="<

int ind_s = str.find(s);

cout<<"\n s="<

Замечание. Класс string поддерживает несколько перегруженных операций поиска find(s). Подробности см., напр., Прата С. Язык программирования C++ (C++11). Лекции и упражнения.

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

// Поиск в строке, npos string str("abcdefgh");

cout<<"\n str="<

char ch='z';

int ind_ch = str.find(ch);

if (ind_ch != string::npos) cout<<"\n ch="<

string s="klmn";

int ind_s = str.find(s);

if (ind_s != string::npos) cout<<"\n s="<

else cout<<"\n "<

Замечание. Переменная npos является статическим элементом класса string и равна максимально возможному количеству символов в объекте класса string.

Пример. Операция find() успешно ищет текст с кириллицей.

// Поиск в строке c кириллицей setlocale(LC_CTYPE, "rus");//русификация консоли string str("абвгдежзиклмн");

cout<<"\n str="<

char ch='';

int ind_ch = str.find(ch);

if (ind_ch != string::npos) cout<<"\n ch="<

string s="клмн";

int ind_s = str.find(s);

if (ind_s != string::npos) cout<<"\n s="<

else cout<<"\n "<

Замечание. В языке C++ для работы со строками имеется еще один класс – String. Функционально этот класс уступает классу string.

Подробнее об использовании класса String см., напр., Штерн В. Основы C++. Методы программной инженерии.

Многомерные массивы В C и C++ поддерживаются многомерные массивы. При объявлении многомерных массивов задается тип элементов массива, имя массива и затем, в отдельных квадратных скобках – количества элементов по каждой размерности:

тип имя_массива [Размер1][Размер2]...[РазмерN];

Пример.

// многомерные массивы const int K=4;

const int N=3;

const int M=5;

int one[N];

int two[N][M];

int three[K][N][M];

for (int i=0;i

for (int p=0;p

for (int i=0;i

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

Пример. Инициализация двумерного массива (матрицы). Значения можно записать подряд или же разбить на группы, выделив каждую строку матрицы, фигурными скобками (этот способ называют subaggregate grouping, т.е. группирование подагрегатов).

// Магический квадрат const int N=4;

int mag1[N][N]={16,3,2,13,5,10,11,8, 9,6,7,12,4,15,14,1};

int mag2[N][N] ={ {16,3,2,13}, {5,10,11,8}, {9,6,7,12}, {4,15,14,1} };

for (int i=0;i

cout<<"\n"; // новая строка матрицы } Пример. Вычисление произведения сумм элементов строк матрицы:

N M p aij. Матрица заполняется случайными числами.

Pages:     | 1 |   ...   | 3 | 4 || 6 | 7 |   ...   | 11 |










© 2011 www.dissers.ru - «Бесплатная электронная библиотека»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.