Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

алгоритмизация и программирование 14 глава




 

  names                    
[0]     С е р г е й \0    
[1]     М и х а и л \0    
[2]     Н и к о л а й \0
[3]     И в а н \0        
[4]     А л е к с е й \0

Рисунок 12.3 – Массив указателей

Для вывода первой строки можно использовать оператор cout:

cout «*names; // Печать Сергей

Для вывода второй строки используется следующий оператор cout:

cout «*(names+1); // Печать Михаил

При обращении к элементу массива при помощи оператора *, получаем доступ к одной из строк массива. Можно использовать возвращаемое этим оператором значение везде, где можно использовать строковую константу или символьный массив.

Перечислим некоторые основные операции, предусмотренные для строки встроенного типа (символьного массива):

· инициализация массивом символов (строкой встроенного типа);

· ввод/вывод;

· доступ к отдельным символам строки для чтения и записи: для этого применяется операция взятия индекса или косвенная адресация.

12.1. Основные функции Си для работы со строками

Очень часто при работе с символьными массивами возникает задача их обработки (сравнение строк, объединение строк, поиск подстроки в строке и так далее). В заголовочном файле <string.h> языка Си описано множество функций для работы со строками.

Например, функции:

· копирования строк (strcpy, strncpy);

· сравнения строк (strcmp, strncmp);

· объединения строк (strcat, strncat);

· поиска подстроки (strstr);

· поиска вхождения символа (strchr, strrchr, strpbrk);

· определения длины строки (strlen);

· преобразования строки в число (atoi, atoll, atof);

и так далее.

Учитывая, что строки состоят из символов, полезно знать некоторые функции работы с символами. Для работы с символами служит библиотека ctype (заголовочный файл ctype.h). Она содержит:

1. Функции проверки на принадлежность символа множеству:

· isalmum(c) – букв и цифр (A-Z, a-z, 0-9);

· isalfa(c) – букв (A-Z, a-z);

· iscntrl(c) – управляющих символов (с кодами 0…31 и 127);

· isdigit(c) – цифр (0-9);

· isgraph(c) – печатаемых символов кроме пробела;

· islower(c) – букв нижнего регистра (a-z);

· isprint(c) – печатаемых символов;

· ispunct(c) – знаков пунктуации;

· isspace(c) – символов-разделителей;

· isupper(c) – букв верхнего регистра (A-Z);

· isxdigit(c)- шестнадцатеричных цифр.

2. Функции преобразования символов:

· tolower(c) -к нижнему регистру;

· toupper(c) – к верхнему регистру.

 


Лабораторная работа № 12
Обработка символьных массивов

ЦЕЛЬ РАБОТЫ: •получение навыков объявления, инициализации, использования символьных массивов при обработке строк на С/С++.

Выполнение работы: освоить теоретический материал, выполнить общее для всех задание I и в соответствии с вариантом составить программу (задание II).

Задание I

1. Изучение способов формирования строк в языке Си

· Набрать и отладить программу:

int main(int argc, char * argv[])

{

char Arr1[25];

char Arr2[]={"Second string!"};

char Arr3[]={'T','h','i','r','d',' ',

's','t','r','i','n','g'};

char *Arr4="Fouth string";

cout<<"\nEnter string: \"First string\": ";

cin>>Arr1;

cout<<"\nString 1: "<<Arr1; // Оператор 1

cout<<"\nString 2: "<<Arr2; // Оператор 2

cout<<"\nString 3: "<<Arr3; // Оператор 3

cout<<"\nString 4: "<<Arr4; // Оператор 4

return 0;

}

· Проанализировать результат работы программы и ответить на вопрос, почему Оператор 2 и Оператор 4 выводят на экран свои фразы полностью, а оператор 1 – только ее часть.

· Почему Оператор 3 выводит всю фразу строки Arr3 и часть другой строки.

· Что нужно сделать, чтобы Оператор 3 выводил только свою фразу.

2. Применение функций работы со строками для обработки символьных массивов

