Скачать презентацию
Идет загрузка презентации. Пожалуйста, подождите
Презентация была опубликована 9 лет назад пользователемТамара Авлукова
1 К.Ю. Поляков, Е.А. Ерёмин, Программирование на языке Си § 66. Символьные строки 1
2 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Зачем нужны символьные строки? 2 char s[10]; // массив символов элементы массива – отдельные объекты сложно работать со строками переменной длины Хочется: строка – единый объект длина строки может меняться во время работы программы
3 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Как хранится символьная строка? 3 Привет! \0\0?? 0 9 рабочая часть s[0] s[1] s[2] s[3] char s[10]; признак окончания строки: символ с кодом 0 Символ '\0' имеет код 0 символ '0' имеет код 48 ! Символьная строка – это последовательность символов, которая заканчивается символом '\0'.
4 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Символьные строки 4 Начальное значение: char s[10] = "Привет!"; Вывод на экран: printf ( "%s", s ); А если массив? ? char s[] = "Привет!"; размер вычисляется автоматически puts ( s ); с переходом на новую строку
5 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Символьные строки 5 Ввод с клавиатуры: scanf ( "%s", s ); Отдельный символ: s[4] = 'a'; Длина строки: #include только до пробела! gets ( s ); до перевода строки (Enter) int n;... n = strlen(s); int n;... n = strlen(s); библиотека для работы со строками string length – длина строки
6 Алгоритмизация и программирование, язык Си, 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 ); } Задача: заменить в строке все буквы 'а' на буквы 'б'.
7 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 7 «A»: Ввести с клавиатуры символьную строку и заменить в ней все буквы «а» на «б» и все буквы «б» на «а» (заглавные на заглавные, строчные на строчные). Пример: Введите строку: сааб ААББссСС Результат: база ББААссСС
8 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 8 «B»: Ввести с клавиатуры символьную строку и определить, сколько в ней слов. Словом считается последовательности непробельных символов, отделенная с двух сторон пробелами (или стоящая с краю строки). Слова могут быть разделены несколькими пробелами, в начале и в конце строки тоже могут быть пробелы. Пример: Введите строку: Вася пошел гулять Найдено слов: 3
9 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 9 «C»: Ввести с клавиатуры символьную строку и найдите самое длинное слово и его длину. Словом считается последовательности непробельных символов, отделенная с двух сторон пробелами (или стоящая с краю строки). Слова могут быть разделены несколькими пробелами, в начале и в конце строки тоже могут быть пробелы. Пример: Введите строку: Вася пошел гулять Самое длинное слово: гулять, длина 6
10 Алгоритмизация и программирование, язык Си, 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 – «сцепление» строк Вторая строка прицепляется в конец первой! !
11 Алгоритмизация и программирование, язык Си, 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 – копировать строку Вторая строка копируется на место первой! ! Какие могут быть проблемы? ? откуда куда
12 Алгоритмизация и программирование, язык Си, 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 ); Что получим? ? Прошел Вася.
13 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Операции со строками 13 Удаление: char s[] = " "; strcpy ( s+2, s+6 ); char s[] = " "; strcpy ( s+2, s+6 ); Как удалить часть строки? ? \0\ \0\0 Можно ли так «раздвинуть» строку? ? откуда куда
14 Алгоритмизация и программирование, язык Си, 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 ); Васька Цезарь
15 Алгоритмизация и программирование, язык Си, 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"
16 Алгоритмизация и программирование, язык Си, 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: " меняет профессию." Васильевич"меняет профессию."
17 Алгоритмизация и программирование, язык Си, 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] = 'э' содержимое ячейки
18 Алгоритмизация и программирование, язык Си, 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
19 Алгоритмизация и программирование, язык Си, 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
20 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Пример обработки строк 20 Задача: Ввести имя, отчество и фамилию. Преобразовать их к формату «фамилия-инициалы». Пример: Введите имя, отчество и фамилию: Василий Алибабаевич Хрюндиков Результат: Хрюндиков В.А. Алгоритм: найти первый пробел и выделить имя удалить имя с пробелом из основной строки найти первый пробел и выделить отчество удалить отчество с пробелом из основной строки «сцепить» фамилию, первые буквы имени и фамилии, точки, пробелы… Алибабаевич Хрюндиков Хрюндиков Хрюндиков В.А.
21 Алгоритмизация и программирование, язык Си, 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 ); } заготовки для инициалов
22 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 22 «A»: Ввести с клавиатуры в одну строку фамилию, имя и отчество, разделив их пробелом. Вывести фамилию и инициалы. Пример: Введите фамилию, имя и отчество: Иванов Петр Семёнович П.С. Иванов
23 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 23 «B»: Ввести адрес файла и «разобрать» его на части, разделенные знаком '/'. Каждую часть вывести в отдельной строке. Пример: Введите адрес файла: C:/Фото/2013/Поход/vasya.jpg C: Фото 2013 Поход vasya.jpg
24 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 24 «C»: Напишите программу, которая заменяет во всей строке одну последовательность символов на другую. Пример: Введите строку: (X > 0) and (Y Y) and (Z 5) Что меняем: and Чем заменить: & Результат (X > 0) & (Y Y) & (Z 5)
25 Алгоритмизация и программирование, язык Си, 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
26 Алгоритмизация и программирование, язык Си, 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 – вывод в строку, а не на экран! !
27 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 27 «A»: Напишите программу, которая вычисляет сумму трех чисел, введенную в форме символьной строки. Все числа целые. Пример: Введите выражение: Ответ: 60 «B»: Напишите программу, которая вычисляет выражение, состоящее из трех чисел и двух знаков (допускаются только знаки «+» или «–»). Выражение вводится как символьная строка, все числа целые. Пример: Введите выражение: Ответ: 54
28 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 28 «C»: Напишите программу, которая вычисляет выражение, состоящее из трех чисел и двух знаков (допускаются знаки « + », « – », « * » и « / »). Выражение вводится как символьная строка, все числа целые. Операция « / » выполняется как целочисленное деление. Пример: Введите выражение: 12*3+45 Ответ: 81
29 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 29 «D»: Напишите программу, которая вычисляет выражение, состоящее из трех чисел и двух знаков (допускаются знаки « + », « – », « * » и « / ») и круглых скобок. Выражение вводится как символьная строка, все числа целые. Операция « / » выполняется как целочисленное деление ( div ). Пример: Введите выражение: 2*(3+45)+4 Ответ: 100
30 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Строки в процедурах и функциях 30 Задача: построить процедуру, которая заменяет в строке s все вхождения слова-образца wOld на слово-замену wNew. пока // слово wOld есть в строке s // удалить слово wOld из строки // вставить на это место слово wNew пока // слово wOld есть в строке s // удалить слово wOld из строки // вставить на это место слово wNew Что плохо? ? wOld: '12' wNew: 'A12B' зацикливание
31 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Замена всех экземпляров подстроки 31 s res б)б) wNew s res в)в) s г)г) wOld res s а)а) wNew
32 Алгоритмизация и программирование, язык Си, 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 ); }
33 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Использование указателей 33 s res б)б) wNew s res в)в) s г)г) wOld res s а)а) wNew pRes pS p p pRes pS pRes pS pRes pS
34 Алгоритмизация и программирование, язык Си, 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 } длины строк начальные установки добавить слово-замену указатели передвинуть указатели
35 Алгоритмизация и программирование, язык Си, 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 передвинуть указатели
36 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 36 «A»: Напишите процедуру, которая отсекает всю часть строки после первого слова. Пример: Введите строку: Однажды в студёную зимнюю пору... Первое слово: Однажды
37 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 37 «B»: Напишите процедуру, которая заменяет расширение файла на заданное новое расширение. Пример: Введите имя файла: qq Введите новое расширение: tmp Результат: qq.tmp Пример: Введите имя файла: qq.exe Введите новое расширение: tmp Результат: qq.tmp Пример: Введите имя файла: qq.work.xml Введите новое расширение: tmp Результат: qq.work.tmp
38 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 38 «C»: Напишите процедуру, которая заменяет во всей строке все римские числа на соответствующие десятичные числа. Пример: Введите строку: В MMXIII году в школе CXXIII состоялся очередной выпуск XI классов. Результат: В 2013 году в школе 123 состоялся очередной выпуск 11 классов.
39 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Рекурсивный перебор 39 Задача. В алфавите языке племени «тумба-юмба» четыре буквы: «Ы», «Ш», «Ч» и «О». Нужно вывести на экран все слова, состоящие из L букв, которые можно построить из букв этого алфавита. Ы??? перебор L-1 символов Ш??? Ч??? 0??? задача для слов длины К сведена к задаче для слов длины L-1!
40 Алгоритмизация и программирование, язык Си, 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 символов
41 Алгоритмизация и программирование, язык Си, 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
42 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 42 «A»: В алфавите языке племени «тумба-юмба» четыре буквы: «Ы», «Ш», «Ч» и «О». Нужно вывести на экран все возможные слова, состоящие из K букв, в которых вторая буква «Ы». Подсчитайте количество таких слов. «B»: В алфавите языке племени «тумба-юмба» четыре буквы: «Ы», «Ш», «Ч» и «О». Нужно вывести на экран все возможные слова, состоящие из K букв, в которых есть по крайней мере две одинаковые буквы, стоящие рядом. Подсчитайте количество таких слов. Программа не должна строить другие слова, не соответствующие условию.
43 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 43 «C»: В алфавите языке племени «тумба-юмба» четыре буквы: «Ы», «Ш», «Ч» и «О». Нужно вывести на экран все возможные слова, состоящие из K букв, в которых есть по крайней мере две одинаковые буквы, не обязательно стоящие рядом. Программа не должна строить другие слова, не соответствующие условию.
44 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Сравнение строк 44 парпарк Пар?? Сравнение по кодам символов: AB...YZ CP UNCODE ab...yz CP UNCODE CP UNCODE
45 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Сравнение строк 45 АБ...Ё ЮЯ CP UNCODE аб...ё юя CP UNCODE STEAM < STEAM < Steam < steam steam < ПАР < Пар < п Ар < пар < парк
46 Алгоритмизация и программирование, язык Си, 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); } массив строк = 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); } массив строк">
47 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 47 «A»: Вводится 5 строк, в которых сначала записан порядковый номер строки с точкой, а затем – слово. Вывести слова в алфавитном порядке. Пример: Введите 5 строк: 1. тепловоз 2. арбуз 3. бурундук 4. кефир 5. урядник Список слов в алфавитном порядке: арбуз, бурундук, кефир, тепловоз, урядник
48 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 48 «B»: Вводится несколько строк (не более 20), в которых сначала записан порядковый номер строки с точкой, а затем – слово. Ввод заканчивается пустой строкой. Вывести введённые слова в алфавитном порядке. Пример: Введите слова: 1. тепловоз 2. арбуз Список слов в алфавитном порядке: арбуз, тепловоз
49 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 49 «C»: Вводится несколько строк (не более 20), в которых сначала записаны инициалы и фамилии работников фирмы. Ввод заканчивается пустой строкой. Отсортировать строки в алфавитном порядке по фамилии. Пример: Введите ФИО: А.Г. Урядников Б.В. Тепловозов В.Д. Арбузов Список в алфавитном порядке: В.Д. Арбузов Б.В. Тепловозов А.Г. Урядников
50 К.Ю. Поляков, Е.А. Ерёмин, Программирование на языке Си § 67. Матрицы 50
51 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Что такое матрица? Как закодировать? ? Матрица это прямоугольная таблица, составленная из элементов одного типа (чисел, строк и т.д.). Каждый элемент матрицы имеет два индекса – номера строки и столбца. нет знака нолик крестик строка 1, столбец 2
52 Алгоритмизация и программирование, язык Си, 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? ? Нумерация строк и столбцов с нуля! !
53 Алгоритмизация и программирование, язык Си, 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]; Вложенный цикл! !
54 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 54 «A»: Напишите программу, которая заполняет квадратную матрицу случайными числами в интервале [10,99], и находит максимальный и минимальный элементы в матрице и их индексы. Пример: Матрица А: Максимальный элемент A[2,2]=87 Минимальный элемент A[3,4]=11
55 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 55 «B»: Яркости пикселей рисунка закодированы числами от 0 до 255 в виде матрицы. Преобразовать рисунок в черно-белый по следующему алгоритму: 1)вычислить среднюю яркость пикселей по всему рисунку 2)все пиксели, яркость которых меньше средней, сделать черными (записать код 0), а остальные – белыми (код 255) Пример: Матрица А: Средняя яркость Результат:
56 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 56 «С»: Заполните матрицу, содержащую N строк и M столбцов, натуральными числами по спирали и змейкой, как на рисунках:
57 Алгоритмизация и программирование, язык Си, 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
58 Алгоритмизация и программирование, язык Си, 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; }
59 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 59 «A»: Напишите программу, которая заполняет квадратную матрицу случайными числами в интервале [10,99], а затем записывает нули во все элементы выше главной диагонали. Алгоритм не должен изменяться при изменении размеров матрицы. Пример: Матрица А: Результат:
60 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 60 «B»: Пиксели рисунка закодированы числами (обозначающими цвет) в виде матрицы, содержащей N строк и M столбцов. Выполните отражение рисунка сверху вниз: «С»: Пиксели рисунка закодированы числами (обозначающими цвет) в виде матрицы, содержащей N строк и M столбцов. Выполните поворот рисунка вправо на 90 градусов:
61 К.Ю. Поляков, Е.А. Ерёмин, Программирование на языке Си § 68. Работа с файлами 61
62 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Как работать с файлами? 62 файлы текстовые двоичные «plain text»: текст, разбитый на строки; из специальных символов только символы перехода на новую строку любые символы рисунки, звуки, видео, …
63 Алгоритмизация и программирование, язык Си, 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" – добавление
64 Алгоритмизация и программирование, язык Си, 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 ! ! Когда такое может быть? ?
65 Алгоритмизация и программирование, язык Си, 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, конец файла
66 Алгоритмизация и программирование, язык Си, 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 );
67 Алгоритмизация и программирование, язык Си, 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 возвращает количество прочитанных данных! ! при неудачном чтении выход из цикла
68 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 68 «A»: Напишите программу, которая находит среднее арифметическое всех чисел, записанных в файле в столбик, и выводит результат в другой файл. «B»: Напишите программу, которая находит минимальное и максимальное среди чётных положительных чисел, записанных в файле, и выводит результат в другой файл. Учтите, что таких чисел может вообще не быть. «C»: В файле в столбик записаны целые числа, сколько их – неизвестно. Напишите программу, которая определяет длину самой длинной цепочки идущих подряд одинаковых чисел и выводит результат в другой файл.
69 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Обработка массивов 69 Задача. В файле записано не более 100 целых чисел. Вывести в другой текстовый файл те же числа, отсортированные в порядке возрастания. В чем отличие от предыдущей задачи? ? const int MAX = 100; int A[MAX]; const int MAX = 100; int A[MAX]; Для сортировки нужно удерживать все элементы в памяти одновременно. !
70 Алгоритмизация и программирование, язык Си, 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 ++; } Зачем? ?
71 Алгоритмизация и программирование, язык Си, 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
72 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 72 «A»: В файле записано не более 100 чисел. Отсортировать их по возрастанию последней цифры и записать в другой файл. «B»: В файле записано не более 100 чисел. Отсортировать их по возрастанию суммы цифр и записать в другой файл. Используйте функцию, которая вычисляет сумму цифр числа. «C»: В двух файлах записаны отсортированные по возрастанию массивы неизвестной длины. Объединить их и записать результат в третий файл. Полученный массив также должен быть отсортирован по возрастанию.
73 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Обработка строк 73 Задача. В файле записано данные о собаках: в каждой строчке кличка собаки, ее возраст и порода: Мухтар 4 немецкая овчарка Вывести в другой файл сведения о собаках, которым меньше 5 лет. пока не конец файла(Fin) // прочитать строку из файла Fin // разобрать строку – выделить возраст если возраст < 5 то // записать строку в файл Fout пока не конец файла(Fin) // прочитать строку из файла Fin // разобрать строку – выделить возраст если возраст < 5 то // записать строку в файл Fout
74 Алгоритмизация и программирование, язык Си, 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 ! ! Чтение всех строк:
75 Алгоритмизация и программирование, язык Си, 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 не влияет!
76 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 76 «A»: В файле записаны данные о результатах сдачи экзамена. Каждая строка содержит фамилию, имя и количество баллов, разделенные пробелами: Вывести в другой файл фамилии и имена тех учеников, которые получили больше 80 баллов. «B»: В предыдущей задаче добавить к полученному списку нумерацию, сократить имя до одной буквы и поставить перед фамилией: П. Иванов И. Петров...
77 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Задачи 77 «C»: В файле записаны данные о результатах сдачи экзамена. Каждая строка содержит фамилию, имя и количество баллов, разделенные пробелами: Вывести в другой файл данные учеников, которые получили больше 80 баллов. Список должен быть отсортирован по убыванию балла. Формат выходных данных: П. Иванов 98 И. Петров 96...
78 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Конец фильма ПОЛЯКОВ Константин Юрьевич д.т.н., учитель информатики ГБОУ СОШ 163, г. Санкт-Петербург ЕРЕМИН Евгений Александрович к.ф.-м.н., доцент кафедры мультимедийной дидактики и ИТО ПГГПУ, г. Пермь
79 Алгоритмизация и программирование, язык Си, 10 класс К.Ю. Поляков, Е.А. Ерёмин, Источники иллюстраций иллюстрации художников издательства «Бином» 3. авторские материалы
Еще похожие презентации в нашем архиве:
© 2024 MyShared Inc.
All rights reserved.