НЕКОММЕРЧЕСКОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО


НЕКОММЕРЧЕСКОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО
АЛМАТИНСКИЙ УНИВЕРСИТЕТ ЭНЕРГЕТИКИ И СВЯЗИ
ФАКУЛЬТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ
КАФЕДРА КОМПЬЮТЕРНЫХ ТЕХНОЛОГИЙ
Отчет по производственной практике
Работа выполнена:
14.07.2013
Студентом:
Шлекенов Ж.Т.
Группа:
БВТ-11-3
Отчёт принят:
____________
Руководитель практики:
Карымсакова Н.Т.
АЛМАТЫ 2013
Оглавление
TOC \o "1-3" \h \z \u Общие сведения: PAGEREF _Toc366188767 \h 3Цели и задачи прохождения практики: PAGEREF _Toc366188768 \h 3Выполненные работы: PAGEREF _Toc366188769 \h 3Описание проделанной работы PAGEREF _Toc366188770 \h 3Обзор биллинговой системы BGBilling PAGEREF _Toc366188771 \h 4ИНДИВИДУАЛЬНОЕ ЗАДАНИЕ PAGEREF _Toc366188772 \h 6Список используемой литературы PAGEREF _Toc366188773 \h 34
ПРОФЕССИОНАЛЬНАЯ ПРАКТИКА
Общие сведения:Профессиональная практика была пройдена на предприятии ТОО «Центр методологии профессиональной сертификации» в период 10.06.2013 – 14.07.2013 на должности системного администратора( иногда обязанности, исходя из опыта работы и навыков перетекали в обязанности Контент менеджера сайта предприятия).
Цели и задачи прохождения практики:Формирование и развитие профессионального мастерства на основе изучения опыта работы конкретных организаций, учреждений, предприятий;
Приобретение навыков самостоятельной работы в условиях реально функционирующего производства;
Практическое применение теоретических знаний полученных в процессе обучения.
Выполненные работы:Системное администрирование ПК предприятия, решение банального рода проблем.( основное время прохождения практики).
Учет трафика предприятия с помощью биллинговой системы BGBilling.
Анализ IP-адресов в СУБД ACCESS( поиск информации о пользователях).
Контент-менеджмент сайта accountantkz.kz( Обновление новостей и др. динамической информации).
Описание проделанной работыЗа время прохождения практики я ознакомился с работой, задачами и структурой предприятия. Прошел экскурсию по предприятию и был ознакомлен с правилами безопасности.
Целью моей деятельности на предприятии, как системного администратора, являлось поддержание и обслуживание ПК предприятия, решение банальных проблем, в которых не в состоянии разобраться сотрудники предприятия ( не IT-специалисты). В данном вопросе пригодились навыки, полученные в процессе теоретического обучения в Алматинском Университете Энергетики и Связи по специальности 5B070400 - Вычислительная техника и программное обеспечение.
Так же в мои обязанности входили учет трафика пользователей предприятия с помощью билингвой системы BGBilling и Контент-менеджмент сайта предприятия accountantkz.kz.
В качестве системного администратора я выполнил банальную работу: по установке и обновлению различного ПО на различных ПК предприятия
по установке необходимых драйверов
по установке ОС Windows на новые ПК.( новые ПК- не обязательно новые, а замена списанным, вот так вот)
Обзор биллинговой системы BGBillingПримерно полтора года назад столкнулись с проблемой, заключающейся в том, что наша биллинговая система (кем-то и когда-то написанная, поддерживаемая местной контрой, в которой автора уже не было) ну никак уже не справлялась с возложенными на нее задачами.
Заказывать разработку новой системы под свои задачи — слишком дорого и слишком долго. Поэтому встала задача — найти подходящее решение. Выбор в итоге пал на BGBilling.
Система — российская. Сайт — bgbilling.ru
Архитектура системы — серверная часть написана на Java. Первое время беспокоила производительность и стабильность такой системы. По прошествии года могу сказать — с производительностью и стабильностью нет никаких проблем. Но есть одно НО. Сервер требует последнюю Java, а с ней есть определенные проблемы на FreeBSD. Поэтому этой системы нет в списке поддерживаемых. Но зато есть — Windows, Linux. СУБД — MySQL.
Документированность БД — изумительная. Идем на сайт dbinfo.bitel.ru и шаримся, смотрим что и как с чем связано, какие параметры могут быть. Честно признаюсь, для меня документированность БД была одним из решающих факторов. Было ясно, что функционал специфичный только для нас придется допиливать самому, поэтому такое подспорье как адекватная документация, меня как радовали, так все больше и радуют.
Клиент для оператора биллинга — отдельное GUI приложение.
Что следует отметить — в клиенте есть встроенные sql редактор, который из самого клиента позволяет выполнять зарпосы к бд и получать результаты в удобоваримом виде.
Стоимость, лицензии и прочее
Система — модульная. Каждый модуль имеет количество лицензий с которыми он может работать (или бесконечное количество). Чем больше лицензий — тем дороже модуль. Максимальная цена — за бесконечное количество лицензий.
Техподдержка, комьюнити
Спорный вопрос по техподдержке. Она платная. При покупке лицензии предлагается заключить контракт на техподдержку и приобрести пакет обращений. За 25тр можно получить 50 обращений на год. За 9тр — 15 обращений, тоже на год. Много это или мало? Мы использовали за год — 5 обращений. Сообщения об ошибках за обращения не засчитываются, но для их сообщения все равно нужен пакет хоть с одним обращением.
Производительность и факапы
Официальные данные представлены на соответствующей странице сайта — bgbilling.ru/program/speed.shtml. В целом им можно верить. АП списываются довольно шустро. Радиус(мы используем модуль DiapUP для доступа к сети) держит нагрузку при одновременной авторизации 1000-1500пользователей (пропадаение света в районе, а потом включение) вполне нормально. Радиус же занимается обсчетом нетфлоу статистики. Справляется с потоком от 6 цисок с гигабитом трафика на каждой.
Если не считать факапов вызванных своими кривыми руками, то был один довольно неприятный факап 1 января 2010 года. На каждый месяц автоматически создаются новые таблицы с балансом. Из-за какой то недоработки в логике в 2010 году новые таблицы не создались. Поэтому в момент списания АП у всех был 0 на счету. Благо БД очень хорошо документирована и есть функции групповых операций — это удалось очень быстро устранить (до того как большая часть абонентов отошла от похмелья и полезла в интернет).
Запуск, перенос существующих баз
Настройка и запуск системы осуществляются довольно просто, особо выделить даже нечего. Распаковать архив, добавить исполняемые .sh в автозапуск, загрузить структуру таблицы из файла дампа и пожалуй все — уже будет работать =).
Инетересный момент. Основные компоненты системы — сервер, радиус, шедулер — можно разнести на разные сервера, в настройках указать айпишники и все отлично будет работать, цепляться к серверу и распределять нагрузку.
Кстати про распределение нагрузки. Все задачи сваливаются в очередь, которую обрабатывает шедулер. Причем он практически никак не связан с сервером. Т.е. задача на выгрузку статистики, пере обсчёт трафика — нагрузит шедулер, но никак не скажется на производительности самого сервера биллинга — он будет работать в нормальном режиме, складывая задачи в очередь, будет давать доступ до бд радиусу и других модулям.
Про СУБД ACCESS писать не буду, помогли знания, полученные от Зуевой Е.К и Сербина В.В.
ИНДИВИДУАЛЬНОЕ ЗАДАНИЕИндивидуальное задание представляет собой решения ряда задач (см. дневник) по задачнику «Задачи по программированию» С.А. Абрамов, Г.Г. Гнездилова, Вологда 2000г.
Решение задач:
333.Найти натуральное число от 1 до 10 000 с максимальной суммой делителей.
Код C++
#include <iostream>
typedef unsigned long ul;
ul Sum(ul);
int main()
{
int i, max=0, *tmp=(int*)malloc(sizeof(int)), num;
for (i=1; i<10001; ++i)
{
*tmp=Sum(i);
if (max<*tmp) { max=*tmp; num=i; }
}
free(tmp);
std::cout << "Число с максимальной суммой делителей: " << num << " Сумма: " << max << std::endl;
system("PAUSE");
return 0;
}
unsigned long Sum(unsigned long a)
{
unsigned long sum = 1, k = 1, i, p;
if (a == 1)
return a;
while ((a & 1) == 0)
{
k <<= 1;
a >>= 1;
}
k = (k << 1) - 1;
if (a == 1)
return k;
elsesum = k;
for(i = 3; i*i <= a; i += 2)
{
p = k = 1;
while(a % i == 0)
{
k *= i;
p += k;
a /= i;
}
if (k > 1)
sum *= p;
}
if (a > 1)
sum *= a + 1;
return sum;
}
334.Дано натуральное число n. Получить все натуральные числа, меньшие n и взаимно простые с ним.
Код С++
#include <iostream>
//обычный алгоритм Евклида через остатки (на основе побитовых операций)
long Nod(long a, long b)
{
while (a && b)
if (a >= b)
a %= b;
elseb %= a;
return a | b;
}
int main()
{
long n, i;
std::cin >> n;
for (i=1; i<n; ++i)
if (Nod(i,n)==1) std::cout << i << std::endl;
system("PAUSE");
return 0;
}
10
324.
Даны целые числа p и q. Получить все делители числа q, взаимно простые с p.
Код С++
#include <cstdlib>
#include <iostream>
long* devisor(long a)
{
unsigned i; const long c=a/2+1;
long *p=(long*)malloc(c*sizeof(long)), j=1;
for (i=0; j<c; ++j)
if (a%j==0) { p[i]=j; i++; }
p[i]=0;
return p;
}
bool RecSimple(long a, long b)
{
while (a && b)
if (a >= b)
a %= b;
elseb %= a;
return (a | b) == 1;
}
int main()
{
long q, p, *adr;
std::cin >> q >> p;
adr=devisor(q);
std::cout << "Делители числа q взаимно простые с p: " << std::endl;
int i=0; while (adr[i]!=0)
{
if (RecSimple(adr[i],p)) std::cout << adr[i] << std::endl;
i++;
}
free(adr);
system("PAUSE");
return 0;
}
335.Дано натуральное число n. Получить все простые делители этого числа.
Код С++
#include <cstdlib>
#include <iostream>
int* simch(int);
bool devs(int, int);
int main()
{
int n;
std::cin >> n;
int *s=simch(n);
for (int i=0; s[i]<=n/2; i++)
if (devs(n, s[i])) std::cout << s[i] << std::endl;
delete [] s;
system("PAUSE");
return 0;
}
//Решето Сундарама
int* simch(int n)
{
int *a = (int*)calloc(n,sizeof(int)), i, j, k;
for (i=1; 3*i+1<n; i++)
for (j=1; (k = i+j+2*i*j)<n && j<=i; j++)
a[k]=1;
int q=1, *e=new int[n];
e[0]=2;
for (i=1; i<n; ++i)
if (a[i]==0)
{
e[q]=2*i+1;
q++;
}
free(a);
return e;
}
bool devs(int a, int b)
{
return !(a%b);
}
12
336.Найти наименьшее натуральное число n, представимое
двумя различными способами в виде суммы кубов двух натуральных
чисел x3+y3 (xy).
Код C++
#include <cstdlib>
#include <iostream>
using namespace std;
// см. подробнее число Рамануджана-Харди
int TripleSum(int i, int j)
{
return i*i*i+j*j*j;
}
void d(int *a, int *b)
{
++*a; ++*b;
}
int main()
{
int n, x=1, y=0;
for (n=2; x>y && n++; d(&x,&y))
if (TripleSum(n, 1)==TripleSum(x, y))
break;
cout << TripleSum(x,y) << endl << "при x и y:" << endl
<< "1. x=" << n << " y=" << 1 << ";" << endl
<< "2. x=" << x << " y=" << y << ";" <<endl;
system("PAUSE");
return 0;
}
337.Даны натуральные числа a, b (a b). Получить все простые
числа p, удовлетворяющие неравенствам a p b.
Код C++
#include <cstdlib>
#include <iostream>
using namespace std;
//Решето Сундарама
int* simch(int n)
{
int *a = (int*)calloc(n,sizeof(int)), i, j, k;
for (i=1; 3*i+1<n; i++)
for (j=1; (k = i+j+2*i*j)<n && j<=i; j++)
a[k]=1;
13
int q=1, *e=new int[n];
e[0]=2;
for (i=1; i<n; ++i)
if (a[i]==0)
{
e[q]=2*i+1;
q++;
}
free(a);
return e;
}
int main()
{
int a, b, *p;
cin >> a >> b;
p=simch(b);
int i=0;
while (p[i]<a) i++;
for (i; p[i]<=b; i++)
cout << p[i] << endl;
system("PAUSE");
return 0;
}
338.Найти 100 первых простых чисел.
Код C++
#include <cstdlib>
#include <iostream>
using namespace std;
//классическое решето Эратосфена
int main()
{
int *n = new int[545], i, j, k=1;
for (j=2; j<227; ++j)
if (!n[j])
{
for (i=j; i<542; i+=j)
n[i]=1;
n[j]=0;
}
for (i=0; i<542; i++)
if (!n[i])
{
cout << "№ " << k << ". " << i << endl;
++k;
}
delete [] n;
system("PAUSE");
return 0;
}
339. Даны натуральные числа n, m. Получить все меньшие n
натуральные числа, квадрат суммы цифр которых равен m.
Код C++
#include <cstdlib>
#include <iostream>
#include <string.h>
using namespace std;
void digit(int *a, char *b)
{
sprintf(b,"%d",*a);
}
int rank(int x)
{
if (x<10) return 1;
if (x<100) return 2;
if (x<1000) return 3;
if (x<10000) return 4;
if (x<100000) return 5;
if (x<1000000) return 6;
if (x<10000000) return 7;
if (x<100000000) return 8;
}
int Dsum(char *c, int a)
{
int sum=0;
for (int i=0; i<a; i++)
sum+=((int)c[i]-'0');
return sum*sum;
}
int main()
{
int n, m;
char digs[20];
cin >> n >> m; cout << endl;
for (int i=1; i<n; i++)
{
digit(&i, &digs[0]);
if (m==Dsum(&digs[0], rank(i))) cout << i << endl;
}
system("PAUSE");
return 0;
}
340.Натуральное число называется совершенным, если оно
равно сумме всех своих делителей, за исключением себя самого. Число
6 – совершенное, так как 6 = 1+2+3. Число 8 – не совершенное, так как
8!=1+2+4.Дано натуральное число n. Получить все совершенные числа,
меньшие n.
Пояснение:
Доказано, что все четные совершенные числа имеют вид , где p и простые. Нечётных совершенных чисел до сих пор не обнаружено, однако не доказано и то, что их не существует. Предлагаю быстрый алгоритм нахождения совершенных чисел до числа . По желанию значение N можно менять.
Код C++
#include <iostream>
#include<cstdlib>
const unsigned long long N = 5000000000000000000llu;
// решето Эратосфена
void Eratosfen(char *a, unsigned long n)
{
unsigned long i, j;
a[0] = a[1] = 0; a[2] = 1;
for(i = 4; i < n; i += 2)
a[i] = 0;
for(i = 3; i < n; i += 2)
a[i] = 1;
i = 3;
while (i*i <= n)
{
for(j = i << 1; j < n; j += i)
a[j] = 0;
i += 2;
while (i < n && a[i] == 0)
i += 2;
}
}
// количество значащих бит числа
unsigned long Count(unsigned long long a)
{
unsigned long long count;
for(count = 0; a; a >>= 1)
++count;
return count;
}
// проверка на простоту
int Prime(unsigned long long a)
{
unsigned long long i;
if (a == 2)
return 1;
if (a == 0 || a == 1 || a % 2 == 0)
return 0;
for(i = 3; i*i <= a && a % i; i += 2)
;
return i*i > a;
}
int main()
{
char *eratosfen;
unsigned long long sov, i, n = (Count(N) >> 1) + 1;
eratosfen = (char *)calloc(n, sizeof(*eratosfen));
Eratosfen(eratosfen, n);
// вывод совешенных чисел
for(i = 2; i < n; ++i)
if (eratosfen[i] && Prime((1 << i) - 1))
{
sov = ((1llu << i) - 1llu) << (i - 1llu);
std::cout << (unsigned long long)sov << std::endl;
}
free(eratosfen);
return 0;
}
141.Дано натуральное число n. Можно ли представить его ввиде суммы трех квадратов натуральных чисел? Если можно, то
а) указать тройку x, y, z таких натуральных чисел, что n x2 y2 z2 ,
б) указать все тройки x, y,z таких натуральных чисел, что n x2 y2 z2 .
а)
Код C++
#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
int n;
cin >> n;
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
for (int k=1; k<=n; k++)
if ((i*i+j*j+k*k)==n)
{
cout << "x=" << i << endl
<< "y=" << j << endl
<< "z=" << k << endl;
n=1;
}
system("PAUSE");
return 0;
}
17
б)
Код C++
#include <cstdlib>
#include <iostream>
using namespace std;
int l=0;
struct s
{
int x, y, z;
};
s* quadro(int n)
{
s num[n];
for (int i=1; i<=n; i++)
for (int j=1; j<=n; j++)
for (int k=1; k<=n; k++)
if ((i*i+j*j+k*k)==n)
{
num[l].x=i;
num[l].y=j;
num[l].z=k;
l++;
}
return &num[0];
}
int main()
{
int n; s *a;
cin >> n;
a=quadro(n);
for (int i=0; i<l; i++)
cout << "x=" << a[i].x << endl
<< "y=" << a[i].y << endl
<< "z=" << a[i].z << endl << endl;
system("PAUSE");
return 0;
}
701. Дан файл f, содержащий сведения о веществах: указывается
название вещества, его удельный вес и проводимость (проводника,полупроводник, изолятор).
а) Найти удельные веса и названия всех полупроводников.
б) Выбрать данные о проводниках и упорядочить их поубыванию удельных весов.
Код C++
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
using namespace std;
int file_length(string);
void sort(int*, int);
int main()
{
setlocale(LC_ALL, "rus");
ifstream fin("file.txt");
int a=file_length("file.txt");
string read[a];
cout << "a)" <<endl;
for (int i=0; i<a; i++)
fin >> read[i];
for (int i=2; i<=a; i+=3)
if (read[i]=="1")
cout << read[i-2] << ", density: " << read[i-1] << endl;
cout << endl << "b)" << endl;
int arr[a], j=0;
for (int i=2; i<=a; i+=3)
if (read[i]=="0")
{
istringstream ist(read[--i]);
ist >> arr[j]; ++j;
}
sort(&arr[0], j);
system("PAUSE");
return 0;
}
void swap(int *a, int *b)
{
int tmp=*b;
*b=*a;
*a=tmp;
}
void sort(int *s, int j)
{
for(int i = 0; i < j - 1; i++)
for(int t = i + 1; t < j; t++)
if (s[i] < s[t]) swap(&s[i],&s[t]);
for (int i=0; i<j; i++)
cout << s[i] << endl;
}
int file_length(string c)
{
ifstream a("file.txt"); int i=0; string tmp;
while (!a.eof())
{
a >> tmp;
i++;
}
return i;
}
702.Дан файл f, содержащий сведения об экспортируемыхтоварах: указывается наименование товара, страна, импортирующая
товар, и объем поставляемой партии в штуках. Найти страны, вкоторые экспортируется данный товар, и общий объем его экспорта.
Код C++
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
class Postavka
{
string name, country;
int quont;
public:
int get_quont() { return quont; };
void read(string n, string c, string q)
{ istringstream ist(q); name=n; country=c; ist >> quont; };
void show()
{
cout<<"*****"<<endl
<<"Товар: "<<name<<endl
<<"Страна: "<<country<<endl
<<"Ед.: "<<quont<<endl
<<"*****"<<endl<<endl;
};
bool search(string n)
{
if (n==name) { show(); return 1; }
return 0;
}
};
int sumex(int b)
{
static int sum=0;
return sum+=b;
}
int main()
20
{
ifstream fin("file.txt");
string *tmp=new string, fr[3];
static int st=0;
while (!fin.eof())
{
fin >> *tmp;
st++;
}
delete tmp;
fin.close();
fin.open("file.txt");
Postavka arr[st/3];
for (int i=0; i<st/3; i++)
{
fin >> fr[0] >> fr[1] >> fr[2];
arr[i].read(fr[0],fr[1],fr[2]);
}
fin.close();
cout << "Введите название товара:"; cin >> fr[0];
int exp;
for (int i=0; i<st/3; i++)
if (arr[i].search(fr[0])) exp=sumex(arr[i].get_quont());
cout << "Общий объем экспорта товара - " << fr[0] <<": "<<exp<<endl;
system("read");
return 0;
}
703. Даны два файла f1 и f2. Файл f1 - это инвентарный файл,
содержащий сведения о том, сколько изделий каких видов продукции
хранится на складе (вид продукции задается его порядковым номером).
Файл f2 - это вспомогательный файл, содержащий сведения о том, насколько уменьшилось или увеличилось количество изделий понекоторым видам продукции. Вспомогательный файл может содержать
несколько сообщений по продукции одного вида или не содержать ни
одного такого сообщения. Обновить инвентарный файл на основе
вспомогательного, образовав новый файл g.
Код C++
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream f1("f1.txt");
int count1=0, count2=0;
string t;
while(!f1.eof())
{
f1 >> t;
count1++;
21
}
f1.close(); f1.open("f1.txt");
int invent[count1];
for (int i=0; i<count1; i++)
f1 >> invent[i];
f1.close();
ifstream f2("f2.txt");
while(!f2.eof())
{
f2 >> t;
count2++;
}
f2.close(); f2.open("f2.txt");
int add[count2];
for (int i=0; i<count2; i++)
f2 >> add[i];
f2.close();
for (int i=0, j=1, k=0; k<(count2/2); (i+=2) && (j+=2) && (k++))
invent[add[i]]+=add[j];
ofstream fout("g.txt");
for (int i=0; i<count1; i++)
fout << invent[i]<< endl;
fout.close();
system("read");
return 0;
}
704. Дан файл f, содержащий сведения об игрушках:
указывается название игрушки (например, кукла, кубики, мяч,конструктор и т. д.), ее стоимость в копейках и возрастные границы
детей, для которых игрушка предназначена (например, для детей отдвух до пяти лет). Получить следующие сведения:
а) названия игрушек, цена которых не превышает 4 руб. и
которые подходят детям 5 лет;
б) цену самого дорогого конструктора, оформленную пообразцу … руб. …коп.;в) названия наиболее дорогих игрушек (цена которых
отличается от цены самой дорогой игрушки не более чем на 1 руб.);
г) названия игрушек, которые подходят как детям 4 лет, так и
детям 10 лет;
д) цены всех кубиков, оформленные по образцу, указанному вб);
е) можно ли подобрать игрушку, любую, кроме мяча,
подходящую ребенку 3 лет, и дополнительно мяч так, чтобы
суммарная стоимость игрушек не превосходила 5 руб.?;
ж) имеется ли мяч ценой 2 руб. 50 коп., предназначенный детям
от 3 до 8 лет?; если нет, занести сведения об этой игрушке в файл f.
Код C++
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
using namespace std;
class Toy
{
string name;
int cost, lb, hb;
public:
string get_name() { return name; };
int get_cost() { return cost; };
int get_lb() { return lb; };
int get_hb() { return hb;};
void read(string n, string c, string l, string h)
{
istringstream c1(c), l1(l), h1(h);
name=n; c1 >> cost; l1 >> lb; h1 >> hb;
};
void show()
{
cout << "***Игрушка***" << endl
<< "Наименование: " << name << endl
<< "Стоимость: " << cost << endl
<< "Возраст: от " << lb << " до " << hb << " лет" << endl
<< "*************" << endl << endl;
};
};
void scost(int x)
{
int y=x%100;
cout << (x-y)/100 << " руб. " << y << " коп." << endl;
}
int main()
{
ifstream fin("file");
string *tmp = new string,
*tr = new string[4];
int nlines=0;
while (!fin.eof())
{ fin >> *tmp; nlines++; }
delete tmp;
fin.close(); fin.open("file");
Toy list[nlines/4]; nlines/=4;
for (int i=0; i<nlines; i++)
{
fin >> tr[0] >> tr[1] >> tr[2] >> tr[3];
list[i].read(tr[0],tr[1],tr[2],tr[3]);
}
delete [] tr;
cout << "а)" << endl; //пукнт а)
for (int i=0; i<nlines; i++)
if ( ((list[i].get_cost()/100)<=4) && (list[i].get_lb()<=5) && (list[i].get_hb()>=5) )
list[i].show();
cout << "б)" << endl; //пункт б)
int max_cost=0;
23
for (int i=0; i<nlines; i++)
if ( (list[i].get_name()=="конструктор") && (list[i].get_cost()>max_cost) ) max_cost=list[i].get_cost();
cout << "Самый дорогой конструктор стоит: ";
scost(max_cost);
cout << "в)" << endl; //пункт в)
max_cost=0;
for (int i=0; i<nlines; i++)
if (list[i].get_cost()>max_cost) max_cost=list[i].get_cost();
for (int i=0; i<nlines; i++)
if ( (list[i].get_cost()>=(max_cost-100)) && (list[i].get_cost()<max_cost) ) list[i].show();
cout << "г)" << endl; //пункт г)
for (int i=0; i<nlines; i++)
if ( (list[i].get_lb()<=4) && (list[i].get_hb()>=10) ) list[i].show();
cout << "д)" << endl << "стоимости кубиков:" << endl; //пункт д)
for (int i=0; i<nlines; i++)
if (list[i].get_name()=="кубики") { cout << i << ". "; scost(list[i].get_cost()); }
cout << "е)" << endl; //пункт е)
vector<int> cop(1), ball(1); int j=0, k=0;
for (int i=0; i<nlines; i++)
{
if ( (list[i].get_name()!="мяч") && (list[i].get_lb()<=3) && (list[i].get_hb()>=3) && ((list[i].get_cost()/100)<5))
{
cop[j]=i;
j++;
cop.push_back(1);
}
if ( (list[i].get_name()=="мяч") && (list[i].get_lb()<=3) && (list[i].get_hb()>=3) && ((list[i].get_cost()/100)<5))
{
ball[k]=i; k++;
ball.push_back(1);
}
}
for (int i=0, c=1; (i<j) && (i<k); i++)
if ( (list[cop[i]].get_cost()+list[ball[i]].get_cost())<=500 )
{
cout << "Пара " << c <<": " << endl; c++;
list[cop[i]].show(); list[ball[i]].show();
cout << endl;
}
cout << "ж)" << endl; //пункт ж)
bool ch=true;
for (int i=0; i<nlines; i++)
if( (list[i].get_name()=="мяч") && (list[i].get_cost()==250) && (list[i].get_lb()<=3) && (list[i].get_hb()>=8) )
{ ch=false; break; }
if (ch)
{
ofstream fout("file", ios_base::app);
fout << endl << "мяч 250 3 8" << endl;
}
return 0;
}
705.Даны натуральное k, символьный файл f и текстовый файл
f1 *). Файл f содержит 30 слов (см. задачу 497), каждое из которых
будем называть ключевым. Сформировать файл g, который содержит
строки файла f1, циклически сдвинутые так, чтобы каждое ключевое
слово, входящее в строку, начиналось с k-й позиции. Строки, не
содержащие ключевых слов, в файл g не включаются. Строки, которые
содержат n ключевых слов, записываются в файл g n раз.
*) Текстовым называется файл, компоненты которого являютсястроками. Будем предполагать, что строки имеют произвольнуюдлину, не превосходящую некоторого оговоренного числа символов,
например 255.
Код C++
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
bool FindWordInString(string str, string word)
{
int wordsFound=0;
for(string::iterator it = str.begin(); it != str.end(); ++it)
{
if(wordsFound >= word.size())
return true;
if (*it == word[wordsFound])
++wordsFound;
}
return false;
}
int main()
{
ifstream f("f"), f1("f1");
unsigned int k=1;
cin >> k;
//чтение файла ключевых слов - f
string keys[30];
for (int i=0; i<30; i++)
f >> keys[i];
f.close();
//чтение текствого файла f1
vector<string> tx(1);
int counter=0; char buff[255]; //по условию размер строки не превышает 255 символов
while (!f1.eof())
{
f1.getline(buff, 255);
tx.at(counter)=buff;
25
++counter;
tx.push_back("");
}
f1.close();
ofstream g("g");
//поиск ключевых слов в текством файле
for (int i=0; i<tx.size(); i++)
for (int j=0; j<30; j++)
if (FindWordInString(tx.at(i), keys[j]))
{
for (int q=0; q<k; q++)
g << " ";
g << tx.at(i) << endl;
}
g.close();
system("read");
return 0;
}
706. Дан текстовый файл f, содержащий программу на языке
Паскаль. Проверить эту программу на несоответствие числа
открывающих и закрывающих круглых скобок.
Код C++
#include <ctime>
#include <cstdlib>
#include <iostream>
#include <string>
#include <stack>
bool isOpenBracket(char symbol) {
return symbol == '(' || symbol == '{' || symbol == '[';
}
bool isClosingBracket(char symbol) {
return symbol == ')' || symbol == '}' || symbol == ']';
}
char getOpenBracketPair(char bracket) {
return (bracket == '}') ? '{' : (bracket == ')') ? '(' :
(bracket == ']') ? '[' : '\0';
}
bool areParenthesesGood(const std::string &source) {
std::stack<char> stack;
for (size_t i = 0; i < source.size(); ++i) {
if (isOpenBracket(source[i])) {
stack.push(source[i]);
} else {
if (isClosingBracket(source[i])) {
char openBracket = getOpenBracketPair(source[i]);
if (!stack.empty() && stack.top() == openBracket) {
stack.pop();
} else {
26
return false;
}
}
}
}
return stack.empty();
}
int main(int argc, char *argv[]) {
srand(time(0));
std::string expression = "{x+(g-[f+h]*c)-(q+w)}";
std::cout << areParenthesesGood(expression) << std::endl;
std::cin.get();
return 0;
}
707. Дан текстовый файл f. Получить все его строки,
содержащие более 60 символов.
Код C++
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main()
{
ifstream f("f");
vector<string> tx(1);
int counter=0; char buff[255]; //по условию размер строки не превышает 255 символов
while (!f.eof())
{
f.getline(buff, 255);
tx.at(counter)=buff;
++counter;
tx.push_back("");
}
f.close();
for (int i=0; i<tx.size(); i++)
if(tx[i].length()>60) cout << tx[i] << endl;
system("read");
return 0;
}
27
708.Дан текстовый файл f. Переписать в файл g все компоненты
файла f с заменой в них символа 0 на символ 1 и наоборот.
Код C++
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
void bit_reverse(char *a)
{
switch(*a)
{
case '0': *a='1'; break;
case '1': *a='0'; break;
default: break;
}
}
int main()
{
ifstream f("f");
vector<char> tx(1);
int counter=0;
while (!f.eof())
{
f >> tx.at(counter);
++counter;
tx.push_back('0');
}
f.close();
ofstream g("g");
for (int i=0; i<tx.size(); i++)
{
bit_reverse(&tx.at(i));
g << tx.at(i);
}
g.close();
system("read");
return 0;
}
28
1008. Дан текстовый файл f. Получить самую длинную строку
файла. Если в файле имеется несколько строк с наибольшей длиной, то
получить одну из них.
Код C++
#include <cstdlib>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main()
{
ifstream f("f");
vector<string> tx(1);
int counter=0; char buff[255];
while (!f.eof())
{
f.getline(buff, 255);
tx.at(counter)=buff;
++counter;
tx.push_back("");
}
f.close();
int max=0; vector<int> nn;
for (int i=0; i<tx.size(); i++)
if (tx[i].length()>max) { max=tx[i].length(); nn.push_back(i); };
cout << "Самая длинная строка в файле - строка №" << ++nn.back() << endl
<< "(" << tx.at(nn.back()).length() << ") символов:" << endl
<< tx.at(nn.back())<< endl;
system("read");
return 0;
}
1009. Воспроизвести до-мажорное трезвучие (до-ми-соль)
последовательно, по одной ноте.
Код C++
#include <midi>
#include <soundlib>
int main()
{
sound(262);
delay(2000);
nosound;
sound(330);
delay(2000);
29
nosound;
sound(392);
delay(2000);
nosound;
return 0;
}
1010.
Воспроизвести:
а) хроматическую гамму;
б) гамму указанной тональности.
Код C++
#include <midi>
#include <soundlib>
int main()
{
sound(362);
delay(2000);
sound(320);
delay(2000);
sound(392);
delay(2000);
sound(392);
delay(2000);
sound(492);
delay(2000);
sound(615);
delay(2000);
sound(514);
delay(2000);
sound(332);
delay(2000);
sound(385);
delay(2000);
nosound;
return 0;
}
1011. Воспроизвести изображенные на рис. 98 аккорды
(все ноты аккорда должны звучать одновременно).
Код C++
#include <midi>
#include <soundlib>
int main()
{
sound(462);
sound(520);
30
sound(325);
sound(534);
sound(342);
sound(532);
sound(425);
nosound;
return 0;
}
1012. Составить игровую программу «музыкальная шкатулка».
Программа должна воспроизводить одну из нескольких популярных
мелодий по выбору играющего.
Код C++
#include <midi>
#include <soundlib>
#include <iostream>
using namespace std;
int main()
{
midi p, s;
p.assign("popcorn.midi");
s.assign("space.midi")
int num;
cout<<"0-воздушная кукуруза, 1-space"<<endl<<"Введите номер мелодии:";
cin >> num;
switch(num)
{
case 0: p.play(); break;
case 1: s.play(); break;
}
return 0;
}
1013.Составить программу для игры в музыкальную викторину.
Программа должна последовательно воспроизводить несколько
популярных мелодий, играющие - угадывать, какая мелодия была
проиграна.
Код C++
#include <midi>
#include <soundlib>
int main()
{
midi p, s;
31
p.assign("popcorn.midi");
s.assign("space.midi")
p.play();
s.play();
p.play();
int ord[3]
cin >> ord[0] >> ord[1] >> ord[2];
if ( (ord[0]==0) && (ord[1]==1) && (ord[2]==0 )) cout << "Поздравляем! Вы угадали!" << endl;
return 0;
}
1014. Составить игровую программу, которая воспроизводит три
популярные мелодии, а затем одну из них наоборот: последняя нота
мелодии звучит первой, первая - последней. Играющие должны
угадать, ноты какой мелодии были воспроизведены в обратном
порядке.
Код C++
#include <midi>
#include <soundlib>
int main()
{
midi p, s;
p.assign("popcorn.midi");
s.assign("space.midi")
p.play();
s.play();
p.play_reverse(); int not;
for (int i=p.size(); i>=0; i--)
{
cin >> not;
if (not==p[i]) continue
else break;
}
return 0;
}
1015.Составить программу для воспроизведения мелодии,
«сыгранной» на клавиатуре компьютера. Как и при игре нафортепианной клавиатуре, каждой клавише ставится в соответствие
некоторая нота; длительность звучания ноты определяется
длительностью нажатия клавиши.
Код C#
internal struct Note
{
public Note( byte oct, Tones t )
{
octave = oct;
tone = t;
id = 12 + octave * 12 + (int)tone;
}
public byte octave;
public Tones tone;
public int id;
}
public enum Tones
{
A = 9, Ad = 10, B = 11, C = 0, Cd = 1,
D = 2, Dd = 3, E = 4, F = 5, Fd = 6, G = 7, Gd = 8
}
class AudioSintezator
{
public int PlayTone( byte octave, Tones tone )
{
// 12 полутонов в октаве, начинаем считать с 0-й октавы (есть еще и -1-ая)
int note = 12 + octave * 12 + (int)tone;
if( !playingTones.Contains( note ) )
{
// воспроизводим ноту с макс. силой нажатия на канале 0
midiOut.Send( MidiMessage.StartNote( note, 127, 0 ).RawData );
playingTones.Add( note );
}
return note;
}
public void StopPlaying( int id )
{
if( playingTones.Contains( id ) )
{
// Останавливаем воспроизведение ноты
midiOut.Send( MidiMessage.StopNote( id, 0, 0 ).RawData );
playingTones.Remove( id );
}
}
MidiOut midiOut = new MidiOut( 0 );
List<int> playingTones = new List<int>();
public void Dispose()
{
midiOut.Close();
midiOut.Dispose();
}
}
918. Составить программу для запоминания и последующего
воспроизведения мелодии, «сыгранной на фортепианной клавиатуре».
Клавиатура изображается на экране (рис. 99.а). Вначале курсором
указывается клавиша, а после этого - обозначение длительности (рис.99, б).Код C#
class Phortepiano
{
public Phortepiano( params Note[] tune )
{
for( int i = 0; i < 6; ++i )
{
strs.Add( new GuitarString( tune[i] ) );
}
}
public List<Tuple<byte, byte>> GetFretsForNote( Note note )
{
// 1-е значение номер струны (от 0 до 5), 2-е - номер лада ( 0 - открытая струна)
List<Tuple<byte, byte>> result = new List<Tuple<byte, byte>>();
byte currentString = 0;
foreach( var str in strs )
{
var fret = str.GetFretForNote( note );
if( fret != -1 ) // Если на этой струне можно сыграть заданную ноту
{
result.Add( new Tuple<byte, byte>( currentString, (byte)fret ) );
}
++currentString;
}
return result;
}
public Note GetNote( byte str, byte fret )
{
return strs[str].GetNoteForFret( fret );
}
public void SetTuning( params Note[] tune ) // звучание открытых струн
{
for( int i = 0; i < 6; ++i )
{
strs[i].SetTune( tune[i] );
}
}
List<GuitarString> strs = new List<GuitarString>();
}
class GuitarString
{
34
public GuitarString( Note note )
{
this.open = note;
}
public void SetTune( Note note )
{
this.open = note;
}
public Note GetNoteForFret( byte fret )
{
return open + fret;
}
public int GetFretForNote( Note note )
{
int fret = -1; // -1 означает, что нельзя сыграть ноту на этой струне
if( open <= note )
{
int octDiff = note.octave - open.octave;
int noteDiff = note.tone - open.tone;
fret = octDiff * 12 + noteDiff;
}
return fret;
}
Note open;
}
919. Составить программу, которая строит с помощью датчика
случайных чисел музыкальные интервалы (терцию, кварту, квинту и т.д.) и аккорды. Обучающийся должен определить, какой интервал или
какое обращение трезвучия (тоническое трезвучие, секст-аккорд и т.п.) были воспроизведены.
Код C#
static class Chords
{
public static ChordType[] chordTypes = new ChordType[]{
new ChordType("мажорное трезвучие", "", 4,3),
new ChordType("минорное трезвучие", "m", 3,4),
new ChordType("увеличенное трезвучие", "5+", 4,4),
new ChordType("уменьшенное трезвучие", "m-5", 3,3),
new ChordType("большой мажорный септаккорд", "maj7", 4,3,4),
new ChordType("большой минорный септаккорд", "m+7", 3,4,4),
new ChordType("доминантсептаккорд", "7", 4,3,3),
new ChordType("малый минорный септаккорд", "m7", 3,4,3),
new ChordType("полуувеличенный септаккорд", "maj5+", 4,4,3),
new ChordType("полууменьшенный септаккорд", "m7-5", 3,3,4),
new ChordType("уменьшенный септаккорд", "dim", 3,3,3),
new ChordType("трезвучие с задержанием (IV)", "sus2", 2,5),
new ChordType("трезвучие с задержанием (II)", "sus4", 5,2),
new ChordType("секстмажор","6", 4,3,2),
new ChordType("секстминор", "m6", 3,4,2),
new ChordType("большой нонмажор", "9", 4,3,3,4),
new ChordType("большой нонминор", "m9", 3,4,3,4),
new ChordType("малый нонмажор", "-9", 4,3,3,3),
new ChordType("малый нонминор", "m-9", 3,4,3,3),
new ChordType("нота",""),
new ChordType("малая секунда", " - М2", 1),
new ChordType("большая секунда", " - Б2", 2),
new ChordType("малая терция", " - М3", 3),
new ChordType("большая терция", " - Б3", 4),
new ChordType("чистая кварта", " - Ч4", 5),
new ChordType("увеличенная кварта", " - УВ4", 6),
new ChordType("чистая квинта", " - Ч5", 7),
new ChordType("малая секста", " - М6", 8),
new ChordType("большая секста", " - Б6", 9),
new ChordType("малая септима", " - М7", 10),
new ChordType("большая септима", " - Б7", 11),
new ChordType("октава", " - О", 12),
new ChordType("малая нона", " - М9", 13),
new ChordType("большая нона", " - Б9", 14)
};
public static string[] chordsBases = new string[] {
"A","A#","B","C","C#","D","D#","E",
"F","F#","G","G#"
};
public static string[] chordMods = new string[] {
"","m","5+","m-5","maj7","m+7","7",
"m7","maj5+","m7-5","dim","sus2","sus4",
"6","m6","9","m9","-9","m-9"
};
private static int GetChordType( List<Note> tmp )
{
int[] intervals = new int[tmp.Count - 1];
for( int i = 0; i < tmp.Count - 1; ++i )
{
intervals[i] = tmp[i] - tmp[i + 1];
}
int type = 0;
foreach( var chordType in Chords.chordTypes )
{
if( Utils.CompareArrays( intervals, chordType.intervals ) )
break;
++type;
}
return type;
}
public static void GetChord( List<Note> chordNotes, out Note BaseNote, out ChordType type )
{
List<Note> notes = PrepareNotes( chordNotes ); // Подготовка нот к распознаванию
int typeIndex = GetChordType( notes ); // Попытка распознать аккорд
if( typeIndex < chordTypes.Length ) //Если нашли
{
BaseNote = notes[0];
type = chordTypes[typeIndex];
}
36
else{
bool unknown = true;
var possibleChord = new List<Note>( notes );
// Осуществляем полный перебор
foreach( List<Note> perm in Utils.GeneratePermutation( possibleChord ) )
{
// Убираем промежутки между нотами ( > 12 полутонов )
for( int k = 1; k < perm.Count; ++k )
{
if( perm[k].tone > perm[k - 1].tone )
{
perm[k] = new Note( perm[k - 1].octave, perm[k].tone );
}
else{
perm[k] = new Note( (byte)(perm[k - 1].octave + 1), perm[k].tone );
}
}
typeIndex = GetChordType( possibleChord );
if( typeIndex < Chords.chordTypes.Length )
{
unknown = false;
break; // Мы нашли что нужно, выходим
}
}
if( unknown )
{
throw new Exception( "неизвестный аккорд" );
}
else{
BaseNote = possibleChord[0];
type = chordTypes[typeIndex];
}
}
}
private static List<Note> PrepareNotes( List<Note> notes )
{
List<Note> tmp = new List<Note>();
bool finded = false;
for( int i = 0; i < notes.Count; ++i )
{
finded = false;
var note = notes[i];
for( int j = 0; j < tmp.Count; ++j ) //Ищем похожие тона в списке
{
if( note.tone == tmp[j].tone )
{
finded = true;
break;
}
}
if( !finded ) //Если такой тон еще не встречался
{
tmp.Add( note );
}
}
// Если все ноты одинаковые, но разные по тональности
if( tmp.Count == 1 && notes.Count > 1 )
return notes;
// "пододвигаем" ноты
byte lowest = tmp[0].octave;
var lowesTone = tmp[0].tone;
for( int i = 0; i < tmp.Count; ++i )
{
if( tmp[i].octave > lowest )
{
if( Utils.CountOfTones( tmp[i].tone, notes ) > 1 )
{
if( tmp[i].tone > lowesTone )
{
tmp[i] = new Note( lowest, tmp[i].tone );
}
else{
tmp[i] = new Note( (byte)(lowest + 1), tmp[i].tone );
}
}
}
}
tmp = tmp.OrderBy( x => x.id ).ToList();
return tmp;
}
}
920. Составить программу «музыкальный диктант». Программа
должна воспроизвести мелодию, а обучающийся правильно повторить
ее (см. задачу 917 или 918). Если диктант «написан правильно», может
быть начато новое задание. В противном случае диктант выполняется
еще раз.
Код C++
#include <midi>
#include <soundlib>
int main()
{
midi p, s;
p.assign("popcorn.midi");
s.assign("space.midi")
p.play();
s.play();
p.play(); int not;
bool win=false;
while(!win)
{
for (int i=0; i<p.size(); i--)
{
cin >> not;
if (not==p[i]) continue
if (i==p.size()+1) win=true;
else break;
}
}
return 0;
}Список используемой литературы1. Г.Шилдт. Самоучитель С++. - СПб.: БХВ-Петербург, 2007.- 688 с.
2. Кнут Д. Искусство программирования, МИР, Вильямс 201, том 1 – 220с.
3. Д.Либерти, Б.Джонс. Освой самостоятельно С++ за 21 день, 5-е издание. : Пер. с англ. – М. : Издательский дом «Вильямс», 2007.- 784 с.

Приложенные файлы

  • docx 2013746
    Размер файла: 63 kB Загрузок: 0

Добавить комментарий