Программирование на языке высокого уровня Лекция 9. Символы. Кодировки. Строки. Массивы строк Кафедра АСОИУ ОмГТУ, 2012 Богатов Р.Н.
Встроенные типы данных C# ТипДиапазон значений Размер (байт) sbyte-128 … 1271 byte0 … 2551 short … ushort0 … int … uint0 … long … ulong0 … float±1,5· … ±3,4·10 +38, точность – 7 разрядов4 double±5,0· … ±1,7· , точность – 16 разрядов8 decimal±1· … ±7,9·10 +28, точность – 28 разрядов1616 booltrue или false1 char0 … (код символа)2
Символы Скольки-значный должен быть код для представления одного символа текста? A…Z a…z 0…9 – это … 96 символов 6 бит = 64 значения 7 бит = 128 значений 8 бит = 256 значений Изначальная идея: один символ – один байт. Коды 0…127 – основной набор символов, коды 128…255 – для национального алфавита. ASCII – базовая 7-битовая кодировка для латинского алфавита и основных символов. Кириллические кодировки (CP866, Windows CP1251, KOI8-R и другие) отличаются только размещением русских букв в диапазоне кодов 128…255.
Кодировка Windows CP !49165A81Q97a113q 21834"50266B82R98b114r 31935#51367C83S99c115s 42036$52468D84T100d116t 52137%53569E85U101e117u 62238&54670F86V102f118v 72339'55771G87W103g119w 82440(56872H88X104h120x 92541)57973I89Y105i121y *58:74J90Z106j122z ;75K91[107k123{ ,6078N94^110n126~ /63?79O95_111o Ђ144ђ °192А208Р224а240р 129Ѓ145161Ў177±193Б209С225б241с ў178І194В210Т226в242т 131ѓ147163Ј179і195Г211У227г243у ¤180ґ196Д212Ф228д244ф 133…149165Ґ181µ197Е213Х229е245х –166¦182¶198Ж214Ц230ж246ц §183·199З215Ч231з247ч 168Ё184ё200И216Ш232и248ш ©185201Й217Щ233й249щ 138Љ154љ170Є186є202К218Ъ234к250ъ «187»203Л219Ы235л251ы 140Њ156њ172¬188ј204М220Ь236м252ь 141Ќ157ќ173189Ѕ205Н221Э237н253э 142Ћ158ћ174®190ѕ206О222Ю238о254ю 143Џ159џ175Ї191ї207П223Я239п255я
Кодировка Unicode 128…65535 (16 бит)
Символы в C#. Примеры // объявление и инициализация char a, b; a = '7'; textBox1.Text += a; b = (char)55; textBox1.Text += b; // результат одинаковый // объявление и инициализация char a, b; a = '7'; textBox1.Text += a; b = (char)55; textBox1.Text += b; // результат одинаковый // посмотреть кодировку ASCII for (int i = 1; i < 256; i++) textBox1.Text += (char)i; // посмотреть кодировку ASCII for (int i = 1; i < 256; i++) textBox1.Text += (char)i; // посмотреть кодировку Unicode for (int i = 1; i < 65536; i++) textBox1.Text += (char)i; // не запускайте – // работает слишком долго :о( // посмотреть кодировку Unicode for (int i = 1; i < 65536; i++) textBox1.Text += (char)i; // не запускайте – // работает слишком долго :о(
Строки в C#. Примеры // объявление и инициализация string s1, s2, s3; s1 = ""; s2 = "7"; // не эквивалентно '7' s1 += "Привет, "; s3 = s1 + s2 + "!\r\nПока!"; textBox1.Text = s3; // объявление и инициализация string s1, s2, s3; s1 = ""; s2 = "7"; // не эквивалентно '7' s1 += "Привет, "; s3 = s1 + s2 + "!\r\nПока!"; textBox1.Text = s3; // сравнение строк if (s1 == s2) MessageBox.Show("Ура!"); bool SuperUser; if (s3 == "Admin") SuperUser = true; else SuperUser = false; // сравнение строк if (s1 == s2) MessageBox.Show("Ура!"); bool SuperUser; if (s3 == "Admin") SuperUser = true; else SuperUser = false; // длина строки, посимвольный просмотр, переворот for (int i = 0; i < s1.Length; i++) s2 = s1[i] + s2; // длина строки, посимвольный просмотр, переворот for (int i = 0; i < s1.Length; i++) s2 = s1[i] + s2; // поcимвольный просмотр, переворот foreach(char x in s1) s2 = x + s2; // поcимвольный просмотр, переворот foreach(char x in s1) s2 = x + s2;
Строки в C#. Подстроки // поиск подстроки string s = textBox1.Text; int p = s.IndexOf("Вася"); if (p == -1) MessageBox.Show("А про Васю ничего!"); else MessageBox.Show("Вася с "+(p+1)+"-го символа!"); // поиск подстроки string s = textBox1.Text; int p = s.IndexOf("Вася"); if (p == -1) MessageBox.Show("А про Васю ничего!"); else MessageBox.Show("Вася с "+(p+1)+"-го символа!"); // выделение подстроки string s1 = "Дано: x = -3,1415; y = 0,5. Найти z."; int p1 = s1.IndexOf("x = "); int p2 = s1.IndexOf(";", p1); string s2 = s1.Substring(p1+4, p2-p1-4); double x = Convert.ToDouble(s2); // выделение подстроки string s1 = "Дано: x = -3,1415; y = 0,5. Найти z."; int p1 = s1.IndexOf("x = "); int p2 = s1.IndexOf(";", p1); string s2 = s1.Substring(p1+4, p2-p1-4); double x = Convert.ToDouble(s2); // вставка подстроки string s1 = textBox1.Text; string s2 = textBox2.Text; int p = s1.IndexOf(s2); if (p != -1) textBox3.Text = s1.Insert(p, "НаШёЛ->"); // вставка подстроки string s1 = textBox1.Text; string s2 = textBox2.Text; int p = s1.IndexOf(s2); if (p != -1) textBox3.Text = s1.Insert(p, "НаШёЛ->");
Кодировка Unicode // посмотреть все возможные символы string s = ""; for (int i = 1; i < 65536; i++) s += (char)i; textBox1.Text = s; // всё-равно долго работает :о/ // посмотреть все возможные символы string s = ""; for (int i = 1; i < 65536; i++) s += (char)i; textBox1.Text = s; // всё-равно долго работает :о/ // посмотреть все возможные символы char[] a = new char[65536]; for (int i = 0; i < 65535; i++) a[i] = (char)(i+1); textBox1.Text = new string(a); // работает быстро, //...но TextBox'у потом тяжело // посмотреть все возможные символы char[] a = new char[65536]; for (int i = 0; i < 65535; i++) a[i] = (char)(i+1); textBox1.Text = new string(a); // работает быстро, //...но TextBox'у потом тяжело
Константный массив строк Задача: заменить в тексте каждую цифру на её название, взятое в скобки. Например, текст «Мне 18 лет» должен преобразоваться в «Мне (один)(восемь) лет». string s = textBox1.Text; string z = ""; foreach(char c in s) switch (c) { case '1': z += "(один)"; break; case '2': z += "(два)"; break;... case '0': z += "(ноль)"; break; default: z += c; break; } textBox2.Text = z; string s = textBox1.Text; string z = ""; foreach(char c in s) switch (c) { case '1': z += "(один)"; break; case '2': z += "(два)"; break;... case '0': z += "(ноль)"; break; default: z += c; break; } textBox2.Text = z; string s = textBox1.Text; string z = ""; string[] x = new string[] { "ноль", "один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять" }; foreach(char c in s) if (c >= '0' && c = '0' && c
string s = textBox1.Text; // удаление подстроки «, так сказать, » s = s.Replace(", так сказать, ", ""); // замена воскл. знаков на точки s = s.Replace("!", "."); // замена подстроки на подстроку s = s.Replace("редиска", "нехороший человек"); textBox2.Text = s; string s = textBox1.Text; // удаление подстроки «, так сказать, » s = s.Replace(", так сказать, ", ""); // замена воскл. знаков на точки s = s.Replace("!", "."); // замена подстроки на подстроку s = s.Replace("редиска", "нехороший человек"); textBox2.Text = s; Строки в C#. Удаление, замена подстроки и прочее string s = textBox1.Text; s = s.Replace("0", "(ноль)"); s = s.Replace("1", "(один)"); s = s.Replace("2", "(два)"); s = s.Replace("3", "(три)"); s = s.Replace("4", "(четыре)"); s = s.Replace("5", "(пять)"); s = s.Replace("6", "(шесть)"); s = s.Replace("7", "(семь)"); s = s.Replace("8", "(восемь)"); s = s.Replace("9", "(девять)"); textBox2.Text = s; string s = textBox1.Text; s = s.Replace("0", "(ноль)"); s = s.Replace("1", "(один)"); s = s.Replace("2", "(два)"); s = s.Replace("3", "(три)"); s = s.Replace("4", "(четыре)"); s = s.Replace("5", "(пять)"); s = s.Replace("6", "(шесть)"); s = s.Replace("7", "(семь)"); s = s.Replace("8", "(восемь)"); s = s.Replace("9", "(девять)"); textBox2.Text = s;
// разбить текст в тех местах, где стоят знаки.?! string s = textBox1.Text; // заводим массив символов-разделителей char[] x = { '.', '?', '!' }; // разбиваем строку s string[] r = s.Split(x); // r – массив строк, не содержащих.?! // разбить текст в тех местах, где стоят знаки.?! string s = textBox1.Text; // заводим массив символов-разделителей char[] x = { '.', '?', '!' }; // разбиваем строку s string[] r = s.Split(x); // r – массив строк, не содержащих.?! Строки в C#. Метод Split // массив символов-разделителей вводит пользователь string s = textBox1.Text; char[] x = textBox2.Text.ToCharArray(); string[] r = s.Split(x); // полученные строки выводим в столбик textBox3.Text = ""; foreach(string a in r) textBox3.Text += a + "\r\n"; label4.Text = Convert.ToString(r.Length); // массив символов-разделителей вводит пользователь string s = textBox1.Text; char[] x = textBox2.Text.ToCharArray(); string[] r = s.Split(x); // полученные строки выводим в столбик textBox3.Text = ""; foreach(string a in r) textBox3.Text += a + "\r\n"; label4.Text = Convert.ToString(r.Length);
string s = textBox1.Text.ToLower(); string x = "аеёиоуыэюя"; int count = 0; // кол-во гласных в тексте foreach(char c in s) foreach(char v in x) if (c == v) { count++; break; } label3.Text = Convert.ToString(count); string s = textBox1.Text.ToLower(); string x = "аеёиоуыэюя"; int count = 0; // кол-во гласных в тексте foreach(char c in s) foreach(char v in x) if (c == v) { count++; break; } label3.Text = Convert.ToString(count); Пример: подсчёт гласных букв в тексте string s = textBox1.Text.ToLower(); char[] x = { 'а', 'е', 'ё', 'и', 'о', 'у', 'ы', 'э', 'ю', 'я' }; int count = 0; for(int pos = -1; ; count++) { pos = s.IndexOfAny(x, pos + 1); if (pos == -1) break; } label3.Text = Convert.ToString(count); string s = textBox1.Text.ToLower(); char[] x = { 'а', 'е', 'ё', 'и', 'о', 'у', 'ы', 'э', 'ю', 'я' }; int count = 0; for(int pos = -1; ; count++) { pos = s.IndexOfAny(x, pos + 1); if (pos == -1) break; } label3.Text = Convert.ToString(count); string s = textBox1.Text.ToLower(); char[] x = { 'а', 'е', 'ё', 'и', 'о', 'у', 'ы', 'э', 'ю', 'я' }; string[] r = s.Split(x); label3.Text = Convert.ToString(r.Length - 1); string s = textBox1.Text.ToLower(); char[] x = { 'а', 'е', 'ё', 'и', 'о', 'у', 'ы', 'э', 'ю', 'я' }; string[] r = s.Split(x); label3.Text = Convert.ToString(r.Length - 1);
Домашнее задание Решить задачу с помощью массива строк. Определить, в каком квадранте или на какой оси координат находится точка, заданная пользователем. Если ответ имеет вид «Точка (x 0 ; y 0 ) находится …», то можно использовать массив строк с вариантами ответов: «на оси OY», «на оси OX», «в III квадранте», «в II квадранте», «в IV квадранте», «в I квадранте».