Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка С#.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
1.13 Mб
Скачать

Оператор break

Цей оператор організовує вихід з циклу і передає керування на оператор, що йде за циклом. Якщо оператор break міститься у вкладеному циклі, то він організує вихід тільки з вкладеного циклу, в якому він міститься.

Множинний вибір: функція switch ()

Якщо у програмі потрібно здійснити вибір одного з декількох варіантів, то зручно використовувати функцію switch (). Загальна форма запису:

switch(цілочисловий вираз)

{

case константа 1: оператор 1;

case константа 2: оператор 2;

default: оператор 3;

}

Принцип дії функції switch (): спочатку виконується перевірка цілочислового виразу. Далі розглядається список міток, поки не буде знайдене значення, що збігається зі значенням виразу і передає керування на оператор, який стоїть за даною міткою. Якщо мітка не знайдена, управління передається на рядок з міткою default, якщо вона є. Якщо ні, то керування передається на рядок, що іде за перемикачем switch ().

Для забезпечення одного вибору разом з функцією switch () необхідно використовувати оператор break. Проілюструємо їхнє спільне використання на наступному прикладі.

Приклад: визначити кількість літер a, b, c у рядку символів.

# include<stdio.h>

#include<ctype.h>

int main()

{

char ch;

int na=0,nb=0,nc=0; /* лічильники літер */

printf( “Уведіть рядок, для припинення введення уведіть символ «#»\n”);

while((ch=getchar())!=’#’)

{ch=tolower(ch);/*переклад усіх символів у нижній регістр */

switch(ch)

{

case a: na++;

break;

case b: nb++;

break;

case c: nс++;

break;

default:break;

}

}

printf(“число літер a b c\n”);

printf(“%4d %4d %4d\n”,na, nb, nc);

return 0;

}

Оператор switch даної програми може бути записаний у такий спосіб:

switch(ch)

{case a: na++;

case b: nb++;

case c: nс++;}

У першому прикладі у випадку рівності ch=a керування передається на рядок з міткою а і виконується оператор na++. Потім виконується оператор break; тобто здійснюється вихід з функції switch (). В другому прикладі у випадку ch=a керування також передається на рядок з міткою а. Виконується оператор na++, а також усі наступні за ним, тобто nb++; nс++. Для уникнення цього, у першому варіанті програми використаний оператор break.

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

Лабораторна робота № 8

Робота з рядками Мета роботи

Метою даної лабораторної роботи є ознайомлення зі способами обробки рядків, спеціальними функціями мови програмування С, призначеними для обробки рядків, способами їхнього використання.

Завдання

1. Скласти алгоритм і написати програму обробки рядків, використовуючи спеціальні функції. Варіанти завдань надано в додатку 7. Номер варіанта призначається викладачем.

2. Здійснити налагодження програми і її тестування.

3. Скласти звіт про роботу.

Вказівки до виконання завдання

Символьний рядок  це масив типу char, завершений символом нуля (\0), що використовується для визначення кінця рядка. Символ нуля (\0)  недрукований символ, але він займає окрему комірку, тому масив повинний мати хоча б на одну комірку більше, ніж кількість символів у рядку.

Строкова константа  це будь-яка послідовність символів, узятих у подвійні лапки. Узяті в лапки символи й автоматично доданий до них комп'ютером символ «\0» зберігається в пам'яті у вигляді символьного рядка.

Строкову константу можна визначити за допомогою #define:

#define YES “Ряд що сходиться”

Крім того, вони використовуються як аргументи функції printf(). Ініціалізація масиву символьних рядків може бути здійснена в такий спосіб:

char z[ ]=“Ряд розбіжний”;

У результаті виконання даного оператора компілятор підраховує довжину рядка, додає нульовий символ і визначає розмір масиву. У цьому операторі можна прямо вказати розмір масиву, з огляду при цьому на нульовий символ.

Для введення/виводу рядків можна використовувати стандартні функції введення/виводу printf() і scanf(), застосовуючи відповідний специфікатор s, як показано в прикладі.

#include <stdio.h>

#define YES “Я дуже радий ”

int main()

{

char name[20];

printf(“Як вас кличуть?\n”);

scanf(“%s”, name ); /*уведення рядка*/

printf(“Здрастуйте, %s %s\n”, name, yes);

return 0;

}

У мові С існує функція strlen(), прототип якої визначений у заголовному файлі string.h. Вона визначає довжину рядка в символах. Якщо в попередньому прикладі додати такий оператор :

printf(“Довжина рядка %d символів.\n”, strlen(name));

то в результаті виконання програми на екрані з'являться наступні рядки:

Як вас кличуть ?

Олена

Здрастуйте, Олена. Я дуже радий.

Довжина рядка 5 символів.

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

Для зчитування рядків використовують 3 функції:

1. Функція gets()  зчитує символи доти, поки не досягне символу кінця рядка (\n). Вона приймає всі символи, крім символу переходу рядка (\n), відкидаючи його. Після зчитування символів функція додає нульовий символ і передає рядок викликаючій програмі. Функція gets() звичайно використовується для одержання рядків зі стандартного пристрою введення  клавіатури. Наведемо приклад її застосування:

#include<stdio.h>

#include<string.h>

#define MAX 100

int main()

{

/*виділення області пам'яті для рядка*/

char name[MAX];

printf(“Уведіть ваше ім'я\n”);

gets(name); /*розташування рядка у масиві*/

return 0;

}

Недоліком функції gets() є те, що при зчитуванні не здійснюється перевірка, чи досить місця в зарезервованій області пам'яті для рядка, що вводиться.

2. Функція fgets()  також зчитує рядки, але дозволяє вказувати максимальну кількість символів, що зчитуються. Звичайно застосовується для введення з файла. Загальна форма запису:

fgets(ім'я масиву, макс. кількість символів, що зчитуються, ім'я файла);

Другий аргумент обмежує кількість символів, що вводяться, з огляду на наявність нульового символу. Якщо указаний параметр ”n”, то функція зчитує всі символи до (n-1) або всі символи аж до символу переведення рядка (залежно від того, яка умова виконується раніш). На відміну від функції gets(), функція fgets() зберігає символ переведення рядка.

Третій аргумент  це ім'я файла, з якого відбувається зчитування. Якщо рядок зчитується з клавіатури, як аргумент використовується stdin.

Недоліком даної функції є збереження нею символу кінця рядка. Це добре видно на наступному прикладі:

#include<stdio.h>

#include<string.h>

int main()

{

char name[100];

printf(“Як вас кличуть?”\n);

fgets(name, 100, stdin);

printf(“%s? Ax! %s.\n”, name, name);

return 0;

}

У результаті виконання даної програми ми одержимо

Як вас кличуть?

Олена

Олена

?Ах! Олена

.

Розбивка рядка виводу відбувається через наявність у рядку символу кінця рядка.

3. Функція scanf() зчитує рядок з форматом %s. Закінчує зчитування при зустрічі будь-якого службового символу. У випадку зазначення ширини поля %20s зчитує до 20 символів або всі символи до першого службового символу.

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

Для виводу рядків також можна використовувати 3 функції:

1. Функція puts() роздруковує рядок, використовуючи адресу як аргумент. При виводі автоматично переходить на новий рядок. Спосіб її використання добре видний на наступному прикладі:

#include <stdio.h>

#include<string.h>

#define YES “Це масив даних ”

int main()

{

char z[40]=”Таблиця”;

puts(z);

puts(YES);

return 0;

}

У результаті виконання програми на екрані з'явиться

Таблиця

Це масив даних

2. Функція fputs() - це версія функції puts(), орієнтована на роботу з файлами. Загальна форма запису:

fputs(ім'я масиву, ім'я файлу);

Вона має другий аргумент, що вказує в який файл необхідно здійснити запис. Якщо потрібно вивести рядок на екран, використовується параметр stdout. Також необхідно відзначити, що дана функція автоматично не додає символ переходу рядка. Наведемо приклад її використання.

Приклад: цикл, що зчитує рядок і відразу виводить його на екран:

char z[81];

while(fgets(z, 81, stdin))

fputs(z, stdout);

3. Функція printf()  стандартна функція виводу, що забезпечує вивід рядків при використанні специфікатора %s. Наприклад:

printf(“%s \n”,st);

Тут необхідно відзначити, що при використанні функції printf() потрібно явно вказувати символ переходу рядка. Ця функція вимагає великий об'єм уведення з клавіатури, але полегшує процес об'єднання рядків:

printf(“Так %s, %s \n”,name,YES);

На завершення треба відзначити, що функції зчитування і виводу рядків використовуються попарно: функція gets() з функцією puts (), а функція fgets() з функцією fputs(). У цьому випадку не виникає конфлікту, зв'язаного зі збереженням або відкиданням функціями символу кінця рядка.

У мові С також, як і для відпрацьовування символів, існують функції обробки рядків, прототип яких визначений у заголовному файлі string.h. Розглянемо деякі з них.

1. Функція strlen()  дозволяє визначити довжину рядка в байтах. Спосіб її застосування показаний на прикладі.

#include <stdio.h>

#include <string.h>

int main()

{char m[]=”Добрий день”;

char k[41];

printf(“Уведіть будь-яку фразу\n”);

gets(k);

puts(k);

printf(“довжина першого рядка %d.\n”, strlen(m));

printf(“довжина другого рядка %d.\n”, strlen(k));

return 0;

}

У першому випадку функція strlen () порахує довжину рядка, що зберігається в масиві m, у другому випадку – довжину рядка, що зберігається в масиві k. Функція strlen () не враховує нульовий символ.

2. Функції strcat() і strncat()  призначені для об'єднання двох рядків в один. Функція strcat() як аргументи використовує два рядки. Другий рядок приєднується до кінця першого рядка й утворюється новий рядок, що розміщається в масиві, де зберігався перший рядок. Другий рядок не змінюється.

Недоліком даної функції є те, що функція не перевіряє, чи досить місця для нового рядка в масиві, де був розміщений перший рядок. Це може привести до заняття новим рядком сусідніх комірок пам'яті. Для уникнення цього необхідно використовувати функцію strlen() для перевірки розміру отриманого рядка. Цей недолік усунутий у другій функції strncat(), що приймає три аргументи: два рядки і максимальну кількість символів, які мають бути додані.

Приклад: Об'єднати два рядки, перевірити їхній розмір.

#include <stdio.h>

#include <string.h>

#define SIZE 101

#define MAX 41

int main()

{

char x[SIZE],y[MAX];

char z[]=”Це правильна версія?”;

int min;

puts(“Уведіть можливу версію відповіді”);

gets(x);

if((strlen(x)+strlen(z)+1)<=SIZE)

strcat(x,z);

puts(x);

puts(“Уведіть більш докладну відповідь”);

gets(y);

/* визначення максимально можливого розміру рядка, що додається, */

min=MAX-strlen(y)-1;

strncat(y, z, min);

puts(y);

return 0;

}

3. Функції strcmp() і strncmpl()  призначені для порівняння двох рядків. Їх аргументами є імена масивів, де зберігаються порівнювані рядки. Функція strcmp() порівнює два рядки і припиняє процес при зустрічі нульового символу. Це дозволяє проводити порівняння рядків, що зберігаються в масивах різних розмірів. Функція strcmp() повертає негативне число, якщо перший рядок випереджає другий за алфавітом, і позитивне число – в протилежному випадку. Якщо рядки дорівнюють один одному, вона повертає 0.

Приклад: організувати введення і перевірку пароля

#include <stdio.h>

#include <string.h>

int main()

{

char m[]=”April”;

char m1[11];

do

{

puts(“Уведіть пароль”);

gets(m1);

}

while(strcmp(m,m1)!=0);

puts(“Ви увели пароль”);

return0;

}

Можна організувати порівняння тільки певної кількості символів у рядку. Для цього необхідно використовувати функцію strncmp(), що третім аргументом приймає максимальну кількість порівнюваних символів. Ця функція робить процес порівняння доти, поки не зустріне символи, що відрізняються, або нульовий символ, або не порівняє необхідну кількість символів у рядку. Змінимо попередній приклад, використовуючи запропоновану функцію.

#include <stdio.h>

#include <string.h>

#define M “april”

int main()

{

char m1[11];

do

{

puts(“Уведіть пароль”);

gets(m1);

}

while(strncmp(M,m1,strlen(M))!=0); /* порівнює тільки ту кількість символів, що є в паролі */

puts(“Ви увели пароль”);

return 0;

}

4. Функції strcpy() і strncpy()  призначені для копіювання рядків. Функція strcpy() приймає два аргументи: масив, куди копіюється рядок і масив, що містить вихідний рядок. Дію функції можна побачити на наступному прикладі:

char m[101];

char m1[]=”integral”;

strcpy(m,m1); /*копіювання рядка m1 у масив m*/

puts(m);

puts(m1);

У результаті виконання програми на екрані з'явиться два слова «integral», тому що обидва масиви містять однаковий рядок.

Першим аргументом функції strcpy() є адреса першої комірки пам'яті масиву, де буде зберігатися новий рядок. Це може бути як ім'я масиву, що є адресою його першої комірки, так і адреса будь-якої іншої комірки масиву. У зв'язку з цим з'являється можливість копіювати частину масиву.

Приклад: скопіювати рядок у масив, починаючи з четвертої позиції.

#include <stdio.h>

#include <string.h>

int main()

{

char m1[]=”ABCD”;

char ps[41];

char m1[]=”XYZXYZXYZ”;

ps=strcpy(m1+4,m);

puts(m1);

puts(ps);

return 0;

}

У результаті виконання програми одержимо:

XYZXABCD

ABCD

Тут необхідно відзначити, що при кожному копіюванні переноситься і нульовий символ, тому залишок рядка відкидається: у новому рядку m1 уже 8 символів, а не 9, як у вихідному. Новий рядок ps утвориться з того символу, з якого починається копіювання.

Недоліком даної функції є те, що вона не перевіряє, чи досить місця в масиві для нового рядка. Цей недолік виправлений у функції strncpy(). Вона має третій аргумент, що визначає максимальну кількість символів, які підлягають копіюванню. Спосіб її застосування представлений у наступному прикладі:

#include <stdio.h>

#include <string.h>

#define M “ABCDE”

int main()

{

char m1[ ]=”*********”;

/*копіювання 3–х символів з рядка m1 у рядок M із другої позиції */

strcpy(M+1,m1,3);

puts(M);

return 0;

}

У результаті одержимо новий рядок М: A***.

5. Функція sprintf() забезпечує об'єднання декількох елементів в один рядок. Дана функція працює за прикладом функції printf(), але не виводить результуючий рядок на екран, а записує його. Тому першим аргументом функції є ім'я результуючого рядка, а далі аргументи збігаються з аргументами функції printf()  рядок специфікації перетворення, список підлягаючих запису аргументів. На відміну від інших строкових функцій, функція sprintf() оголошується у файлі stdio.h. Наведемо приклад її використання.

#include <stdio.h>

#define MAX 10

int main()

{

char m[MAX];

char m1[MAX+10];

int index;

puts(“Уведіть назву міста”);

gets(m);

printf(“Уведіть індекс \n”);

scanf(“%d”,&index);

sprintf(m1,”Індекс ? %s: %d\n”, m, index);

puts(m1);

return 0;

}

У результаті виконання програми одержимо:

Уведіть назву міста

Харків

Уведіть індекс

61000

Індекс? Харків: 61000

Існують і інші строкові функції, опис яких можна знайти в довідковій літературі.

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