Строки Алтайский государственный университет Математический факультет Кафедра информатики Барнаул 2013.

Презентация:



Advertisements
Похожие презентации
1 Программирование на языке Паскаль Часть II Символьные строки.
Advertisements

К. Поляков, Программирование на алгоритмическом языке. Часть II Тема 4. Символьные строки.
Строки в Pascal
Программирование на языке Си Часть II 1.МассивыМассивы 2.Максимальный элемент массиваМаксимальный элемент массива 3.Обработка массивовОбработка массивов.
1 Программирование на языке Паскаль Тема 1. Введение Кулебякин В.В.
К. Поляков, Программирование на алгоритмическом языке Тема 1. Введение.
1 Программирование на языке Паскаль Тема 1. Введение.
1 Программирование на языке Паскаль Тема 1. Введение.
1 Программирование на языке Паскаль Циклы. 2 Цикл – это многократное выполнение одинаковой последовательности действий. цикл с известным числом шагов.
СИМВОЛЬНЫЕ СТРОКИ С++. ОБЪЯВЛЕНИЕ СИМВОЛЬНЫХ СТРОК В ПРОГРАММАХ В C++ символьные строки хранятся в массиве типа char, который заканчивается символом NULL.
Строковый тип в Паскаль. Составление программ.. Какой тип данных в Паскале описывает текстовые данные? Какой тип данных описывает один символ? Как можно.
1 Программирование на языке Паскаль Тема 1. Введение.
Понятие строки. Операции со строковыми величинами. Стандартные процедуры и функции обработки строковых величин. Простые алгоритмы работы со строками на.
Лекция 9 Функции. Массивы-параметры функции Передача массива в функцию Пример: void array_enter(int a[], int size) { int i; for (i = 0; i < size; i++)
Урок повторения по теме: «Сила». Задание 1 Задание 2.
Символы и строки 1. Содержание 8.1Введение 8.2Основы Строк и Символов 8.3Библиотека работы со строками 8.4Преобразование строк 8.5Стандартная библиотека.
Программирование на языке Паскаль Символьные строки.
1 Программирование на языке Паскаль Файлы с последовательным доступом. Кулебякин В.В.
Программирование на языке Си Часть II Тема 1. Массивы Учитель информатики: Корогод В.А.
Лекция 8. Структура языка С/С++. Циклы с предусловием и постусловием. Реализация циклов с помощью операторов ветвления и передачи управления. Операторы.
Транксрипт:

Строки Алтайский государственный университет Математический факультет Кафедра информатики Барнаул 2013

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

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

4 Пара заданий для самопроверки Задание 1 Есть ли в следующем фрагменте кода ошибка и, если есть, в чем она состоит? struct outer{ int a; struct inner{ char c; }; 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)); } #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

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

7 Строки: общие сведения Чем плох массив символов? char A[4] = { 'A', '3', '[', 'Ж'}; char B[10]; char A[4] = { 'A', '3', '[', 'Ж'}; char B[10]; Это массивы символов: Для массива: каждый символ – отдельный объект; массив имеет длину N, которая задана при объявлении Что нужно: обрабатывать последовательность символов как единое целое строка должна иметь переменную длину

8 Строки: общие сведения Символьные строки Привет!\0¤¤…¤¤¤ 0 79 рабочая часть s[0] s[1] s[2] s[3] char s[80]; признак окончания строки: символ с кодом 0 Символ '\0' имеет код 0 символ '0' имеет код 48 ! Символьная строка – это последовательность символов, которая заканчивается символом '\0'.

9 Строки: общие сведения Объявление символьных строк Объявить строку = выделить ей место в памяти и присвоить имя. char s[80]; char s1[80] = "abc"; char qqq[] = "Вася"; char s[80]; char s1[80] = "abc"; char qqq[] = "Вася"; выделяется 80 байт, в строке – «мусор» (если она глобальная, то нули '\0) выделяется 80 байт, занято 4 байта (с учетом '\0') выделяется 5 байт (с учетом '\0') выделяется 5 байт (с учетом '\0') При выделении памяти надо учитывать место для символа '\0'. В строку нельзя записывать больше символов, чем выделено памяти. !

10 Строки: общие сведения Указатели и символьные строки char str[10] = " "; char *p; p = str; *p = 'A'; p ++; *p = 'B'; p ++; strcpy ( p, "CD" ); strcat ( p, "qqq" ); puts ( p ); char str[10] = " "; 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] не надо ставить &: 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"); scanf ( "%s", q ); printf ("Введено:\n%s", q ); Ввод символьных строк Введите текст: Вася пошел гулять Введено: Вася Введите текст: Вася пошел гулять Введено: Вася char q[80]; printf("Введите текст:\n"); gets ( 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 Строки: общие сведения Упражнения 1. Ввести символьную строку и заменить все буквы "а" на буквы "б" и наоборот, как заглавные, так и строчные. Пример: Введите строку: ааббссААББСС Результат: ббаассББААСС 2. Ввести символьную строку и проверить, является ли она палиндромом (палиндром читается одинаково в обоих направлениях). Пример: Пример: Введите строку: Введите строку: АБВГДЕ КАЗАК Результат: Результат: Не палиндром. Палиндром.

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

