Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
практичні алгоритмізація дл студ.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
6.12 Mб
Скачать

Лабораторна робота №24. Тема: Використання прапорів в рядку управління форматом printf

Мета: Навчитися використовувати прапори в рядку управління форматом printf.

Хід роботи

1. Друк літералів і Еsc –последовательностей. Напишіть програми, на лістингах що нижче, проаналізуйте її.

Програма, приведена на лістингу 9.18, читає цілі числа з різними специфікаторами перетворення цілих чисел і виводить їх в десятковій нотації. Зверніть увагу, що специфікатор %i дає можливість вводити десяткові, вісімкові і шістнадцятиричні цілі числа.

/* Читання цілих чисел */

#include <stdio.h>

main ()

{

int a, b, c, d, e, f, g;

printf("Enter seven integers: ");

scanf("%d%i%i%i%o%u%x", &a, &b, &c, &d, &e, &f, &g);

printf("The input displayed as decimal integers is:\n");

printf("%d %d %d %d %d %d %d\n", a, b, c, d, e, f, g);

return 0;

}

Enter seven integers: - 70 -70 070 0x70 70 70 70

The input displayed as decimal integers is:

-70 -70 56 112 56 70 112

Лістинг 9.18. Читання вхідних даних зі специфікаторами перевтілення цілих чисел

При введенні чисел з плаваючою точкою може бути використаний будь-яким із специфікаторів перетворення значень з плаваючою точкою: е, Е, f, g або G. Програма на лістингу 9.19 читає три числа з плаваючою точкою з трьома видами специфікаторів перетворення і виводить їх із специфікатором перетворення f. Зверніть увагу, що результат виконання програми підтверджує той факт, що виведені значення з плаваючою точкою не є точними. Про це свідчить друге по рахунку надруковане значення.

/* Читання значень з плаваючою точкою */

#include <stdio.h>

main ()

{

float a, b, c;

printf("Enter three floating - point numbers: \n");

scanf("%e%f%g", &a, &b, &c);

printf("Here are the numbers entered in plain\n");

printf("floating - point notation:\n");

printf("%f %f %f\n", a, b, c);

return 0;

}

Enter three floating - point numbers:

1.27987 1.27987e+03 3.38476e-06

Here are the numbers entered in plain

floating - point notation

1.279870

1279.869995

0.000003

Лістинг 9.19. Читання вхідних даних із специфікаторами перетворення значень

з плаваючою точкою

2. Друк літералів і Еsc –последовательностей. Напишіть програми, на лістингах що нижче, проаналізуйте її.

Символи і рядки вводяться с використанням специфікаторів перетворення відповідно c і s. Програма на лістингу 9.20 пропонує користувачеві ввести рядок. Програма прочитує перший символ рядка із специфікацією % с і зберігає його в символьній змінній х; потім вводить частину рядка, що залишилася, із специфікацією %s і зберігає її в масиві символів у.

Послідовність символів можна ввести, використовуючи набір сканування. Набір сканування - це список символів, що поміщений в квадратні дужки [], йде відразу за знаком відсотка в рядку управління форматом. Набір сканування переглядає символи у вхідному потоці, вибираючи тільки ті з них, які містяться в наборі символів. Кожного разу при збігу символу він зберігається у відповідному аргументі набору сканування. Аргумент - це покажчик на масив символів. Набір сканування припиняє читати символи після того, як зустрічається символ, що не міститься в наборі. Якщо вже перший символ вхідного потоку не відповідає жодному з символів набору, то в масиві зберігається тільки нульовий символ. Програма на лістингу 9.21 використовує набір символів сканування [aeiou] для відбору голосних з вхідного потоку. Зверніть увагу, що прочитуються тільки перші сім введених символів. Восьмий символ (h) не міститься в заданому наборі і введення завершується.

/* Читання символів і рядків */

#include <stdio.h>

main ()

{

char x, у [ 9] ;

printf("Enter a string: ");

scanf("%c%s", &x, y);

printf("The input was:\n");

printf("the character \"%c\" ", x);

printf("and the string \"%s\"\n", y);

return 0;

}

Enter a string: Sunday

The input was:

the character "S" and the string "unday"

Лістингу 9.20. Введення символів і рядків

/* Застосування набору сканування */

#include <stdio.h>

main ()

{

char z [ 9 ] ;

printf("Enter a string: ");

scanf("%[aeiou]"z);

printf("The input was \"%s\"\n", z);

return 0;

}

Enter a string: ooeeooahah

The input was "ooeeooa"

Лістингу 9.21. Застосування набору сканування

3. Друк літералів і Еsc –последовательностей. Напишіть програми, на лістингах що нижче, проаналізуйте її.

Набір сканування можна також використовувати для введення символів, що не містяться в заданому списку, якщо застосувати інвертований набір сканування. Щоб інвертувати набір символів, помістите символ ^ в квадратні дужки перед першим символом набору. В цьому випадку в масиві зберігатимуться тільки ті символи, які не входять в набір. Інвертований набір завершує введення після появи у вхідному потоці символу, який є в наборі. Програма на лістингу 9.22 використовує набір [^aeiou] для пошуку у вхідному потоці символів, що не є голосними.

Для читання певного числа символів з вхідного потоку із специфікацією перетворення scanf може використовуватися значення ширини поля. Програма на лістингу 9.23 читає ряд послідовних цифр як ціле число з двома десятковими розрядами і ціле число, що складається із залишку цифр вхідного потоку.

/* Застосування інвертованого набору сканування */

#include <stdio.h>

main ()

{

char z [ 9 ] ;

printf("Enter a string: ");

scanf("%[^aeiou]"z);

printf("The input was \"%s\"\n", z);

return 0;

}

Enter a string:

The input was “Str”

Лістингу 9.22. Примечание інвертованого набору сканування

/* Ввід даних із завданням ширини поля*/

#include <stdio.h>

main ()

{

int x,y;

printf (“Enter a six digit integer: “);

scanf ( “%2d%d”, &x, &y);

printf (“The integers input were %d and %d\n”, x, y);

return 0;

}

Enter a six digit integer: 123456

The integers input were 12 and 3456

Лістингу 9.23. Введення даних із завданням ширини поля

4. Друк літералів і Еsc –последовательностей. Напишіть програми, на лістингах що нижче, проаналізуйте її.

Часто буває необхідно пропустити деякі символи вхідного потоку.

Наприклад, дата могла б бути введена як

7-9-91

Кожне число дати вимагається зберегти, але символи тире, якими вони розділені, можуть бути відкинуті. Щоб усунути непотрібні символи, включите їх в рядок управління форматом scanf (пробільні символи - пропуск, новий рядок і табуляція - пропускають усі пробільні символи, передуючі значущим даним). Наприклад, щоб пропустити символи тире при введенні дати, використовуйте оператор

scanf ("%d-%d-%d", &month, &day, &year);

Хоча scanf і усуває тире в попередньому прикладі, дата може бути введена і в наступному форматі:

7/9/91

В цьому випадку попередній оператор scanf не пропустив би непотрібні символи. З цієї причини scanf має можливість встановити символ пригнічення привласнення* (зірочка). Символ пригнічення привласнення дає можливість scanf читати будь-який тип даних і відкидати їх, не привласнюючи змінної. Програма на лістингу 9.24 використовує символ пригнічення привласнення в специфікації перетворення % з для вказівки того, що символ, що з'являється у вхідному потоці, має бути прочитаний і відкинутий. Зберігаються тільки значення місяця, дня і року. Для демонстрації коректності введення програма друкує введені значення. Зверніть увагу, тут немає таких змінних в списку аргументів, які відповідали б специфікаціям перетворення з символом пригнічення привласнення, оскільки для цих специфікацій перетворення привласнення не виконується.

/* Читання і відкидання символів з вхідного потоку */

#include <stdio.h>

main ()

{

int month1, day1, year1, month2, day2, year2;

printf("Enter a date in the form mm - dd - yy: ");

scanf("%d%*c%d%*c%d", &month1, &day1, &year1);

printf("month = %d day = %d year = %d\n\n", month1, day1, year1);

printf("Enter a date in the form mm/dd/yy: ");

scanf("%d%*c%d%*c%d", &month2, &day2, &year2);

printf("month = %d day = %d year = %d\n", month2, day2, year2);

return 0;.

}

Enter a date in the form mm - dd - yy: 11-18-71

month = 11 day = 18 year = 71

Enter a date in the form mm/dd/yy: 11/18/71

month = 11 day = 18 year = 71

Лістингу 9.24. Читання і відкидання символів з вхідного потоку