М Петров Сидор Юрьевич 34 182 120 зеленый рыжий

Программа:

#include<iostream>

#include<iomanip>

#include<math.h>

#include<conio.h>

#include<String.h>

#include<ctype.h>

#include <stdlib.h>

#include<windows.h>

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

using namespace std;

 

// Описание структуры:

struct Man

{

char sex; // пол

char FIO[80]; // фамилия, имя, отчество

int age; // возраст

int height; // рост

int weight; //вес

char ycolor[20]; // цвет глаз

char hcolor[20]; //цвет волос

};

 

int main()

{

if(SetConsoleCP(1251)==0)

{

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

}

if(SetConsoleOutputCP(1251)==0)

{

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

}

fstream fl;

char fName[20];

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

cin.getline(fName,20);

fl.open(fName,ios::in);

if (!fl) cout<<"Файл не найден.\n";

if (fl)

{

char str[100];

cout <<"Файл с данными: \n";

while (!fl.eof())

{

fl.getline(str,100);

cout << str << endl;

}

// Обработка данных:

fl.seekg(0L, ios::beg); // возвращаемся в начало файла

fl.clear();

Man person; /* объявляем конкретный набор данных, который будет хранить сведения об одном человеке */

char fam[40], name[40], otch[40];

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

cout << "=";

cout << endl;

// фамилия, имя отчество как отдельные слова

char flag = 1; // признак того, что нужные данные еще не найдены

while (!fl.eof())

{

fl>>person.sex;

// начинаем считывать данные на очередного человека

if (!fl.eof()) // если файл еще не закончен

{

fl >> fam >> name >> otch;

// считываем фамилию, имя отчество

// и собираем их в одну строку FIO:

strcat(fam," ");

strcat(fam,name);

strcat(fam," ");

strcat(fam,otch);

strcpy(person.FIO,fam);

// считываем остальные данные:

fl>>person.age>>person.height >> person.weight >> person.ycolor >> person.hcolor;

if (person.height > 180)

// если считанные данные удовлетворяют условию (рост > 180)

{

if (flag) cout<<

"Люди, рост которых > 180 см:\n";

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

flag = 0; // признак того, что данные найдены

// выводим найденные данные:

cout <<"пол " << person.sex <<" ФИО: " << person.FIO << endl <<"возраст: " << person.age <<" рост: " << person.height <<" вес: " << person.weight <<" цвет глаз: " <<person.ycolor <<" цвет волос: "<< person.hcolor << endl ;

} // end if

} // end if

} // end while

if (flag) cout <<"Нет сведений о людях, рост которых > 180 см.\n";

} // end if

_getch();

return 0;

}

Необходимость использования структуры в данном примере не слишком очевид­на вследствие небольшого объема примера, однако в реальных задачах, работающих со множеством объектов, структуры действительно полезны.

7. Программа создающая новый текстовый файл из двух данных, в котором 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;

}