Втора курсова задача
по ПСД

    Номерът на курсовата задача се получава като резултат от операцията "остатък от целочислено деление" в С++. Първият аргумент на операцията е факултетният номер на студента, а вторият аргумент е числото 46 (ф.н. % 46).



    00. Напишете програма за сливане на два сортирани файла от цели числа така, че получения файл също да бъде сортиран, като се използва последователен достъп до файловете.
    01. Създайте клас Address. Адресът съдържа улица или жилищен комплекс, номер на сграда, номер на апартамент, град и пощенски код. Реализирайте член-функция commes_before, която проверява дали един адрес е преди друг, като адресите се сравняват па пощенски код. Създайте файл с адреси, като четете и пишете адреси (последователен достъп) в този файл.
    02. Реализирайте клас Rectangle (правоъгълник), който работи като другите графични класове - напр. Circle. Правоъгълник се задава с два срещуположни върха (ляво-горе и дясно-долу) и страните му са успоредни на координатните оси. Дефинирайте член-функция plot за чертаене на правоъгълник. Напишете функция, която чете от файл няколко правоъгълника и ги чертае на графичния екран.
    03. Напишете предикатна функция
bool equal(vector<int> a, vector<int>b)
която проверява дали двата вектора са еднакви - имат еднаква дължина и равни съответни елементи. Векторите за сравняване се четат от файл.
    04. Напишете предикатна функция
bool same_set(vector<int> a, vector<int>b)
която проверява дали двата вектора съдържат еднакви елементи в произволен ред, като се игнорират повторенията. Например векторите 1 4 9 16 7 9 и 7 7 7 16 9 1 1 4 се смятат за идентични. Векторите за сравняване се четат от файл.
    05. Напишете предикатна функция
bool same_elements(vector<int> a, vector<int>b)
която проверява дали двата вектора съдържат еднакви елементи в произволен ред, но с еднакъв брой повторения. Например векторите 1 4 9 16 7 9 и  7 16 9 9 1 4 се смятат за идентични, а векторите 1 4 9 16 7 9 и  7 16 9 1 1 - не. Векторите за сравняване се четат от файл.
    06.  Напишете функция  sremove_duplicates, която отстранява повтарящи се елементи от вектор. Например ако функцията се извика с вектор 1 4 9 16 7 9, тя трябвя да го промени на 1 4 9 16 7. Векторът се чете от файл и промененият вектор се записва отново във файл.
    07. Дефинирайте клас Student. Всеки студент има име и рожден ден. Създайте вектор
vector<Student> friends;
Прочетете последователност от имена и рожденни дати от файл и запълнете с нея вектора friends. След това създайте файл с имената на всички приятели, чиито рождени дати са през зададен от клавиатурата месец.
    08. Напишете програма, която разпределя местата в самолет. Нека самолетът има 20 места в първа класа (5 реда по 4 места) и 180 места във втора класа (30 реда по 6 места). Програмата трябва да приема 3 команди - прибавяне на пътници, показване на местата и край. При прибавяне на пътници си пита за класата, броя на пътниците, пътуващи заедно (1 или 2 за първа класа и от 1 до 3 за втора класа), за предпочитаното място (до пътеката, в средете или до прозореца). Програмата се опитва да намери подходящите места и ги резервира. Съхранявайте на файл данните за местата в самолета.
    09. Напишете програма за играта Life. Правилата ще намерите на
