Программа преобразования строк
Строки также бывают нужны не просто чтобы использовать их как вводимый тип данных, а чтобы как-то их преобразовывать- например мы вводим каждую строку с новой строки, а нам надо через запятую- как раз это используется в серой поисковой оптимизации через метатеги.
С яндекс вордстата мы получаем такого типа данные:
тимур смирнов 555
тимур смирнов обыкновенные 34
тимур смирнов обыкновенные парни 33
блог тимура смирнова 16
прощай офисное рабство тимур смирнов 6
...
А нам надо чтобы они были через запятую так:
тимур смирнов, тимур смирнов обыкновенные, тимур смирнов обыкновенные парни, блог тимура смирнова, прощай офисное рабство тимур смирнов,
...
Это мы можем добавить на ютуб в описание и поле метатегов, чтобы поисковые машины лучше находили наше видео. Вручную мы можем делать такие преобразования долго если таких ключевых слов сотни или даже тысячи, а программа нам позволит сделать это за считанные секунды.
Мы копируем исходные данные в некий текстовой файл. И далее копируем оттуда строку, удаляем в ней все плюсы в начале слов (они бывают), удаляем цифры в конце и переносим уже в новый файл в нужный нам формат.
Данная метатеговая программа более продвинутая, она ещё несколько случайных метатегов может выбрать, перемешать всё в случайном порядке и т.д. и т.п. Поэтому ниже будет более простой пример- уже с хэштегами. Там нам надо чтобы они записывались не через запятую, а с решёткой в начале слова:
|
|
string hashtag(string s) { return "#" + s; }
И вот кусок программы где мы переводим в решётку:
ifstream fin; ofstream fout;
fin.open("src.txt");
if(!fin) cout << "Файл не найден!" << endl;
if(fin) {
fout.open("res.txt");
int n=0;
// подсчёт кол-ва хэштегов нужен чтобы для после последнего хэштега мы не писали пробел- т.к. иначе искажается последующая работа с новым полученным файлом
while(!fin.eof()) { fin >> s; n++; }
fin.close();
fin.open("src.txt");
for(int i=0; i<n; i++) {
fin>>s;
fout << hashtag(s);
if(i!=n-1) fout << " ";
}
... и т.д.
Инфосчётчик
Данная программа считает количество символов и строк в тексте. Исходный текст мы помещаем в некий txt файл и программа его обрабатывает. Символы считаются через char, строки через string.
Ниже я представлю всю программу для ознакомления:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void _() { cout << endl;}
void __(int k) {
if(k==0) system("CLS");
if(k==1) {
_(); system("pause");
|
|
}
if(k==2) {
__(1); __(0);
}
}
int main() {
setlocale(0,"");
ifstream fin; char c; string s; double nc, ns; double I, T;
while(1) {
nc=0; ns=0;
cout << "Поместите текст в src.txt в папку с программой"; __(1);
fin.open("src.txt");
if(!fin) cout << "Ошибка! Файл не найден.." << endl;
if(fin) {
while(!fin.eof()) { fin >> c; nc++; }
fin.close(); fin.open("src.txt");
while(!fin.eof()) { fin >> s; ns++; }
_();
if(nc>=1000000) cout << "Количество символов: " << nc/1000000 << " млн" << endl;
else cout << "Количество символов: " << nc << endl;
if(ns>=1000000) cout << "Количество слов: " << ns/1000000 << " млн" << endl;
else cout << "Количество слов: " << ns << endl;
|
|
cout << "Средний размер слова: " << nc/ns << " символов" << endl;
_();
if(nc>=1000000) {
cout << "Размер файла в MБ? "; cin >> I; I*=1024;
}
else if (nc>=500) {
cout << "Размер файла в КБ? "; cin >> I;
}
else {
cout << "Размер файла в байт? "; cin >> I; I/=1024;
}
cout << "Средний вес 1 символа: " << I*1024/nc << " байт" << endl;
cout << "Средний вес 1 слова: " << I*1024/ns << " байт" << endl;
_();
if(I<50) {
cout << "Время написания текста в минутах? "; cin >> T;
|
|
}
if(I>=50) {
cout << "Время написания текста в часах? "; cin >> T;
T*=60;
}
cout << "Средняя скорость печати: " << endl;
cout << "--> " << ns/T << " слов в минуту" << endl;
cout << "--> " << (nc/(T/60))/1000 << " тыс.символов в час" << endl;
cout << "--> " << I/(T/60) << " КБ в час" << endl;
}
fin.close();
__(2);
}
}
Учёт создаваемых действий по дням
Бывают такие программы, где мы учитываем что-то каждый день. Например, количество каких-то упражнений, килограммы съеденной пищи или доходы с расходами. Рассмотрим реализацию такой системы на примере программы с учётом упражнений, которые мы сами и вводим.
Чтобы данные не затерялись (мы ведь не будем держать программу включенной непрерывно много дней подряд), их необходимо сохранять- все важные значения. Это делается проще всего в текстовой файл. И потом из этого файла уже получать сохранённые данные и продолжать учёт.
Я приведу всю программу для ознакомления. Она состоит из дополнительного заголовочного файла и главного исполняемого.
// Supply.h
#ifndef SUPP
#define SUPP
#include <iostream>
#include <cmath>
#include <string>
#include <fstream>
#include <Windows.h>
using namespace std;
/////////////////////////////////////////////////////
void _() { cout << endl; }
void _(int k) { for(int i=0;i<k;i++) cout << endl; }
void __(int k) {
if (k==0) system("CLS");
if (k==1) {
_(); system("pause");
}
if (k==2) {
__(1); __(0);
}
}
double *Copy (double x[], int size) {
double *res= new double [size];
for(int i=0; i<size; i++) res[i]= x[i];
return res;
}
/////////////////////////////////////////////////////
const int BuffNumberOfActions= 500;
int NumberOfActions;
string name= "День";
const int KoefNum= 3;
// действие, упражнение
class action {
public:
int Total, Today;
string Name;
double value;
action (string Name1="", int Total1=0, int Today1=0, double value1=0) {
Name= Name1; Total= Total1; Today= Today1; value= value1;
}
};
ostream& operator<<(ostream& stream, action& x) {
cout << x.Total << " (+" << x.Today << ") \t[" << x.Name << "]";
return stream;
}
istream& operator>>(istream& stream, action& x) {
cout << "Сделано \"" << x.Name << "\" ";
int buff; cin >> buff; x.Today+=buff;
return stream;
}
#endif
// main.cpp
#include "Supply.h"
// информация о программе
void prog_info() {
cout << "Novella Engine 2.0" << endl;
cout << "Учёт личных упражнений по дням" << endl;
cout << "Есть возможность использовать виртуальную валюту" << endl;
_();
cout << "[29.10.2017]" << endl;
cout << "Автор: Васька Мырт (vk.com/id176208527)" << endl;
__(2);
}
// новая игра или продолжить
bool NewGame () {
cout << "(0) Новая игра" << endl;
cout << "(1) Продолжить" << endl;
bool x; cin>>x; return !x;
}
// данные игрока
void info (string name, int day, action actions[], double score, bool virt) {
__(0);
cout << name << " [" << day << "]" << endl;
if(virt) cout << "$ " << score << endl;
_();
for(int i=0;i<NumberOfActions;i++) cout << actions[i] << endl;
_(2);
}
// новый день или продолжаем
bool NewDay () {
cout << "(0) Новый день" << endl;
cout << "(1) Продолжается" << endl;
bool x; cin>>x; return !x;
}
// сохранение учётных данных после каждого шага
void SaveData (string name, int day, double score, action actions[], int &NumberOfActions, bool virt, double kf[]) {
ofstream fout;
fout.open("nvl_engine_simple.txt");
fout << virt << endl;
fout << NumberOfActions << endl;
fout << name << " " << day << " " << score << endl;
for(int i=0;i<NumberOfActions;i++) {
fout << actions[i].Name << " " << actions[i].Total << " " << actions[i].Today << " ";
if(virt) fout << actions[i].value;
fout << endl;
}
if(virt) for(int i=0; i<KoefNum; i++) fout << kf[i] << " ";
fout.close();
cout << "Данные сохранены"; __(1);
}
// чтение учётных данных при продолжении игры
void ReadData (string &name, int &day, double &score, action actions[], int &NumberOfActions, bool &virt, double kf[]) {
ifstream fin;
fin.open("nvl_engine_simple.txt");
fin>>virt;
fin>>NumberOfActions>>name>>day>>score;
for(int i=0;i<NumberOfActions;i++) {
fin >> actions[i].Name >> actions[i].Total >> actions[i].Today;
if(virt) fin >> actions[i].value;
}
if(virt) for(int i=0; i<KoefNum; i++) fin>>kf[i];
fin.close();
}
// названия учитываемых действий
void ActionsNames (action actions[]) {
for(int i=0;i<NumberOfActions;i++) {
cout << "Действие " << i+1 << ": "; cin >> actions[i].Name;
}
}
bool Virt() {
cout << "(0) Без виртуальной валюты" << endl;
cout << "(1) ВВЕСТИ ВИРТУАЛЬНУЮ ВАЛЮТУ" << endl;
bool x; cin>>x; return x;
}
void ActionsValues (action actions[]) {
cout << "Сколько баллов прибавляется за каждое действие" << endl;
for(int i=0;i<NumberOfActions;i++) {
cout << actions[i].Name << " --> "; cin >> actions[i].value;
}
}
// kf[0]+ kf[1]*x + kf[2]*x*x
double newdayCost (double kf[], double day) {
day--;
double res= 0;
for(int i=0; i<KoefNum; i++) res+= (kf[i]*pow(day,i));
return res;
}
double* kf_build () {
double *kf = new double [KoefNum];
cout << "Каждый день отнимается баллов " << endl;
cout << "C= kf[1] + kf[2]*x + kf[3]*x*x (x= day-1)" << endl;
_();
cout << "(0) Ручной ввод" << endl;
cout << "(1) Автопостроение параболы" << endl;
bool autopar; cin>>autopar;
if(!autopar) cout << "Введите коэфы от 1 до " << KoefNum << " подряд через пробел: ";
if(autopar) cout << "Введите расход за первые 3 дня через пробел, по которым построится парабола: ";
for(int i=0; i<KoefNum; i++) cin>>kf[i];
if(autopar) {
kf[1]-=kf[0]; kf[2]-=kf[0];
double *_kf = Copy(kf,KoefNum);
kf[2]= _kf[2]/2 - _kf[1];
kf[1]= _kf[1] - kf[2];
delete []_kf;
}
return kf;
}
// главная функция
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
prog_info();
bool newgame= NewGame();
bool virt= false;
action *actions= new action [BuffNumberOfActions];
int day= 1;
double score= 0;
bool first= true;
double *kf= new double [KoefNum];
if(newgame) {
cout << "Сколько будет учитываемых действий: "; cin >> NumberOfActions;
ActionsNames(actions); __(2);
virt= Virt(); if(virt) { kf= kf_build(); _(); ActionsValues(actions); }
}
ifstream fin;
bool pass= true;
if(!newgame) {
fin.open("nvl_engine_simple.txt");
if(!fin) {
cout << "Файл не найден" << endl;
pass= false; __(1);
}
if(fin) {
ReadData(name,day,score,actions,NumberOfActions,virt,kf);
first= false;
}
}
// основной цикл игры
if(pass) {
bool newday= false;
while(true) {
if(!first) {
info(name,day,actions,score,virt);
newday= NewDay();
}
if(first) first= false;
if(newday) {
if(virt) {
score-= newdayCost(kf,day);
cout << "Расход: -" << newdayCost(kf,day); __(1);
}
day++;
for(int i=0;i<NumberOfActions;i++) {
actions[i].Total+=actions[i].Today;
actions[i].Today= 0;
}
}
for(int i=0;i<NumberOfActions;i++) {
info(name,day,actions,score,virt);
int Buff= actions[i].Today;
cin >> actions[i];
if(virt) score+= actions[i].value * (actions[i].Today - Buff);
}
info(name,day,actions,score,virt);
SaveData(name,day,score,actions,NumberOfActions,virt,kf);
}
}
// конец основного цикла
}
Учёт бюджета по категориям
Тут будет приведён отрывок программы, где мы вносим те или иные значения в какие-то категории. В данном случае категория это статья доходов или расходов. И если мы вводим такую же категорию, то к ней приплюсовывается доход или расход.
Например, я ввожу:
еда -67
проезд -25
еда -54
И программа не должна второй раз для еды создавать новую категорию: она должна объединить в одну, т.е. храниться это будет как еда -121.
...
Работает это так:
cin >> cat;
saldo+= cat.today;
if(cat.today>0) value[1]+= cat.today; // доходы
if(cat.today<0) value[0]-= cat.today; // расходы
find= false;
for(int i=0; i<cur; i++) {
if(units[i].name==cat.name) {
find= true;
units[i].today+= cat.today;
break;
}
if(find) break;
}
if(!find) {
units[cur].name= cat.name;
units[cur].today= cat.today;
cur++;
}
cat, units[] - это объекты специально созданного класса:
class unit {
public:
string name; // название категории
int today, total; // сегодня +/- и вообще сколько уже
unit() { name="_empty_"; today=0; total=0; }
// перегрузка оператора присвоения
unit& operator=(unit& x) {
name= x.name;
today= x.today;
total= x.total;
return *this;
}
};
// перегрузка оператора ввода
istream& operator>>(istream& str, unit& x) {
cout << "Введите данные в формате <категория> <сальдо>" << endl << ">> ";
cin >> x.name >> x.today;
return str;
}
Дата добавления: 2018-09-22; просмотров: 282; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!