Родитель
c4b25533eb
Сommit
045ed586b7
@ -0,0 +1,167 @@
|
||||
#include <cstddef>
|
||||
#include <cstdint>
|
||||
#include <cstring>
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
#include <windows.h> // Äîáàâëåíî äëÿ ðàáîòû ñ êîäèðîâêîé
|
||||
|
||||
// Ñòðóêòóðà ñ áèòîâûì ïîëåì è îáÿçàòåëüíûìè àòðèáóòàìè
|
||||
struct Student {
|
||||
char name[17];
|
||||
uint16_t year;
|
||||
float gpa;
|
||||
uint8_t gender : 1; // 0 — æåí, 1 — ìóæ
|
||||
uint8_t courses : 7;
|
||||
Student* captain;
|
||||
};
|
||||
|
||||
// Ïå÷àòü îäíîãî áàéòà â hex
|
||||
static void print_in_hex(uint8_t byte) {
|
||||
static const char digits[] = "0123456789ABCDEF";
|
||||
std::cout << digits[byte >> 4] << digits[byte & 0x0F];
|
||||
}
|
||||
|
||||
// Ïå÷àòü áëîêà â hex ñ ðàçðûâîì ñòðîê êàæäûå 16 áàéò
|
||||
static void print_in_hex(const void* data, size_t size) {
|
||||
const uint8_t* bytes = static_cast<const uint8_t*>(data);
|
||||
for (size_t i = 0; i < size; ++i) {
|
||||
print_in_hex(bytes[i]);
|
||||
if (i + 1 != size) {
|
||||
std::cout << ' ';
|
||||
}
|
||||
if ((i + 1) % 16 == 0 && i + 1 != size) {
|
||||
std::cout << '\n';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Ïå÷àòü îäíîãî áàéòà â äâîè÷íîì âèäå
|
||||
static void print_in_binary(uint8_t byte) {
|
||||
for (int bit = 7; bit >= 0; --bit) {
|
||||
std::cout << ((byte >> bit) & 1);
|
||||
}
|
||||
}
|
||||
|
||||
// Ïå÷àòü áëîêà â äâîè÷íîì âèäå ñ ïåðåâîäîì ñòðîêè êàæäûå 4 áàéòà
|
||||
static void print_in_binary(const void* data, size_t size) {
|
||||
const uint8_t* bytes = static_cast<const uint8_t*>(data);
|
||||
for (size_t i = 0; i < size; ++i) {
|
||||
print_in_binary(bytes[i]);
|
||||
if (i + 1 != size) {
|
||||
std::cout << ' ';
|
||||
}
|
||||
if ((i + 1) % 4 == 0 && i + 1 != size) {
|
||||
std::cout << '\n';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
// Íàñòðîéêà êîäèðîâêè êîíñîëè äëÿ ðóññêîãî òåêñòà
|
||||
SetConsoleOutputCP(1251);
|
||||
SetConsoleCP(1251);
|
||||
|
||||
Student group[3]{};
|
||||
|
||||
// Ñòàðîñòà
|
||||
strcpy_s(group[0].name, "Smirnov Denis"); // Èñïðàâëåíî
|
||||
group[0].year = 2022;
|
||||
group[0].gpa = 4.6f;
|
||||
group[0].gender = 1;
|
||||
group[0].courses = 3;
|
||||
group[0].captain = nullptr;
|
||||
|
||||
// Ñòóäåíòêè
|
||||
strcpy_s(group[1].name, "Kuznetsova Al"); // Èñïðàâëåíî
|
||||
group[1].year = 2022;
|
||||
group[1].gpa = 4.9f;
|
||||
group[1].gender = 0;
|
||||
group[1].courses = 3;
|
||||
group[1].captain = &group[0];
|
||||
|
||||
strcpy_s(group[2].name, "Belova Irina"); // Èñïðàâëåíî
|
||||
group[2].year = 2021;
|
||||
group[2].gpa = 4.3f;
|
||||
group[2].gender = 0;
|
||||
group[2].courses = 4;
|
||||
group[2].captain = &group[0];
|
||||
|
||||
std::cout << "1) Ìàññèâ ñòóäåíòîâ\n";
|
||||
std::cout << " Àäðåñ: " << static_cast<const void*>(group) << '\n';
|
||||
std::cout << " Ðàçìåð: " << sizeof(group) << " áàéò\n\n";
|
||||
|
||||
std::cout << "2) Ýëåìåíòû ìàññèâà\n";
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
std::cout << " #" << i << " àäðåñ: " << static_cast<const void*>(&group[i])
|
||||
<< " ðàçìåð: " << sizeof(Student) << " áàéò\n";
|
||||
}
|
||||
std::cout << '\n';
|
||||
|
||||
std::cout << "3) Ïîëÿ âòîðîãî ñòóäåíòà (áåç ïîëà)\n";
|
||||
std::cout << " name\n";
|
||||
std::cout << " àäðåñ: " << static_cast<void*>(group[1].name) << '\n';
|
||||
std::cout << " ñìåùåíèå: " << offsetof(Student, name) << '\n';
|
||||
std::cout << " ðàçìåð: " << sizeof(group[1].name) << " áàéò\n";
|
||||
std::cout << " hex:\n";
|
||||
print_in_hex(group[1].name, sizeof(group[1].name));
|
||||
std::cout << "\n bin:\n";
|
||||
print_in_binary(group[1].name, sizeof(group[1].name));
|
||||
std::cout << "\n\n";
|
||||
|
||||
std::cout << " year\n";
|
||||
std::cout << " àäðåñ: " << static_cast<const void*>(&group[1].year) << '\n';
|
||||
std::cout << " ñìåùåíèå: " << offsetof(Student, year) << '\n';
|
||||
std::cout << " ðàçìåð: " << sizeof(group[1].year) << " áàéò\n";
|
||||
std::cout << " hex:\n";
|
||||
print_in_hex(&group[1].year, sizeof(group[1].year));
|
||||
std::cout << "\n bin:\n";
|
||||
print_in_binary(&group[1].year, sizeof(group[1].year));
|
||||
std::cout << "\n\n";
|
||||
|
||||
std::cout << " gpa\n";
|
||||
std::cout << " àäðåñ: " << static_cast<const void*>(&group[1].gpa) << '\n';
|
||||
std::cout << " ñìåùåíèå: " << offsetof(Student, gpa) << '\n';
|
||||
std::cout << " ðàçìåð: " << sizeof(group[1].gpa) << " áàéò\n";
|
||||
std::cout << " hex:\n";
|
||||
print_in_hex(&group[1].gpa, sizeof(group[1].gpa));
|
||||
std::cout << "\n bin:\n";
|
||||
print_in_binary(&group[1].gpa, sizeof(group[1].gpa));
|
||||
std::cout << "\n\n";
|
||||
|
||||
std::cout << " captain\n";
|
||||
std::cout << " àäðåñ: " << static_cast<const void*>(&group[1].captain) << '\n';
|
||||
std::cout << " ñìåùåíèå: " << offsetof(Student, captain) << '\n';
|
||||
std::cout << " ðàçìåð: " << sizeof(group[1].captain) << " áàéò\n";
|
||||
std::cout << " hex:\n";
|
||||
print_in_hex(&group[1].captain, sizeof(group[1].captain));
|
||||
std::cout << "\n bin:\n";
|
||||
print_in_binary(&group[1].captain, sizeof(group[1].captain));
|
||||
std::cout << "\n\n";
|
||||
|
||||
std::cout << "4) Ñòðóêòóðû â hex\n";
|
||||
for (int i = 0; i < 3; ++i) {
|
||||
std::cout << " Ñòóäåíò #" << i
|
||||
<< (i == 0 ? " (ñòàðîñòà)" : "") << '\n';
|
||||
std::cout << " âñå ïîëÿ:\n";
|
||||
print_in_hex(&group[i], sizeof(Student));
|
||||
std::cout << '\n';
|
||||
std::cout << " name:\n";
|
||||
print_in_hex(&group[i].name, sizeof(group[i].name));
|
||||
std::cout << '\n';
|
||||
std::cout << " year:\n";
|
||||
print_in_hex(&group[i].year, sizeof(group[i].year));
|
||||
std::cout << '\n';
|
||||
std::cout << " gpa:\n";
|
||||
print_in_hex(&group[i].gpa, sizeof(group[i].gpa));
|
||||
std::cout << '\n';
|
||||
uint8_t packed = static_cast<uint8_t>((group[i].gender << 7) | group[i].courses);
|
||||
std::cout << " gender+courses (áàéò):\n";
|
||||
print_in_hex(&packed, sizeof(packed));
|
||||
std::cout << '\n';
|
||||
std::cout << " captain:\n";
|
||||
print_in_hex(&group[i].captain, sizeof(group[i].captain));
|
||||
std::cout << "\n\n";
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -0,0 +1,149 @@
|
||||
#include <cctype>
|
||||
#include <cstdio>
|
||||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <windows.h> // Äîáàâëåíî äëÿ ðàáîòû ñ êîäèðîâêîé
|
||||
|
||||
// Ìàêñèìóìû äëÿ áóôåðîâ (ñòåêîâûå ìàññèâû)
|
||||
constexpr std::size_t kMaxFilenameLen = 260;
|
||||
constexpr std::size_t kMaxQueryLen = 256;
|
||||
|
||||
// Íàáîð çàïðåùåííûõ ñèìâîëîâ äëÿ èìåíè ôàéëà (Windows)
|
||||
constexpr const char* kForbidden = "*\"<>?|";
|
||||
|
||||
// Ïðîâåðêà âàëèäíîñòè èìåíè ôàéëà ïî ïðàâèëàì çàäàíèÿ
|
||||
bool validate_filename(const char* name) {
|
||||
// çàïðåòíûå ñèìâîëû
|
||||
for (const char* p = kForbidden; *p; ++p) {
|
||||
if (std::strchr(name, *p)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// äâîåòî÷èå
|
||||
const char* colon = std::strchr(name, ':');
|
||||
if (colon) {
|
||||
if (colon != name + 1) return false; // òîëüêî âòîðîé ñèìâîë
|
||||
if (!std::isalpha(static_cast<unsigned char>(name[0]))) return false;
|
||||
if (colon[1] != '\\') return false; // çà äâîåòî÷èåì îáðàòíàÿ êîñàÿ
|
||||
}
|
||||
|
||||
// ðàñøèðåíèå .txt (åñëè îíî åñòü)
|
||||
const char* dot = std::strrchr(name, '.');
|
||||
if (dot) {
|
||||
if (std::strlen(dot) != 4) return false; // ".txt"
|
||||
char ext[5]{};
|
||||
// Èñïðàâëåíî: strncpy_s âìåñòî strncpy
|
||||
strncpy_s(ext, sizeof(ext), dot, 4);
|
||||
for (char& c : ext) c = static_cast<char>(std::tolower(static_cast<unsigned char>(c)));
|
||||
if (std::strcmp(ext, ".txt") != 0) return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Äîáàâèòü .txt, åñëè òî÷êè íåò
|
||||
void ensure_txt_extension(char* name, size_t bufferSize) {
|
||||
if (std::strrchr(name, '.') == nullptr) {
|
||||
// Èñïðàâëåíî: strcat_s âìåñòî strcat
|
||||
strcat_s(name, bufferSize, ".txt");
|
||||
}
|
||||
}
|
||||
|
||||
// Ïîäñ÷èòàòü âõîæäåíèÿ ïîäñòðîêè sub â ñòðîêå text
|
||||
int count_occurrences(const char* text, const char* sub) {
|
||||
int count = 0;
|
||||
const std::size_t len = std::strlen(sub);
|
||||
if (len == 0) return 0;
|
||||
|
||||
const char* pos = text;
|
||||
while ((pos = std::strstr(pos, sub)) != nullptr) {
|
||||
++count;
|
||||
pos += len;
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
int main() {
|
||||
// Íàñòðîéêà êîäèðîâêè êîíñîëè äëÿ ðóññêîãî òåêñòà
|
||||
SetConsoleOutputCP(1251);
|
||||
SetConsoleCP(1251);
|
||||
|
||||
// 4.1: ââîä èìåíè ôàéëà (ñòåêîâûé áóôåð)
|
||||
char filename[kMaxFilenameLen]{};
|
||||
std::cout << "Ââåäèòå èìÿ ôàéëà: ";
|
||||
std::cin.getline(filename, kMaxFilenameLen);
|
||||
|
||||
// 4.2: ïðîâåðêà êîððåêòíîñòè
|
||||
if (!validate_filename(filename)) {
|
||||
std::cout << "Íåêîððåêòíîå èìÿ ôàéëà\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
// 4.3: äîáàâèòü .txt ïðè îòñóòñòâèè
|
||||
ensure_txt_extension(filename, sizeof(filename));
|
||||
if (!validate_filename(filename)) {
|
||||
std::cout << "Èìÿ íåêîððåêòíî ïîñëå äîáàâëåíèÿ .txt\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
// 4.4: ÷òåíèå ôàéëà ïîëíîñòüþ â äèíàìè÷åñêèé áóôåð
|
||||
FILE* f = nullptr;
|
||||
// Èñïðàâëåíî: fopen_s âìåñòî fopen
|
||||
if (fopen_s(&f, filename, "rb") != 0 || !f) {
|
||||
std::cout << "Íå óäàëîñü îòêðûòü ôàéë: " << filename << "\n";
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (std::fseek(f, 0, SEEK_END) != 0) {
|
||||
std::cout << "Îøèáêà ïåðåìåùåíèÿ â êîíåö ôàéëà\n";
|
||||
std::fclose(f);
|
||||
return 1;
|
||||
}
|
||||
|
||||
long sz = std::ftell(f);
|
||||
if (sz < 0) {
|
||||
std::cout << "Íå óäàëîñü îïðåäåëèòü ðàçìåð ôàéëà\n";
|
||||
std::fclose(f);
|
||||
return 1;
|
||||
}
|
||||
std::rewind(f);
|
||||
|
||||
char* buffer = static_cast<char*>(std::malloc(static_cast<std::size_t>(sz) + 1));
|
||||
if (!buffer) {
|
||||
std::cout << "Íå óäàëîñü âûäåëèòü ïàìÿòü\n";
|
||||
std::fclose(f);
|
||||
return 1;
|
||||
}
|
||||
|
||||
std::size_t read = std::fread(buffer, 1, static_cast<std::size_t>(sz), f);
|
||||
if (read != static_cast<std::size_t>(sz)) {
|
||||
std::cout << "Îøèáêà ÷òåíèÿ ôàéëà\n";
|
||||
std::free(buffer);
|
||||
std::fclose(f);
|
||||
return 1;
|
||||
}
|
||||
buffer[sz] = '\0';
|
||||
std::fclose(f);
|
||||
|
||||
// 4.5: ââîä èñêîìîé ñòðîêè (ñòåêîâûé áóôåð)
|
||||
char query[kMaxQueryLen]{};
|
||||
std::cout << "Ââåäèòå ñòðîêó äëÿ ïîèñêà: ";
|
||||
std::cin.getline(query, kMaxQueryLen);
|
||||
|
||||
// 4.6: ïîäñ÷¸ò âõîæäåíèé
|
||||
const std::size_t qlen = std::strlen(query);
|
||||
if (qlen == 0) {
|
||||
std::cout << "Ïóñòàÿ ñòðîêà ïîèñêà\n";
|
||||
std::free(buffer);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int hits = count_occurrences(buffer, query);
|
||||
std::cout << "×èñëî âõîæäåíèé \"" << query << "\": " << hits << "\n";
|
||||
|
||||
// 4.7: îñâîáîæäåíèå ïàìÿòè
|
||||
std::free(buffer);
|
||||
return 0;
|
||||
}
|
||||
Загрузка…
Ссылка в новой задаче