- •Основные понятия
- •Определение С-строк
- •строка как массив символов
- •строка как указатель на char
- •особенности работы с С-строками в С++
- •Операции со строками
- •Инициализация строки
- •Возможные ошибки при работе со строками
- •Ввод-вывод строк
- •преобразование значения базового типа в С-строку
- •ввод ограниченного числа символов строки
- •функция вывода строки
- •особенности посимвольного вывода строки
- •Копирование строк
- •Оптимизация текста программы на примере функции копирования
- •Функции для работы с С-строками
- •Определение длины строки
- •Копирование строк
- •Объединение строк
- •Сравнение строк
- •Поиск символа в строке
- •Проверка принадлежности символа некоторому множеству
- •Поиск строки в строке
- •Преобразование и заполнение строк
- •преобразование строки в число
- •преобразование строчных символов строки в прописные и наоборот
- •реверс строки
- •заполнение строки символом
- •пример применения функций преобразования
- •Выделение лексем
- •Динамические строки
- •Копирование строки в динамическую строку
- •Передача строки в функцию в качестве параметра
- •Пример_1: в main()– строка-массив; в функции – строка-указатель
- •Пример_2: в main() – строка-указатель; в функции – строка-указатель
- •Передача в функцию массива строк
- •Примеры работы со строками
- •Определение длины строки с помощью функции пользователя
- •Реверс строки (перегрузка функций)
- •Удаление начальных пробелов из строки
- •Проверка, является ли строка целым числом
- •Проверка, является ли строка 16-ичным целым числом
- •Проверка, является ли строка дробным числом без знака
- •Перевод двоичного числа в десятичное
- •Перевод шестнадцатеричного числа в десятичное
- •Перевод десятичного числа в двоичное
- •Перевод десятичного числа в с/с от 2-х до 10
- •Перевод десятичного числа в шестнадцатеричное
- •Определение количества слов в фразе
- •Выделение слов в тексте по нажатию произвольной клавиши
- •Сортировка вводимых с клавиатуры строк *
- •Сортировка строк в зависимости от признака, передаваемого функции main() через аргумент argv *
- •Инвертирование строки с помощью рекурсивной функции
do |
2; |
// |
остаток от деления на основание с/с |
|
{ r = number % |
||||
number = number / 2; |
// |
частное от деления на |
основание с/с |
|
str [i++] = char (int('0')+r); |
//получение в строке |
переведенного числа |
||
} while (number |
>0); |
// |
цифры числа в строке в |
обратном порядке |
for(int j=0; j<i/2; j++) |
// меняем порядок цифр числа |
в строке на обратный |
||
{ int c=str[j]; |
|
|
|
|
str[j]=str[i-j-1]; str[i-j-1]=c;
}
str[i]='\0';
cout<<" number (2 c/c): \n" << str <<endl; _getch();
return 0;
}
Перевод десятичного числа в с/с от 2-х до 10
(строка с переведенным числом заполняется с конца и затем сдвигается в начало)
int main ()
{
char st[17];
int i, osn, n, cn, r;
cout << " \nInput number:" << endl; cin >> n;
cout << " \n c/c??? " << endl; cin >> osn;
cn=n;
st[16] = '\0'; i=15;
do {r=n % osn; //получение следующей цифры n=n / osn;
st[i--] = r+'0'; //преобразование цифры в символ: (int)'0' = 48 и т.д.
} while (n>0); i++;
int j=0; while (st[i])
st[j++] = st[i++]; //сдвиг сформированной строки в начало st[j] = '\0';
cout << "10c/c: -->" << cn << endl; cout << osn << " c/c:" << st << endl; _getch();
return 0;
}
Перевод десятичного числа в шестнадцатеричное
int main |
() |
|
|
|
|
{ |
|
|
|
|
|
char st[5]; |
|
|
|
||
int i, n, |
r; |
|
|
|
|
cout << " |
\nInput number 10c/c " << endl; |
|
|
|
|
cin >> n; |
\n10c/c: --> 16c/c:\n" << n << " |
--> |
"; |
|
|
cout << " |
|
||||
st[5] = '\0'; |
|
|
|
||
i=4; |
16; |
|
|
|
|
do {r=n % |
|
|
|
||
n=n |
/ 16; |
|
|
|
|
if |
(r<10) |
//(int) '0' = 48 |
и т.д. |
||
else |
i--] = r + '0'; |
||||
st[i--] = r + 55; |
//(int) 'A' = 65 |
и т.д. |
|||
|
|||||
} while (n>0); |
|
|
|
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
31 |
|
i++; |
|
int j = 0; |
|
while (st[i]) |
//удалим начальные пробелы |
st[j++] = st[i++]; |
|
st[j] = '\0'; |
|
cout << st << endl; |
|
_getch(); |
|
return 0; |
|
} |
|
Определение количества слов в фразе
enum itsaWord { NO, YES }; |
//NO=0, YES=1 |
|
|
int main() |
|
// isWord |
- «флаг» обработки слова |
{ |
isWord = NO; |
||
itsaWord |
//YES когда читаются символы слова |
||
|
|
//NO когда читаются пробельные символы |
|
char ch = 'a'; |
//в начале работы NO |
||
|
|
||
int wordcount = 0; |
|
|
|
cout << "Enter a phrase:\n" << endl; |
|
||
do { |
|
|
|
ch = getche(); |
//aaaaa |
bbbbb ccccc\r\n |
|
if(ch==' ' || ch=='\r') |
|||
{ |
|
//это означает завершение слова |
|
if( isWord == YES ) |
|||
|
{ |
//счетчик слов |
|
|
wordcount++; |
||
|
isWord = NO; |
//очистка «флага» |
|
} |
} |
|
|
|
|
|
|
else |
|
//установка флага на начало слова |
|
if( isWord == NO ) |
|||
|
isWord = YES; |
//клавиша <Enter > : \r\n |
|
} while( ch != '\r' ); |
cout << "\n---Word count is " << wordcount << "---\n"; _getch();
return 0;
}
Выделение слов в тексте по нажатию произвольной клавиши
Программа в цикле вводит строки текста, по нажатию произвольной клавиши поочередно выделяет каждое слово строки, проверяет его на наличие букв и цифр, выводит длину минимального слова в строке и само это слово.
#include <string.h> #include <ctype.h>
int main () {const int n=70;
char s[n],*st,str[n]; unsigned min;
bool flag=0;
cout << "input of string" << endl;
while (cin.getline(s, n)) |
//цикл ввода строк, выход – Ctrl+z |
{ cout << endl; |
|
st=strtok(s," ,.:;!?"); //выделение 1-ой лексемы (слова) |
|
min=strlen(st); |
//получение в min длины слова |
strcpy_s(str,st); |
//запоминание минимального слова |
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
32 |
|
while (st!=NULL)
{cout << st << endl;
_getch();
for (unsigned j=0; j<=(strlen(st)-1);j++)
if (isalnum(st[j])) //проверка слова на буквы и цифры flag=1;
else
{
flag=0; break;
}
if (flag)
if (strlen(st)<min) {min=strlen(st); strcpy_s(str,st);
}
st=strtok(NULL," ,.:;!?");//выделение i-ой лексемы
} //end while выделения лексем
cout << "min dlina = " << min << "\nmin lexema = " << str<< endl; cout << "input of string or Ctrl+z" << endl;
}//end while ввода строк _getch();
return 0;
}
Сортировка вводимых с клавиатуры строк *
Вводимые строки помещаются в двумерный массив. Признак завершения ввода – STOP_STRING=“*!*”. Сортировка проводится по методу пузырька в порядке возрастания кода первого символа (по алфавиту). При сортировке перемещаются при необходимости не сами строки, а указатели на них. Для сравнения строк используется библиотечная функция strcmp().
//prot.h
void vvod_str (char **,const int, int&); void vyvod_str (char **, int);
void sortirovka (char **, int);
// stdafx.h
#pragma once
#define WIN32_LEAN_AND_MEAN #include <stdio.h>
#include <tchar.h>
// TODO: reference additional headers your program requires here #include <iostream>
#include <conio.h>
#include <string.h>
#include "prot.h" using namespace std;
//fun.cpp
#include "stdafx.h"
void vvod_str (char **mas_str,const int n, int &dn) { const char * STOP_STRING= "*!*";
cout << "Input of string:" << endl; for (int index=0; index<n; index++)
{cin>> mas_str[index];
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
33 |
|
if (!strcmp(mas_str[index], STOP_STRING)) {dn=index;break;}
} }
void vyvod_str (char **mas_str, int n) {cout << "----------------------" << endl;
int m=n;
for (int index=0; m>0; m--)
cout << mas_str[index++] << endl;
}
void sortirovka (char **pointers, int n) {char *ptr;
for (int index=0; index<n; index++) for (int i=n-1; i > index; i--)
if (strcmp(pointers[i-1], pointers[i])>0) {ptr= pointers[i];
pointers[i] = pointers[i-1]; pointers[i-1] = ptr;
}
}
sortirovka (pointers, dn); |
//сортировка строк |
vyvod_str(pointers, dn); |
|
_getch(); |
|
return 0; |
|
} |
|
Сортировка строк в зависимости от признака, передаваемого функции main() через аргумент argv *
Программа сортирует строки в лексикографическом порядке, возрастающем или убывающем в зависимости от признака, передаваемого функции main() через аргумент argv, и выводит их на стандартный вывод. Исходный текст программы с комментариями и подробное описание выполняемых действий, представлены в лекции 1.
Инвертирование строки с помощью рекурсивной функции
void reverse(); int main()
{ reverse(); cout << endl;
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
34 |
|
_getch(); return 0;
}
void reverse()
{char c= _getche();
if (c != 13) reverse(); //’\r’ cout << c;
return;
}
Текущий |
Рекурсивный спуск |
Рекурсивный |
уровень |
|
возврат |
0 |
Reverse; |
|
1 |
Ввод:‘H'; с != 13; Reverse; |
Вывод:'Н'; |
2 |
Ввод:'Е'; c != 13; Reverse; |
Вывод:’E'; |
3 |
Ввод:‘L'; c != 13; Reverse; |
Вывод:'L'; |
4 |
Ввод:‘L'; c != 13; Reverse; |
Вывод:’L'; |
5 |
Ввод:‘O'; c != 13; Reverse; |
Вывод:‘O'; |
6 |
Нажатие <Enter> c = 13; |
|
Программирование – лекция 13 (лекции Стрикелевой Л.В.) |
35 |
|