Мета:
Здобути навики використання середовища розробки мови C++, познайомитися з порівнянням символів та рядків, здобути навички написання програм.
Короткі теоретичні відомості до роботи.
Дещо відособлено при обробці рядків стоїть порівняння рядків та символів. У функції-підпрограмі tarabar порівнювалися символи по принципу ідентичності (дорівнює чи не дорівнює). Розглянемо інші можливості.
Маніпуляції з рядками та символами всередині комп’ютера здійснюється за їх кодами, тому технічно порівнюються не самі символи, а їх коди.
Коди символів букв упорядковані за алфавітом, що завжди вірно для кирилиці, так як для неї виведені стандарти (ASCII та EBCDIC). До кирилиці це, до жалю, не відноситься і у кожному випадку впорядкованість кодів можна перевірити. Виявлення колів здійснюється прямим перетворенням типів (int)char.
У наступній програмі виводяться коди латиниці та кирилиці (з використанням масиву alphabet із tarabar. Для латиниці комп’ютер використовує стандарт ASCII. Коди кирилиці різні для DOS і Win. В обох випадках коди кирилиці – від’ємні числа, упорядковані, крім букви Ёё, в алфавітному порядку, чим і будемо користуватися у подальшому. При русифікації під Win на екрані не виводиться рядкова буква я.
|
|
//файл PART3\3_12.ccp
// порівняння рядків та символів
#include<string.h> //функції обробки рядків
#include “c:\CPP\SUBPROG\\roll.h”
#include “c:\CPP\SUBPROG\\roll_txt.h”
typedef char STRING;
#include <iomanip.h> //маніпулятори
main () { clrscr();
cout<<”\n КОДИ ЛІТЕРАЛЬНИХ КОНСТАНТ “;
/* всього символів: 0-126, латиниця: 0-51,
знаки: 52-62, кирилиця: 63-126 */
const STRING alphabet [] =
“AaBbCcDdTtFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz!?.,
*/+-:\nАаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсЕеУуФфХхЦцЧч
ШшЩщъЫыьЭэЮюЯя”;
cout << ’\n ЛАТИНИЦЯ”<<end1;
for (i=0; i<=51; i++) {k=(int) alphabet [i];
cout<<” “<<alphabet [i]<<setw(5)<<k;
if ((i+1)%8 = 0) cout<< end1; }; cout<<end1;
pause(9);
cout << ’\n КИРИЛИЦЯ”<<end1;
for (i=63; i<=126; i++) {k=(int) alphabet [i];
{ cout<<” “<<alphabet [i]<<setw(5)<<(int) alphabet [i];
if ((i+2)%8 = 0) cout<< end1; }; pause(1);
cout << ’\nпорівняння символьних змінних”<<end1;
STRING t0[]=”idkln”; cout<<”масив to: ”<< t0;
STRING t1[]=”dkln”; cout<<”\nмасив t1: ”<< t1;
i=0; while (t0[i]!= ‘\0’)
{ if (*(t0+i)==*(t1+i))
cout<<”\nt0[“<<i<<”]<t1[“<<i<<”]”;
if (*(t0+i)<*(t1+i))
cout<<”\nt0[“<<i<<”]<t1[“<<i<<”]”;
if (*(t0+i)>*(t1+i))
cout<<”\nt0[“<<i<<”]<t1[“<<i<<”]”;
cout<<” Коди: “<<(int)(*(t0+i))<<’ ‘
<<(int)(*(t1+i)); i++; };
STRING t2[]=”гджлу”; cout<<”масив t2: ”<< t2;
STRING t3[]=”джлу”; cout<<”\nмасив t3: ”<< t3;
i=0; while (t2[i]!= ‘\0’)
{ if (*(t2+i)==*(t3+i))
cout<<”\nt2[“<<i<<”]<t3[“<<i<<”]”;
if (*(t2+i)<*(t3+i))
cout<<”\nt2[“<<i<<”]<t3[“<<i<<”]”;
if (*(t2+i)>*(t3+i))
cout<<”\nt2[“<<i<<”]<t3[“<<i<<”]”;
cout<<” Коди: “<<(int)(*(t2+i))<<’ ‘
|
|
<<(int)(*(t3+i)); i++; };
cout << ’\nмасив t0: ”<< t0;
cout << ’\nмасив t3: ”<< t3;
i=0; while (t0[i]!= ‘\0’)
{ if (*(t0+i)==*(t3+i))
cout<<”\nt0[“<<i<<”]<t3[“<<i<<”]”;
if (*(t0+i)<*(t3+i))
cout<<”\nt0[“<<i<<”]<t1[“<<i<<”]”;
if (*(t0+i)>*(t3+i))
cout<<”\nt0[“<<i<<”]<t3[“<<i<<”]”;
cout<<” Коди: “<<(int)(*(t0+i))<<’ ‘
<<(int)(*(t3+i)); i++; };
pause(1);
cout<<”\n порівняння довжини рядків”<<end1;
I=strcmp(t0, t1); cout<<t0<<’ ‘<<t1<<’ ‘<<I<<end1;
cout<<t0<<’ ‘<<t2<<’ ‘<<t1<<’ ‘<<I<<end1;
cout<<” ib bi ”<< strcmp (“ib”, “bi”)<<end1;
cout<<” bi ib ”<< strcmp (“bi”, “ib”)<<end1;
cout<<” bi bi ”<< strcmp (“bi”, “bi”)<<end1;
cout<<” Ij ij ”<< strcmp (“Ij”, “ij”)<<end1;
cout<<” ij jI ”<< strcmp (“ij ”, “jI ”)<<end1;
cout<<” KK Ki ”<< strcmp (“KK”, “Ki”)<<end1;
cout<<” Kk ki ”<< strcmp (“Kk”, “ki ”)<<end1;
cout<<” чб бч ”<< strcmp (“чб”, “бч ”)<<end1;
cout<<” бч чб ”<< strcmp (“бч”, “чб ”)<<end1;
cout<<” чб чб ”<< strcmp (“чб ”, “чб”)<<end1;
cout<<” чб ib ”<< strcmp (“чб ”, “ib”)<<end1;
cout<<”\n ***** кінець задачі *****”; pause(0);
return 0; }
У службових програмах для перекодування кириличних символів використовується взаємна заміна одноімених кириличних символів для DOS і Win. Далі у програмі здійснюється порівняння різних літеральних символів з масивів t0, t1, t2, t3.
У заголовочний файл string.h включена функція strcmp з двома аргументами-рядками, чка виконує лексографічне порівняння рядків (коли коди упорядковані у відповідності з алфавітом) і повертає нуль, коли рядки рівні, позитивне число, коли перший рядок більше, чим другий, і від’ємне число, коли перший рядок менше, чим другий. У програмі приведено декілька прикладів порівняння рядків.