Назад | Начало урока | Вперед
Содержание

Глава 2

4 марта

Вот фрагмент из программы по книге Павловской стр 113.
В этой программе был объявлен массив структур и в данном цикле
идет считывание из текстового файла и заполнение (инициализация)
массива структур.
Меня интересует здесь построчное считывание в промежуточный массив buf
при помощи функции getline() с двумя параметрами.Первый параметр это
название того массива,куда считывается строка файла,а второй параметр
это длина массива в который считывается строка файла:
fin.getline(buf,l_buf)

Далее из этого массива buf вычленяются отдельные поля и заполняются
поля структуры.
Функция getline вызывается в цикле много раз для того чтобы инициализировать
весь массив структур.
Посмотри этот фрагмент и читай далее.

Цикл 7 выполняет построчное считывание из файла в строку (массив) buf и
заполнение очередного элемента массива dbase.

int i =0;
while(fin.getline(buf,l_buf)) // 7 {

if(i>=l_dbase){
cout<<" Слишком длинный файл ";return 1;
} strncpy(dbase[i].name,buf,l_name);
dbase[i].name[l_name]='\0';
dbase[i].birth_year=atoi(&buf[l_name]);
dbase[i],pay=atof(&buf[l_name+l_year]);
i++;
}


Счетчик i хранит индекс первого свободного элемента массива.
Для формирования полей структуры используются
функции копирования строк strncpy(),преобразования из строки в целое
число atoi и преобразование из строки в вещественное число atof.
Обратите внимание на то ,что завершающий нуль-символ в поле фамилии
заносится вручную,поскольку функция strncpy делает это только в случае
если стррока -источник короче стрроки-приемника.
В функцию atoi передается адрес начала подстроки,в которой находится год
рождения.
Обратите внимание что при каждом проходе цикла выполняется проверка,
не превышает ли считанное количество строк размерность массива.

В моих программах кроссвордов,тоже можно считывать из файла и заполнять
массив структур.В каждой структуре один кроссворд допустим из 24 слов.
Каждое слово как отдельное поле со своим номером.

Так можно считывать из файла кроссворд в структуру и затем производить
в ней замену отдельный полей на новые или рассматривать данный кроссворд
как фрагмент другого более большого кроссворда.
Попробуй это,ничего не принимай на веру.
----------------------------------------------------------------------------
Цикл поиска сотрудников по фамилии организован как бесконечный(оператор 9)
с принудительным выходом (оператор 11).Некоторые специалисты считают
этот способ плохим,но мы думаем иначе.

while(true) // 9
{

cout<<"Введите фамилию или слово end: ";
cin>>name;
//OemToChar(name,name); // 10
if(strcmp(name,"end")==0)break; // 11
}

В прочем в данном случае выход организован не лучшим способом,поскольку
пользователь вынужден для окончания работы с программой ввести слово
end в нижнем регистре.Более удобно выходить из цикла по нажатию клавиши
Esc.К сожалению в рамках стандарта это сделать невозможно,однако
в большинстве библиотек есть функции типа getch() и kbhit(),позволяющие
анализировать нажатие клавиш.

Узнай подробнее об этих двух функциях ,это пригодится в дальнейших
консольных программах для выхода из цикла.

--------------------------------------------------------------------------
Прочитай о булевой переменной-флаге в этой программе.
Переменная-флаг тоже может быть полезна потому что она может сигнализировать
об успешном или неуспешном поиске.

5 марта

Как можно считывать информацию из файла?
Можно считывать посимвольно,пословно,построчно,и целиком файл.
Приведи примеры всех перечисленных способов считываний.

Для того чтобы узнать есть ли данное слово в текстовом файле можно
применить библиотечную функцию strstr() пример ее применения на стр
Павловской.Этот прием можно применить при пополнении файла исходных
слов для кроссвордов.
----------------------------------------------------------------------------
Построчное чтение из файла
---------------------------------------------------------------------------

Вот программа в которой построчное чтение из файла и функция
поиска введенной последовательност символов (или другими словами
введенной подстроки)
#include < fstream>
#include <string>

using namespace std;