· Набрать и отладить программу заполнения числового массива из символьной строки:

int main(int argc, char * argv[]) {

char str[]="2, 75.3, 24.45, 55, 0, 0.37";

char *ptr=str; //Оператор 1

float Arr[10];

int i=0;

printf("\nИсходная строка:\n%s\n",str);

do {

Arr[i] = atof(ptr); //Оператор 2

i++;

if (i>9) break;

}

while (ptr==strchr(ptr,','),ptr++); //Оператор 3

printf(“\nМассив чисел: \n“)

for (int s=0;s<i;s++)

printf("%5.2f\n", Arr[s]);

return 0;

}

· Проанализировать результат работы программы и ответить на вопрос: что происходит при выполнении Операторов 1-3.

Задание II

1. В заданном тексте вставить между словами вместо пробелов запятую и пробел.

2. Задан текст. Вставить заданную последовательность символов после i -гo символа каждого слова.

3. Вывести на экран в один столбец слова из заданного текста оканчивающиеся на согласную букву, в другой столбец – слова, оканчивающиеся на гласную букву, в третий - все остальные слова.

4. Из заданного текста удалить его часть, заключенную в круглые скобки вместе со скобками.

5. Каждое слово текста преобразовать так, чтобы оно читалось наоборот.

6. Из заданной последовательности слов, разделенных запятыми, удалить слова, содержащие введенный с клавиатуры символ.

7. Составить программу подсчета числа слов в телеграмме и выдачи на печать квитанции об ее уплате.

8. Дан текст из n символов. Вывести на экран только строчные русские буквы, входящие в этот текст.

9. Дан текст из строчных латинских букв, за которым следует точка. Вывести на экран дисплея этот текст заглавными латинскими буквами.

10. После каждой гласной буквы х в последовательности слов, разделенных пробелами, вставить буквосочетание рхсх (например, слово порядок преобразуется в поросорярясядоросок).

11. Задан текст. Найти сколько удвоенных букв содержится в данном тексте. Заменить каждую пару символом *.

12. Определить, не используя стандартную процедуру, является ли введенная строка правильной записью целого десятичного числа без знака.

13. В тексте слова разделены пробелами. Определить, кaкой процент слов в тексте заканчивается на русскую букву а.

14. Задан текст на русском языке. Удалить из него пробелы, ь, ъ.

15. В тексте слова разделены пробелами. Определить, кaкой процент слов в тексте заканчивается на русскую букву а.

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

17. В заданном тексте найти и вывести на экран удвоенные буквы. Посчитать количество удвоенных гласных букв и количество удвоенных согласных.

18. Дана квадратная матрица, элементами которой являются целые положительные числа. Найти корень квадратный из числа, образованного цифрами чисел, стоящих на главной диагонали.

19. Дан произвольный текст. Отредактировать текст так, чтобы между словами был ровно один пробел, а между предложениям ровно два пробела.

20. Исключить из введенной строки символ, введенный с клавиатуры. Вывести на экран количество удаленных символов и полученную строку.

21. В тексте слова разделены пробелами. Определить, кaкой процент слов в тексте начинается на русскую букву м.

22. Вывести на экран самое длинное слово из заданного текста.

23. Текст задан следующим образом: первый символ – цифра указывающая длину первого слова, за первым словом - вновь цифра указывающая длину второго слова (длина каждого слова не более 9 символов) и т.д. Выписать k -ое слово из текста (число k вводится с клавиатуры).

24. Назовем сложностью предложения сумму количества слов и знаков препинания. Определить сложность заданного предложения.

25. В заданной строке заменить все вхождения одной подстроки на другую. Об е подстроки вводятся с клавиатуры.

26. Выбрать из текста все слова, которые имеют в своем составе по два и более одинаковых символа.

27. Дана квадратная целочисленная матрица, элементами которой являются положительные числа. Найти корень квадратный из числа, образованного цифрами чисел, стоящих на побочной диагонали.

Контрольные вопросы

1. Что представляет из себя строка в программе, написанной на ЯП Си?

2. Что представляет собой строка:

а) последовательность английских букв;

б) последовательность русских букв;

в) последовательность символов ПЭВМ?

3. Как может быть описана строка в Си?

4. Приведите пример объявления строки как массива символов.

5. Приведите пример объявления строки как переменной-указателя на строку.

6. Что является признаком окончания строки?

7. Как осуществляется доступ к элементам строки?

8. Какое максимальное количество символов может содержать строка?

9. Как при описании строки может быть задана ее длина?

10. Может ли в процессе выполнения программы фактическая длина строки стать больше, чем объявлено в разделе описания? Что произойдет в этом случае?

11. Перечислите типовые операции над строками.

12. Перечислите основные функции обработки строк.

Пример выполнения задания II лабораторной работы

Задание. Дано предложение, между словами которого стоит один пробел, в конце предложения – точка. Подсчитать количество слов в этом предложении и вывести на экран в столбец те из них, которые начинаются с введенной с клавиатуры буквы или символа, и их количество. Если таких слов во введенном предложении нет, вывести сообщение об этом.

1. Решение (математическая модель). Предложение будем вводить в символьный массив text[100]. Разобьем это предложение на отдельные слова и будем хранить их в виде элементов двумерного символьного массива mas. Вводимый с клавиатуры символ обозначим через х, количество слов в данном предложении – через m (int), количество слов, начинающихся с введенного символа (результат работы программы) – через kol_x (int). Формирование массива mas выполним с помощью цикла с постусловием до появления точки. Каждое слово будет получаться в цикле при посимвольной обработке одномерного массива text, пока не встретится пробел, увеличивая после каждого пробела счетчик слов на единицу.

2. Программа решения данной задачи может иметь следующий вид:

#include <conio.h> // для корректной работы с кириллицей необходимо

#include <iostream>// сохранить файл проекта в кодировке DOS 866 файл®

#include <cstdio> // дополнительные параметры сохранения®кириллица (DOS)

using namespace std;

int main() {

char ch, x, mas[25][100], text[100];// mas - двумерный массив слов

cout<<"Введите предложение, оканчивающиеся точкой "<<endl;

gets(text); // организуем ввод всех символов текста

int i=0; // № символа слова

int j=0, m=0; // рассматриваем первое слово

do {

ch=text[j];

if ((ch!=' ') && (ch!=',') && (ch!='.'))

{

mas[m][i]=ch; //формируем текущее слово

i++;

}

else

if(i!=0)

{

mas[m][i]='\0';

m++; //увеличиваем счетчик слов

i=0;

}

j++;

}

while (ch!='.');

cout<<"Количество слов в данном предложении: "<<m<<endl;

cout<<"Введите символ, с которого должны начинаться выводимые на экран слова: ";

cin>>x;

int kol_x=0; // обнуление счетчика искомых слов

cout<<"Слова, начинающиеся c символа '"<<x<<"':"<<endl;

for (i=0; i<m; i++)

if (mas[i][0]==x)

{// если введенный символ в текущем слове на первой позиции, то

cout<<mas[i]<<endl;;

kol_x++;

}

if (kol_x==0) cout<<"отсутствуют";

else {

cout<<"Всего в предложении "<<kol_x;

switch (kol_x)

{//организация вывода верного окончания

case 1: case 21:cout<<" слово, ";break;

case 2: case 3: case 4: case 22: case 23: case 24: cout<<" слова, ";break;

default:cout<<" слов, ";

}

cout<<"начинающихся на '"<<x<<"'.";

}

_getch();

return 0;

}

3. Результат работы программы:

1)

Введите предложение

Некоторые люди видят в луже лишь лужу, а некоторые видят в луже звезды.

Количество слов в данном предложении: 13

Введите символ, с которого должны начинаться выводимые на экран слова:

л

Слова, начинающиеся на символ "л"

люди

луже

лишь

лужу

луже

Всего в предложении 5 слов, начинающихся на ‘л’.

2)

Введите предложение

А солнце светило ярче.

Количество слов в данном предложении: 4

Введите символ, с которого должны начинаться выводимые на экран слова:

л

Слова, начинающиеся на символ ‘л’

отсутствуют


13. Строки как объект специального класса string

13.1. Описание строк в С++ и типовые операции над ними

Для использования в программе возможностей класса string необходимо в начале программы подключить заголовочный файл string:

# include <string>

В отличие от типа char, string является классом. Классы, грубо говоря, содержат в себе переменные, константы и функции (методы) для работы с переменными. string использует единственный объект string для организации работы со строками. Будучи частью стандартной библиотеки C++, этот объект также является частью стандартного пространства имён – std. Таким образом, для использования возможностей заголовочного файла string необходимо в зоне описания глобальных объектов программы описать пространство стандартных имен std.

Теперь для создания строки достаточно написать:

string s;

Для записи в строку можно использовать оператор присваивания (=):

s = "Hello";

Пример работы (ввод/вывод) с объектом класса string:

string name;

cout<<"Enter your name"<<endl;

cin>>name; // строка считается до первого пробела

//поэтому при работе со string лучше использовать getline(cin, name);

//или cin.getline(name[, 50]); в [] указан необязательный параметр

cout<<"Hi "<< name <<"!"<<endl;

Рассмотрим некоторые основные операции, реализованные для объекта класса string:

· инициализация массивом символов (строкой встроенного типа) или другим объектом типа string;

string st("Для работы с кириллицей Dos 866\n");// или

string s0=st; // или

string s1 = "файл®дополнительные параметры сохранения®кириллица (DOS)";

· копирование одной строки в другую;

st2 = st3;//С помощью операции присваивания копируем st3 в st2

· доступ к отдельным символам строки для чтения и записи;

· сравнение двух строк на равенство;

if (st == st3)

// инициализация сработала

· конкатенация двух строк, получая результат либо как третью строку, либо вместо одной из исходных;

string s1("hello, ");

string s2("world\n");

string s3 = s1 + s2;//3-я строка – резкльтат конкатенации двух первых

s1 += s2;// или же возможно добавление s2 в конец s1

Можно переписать пример, приведенный выше, так, чтобы специальные символы и знаки препинания представлялись встроенным типом, а значимые слова – объектами класса string:

const char *pc = ", ";// Операция сложения может конкатенировать

string s1("hello");// объекты класса string

string s2("world");// и со строками встроенного типа

string s3 = s1 + pc + s2 + "\n";

Подобные выражения работают потому, что компилятор знает, как автоматически преобразовывать объекты встроенного типа в объекты класса string. Возможно и простое присваивание встроенной строки объекту string: string s1;

const char *pc = "a character array";

s1 = pc; // правильно

13.2. Основные функции класса string для работы со строками

Рассмотрим некоторые основные методы (функции), предусмотренные для работы со строками, являющимися экземплярами класса string:

  • s.append(str) – добавляет в конец строки строку str. Можно писать как s.append(переменная), так и s.append("строка");
  • s.assign(str) – присваивает строке s значение строки str. Аналогично записи s=str;
  • int i=s.begin() – записывает в i индекс первого элемента строки;
  • int i=s.end() – аналогично, но последнего;
  • s.clear() – как следует из названия, очищает строку, т.е. удаляет все элементы в ней;
  • s.compare(str) – сравнивает строку s со строкой str и возвращает 0 в случае совпадения (на самом деле сравнивает коды символов и возвращает их разность);
  • s.copy(str, len (сколько), start (начиная с какого)) – копирует из строки s в строку str (str может быть как типа string, так и строка типа char). Последние два параметра не обязательные (можно использовать функцию с 1, 2 или 3 параметрами);
  • bool b=s.empty() – если строка пуста, возвращает true, иначе false;
  • s.erase(start, len) удаляет len элементов с заданной позиции start;
  • s.find(str, start)– ищет строку str начиная с заданной позиции start;
  • s.insert(start, str, beg, count)– вставляет в строку s, начиная с позиции start часть строки str, начиная с позиции beg count символов;
  • s.replace(start, n, str)– берет n первых символов из str и заменяет символы строки s на них, начиная с позиции start;

