Функції роботи з рядками та текстовими файлами. (Лекція 13)

Содержание

Слайд 2

Тип сhar та ASCII код Функції роботи з символами (ctype.h) Робота

Тип сhar та ASCII код
Функції роботи з символами (ctype.h)
Робота

з рядком через покажчики
Текстові файли
Розбиття на слова

План

Слайд 3

Представлення символів і рядків в Сі Символ тексту – це 1

Представлення символів і рядків в Сі

Символ тексту – це 1 байтний

тип даних, що розуміється як ціле та символ. Інформаційна ємність 28-1 = 255
ASCII (стандартний код для інформаційного обміну) система кодів, у якій числа від 0 до 127 включно поставлені у відповідність літерам, цифрам і символам пунктуації. ASCII — це семи-бітний код.
char - ціле зі знаком в діапазоні -127 ... + 127
unsigned char - ціле від 0-255
Для роботи з кирилицею використовуйте unsigned char
for (unsigned char c = 0; c < 255; c++)
printf("%c %d\n",c,c);
Слайд 4

ASCII – таблиця (Морозов с.322)

ASCII – таблиця (Морозов с.322)

Слайд 5

Приклади обробки символів з урахуванням їх кодування. Отримати символ десяткової цифри

Приклади обробки символів з урахуванням їх кодування.

Отримати символ десяткової цифри з

значення цілої змінної, що лежить в діапазоні 0..9:
int n; char c; c = n + '0';
Отримати значення цілої змінної з символу десяткової цифри:
if (c >= '0' && c <= '9') n = c - '0';
Перетворити маленьку латинську букву у велику:
if (c> = 'a' && c <= 'z') c = c - 'a' + 'A';
Слайд 6

Символьні рядки. Строкова константа. char word[10]; word[0] = 'A'; word[1] =

Символьні рядки. Строкова константа.

    char word[10];
    word[0] = 'A';
    word[1] = 'B';
    word[2] =

'C';
    word[3] = '\0';
    //word[3] = 0; еквівалентно
    printf("%s", word);    

Рядок у сі - це масив типу char, останній елемент якого зберігає термінальний символ '\0'. Числове значення цього символу 0, тому можна говорити, що масив закінчується нулем.

Для виведення використовувався ключ %s. При цьому рядок виводиться до першого термінального символу, бо функція printf не знає розмір масиву word. 

Слайд 7

Строкова константа. Строкова константа - послідовність символів, укладена в подвійні лапки.

Строкова константа.

     

Строкова константа - послідовність символів, укладена в подвійні лапки.

Строкова константа автоматично доповнюється символом '\0'.

char word[] = "ABC"; //строкова константа
char text[] = {'H','E','L','L','O','\0' };
printf("%s %d %d\n", word, strlen(word),sizeof(word));
printf("%s %d %d\n", text, strlen(text),sizeof(text));

Результат роботи програми:

Слайд 8

Фунції вводу виводу символів/рядків Функції вводу виводу одного символу: char C;

Фунції вводу виводу символів/рядків

Функції вводу виводу одного символу:
char C;

Функції вводу виводу

рядків символів:
char s1[25], s2[100];//виділення пам’ятті
scanf("%24s",s1); //scanf_s("%s",s1,24);
printf("%s", s1);
gets(s2); //gets_s(s2);
puts(s2);
Слайд 9

Фунції вводу виводу символів/рядків Функції вводу виводу одного символу: Функції вводу

Фунції вводу виводу символів/рядків

Функції вводу виводу одного символу:

Функції вводу рядків символів:

Функції

виводу рядків символів:
Слайд 10

#include Фунції роботи з символами *Ці функції працюють лише для англійських літер

#include

Фунції роботи з символами

*Ці функції працюють лише для англійських літер

Слайд 11

