Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Касаткин С., Раткевич И., Травова Н. - Лаборато...doc
Скачиваний:
3
Добавлен:
22.11.2019
Размер:
1.01 Mб
Скачать
  1. Программа создающая новый текстовый файл из двух данных, в котором 1-я строка –строка из первого файла, 2-я строка – строка из 2-го файла, 3-я строка – содержит общие символы первых 2-х строк.

Программа иллюстрирует использование типа string для работы со строками.

#include <iostream>

#include <iomanip>

#include <conio.h>

#include <string>

#include <ctype.h>

#include <stdlib.h>

#include <windows.h>

#include <fstream> // Этот файл обеспечивает работу с файлами

using namespace std;

int main()

{

if(SetConsoleCP(1251)==0)

{

cerr<<"Fialed to set codepage!"<<endl;

}

if(SetConsoleOutputCP(1251)==0)

{

cerr<<"Failed to set OUTPUT page!"<<endl;

}

ifstream fi1,fi2; //файлы для чтения

ofstream fo; //файл для записи

string sName1,sName2,sNameRez; //строки для имён файлов

do //проверка правильности ввода

{

cout <<"Введите имя первого файла ";

getline(cin,sName1);

basic_string<char>::size_type index;

//переменная для хранения индекса элемента строки

// следующий цикл удаляет пробелы из имени файла:

while((index=sName1.find(" "))!= string::npos)

sName1=sName1.replace(index,1, basic_string<char>(""));

} while(sName1.length()==0);

// Повторяем цикл, если длина имени файла стала равна нулю

do

{

cout <<"Введите имя второго файла ";

getline(cin,sName2);

basic_string<char>::size_type index;

//переменная для хранения индекса элемента строки.

while((index=sName2.find(" "))!= string::npos)

sName2=sName2.replace(index,1, basic_string<char>(""));

}while(sName2.length()==0 || sName2.compare(sName1)==0);

/* Повторяем цикл, если длина имени равна нулю или имя второго файла совпадает с именем первого */

do

{

cout <<"Введите имя результирующего файла ";

getline(cin,sNameRez);

basic_string<char>::size_type index;

//переменная для хранения индекса элемента строки.

while((index=sNameRez.find(" "))!= string::npos)

sName2=sNameRez.replace(index,1, basic_string<char>(""));

} while(sNameRez.length()==0 ||(sNameRez.compare(sName1) ==0 || sNameRez.compare(sName2)==0));

fi1.open(sName1.c_str()); //открытие файла

if(!fi1)

{

cerr<<"Не могу открыть первый файл.\n";

return 1; //закрытие файла

}

fi2.open(sName2.c_str()); //открытие файла

if(!fi2)

{

cerr<<"Не могу открыть второй файл.\n";

fi1.close(); //закрытие файла

return 2;

}

fo.open(sNameRez.c_str()); //открытие файла

if(!fo)

{

cerr<<"Не могу открыть результирующий файл.\n";

fi1.close();//закрытие файла

fi2.close();//закрытие файла

return 3;

}

string str1,str2,str3="";

do

{

getline(fi1,str1);

getline(fi2,str2);

str3.clear();

int *map1=new int [256],*map2=new int [256];

//создание карт символов в строке

for(int i=0;i<255;++i) //обнуляем карты

map1[i]=map2[i]=0;

/* Следующие три цикла записывают в массивы количество повторений каждого символа соответствующей строки */

for(int i=0;i<str1.length();++i)

map1[static_cast<unsigned char>(str1[i])]++; //приведение к беззнаковому типу

for(int i=0;i<str2.length();++i)

map2[static_cast<unsigned char>(str2[i])]++;

for(int i=0;i<255;++i)

if(map1[i]&&map2[i])

// Если символ присутствует и в первой и во второй строке:

str3.push_back((char)(i));

// записываем его в конец результирующей строки

// записываем результат в файл:

fo<<str1<<endl;

fo<<str2<<endl;

fo<<str3<<endl;

cout<<str1<<endl;

cout<<str2<<endl;

cout<<str3<<endl;

delete map1; //удаление карт символов для строки

delete map2;

}while(!fi1.eof()&& !fi2.eof()); //выполняем пока одновременно не конец файлов

fi1.close(); //закрытие файла

fi2.close();

fo.close();

_getch();

return 0;

}

8. Программа создаёт из двух файлов третий, в котором содержатся максимальные по длине слова из соответствующих строк исходных файлов, причём все слова длиннее 5-ти символов заключаются в квадратные скобки.

#include<iostream>

#include<iomanip>

#include<conio.h>

#include<string>

#include<ctype.h>

#include<stdlib.h>

#include<windows.h>

#include<fstream>