16 Функции для работы со строками Длина строки: strlen (string length) Подключение библиотеки: #include char q[80] = "qwerty"; int n; n = strlen ( q ); char q[80] = "qwerty"; int n; n = strlen ( q ); n = 6n = 6 n = 6n = 6 При определении длины символ '\0' не учитывается! !

17 Функции для работы со строками Сравнение строк char q1[80], q2[80]; int n; gets ( q1 ); gets ( q2 ); n = strcmp ( q1, q2 ); char q1[80], q2[80]; int n; gets ( q1 ); gets ( q2 ); n = strcmp ( q1, q2 ); strcmp (string comparison): q1q2n "AA" 0 "AB""AA"1 "AB"– 1 "AA""A"65 Функция вычисляет разность между кодами первых двух отличающихся символов! !

18 Функции для работы со строками Пример решения задачи Задача: ввести строку и определить, сколько в ней слов. Программа должна работать только при вводе правильного пароля. Идея решения: проверка пароля – через strcmp количество слов = количеству первых букв слова первая буква: пробел и за ним «не пробел» исключение: предложение начинается со слова (а не с пробела) Васяпошелгулять\0¤¤¤¤¤

19 Функции для работы со строками Проверка пароля #include void main() { char secret[] = "123", pass[20]; printf ( "Введите пароль\n" ); gets ( pass ); if ( strcmp ( pass, secret ) != 0 ) { printf ( "Пароль неверный" ); getch (); return 1; }... } если пароль неверный... сообщить об ошибке и выйти из программы аварийное завершение, код ошибки 1

20 Функции для работы со строками Основная часть программы #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 ); } особый случай если нашли пробел, а за ним не пробел… предыдущий слайд

21 Функции для работы со строками Подсказка: для вывода одного символа используйте функцию putchar(символ). Например: Упражнения 1. Ввести предложение и определить, сколько слов заканчиваются на букву 'а'. Пример: Введите предложение: Введите предложение: Мама мыла раму Декан пропил бутан Найдено слов: 2 Нет таких слов 2. Ввести предложение и разобрать его на отдельные слова: Пример: Введите предложение: Мама мыла раму Результат: Мама мыла раму putchar(q[i]); putchar('\n'); // переход на новую строку putchar(q[i]); putchar('\n'); // переход на новую строку

22 Функции для работы со строками Копирование строк strcpy (string copy) char q1[10] = "qwerty", q2[10] = "01234"; strcpy ( q1, q2 ); char q1[10] = "qwerty", q2[10] = "01234"; strcpy ( q1, q2 ); куда откуда Старое значение q1 стирается! ! копирование «хвоста» строки char q1[10] = "qwerty", q2[10] = "01234"; strcpy ( q1, q2+2 ); char q1[10] = "qwerty", q2[10] = "01234"; strcpy ( q1, q2+2 ); qwerty\0¤¤¤ ¤¤¤¤ q2 q1 q2 = &q2[0] q2+2 = &q2[2] 234\0

23 Функции для работы со строками Копирование строк копирование в середину строки char q1[10] = "qwerty", q2[10] = "01234"; strcpy ( q1+2, q2 ); char q1[10] = "qwerty", q2[10] = "01234"; strcpy ( q1+2, q2 ); qwerty\0¤¤¤ ¤¤¤¤ q2 q1 q1+2 = &q1[2] 01234\0 char q1[10] = "qwerty", q2[10] = "01234"; strcpy ( q1+2, q2+3 ); char q1[10] = "qwerty", q2[10] = "01234"; strcpy ( q1+2, q2+3 ); qwerty\0¤¤¤ ¤¤¤¤ q2 q1 34\0 q2+3 = &q2[3] q1+2 = &q1[2]