int main() {

const int len = 81;
char word[len],line[len];

cout << " Введите слово для поиска: ";
cin >> word;

ifstream fin("text.txt",ioc::in||ios::nocreate);
if (!fin) {

cout << "Ошибка открытия файла." << endl; return 1;
}

while (fin.getline(line,len)) {

if (strstr(line, word)){
cout << "Слово присутствует: " << endl;
return 0;
}
cout << "Слово отсутствует: " << endl;
return 0;
}
...

}

Анализ:

const int len = 81; длина строки файла и длина введенной последовательности
символов.
char line[] - буфер для хранения строки файла
char word[] - буфер для хранения введенной строки символов

Следующий цикл while будет выполняться пока не обнаружится конец файла

while (fin.getline(line,len)) {

. . . //операторы
. . .
return 0;
}


Здесь в каждой итерации вызывается вновь и вновь функция getline(),
то есть строка из файла считывается в буфер line и при окончании
работы функции этот буфер очищается.
Длина строки в файле здесь определена 81 символ.Сколько на экране символов
по горизонтали?(не больше 81 символа!можешь сосчитать.)

Внутри цикла while проверяется (при помощи функции strstr() ) присутствует
ли в считанном буфере line введенная строка символов word.
Если да то ..., cout<< и return 0 ,в противном случае цикл повторяется.

while (fin.getline(line,len)) {

if (strstr(line, word)){
cout << "Слово присутствует: " << endl;
return 0;
}
}

----------------------------------------------------------------------------
Пословное чтение из файла
----------------------------------------------------------------------------
Вот программа в которой применено пословное чтение из файла с применением
класса string.
И поиск в этом файле введенного с клавиатуры слова с помощью
функции equal()

// Main.cpp
#include <fstream>
#include <string>
#include "CyrIOS.h" // for Visual C++ 6.0
using namespace std;

bool equal(const string& cw, const string& w) {

char punct[] = {
'.',',','?','!'
};

if (cw == w) return true;
for (int i=0; i < sizeof(punct); ++i)
if (cw == w + punct[i]) return true;
return false;

}


int main() {

string word, curword;

cout << " Введите слово для поиска: "; cin >> word;

ifstream fin("infile.txt"); if (!fin) {

cout << "Ошибка открытия файла." << endl; return 1;
}

int count = 0; while (!fin.eof()) {

fin >> curword;
if (equal(curword, word)) count++;
}
cout << "Количество вхождений слова: " << count << endl;
return 0;
}


1.Требуется функция которая заменяет в текстовом файле одну лексему
другой лексемой.Очень утомительно делать такие замены вручную.
2.Требуется программа которая находит нужные слова из массива
по допустим 2-й и 4-й букве

14:00 15.03.05

В программе кроссворда DvorC_02 наиболее интересна, а возможно и спорна
функция Fn2(), которая из двух заданных массивов находит два слова.
(Из каждого массива по одному слову.)Одна из двух букв в этих
словах является общей по условию.Как узнать сколько таких пар слов
в данных двух массивах ?
Я применяю следующий прием:из первого массива отбираю в новый массив
только те слова,у которых есть как минимум хотя бы одно совпавшее
слово во втором массиве.И так все эти слова я собираю в новый массив
и затем предлагаю пользователю выбрать из этого нового массива
любое слово.Заведомо пара ему уже есть во втором массиве.После
того как пользователь выбирает слово,я применяю цикл,который проверяет
по общей букве все слова во втором массиве на предмет совпадения
с выбранным пользователем словом и все совпавшие слова выводятся во
второй новый массив и пользователю предлагается выбрать из него опять
новое слово.После этого оба слова для кроссворда оказываются выбранными.
Каждое из этих двух слов можно проверить другой функцией на предмет
того,есть ли еще в исходном массиве такие слова,у которых
допустим вторая буква "а" а четвертая буква "о",как требуется нам
по условию.
Так ты сможешь проверить хорошо ли работает функция Fn2()
и все ли возможные парные слова она показывает в результате своей работы.
И если не все,то почему ?

9:22 16.03.05

