ТОП 10:

Форматування даних при обмінах з потоками



Для форматування даних при обміні з потоками існують такі засоби:

- прапори форматування дозволяють виводити значення з різноманітним вирівнюванням;

- комбінації прапорів поєднують за допомогою диз'юнкції;

- маніпулятори дозволяють використати себе в якості правого операнда операцій << і >> (cout<<модифікатор).

Безпосереднє застосування операцій виведення << (включення в потік) і введення >>; (витяг з потоку) до стандартних потоків cout, cin, cerr, clog для даних базових типів приводить до використання "замовчуваних" форматів зовнішнього представлення значень, що пересилаються. Наприклад, при виведенні чисел кожне з них займає рівно стільки позицій, скільки необхідно для його представлення. Це не завжди зручно і правильно. Наприклад, виконання операторів

int il= 1, i2 = 2, i3 = 3, i4 = 4, i5 = 5;

cout « "\n" « i1 « i2 « i3 « i4 « i5;

приведе до такого результату: 12345

Для поліпшення читання найпростіше явно ввести розділові пробіли. Виконавши оператор

cout « "\n"« i1 ‘ ’« i2 ‘ ’« i3 ‘ ’« i4 ‘ ’« i5 ‘

одержимо більш наочний результат: 12345

Наступний крок - додавання пояснювального тексту і(чи) символів табуляції. Ширина (кількість позицій) зовнішнього представлення кожного числа вибирається автоматично, виходячи з необхідної кількості позицій. Однаковість не завжди влаштовує користувача програми. Наприклад, періодичний дріб 1.0 / 3.0 можна представити дуже різними способами:

0.3 0.3333 3.3е-1 0.3333333е0

Однак стандартне представлення при виведенні за допомогою оператора

cout « "\nl.0/3.0 = " << 1.0 / 3.0;

буде завжди однаковим:

1.0 / 3.0 = 0.333333

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

Типи прапорів форматування представлені в таблиці 13.1.

Крім прапорів для керування форматом використовуються компонентні змінні класу ios (табл. 13.2).

У наступній програмі демонструються основні принципи форматування за допомогою компонентних функцій класу ios.

//Р11-02.СРР - форматування виведеної інформації

