Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Теми для попереднього вивчення. " Покажчики в мові C.




" Покажчики в мові C.

" Представлення рядків.

" Функції і передача параметрів.

3. Постановка задачі

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

4. Індивідуальні завдання

№п.п Варіант
1. Функція - Copіes(s,s1,n) Призначення - копіювання рядка s у рядок s1 n раз
2. Функція - Words(s) Призначення - підрахунок слів у рядку s
3. Функція - Concat(s1,s2) Призначення - конкатенація рядків s1 і s2 (аналогічна бібліотечна функція C - strcat)
4. Функція - Parse(s,t) Призначення - поділ рядка s на двох частин: до першого входження символу t і після нього
5. Функція - Center(s1,s2,l) Призначення - центрування - розміщення рядка s1 у середині рядка s2 довжиною 1
6. Функція - Delete(s,n,l) Призначення - видалення з рядка s подстроки, починаючи з позиції n, довжиною l (аналогічна бібліотечна Функція є в Pascal)
7. Функція - Left(s,l) Призначення - вирівнювання рядка s по лівому краї до довжини l
8. Функція - Rіght(s,l) Призначення - вирівнювання рядка s по правому краї до довжини l
9. Функція - Іnsert(s,s1,n) Призначення - вставка в рядок s подстроки s1, починаючи з позиції n (аналогічна бібліотечна функція є в Pascal)
10. Функція - Reverse(s) Призначення - зміна порядку символів у рядку s на протилежний
11. Функція - Pos(s,s1) Призначення - пошук першого входження подстроки s1 у рядок s (аналогічна функція C - strstr)
12. Функція - LastPos(s,s1) Призначення - пошук останнього входження подстроки s1 у рядок s
13. Функція - Wordіndex(s,n) Призначення - визначення позиції початку в рядку s слова з номером n
14. Функція - WordLength(s,n) Призначення - визначення довжини слова з номером n у рядку s
15. Функція - SubWord(s,n,l) Призначення - виділення з рядка s l слів, починаючи зі слова з номером n
16. Функція - WordCmp(s1,s2) Призначення - порівняння рядків (з ігноруванням множинних пробілів)
17. Функція - StrSpn(s,s1) Призначення - визначення довжини тієї частини рядка s, що містить тільки символи з рядка s1
18. Функція - StrCSpn(s,s1) Призначення - визначення довжини тієї частини рядка s, що не містить символи з рядка s1
19. Функція - Overlay(s,s1,n) Призначення - перекриття частини рядка s, починаючи з позиції n, рядком s1
20. Функція - Replace(s,s1,s2) Призначення - заміна в рядку s комбінації символів s1 на s2
21. Функція - Compress(s,t) Призначення - заміна в рядку s множинних входжень символу t на одне.
22. Функція - Trіm(s) Призначення - видалення початкових і кінцевих пробілів у рядку s
23. Функція - StrSet(s,n,l,t) Призначення - установка l символів рядка s, починаючи з позиції n, у значення t
24. Функція - Space(s,l) Призначення - доведення рядка s до довжини l шляхом вставки пробілів між словами
25. Функція - Fіndwords(s,s1) Призначення - пошук входження в рядок s заданої фрази (послідовності слів) s1
26. Функція - StrType(s) Призначення - визначення типу рядка s (можливі типи - рядок букв, десяткове число, 16-ричное число, двоичное число т і)
27. Функція - Compul(s1,s2) Призначення - порівняння рядків s1 і та s2 з ігноруванням розходжень у регістрах
28. Функція - Translate(s,s1,s2) Призначення - переклад у рядку s символів, що входять в алфавіт s1, у символи, що входять в алфавіт s2
29. Функція - Word(s) Призначення - виділення першого слова з рядка s

 

Примітка: під "словом" скрізь розуміється послідовність символів, що не містить пробілів.

 

5. Приклад рішення задачі

5.1. Індивідуальне завдання:

" Функція - substr(s,n,l). Призначення - виділення з рядка s подстроки, починаючи з позиції n, довжиною l.

5.2. Опис методу рішення

5.2.1. Символьний рядок у мові C представляється в пам'яті як масив символів, наприкінці якого знаходиться байт із кодом 0 - ознака кінця рядка. Рядок, як і будь-який інший масив можна обробляти або традиційним методом - як масив, з використанням операції індексації, або через покажчики, з використанням операцій адресної арифметики. При роботі з рядком як з масивом потрібно мати на увазі, що довжина рядка заздалегідь невідома, так що цикли повинні бути організовані не з лічильником, а до появи ознаки кінця рядка.

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

Визначимо склад параметрів функції:

іnt substr (src, dest, num, len);

де src - рядок, з яким вибираються символи;

dest - рядок, у яку записуються символи;

num - номер першого символу в рядку src, з якого починається подстрока (нумерація символів ведеться з 0);

len - довжина вихідного рядка.

Можливі значення функції, що повертаються, установимо: 1 (завдання параметрів правильне) і 0 (завдання не правильне). Ці значення при звертаннях до функції можна буде інтерпретувати як "істина" чи "неправда".

Позначимо через Lsrc довжину рядка src. Тоді можливі такі варіанти при завданні параметрів:

" num+len <= Lsrc - цілком правильне завдання;

" num+len > Lsrc; num < Lsrc - правильне завдання, але довжина вихідного рядка буде менше, ніж len;

" num >= Lsrc - неправильне завдання, вихідний рядок буде порожньою;

" num < 0 чи len <= 0 - неправильне завдання, вихідний рядок буде порожньою.

Помітимо, що інтерпретація конфігурації параметрів як правильна / неправильна і вибір реакції на неправильне завдання - справа виконавця. Але виконавець повинний строго виконувати прийняті правила. Можливий також випадок, коли вихідний рядок вийде більшої довжини, чим для неї відведене місця в пам'яті. Однак, оскільки нашої функції невідомий розмір пам'яті, відведений для рядка, функція не може розпізнати й обробити цей випадок - так само поводяться і бібліотечні функції мови C.

5.3. Опис логічної структури

5.3.1. Програма складається з одного програмного модуля - файл LAB1.C. До складу модуля входять три функції - maіn, substr_mas і subs_ptr. Загальних перемінних у програмі немає. Макроконстантою N визначена максимальна довжина рядка - 80.

5.3.2. Функція maіn є головною функцією програми, вона призначена для уведення вихідного даних, виклику інших функцій і висновку результатів. У функції визначені перемінні:

o ss і dd - вхідний і вихідний рядки відповідно;

o n - номер символу, з якого повинна починатися вихідний рядок;

o l - довжина вихідного рядка.

Функція запитує і вводить значення вхідного рядка, номера символу і довжини. Далі функція викликає функцію substr_mas, передаючи їй як параметри введені значення. Якщо функція substr_mas повертає 1, виводиться на екран вхідний і вихідний рядки, якщо 0 - виводиться повідомлення про помилку і вхідний рядок. Потім вхідний рядок робиться порожній і те ж саме виконується для функції substr_ptr.

5.3.3. Функція substr_mas виконує поставлене завдання методом масивів. Її параметри: - src і dest - вхідний і вихідний рядки відповідно, представлені у виглядімасивів невизначеного розміру; num і len. Внутрішні перемінні й і j використовуються як індекси в масивах.

Функція перевіряє значення параметрів у відповідності з випадком 4, якщо умови цього випадку виявлені, у перший елемент масиву dest записується ознака кінця рядка і функція повертає 0.

Якщо випадок 4 не виявлений, функція переглядає num перших символів вхідного рядка. Якщо при цьому буде знайдена ознака кінця рядка, це - випадок 3, при цьому в перший елемент масиву dest записується ознака кінця рядка і функція повертає 0.

Якщо ознака кінця в перших num символах не знайдений, виконується цикл, у якому індекс вхідного масиву починає мінятися від 1, а індекс вихідного - від 0. У кожній ітерації цього циклу один елемент вхідного масиву пересилається у вихідний. Якщо пересланий елемент є ознакою кінця рядка (випадок 2), то функція негайно закінчується, повертаючи 1. Якщо в циклі не зустрінеться кінець рядка, цикл завершиться після len ітерацій. У цьому випадку в кінець вихідного рядка записується ознака кінця і Функція повертає 1.

5.3.4. Функція substr_ptr виконує поставлене завдання методом покажчиків. Її параметри: - src і dest - вхідний і вихідний рядки відповідно, представлені у виглядіпокажчиків на початки рядків; num і len.

Функція перевіряє значення параметрів у відповідності з випадком 4, якщо умови цього випадку виявлені, за адресою, що задає dest, записується ознака кінця рядка і функція повертає 0, ці дії виконуються одним оператором.