http://www.bitstorm.org/gameoflife/
Четете началната позиция от файл и записвайте крайната позиция също на файл.
    10. Напишете програма, която чете файл на български език и смята честотата на срещане на българските букви в текста.
    11. Преработете програмата ceasar.cpp от 14. Потоци да кодира и декодира текст на български език, като се използва българската азбука.  Напомняме, че има особености при използване на български букви в типа string.
    12. Даден е файл, съдържащ текст на английски език. Всяка дума от текста да се запише в отделен файл, чието име е първата буква от думата, а ако файл с това име вече съществува, да се добавя поредно число. Например думите are, alone и air се записват във файлове с имена a1, a2 и a3. Името на файла с текста се задава от командния ред.
    13. Преработете програмата database.cpp от 14. Потоци като вместо номер на запис се въвежда име на служител. Програмата намира записа за този служител и го показва. След това програмата предлага следните възможности: промяна на заплатата в този запис, показване на следващ запис, намиране на друг служител, край.
    14. Дадени са два текстови файлове. Направете нов файл, съдържащ всички думи от първия файл (по веднаж всяка дума), които се съдържат и във втория файл. Имената на файловете се задават от командния ред.
    15. Напишете програма, която съхранява база данни за служители (име и заплата) във файл с произволен достъп. Реализирайте функции за добавяне и изтриване на служител. За да изтриете служител, запълнете записа му с интервали. Когато добавяте служител, го добавете на най-напред във файла - на първото празно място.
    16. Напишете програма, която обработва 3 файла с данни. Първият файл съдържа имената и телефонните номера на група хора. Вторият файл съдържа имената и номерата на социалните осигуровки на група хора. Третият файл съдържа номерата на социалните осигуровки и годишните заплати на група хора. Групите се припокриват, но не са непременно идентични. Програмата пита за телефонен номер и отпечатва съответното име, номер на социална осигуровка и годишен доход, ако тази информация се съдържа във файловете.
    17. Банка съхранява сметките си във файл с произволен достъп, в които всеки запис има вида номер_на_сметка сума. Напишете програма, която симулира банкомат. Клиентът може да внася пари, като зададе номера на сметката и сумата, да тегли пари, да се осведомява за сумата в сметката и да прехвъля сума от една сметка в друга.
    18. Напишете програма copyfile, която копира един файл в друг, като имената на файловете се задават от командния ред.
    19. Напишете програма catfile, която конкатенира (съединява) няколко файла в един, като имената на файловете се задават от командния ред. Името на съединения файл е последно в редицата файлове на командния ред.
    20. Напишете програма find, която претърсва файлове и отпечатва всички редове от тези файлове, съдържащи дадена дума. Програмата се извиква с аргументи от командния ред. Например
find Kirov report.txt all.txt me.txt
търси думата Kirov във файловете report.txt, all.txt и me.txt.
    21. Напишете програма reverse, която отваря файл за четене и писане и заменя всеки ред от него с обратния му. Например реда abcd efgh се заменя с hgfe dcba. Името на файловете се задава от командния ред.
    22. Напишете програма, която разделя (двоичен) файл на няколко файла с дължини не по-голяма от 1.4 МБ и може да свърже тези файлове, като възстановява оригиналния файл. Имената на файловете и режима на работа на програмата (разделяне или свързване) се задават от командния ред.
    23. Напишете програма за прекодиране на файлове съдържащи български текст в кодировка Windows-1251 във файл с кодировка на DOS кирилица и обратно, като имената на файловете се задават от командния ред.
    24. Даден е текстов файл. Намерете броя на всички N-буквени думи във файла за всяко N = 2, 3, ... Дума се дефинира като поредица от български букви. Името на файла се задава от командния ред.
    25. Напишете програма, която създава файл съдържащ N случайни цели числа. Програмата да прочете този файл и да създаде текстов файл, който съдържа числата, наредени по големина.
    26. Даден е текстов файл. Направете нов файл, съдържащ всички N-буквени думи от файла, наредени по азбучен ред (лексикографски), като имената на двата файла и числото N се задават от командния ред.
    27. Даден е текстов файл, който съдържа цели числа. От този файл създайте 2 нови файла - единия съдържащ числата, по-големи от зададено число x, а другия - числата по-малки от x. Имената на трите файла и числото x се задават от командния ред.
    28. Напишете програма, която копира един текстов файл в нов файл, като записва думите на файла в обратен ред (напр. файл, съдържащ думите "кон яздя мамо" се преобразува във файл, съдържащ думите "нок ядзя омам"). Имената на файловете се задават от командния ред.
    29. Даден е текстов файл с текст на български език. Намерете броя на всички думи във файла, които започват с главна буква.
    30. Създайте вектор с елементи обекти от клас Student с данни: име, презиме и фамилия на студент и факултетен номер. Напишете функции за добавяне и премахване на елементи на вектора, за четене от файл и записване на файл на вектора.
    31. Създайте вектор с елементи обекти от клас Book с данни: име на автор, заглавие на книга, име на издателство и година на издаване. Напишете функции за добавяне и премахване на елементи на вектора, за четене от файл и записване на файл на вектора.
    32. Направете програма, която създава малка база данни от обекти от клас Phonebook с данни: име и телефонен номер. Програмата записва във файлове сортираната по телефонни номера и по имена база данни.
    33. Дадена е прекодираща таблица, като на всяка дума от някакво множество от думи съпоставя цяло число - код на думата. Таблицата е реализирана като файл от записи с две полета: дума и код на думата. Напишете програма, която кодира и декодира файл от думи (от зададеното множиство).
    34. Даден е файл с различни дати. Всяка дата се състои от ден, месец, година. Напишете програма, която намира: най-малката година; всички зимни дати; най-късната дата. Името на файла се задава от командния ред.
    35. Направете програма, която създава малка база данни от обекти от клас Phonebook с данни: име и телефонен номер. Програмата записва във файл базата данни. Реализирайте функции за търсене в несортираната база данни по име и по телефонен номер.
    36. Напишете програма replace, която търси в текстов файл даден низ и заменя този низ (навсякъде, където се среща във файла) с друг низ със същата дължина. Името на файла и низа се задават от командния ред.
    37. Напишете програма за въвеждане на дати и текст към всяка дата. Програмата сортира вектора по дати, извежда го на екрана и го записва във файл. Името на файловете се задава от командния ред.
    38. Напишете програма за конструиране на вектор с елементи обекти от клас Magazine с данни: име на списание, година и месец на издаване. Направете програма за сортировка на списанията по времето на издаването и записването на сортирания вектор на файл.
    39. Напишете програма за сортиране (метод по избор) на файл, съдържащ числа тип double, като се използва пряк достъп до файла. Името на файла се задава от командния ред.
    40. Реализирайте клас Triangle (триъгълник), който работи като другите графични класове - напр. Circle. Триъгълник се задава с трите си върха. Дефинирайте член-функция plot за чертаене на триъгълник. Напишете функция, която чете от файл няколко триъгълника и ги чертае на графичния екран.
    41. Напишете програма, която създава файл от думи. Създаването на файла завършва след въвеждане на думата zzz. Програмата сгъстява файла, като изключва от него всички повтарящи се думи. Името на файла се задава от командния ред.
    42. Даден е файл, съдържащ фамилни имена и адреси. Напишете програма, която намира колко пъти всяко име се съдържа във файла. Името на файла се задава от командния ред.
    43. Напишете програма, която създава файл от двойки думи - първата е на английски език и втората е преводът й на български език.  Напишете функция, която при зададена дума на английски език намира превода й на български и обратно. Името на файла се задава от командния ред.
    44. Даден е файл от цели числа. Напишете функция, която установява дали елементите на файла са различни (т.е. дали всички числа във файла са различни).
    45. Напишете програма compare, която сравнява два текстови файла и извежда всички различия на екрана. Имената на файловете се задават от командния ред.
 

Забележка 1. Предполагаме, че файловете в задачи 00, 10, 14, 16-29, 34, 36, 39, 42, 44-45 са големи и не могат да се запишат като вектор в оперативната памет.

Забележка 2. Дума се дефинира като поредица от български или английски букви.