Объяснение:
C++Выделить код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/*
*Лабораторная работа: 7.
*Тема: Строки и файлы. Организация работы со строками и файлами.
*Пункт: 5.2. Файловый тип данных.
*Файл: Lab07_YaP_2019_1S.pdf
*
*Язык: C++.
*Среда: Microsoft Visual Studio 2019 v16.3.0.
*Платформа: x64.
*Изменение: 06.01.2020.
*
*Вариант: 13.
*Защита: 15.11.2019.
*Задание: БН. Написать программу, которая считывает Английский текст из файла и выводит его на экран, заменив каждую первую букву слов,
* начинающихся с гласной буквы, на прописную.
*/
#include <iostream> // Треб. для SETLOCATE, PRINTF, GETLINE, STRLEN, CIN, COUT. //
#include <fstream> // Требуется для FSTREAM. //
#include "Header.h"
void main () {
setlocale (LC_ALL, "Russian");
char SourceArray [Dimension + 1] = " "; // SOURCEARRAY [100] = 101 (для "\0"). //
char LettersArray [Dimension - 72] = " "; // [0]..[25] = 1..26 (для ввода с клавиатуры), [26] = 27
char PathTextFile [Dimension + 1] = " "; // (для "\0"). //
printf ("1. Латинский алфавит (26 букв): a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z.\n\n2. Введите"
" путь и имя файла (до %d символов, включительно): ", Dimension);
cin.getline (PathTextFile, Dimension);
fstream TextFile (PathTextFile, ios::trunc | ios::in | ios::out); // TRUNC - создание, IN - режим записи, OUT - режим чтения. //
if (!TextFile) {
MessageFunction (); // Выводится на экран, если файл открыть не удалось. //
}
printf ("\n3. Введите строчные Латинские буквы, которые следует заменить на прописные (до %d символов, включительно):\n\n",
Dimension - 73);
cin.getline (LettersArray, Dimension - 72);
if (strlen (LettersArray) < 1) {
TextFile.close (); // Закрытие файла. //
MessageFunction ();
}
printf ("\n4. Введите строку (до %d символов, включительно):\n\n", Dimension);
cin.getline (SourceArray, Dimension);
if (strlen (SourceArray) < 1) {
TextFile.close (); // Закрытие файла. //
MessageFunction ();
}
TextFile << SourceArray; // Запись SOURCEARRAY в файл. //
TextFile.close (); // Закрытие файла. //
ChangeFunction (LettersArray, PathTextFile);
printf ("\n5. Исходная строка после замены:\n\n");
WriteArrayFunction (PathTextFile);
remove (PathTextFile); // Удаление файла. //
cout << endl << endl;
ExitProgramFunction ();
}
Шаг 1.
В алфавите, согласно условию задачи, ровно 15 символов.
Шаг 2.
Давайте посмотрим, сколько нужно минимум выделить бит на 1 символ из алфавита, состоящего из 15 символов.
Если бы мы выделили 1 бит информации, то он бы смог закодировать 1 символ алфавита, состоящего не более чем из 2 символов. А у нас их 15 Значит, 1 бита мало.
Если выделить 2 бита, то закодировать можно символ в алфавите максимум из 4 символов. Мало.
Если выделить 3 бита, то закодировать можно символ в алфавите максимум из 8 символов. Мало.
Если выделить 4 бита, то закодировать можно символ в алфавите максимум из 16 символов. Достаточно.
Значит, для кодирования 1 символа данного алфавита достаточно 4 бит.
Шаг 3.
1 пароль состоит из 15-ти символов.
1 символ "весит" 4 бита.
Значит, 15 символов будут "весить" 15х4=60 бит.
Шаг 4.
1 пароль по условию кодируется минимально возможным целым количеством байт.
Сколько байт нужно для хранения пароля из 60 бит?
7 байт мало, так как 7 байт = 7х8 = 56 бит.
8 байт — в самый раз: 8 байт = 8х8=64 бита.
Следовательно, для хранения одного пароля нужно 8 байт.
Шаг 5
Один пароль "весит" 8 байт.
У нас — 20 пользователей (и 20 паролей соответственно).
Следовательно, они "весят" 8х20 = 160 байт.
Шаг 6
Выделено было 400 байт под пароли.
Чисто на хранение, согласно п.5, было использовать 160 байт.
Значит, осталось на дополнительную информацию300-160=140 байт.
Шаг 7
140 дополнительных байт имеется подо все пароли.
Всего паролей — 20.
Значит, под каждый дополнительно выделяется 140/20=7 байт.
ответ: по 7 байт дополнительно выделено для хранения одного пароля.
Объяснение: