К.Ю. Поляков, Е.А. Ерёмин, 2013 Программирование на языке Си § 66. Символьные строки 1.

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



Advertisements
Похожие презентации
К.Ю. Поляков, Е.А. Ерёмин, 2013 Программирование на языке Паскаль § 66. Символьные строки 1.
Advertisements

К. Поляков, Программирование на алгоритмическом языке. Часть II Тема 4. Символьные строки.
1 Программирование на языке Паскаль Часть II Символьные строки.
Таблица умножения на 8. Разработан: Бычкуновой О.В. г.Красноярск год.
1 Программирование на языке Паскаль Файлы с последовательным доступом. Кулебякин В.В.
К. Поляков, Программирование на алгоритмическом языке Тема 4. Циклы.
ОДНОМЕРНЫЕ МАССИВЫ. РАБОТА С ЭЛЕМЕНТАМИ СТРУКТУРИРОВАННЫЕ ТИПЫ ДАННЫХ.

Строки в Pascal
Автор: учитель информатики МКОУ Плесской средней общеобразовательной школы Юдин Андрей Борисович Часть 1.
Матемтааки ЕТ СТ 2 класс Шипилова Наталия Викторовна учитель начальных классов, ВКК Шипилова Наталия Викторовна учитель начальных классов, ВКК.
Строки Алтайский государственный университет Математический факультет Кафедра информатики Барнаул 2013.
Работа учащегося 7Б класса Толгского Андрея. Каждое натуральное число, больше единицы, делится, по крайней мере, на два числа: на 1 и на само себя. Если.
1 Знаток математики Тренажер Таблица умножения 2 класс Школа 21 века ®м®м.
К. Поляков, Программирование на алгоритмическом языке Тема 1. Введение.
Путешествие с любознательным дымком! 19, 29, 39, 11, 22, 33,. 49, 59, 69, 79 44, 55, 66, 77.
Одномерные массивы Понятие массива, виды массивов Описание, заполнение и вывод одномерного массива Обработка одномерного массива.
Фрагмент карты градостроительного зонирования территории города Новосибирска Масштаб 1 : 6000 Приложение 7 к решению Совета депутатов города Новосибирска.
Массивы Материалы к урокам по программированию. МАССИВ это УПОРЯДОЧЕННАЯ последовательность данных ОДНОГО ТИПА. Массивы относятся к структурированным.
1. Определить последовательность проезда перекрестка
Транксрипт:

