Программа преобразования строк



Строки также бывают нужны не просто чтобы использовать их как вводимый тип данных, а чтобы как-то их преобразовывать- например мы вводим каждую строку с новой строки, а нам надо через запятую- как раз это используется в серой поисковой оптимизации через метатеги.

С яндекс вордстата мы получаем такого типа данные:

 

тимур смирнов           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; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!