Написал две программки Poisk02a.cpp и Poisk01a.cpp
в этих программах из исходного массива создается новый массив
при условии что в новом массиве одна буква во всех словах одинакова
во второй программе две буквы во всех словах одинаковы.
В обоих программах для этой цели используются функции ,их определение
находится в заголовочном файле.В главной программе происходит их вызов.
Оба массива - и исходный ,и массив- получатель естественно
организованы и находятся вне функции.

Теперь надо написать программы которые образуют новый массив
по совпадению трех а затем и четырех букв.
Програмы написаны,теперь осталось написать универсальную программу,
в которой действуют все эти четыре программы.Должен быть задействован
оператор swith (переключатель на ту ветку,которую выберет пользователь).
С первого раза универсальная программа не получилась.

Новая тема:

В программе 13.1 из Девиса стр 142 покаазано как инициализировать
класс.Таким способом можно воспользоваться и сделать в классе
-содержимое одного кроссворда.Вот как это примерно выгладит:
Пример программы c13_01.cpp
--------------------------------------------------------------------------------------

Приведенный ниже пример демонстрирует использование класса NameDataSet .

Программа StructClass01.cpp

Сразу переделываю эту программу под кроссворды
Опробуем на трехсловном кроссворде

//DataSet -записывает соответствующую информацию в массиве объектов

#include<stdio.h>
#include<iostream.h>
#include<string.h>

//NameDataSet -содержит три слова кроссворда

class NameDataSet

{

public:
string firstName; // первое слово
string lastName; // второе слово
string midleName;// третье слово

};


//функция getData()
//функция ввода данных в поля класса:

int getData(NameDataSet &nds)//в параметре имя объекта (nds) и его тип
// (NameDataSet) {

cout<<"\n Vvedite pervoe slovo:"; cin>>nds.firstName;

if (stricmp(nds.firstName,"exit")==0)

{

return 0;
}


cout<<" Vvedite vtoroe slovo:";
cin>>nds.lastName;

cout<<" Vvedite tretye slovo:";
cin>>nds.midleName;

return 1;

}


// displayData()-выводит содержимое
всех полей одного объекта NameDataSet

void displayData(NameDataSet& nds) {

cout< <<" "
< <<"\n"
< <<"\n";
}


int main(int nArg,char* pszArgs[])

{

const int MAX=25;

// создать 25 объектов типа NameDataSet

NameDataSet nds[MAX];

//считывает слова для кроссворда

cout<<"schityvaet s klaviatury slova dlya krossworda\n"
<<"vvedite v pole imeny 'exit'\n"
<<"dlya vyhoda iz programmy\n"

//функция ввода данных в поля класса:
//в моем случае в поля класса информация будет вводиться не с клавиатуры,
//а программно- будут выбраны строковые переменные и заполним
//все поля класса этими переменными.
//NameDataSet nds;

nds[0].firstName = Slovo9a;
nds[0].lastName = Slovo05_05a;
nds[0].midleName = Slovo05_06a;

//выведем найденные слова в форме кроссворда

cout <<"\n Slova :\n";
for (int=0;i displayData(nds[i]);

}


for(;;) {

int n;
cout<<"Hotite zamenity slovo v krossworde y=1 /n =0 ?";
cin>>n;

if(n==1)getData(nds[0]);

/*
// Ввод данных с клавиатуры в цикле при помощи вызова функции getData()
// в моем случае цикл не потребовался так как в программе всего один объект
// (один кроссворд из трех слов)

int index=0;

while(getData(nds[index]) && index < MAX) {

index++;
}
*/

// Вывод кроссворда на экран после внесения изменений

cout <<"\n Slova :\n";

for (int=0;i displayData(nds[i]);

}
char q;
cout<<"Hotite zamenity slovo ? ";
cin>> q;
if(q =='y')continue;
break;
}
return 0;
}
//end of program
--------------------------------------------------------------------------------------

Можно сделать так что при объявлении поля класса инициализируются
нулями а при вызове функции getData () ,будет инициализироваться
значениями найденными нами в процессе выполнения программы.
Можно сделать так чтобы getData и displayData стали функциями-членами.
С помощью их можно инициализировать и показывать поля класса.