(include <strstrea.h>

void main ()

(char name[] = "Рядок довжиною 52 символу "

"у поле шириною 58 позицій,";

cout «n\n";

cout.width(58); // Ширина поля виводиться для потоку cout

// Символ заповнення порожніх позицій поля: cout.fill('$');

// Перший вивід рядка в потік cout:

cout <<name<<endl;

cout. width (58) ; // Забрати не можна

// Заповнювач між знаком і значенням:

cout.setf (ios: : internal) ;

double dd = -33.4455;

cout « dd « endl; // Вивід речовинного значення

cout. width ( 58 ); // Забрати не можна

// Зміна вирівнювання :

cout.setf (ios: :left,ios :: adjustfield) ;

// Символ заповнення порожніх позицій поля:

cout.fill(#);

// Другий висновок рядка в потік cout:

cout « name « endl;

long nn = 90000; // Шіснадцяткове значення Oxl5f90

// Зміна підстави числення:

cout.setf (ios: : hex, ios: :basefield) ;

// Виводити ознака підстави числення:

cout.setf (ios: :showbase) ;

// Перехід на верхній регістр :

cout.setf (ios: : uppercase) ;

cout. width (58 ); // Забрати не можна

cout « nn « endl; // Вивід цілого значення типу long

cout, width (58 ); // Забрати не можна

// Зміна вирівнювання:

cout . setf (ios : : internal , ios : : adjustfield) ;

// Символ заповнення порожніх позицій поля:

cout. fill ('$') ;

cout. unsetf (0x0200) ; // Перехід на нижній регістр

cout « nn « endl; // Вивід цілого значення типу long

}

Результат виконання програми:

$$$$$$Рядок довжиною 52 символу в поле шириною 58 позицій.-$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$33.4455

Рядок довжиною 52 символу в поле шириною 58 позицій. ####§!

Ox$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$15f90

Прокоментуємо програму і результати. За замовчуванням ширина поля виведення встановлюється рівній довжині прийнятого представлення виведеного значення. Тому дія функції width() однократне, і її потрібно при кожному виведенні значення явно використовувати, якщо значення ширини, що замовчується, поля виведення не влаштовує програміста. Функція fill () установлює символ заповнення порожніх позицій поля. При першому виведення рядка name[] за замовчуванням установлене вирівнювання по правому краї поля, і символи $ поміщені ліворуч від умісту рядка. Перед виведенням значення дійсної перемінний dd функцією setf() установлений прапор internal. Під його впливом символ заповнення розмістився між знаком '-' і числовим значенням 33.4455. Ширина поля явно зазначена в 58 позицій.

Перед другим виводом рядка name[] "під впливом" другого параметра (adjustfield) функції setf () скинуті прапори right і internal і явно встановлений прапор left вирівнювання по лівому краї. Змінено символ заповнення порожніх позицій ‘#'. Перед виводом довгого цілого числа nn установлена підстава системи числення (basefield - скидає прапори основ числення; hex - явно встановлює шістнацяткову підставу). Установлено прапори showbase і uppercase і ширина поля виведення.

Число 90000 виведене в шіснацятковому виді, ознакою 0х позначена підстава системи числення, для зображення цифр і ознаки підстави використовуються прописні букви. Тому що при переході до вирівнювання по лівому краї прапор internal виявився скинутим, то символ заповнення '#' розміщений не після ознаки підстави числення ох, а заповнює праву порожню частину поля. Заключний вивід значення nn, рівного 90000, виконаний із прапорами internal і left. Для переходу на нижній регістр використана функція unsetf () з явним значенням прапора uppercase.

 

Таблиця 13.1 – Типи прапорів

Назва Пояснення їхньої дії
skipws - 0x0001   при такім значенні прапора операція вилучення з потоку >>буде ігнорувати (пропускати) узагальнені пробільні символи;
left = 0x0002 вивід значення з лівим вирівнюванням (пригорнути до лівого краю поля);
right = 0x0004 вивід значення з правим вирівнюванням (це значення встановлюється за замовчуванням);
Internal = 0x0008 прийнятий як заповнювач символ (за замовчуванням пробіл) міститься між числовим значенням і знаком числа або ознакою підстави системи числення (див. нижче компонент ios::x_fill);
dec=0x0010 десяткова система числення;
oct =x0020 вісімкова система числення;
hex = x0040 Шіснацяткова система числення;
showbase=0x0080 надрукувати при виведеннік ознак системи числення (0х шіснацяткових чисел, 0 - для восьмеричних чисел);
showpoint=0x0100 при виведенні дійсних чисел обов'язково друкувати десяткову крапку і наступні за нею нулі (навіть для речовинного числа, що має нульову дробову частину);
uppercase=0x0200 при виведенні дійсних чисел обов'язково друкувати десяткову крапку і наступні за нею нулі (навіть для речовинного числа, що має нульову дробову частину);
showpos = 0x0400 друкувати знак числа (символ '+') при виведенні позитивних - чисел ;
scientific = 0x0800 для дійсних чисел (float, double) використовувати представлення у форматі з крапкою, що плаває, (наукове представлення), тобто з указівкою порядку і мантиси, що має одну ненульову (значущу) цифру перед крапкою;

 

Продовження таблиці 13.1 – Типи прапорів

Fixed = 0x1000 для дійсних чисел (типів float, double) використовувати представлення у форматі з фіксованою крапкою, причому кількість цифр дробової частини визначається заданої за замовчуванням точністю (див. нижче перемінну x_precision);
unitbuf = 0x2000 очищати всі потоки (вивантажити вміст буферів) після кожного виведення (після включення в потік);
stdio = 0x4000 очищати потоки stdout, stderr (вивантажити вміст буферів) після кожного виведення (після включення в потік).

 

Таблиця 13.2 - Компонентні змінні класу ios

Int x_width задає мінімальну ширину поля виведення
int x_precision задає точність представлення дійсних чисел, тобто максимальна кількість цифр дробової частини при виведення;
Int x_fill визначає символ заповнення поля виведення до мінімальної ширини, визначеної x_width. За замовчуванням x_fill має значення пробілу.
static long bitalloc () повертає значення може бути для установки, очищення і перевірка прапорів. Функція призначена для заданих користувачем прапорів форматування
char fill() повертає поточний символ заповнення незайнятих (порожніх) позицій поля виведення
charFill(char) заміняє символ заповнення значенням параметра, повертає попередній символ заповнення;
long flags(); повертаючий набір бітів прапорів форматування;
long flags(long); установлює біти прапорів форматув. у відповідності зі знач. п-тра. Повертає попереднє значення прапорів;

 

Продовження таблиці 13.2 - Компонентні змінні класу ios

Int precision(); повертає поточне значення точності представлення при виведенні дійсних чисел (типу float і double)
Int precision(int n); установлює за значенням параметра n точність представлення дійсних чисел, повертає попереднє значення точності;
long setf(long);   установлює прапори відповідно до того, як вони позначені у фактичному параметрі. Повертає попередню установку прапорів;
long setf(long _setbits, long _field) ; •'?'•   установлює прапори у відповідності зі значеннями параметрів. Біти, позначені в параметрі _field, скидаються (очищаються), а потім установлюються ті біти, що відзначені в параметрі _setbits;
long unsetf(long); скидаються (очищаються) усі біти прапорів, що помічені в параметрі. Функція повертає попереднє значення прапорів;
Int width() ; \ повертає встановлене значення ширини поля
int width (int); установлює значення ширини поля у відповідності зі значенням параметра xalloc;
Static int хalloc() повертає індекс масиву до тих пір поки не використованих слів, які можна використовувати в якості визначених файлів форматування

Маніпулятори

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

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

Маніпулятори бібліотеки класів ios мови С++ поділяються на дві групи: маніпулятори з параметрами і маніпулятори без параметрів (табл. 13.3, 13.4).

Таблиця 13.3 - Маніпулятори без параметрів

dec при введенні і виведення встановлює прапор десяткової системи числения;
hex при введенні і виведення встановлює прапор шістнадцяткова системи числення;
oct при введенні і виведення встановлює прапор восьмеричної системи числення;
Ws діє тільки при введенні і передбачає витяг із вхідного потоку пробільных символів (пробіл, знаки табуляції ‘\t’ і ‘\v’, символ перекладу рядка '\n', символ повернення каретки '\г', символ перекладу сторінки ‘\f’);
endl діє тільки при вивід, забезпечує включення у вихідний потік символу нового рядка і скидає буфер (вивантажує вміст) цього потоку;
ends діє тільки при виведення і забезпечує включення в потік нульової ознаки кінця рядка
flush діє тільки при виведення й очищає вихідний потік,тобто скидає його буфер (вивантажує вміст буфера).

Не всі перераховані маніпулятори діють як на вхідні, так і на вихідні потоки, ws діє тільки при введенні; endl, ends, flush - тільки при виведення.

setbase(int n) установлює підстава (n) системи числення. Значеннями параметра n можуть бути: 0, 8, 10 чи 16. При використанні параметра 0 підстава числення при виведення вибирається десятичним. При введенні параметр 0 означає, що цілі десяти десятичні цифри з вхідного потоку повинні оброблятися правилам стандарту ANSI мови Сі
reaetiosf lags (long L)   скидає (очищає) окремі прапори стану потоці» введення і виведення на основі бітового представлення значення параметра L (скидає прапори відповідно до одиничних бітів);
setiosf lags (long L) встановлює окремі прапори стану (форматні бити потоків введення-виведення на основі бітового представлення значення параметра l (установлюються прапори у відповідності c одиничними бітами параметра);
setfill(int n)   значення параметра n надалі використовується в якості кода символу-заповнювача, що міститься в незайнята позиціях поля при введенні значення. (Див. компонент х_fiel класу ios);
setprecision (int n) "n~ визначає за допомогою значення параметра n точність представлення дійсних чисел, тобто максимальна кількість цифр дробової частини числа при введенні і виведення. (Див. компонент x_precision класу ios);
setw(int n) значення параметра n задає мінімальну ширину поля в) вода. (Див. компонент x_width класу ios)

Таблиця 13.4 - Маніпулятори з параметрами визначені у файлі iomanip.h

Маніпулятори dec, hex, oct, що задають основу системи числення, змінюють стан потоку, і ця зміна залишається в силі до наступного явної зміни.

Маніпулятор endl рекомендується використовувати при кожнім виведення. Наприклад, його використання просте необхідно в такому операторі:

cout « "Чекайте! Йде набір статистики." « endl;

При відсутності endl тут не можна гарантувати, що повідомлення користувачу не залишиться в буфері потоку cout до закінчення набору статистики.

Рекомендується за допомогою маніпулятора flush скидати буфер вхідного потоку при виведення на екран підказки до наступного введення інформації:

cout « "Уведіть назву файлу:" « flush;

cin » fileName; // Тут fileName - символьний масив

За допомогою маніпуляторів можна керувати представленням інформації у вихідному потоці. Наприклад, маніпулятор setw(int n) дозволить виділити для числового значення поле фіксованої ширини, що зручно при печатці таблиць.

Приклад розробки програми

#include "stdafx.h"

#include "conio.h"

#include <stdlib.h>

#include <fstream>

#include <iostream>

using namespace std;

class Cat

{

public:

Cat(char * my_name, int my_age){age = my_age; strcpy(name, my_name);};

Cat(){age = 0; strcpy(name, "none");};

void Myau(){cout << "\nMyau! I'm cat, my name is " << name << ", my age is " << age;};

private:

int age;

char name[25];

};

void WriteOfstream()

{

char buffer[255];

cout << "\nPut your text: ";

cin.ignore(1, '\n');

cin.getline(buffer, 255);

ofstream fout("text.txt", ios::app);

fout << buffer << "\n";

fout.close();

}

void ReadOfstream()

{

char ch;

cout << "\nFile text:\n";

ifstream fin("text.txt");

while (fin.get(ch))

cout << ch;

fin.close();

}

void WriteCat()

{

int age;

char name[20];

cout << "\nInput cat's name:";

cin >> name;

cout << "\nInput cat's age:";

cin >> age;

Cat cat1(name, age);

cat1.Myau();

ofstream fout("objects.dat", ios::binary | ios::app);

fout.write((char *) &cat1, sizeof (cat1));

fout.close;

}

void ReadCats()

{

ifstream fin("objects.dat", ios::binary);

Cat cat1;

while (fin.read((char *) &cat1, sizeof(cat1)))

cat1.Myau();

fin.close;

}

int main(int argc, char* argv[])

{

int cChoice;

char temp;

int itemp;

const int number = 285;

//system("cls");

do

{

switch(cChoice)

{

case 1:

cout.setf(ios::left);

cout << "\nSIMPLE OUT: ";

cout << "Field_1";

cout << "Field_2";

 

cout << "\nWIDTH FLAG: ";

cout.width(10);

cout << "Field_1";

cout.width(20);

cout << "Field_2";

 

cout << "\nFILL FLAG: ";

cout.fill('_');

cout.width(10);

cout << "Field_1";

cout.width(20);

cout << "Field_2";

 

cout << "\nALIGN FLAG: ";

cout.width(10);

cout << "left" << endl;

cout.width(10);

cout.setf(ios::right);

cout << "right";

 

cout << "\nTYPE FLAG: ";

cout << "\n\tdec:" << dec << number;

cout << "\n\thex:" << hex << number;

cout << "\n\toct:" << oct << number;

break;

case 2:

WriteOfstream();

break;

case 3:

ReadOfstream();

break;

case 4:

WriteCat();

break;

case 5:

ReadCats();

break;

case 6:

//char_vector.Sort();

break;

default :

//total++;

1;

}

cout <<("\n\n=====================================================\n");

cout <<(":: STL VECTORS LAB ::\n");

cout <<("=====================================================\n");

cout <<(" Type your choice:\n");

cout <<(" [1] Simple COUT\n");

cout <<(" [2] OFSTREAM write to file text.txt\n");

cout <<(" [3] OFSTREAM read from file text.txt\n");

cout <<(" [4] OFSTREAM Make cat and write to objects.dat\n");

cout <<(" [5] OFSTREAM Get cat from objects.dat\n");

cout <<(" [0] Exit\n");

cout <<("=====================================================\n\n");

cin >> cChoice;

} while (cChoice != 0);

return 0;

}

Контрольні запитання

1. Що таке потік і як він визначається?

2. Що таке буфер?

3. Класифікація потоків, що використовуються у програмуванні.

4. Для чого призначені cin/cout?

5. Особливості використання бібліотеки потоків.

6. Особливості операцій вставки та вилучення.

7. Що таке маніпулятори? Для чого вони необхідні?

8. Для чого необхідні прапорці у потоках?

9. Види пріоритетів потоків.

10. Функції обміну з потоками, які вам відомі.

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

Тема: Особливості розробки програм з використанням файлових потоків

Мета: Набуття навичок студентами в розробці потоків

Порядок виконання

1. Ознайомитись з теоретичною частиною даної теми.

2. Розробити ієрархію класів з використанням стандартної бібліотеки вводу/виводу С++ для організації та роботи з файловими потоками відповідно Завдання.

При розробці програм використовувати:

· Бібліотечну функцію (з бібліотеки ANSIC) int create (const char* path, int mode);

· Бібліотечну функцію void open (const char* File_Name, int mode=замовчуване значення, int protection=замовчуване значення);

· Конструктори класів ifstream, ofstream, fstream.

3. Розробити тест для перевірки вірності даної програми.

4. Оформити звіт до лабораторної роботи.

Завдання

Варіант 1

Для збереження даних про планшетні сканери описати структуру виду:

struct scan_info{

char model[25]; // найменування моделі

int price; // ціна

double x_size; // гориз. розмір обл. сканування

double y_size; // вертик. розмір обл. сканування

int optr; // оптичне розрішення

int grey; // число градацій сірого

};

Написати функцію, що записує в бінарний файл дані про сканер із приведеної структури. Структура файлу: у перших двох байтах розміщується значення типу int, що визначає кількість зроблених у файл записів; далі без пропусків розміщаються записи про сканери.

Написати функцію, що витягає з цього файлу дані про сканер у структуру типу scan_info. Обов'язковий параметр — номер необхідного запису. Функція повинна повертати нульове значення, якщо читання пройшло успішно, і –1 у противному випадку.

Привести приклад програми, що створює файл із даними про сканери (дані вводяться з клавіатури) — 6–8 записів, і що виводить на дисплей дані про запис, на які був запит.

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

Варіант 2

Для збереження даних про планшетні сканери описати структуру виду, описаного у варіанті 1.

Написати функцію, що записує в бінарний файл дані про сканер із приведеної структури. Структура файлу: у перших двох байтах розміщується значення типу int, що визначає кількість зроблених у файл записів; далі без пропусків розміщаються записи про сканери.

Написати функцію, що сортує записи в описаному вище бінарному файлі по одній з наступних характеристик: ціна або число градацій сірого. Обов'язковий параметр — ознака, що задає критерій сортування.

Привести приклад програми, що створює файл із даними про сканери (дані вводяться з клавіатури) з восьми записів і здійснює його сортування.

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

Варіант 3

Для збереження даних про планшетні сканери описати структуру виду, описаного у варіанті 1.

Написати функцію, що записує в бінарний файл дані про сканер із приведеної структури. Структура файлу: у перших чотирьох байтах розміщається значення типу long, що визначає кількість зроблених у файл записів; далі без пропусків розміщуються записи про сканери.

Написати функцію, що сортує записи в описаному вище бінарному файлі по найменуванню моделі сканера.

Привести приклад програми, що створює файл із даними про сканери (дані вводяться з клавіатури) з восьми записів і здійснює його сортування.

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

Варіант 4

Для збереження даних про планшетні сканери описати структуру виду, описаного у варіанті 1.

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

Написати функцію, що витягає дані про сканер з описаного вище бінарного файлу в структуру типу scan_info. Обов'язковий параметр — номер необхідного запису. Функція повинна повертати нульове значення, якщо читання пройшло успішно, і –1 у противному випадку.

Привести приклад програми, що створює файл із даними про сканери (дані вводяться з клавіатури) з восьми записів і здійснює вивід на дисплей даних про необхідний запис.

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

Варіант 5

Для збереження даних про планшетні сканери описати структуру виду, описаного у варіанті 1.

Написати функцію, що записує дані про сканер із приведеної структури в необхідну позицію в бінарному файлі. Структура файлу: у перших двох байтах розміщається значення типу int, що визначає кількість зроблених у файл записів; далі без пропусків розміщаються записи про сканери. Запис може здійснюватися в будь-яку позицію, причому якщо між записом, що вводиться, і останнім (чи початком файлу) наявні пропуски, вони заповнюються нулями.

Написати функцію, що «ущільнює» описаний вище бінарний файл шляхом видалення з нього записів, що містять усі нулі.

Привести приклад програми, що створює файл із даними про сканери (дані вводяться з клавіатури) з шести записів і здійснює його ущільнення.

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

Варіант 6

Для збереження даних про планшетні сканери описати структуру виду, описаного у варіанті 1.

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

Написати функцію, що запитує дані про сканер у режимі діалогу і заміщає записи в бінарному файлі по заданому номеру. Обов'язковий параметр — номер запису, що заміщається. Функція повинна повертати нульове значення, якщо запис пройшов успішно, і –1 у противному випадку.

Привести приклад програми, що створює файл із даними про сканери (дані вводяться з клавіатури) з восьми записів і здійснює вставку нових даних про сканер.

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

Варіант 7

Для збереження даних про планшетні сканери описати структуру виду, описаного у варіанті 1.

Написати функцію, що записує в бінарний файл дані про сканер із приведеної структури. Структура файлу: у перших двох байтах розміщається значення типу int, що визначає кількість зроблених у файл записів; далі без пропусків розміщаються записи про сканери.

Написати функцію, що вводить дані про сканер із клавіатури в структуру типу scan_info, і якщо дані про цей сканер відсутні у файлі, поміщає вміст структури в кінець файлу; у противному випадку видає відповідне повідомлення.

Привести приклад програми, що створює файл із даними про сканери (дані вводяться з текстового файлу) — 6–8 записів і доповнює файл записами по 2–3 сканерах, що вводяться з клавіатури.

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

Варіант 8

Для збереження даних про планшетні сканери описати структуру виду, описаного у варіанті 1.

Написати функцію, що записує в бінарний файл дані про сканер із приведеної структури. Структура файлу: у перших двох байтах розміщається значення типу int, що визначає кількість зроблених у файл записів; далі без пропусків розміщаються записи про сканери.

Написати функцію, що вводить дані про сканер із клавіатури в структуру типу scan_info і поміщає її вміст на місце першого запису у файлі. Файл повинен існувати. При цьому, запис, який раніше займав першу позицію, ставиться на другу, другу на третю і т.д.

Привести приклад програми, що створює файл із даними про сканери (дані вводяться з текстового файлу) — 6–8 записів і доповнює цей файл 1–2 новими записами, що вводяться з клавіатури.

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

Варіант 9

Для збереження даних про планшетні сканери описати структуру виду, описаного у варіанті 1.

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

Написати функцію, що записує даний масив у створюваний бінарний файл. Якщо ціна сканера менше 200, то дані про цей сканер у файл не записуються. Інформація про інші сканери записується в бінарний файл, причому спочатку пишуться дані про всі сканери, ім'я яких починається з заголовної букви, а потім — із прописної.

Структура файлу: у перших чотирьох байтах розміщається значення типу long, що визначає кількість зроблених у файл записів; далі без пропусків розміщаються записи про сканери.

Привести приклад програми, що створює файл із даними про сканери і здійснює вивід на дисплей даних про необхідний запис (або всіх, або по номері).

Усі необхідні дані для функцій повинні передаватися їм як параметри. Використання глобальних перемінних у функціях не допускається

Варіант 10

Для збереження даних про ноутбук описати структуру виду:

struct NOTEBOOK{

char model[21]; // найменування

struct size{ // габаритні розміри

float x;

float y;

float z; };

float w; // вага

int price; // ціна

}

Написати функцію, що читає дані про ноутбук з файлу note.txt (див. c. note.txt) у стуктуру приведеного виду. Написати функцію, що записує вміст структури в кінець бінарного файлу. Структура бінарного файлу: перші два байти (ціле) — число записів у файлі; далі записи у форматі структури NOTEBOOK.

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

Варіант 11

Для збереження даних про ноутбук описати структуру виду, описаного у варіанті 10.

Написати функцію, що читає дані про ноутбук з файлу note.txt (див. c. note.txt) у структуру приведеного виду. Написати функцію, що записує вміст структури в кінець бінарного файлу. Структура бінарного файлу: перші два байти (ціле) — число записів у файлі; далі записи у форматі структури NOTEBOOK.

Написати програму, у якій на основі розроблених функцій здійснюється читання даних тільки для тих ноутбуків, обсяг HDD яких менше 1 Гб, і запис зчитаних даних у бінарний файл за абеткою по найменуванню.

Варіант 12

Для збереження даних про ноутбук описати структуру виду, описаного у варіанті 10.

Написати функцію, що читає дані про ноутбук з файлу note.txt (див. c. note.txt) у структуру приведеного виду. Написати функцію, що записує вміст структури в кінець бінарного файлу. Структура бінарного файлу: перші два байти (ціле) — число записів у файлі; далі записи у форматі структури NOTEBOOK.

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

Варіант 13

Для збереження даних про ноутбук описати структуру виду, описаного у варіанті 10.

Написати функцію, що читає дані про ноутбук з файлу note.txt (див. c. note.txt) у структуру приведеного виду. Написати функцію, що записує вміст структури в кінець бінарного файлу. Структура бінарного файлу: перші два байти (ціле) — число записів у файлі; далі записи у форматі структури NOTEBOOK.

Написати програму, у якій на основі розроблених функцій здійснюється запис у двійковий файл даних тільки про ті ноутбуки, максимальний обсяг ОЗП яких не менша 40Мб, відсортованих по обсягу.

Варіант 14

Для збереження даних про ноутбук описати структуру виду, описаного у варіанті 10.

Написати функцію, що читає дані про ноутбуках з файлу note.txt (див. c. note.txt) у структуру приведеного виду. Написати функцію, що записує вміст структури в кінець бінарного файлу. Структура бінарного файлу: перші два байти — ціле число записів у файлі; далі записи у форматі структури NOTEBOOK.

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

Варіант 15

Для збереження даних про ноутбук описати структуру виду:

struct NOTEBOOK{

struct disp_res{ // роздільна здатність дисплея

int x; // по горизонталі

int y; // по вертикалі

};

int f; // частота регенерації

float d; // розмір діагоналі дисплея

int price; // ціна

char model[21]; // найменування

}

Написати функцію, що читає дані про ноутбук з файлу note.txt (див. c. note.txt) у структуру приведеного виду. Написати функцію, що записує вміст структури в кінець бінарного файлу. Структура бінарного файлу: перші два байти — ціле число записів у файлі; далі записи у форматі структури NOTEBOOK.

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

Варіант 16

Для збереження даних про ноутбук описати структуру виду, описаного у варіанті 15.

Написати функцію, що читає дані про ноутбуках з файлу note.txt (див. c. note.txt) у структуру приведеного виду. Написати функцію, що записує вміст структури в кінець бінарного файлу. Структура бінарного файлу: перші два байти — ціле число записів у файлі; далі записи у форматі структури NOTEBOOK.

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

Варіант 17

Для збереження даних про ноутбук описати структуру виду, описаного у варіанті 15.

Написати функцію, що читає дані про ноутбук з файлу note.txt (див. c. note.txt) у структуру приведеного виду. Написати функцію, що записує вміст структури в кінець бінарного файлу. Структура бінарного файлу: перші два байти — ціле число записів у файлі; далі записи у форматі структури NOTEBOOK.

Написати програму, у якій на основі розроблених функцій здійснюється запис у двійковий файл даних тільки про ті ноутбуки, обсяг HDD яким більше 1Гб, відсортованих у порядку зростання розміру діагоналі дисплея.

Варіант 18

Для збереження даних про ноутбук описати структуру виду, описаного у варіанті 15.

Написати функцію, що читає дані про ноутбук з файлу note.txt (див. c. note.txt) у структуру приведеного виду. Написати функцію, що записує вміст структури в кінець бінарного файлу. Структура бінарного файлу: перші два байти — ціле число записів у файлі; далі записи у форматі структури NOTEBOOK.

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

Варіант 19

Для збереження даних про ноутбук описати структуру виду:

struct NOTEBOOK{

struct disp_res{ //роздільна здатність дисплея

int x; // по горизонталі

int y; // по вертикалі

};

int f; // частота регенерації

float d; // розмір діагоналі дисплея

float hdd; // розмір диска

char model[21]; // найменування

}

Написати функцію, що читає дані про ноутбук з файлу note.txt (див. c. note.txt) у структуру приведеного виду. Написати функцію, що записує вміст структури в кінець бінарного файлу. Структура бінарного файлу: перші два байти — ціле число записів у файлі; далі записи у форматі структури NOTEBOOK.

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

Варіант 20

Для збереження даних про ноутбук описати структуру виду, описаного у варіанті 19.

Написати функцію, що читає дані про ноутбук з файлу note.txt (див. c. note.txt) у структуру приведеного виду. Написати функцію, що записує вміст структури в кінець бінарного файлу. Структура бінарного файлу: перші два байти — ціле число записів у файлі; далі записи у форматі структури NOTEBOOK.

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

Приклад файлу note.txt:

Aser Note Light 2699 5.6 02.0x11.8x08.3 100 40 10.4 1 1024x0768 60 0.774

ASW ND5123T 3489 7.2 02.3x11.8x10.1 133 32 12.1 2 1024x0768 70 1.300

ARMNote TS80CD 3699 7.2 02.0x11.5x08.8 133 64 11.3 1 1024x0768 75 1.300

AST Ascentia P50 4499 7.5 02.3x11.3x09.0 133 40 11.3 1 0800x0600 70 0.774

BSI NP8657D 2605 8.0 02.3x11.8x09.3 133 40 11.3 1 1024x0768 60 0.810

BSI NP5265A 3765 8.2 02.5x12.0x09.0 150 32 12.1 2 1024x0768 70 1.300

Dell Xpi P100SD 3459 6.0 02.3x11.0x08.8 100 40 10.3 1 1024x0768 60 0.773

Digital HiNote 4799 4.0 01.3x11.0x08.8 120 40 10.4 1 0800x0600 56 1.000

Gateway Solo S5 4499 5.6 02.0x11.9x08.8 133 40 11.3 2 1024x0768 60 0.686

Hertz Z-Optima NB 3995 8.0 02.3x11.9x09.0 150 40 11.2 2 1024x0768 75 1.000

HP OmniBook 5500 6120 7.1 02.0x11.5x09.0 133 64 11.4 1 1024x0768 75 1.300

IBM ThinkPad 560 3749 4.1 01.3x11.8x08.8 120 40 12.1 2 1024x0768 85 0.774

NEC Versa 4080H 4780 6.6 02.3x11.8x09.5 120 48 10.4 1 0800x0600 70 0.776

Polywell Poly 500 3300 7.9 02.3x11.9x09.0 120 40 10.4 1 1024x0768 72 1.000

Samsung SENS 810 3667 8.7 02.3x11.5x09.5 100 32 11.4 2 1024x0768 75 0.773

Twinhead Slimnote 2965 7.4 02.0x11.5x08.0 075 64 10.4 1 1024x0768 70 0.772

Опис файлу note.txt:

У файлі note.txt міститься текстова інформація про ноутбук. Кожен рядок містить дані про одну модель. Дані в рядку розміщаються в наступних полях:

1:20 — найменування моделі;

21:24 — ціна в доларах (ціле число);

26:28 — маса ноутбука в кг (число з десятковою крапкою з чотирьох символів);







Последнее изменение этой страницы: 2016-04-18; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 35.172.233.215 (0.057 с.)