К.Ю. Поляков, Е.А. Ерёмин, Программирование на языке Си § 66. Символьные строки 1

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Зачем нужны символьные строки? 2 char s[10]; // массив символов элементы массива – отдельные объекты сложно работать со строками переменной длины Хочется: строка – единый объект длина строки может меняться во время работы программы

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Как хранится символьная строка? 3 Привет! \0\0?? 0 9 рабочая часть s[0] s[1] s[2] s[3] char s[10]; признак окончания строки: символ с кодом 0 Символ '\0' имеет код 0 символ '0' имеет код 48 ! Символьная строка – это последовательность символов, которая заканчивается символом '\0'.

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Символьные строки 4 Начальное значение: char s[10] = "Привет!"; Вывод на экран: printf ( "%s", s ); А если массив? ? char s[] = "Привет!"; размер вычисляется автоматически puts ( s ); с переходом на новую строку

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Символьные строки 5 Ввод с клавиатуры: scanf ( "%s", s ); Отдельный символ: s[4] = 'a'; Длина строки: #include только до пробела! gets ( s ); до перевода строки (Enter) int n;... n = strlen(s); int n;... n = strlen(s); библиотека для работы со строками string length – длина строки

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Символьные строки 6 #include main() { char s[80]; int i; printf ( "Введите строку" ); gets ( s ); for ( i = 0; i < strlen(s); i++ ) if ( s[i] == 'а' ) s[i] = 'б'; puts ( s ); } #include main() { char s[80]; int i; printf ( "Введите строку" ); gets ( s ); for ( i = 0; i < strlen(s); i++ ) if ( s[i] == 'а' ) s[i] = 'б'; puts ( s ); } Задача: заменить в строке все буквы 'а' на буквы 'б'.

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 7 «A»: Ввести с клавиатуры символьную строку и заменить в ней все буквы «а» на «б» и все буквы «б» на «а» (заглавные на заглавные, строчные на строчные). Пример: Введите строку: сааб ААББссСС Результат: база ББААссСС

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 8 «B»: Ввести с клавиатуры символьную строку и определить, сколько в ней слов. Словом считается последовательности непробельных символов, отделенная с двух сторон пробелами (или стоящая с краю строки). Слова могут быть разделены несколькими пробелами, в начале и в конце строки тоже могут быть пробелы. Пример: Введите строку: Вася пошел гулять Найдено слов: 3

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 9 «C»: Ввести с клавиатуры символьную строку и найдите самое длинное слово и его длину. Словом считается последовательности непробельных символов, отделенная с двух сторон пробелами (или стоящая с краю строки). Слова могут быть разделены несколькими пробелами, в начале и в конце строки тоже могут быть пробелы. Пример: Введите строку: Вася пошел гулять Самое длинное слово: гулять, длина 6

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Операции со строками 10 Объединение (конкатенация): char s[80]= "Привет", s1[]="Вася!"; strcat( s, ", "); // s = "Привет, " strcat( s, s1 ); // s = "Привет, Вася!" char s[80]= "Привет", s1[]="Вася!"; strcat( s, ", "); // s = "Привет, " strcat( s, s1 ); // s = "Привет, Вася!" string concatenation – «сцепление» строк Вторая строка прицепляется в конец первой! !

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Операции со строками 11 Копирование строки: char s[80], s1[]="Привет"; strcpy( s, "Вася!"); // s1 = "Вася!" strcpy( s, s1 ); // s = s1 = "Вася!" char s[80], s1[]="Привет"; strcpy( s, "Вася!"); // s1 = "Вася!" strcpy( s, s1 ); // s = s1 = "Вася!" string copy – копировать строку Вторая строка копируется на место первой! ! Какие могут быть проблемы? ? откуда куда

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Операции со строками 12 Копирование строки со смещением: char s[80] = "Прошёл поезд."; strcpy ( &s[7], "пароход." ); char s[80] = "Прошёл поезд."; strcpy ( &s[7], "пароход." ); Хватит ли места? ? адрес символа s[5] : &s[5] или s+5 Прошел пароход. s совпадает с &s[0] char s[80] = "Прошёл поезд.", s1[] = "Привет, Вася."; strcpy ( s+7, s1+8 ); char s[80] = "Прошёл поезд.", s1[] = "Привет, Вася."; strcpy ( s+7, s1+8 ); Что получим? ? Прошел Вася.

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Операции со строками 13 Удаление: char s[] = " "; strcpy ( s+2, s+6 ); char s[] = " "; strcpy ( s+2, s+6 ); Как удалить часть строки? ? \0\ \0\0 Можно ли так «раздвинуть» строку? ? откуда куда

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Операции со строками 14 Копирование n символов: char s[] = "Мухтар, ко мне!", s1[] = "Цезарь живет у нас дома."; strncpy ( s, s1, 6 ); char s[] = "Мухтар, ко мне!", s1[] = "Цезарь живет у нас дома."; strncpy ( s, s1, 6 ); сколько символов Не добавляет символ конца строки! ! char s[] = "Вчера Мурзик вернулся.", s1[]= "Кота зовут Васька."; strncpy ( s+6, s1+11, 6 ); char s[] = "Вчера Мурзик вернулся.", s1[]= "Кота зовут Васька."; strncpy ( s+6, s1+11, 6 ); Васька Цезарь

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Операции со строками 15 Выделение подстроки: char s[] = " ", s1[20]; strncpy ( s1, s+2, 4 ); s1[4] = '\0'; char s[] = " ", s1[20]; strncpy ( s1, s+2, 4 ); s1[4] = '\0'; с какого символа сколько символов Задача: выделить 4 символа строки s, начиная с s[2], в новую строку s1. символ конца строки добавляем вручную» s1 = "2345"

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Операции со строками 16 Вставка фрагмента в середину строки: char s[80]="Иван меняет профессию.", s1[30]; // буфер strcpy ( s1, s+4 ); strcpy ( s+4, " Васильевич" ); strcat ( s, s1 ); char s[80]="Иван меняет профессию.", s1[30]; // буфер strcpy ( s1, s+4 ); strcpy ( s+4, " Васильевич" ); strcat ( s, s1 ); "Иванменяет профессию."Васильевич Сдвиг вправо в строке не работает! ! s+4 "Иванменяет профессию." s1: s:s: " меняет профессию." Васильевич"меняет профессию."

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Поиск в строках 17 Функции поиска возвращают адрес памяти! ! Указатель – это переменная. в которую можно записать адрес памяти. char *p; // указатель на символ // может хранить адрес // любого символа char *p; // указатель на символ // может хранить адрес // любого символа char s[] = "Здесь был Вася."; char *p; p = &s[2]; printf( "%c", *p ); // е *p = 'э'; // s[2] = 'э' char s[] = "Здесь был Вася."; char *p; p = &s[2]; printf( "%c", *p ); // е *p = 'э'; // s[2] = 'э' содержимое ячейки

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Поиск символа в строке 18 char s[] = "Здесь был Вася."; char *p; p = strchr ( s, 'с' ); char s[] = "Здесь был Вася."; char *p; p = strchr ( s, 'с' ); где что искать в строке (string) символ (character) if ( p != NULL ) printf("Номер символа 'c':%d\n", p-s ); else printf("Символ не найден.\n" ); if ( p != NULL ) printf("Номер символа 'c':%d\n", p-s ); else printf("Символ не найден.\n" ); нулевой указатель strrchr – поиск с конца строки! ! 3 3

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Поиск подстроки 19 char s[] = "Здесь был Вася."; char *p; p = strstr ( s, "Вася" ); char s[] = "Здесь был Вася."; char *p; p = strstr ( s, "Вася" ); где что искать в строке (string) строку (string) if ( p != NULL ) printf("Слово начинается с s[%d]\n", p-s ); else printf("Слово не найдено.\n" ); if ( p != NULL ) printf("Слово начинается с s[%d]\n", p-s ); else printf("Слово не найдено.\n" ); нулевой указатель 10

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Пример обработки строк 20 Задача: Ввести имя, отчество и фамилию. Преобразовать их к формату «фамилия-инициалы». Пример: Введите имя, отчество и фамилию: Василий Алибабаевич Хрюндиков Результат: Хрюндиков В.А. Алгоритм: найти первый пробел и выделить имя удалить имя с пробелом из основной строки найти первый пробел и выделить отчество удалить отчество с пробелом из основной строки «сцепить» фамилию, первые буквы имени и фамилии, точки, пробелы… Алибабаевич Хрюндиков Хрюндиков Хрюндиков В.А.

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Пример обработки строк 21 main() { char s[80], name[] = ".", name2[] = "."; char *p; printf("Введите имя, отчество и фамилию: "); gets ( s ); name[0] = s[0]; // первая буква имени p = strchr ( s, ' ' ); // найти пробел strcpy ( s, p+1 );// стереть имя name2[0] = s[0]; // первая буква отчества p = strchr ( s, ' ' ); // найти пробел strcpy ( s, p+1 ); // осталась фамилия strcat ( s, " " ); // добавить пробел strcat ( s, name );// прицепить имя strcat ( s, name2 );// прицепить отчество puts ( s ); } main() { char s[80], name[] = ".", name2[] = "."; char *p; printf("Введите имя, отчество и фамилию: "); gets ( s ); name[0] = s[0]; // первая буква имени p = strchr ( s, ' ' ); // найти пробел strcpy ( s, p+1 );// стереть имя name2[0] = s[0]; // первая буква отчества p = strchr ( s, ' ' ); // найти пробел strcpy ( s, p+1 ); // осталась фамилия strcat ( s, " " ); // добавить пробел strcat ( s, name );// прицепить имя strcat ( s, name2 );// прицепить отчество puts ( s ); } заготовки для инициалов

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 22 «A»: Ввести с клавиатуры в одну строку фамилию, имя и отчество, разделив их пробелом. Вывести фамилию и инициалы. Пример: Введите фамилию, имя и отчество: Иванов Петр Семёнович П.С. Иванов

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 23 «B»: Ввести адрес файла и «разобрать» его на части, разделенные знаком '/'. Каждую часть вывести в отдельной строке. Пример: Введите адрес файла: C:/Фото/2013/Поход/vasya.jpg C: Фото 2013 Поход vasya.jpg

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 24 «C»: Напишите программу, которая заменяет во всей строке одну последовательность символов на другую. Пример: Введите строку: (X > 0) and (Y Y) and (Z 5) Что меняем: and Чем заменить: & Результат (X > 0) & (Y Y) & (Z 5)

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Преобразования «строка» – «число» 25 Из строки в число: #include char s[] = "123"; int N; N = atoi ( s ); // N = 123 char s[] = "123"; int N; N = atoi ( s ); // N = 123 char s[] = " "; float X; X = atof ( s ); // X = char s[] = " "; float X; X = atof ( s ); // X = «12x3» 12

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Преобразования «строка» – «число» 26 Из числа в строку: char s[80]; int N = 123; float X = ; sprintf(s, "%d", N); // s = "123" sprintf(s, "%e", X); // s = " E+002" sprintf(s, "%10.3f", X);// s = " " char s[80]; int N = 123; float X = ; sprintf(s, "%d", N); // s = "123" sprintf(s, "%e", X); // s = " E+002" sprintf(s, "%10.3f", X);// s = " " sprintf – вывод в строку, а не на экран! !

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 27 «A»: Напишите программу, которая вычисляет сумму трех чисел, введенную в форме символьной строки. Все числа целые. Пример: Введите выражение: Ответ: 60 «B»: Напишите программу, которая вычисляет выражение, состоящее из трех чисел и двух знаков (допускаются только знаки «+» или «–»). Выражение вводится как символьная строка, все числа целые. Пример: Введите выражение: Ответ: 54

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 28 «C»: Напишите программу, которая вычисляет выражение, состоящее из трех чисел и двух знаков (допускаются знаки « + », « – », « * » и « / »). Выражение вводится как символьная строка, все числа целые. Операция « / » выполняется как целочисленное деление. Пример: Введите выражение: 12*3+45 Ответ: 81

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 29 «D»: Напишите программу, которая вычисляет выражение, состоящее из трех чисел и двух знаков (допускаются знаки « + », « – », « * » и « / ») и круглых скобок. Выражение вводится как символьная строка, все числа целые. Операция « / » выполняется как целочисленное деление ( div ). Пример: Введите выражение: 2*(3+45)+4 Ответ: 100

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Строки в процедурах и функциях 30 Задача: построить процедуру, которая заменяет в строке s все вхождения слова-образца wOld на слово-замену wNew. пока // слово wOld есть в строке s // удалить слово wOld из строки // вставить на это место слово wNew пока // слово wOld есть в строке s // удалить слово wOld из строки // вставить на это место слово wNew Что плохо? ? wOld: '12' wNew: 'A12B' зацикливание

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Замена всех экземпляров подстроки 31 s res б)б) wNew s res в)в) s г)г) wOld res s а)а) wNew

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Замена всех экземпляров подстроки 32 рабочая строка s результат res " """ ".12.12""A12B" ".12""A12B.A12B" """A12B.A12B.A12B" main() { char s[80] = " "; replaceAll ( s, "12", "A12B" ); puts ( s ); } main() { char s[80] = " "; replaceAll ( s, "12", "A12B" ); puts ( s ); }

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Использование указателей 33 s res б)б) wNew s res в)в) s г)г) wOld res s а)а) wNew pRes pS p p pRes pS pRes pS pRes pS

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Замена всех экземпляров подстроки 34 void replaceAll(char s[], char wOld[], char wNew[]) { int lenOld, lenNew; char *p, *pS, *pRes; char res[200]; // строка-результат lenOld = strlen(wOld); lenNew = strlen(wNew); res[0] = '\0'; pS = s; pRes = res; while( strlen(pS) > 0 ) { // пока строка не пуста p = strstr ( pS, wOld ); if( p == NULL ) { // прицепить хвост и выйти } if( p > pS ) { // скопировать часть до образца } strcpy ( pRes, wNew ); pRes += lenNew; pS += lenOld; } strcpy ( s, res ); // записать результат в s } void replaceAll(char s[], char wOld[], char wNew[]) { int lenOld, lenNew; char *p, *pS, *pRes; char res[200]; // строка-результат lenOld = strlen(wOld); lenNew = strlen(wNew); res[0] = '\0'; pS = s; pRes = res; while( strlen(pS) > 0 ) { // пока строка не пуста p = strstr ( pS, wOld ); if( p == NULL ) { // прицепить хвост и выйти } if( p > pS ) { // скопировать часть до образца } strcpy ( pRes, wNew ); pRes += lenNew; pS += lenOld; } strcpy ( s, res ); // записать результат в s } длины строк начальные установки добавить слово-замену указатели передвинуть указатели

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Замена всех экземпляров подстроки 35 p = strstr ( pS, wOld ); if ( p == NULL ) { strcat ( res, s ); break; } p = strstr ( pS, wOld ); if ( p == NULL ) { strcat ( res, s ); break; } if ( p > pS ) { strncpy ( pRes, pS, p-pS ); pRes += p-pS; pS = p; } if ( p > pS ) { strncpy ( pRes, pS, p-pS ); pRes += p-pS; pS = p; } Если образец не найден: Если перед образцом что-то есть: длина блока перед образцом прицепить «хвост» выйти из цикла p-pS передвинуть указатели

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 36 «A»: Напишите процедуру, которая отсекает всю часть строки после первого слова. Пример: Введите строку: Однажды в студёную зимнюю пору... Первое слово: Однажды

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 37 «B»: Напишите процедуру, которая заменяет расширение файла на заданное новое расширение. Пример: Введите имя файла: qq Введите новое расширение: tmp Результат: qq.tmp Пример: Введите имя файла: qq.exe Введите новое расширение: tmp Результат: qq.tmp Пример: Введите имя файла: qq.work.xml Введите новое расширение: tmp Результат: qq.work.tmp

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 38 «C»: Напишите процедуру, которая заменяет во всей строке все римские числа на соответствующие десятичные числа. Пример: Введите строку: В MMXIII году в школе CXXIII состоялся очередной выпуск XI классов. Результат: В 2013 году в школе 123 состоялся очередной выпуск 11 классов.

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Рекурсивный перебор 39 Задача. В алфавите языке племени «тумба-юмба» четыре буквы: «Ы», «Ш», «Ч» и «О». Нужно вывести на экран все слова, состоящие из L букв, которые можно построить из букв этого алфавита. Ы??? перебор L-1 символов Ш??? Ч??? 0??? задача для слов длины К сведена к задаче для слов длины L-1!

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Рекурсивный перебор 40 перебор L символов w[0]='Ы'; // перебор последних L-1 символов w[0]='Ш'; // перебор последних L-1 символов w[0]='Ч'; // перебор последних L-1 символов w[0]='О'; // перебор последних L-1 символов перебор L символов w[0]='Ы'; // перебор последних L-1 символов w[0]='Ш'; // перебор последних L-1 символов w[0]='Ч'; // перебор последних L-1 символов w[0]='О'; // перебор последних L-1 символов

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Рекурсивный перебор 41 main() { char word[] = "..."; TumbaWords ( "ЫШЧО", word, 0 ); } main() { char word[] = "..."; TumbaWords ( "ЫШЧО", word, 0 ); } void TumbaWords( char A[], char w[], int N ) { int i; if ( N == strlen(w) ) { puts ( w ); return; } for ( i = 1; i < strlen(A); i++ ) { w[N] = A[i]; TumbaWords ( A, w, N+1 ); } void TumbaWords( char A[], char w[], int N ) { int i; if ( N == strlen(w) ) { puts ( w ); return; } for ( i = 1; i < strlen(A); i++ ) { w[N] = A[i]; TumbaWords ( A, w, N+1 ); } } уже установлено когда все символы уже установлены по всем символам алфавита алфавит слово любая строка длины L

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 42 «A»: В алфавите языке племени «тумба-юмба» четыре буквы: «Ы», «Ш», «Ч» и «О». Нужно вывести на экран все возможные слова, состоящие из K букв, в которых вторая буква «Ы». Подсчитайте количество таких слов. «B»: В алфавите языке племени «тумба-юмба» четыре буквы: «Ы», «Ш», «Ч» и «О». Нужно вывести на экран все возможные слова, состоящие из K букв, в которых есть по крайней мере две одинаковые буквы, стоящие рядом. Подсчитайте количество таких слов. Программа не должна строить другие слова, не соответствующие условию.

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 43 «C»: В алфавите языке племени «тумба-юмба» четыре буквы: «Ы», «Ш», «Ч» и «О». Нужно вывести на экран все возможные слова, состоящие из K букв, в которых есть по крайней мере две одинаковые буквы, не обязательно стоящие рядом. Программа не должна строить другие слова, не соответствующие условию.

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Сравнение строк 44 парпарк Пар?? Сравнение по кодам символов: AB...YZ CP UNCODE ab...yz CP UNCODE CP UNCODE

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Сравнение строк 45 АБ...Ё ЮЯ CP UNCODE аб...ё юя CP UNCODE STEAM < STEAM < Steam < steam steam < ПАР < Пар < п Ар < пар < парк

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Сортировка строк 46 main() { const int N = 10; char s1[80], S[N][80]; int i, j; printf ( "Введите строки: \n" ); for ( i = 0; i < N; i ++ ) gets ( S[i] );... printf ( "После сортировки: \n" ); for ( i = 0; i < N; i ++ ) puts ( S[i] ); } main() { const int N = 10; char s1[80], S[N][80]; int i, j; printf ( "Введите строки: \n" ); for ( i = 0; i < N; i ++ ) gets ( S[i] );... printf ( "После сортировки: \n" ); for ( i = 0; i < N; i ++ ) puts ( S[i] ); } for ( i = 0; i < N-1; i ++ ) for ( j = N-2; j >= i; j -- ) if( strcmp(S[j],S[j+1])> 0 ) { strcpy (s1, S[j]); strcpy (S[j], S[j+1]); strcpy (S[j+1], s1); } for ( i = 0; i < N-1; i ++ ) for ( j = N-2; j >= i; j -- ) if( strcmp(S[j],S[j+1])> 0 ) { strcpy (s1, S[j]); strcpy (S[j], S[j+1]); strcpy (S[j+1], s1); } массив строк

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 47 «A»: Вводится 5 строк, в которых сначала записан порядковый номер строки с точкой, а затем – слово. Вывести слова в алфавитном порядке. Пример: Введите 5 строк: 1. тепловоз 2. арбуз 3. бурундук 4. кефир 5. урядник Список слов в алфавитном порядке: арбуз, бурундук, кефир, тепловоз, урядник

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 48 «B»: Вводится несколько строк (не более 20), в которых сначала записан порядковый номер строки с точкой, а затем – слово. Ввод заканчивается пустой строкой. Вывести введённые слова в алфавитном порядке. Пример: Введите слова: 1. тепловоз 2. арбуз Список слов в алфавитном порядке: арбуз, тепловоз

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 49 «C»: Вводится несколько строк (не более 20), в которых сначала записаны инициалы и фамилии работников фирмы. Ввод заканчивается пустой строкой. Отсортировать строки в алфавитном порядке по фамилии. Пример: Введите ФИО: А.Г. Урядников Б.В. Тепловозов В.Д. Арбузов Список в алфавитном порядке: В.Д. Арбузов Б.В. Тепловозов А.Г. Урядников

К.Ю. Поляков, Е.А. Ерёмин, Программирование на языке Си § 67. Матрицы 50

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Что такое матрица? Как закодировать? ? Матрица это прямоугольная таблица, составленная из элементов одного типа (чисел, строк и т.д.). Каждый элемент матрицы имеет два индекса – номера строки и столбца. нет знака нолик крестик строка 1, столбец 2

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Объявление матриц 52 const int N = 3, M = 4; int A[N][M]; double X[10][12]; bool L[N][2]; const int N = 3, M = 4; int A[N][M]; double X[10][12]; bool L[N][2]; строки столбцы строки столбцы Если удобна нумерация с 1? ? Нумерация строк и столбцов с нуля! !

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Простые алгоритмы 53 Заполнение случайными числами: for ( i = 0; i < N; i++ ) { for ( j = 0; j < M; j++ ) { A[i][j] = irand(20, 80); printf ( "%3d", A[i][j] ); } printf ( "\n" ); } for ( i = 0; i < N; i++ ) { for ( j = 0; j < M; j++ ) { A[i][j] = irand(20, 80); printf ( "%3d", A[i][j] ); } printf ( "\n" ); } Суммирование: sum = 0; for ( i = 0; i < N; i++ ) for ( j = 0; j < M; j++ ) sum += A[i][j]; sum = 0; for ( i = 0; i < N; i++ ) for ( j = 0; j < M; j++ ) sum += A[i][j]; Вложенный цикл! !

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 54 «A»: Напишите программу, которая заполняет квадратную матрицу случайными числами в интервале [10,99], и находит максимальный и минимальный элементы в матрице и их индексы. Пример: Матрица А: Максимальный элемент A[2,2]=87 Минимальный элемент A[3,4]=11

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 55 «B»: Яркости пикселей рисунка закодированы числами от 0 до 255 в виде матрицы. Преобразовать рисунок в черно-белый по следующему алгоритму: 1)вычислить среднюю яркость пикселей по всему рисунку 2)все пиксели, яркость которых меньше средней, сделать черными (записать код 0), а остальные – белыми (код 255) Пример: Матрица А: Средняя яркость Результат:

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 56 «С»: Заполните матрицу, содержащую N строк и M столбцов, натуральными числами по спирали и змейкой, как на рисунках:

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Перебор элементов матрицы 57 Главная диагональ: for ( i = 0; i < N; i++ ) { // работаем с A[i][i] } for ( i = 0; i < N; i++ ) { // работаем с A[i][i] } Побочная диагональ: for ( i = 0; i < N; i++ ){ // работаем с A[i][N-1-i] } for ( i = 0; i < N; i++ ){ // работаем с A[i][N-1-i] } Главная диагональ и под ней: for ( i = 0; i < N; i++ ) for ( j = 0; j

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Перестановка строк 58 2-я и 4-я строки: for ( j = 0; j < M; j++ ) { c = A[2][j]; A[2][j]= A[4][j]; A[4][j]= c; } for ( j = 0; j < M; j++ ) { c = A[2][j]; A[2][j]= A[4][j]; A[4][j]= c; }

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 59 «A»: Напишите программу, которая заполняет квадратную матрицу случайными числами в интервале [10,99], а затем записывает нули во все элементы выше главной диагонали. Алгоритм не должен изменяться при изменении размеров матрицы. Пример: Матрица А: Результат:

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 60 «B»: Пиксели рисунка закодированы числами (обозначающими цвет) в виде матрицы, содержащей N строк и M столбцов. Выполните отражение рисунка сверху вниз: «С»: Пиксели рисунка закодированы числами (обозначающими цвет) в виде матрицы, содержащей N строк и M столбцов. Выполните поворот рисунка вправо на 90 градусов:

К.Ю. Поляков, Е.А. Ерёмин, Программирование на языке Си § 68. Работа с файлами 61

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Как работать с файлами? 62 файлы текстовые двоичные «plain text»: текст, разбитый на строки; из специальных символов только символы перехода на новую строку любые символы рисунки, звуки, видео, …

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Принцип сэндвича 63 открыть файл работа с файлом закрыть файл хлеб начинка FILE *Fin, *Fout; Fin = fopen ( "input.txt", "r" ); Fout = fopen ( "output.txt", "w" ); // здесь работаем с файлами fclose (Fin); fclose (Fout); FILE *Fin, *Fout; Fin = fopen ( "input.txt", "r" ); Fout = fopen ( "output.txt", "w" ); // здесь работаем с файлами fclose (Fin); fclose (Fout); файловые переменные- указатели "r" - чтение "w" – запись "a" – добавление "r" - чтение "w" – запись "a" – добавление

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Обработка ошибок 64 FILE *F; F = fopen ( "input.txt", "r" ); if ( F ) { // здесь работаем с файлом } else printf("Открыть файл не удалось."); FILE *F; F = fopen ( "input.txt", "r" ); if ( F ) { // здесь работаем с файлом } else printf("Открыть файл не удалось."); if ( F != NULL ) В случае неудачи fopen возвращает NULL ! ! Когда такое может быть? ?

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Ввод данных 65 int a, b; FILE *Fin; Fin = fopen("input.txt", "r"); fclose(Fin); int a, b; FILE *Fin; Fin = fopen("input.txt", "r"); fclose(Fin); Fin = fopen("input.txt", "r"); fclose(Fin); Fin = fopen("input.txt", "r"); fscanf( Fin, "%d%d", &a, &b ); Переход к началу открытого файла: if ( feof(Fin) ) printf("Данные кончились"); if ( feof(Fin) ) printf("Данные кончились"); Определение конца файла: eof = end of file, конец файла

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Вывод данных в файл 66 int a = 1, b = 2; FILE *Fout; Fout = fopen("output.txt", "w"); fclose(Fout); int a = 1, b = 2; FILE *Fout; Fout = fopen("output.txt", "w"); fclose(Fout); fprintf ( Fout, "%d+%d=%d", a, b, a+b );

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Чтение неизвестного количества данных 67 пока не конец файла // прочитать число из файла // добавить его к сумме пока не конец файла // прочитать число из файла // добавить его к сумме Задача. В файле записано в столбик неизвестное количество чисел. Найти их сумму. int n, S, x; S = 0; while( 1 ) { n = fscanf ( Fin, "%d", &x ); if ( n < 1 ) break; S = S + x; } int n, S, x; S = 0; while( 1 ) { n = fscanf ( Fin, "%d", &x ); if ( n < 1 ) break; S = S + x; } fscanf возвращает количество прочитанных данных! ! при неудачном чтении выход из цикла

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 68 «A»: Напишите программу, которая находит среднее арифметическое всех чисел, записанных в файле в столбик, и выводит результат в другой файл. «B»: Напишите программу, которая находит минимальное и максимальное среди чётных положительных чисел, записанных в файле, и выводит результат в другой файл. Учтите, что таких чисел может вообще не быть. «C»: В файле в столбик записаны целые числа, сколько их – неизвестно. Напишите программу, которая определяет длину самой длинной цепочки идущих подряд одинаковых чисел и выводит результат в другой файл.

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Обработка массивов 69 Задача. В файле записано не более 100 целых чисел. Вывести в другой текстовый файл те же числа, отсортированные в порядке возрастания. В чем отличие от предыдущей задачи? ? const int MAX = 100; int A[MAX]; const int MAX = 100; int A[MAX]; Для сортировки нужно удерживать все элементы в памяти одновременно. !

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Обработка массивов 70 Ввод массива: N = 0; while ( N < MAX ) { r = fscanf ( Fin, "%d", &A[N] ); if ( r < 1 ) break; N ++; } N = 0;N = 0; while ( N < MAX ) { r = fscanf ( Fin, "%d", &A[N] ); if ( r < 1 ) break; N ++; } Зачем? ?

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Обработка массивов 71 Вывод результата: Fout = fopen ( "output.txt", "w" ); for ( i = 0; i < N ; i++ ) fprintf ( Fout, "%d\n", A[i] ); fclose ( Fout ); Fout = fopen ( "output.txt", "w" ); for ( i = 0; i < N ; i++ ) fprintf ( Fout, "%d\n", A[i] ); fclose ( Fout ); N

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 72 «A»: В файле записано не более 100 чисел. Отсортировать их по возрастанию последней цифры и записать в другой файл. «B»: В файле записано не более 100 чисел. Отсортировать их по возрастанию суммы цифр и записать в другой файл. Используйте функцию, которая вычисляет сумму цифр числа. «C»: В двух файлах записаны отсортированные по возрастанию массивы неизвестной длины. Объединить их и записать результат в третий файл. Полученный массив также должен быть отсортирован по возрастанию.

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Обработка строк 73 Задача. В файле записано данные о собаках: в каждой строчке кличка собаки, ее возраст и порода: Мухтар 4 немецкая овчарка Вывести в другой файл сведения о собаках, которым меньше 5 лет. пока не конец файла(Fin) // прочитать строку из файла Fin // разобрать строку – выделить возраст если возраст < 5 то // записать строку в файл Fout пока не конец файла(Fin) // прочитать строку из файла Fin // разобрать строку – выделить возраст если возраст < 5 то // записать строку в файл Fout

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Чтение строк из файла 74 while ( fgets(s, 80, Fin) ) { // обработать строку s } while ( fgets(s, 80, Fin) ) { // обработать строку s } Чтение одной строки: char s[80]; char *p; p = fgets( s, 80, Fin ); char s[80]; char *p; p = fgets( s, 80, Fin ); строка размер файл При неудаче fgets вернет NULL ! ! Чтение всех строк:

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Обработка строк 75 // найти в строке пробел // удалить из строки кличку с первым пробелом // найти в строке пробел // выделить возраст перед пробелом // преобразовать возраст в числовой вид // найти в строке пробел // удалить из строки кличку с первым пробелом // найти в строке пробел // выделить возраст перед пробелом // преобразовать возраст в числовой вид Разбор строки: char s[80], *p; int age;... p = strchr ( s, ' ' ); sscanf ( p+1, "%d", &age ); char s[80], *p; int age;... p = strchr ( s, ' ' ); sscanf ( p+1, "%d", &age ); чтение из строки строка (адрес) Мухтар 4 немецкая овчарка p+1 не влияет!

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 76 «A»: В файле записаны данные о результатах сдачи экзамена. Каждая строка содержит фамилию, имя и количество баллов, разделенные пробелами: Вывести в другой файл фамилии и имена тех учеников, которые получили больше 80 баллов. «B»: В предыдущей задаче добавить к полученному списку нумерацию, сократить имя до одной буквы и поставить перед фамилией: П. Иванов И. Петров...

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 77 «C»: В файле записаны данные о результатах сдачи экзамена. Каждая строка содержит фамилию, имя и количество баллов, разделенные пробелами: Вывести в другой файл данные учеников, которые получили больше 80 баллов. Список должен быть отсортирован по убыванию балла. Формат выходных данных: П. Иванов 98 И. Петров 96...

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Конец фильма ПОЛЯКОВ Константин Юрьевич д.т.н., учитель информатики ГБОУ СОШ 163, г. Санкт-Петербург ЕРЕМИН Евгений Александрович к.ф.-м.н., доцент кафедры мультимедийной дидактики и ИТО ПГГПУ, г. Пермь

Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Источники иллюстраций иллюстрации художников издательства «Бином» 3. авторские материалы