replace(str.begin(), str.end(), '.', '_');//пробегает диапазон от
// begin() до end() и заменяет элементы, равные третьему параметру, // на четвертый

  • int len=s.length() – записывает в len длинну строки;
  • s.push_back(symbol) – добавляет в конец строки символ;
  • str=s.substr(n, m)– возвращает m символов начиная с позиции n;
  • s.swap(str) – меняет содержимое s и str местами;
  • s.size()– возвращает число элементов в строке.

Пример исследования особенностей ввода/вывода строковых данных.

string s, s1, ss;

cout<<"\nEnter string: \"1 string\": "<<endl;

cin>>s;

getline(cin,s1);

cout<<"\nEnter string: \"2 string\": "<<endl;

getline(cin,ss);

cout<<"\nString 1: "<<s;

cout<<"\nпродолжение String 1: "<<s1;

cout<<"\nString 2: "<<ss<<endl;

string str = "Hello, world!";

cout << str <<endl;

string name,surname,text,fullname,s2,s3,user;

user = "Petya Petrov";

cout << user <<endl;

cout<<"Enter your name"<<endl;

getline(cin,name);

cout<<"Enter your surname"<<endl;

getline(cin,surname);

fullname=name;

fullname+=" "; // добавляем пробел

fullname.append(surname);

cout <<"fullname = "<<fullname <<endl;

if (fullname.compare(user)==0) // <=> if (!(fullname.compare(user)))

cout<<"Your are good user"<<endl;

else cout<<"Bad user"<<endl;

cout<<"enter s1"<<endl;

getline(cin,s1);

cout<<"enter s2"<<endl;

getline(cin,s2);

s1.swap(s2);

cout<<"new s1: "<<s1<<endl<<"new s2: "<<s2<<endl;

cout<<"Enter big text with your name"<<endl;

getline(cin,text);

cout <<"old text = "<<text <<endl;

int i=text.find(name);

while (i)// <=> while (i!=0) {

text.replace(0,name.length(),name);//замена первых сим_в text на name

s3=text.substr(i,name.length());// помещаем подстроку из text в s3

cout<<"Replaced: "<<s3<<endl;

i=text.find(name);//ищем подстроку name в строке text

}

cout<<"New text:"<<endl<<text<<endl;

text.clear();//очищаем строку

cout<<"text: "<<text<<endl;


Лабораторная работа № 13
Программирование задач на обработку данных строкового типа

ЦЕЛЬ РАБОТЫ: получение навыков объявления, инициализации и использования объектов класса string С++.

Выполнение работы: освоить теоретический материал, в соответствии с вариантом решить задачу, составить и реализовать программу с использованием функций класса string.

Задание

1. Ввести предложение, слова в котором разделены пробелам и запятыми. Распечатать это предложение, удалив из него те, которые встретились там более одного раза.

2. Найти множество всех слов, которые встречаются в каждом из двух заданных предложений.

3. Удалить из данной строки те слова, которые уже встречались в ней раньше.

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

5. Ввести предложение, слова в котором разделены пробелам изапятыми. Распечатать те слова, которые являются обращениями других слов в этом предложении. Если нужных слов нет, сообщить об этом.

6. Распечатать введенное предложение, удалив из него слова, которые состоят менее чем из трех букв.

7. Распечатать введенные слова, отличные от последнего перестроив их следующим образом: перенести последнюю буквукаждого слова в его начало и в каждом слове оставить только первые вхождения каждой буквы.

8. Распечатать строку, которая получается из введенной строки следующим образом: каждая цифра заменяется заключенной в круглые скобки последовательностью литер «+», если цифра четная, или «-», если цифра нечетная. Длина последовательности равна числу, изображаемому цифрой.

9. Ученики зашифровывают свои записки, записывая все слова наоборот. Составить программу, расшифровывающую сообщения учеников.