using namespace std;

int main()

{

if(SetConsoleCP(1251)==0)

{

cerr<<"Fialed to set codepage!"<<endl;

}

if(SetConsoleOutputCP(1251)==0)

{

cerr<<"Failed to set OUTPUT page!"<<endl;

}

ifstream fi1,fi2;

ofstream fo;

string sName1,sName2,sNameRez; //строки, для имён файлов

do //проверка правильности ввода

{

cout <<"Введите имя первого файла ";

getline(cin,sName1);

basic_string<char>::size_type index;

//переменная для хранения индекса элемента строки.

while((index=sName1.find(" "))!=string::npos)

sName1=sName1.replace(index,1, basic_string<char>(""));

}while(sName1.length()==0);

do

{

cout <<"Введите имя второго файла ";

getline(cin,sName2);

basic_string<char>::size_type index;

//переменная для хранения индекса элемента строки.

while((index=sName2.find(" "))!=string::npos)

sName2=sName2.replace(index,1, basic_string<char>(""));

}while(sName2.length()==0 || sName2.compare(sName1)==0);

do

{

cout <<"Введите имя результирующего файла ";

getline(cin,sNameRez);

basic_string<char>::size_type index;

//переменная для хранения индекса элемента строки.

while((index=sNameRez.find(" "))!=string::npos)

sName2=sNameRez.replace(index,1, basic_string<char>(""));

}while(sNameRez.length()== 0 || (sNameRez.compare(sName1)==0 || sNameRez.compare(sName2)==0));

fi1.open(sName1.c_str()); // открытие первого файла

if(!fi1)

{

cerr<<"Не могу открыть первый файл.\n";

return 1;

}

fi2.open(sName2.c_str()); //открытие второго файла

if(!fi2)

{

cerr<<"Не могу открыть второй файл.\n";

fi1.close(); //закрытие файла

return 2;

}

fo.open(sNameRez.c_str());

//открытие результирующего файла

if(!fo)

{

cerr<<"Не могу открыть результирующий файл.\n";

fi1.close(); //закрытие файла

fi2.close();

return 3;

}

string str1,str2,str3="",sub1,sub2;

// следующий цикл выполняется, пока не закончится хотя бы один из файлов

do

{

getline(fi1,str1);

getline(fi2,str2);

str3.clear();

fo<<str1<<endl;

fo<<str2<<endl;

cout<<str1<<endl;

cout<<str2<<endl;

basic_string<char>::size_type ind1;

//переменная для хранения индекса элемента строки

basic_string<char>::size_type ind2;

// следующий цикл обрабатывает две соответствующие строки, считанные из файлов

do

{

ind1=str1.find(" ");

//находим первый пробел в первой строке

// следующий цикл удаляет пробелы в начале строки

while(ind1==0 && ind1 != string::npos)

// пока пробел – первый и он вообще есть в строке

{

str1=str1.replace(0,1,"");

//удаляем пробелов слева

ind1=str1.find(" ");

// и находим следующий пробел

}

// выделяем слово из строки:

if(ind1!=string::npos)

//если не конец строки

{

sub1=str1.substr(0,ind1);

//копируем подстроку

str1=str1.replace(0,ind1,"");

//удаляем только что скопированное слово из строки

}

else //конец строки

{

sub1=str1.substr(0,str1.length());

// берем подстроку

str1=str1.replace(0,str1.length(),"");

//удаляем её

}

// аналогично только со второй строкой

ind2=str2.find(" ");

while(ind2==0&&ind2!=string::npos)

{

str2=str2.replace(0,1,"");

ind2=str2.find(" ");

}

if(ind2!=string::npos)

{

sub2=str2.substr(0,ind2);

str2=str2.replace(0,ind2,"");

}

else

{

sub2=str2.substr(0,str2.length());

str2=str2.replace(0,str2.length(),"");

}

if(max(sub1.length(),sub2.length())>5)

//если подстрока больше пяти символов тогда

{

str3.append((sub1.length()<sub2.length())?("["+sub2+"] "):("["+sub1+"] ")); /* к третьей строке присоединяем большую из двух подстрок заключенную в квадратные скобки */

}

else //в противном случае

{

str3.append((sub1.length() < sub2.length())? sub2+" " : sub1+" "); // мы просто копируем и добавляем пробел

}

}while(str1.length()||str2.length());

fo<<str3<<endl;

cout<<str3<<endl;

}while(!fi1.eof()&&!fi2.eof());

fi1.close(); //закрытие файла

fi2.close();

fo.close();

_getch();

return 0;

}

Тут вы можете оставить комментарий к выбранному абзацу или сообщить об ошибке.

Оставленные комментарии видны всем.