1.Надо написать функцию-конструктор класса так,чтобы поля класса
при обявлении объекта инициализировались значениями,найденными
нами в процессе выполнения программы.Данный объект класса должен
объявляться только после того как,нами уже найдены все слова
для кроссворда -это фактически вся программа DvorC_02
а данная программа StructClass01.cpp должна войти как фрагмент
в программу DvorC_02.

1.Надо в этой программе переписать функцию getData() чтобы она запрашивала
"Введите номер слова в кроссворде" затем
"Введите новое слово"

Надо сделать перечисление enum NUM (firstName,lastName,midleName)
cout<<"Vvedite nomer slova";
cin>>n;

11:03 17.03.05

Для меня могут оказаться полезными такие функции класса string как
замена строки (или лексемы) другой строкой или лексемой.
Удаление из текста строки или лексемы или слова сколько бы раз
они не встретились в тексте.

Все еще путаюсь в циклах.Надо поместить в мой справочник образцы
циклов и выходы из циклов.

Отдельно написать программу для сочинителя кроссвордов и отдельно
для разгадывателя кроссвордов.

9:53 18.03.05

Сегодня снимал показания счетчиков.Записал в таблицу Excel.
И что мне очень нравится в этой таблице,это то что я занес
только первые цифры - показания счетчиков(число единиц).
А число киловатт и прирост за месяц в киловаттах таблица сосчитала
сама!Таким образом можно написать такую программу,которая
сама считает количество денег,которые необходимо заплатить
за потребленную электроэнергию и все это в Excel таблице.
Так не мешкай,сделай это сейчас!
Вот и сделал и работает прекрасно.

Вот так незаметно подошел к тому,что сейчас уже мне в программе
требуются структуры и классы.
Как мы знаем в качестве полей класса могут выступать не только
переменные разных типов,но и например массивы,структуры или
объекты классов.
Если например одним из полей класса является массив ,то как
обратиться к члену этого массива извне класса,например из главной
программы,когда класс определен в заголовочном файле?
Или если одним из полей класса является структура,то как обратиться
к полю этой структуры? или к полю класса,который содержится внутри
данного класса?

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

1-й вариант программы:
За основу оставляем программу которая написана нами и сочинила
24-словный кроссворд DvorC_02.
Перед тем как выводить все найденные слова на экран,поместим их в поля
класса NameDataSet .Сделаем это программно,например так:

//в моем случае в поля класса информация будет вводиться не с клавиатуры,
//а программно- будут выбраны строковые переменные и заполним
//все поля класса этими переменными.
//NameDataSet nds;

string Slovo9a ="samariten";
string Slovo05_05a ="bears";
string Slovo05_06a ="break";

nds.firstName = Slovo9a;
nds.lastName = Slovo05_05a;
nds.midleName = Slovo05_06a;

Таким образом можно ввести в поля класса все 24 слова кроссворда.

После того как мы инициализируем таким образом все поля класса,
нам потребуется по крайней мере две функции.

Первая функция DisplayData()
будет выводить поля класса на экран в форме кроссворда.

Вторая функция SetData() будет призвана к тому,чтобы с помощью ее
пользователь мог изменить любое поле класса (любое слово) по отдельности
и чтобы после этого можно снова было вывести кроссворд на
экран но уже с измененным полем (а остальные поля класса при этом
могут остаться без изменений).

Можно еще написать функцию GetData() при помощи которой пользователь может
получить любое слово (любое поле ).

Далее смотри варианты программ DvorStructClass01 и тд.

Где у меня находится новый вариант вывода 24-словного кроссворда на экран
(вывод через букву) ?В какой директории?

9:42 19.03.2005
-----------------------------------------------------------------------------
Написал программу DvDataStructo5 которая составляет кроссворд из 24 слов
при этом использованы заголовочные файлы.
Использованы пользовательские классы и их объекты
Эта программа делает то же что и программа без пользовательских
классов а какая из них лучше-это решать пользователю.Он всегда прав.
Мне нравятся обе программы.
Может представлять интерес для публики
------------------------------------------------------------------------------

20:22 26.03.2005