10. Распечатать введенную строку, удалив из нее слова с нечетными номерами и перевернув слова с четными номерами. Например, из строки 'холодный ручей обжигал лицо и руки' должно получиться 'йечур оцил икур'.

11. Ввести строку, в которую могут входить только цифры и буквы. Распечатать те группы букв, в которых буква А встречается не менее двух раз (группа букв - это последовательность букв, обрамленная цифрами).

12. Ввести произвольный текст из нескольких предложений. Вычислить среднее число слов в предложении и среднюю длину предложения.

13. Дан текст, в котором слова разделены пробелами. Создать список слов текста с указанием количества букв в них.

14. Распечатать, начиная с последнего слова, перевернутые слова введенного предложения.

15. Выделить из первой строки все слова, начинающиеся с гласной буквы, а из второй строки - слова, начинающиеся с согласной. Образовать третью строку, состоящую из выделенных слов обеих строк. В новой строке слова должны разделяться двумя пробелами.

16. Из введенного текста распечатать только те слова, которые симметричны (например, радар, анна, шалаш) либо в которых буквы расположены в порядке, обратном алфавитному (например, ток, три, срок).

17. Ученики зашифровывают свои записки, записывая каждое слово текста наоборот. Составить программу, позволяющую шифровать сообщения описанным способом.

18. Для каждого из слов заданного предложения указать, сколько раз оно встречается в предложении.

19. Заменить окончание ing каждого слова, встречающегося в заданном предложении на английском языке, на ed.

20. Дана последовательность слов, разделенных пробелами. Напечатать все слова, предварительно удалив из каждого слова все предыдущие вхождения последней буквы.

21. Из заданной последовательности слов, разделенных запятыми, удалить слова, содержащие введенную с клавиатуры последовательность символов.

22. Дана последовательность слов, разделенных пробелами. Напечатать все слова, предварительно удалив из каждого слова все вхождения последней буквы предыдущего слова.

23. Вывести на экран те слова из введенного текста, в которых нет повторяющихся букв.

24. Задан текст, состоящий из нескольких предложений. Для каждого предложения вывести на экран все слова, отличные от последнего слова текущего предложения.

25. Дана последовательность слов, каждое из которых содержит от 2 до 10 латинских букв. Между соседними словами - пробел, за последним словом- точка. Если слово имеет нечетную длину, то удалить среднюю букву, если четную - перенести первую букву в конец слова. Вывести на экран все преобразованные слова.

26. В заданном тексте слова разделены пробелами или запятыми. Вывести на экран список слов, имеющих в своем составе хотя бы один символ, введенный с клавиатуры.

27. Вывести на экран дисплея список слов, имеющих приставку.

Задания для самостоятельной работы

Следующая группа задач является не обязательной для решения и относится к области криптографии, т.е. к шифровке и расшифровке текстов. Решение задач из этой группы улучшит навыки обработки строковых величин и расширит знания по их применению на практике.

1. Зашифровать текст методом Гронсфельда. Ключом является конечная последовательность цифр, которую записывают подряд над символами шифруемого текста. Цифра, стоящая над литерой, является величиной смещения (т.е. говорит о том, на сколько позиций надо продвинуться вперед по таблице кодировки от текущего символа, чтобы получить для него замену). Протестировать написанную программу.

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

3. Пусть по некоторому каналу связи передается сообщение, имеющее вид последовательности нулей и единиц (или аналогично точек и тире). Из-за помех возможен ошибочный прием некоторых сигналов: нуль может быть воспринят как единица и наоборот. Можно передавать каждый сигнал трижды, заменяя, например, последовательность 1, 0, 1 последовательностью 1, 1, 1, 0, 0, 0, 1, 1, 1. Три последовательные цифры при расшифровке заменяются той цифрой, которая встречается среди них по крайней мере дважды. Такое утаивание сигналов повышает вероятность правильного приема сообщения. Написать программу расшифровки некоторого сообщения.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...