Скачать презентацию Программирование на языке Си Массивы в процедурах и Скачать презентацию Программирование на языке Си Массивы в процедурах и

Основы_языка_СИ_строки.ppt

  • Количество слайдов: 34

Программирование на языке Си Массивы в процедурах и функциях Программирование на языке Си Массивы в процедурах и функциях

2 Массивы в процедурах Задача: составить процедуру, которая переставляет элементы массива в обратном порядке. 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 Задания Написать процедуру, которая сортирует массив по возрастанию, и показать пример ее использования. 3 Задания Написать процедуру, которая сортирует массив по возрастанию, и показать пример ее использования.

Покажите применение данной процедуры для следующей задачи: Имеются результаты забега на 100 м массив Покажите применение данной процедуры для следующей задачи: Имеются результаты забега на 100 м массив из 20 случайных чисел в диапазоне от 3 до 18, вывести результаты в порядке возрастания.

5 Массивы в функциях Задача: составить функцию, которая находит сумму элементов массива. результат – 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 Задания Создайте функцию, которая находит сумму элементов больше среднего. 6 Задания Создайте функцию, которая находит сумму элементов больше среднего.

Программирование на языке Си Символьные строки Программирование на языке Си Символьные строки

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

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

10 Ввод и вывод символьных строк Задача: ввести слово с клавиатуры и заменить все 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 ( 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 ( 12 Вывод символьных строк Универсальный способ: printf ( "Результат: %s", q ); • можно выводить сразу и другую информацию: надписи, значения переменных, … Только для одной строки: puts ( q ); printf ( "%sn", q ); • вывод только одной строки • после вывода – переход на новую строку

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

14 Сравнение строк strcmp (string comparison): char q 1[80], q 2[80]; int n; gets 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 Пример решения задачи Задача: ввести строку и определить, сколько в ней слов. Программа 15 Пример решения задачи Задача: ввести строку и определить, сколько в ней слов. Программа должна работать только при вводе правильного пароля. Идея решения: • проверка пароля – через strcmp • количество слов = количеству первых букв слова • первая буква: пробел и за ним «не пробел» В а с я п о ш е л г у л я т ь ¤ ¤ ¤ • исключение: предложение начинается со слова (а не с пробела)

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

17 Основная часть программы #include <stdio. h> #include <string. h> main() { char q[80]; 17 Основная часть программы #include #include 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 ); }

18 Задания Ввести предложение и определить, сколько слов заканчиваются на букву 'а'. Пример: Введите 18 Задания Ввести предложение и определить, сколько слов заканчиваются на букву 'а'. Пример: Введите предложение: Мама мыла раму Декан пропил бутан Найдено слов: 2 Нет таких слов

19 Копирование строк strcpy (string copy) char q 1[10] =

20 Копирование строк копирование в середину строки char q 1[10] = 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] = 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] = 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] = 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 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[] 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 Файлы Файл – это область на диске, имеющая имя. Файлы Текстовые Двоичные только 27 Файлы Файл – это область на диске, имеющая имя. Файлы Текстовые Двоичные только текст без оформления, могут содержать любые не содержат управляющих символы кодовой таблицы символов (с кодами < 32), *. doc, *. exe, кроме перевода строки ACSII (1 байт на символ) UNICODE (2 байта на символ) *. txt, *. log, *. html *. bmp, *. jpg, *. wav, *. mp 3, *. avi, *. mpg Папки (каталоги)

28 Принцип сэндвича Переменная типа «указатель на файл» : FILE I этап. открыть файл 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, обращение 29 Работа с файлами Особенности: • имя файла упоминается только в команде fopen, обращение к файлу идет через указатель f; • файл, который открывается на чтение, должен существовать • если файл, который открывается на запись, существует, старое содержимое уничтожается • данные (этим способом) записываются в файл в текстовом виде • когда программа заканчивает работу, все файлы закрываются автоматически • после закрытия файла переменную f можно использовать еще раз для работы с другим файлом

30 Последовательный доступ • при открытии файла курсор устанавливается в начало конец файла (end 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 возвращает 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 записаны числа (в столбик), сколько их – 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 возвращает количество удачно прочитанных чисел; 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 = 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. запись результата