
- •Какую ide(Среду разработки) выбрать?
- •3) Символьная переменная — char.
- •4) Логическая переменная — bool
- •1) Вывод
- •1) Ввод
- •1)Стандартные математические операции,
- •2)Бинарные операции,
- •2) Бинарные операции, продолжение
- •1) Sqrt(a)
- •3) Fmod(a,b)
- •2) While
- •2) Создание функции.
- •3) Функция для перевода из 10-ой системы счисления в k-ую.
- •Поделиться в соц. Сетях
- •Имя файла:
- •Поделиться в соц. Сетях Структуры данных. Стек
- •1) Сокращение выражений:
- •2) Инкремент, декремент
- •3) Считывание переменных в цикле
- •Поделиться в соц. Сетях
Поделиться в соц. Сетях
C++. Урок 10. Строки
Опубликовано 01.12.2012 автором admin
Вот мы и дошли до 10 урока. Его темой, как я и обещал, будут строки.
Фактически, строка (далее string) — это массив типа char. Но есть несколько отличий:
1) String - это динамический массив символов, т.е. ему не надо задавать начальный размер:
1 2 3 4 |
char a [1000]; // создание массива char длиной в 1000 string a; // создание string-a, с динамичной длиной |
2) String можно вводить просто одним cin-ом:
1 2 3 4 5 6 7 8 9 |
char ch, a[1000000]; int n; while (cin >> ch) a[n++] = ch; // создание и ввод массива символов
string s; cin >> s; // создание и ввод string-a |
3) String можно вводить до пробела, или до конца строки:
1 2 3 4 5 |
cin >> s; // ввод string-a до пробельного символа
getline (cin, s); // считывание всей строки |
Т.е. при использовании cin, все введенный вами символы будут записываться в string пока вы не нажметепробел. Если же вы используете getline символы будут записываться пока вы не нажмете enter.
4) String можно приравнивать, сравнивать, складывать и.т.д:
1 2 3 4 5 6 7 8 9 |
string a, b, c, d, s; cin >> a >> b; c = a; d = b; s = a + b; cout << s << "\n"; if (c == d) cout << "Equal! \n"; if (c < d) cout << "First string is lexicographically smaller than second one \n"; if (c > d) cout << "Second string is lexicographically smaller than first one \n"; |
Заметьте, что при сравнении двух строк меньшей будет та, которая меньше лексикографически, т.е. в алфавитном порядке. Пример лексикографически отсортированного по возрастанию набора слов:
a, abcdefg, abscissa, b, bbb, bbbbb, bulvar, bulvara, grajdanstvo, zub, zubnoy.
При сложении двух строк, в конец первой строки будет записана вторая строка.
5) Для присваивания значения string-у используются кавычки («»):
1 2 3 4 5 6 7 8 9 |
char a[5] = {'0', '1', '2', '3', '4'}; for (int i = 0; i < 5; ++i) cout << a[i]; cout << "\n"; // присваивание и вывод массива символов
string s = "01234"; cout << s << "\n"; // присваивание и вывод string-a |
С различиями вроде все. Но главная особенность string-а в том, что в STL (Standard Template Library, или стандартная библиотека шаблонов) для него припасено много полезных функций:
1) string.size()
Возвращает размер string-a, а именно количество символов в нем. Стоит упомянуть, что символы в string-е пронумерованы начиная с нуля.
1 2 3 |
string user_name; cin >> user_name; cout << user_name.size() << "\n" << s << "\n"; |
2) string.empty()
Возвращает true, если string пуст.
1 2 3 4 5 6 |
string str; cin >> str; if (str.empty() == true) cout << "Error! Empty filename! \n"; else cout << "Success! \n"; |
3) string.clear()
Очищает строку, т.е. string.size() становится нулем, а string.empty() будет возвращать true.
1 2 3 4 5 |
string s; cin >> s; cout << s; s.clear(); cin >> s; |
4) string.push_back (char)
Добавляет в конец строки char-овский символ.
1 2 3 4 5 |
char ch; string str; whlie (cin >> ch) str.push_back(ch); cout << str; |
5) string.insert (int start1, string from, int start2, int amount)
Вставляет в строку начиная с позиции start1, amount символов, начиная со start2, из строки from. Т.е. написав:
1 |
str.insert (6, name, 17, 3); |
мы вставив в строку str, начиная с ячейки 6, символы из строки name с номерами 17, 18 и 19.
1 2 3 4 5 6 7 |
string a = "to be", b = "or not", c = "that is", d = "the question!", s; s.insert (0, a, 0, a.size()); s.insert (s.size() - 1, b, 0, b.size()); s.insert (s.size() - 1, a, 0, 5); s.insert (s.size() - 1, c, 0, c.size()); s.insert (s.size() - 1, d, 0, d.size()); cout << s; |
6) string.erase (int from, int amount)
Стирает из строки amount символов, начиная с ячейки from.
1 2 3 |
string s = "a shot in the dark"; s.erase (2, 1); cout << s; |
7) string.reverse (int from, int to)
Перевернет строку начиная с ячейки from до ячейки to (to не включительно).
1 2 3 |
string a = "sator arepo tenet opera rotas"; a.reverse (0, a.size()); cout << a; |
Итог:
Так получилось, что я сижу и нахваливаю string и всячески показываю его преимущества перед массивом char. Надо это исправить.
+ массива символов:
Работает заметно быстрее, чем string.
Потребляет меньше памяти.
Имеется способ считывания массива вместе с пробельными символами, с помощью функции gets():
1 2 3 4 |
char str[100]; gets (str); cout << strlen(str) << " " << str << "\n"; // длина массива, сам массив |
- массива символов:
Нету STL-овских функций.
+ строки:
Удобное считывание файлов.
Наличие множества полезных функций предназначенных для string.
- строки:
Медленная скорость работы и большое потребление памяти
Иногда, при изменении строки без специальных функций, целостность строки разрушается и ее нельзя вывести простым cout-ом.
У-ф-ф. Вроде на этом все. Спасибо за прочтение. Следующий урок будет о текстовом вводе выводе.
C++. Урок 11. Файловый ввод-вывод.
Опубликовано 13.12.2012 автором admin
Всем доброго дня!
До этого мы уже затрагивали тему ввода-вывода. И это было простой консолью. Теперь мы поговорим офайловом вводе-выводе.
Что из себя представляет эта тема понятно уже по названию, но все же… :
Файловый ввод-вывод позволяет считывать данные из множества различных файлов, и выводить их в другие (или те же) файлы .
Итак, для считывания файлов можно использовать функцию freopen, которая позволяет перенаправлять потоки ввода-вывода. Ввод всегда идет в поток stdin, вывод же в stdout. Теперь о том, как пользоватьсяfreopen-ом:
1 |
freopen ("имя файла", "мод", "имя потока"); |