24 Функции для работы со строками Копирование строк strncpy – копирование нескольких символов char q1[10] = "qwerty", q2[10] = "01234"; strncpy ( q1+2, q2, 2 ); char q1[10] = "qwerty", q2[10] = "01234"; strncpy ( q1+2, q2, 2 ); qwerty\0¤¤¤ ¤¤¤¤ q2 q1 q1+2 = &q1[2] 01 Функция strncpy не добавляет символ '\0' в конце строки! !

25 Функции для работы со строками Копирование строк копирование строки-константы char q1[10] = "qwerty"; strcpy ( q1+1, "ABCD"); char q1[10] = "qwerty"; strcpy ( q1+1, "ABCD"); qwerty\0¤¤¤ ABCD q1 ABCD\0 char q1[10] = "qwerty"; strcpy ( "ABCD", q1+2 ); char q1[10] = "qwerty"; strcpy ( "ABCD", q1+2 ); Первым параметром может быть константа! ! НЕ

26 Функции для работы со строками Копирование строк копирование внутри одной строки char q[10] = "012345"; strcpy ( q, q+2 ); char q[10] = "012345"; strcpy ( q, q+2 ); \0¤¤¤ q 2345 char q[10] = "012345"; strcpy ( q+2, q ); char q[10] = "012345"; strcpy ( q+2, q ); \0¤¤¤ q Зацикливание и зависание компьютера!

27 Функции для работы со строками Объединение строк strcat (string concatenation) = копирование второй строки в конец первой char q1[10] = "qwe", q2[10] = "0123"; strcat ( q1, q2 ); char q1[10] = "qwe", q2[10] = "0123"; strcat ( q1, q2 ); qwe\0¤¤¤¤¤¤ 0123 ¤¤¤¤¤ q2 q1 0123\0 char q1[10] = "qwe", q2[10] = "0123"; strcat ( q1, q2+2 ); char q1[10] = "qwe", q2[10] = "0123"; strcat ( q1, q2+2 ); qwe\0¤¤¤¤¤¤ 0123 ¤¤¤¤¤ q2 q1 23\0

28 Функции для работы со строками что-то другое Проблемы Проблемы при копировании строк Транслятор не сообщает об этих ошибках! ! char q1[] = "qwer", q2[10] = "01234"; strcpy ( q1+2, q2 ); char q1[] = "qwer", q2[10] = "01234"; strcpy ( q1+2, q2 ); не хватает места для строки-результата qwer\ ¤¤¤¤¤ q2 q1 0123\0 зацикливание при копировании в ту же строку «слева направо» char q[10] = "01234"; strcpy ( q+2, q ); char q[10] = "01234"; strcpy ( q+2, q );

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

30 Функции для работы со строками Программа void main() { charfName[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 ); } поиск точки дошли до конца строки меняем или добавляем расширение

31 Функции для работы со строками Упражнения 1. Ввести полный адрес файла (возможно, без расширения) и изменить его расширение на «.exe ». Пример: Введите имя файла: Введите имя файла: C:\DOC.TXT\qqq C:\DOC.TXT\qqq.com Результат: Результат: C:\DOC.TXT\qqq.exe C:\DOC.TXT\qqq.exe 2. Ввести в одной строке фамилию, имя и отчество. Вывести приветствие, где останутся имя и фамилия (см. пример). Пример: Введите ФИО: Пупкин Василий Иванович Результат: Привет, Василий Пупкин!

32 Функции для работы со строками Поиск в символьных строках Задача: найти заданный символ или сочетание символов (подстроку) в символьной строке. Функции поиска в Си возвращают адрес найденного символа или подстроки! Если образец не найден, возвращается NULL (нулевой адрес). ! Указатель – это переменная в которую можно записать адрес другой переменной заданного типа.

33 Функции для работы со строками Поиск символа 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 ); } char q[10] = "abcdabcd"; char *p; int nomer; p = strchr(q, 'b'); if ( p == NULL ) printf ( "Не нашли..." ); else { nomer = p – q; printf ( "Номер символа %d", nomer ); } abcdabcd\0¤ q q q+1 q+5 p p reverse