Написал программу DataStructZ08 которая составляет кроссворд из 6 слов
7-буквенных.Эта программа является фрагментом большой 30-словной программы.
И продолжение этой програмы уже где то мною написано.Найти бы и сделать уж
30 - словный кроссворд

Написал программу DataStructZ09 которая составляет кроссворд из 6 слов
7-буквенных.Эта программа лучше предыдущей.Еще можно как то ее усовершенствовать,
но уже и с этой программой можно хорошо работать.
Например набери такие номера 35,413 или 112,214 и ты увидишь как богато
она находит слова для такого кроссворда.

Написал программу DataStructZ10 которая составляет кроссворд из 14 слов

Написал программу DataStructZ11 которая составляет кроссворд из 14 слов
плюс еще 1 слово -9-буквенное

---------------------------------------------------------------------------
Написал программу DataStructZ12 которая составляет кроссворд из 18 слов

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

Написал программу DataStructZ14 которая составляет кроссворд из 30 !!! слов
Откомпилировалась нормально,но глючит при исполнении
Память не может быть written -такая примерно ошибка

18:03 27.03.2005
-----------------------------------------------------------------------
Программа DvorC_02 наиболее интересна ,она строит 24-словный кроссворд
и выводит в форме кроссворда, но в ней еще не применена структура
и потому код главной программы очень длинный состоит из 8 модулей
Далее развитие этой программы в том ,чтобы разбить ее на модули
и убрать их в заголовочные файлы,чтобы главная программа выглядела
более компактно.
Может представлять интерес для публики
--------------------------------------------------------------------------

Этапы развития программы
------------------------------------------------------------------
DvDataStruct01 -
одно слово задаем и три находим для кроссорда
при помощи функции
SetDataStruct(bbc1);//найдем 4 слова вызвав функцию SetDataStruct()

Строит кроссворд по форме :

Подсказка


Выводит не в виде кроссворда
-----------------------------------------------------------------------
Этапы развития программы

DvDataStruct02 -

четыре раза вызвана функция :
SetDataStruct(bbc1);//найдем 4 слова вызвав функцию SetDataStruct()

и потому найдено четыре таких кроссворда ,но это не правильно потому,что
надо поворачивать эти кроссворды на 90 градусов

--------------------------------------------------------------------------
DvDataStruct03 -развитие продолжается
DvDataStruct04 -
---------------------------------------------------------------------
DvDataStruct05 - эта программа снова находит полный 24-словный кроссворд
как и программа DvorC_02 но выводит не в форме кроссворда

////////////////////////////////////////////////////////////////////////////////

ТРИ ОСНОВНЫХ ГОТОВЫХ ПРОГРАММЫ НА СЕГОДНЯ

/////////////////////////////////////////////////////////////////////////////////

-----------------------------------------------------------------------
Программа DvorC_02 наиболее интересна ,она строит 24-словный кроссворд
и выводит в форме кроссворда, но в ней еще не применена структура
и потому код главной программы очень длинный состоит из 8 модулей
Далее развитие этой программы в том ,чтобы разбить ее на модули
и убрать их в заголовочные файлы,чтобы главная программа выглядела
более компактно.
Выводит в виде кроссворда
Может быть интересна для публики
--------------------------------------------------------------------------
-----------------------------------------------------------------------------
Написал программу DvDataStruct05 которая составляет кроссворд из 24 слов
при этом использованы заголовочные файлы.
Использованы пользовательские классы и их объекты
Эта программа делает то же что и программа без пользовательских
классов(то же что и программа DvorC_02) а какая из них лучше-это
решать пользователю.Он всегда прав.
Мне нравятся обе программы.
Эта программа может быть интересена

Эта программа требует вывода в форме кроссворда
------------------------------------------------------------------------------
---------------------------------------------------------------------------
Написал программу DataStructZ13 которая составляет кроссворд из 18 слов
Выводит в форме кроссворда

Эта программа может быть интересена для публики
--------------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////////////////

ЭТО ЗАМЕЧАТЕЛЬНЫЕ ПРОГРАМЫ !!!

//////////////////////////////////////////////////////////////////////////////////////////


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz