Практическая работа №2 "Программирование с использованием строк"
методическая разработка на тему

Представлен теоретический материал, пример программы в среде C++ Buider, индивидуальные задания для выполнения практической работы.

Скачать:


Предварительный просмотр:

Практическая работа №2 Программирование с использованием строк

1. Цель работы:

Изучить правила работы со строками в C++ Builder.

Написать программу работы со строками 

2. Темы для предварительной проработки

1). Среда разработки C++ Builder

2). Компоненты C++ Builder

3) Строки в С++.

3. Теоретический материал

В языке C++ нет специального типа для объявления строк, поэтому они представляются в виде одномерных массивов символов. Последний элемент такого массива - нулевой байт '\0' - (нуль-терминатор). Длина строки равна количеству символов плюс нуль-терминатор. При наборе нуль-терминатор в конце строки ставить не нужно, его автоматически ставит компилятор языка C++ (надо не забывать выделять под него место). Строки могут быть описаны следующим образом:

char stl[10]="123456789";

chat st2[]=" 1234";

Если размер строки не объявлен явно, то он будет установлен автоматически и будет равен количеству введенных символов +1.

Для работы с такими строками существует набор функции, который расположен в файле string.h. Наиболее часто применяются следующие функции:

strcpy(st1, st2) - копирует содержимое строки st2 в строку st1.

strcat(stl, st2) - приписывает содержимое строки st2 к строке stl.

strcmp(stl, st2) - сравнивает содержимое строк st2 и stl. Если stl>st2, то результат отрицательный, если stl=st2 - результат равен нулю, если stl-результат положительный. Функция strcmpi(stl, st2) делает то же самое, но без учета регистра и только для латинского алфавита.

strstr(stl, st2) - указывает первое появление подстроки st2 в строке stl.

strlen() - возвращает длину строки (нуль-терминатор '\0' не учитывается)

Функции преобразования строк в числа:

atoi(st) - преобразует строку st в число целого типа (int).

atol(st) - преобразует строку st в число длинного целого типа (long).

atof(st) - преобразует строку st в число действительного типа (double). Функции преобразования чисел в строки:

itoa(a,st,kod) - преобразует числа целого типа (int) в строку st.

ltoa(a,st,kod) - преобразует число длинного целого типа (long) в строку st.

Tun AnsiString

Основной строковый тип в C++ Builder имеет большой набор функций, позволяющих производить операции присваивания переменных различных типов. Основные методы:

c_str() - возвращает указатель на нуль-терминальную строку, содержащую ту же информацию, что и исходная строка.

FloatToStrF() - форматированный перевод из действительного числа в строку.

IntToHex() - перевод шестнадцатиричного числа. Второй параметр - минимальное число цифр.

StrToInt(), StrToDouble() - перевод строк в числа, соответственно int, double.

Delete(), SubString() - удаление символов и копирование подстроки. Pos() - позиция строки-аргумента, начиная с 1.

Length() - длина строки.

Как переменную AnsiString конвертировать в char

AnsiString a = "Hello World";   char b = a.c_str();

Как переменную AnsiString конвертировать в int

AnsiString a = "Hello World";  int i = a.ToInt();  int i = StrToInt(a);

Как переменную AnsiString конвертировать в float

AnsiString a = "12.5";  float d;  d=a.ToDouble();

Как переменную char или int конвертировать в AnsiString

char Arr[240]= "Hello World";   AnsiString Str;   Str=(AnsiString)Arr;

4. Пример

Составить программу, определяющую из данного списка слов анаграммы.

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

Требуется решить классическую задачу поиска в группе слов, являющихся анаграммами.

Пример ввода:

кот брак бра ток крот бар краб

Программа должна вывести:

брак барк краб

бра бар

ток кот

Решение

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

(кот, кот)

(брак, абкр)

(бра, абр)

(ток, кот)

(барк, абкр)

(крот, корт)

(бар, абр)

(краб, абкр)

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

(брак, абкр)

(барк, абкр)

(краб, абкр)

(бра, абр)

(бар, абр)

(крот, корт)

(ток, кот)

(кот, кот)

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

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

Компоненты формы:

RichEdit1   массив слов, из которых надо выбрать анаграммы

Memo1       слова сортируются в порядке возрастания букв  (брак   абкр)

Memo2      выводятся слова, являющиеся анаграммами

Button1     запускает процесс

Label1    число строк в поле RichEdit1 (число слов)

Unit1.cpp

int kol;  AnsiString a[2][100];

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner){

kol=RichEdit1->Lines->Count;

if(kol>=100){Label1->Caption=" Ошибка!!!"; Close();}

Label1->Caption=StrToInt(kol);}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender){ int i,j;AnsiString z,zp;

for(i=0; i

a[0][i]=RichEdit1->Lines->Strings[i];

for (i=0; i

s2();   // сортировка массива перевернутых слов по алфавиту

Memo1->Clear();

for(i=0; iLines->Add(a[1][i]+" "+a[0][i]);

Memo2->Clear();  Memo2->Lines->Add("Анаграммы");

j=0; z=a[0][0]; zp=a[1][0];

for(i=0; i

    if( zp==a[1][i]) {

          if (j>=1) Memo2->Lines->Add(z);

          z=a[0][i]; zp=a[1][i];

          j++;}        else {

       if(j>1) Memo2->Lines->Add(z);

        z=a[0][i]; zp=a[1][i]; j=1; }

} //for

if (j>1) Memo2->Lines->Add(z);}

//---------------------------------------------------------------------------

 __fastcall TForm1::s1(int k){

int i,j,dl;

AnsiString z;  char d;  z=a[0][k];   dl=z.Length();

for(i=1; i<=dl-1; i++)

  for(j=1; j<=dl-1; j++)

     if (z[j]>z[j+1]) {d=z[j]; z[j]=z[j+1]; z[j+1]=d; }

Memo1->Lines->Add(z);

a[1][k]=z;}

 __fastcall TForm1::s2(void){

AnsiString z,z0;  int i,j;

for(i=0; i

  for(j=0; j

  if (a[1][j]>a[1][j+1])

  {z=a[1][j]; z0=a[0][j];

    a[1][j]=a[1][j+1];  a[0][j]=a[0][j+1];

    a[1][j+1]=z; a[0][j+1]=z0;}}

Unit1.h

public:                // User declarations

        __fastcall TForm1(TComponent* Owner);

         __fastcall TForm1::s1(int k);       //прототип собственной функции сортировки каждого слова

         __fastcall TForm1::s2(void);      //прототип собственной функции сортировки массива слов

…….

5. Задание

Во всех заданиях исходные данные вводить с помощью компонента TEdit в компонент TListBox либо с помощью свойства Text в свойство Items компонента TComboBox. Скалярный результат выводить с помощью компонента TLabel. Ввод строки заканчивать нажатием клавиши Enter. Дня выхода из программы использовать кнопку Close. Для расчетов вводить несколько различных строк.

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

Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран самую короткую группу.

Дана строка, состоящая из групп нулей и единиц. Подсчитать количество символов в самой длинной группе.

Дана строка, состоящая из групп нулей и единиц. Найти и вывести на экран группы с четным количеством символов.

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

Дана строка, состоящая из букв, цифр, запятых, точек, знаков "+" и "-". Выделить подстроку, которая соответствует записи целого числа (т.е. начинается со знака "+" или "-" и внутри которой нет букв, запятых и точек).

Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков "+" и "-". Выделить подстроку, которая соответствует записи вещественного числа с фиксированной точкой.

Дана строка символов, состоящая из букв, цифр, запятых, точек, знаков "+" и "-". Выделить подстроку, которая соответствует записи вещественного числа с плавающей точкой.

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

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

11.        Дана  строка  символов, состоящая из произвольного текста на английском языке, слова разделены пробелами. Вывести на экран слова этого текста в порядке, соответствующем латинскому алфавиту.

12.        Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Вывести на экран порядковый номер слова, накрывающего к-ю позицию (если на к-ю позицию попадает пробел, то номер предыдущего слова).

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

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

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

Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. В каждом слове заменить первую букву на прописную.

Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Удалить первые к слов из строки, сдвинув на их место последующие.

Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Поменять местами i-e и j-е слова.

19.        Дана строка символов, состоящая из текста, слова которого разделены пробелами. Поменять местами первую и последнюю буквы каждого слова.

20.        Дана строка символов, состоящая из произвольного текста, слова разделены пробелами. Заменить буквы латинского алфавита на соответствующие им буквы русского алфавита.

21.        Дана строка символов S1S2 ...Sm, в которой могут встречаться цифры, пробелы, буквы "Е", "е" и знаки "+", "-". Известно, что первый символ S, является цифрой. Из данной строки выделить подстроки, разделенные пробелами. Определить, является ли первая подстрока числом. Если да, то выяснить: целое или вещественное это число, положительное или отрицательное.

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

23.        Дана строка символов, содержащая некоторый текст на русском языке. Заменить буквы русского алфавита на соответствующие им буквы латинского алфавита.

24.        Дана строка символов, содержащая некоторый текст. Разработать программу, которая определяет, является ли данный текст палиндромом, т.е. читается ли он справа налево так же, как и слева направо (например, «А роза упала на лапу Азора»).

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

26.        Составить программу, которая читает построчно текст другой программы  ввести с клавиатуры) на языке Pascal, подсчитывает количество ключевых слов «begin» и «end» и выводит на экран соответствующее сообщение.

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

Дан текст из заглавных латинских букв, за которым следует пробел. Определить, является ли этот текст правильной записью римскими цифрами целого числа от 1 до 999, и, если является, вывести на экран это число арабскими цифрами( в десятичной системе).

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

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

Санкт-Петербургский колледж информационных технологий

Методические указания

к выполнению практической работы №2

«Программирование с использованием строк»

                                                           Разработала

                                                           Мастер

                                                           производственного обучения

                                                           Шапкина Л.М.


По теме: методические разработки, презентации и конспекты

Практическая работа №3 "Программирование с использованием структур"

Представлен теоретический материал, пример программы на C++ Builder, индивидуальное задание для выполнения практической работы....

Практическая работа №4 "Программирование с использованием текстовых файлов"

Представлен теоретический материал, пример программы на C++ Builder, индивидуальное задание для выполнения практической работы....

Практическая работа «Расчет показателей использования основных средств и оборотных средств»

Практическая работа по экономике организации для студентов СПО....

Практическая работа Функции ввода и вывода строк прерывания INT 21h

Практическое ознакомление с функциями ввода/вывода строк и приёмами использования возможностей этих функций....

Практическая работа по теме "Командная строка в MS Windows"

Изучить основные команды в командной строке.Составить таблицу этих команд в тетради...

Практическая работа №7. Комплексное использование возможностей текстовых редакторов.

Содержит итоговые практические задания по разделу "Текстовые процессоры"...