12_Strings презентация

Содержание

План Лекция 12 Строки: общие сведения Функции для работы со строками Строки как параметры функций

Слайд 1Строки
Алтайский государственный университет Факультет математики и ИТ Кафедра информатики
Барнаул 2014


Слайд 2План
Лекция 12
Строки: общие сведения
Функции для работы со строками
Строки как параметры функций




Слайд 3Несколько заданий для самопроверки



Слайд 4Пара заданий для самопроверки
Задание 1
Есть ли в следующем фрагменте кода ошибка

и, если есть, в чем она состоит?

struct outer{
int a;
struct inner{
char c;
};
};

(a) В Си не разрешены вложенные структуры
(b) Необходимо инициализировать поля структуры
(c) Внутренняя структура должна иметь имя
(d) Внешняя структура должна иметь имя
(e) Нет никаких ошибок




Слайд 5Пара заданий для самопроверки
Задание 2
Что выведет на экран следующая программа?
#include

struct

node {int a; int b; int c;};

void main() {
struct node s={2,5,7};
struct node *p=&s;
printf("%d",*((int*)p));
}

2


Слайд 6Строки: общие сведения
Массивы символов
Символьные строки
Объявление строк
Указатели и строки
Ввод и вывод строк


Слайд 7Строки: общие сведения
Чем плох массив символов?
char A[4] = { 'A', '3',

'[', 'Ж'};
char B[10];

Это массивы символов:

Для массива:
каждый символ – отдельный объект;
массив имеет длину N, которая задана при объявлении

Что нужно:
обрабатывать последовательность символов как единое целое
строка должна иметь переменную длину


Слайд 8Строки: общие сведения
Символьные строки
рабочая часть
s[0]
s[1]
s[2]
s[3]
char s[80];
признак окончания строки: символ с кодом

0

Символьная строка – это последовательность символов, которая заканчивается символом '\0'.


Слайд 9Строки: общие сведения
Объявление символьных строк
Объявить строку = выделить ей место в

памяти и присвоить имя.


char s[80];

char s1[80] = "abc";

char qqq[] = "Вася";

выделяется 80 байт, в строке – «мусор» (если она глобальная, то нули '\0‘)

выделяется 80 байт, занято 4 байта (с учетом '\0')

выделяется 5 байт
(с учетом '\0')


Слайд 10Строки: общие сведения
Указатели и символьные строки
char str[10] = "0123456";
char *p;


p = str;
*p = 'A';
p ++;
*p = 'B';
p ++;
strcpy ( p, "CD" );
strcat ( p, "qqq" );
puts ( p );

/* указатель на символ */
/* или & str[0] */
/* "A12345" */
/* перейти к str[1] */
/* "AB2345“ */
/* перейти к str[2] */
/* "ABCD" */
/* "ABCDqqq" */


Слайд 11Строки: общие сведения


Ввод и вывод символьных строк
Задача: ввести слово с клавиатуры

и заменить все буквы «а» на буквы «б».

void main()
{
char q[80];
int i;
printf("Введите строку\n");
scanf( "%s", q);
i = 0;
while ( q[i] != '\0' ) {
if ( q[i] == 'а' ) q[i] = 'б';
i ++;
}
printf ( "Результат: %s ", q );
}

%s

не надо ставить &:
q ⇔ &q[0]

%s – формат для ввода и вывода символьных строк (выводится только часть до '\0'

"%s"

пока не дошли до конца строки

переход к следующему символу

начали с q[0]


Слайд 12Строки: общие сведения
Ввод одного слова:



Ввод строки с пробелами:
char q[80];
printf ("Введите текст:\n");
scanf

( "%s", q );
printf ("Введено:\n%s", q );

Ввод символьных строк

Введите текст:
Вася пошел гулять
Введено: Вася

char q[80];
printf("Введите текст:\n");
gets ( q );
printf("Введено:\n%s", q );

Введите текст:
Вася пошел гулять
Введено: Вася пошел гулять

gets ( q );


Слайд 13Строки: общие сведения
Универсальный способ:



Только для одной строки:
printf ( "Результат: %s", q

);

Вывод символьных строк

puts ( q );

можно выводить сразу и другую информацию: надписи, значения переменных, …

вывод только одной строки
после вывода – переход на новую строку

printf ( "%s\n", q );



Слайд 14Функции для работы со строками
Длина строки
Сравнение строк
Копирование строк
Объединение строк
Поиск в строке


Слайд 15Функции для работы со строками
Функции для работы со строками
Длина строки: strlen

(string length)

Подключение библиотеки:

#include

char q[80] = "qwerty";
int n;
n = strlen ( q );

n = 6


Слайд 16Функции для работы со строками
Сравнение строк
char q1[80], q2[80];
int n;
gets ( q1

);
gets ( q2 );
n = strcmp ( q1, q2 );

strcmp (string comparison):






Слайд 17Функции для работы со строками
Пример решения задачи
Задача: ввести строку и определить,

сколько в ней слов. Программа должна работать только при вводе правильного пароля.
Идея решения:
проверка пароля – через strcmp
количество слов = количеству первых букв слова
первая буква: пробел и за ним «не пробел»


исключение: предложение начинается со слова (а не с пробела)




Слайд 18Функции для работы со строками
Проверка пароля


#include
void main()
{
char secret[] =

"123", pass[20];
printf ( "Введите пароль\n" );
gets ( pass );
if ( strcmp ( pass, secret ) != 0 )
{
printf ( "Пароль неверный" );
getch ();
return 1;
}
...
}

если пароль неверный...

сообщить об ошибке и выйти из программы

аварийное завершение, код ошибки 1


Слайд 19Функции для работы со строками
Основная часть программы


#include
#include
void main()
{
char

q[80];
int i, len, count = 0;
... /* проверка пароля */
printf ("Введите предложение\n");
gets ( q );
len = strlen( q );
if ( q[0] != ' ') count++;
for ( i = 0; i < len - 1; i ++ )
if ( q[i] == ' ' && q[i+1] != ' ' )
count ++;
printf ( "Найдено %d слов", count );
}

особый случай

если нашли пробел, а за ним не пробел…

предыдущий слайд


Слайд 20Функции для работы со строками
Копирование строк
strcpy (string copy)
char q1[10] = "qwerty",

q2[10] = "01234";

strcpy ( q1, q2 );

куда

откуда


копирование «хвоста» строки

char q1[10] = "qwerty", q2[10] = "01234";
strcpy ( q1, q2+2 );

q2

q1

q2 = &q2[0]

q2+2 = &q2[2]



Слайд 21Функции для работы со строками
Копирование строк
копирование в середину строки
char q1[10] =

"qwerty", q2[10] = "01234";
strcpy ( q1+2, q2 );

q2

q1

q1+2 = &q1[2]


char q1[10] = "qwerty", q2[10] = "01234";
strcpy ( q1+2, q2+3 );

q2

q1

q2+3 = &q2[3]


q1+2 = &q1[2]


Слайд 22Функции для работы со строками
Копирование строк
strncpy – копирование нескольких символов
char q1[10]

= "qwerty", q2[10] = "01234";
strncpy ( q1+2, q2, 2 );

q2

q1

q1+2 = &q1[2]



Слайд 23Функции для работы со строками
Копирование строк
копирование строки-константы
char q1[10] = "qwerty";
strcpy (

q1+1, "ABCD");

q1


char q1[10] = "qwerty";
strcpy ( "ABCD", q1+2 );



НЕ


Слайд 24Функции для работы со строками
Копирование строк
копирование внутри одной строки
char q[10] =

"012345";
strcpy ( q, q+2 );

q

char q[10] = "012345";
strcpy ( q+2, q );


q







Зацикливание и зависание компьютера!




Слайд 25Функции для работы со строками
Объединение строк
strcat (string concatenation) = копирование второй

строки в конец первой

char q1[10] = "qwe", q2[10] = "0123";
strcat ( q1, q2 );

q2

q1


char q1[10] = "qwe", q2[10] = "0123";
strcat ( q1, q2+2 );

q2

q1



Слайд 26Функции для работы со строками
что-то другое
Проблемы при копировании строк
char q1[] =

"qwer", q2[10] = "01234";
strcpy ( q1+2, q2 );

не хватает места для строки-результата

q2

q1


зацикливание при копировании в ту же строку «слева направо»

char q[10] = "01234";
strcpy ( q+2, q );


Слайд 27Функции для работы со строками
Пример решения задачи
Задача: ввести имя файла (без

пути) и поменять его расширение на ".exe".
Пример:
Введите имя файла: Введите имя файла:
vasya.html vasya
Результат: Результат:
vasya.exe vasya.exe
Алгоритм:
найти точку в имени файла
если она есть, скопировать в это место строку-константу ".exe"
если точки нет, добавить в конец строки ".exe"

Слайд 28Функции для работы со строками
Программа



void main()
{
char fName[80];
int i;
printf("Введите имя файла\n");
gets ( fName

);
i = 0;
while ( fName[i] != '.' ) {
if ( fName[i] == '\0' ) break;
i ++;
}
if ( fName[i] == '.' )
strcpy ( fName+i, ".exe" );
else strcat ( fName, ".exe" );
puts ( "Результат:" );
puts ( fName );
}

поиск точки

дошли до конца строки

меняем или добавляем расширение


Слайд 29Функции для работы со строками
Поиск в символьных строках
Задача: найти заданный символ

или сочетание символов (подстроку) в символьной строке.

Указатель – это переменная в которую можно записать адрес другой переменной заданного типа.


Слайд 30Функции для работы со строками
Поиск символа
strchr: найти первый заданный символ c

начала строки

strrchr: найти последний заданный символ в строке

char q[10] = "abcdabcd";
char *p;
int nomer;
p = strchr(q, 'b');
if ( p == NULL )
printf ( "Не нашли..." );
else {
nomer = p – q;
printf ( "Номер символа %d", nomer );
}

q

q+1

q+5

p


reverse


Слайд 31Функции для работы со строками
Поиск подстроки
strstr: найти первую подстроку c начала

строки

char q[10] = "abcdabcd";
char *p;
int nomer;
p = strstr(q, "bcd");
if ( p == NULL )
printf ( "Не нашли..." );
else {
nomer = p – q;
printf ( "Номер первого символа %d", nomer );
}

q

q+1

q+5

p


Слайд 32Функции для работы со строками
Пример решения задачи
Задача: ввести предложение и определить,

сколько раз в нем встречается имя «Вася».
Проблема: функция strstr ищет только с начала строки.
Алгоритм:
Записать адрес начала строки в указатель start.
Искать подстроку «Вася», начиная с адреса start.

Если не нашли, выход из цикла.
Увеличить счетчик найденных слов.
Переставить start на адрес после найденного слова.
Перейти к шагу 2.

start






p






p = strstr( start, "Вася");


Слайд 33Функции для работы со строками
Программа


void main()
{
char q[80], *start, *p;
int

count = 0;
puts ( "Введите предложение" );
gets ( q );
start = q; /* ищем с начала строки */
while ( 1 ) {
p = strstr ( start, "Вася" );
if ( p == NULL ) break;
count ++;
start = p + 4; /* отсюда ищем следующее слово */
}
printf ( "Имя 'Вася' встречается %d раз", count );
}

начало поиска

адрес найденного слова


Слайд 34Строки как параметры функций
Передача параметров-строк
Примеры функций со строковыми параметрами


Слайд 35Строки как параметры функций
Символьные строки в функциях
Задача: составить процедуру, которая переставляет

символы строки в обратном порядке.
Алгоритм:
определить длину строки len;
все символы первой половины переставить с соответствующими символами второй половины:

c = s[i];
s[i] = s[len-i-1];
s[len-1-i] = c;

s[i]

s[len-1-i]



Слайд 36Строки как параметры функций
Программа
void Reverse ( char s[] )
{
int len

= strlen(s);
char c;
for ( i = 0; i < len/2; i ++ ) {
c = s[i];
s[i] = s[len-i-1];
s[len-1-i] = c;
}
}

void main(){
char s[] = "1234567890";
Reverse ( s );
puts ( s );
Reverse ( s + 5 );
puts ( s );
}

0987654321

0987612345

длину строки определяем на месте


Слайд 37Строки как параметры функций
Символьные строки в функциях
Задача: составить функцию, которая находит

количество цифр в строке.

int NumDigits ( char s[] )
{
int i, count = 0;
for ( i = 0; i < strlen(s); i ++ )
if( strchr ( "0123456789", s[i] ) )
count ++;
return count;
}

if ( strchr ( "0123456789", s[i] ) != NULL )
или
if ( '0' <= s[i] && s[i] <= '9' )


Слайд 38Строки как параметры функций
Символьные строки в функциях
Основная программа
int NumDigits ( char

s[] )
{
...
}
void main()
{
char s[80];
int n;
printf ( "Введите строку\n" );
gets ( s );
n = NumDigits ( s );
printf ( "Нашли %d цифр.", s );
}

Слайд 39Вопросы и ответы
Вопросы?
Строки: общие сведения
Массивы символов
Символьные строки
Объявление строк
Указатели и строки
Ввод и

вывод строк
Функции для работы со строками
Длина строки
Сравнение строк
Копирование строк
Объединение строк
Поиск в строке
Строки как параметры функций
Передача параметров-строк
Примеры функций со строковыми параметрами

Дубовая роща. Девочка и апельсин


Обратная связь

Если не удалось найти и скачать презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое ThePresentation.ru?

Это сайт презентаций, докладов, проектов, шаблонов в формате PowerPoint. Мы помогаем школьникам, студентам, учителям, преподавателям хранить и обмениваться учебными материалами с другими пользователями.


Для правообладателей

Яндекс.Метрика