if (*p>='A' && *p if (isupper(*p)) { k++; *p = tolower(*p);}

if (*p>='A' && *p<='Z') { k++; *p = *p -

'A' + 'a';}

if (isupper(*p)) { k++; *p = tolower(*p);}

Завдання. Дано рядок, знайти кількість великих літер
та перетворити їх у маленькі літери

Без функцій

З функціями

Фунції роботи з символами: приклади

char s[100], *p;
int k=0;
gets(s);
p = s; //покажчик на масив
for(; *p; p++) //прохід по рядку

puts(s);
printf ("k=%d",k);

Слайд 12

Деякі фунції роботи з рядками #include

Деякі фунції роботи з рядками

#include

Слайд 13

char s1[80]="Hello ", s2[]="word!!!"; (s1,s2); printf("s1:%s len=%d\n",s1, strlen(s1)); strcpy(s1,s2); printf("s1:%s len=%d\n",s1,

char s1[80]="Hello ", s2[]="word!!!";
(s1,s2);
printf("s1:%s len=%d\n",s1, strlen(s1));
strcpy(s1,s2);
printf("s1:%s len=%d\n",s1, strlen(s1));

Фунції роботи з рядками:

приклади

Результат:

Функції об’єднання рядків

strcat – об’єднує s1 та s2 та результат
записує у s1
strcpy – копіює (перезаписує) із s1 у і2

Слайд 14

char str[100], month[]="September"; int day =12; sprintf(str, "Month %s day %d",

char str[100], month[]="September";
int day =12;
sprintf(str, "Month %s day %d", month, day);
printf("%s",str);

Фунції

роботи з рядками: приклади

Результат:

Функція формування форматованого рядка

Слайд 15

Фунції роботи з рядками: приклади char p[]="parol", buf[20]; printf("VVedit parol: ");

Фунції роботи з рядками: приклади

char p[]="parol", buf[20];
printf("VVedit parol: ");
scanf_s("%s",buf,19);
if (strcmp(p,buf)==0) printf("Virno\n");
else

printf("Ne virno\n");

Результат:

Функція порівняння рядків

Слайд 16

Спосіб обробки рядків не залежить від того якими масивами вони представлені

Спосіб обробки рядків не залежить від того якими масивами вони представлені

статичними чи динамічними: всі функції роботи з рядками для динамічних рядків працюють аналогічно.

char h1[]=" Yes ",h2[]=" No ",h3[]= " Or “, *p;
int n1=strlen(h1);//вимірюємо розмір
int n2=strlen(h2); //вимірюємо розмір
int n3=strlen(h3); //вимірюємо розмір
p = (char *)malloc (n1+n2+n3+1); //виділяємо пам’ять, +1 на ‘\0’
strcpy(p, h1); //копієємо в p h1
strcat(p, h2); //об’єднуємо p з h2, результат у p
strcat(p, h3); //об’єднуємо p з h2, результат у p
printf("%s len=%d\n",p, strlen(p));
free(p); //очищуємо пам’ять

Робота з динамічними рядками

Результат:

Слайд 17

В мові Сі та Сі++ файл розглядається як потік (stream), що

В мові Сі та Сі++ файл розглядається як потік (stream), що

представляє собою послідовність байтів, що записуються чи зчитуються.
За замовчуванням, файли, з якими працюють стандартні функції введення-виведення є послідовними текстовими.
Робота з файлами проходить в сеансовому режимі.

Файли - послідовні потоки символів

Слайд 18

Функції відкриття та закриття файлу Інформація про потік заноситься в структуру

Функції відкриття та закриття файлу

Інформація про потік заноситься в структуру FILE,

яка визначена у файлі stdio.h. Файл відкривається за допомогою функції fopen, яка повертає покажчик на структуру типу FILE*.
Функція відкриття файлу встановлює зв'язок між відкритим файлом і елементом fd у програмі. Функція закриття файлу перериває цей зв'язок
Слайд 19

Обмеження в роботі з текстовим файлом Файл можна відкрити для використання

Обмеження в роботі з текстовим файлом

Файл можна відкрити для використання тільки

одного виду з перерахованих операцій:
Читання тексту з існуючого файлу;
Запис тексту у створений файл;
Додавання тексту в існуючий файл.
Тому при зміні вмісту текстового файлу його можна або повністю переписати з вхідного в вихідний, або читати в пам'ять повністю і редагувати його там.
Слайд 20

Значення аргументу mode функції fopen

Значення аргументу mode функції fopen

Слайд 21

Функції вводу/виводу у текстовий файл

Функції вводу/виводу у текстовий файл

Слайд 22

Функції вводу/виводу у текстовий файл FILE *f; char c; int i=0;

Функції вводу/виводу у текстовий файл

FILE *f;
  char c;
  int i=0;
  char

s[100];
  FILE *fd1=fopen("test.txt","r"); //Читання файлу
  FILE *fd2=fopen("res.txt","w"); // Створення файлу для запису
            if (fd1==NULL || fd2==NULL) return -1;
            while ((c=getc(fd1)) != EOF)//посимвольне читання з файлу
                { printf("%c",c);
                if ((isalpha(c)) && isupper(c)) s[i++]=c; }// Запис великих латинських літер у масив
            for(i--;i>=0;i--) putc(tolower(s[i]),fd2); // Запис маленьких латинських літер у файл у зворотньому порядку

В наступному прикладі показується посимвольне копіювання вхідного файлу у вихідний.

Слайд 23

Приклад роботи з символьними рядками через покажчики: прохід по рядку та

Приклад роботи з символьними рядками через покажчики:
прохід по рядку та підрахунок

кількості символів

int main()
{
int num=0;
char line[100]; //статичне виділення
пам’яті під масив із 100 символів
gets(line); //ввід символів з клавіатури
char *s; //змінна покажчик на char
s=line; //s вказує на початок line
for( ; *s; s++ ) //s проходить по line
num++; //num рахує к-сть символіів
printf("Kilkist simvoliv=%d", num);
return 0;
}

H

e

l

l

o

\0

line[]:

num =

1

2

3

4

5

На останньому кроці *s=‘\0’ , що є спеціальним символом кінця рядка.

Тому результат перевірки умови в for є true, що забезпечує вихід із циклу

Цикл for виконується доти, доки *s=‘\0’ , що є спеціальним символом кінця рядка.

Результат роботи програми:

Слайд 24

Тема: Приклади алгоритмів обробки рядків Література: Романов Е. Л. Практикум по

Тема: Приклади алгоритмів обробки рядків

Література:
Романов Е. Л. Практикум по програмированию.
Розділ

4.4 Символи. Текст. Рядки С. 106-120
Вінник В. Ю. Основи програмування мовою Сі
Розділ 8. Обробка текстових рядків. С. 104-118.
Всі фрагменти коду з цих розділів мають бути запушені у середовищі програмування та виконані!!!
Зареєструватися у Moodle : http://learn.ztu.edu.ua/
Слайд 25

Тема: Приклади алгоритмів обробки рядків Приклад обробки математичного виразу Завдання. Дано

Тема: Приклади алгоритмів обробки рядків

Приклад обробки математичного виразу

Завдання. Дано рядок,

що зображає арифметичний вираз виду «<цифра> ± <цифра> ± ... ± <​​цифра>», де на місці знака операції «±» знаходиться символ «+» або «-» (наприклад, «4 + 7-2- 8 »). Вивести значення даного виразу (ціле число).
Слайд 26

Тема: Приклади алгоритмів обробки рядків Функції розбиття на слова та Їх

Тема: Приклади алгоритмів обробки рядків

Функції розбиття на слова та Їх використання


Розбиття речення на слова. Потрібно врахувати, що програма не вміє просто «бачити слово», для неї необхідно формальна умова його виявлення. Таким може бути або кінець слова (не буква), або його початок (буква).

Функція повертає покажчик на початок слова: char * strwordb (char* s)
Отримує показчик на символу у рядку
Перевіряє чи є він літерою (isalnum) , якшо так повертає показчик на нього
Якщо ні шукає далі
Якщо досягнуто кінець рядка повертається показчик вна нього
Функція повертає покажчик на кінець слова: char * strworde (char* s)
Отримує показчик на символу у рядку
Перевіряє чи є він (!isalnum) не літерою , якшо так повертає показчик на нього
Якщо ні шукає далі
Якщо досягнуто кінець рядка повертається показчик вна нього
Для використання цих функцій створєємо цикл, що ходить по рядку з виділенням слів: від початку слова шукаємо кінець, від кінця слова шукаємо початок наступного.
Ці функції можна використати для збереження слів у вільний масив (розділові знаки не збережуться)

Слайд 27

char * strwordb (char* s) { for( ; *s ; s++

char * strwordb (char* s)
{ for( ; *s ; s++ )

//прохід по рядку
if (isalnum(*s)) //якщо символ літера
return s; //то повертаємо посилання
return s;}

Функція повертає покажчик на початок слова

char *strworde (char* s)
{ for( ; *s ; s++ ) //прохід по рядку
if (!isalnum(*s)) //якщо символ пробіл чи знак
return s; //то повертаємо посилання
return s;}

Функція повертає покажчик на кінець слова

isalnum(int c) перевірка, чи є символ літерою або цифрою;
1 – повертає якщо символ є літерою або цифрою; 0 – у протилежному випадку

int MaxWord (char *s)
{ int max=0;
char *b = strwordb(s), char *e = NULL;
for ( ;*b ;b = strwordb(e) ) {
e=strworde(b);
if( (e - b) > max) max = (e - b);}
return max;}

Функція повертає максимальну довжину слова

int main()
{
char line[] = "cow goat";
printf("Najdovshe slovo = %d\n", MaxWord (line));
return 0;
}

b – e =

max =

3

3

4

4

Тема: Приклади алгоритмів обробки рядків

Знаходження найдовшого слова

Слайд 28

Контекст: Рівномірний і нерівномірний рух в циклі Приклад: описати процедуру, що

Контекст: Рівномірний і нерівномірний рух в циклі

Приклад: описати процедуру, що інвертує

рядок

void swap(char c[]){
int i,j;
// Цикл пошука кінца рядка для i
for (i=0; c[i] !='\0'; i++);
// Цикл попарного обміну
for (j=0,i--; i>j; i--,j++)
{ char s; s=c[i]; c[i]=c[j]; c[j]=s; }}

Те ж саме, але з показчиками

void swap1(char *c){
char *b;
b = c; //показчик на початок рядка
// Цикл переміщення показчика в кінець рядка
for (; *c; c++);
// Цикл попарного обміну
for (c--; c > b ; c--,b++)
{ char s; s=*c; *c=*b; *b=s; }}

Показчики виконують роль індексів

Тема: Приклади алгоритмів обробки рядків