Основы_языка_СИ_строки.ppt
- Количество слайдов: 34
Программирование на языке Си Массивы в процедурах и функциях
2 Массивы в процедурах Задача: составить процедуру, которая переставляет элементы массива в обратном порядке. параметрмассив размер массива void Reverse ( int A[] , int N ) { int i, c; for ( i = 0; i < N/2; i ++ ) { c = A[i]; A[i] = A[N-1 -i]; A[N-1 -i] = c; } }
3 Задания Написать процедуру, которая сортирует массив по возрастанию, и показать пример ее использования.
Покажите применение данной процедуры для следующей задачи: Имеются результаты забега на 100 м массив из 20 случайных чисел в диапазоне от 3 до 18, вывести результаты в порядке возрастания.
5 Массивы в функциях Задача: составить функцию, которая находит сумму элементов массива. результат – целое число параметрмассив размер массива int Sum ( int A[] int N ) int A[], { int i, sum = 0; for ( i = 0; i < N; i ++ ) sum += A[i]; return sum; }
6 Задания Создайте функцию, которая находит сумму элементов больше среднего.
Программирование на языке Си Символьные строки
8 Символьные строки char s[80]; s[2] признак окончания строки: символ с кодом 0 s[3] 79 0 П р и в е т ! ¤ ¤ … ¤ ¤ ¤ рабочая часть s[0] s[1] ! Символ ' ' имеет код 0 символ '0' имеет код 48 Символьная строка – это последовательность символов, которая заканчивается символом ' '.
9 Объявление символьных строк Объявить строку = выделить ей место в памяти и присвоить имя. выделяется 80 байт, в char s[80]; строке – «мусор» (если она глобальная, то нули ' ‘) char s 1[80] = "abc"; char qqq[] = "Вася"; ! выделяется 80 байт, занято 4 байта (с учетом ' ') выделяется 5 байт (с учетом ' ') • При выделении памяти надо учитывать место для символа ' '. • В строку нельзя записывать больше символов, чем выделено памяти.
10 Ввод и вывод символьных строк Задача: ввести слово с клавиатуры и заменить все буквы «а» на буквы «б» . %s – формат для ввода и main() вывода символьных строк { (выводится только часть до ' ' char q[80]; начали с int q[0] i; не надо ставить &: printf("Введите строкуn"); до &q[0] пока не дошли q scanf( "%s" q); "%s", конца строки i = 0; while ( q[i] != ' ' ) { if ( q[i] == 'а' ) q[i] = 'б'; переход к i ++; следующему } символу printf ( "Результат: %s ", q ); }
11 Ввод символьных строк Ввод одного слова: char q[80]; printf ("Введите текст: n"); scanf ( "%s", q ); printf ("Введено: n%s", q ); Введите текст: Вася пошел гулять Введено: Вася Ввод строки с пробелами: char q[80]; printf("Введите текст: n"); gets ( q ); printf("Введено: n%s", q ); Введите текст: Вася пошел гулять Введено: Вася пошел гулять
12 Вывод символьных строк Универсальный способ: printf ( "Результат: %s", q ); • можно выводить сразу и другую информацию: надписи, значения переменных, … Только для одной строки: puts ( q ); printf ( "%sn", q ); • вывод только одной строки • после вывода – переход на новую строку
13 Функции для работы со строками Подключение библиотеки: #include
14 Сравнение строк strcmp (string comparison): char q 1[80], q 2[80]; int n; gets ( q 1 ); gets ( q 2 ); n = strcmp ( q 1, q 2 ); ! Функция вычисляет разность между кодами первых двух отличающихся символов! q 1 q 2 n "AA" 0 "AB" "AA" 1 "AA" "AB" – 1 "AA" "A" 65
15 Пример решения задачи Задача: ввести строку и определить, сколько в ней слов. Программа должна работать только при вводе правильного пароля. Идея решения: • проверка пароля – через strcmp • количество слов = количеству первых букв слова • первая буква: пробел и за ним «не пробел» В а с я п о ш е л г у л я т ь ¤ ¤ ¤ • исключение: предложение начинается со слова (а не с пробела)
16 Проверка пароля #include
17 Основная часть программы #include
18 Задания Ввести предложение и определить, сколько слов заканчиваются на букву 'а'. Пример: Введите предложение: Мама мыла раму Декан пропил бутан Найдено слов: 2 Нет таких слов
19 Копирование строк strcpy (string copy) char q 1[10] = "qwerty", q 2[10] = "01234"; strcpy ( q 1, q 2 ); куда ! откуда Старое значение q 1 стирается! копирование «хвоста» строки char q 1[10] = "qwerty", q 2[10] = "01234"; strcpy ( q 1, q 2+2 ); q 2 = &q 2[0] q 1 q w e t y ¤ ¤ ¤ 2 3 4 r q 2+2 = &q 2[2] q 2 0 1 2 3 4 ¤ ¤
20 Копирование строк копирование в середину строки char q 1[10] = "qwerty", q 2[10] = "01234"; strcpy ( q 1+2, q 2 ); q 1+2 = &q 1[2] q 1 q w 0 1 2 3 ¤ ¤ e r t y 4 ¤ q 2 0 1 2 3 4 ¤ ¤ char q 1[10] = "qwerty", q 2[10] = "01234"; strcpy ( q 1+2, q 2+3 ); q 1+2 = &q 1[2] q 1 q w 3 4 y ¤ ¤ ¤ e r t q 2+3 = &q 2[3] q 2 0 1 2 3 4 ¤ ¤
21 Копирование строк strncpy – копирование нескольких символов char q 1[10] = "qwerty", q 2[10] = "01234"; strncpy ( q 1+2, q 2, 2 ); q 1+2 = &q 1[2] q 1 q w 0 1 t y ¤ ¤ ¤ e r ! q 2 0 1 2 3 4 ¤ ¤ Функция strncpy не добавляет символ ' ' в конце строки!
22 Копирование строк копирование строки-константы char q 1[10] = "qwerty"; strcpy ( q 1+1, "ABCD"); q 1 q w B C D ¤ ¤ ¤ A e r t y A B C D char q 1[10] = "qwerty"; strcpy ( "ABCD", q 1+2 ); ! Первым параметром НЕ может быть константа!
23 Копирование строк копирование внутри одной строки char q[10] = "012345"; strcpy ( q, q+2 ); q 2 3 4 5 4 0 1 2 3 5 ¤ ¤ ¤ char q[10] = "012345"; strcpy ( q+2, q ); q 0 1 0 1 1 ¤ ¤ 2 3 4 5 0 ¤ Зацикливание и зависание компьютера!
24 Объединение строк strcat (string concatenation) = копирование второй строки в конец первой char q 1[10] = "qwe", q 2[10] = "0123"; strcat ( q 1, q 2 ); q 1 q w e 1 2 3 ¤ ¤ ¤ ¤ q 2 0 1 2 3 ¤ ¤ ¤ char q 1[10] = "qwe", q 2[10] = "0123"; strcat ( q 1, q 2+2 ); q 1 q w e 3 ¤ ¤ 2 ¤ ¤ q 2 0 1 2 3 ¤ ¤ ¤
25 Проблемы при копировании строк • не хватает места для строки-результата char q 1[] = "qwer", q 2[10] = "01234"; strcpy ( q 1+2, q 2 ); q 1 q w 0 1 3 что-то другое e r 2 q 2 0 1 2 3 ¤ ¤ ¤ • зацикливание при копировании в ту же строку «слева направо» char q[10] = "01234"; strcpy ( q+2, q ); ! Транслятор не сообщает об этих ошибках!
Программирование на языке Си Файлы
27 Файлы Файл – это область на диске, имеющая имя. Файлы Текстовые Двоичные только текст без оформления, могут содержать любые не содержат управляющих символы кодовой таблицы символов (с кодами < 32), *. doc, *. exe, кроме перевода строки ACSII (1 байт на символ) UNICODE (2 байта на символ) *. txt, *. log, *. html *. bmp, *. jpg, *. wav, *. mp 3, *. avi, *. mpg Папки (каталоги)
28 Принцип сэндвича Переменная типа «указатель на файл» : FILE I этап. открыть файл (сделать его *f; активным, приготовить к работе) для чтения ("r", англ. read) f = fopen("qq. dat", "r"); для записи ("w", англ. write) f = fopen("qq. dat", "w"); для добавления ("a", англ. append) f = fopen("qq. dat", "a"); II этап: работа с файлом fscanf ( f, "%d", &n ); // ввести значение n fprintf( f, "n=%d", n ); // записать значение n III этап: закрыть (освободить) файл fclose ( f );
29 Работа с файлами Особенности: • имя файла упоминается только в команде fopen, обращение к файлу идет через указатель f; • файл, который открывается на чтение, должен существовать • если файл, который открывается на запись, существует, старое содержимое уничтожается • данные (этим способом) записываются в файл в текстовом виде • когда программа заканчивает работу, все файлы закрываются автоматически • после закрытия файла переменную f можно использовать еще раз для работы с другим файлом
30 Последовательный доступ • при открытии файла курсор устанавливается в начало конец файла (end of file, EOF) f = fopen("qq. dat", "r"); 12 5 45 67 56● • чтение выполняется с той позиции, где стоит курсор • после чтения курсор сдвигается на первый непрочитанный символ fscanf ( f, "%d", &x ); 12 5 45 67 56●
31 Ошибки при открытии файла ! Если файл открыть не удалось, функция fopen возвращает NULL (нулевое значение)! FILE *f; f = fopen("qq. dat", "r"); if ( f == NULL ) { puts("Файл на найден. "); return; } • неверное имя файла • нет файла • файл заблокирован другой программой • неверное имя файла • файл «только для чтения» • файл заблокирован другой программой FILE *f; f = fopen("qq. dat", "w"); if ( f == NULL ) { puts("Не удалось открыть файл. "); return; }
32 Пример Задача: в файле input. txt записаны числа (в столбик), сколько их – неизвестно. Записать в файл output. txt их сумму. Алгоритм: 1. Открыть файл input. txt для чтения. 2. S = 0; 3. Прочитать очередное число в переменную x. 4. Если не удалось, перейти к шагу 7. 5. S += x; цикл с условием 6. Перейти к шагу 3. «пока есть данные» 7. Закрыть файл input. txt. 8. Открыть файл output. txt для записи. 9. Записать в файл значение S. 10. Закрыть файл output. txt.
33 Как определить, что числа кончились? ! Функция fscanf возвращает количество удачно прочитанных чисел; 0, если была ошибка при чтении; – 1, если достигли конца файла. FILE *f; int n, x; • дошли до конца файла f = fopen("input. txt", "r"); • встретили «не число» . . . n = fscanf ( f, "%d", &x ); if ( n ! = 1 ) puts ( "Не удалось прочитать число" );
34 Программа main() { FILE *f; int n, x, S = 0; f = fopen ( "input. txt", "r" ); if ( f == NULL ) { printf("Файл не найден. "); return; } while ( 1 ) { n = fscanf ( f, "%d", &x ); if ( n != 1 ) break; S += x; } fclose ( f ); f = fopen ( "output. txt", "w" ); fprintf ( f, "S = %d", S ); fclose ( f ); } ошибка при открытии файла цикл чтения данных: выход при n 1. запись результата