34 Функции для работы со строками Поиск подстроки 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 ); } char q[10] = "abcdabcd"; char *p; int nomer; p = strstr(q, "bcd"); if ( p == NULL ) printf ( "Не нашли..." ); else { nomer = p – q; printf ( "Номер первого символа %d", nomer ); } abcdabcd\0¤ q q q+1 q+5 p p

35 Функции для работы со строками Пример решения задачи Задача: ввести предложение и определить, сколько раз в нем встречается имя «Вася». Проблема: функция strstr ищет только с начала строки. Алгоритм: 1. Записать адрес начала строки в указатель start. 2. Искать подстроку «Вася», начиная с адреса start. 3. Если не нашли, выход из цикла. 4. Увеличить счетчик найденных слов. 5. Переставить start на адрес после найденного слова. 6. Перейти к шагу 2. Вася и ВасяВася!!!\0 start p p = strstr( start, "Вася");

36 Функции для работы со строками Программа 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 ); } начало поиска адрес найденного слова

37 Функции для работы со строками Упражнения 1. Ввести предложение и заменить все имена «Вася» на «Юра». Пример: Введите предложение: Вася, Вася, Вася и Вася!!! Результат: Юра, Юра, Юра и Юра!!! 2. Ввести предложение и заменить все имена «Юра» на «Вася». Пример: Введите предложение: Юра, Юра, Юра и Юра!!! Результат: Вася, Вася, Вася и Вася!!!

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

39 Строки как параметры функций Символьные строки в функциях строки передаются в функции так же, как и массивы; функции могут изменять строки-параметры. ! Задача: составить процедуру, которая переставляет символы строки в обратном порядке. Алгоритм: определить длину строки len; все символы первой половины переставить с соответствующими символами второй половины: c = s[i]; s[i] = s[len-i-1]; s[len-1-i] = c; c = s[i]; s[i] = s[len-i-1]; s[len-1-i] = c; s[i]s[len-1-i]

40 Строки как параметры функций Программа 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[] = " "; Reverse ( s ); puts ( s ); Reverse ( s + 5 ); puts ( s ); } 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[] = " "; Reverse ( s ); puts ( s ); Reverse ( s + 5 ); puts ( s ); } Как сделать инверсию любой части строки? ? длину строки определяем на месте

41 Строки как параметры функций Упражнения 1. Разработать функцию, которая переставляет пары соседних символов. Пример: Введите предложение: Вася пошел гулять! Результат: а Вясп шолег лутя!ь 2. Разработать функцию, которая удаляет все лишние пробелы (в начале предложения и сдвоенные пробелы). Пример: Введите предложение: Вася пошел гулять! Результат: Вася пошел гулять!

42 Строки как параметры функций Символьные строки в функциях Задача: составить функцию, которая находит количество цифр в строке. int NumDigits ( char s[] ) { int i, count = 0; for ( i = 0; i < strlen(s); i ++ ) if( strchr ( " ", s[i] ) ) count ++; return count; } int NumDigits ( char s[] ) { int i, count = 0; for ( i = 0; i < strlen(s); i ++ ) if( strchr ( " ", s[i] ) ) count ++; return count; } if ( strchr ( " ", s[i] ) != NULL ) или if ( '0'

43 Строки как параметры функций Символьные строки в функциях Основная программа int NumDigits ( char s[] ) {... } void main() { char s[80]; int n; printf ( "Введите строку\n" ); gets ( s ); n = NumDigits ( s ); printf ( "Нашли %d цифр.", s ); } int NumDigits ( char s[] ) {... } void main() { char s[80]; int n; printf ( "Введите строку\n" ); gets ( s ); n = NumDigits ( s ); printf ( "Нашли %d цифр.", s ); }

44 Строки как параметры функций Упражнения 1. Разработать функцию, которая определяет, верно ли, что слово – палиндром. Пример: Введите слово: Введите слово: казак кунак Результат:Результат: Это палиндром.Не палиндром. 2. Разработать функцию, которая определяет, верно ли, что предложение (с пробелами) – палиндром. Пример: Введите предложение: а роза упала на лапу азора Результат: Это палиндром.

45 Вопросы и ответы Вопросы? Строки: общие сведения Массивы символов Символьные строки Объявление строк Указатели и строки Ввод и вывод строк Функции для работы со строками Длина строки Сравнение строк Копирование строк Объединение строк Поиск в строке Строки как параметры функций Передача параметров-строк Примеры функций со строковыми параметрами Дубовая роща. Девочка и апельсин