
- •Часть 2. Основы программирования
- •Часть 2. Основы программирования
- •Содержание
- •Предисловие
- •Лабораторная работа 21 Подставляемые (встраиваемые) функции. Перегрузка функций
- •Лабораторная работа 22 Производные типы. Тип указатель: указатели на объекты
- •Лабораторная работа 23 Тип указатель: указатели на функции
- •Лабораторная работа 24 Решение задач с использованием указателей
- •Лабораторная работа 25 Символьные данные и строки
- •Лабораторная работа 26 Функции для работы со строками
- •Лабораторная работа 27 Решение задач на строки
- •Лабораторная работа 28 Массивы: одномерные массивы
- •Лабораторная работа 29 Одномерные массивы: задачи поиска, замены и перестановок элементов массива
- •Лабораторная работа 30 Одномерные массивы: задачи сортировок элементов массива
- •Лабораторная работа 31 Двумерные массивы. Задачи поиска, замены и суммирования элементов двумерного массива
- •Лабораторная работа 32 Двумерные массивы. Задачи сортировок и перестановок в двумерных массивах
- •Индивидуальные задания Требования к оформлению индивидуальных заданий
- •Задание 1. Указатели
- •Задание 2. Перегрузка функций
- •Задание 3. Строки
- •Задание 4. Одномерный массив: преобразование массива
- •Задание 5. Одномерный массив: сортировка массива
- •Задание 6. Двумерный массив
- •Литература
- •Часть 2. Основы программирования
Лабораторная работа 27 Решение задач на строки
Цель работы: научиться решить задачи на строки, используя, функции для работы со строками и изучить принцип работы строк и указателей в языке C++.
Теоретические сведения
Строки и указатели
Сроки в языке С++ представляют собой массив символов. Поскольку имя массива без индексов является указателем на первый элемент этого массива, то при использовании функций обработки строк им будут передаваться не сами строки, а указатели на них.
Так как все строки в языке С++ заканчиваются нулевым символом, который имеет значение «ложь», то условие в операторе while(*str) будет истинным до тех пор, пока программа не достигнет конца строки.
При использовании функций для работы со строками в большинстве случаев целесообразно применять указатели. Приведем примеры фрагментов программ:
/*Пример собственной функции копирования строки s2 в s1*/
char * strcpy_my (char *s1, char *s2){
char *ptrs1 = s1;
//указатель инициализирован на начало строки
while ((*s1++ = *s2++) != 0);
return ptrs1; //возвращается указатель на строку s1
}
Следующий пример демонстрирует, что использование нулевого ограничителя упрощает различные операции над строками.
/*Пример собственной функции конкатенации*/
char * strcat_my (char *s1, char *s2) {
char *p1, *p2;
p1 = s1; p2 = s2;
while ( *p1 != ‘\0’) p1++; //найти конец 1-ой строки.
//или while ( *p1) p1++;
while ((*p1 = *p2) != 0) {
/*копировать строку р2, пока не будет скопирован нулевой
Ограничитель*/
p1++;
p2++; //Передвинуть указатели к следующему байту
} //или while (( *p1++ = *p2++) != 0);/*.
return s1;
}
Пример 1.
/*Демонстрация работы с указателями и с функциями для обработки строк*/
#include <stdio.h>
#include <string.h>
void main() {
char string[100], temp[100], *result, simvol;
int numresult, res;
/*создает строку "computer program" посредством
использования strcpy и strcat*/
strcpy(string, "computer");
result = strcat(string," program");
printf("1) создали строку\n%s\n",result);
/*находит строку, в которой первый раз обнаружено 'a'*/
simvol='a';
result = strchr(string,simvol);
printf("2) находим в строке первое вхождение символа
\'%c\'\n%s\n",simvol,result);
/* создает копию строки */
result = strcpy(temp,string);
printf("3) создали копию строку\n%s\n",result);
/* находит "a","b","c" в строке */
strcpy(string,"xyzabbc");
res = strcspn(string,"abc");
printf("4) определяем длину заданного сегмента
\n%d\n",res);
/*создает новый указатель на строку для дублирования
строки*/
result = strdup(string);
printf("5) создали новый указатель на строку
\n%s\n",result);
}
В предыдущих примерах рассматривалось присваивание указателю адреса только первого элемента массива. Однако это можно делать и с адресом любого отдельного элемента массива путем добавления символа '&' к индексированному имени. Особенно удобно пользоваться этим правилом при выделении подстроки. Например, следующая программа выводит на экран остаток введенной строки после первого пробела:
Пример 2.
/*Вывести на экран остаток строки после первого пробела*/
#include <stdio.h>
void main() {
char s[80], *p;
int i;
printf("ввести строку: ");
gets(s);
/*найти первый пробел или конец строки*/
for(i=0; s[i] && s[i]!=' '; i++);
p = &s[i];
printf(p);
}
В этой программе p будет указывать либо на пробел, если он есть, либо на ноль, если в строке нет пробелов. Если p указывает на пробел, то программа выведет на экран его и затем остаток строки. Например, если ввести фразу «язык программирования С++», функция printf() напечатает сначала пробел и затем «программирования С++». Если p укажет на ноль, то ничего не выводится на экран.
Пример 3:
//Выводит каждое отдельное слово и подсчитывает его длину
#include<iostream.h>
#include<string.h>
#include<stdio.h>
void main() {
char text[100],*p, *razd=" .,";
int dlina;
puts ("Введите текст ");
gets(text);
p=strtok(text,razd); // Выделение первого слова текста
while (p) { // Пока можно выделить слово
dlina=strlen(p); // Определение длины слова
cout << "\n слово "<< p << " длина = " << dlina <<"\n";
p=strtok(NULL,razd);
//Выделение второго, третьего, и т.д. слов
}
}
Задания
Наберите коды программ из Примеров 2 и 3. Выполните компиляцию и запуск программ.
Дана строка, в которой слова разделены одним пробелом. Найдите и распечатайте все слова указанной длины n.
Дана строка из символов латинского алфавита. Вставьте пробел перед каждой заглавной буквой. Перед первой буквой пробел добавлять не надо. Ниже представлен рекомендуемый вид диалога во время работы программы. Данные, вводимые пользователем, выделены жирным шрифтом.
Введите строку символов латинского алфавита:
AtTimesYouMayWantToReadDataFromTheKeyBoard
Полученная строка: At Times You May Want To Read Data From The Key Board
Написать программу, которая вычисляет значение выражения N0O1N1O2…OkNk, где Ni – целое число, Oi – один из двух знаков простейших арифметических действий: сложение (+) и вычитание (–). Считать, что данные введены корректно: в строке заданы только цифры и указанные знаки действий. Ниже представлен рекомендуемый вид диалога во время работы программы. Данные, вводимые пользователем, выделены жирным шрифтом.
Введите арифметическое выражение,
например, 45+5-3-125+2 (пробелы и другие знаки недопустимы)
354-457+74+2-37
Значение выражения 354-457+74+2-37 = -64
Домашние задания
Наберите код программы из Примера 1. Выполните компиляцию и запуск программы.
Напишите программу, которая вычисляет значение выражения N0O1N1O2…OkNk, где Ni – вещественное число, Oi – один из двух знаков простейших арифметических действий: сложение (+) и вычитание (–). Считать, что данные введены корректно: в строке заданы только цифры, разделитель ',' и указанные знаки действий.
Дана строка. Проверьте правильность расстановки в ней круглых скобок: каждой открытой скобке должна соответствовать корректно закрытая скобка.
Индивидуальное задание. Номер варианта определяется по журналу.
Варианты индивидуального задания
№ |
Задание |
|
Напишите функцию для подсчета количества слов в строке S. Под словом будем понимать последовательность из любых символов, разделенных пробелами, а также началом и концом строки. |
|
Дана строка символов. Распечатайте ее по образцу: Введите слово: доклад доклад оклад клад лад ад д |
|
Дана строка, в которой все слова разделены одним пробелом. Поменяйте местами слова, стоящие на четных и нечетных позициях в порядке следования: первое со вторым, третье с четвертым и т.д. |
|
Напишите программу удаления из строки n символов, начиная с q-го. Если количество удаляемых символов превышает допустимую длину, то удаляются символы до конца строки. |
|
Дана строка символов. Распечатайте ее по образцу: Введите слово: программирование программирование рограммировани ограммирован граммирова раммиров аммиро ммир ми |
|
Дана строка символов. Распечатайте ее по образцу: Введите слово: программирование ми ммир аммиро раммиров граммирова ограммирован рограммировани программирование |
|
Даны n предложений, все слова в которых разделены одним пробелом. Признак конца каждого предложения – символ точка. Подсчитайте количество слов в каждом предложении. |
|
Дана строка, в которой все слова разделены одним или несколькими пробелами. Получите новую строку, состоящую из первых букв всех ее слов. |
|
Дана строка, в которой все слова разделены одним пробелом. Поменяйте местами первое и последнее слова. |
|
Напишите программу, которая вставляет пробел после каждой точки в строку, полученную ей в виде входных данных. |
|
В заданной строке найти количество подстрок, состоящих из цифр. Например, в строке "as67 df78 56j6" четыре подстроки, состоящие из цифр. |
|
Дана строка, в которой все слова разделены одним или несколькими пробелами. Найдите количество слов строки, совпадающих с ее последним словом. |
|
Из заданной строки удалить среднюю букву, если длина строки нечетная, иначе – удалить две средние буквы. |
|
Дана строка, в которой все слова разделены одним или несколькими пробелами. Найдите и распечатайте все ее слова, начинающиеся на данный символ Ch. |
|
Заменить в заданной строке все буквы Ch1 на Ch2 (их значения вводить с клавиатуры). |
|
Дана строка, в которой все слова разделены одним или несколькими пробелами. Преобразуйте ее, удалив из каждого слова все вхождения последней буквы этого слова. |
|
Дана строка, в которой все слова разделены одним или несколькими пробелами. Найдите количество слов строки, совпадающих с ее первым словом. |
|
Дана строка, в которой все слова разделены одним или несколькими пробелами. Найдите и распечатайте все ее слова, оканчивающиеся на данный символ Ch. |
|
Из заданной строки удалить все цифры, подсчитать количество и сумму удаленных цифр. |
|
Дана строка. Проверьте, является ли она палиндромом, то есть читается ли она одинаково справа налево и наоборот. |
|
В заданной строке после каждой буквы Ch вставить строку Str1. |
|
Дана строка, в которой все слова разделены одним или несколькими пробелами. Найдите количество слов, у которых первая и последняя буква совпадают. |
|
Ввести произвольный текст. Найти среднюю длину слов в нем. |
|
Определить самое длинное слово в тексте. Считать, что слова в тексте разделены пробелами (одним или несколькими). |
|
Дана строка символов русского алфавита. Определите, сколько в ней гласных букв (заглавных и прописных вместе). |
|
Дана строка, в которой все слова разделены одним или несколькими пробелами. Преобразуйте ее, удалив из каждого слова все вхождения первой буквы этого слова. |
|
Дана строка из символов латинского алфавита, цифр и пробелов. Замените все вхождения символа Ch на символ, следующий за ним по алфавиту. Считать, что за 'z' следует 'a', за '9' следует '0'. Символ Ch задается с клавиатуры. Пробелы не изменяются. |
|
Найдите в строке самый часто встречающийся символ. Распечатайте символ и число его повторений. |