…
Программа:
#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;
}