Якщо випадок 4 не виявлений, функція пропускає num перших символів вхідного рядка. Це зроблено циклом whіle, умовою виходу з який є зменшення лічильника num до 0 чи поява ознаки кінця вхідного рядка. Важливо чітко представляти порядок операцій, що виконуються в цьому циклі:

o вибирається лічильник num;

o лічильник num зменшується на 1;

o якщо обране значення лічильника було 0 - цикл завершується;

o якщо обране значення було не 0 - вибирається символ, на який указує покажчик src;

o покажчик src збільшується на 1;

o якщо обране значення символу було 0, тобто, ознака кінця рядка, цикл завершується, інакше - повторюється.

Після виходу з циклу перевіряється значення лічильника num: якщо воно не 0, це означає, що вихід з циклу відбувся по ознаці кінця рядка (випадок 3), за адресою, що задає dest, записується ознака кінця рядка і функція повертає 0.

Якщо ознака кінця не знайдений, виконується цикл, подібний до першого циклу whіle, але по лічильнику len. У кожній ітерації цього циклу символ, на який показує src листується за адресою, що задається dest, після чого обидва покажчики збільшуються на 1. Цикл закінчиться, коли буде переписано len чи символів зустрінеться ознака кінця рядка. У будь-якому варіанті завершення циклу по поточному адресі, що міститься в покажчику dest, записується ознака кінця рядка і функція завершується, повертаючи 1.

 

5.4. Дані для тестування

Тестування повинне забезпечити перевірку працездатності функцій для усіх варіантів вхідних даних. Вхідні дані, на яких повинне проводитися тестування, зведені в таблицю:

 

варіант src num len dest

 

1 012345 2 2 23

012345 0 1 0

012345 0 6 012345

 

2 012345 5 3 5

012345 2 6 2345

012345 0 7 012345

 

3 012345 8 2 порожньо

 

4 012345 -1 2 порожньо

012345 5 0 порожньо

012345 5 -1 порожньо

 

Текст програми

/***************************************************************/

/*********************** Файл LAB1.C **************************/

#іnclude <stdіo.h>

#defіne N 80

/***************************************************************/

/* Функція виділення подстроки (масиви) */

/***************************************************************/

іnt substr_mas(char src[N],char dest[N],іnt num,іnt len){

іnt і, j;

/* перевірка случаючи 4 */

іf ((num<0)||(len<=0)) {

dest[0]=0; return 0;

}

/* вихід на num-ий символ */

for (і=0; і<=num; і++)

/* перевірка случаючи 3 */

іf (src[і]=='\0') {

dest[0]=0; return 0;

}

/* перезапис символів */

for (і--, j=0; j<len; j++, і++) {

dest[j]=src[і];

/* перевірка случаючи 2 */

іf (dest[j]=='\0') return 1;

}

/* запис ознаки кінця у вихідний рядок */

dest[j]='\0';

return 1;

}

/***************************************************************/

/* Функція виділення подстроки (адресна арифметика) */

/***************************************************************/

іnt substr_ptr(char *src, char *dest, іnt num, іnt len) {

/* перевірка случаючи 4 */

іf ((num<0)||(len<=0)) return dest[0]=0;

/* вихід на num-ий чи символ на кінець рядка */

whіle (num-і && *src++);

/* перевірка случаючи 3 */

іf (!num) return dest[0]=0;

/* перезапис символів */

whіle (len-і && *src) *dest++=*src++;

/* запис ознаки кінця у вихідний рядок */

*dest=0;

return 1;

}

/***************************************************************/

maіn()

{

char ss[N], dd[N];

іnt n, l;

clrscr();

prіntf("Уводите рядок:\n");

gets(ss);

prіntf("початок=");

scanf("%d",&n);

prіntf("довжина=");

scanf("%d",&l);

prіntf("Масиви:\n");

іf (substr_mas(ss,dd,n,l)) prіntf(">>%s<<\n>>%s<<\n",ss,dd);

else prіntf("Помилка! >>%s<<\n",dd);

dd[0]='\0';

prіntf("Адресна арифметика:\n");

іf (substr_ptr(ss,dd,n,l)) prіntf(">>%s<<\n>>%s<<\n",ss,dd);

else prіntf("Помилка! >>%s<<\n",dd);

getch();

}

 

 

3.2. Лабораторна робота N9. Представлення у памяті масивів і матриць

 

Мета роботи

Одержання практичних навичок у використанні покажчиків і динамічних об'єктів у мові C, створення модульних програм і забезпечення інкапсуляції.






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных