Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МетодичкаФИН kosh.doc
Скачиваний:
29
Добавлен:
15.02.2016
Размер:
3.16 Mб
Скачать

Практическое занятие №5.

Тема: «Работа со строками».

Пример 1

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

Создайте диалоговое приложение и спроектируйте его как показано на рисунке.

Свяжите переменные с окнами редактирования как показано ниже.

IDC_EDIT1

CEdit edit

IDC_EDIT1

CString str

IDC_EDIT2

int len

IDC_EDIT3

CString rez

Добавьте функцию, с помощью которой мы будем проверять вводимые символы. Для этого щелкните правой кнопкой мыши по верхнему окну ре­дак­тирования и в появившемся контекстном меню выберите “Add Event Han­d­ler…” . В появившемся диалоговом окне в списке Message type выберите со­общение EN_UPDATE и щелкните по кнопке <Add and Edit>.

Добавьте код в эту функцию как показано ниже.

void CstrInsertDlg::OnEnUpdateEdit1()

{

CString tmp = str; // запоминаем предыдущее состояние вводимой строки

UpdateData(); // Считываем новое состояние строки

int s, e; // координаты курсора

for (int i = 0; i< str.GetLength(); ++i)

// проверяем символы во вводимой строке

if (!(str[i]>='А' && str[i] <= 'я' ||

str[i] =='.' || str[i] == ' '))

// если символ не является допустимым

{

edit.GetSel(s, e); // определяем положение курсора

str = tmp; // восстанавливаем предидущее состояние строки

UpdateData(false); // отображаем строку в окне

edit.SetSel(--s,--e); // возвращаем курсор на шаг назад

}

}

Добавьте функцию для кнопки OK.

void CstrInsertDlg::OnBnClickedOk()

{

UpdateData();

rez = str; // вначале исходная строка равна результирующей

rez.TrimLeft();

rez.TrimRight();// Обрежем пробелы в начале и в конце строки

int i = 1; // номер символа в строке

int L; // длина строки

bool flag = false; // признак вставки пробела в строку

while ((L=rez.GetLength()) < len)

// пока длина строки меньше заданной

{

if (rez[i-1] == ' ' && rez[i] != ' ')

// если началось новое слово

{

rez.Insert(i, ' '); i++; flag = true;

// вставляем пробел перед словом и увеличиваем соответственно номер символа

}

i++; // переходим к следующему символу

if (i >= (L=rez.GetLength()) ) // если мы дошли до конца строки

{

if (!flag) break;

// если пробелы не были вставлены ( если в строке 1 слово), выходим из цикла

i = 1; // возвращаемся в начало строки

}

}

TRACE("Длина строки = %d \n", rez.GetLength());

UpdateData(false);

}

Пример 2 Программа, которая считывает строку, содержащую числа, с проверкой допустимости вводимых символов и оставляет по 2 цифры после точки, удаляя остальные цифры дробной части

Создайте диалоговое приложение и спроектируйте его как показано на рисунке.

Свяжите переменные с окнами редактирования как показано ниже.

IDC_EDIT1

CEdit edit

IDC_EDIT1

CString str

IDC_EDIT2

CString rez

Добавьте функцию, с помощью которой мы будем проверять вводимые символы. Для этого щелкните правой кнопкой мыши по верхнему окну ре­дак­тирования и в появившемся контекстном меню выберите “Add Event Han­d­ler…” . В появившемся диалоговом окне в списке Message type выберите со­общение EN_UPDATE и щелкните по кнопке <Add and Edit>.

Добавьте код в эту функцию как показано ниже.

void CstrDeleteDlg::OnEnUpdateEdit1()

{

CString tmp = str; // запоминаем предыдущее состояние вводимой строки

UpdateData(); // Считываем новое состояние строки

int s, e; // координаты курсора

CString correct = "+- .Ee"; // допустимые символы кроме цифр

for (int i = 0; i< str.GetLength(); ++i)

// проверяем символы во вводимой строке

if (!(str[i]>='0' && str[i] <= '9' ||

correct.Find(str[i])>=0))

// если символ является цифрой или входит в строку допустимых символов

{

edit.GetSel(s, e); // определяем положение курсора

str = tmp; // восстанавливаем предидущее состояние строки

UpdateData(false); // отображаем строку в окне

edit.SetSel(--s,--e); // возвращаем курсор на шаг назад

}

}

Добавьте функцию для кнопки OK.

/* В этом примере мы будем переписывать символы из исходной строки в резуль­тирую­щую по одному, пропуская символы, которые нужно удалить */

void CstrDeleteDlg::OnBnClickedOk()

{

UpdateData();

rez.Empty();

for (int i=0; i<=str.GetLength(); ++i)

// проходим по исходной строке

{

if (str[i] == '.') // если встретилась точка

{

rez += str[i++];// копируем её в результирующую строку

// оставляем по 2 знака после точки, если это цифры:

if (str[i]>='0' && str[i] <='9')

rez += str[i++];

if (isdigit(str[i]))

rez += str[i++];

// все остальные цифры или точки пропускаем:

while (isdigit(str[i]) || str[i] == '.')i++;

}

rez += str[i]; // все остальные символы просто копируем

}

UpdateData(false);

}