МІНІСТЕРСТВО ОСВІТИ І НАУКИ, МОЛОДІ ТА СПОРТУ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ «ЛЬВІВСЬКА ПОЛІТЕХНІКА»
Кафедра САПР
Звіт
до лабораторної роботи №5
на тему «МАСИВИ СИМВОЛІВ (РЯДКИ) В МОВІ ПРОГРАМУВАННЯ С»
з курсу «Проблемно-орієнтовані мови програмування»
ЛЬВІВ 2011
Мета роботи
Навчитися використовувати символьні масиви для розв’язання задач роботи зі стрічками.
Теоретичні відомості
На відміну від інших мов програмування у C не визначено спеціального типу для опрацювання рядків. Масив символів (чи рядок або стрічка) розглядається як масив елементів типу char, який закінчується символом '\0' (нуль-символ) що є ознакою кінця рядка. Такі рядки називають ASCII-рядками. Сталі типу рядок записують у лапках, наприклад, "Львівська політехніка", "студенти", “ “ - рядок, що містить один символ-пропуск. У сталих рядках нуль-символ дописується автоматично.
Під час оголошення символьного масиву необхідно до фактичної довжини рядка додати одиницю для нульового символу (але не у всіх компіляторах). Якщо масив символів оголошують й ініціалізують одночасно, то довжину можна не зазначати, компілятор визначить її. Оскільки рядки є масивами символів, то назва рядка є вказівником на його перший елемент (на перший символ).
У бібліотеці conio.h визначені стандартні функції введення-виведення рядків. Наприклад, getc ( ), getchar ( ) зчитують по одному символу рядка, введеного з клавіатури, putc ( ) та putchar ( ) виводять окремі символи рядка тощо. У бібліотеці stdio.h описані функції для введення gets ( ) та виведення puts ( ) усього рядка. Детальніше про ці та інші функції написано у довідниках.
Для опрацювання масивів символів у мові C є стандартні функції, які описані у модулі string.h. Розглянемо деякі з них:
strlen(<рядок>) - визначає фактичну кількість символів у рядку, застосовується у виразах;
strcat(r1, r2) - команда з'єднання рядків ґі, г2 в один рядок, результат присвоює змінній r1;
strncat(r1, r2, п) - до змінної г1 додає перших n символів рядка г2,
strcpy(r1, r2) - копіює символи з рядка г2 в рядок г1,
strncpy(r1, r2, n) - копіює перших n символів рядка г2 в рядок г1,
strchr(r1, <символ>) - визначає перше входження деякого символу у рядок г1 так: повертає рядок, який починається від першого входження заданого символу до кінця рядка М, застосовується у виразах;
strrchr(r1, <символ>) - визначає останнє входження заданого символу у рядок, застосовується у виразах;
strspn(r1, r2) - визначає номер першого символу, який входить у рядок г1, але не входить у рядок г2, застосовується у виразах;
strstr(r1, r2) - визначає в рядку г1 підрядок, що починається з першого входження рядка г2 у рядок ґі, застосовується у виразах;
strtok(r1, r2) - визначає частину рядка г1, яка закінчується перед першим однаковим символом рядків r1 та г2;
strnset(r1, <символ>, n) - вставляє n разів заданий символ перед рядком г1, застосовується у виразах;
strupr(r1) - перетворює усі малі літери рядка у великі;
strlwr(rl) - перетворює усі великі літери рядка у малі;
strrev(rl) - записує рядок у зворотному порядку.
Текстові функції застосовуються для розв'язування задач кодування даних з метою збереження секретності інформації. Існує наука - криптографія, де вивчаються і створюються різні алгоритми кодування інформації. Основні задачі криптографії - це шифрування тексту, передача його на відстань і дешифрування. Це використовується у банківських справах, у воєнних цілях, у діяльності різних фірм, під час пересилання інформації в локальних чи глобальних мережах тощо.
Давньоримський імператор Цезар кодував свої секретні вказівки так: кожна літера тексту замінювалась на четверту після неї літеру з алфавіту. Такий шифр називається в криптографії шифром зі сталим зміщенням (тут 4), або шифром з одним ключем.
Задача 4 (про шифр Цезаря). Скласти програму для кодування деякого тексту до 50 символів шифром Цезаря, замінивши кожну літеру на k-ту (наприклад, четверту) після неї літеру з алфавіту. Під алфавітом розуміти таблицю кодів ASCII.
Індивідуальне завдання
Ввести прізвище, ім'я та по батькові як одне текстове дане. Визначити довжину даного і кількість букв "а" у ньому. Розв'язати задачу відповідно до вашого варіанта двома способами:
а) використовуючи функції з бібліотеки string.h;
б) розглядаючи введений текст як масив символів.
6. Вивести ім'я та кількість букв у прізвищі.
Текст програми
а) #include <stdio.h>
#include <conio.h>
#include <string.h>
#define N 60
main ()
{
char str[N];
char n,s,f;
char* words[3];
int i,K=0,count=0,b;
printf("ENTER surname, name and fathername \n\n");
gets(str);
printf("\n\n Dovgyna vvedenoho ryadka: %d",strlen(str));
char* word=strtok(str," ");
while(word&&count<3)
{
words[count++]=word;
word=strtok(NULL," ");
}
for(b=0; b<3; b++)
{
for(i=0;i<strlen(words[b]);i++)
if(words[b][i]=='a') K++;
}
printf("\n\n Kil'kist bukv a v ryadku = %d", K);
printf("\n\n Kilk. bukv u prizvishchi= %d \n",strlen(words[0]));
printf("\nDruge slovo (name) \n\n");
printf("%s",words[1]);
getch ();
return 0;
}
б) #include <stdio.h>
#include <conio.h>
#define N 60
main ()
{
char str[N];
char n,s,f;
int i,K,a,b,q,v,p;
printf("ENTER surname, name and fathername \n\n");
for (i=0,K=0;str[i-1]!='.';i++,K++)
{
str[i]=getch();
printf("%c",str[i]);
}
K=K-1;
printf("\n\n Dovgyna vvedenoho ryadka: %d", K);
for(i=0,a=0;i<K;i++)
if((str[i]=='a') | (str[i]=='A'))
a++;
printf("\n\n Kil'kist bukv a v ryadku = %d", a);
b=0;
for(i=0;str[i-1]!=' ';i++)
b++;
b=b-1;
printf("\n\n Kilk. bukv u prizvishchi= %d \n",b);
for(i=0,q=0;str[i-1]!='.';i++)
{
if(str[i]==' ')
{
q=q+1;
if(q==1)
v=i;
if(q==2)
{
p=i;
break;
}
}
}
printf("\nDruge slovo (name) \n\n");
for(i=v+1;i<p;i++)
printf("%c",str[i]);
getch ();
return 0;
}
Результати обчислень
Висновок: Я навчився використовувати символьні масиви для розв’язання задач роботи зі стрічками.