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

Глава 2


15:44 01.04.05

Все не мог воспользоваться перечислением в моих программах
но вот нашел пример использования перечисления enum в программе из
Либерти урок 13

В начале программы объявляется перечисление:

#include
using namespace std;

enum {

kIsSmaller, kIsLarger, kIsSame
};

Затем определяется функция Compare(),которая возвращает один из этих элементов перечисления в результате своей работы.
В качестве параметра передается ссылка на объект типа Data:

//Функция Compare() используется ,чтобы определить
//относительное положение объекта в списке

int Data::Compare(const Data & theOtherData) {

if (myValue < theOtherData.myValue)
return kIsSmaller;
if (myValue > theOtherData.myValue)
return kIsLarger;
else
return kIsSame;
}


Далее в программе объект myData будет вызывать эту функцию
и ее возвращаемое значение будет присвоено переменной result.
В качестве аргумента передается указатель.
Затем используется переключатель switch который обрабатывает
значение этой переменной.В зависимости от значения этой переменной
программа может пойти по тому или другому руслу благодаря переключателю
switch :

int result = myData->Compare(*theData);

Объект myData сравнивает свою величину с величиной объекта, адрес которого
мы передаем в качестве аргумента функции Compare().Возвращаемое значение
функции присваивается переменной result

switch(result) {

// по соглашению если он такой же как я то идет первым

case kIsSame: //придется пропустить новые данные
case kIsLarger: // впереди себя {

InternalNode * dataNode = new InternalNode(theData, this);
return dataNode;
}


//он больше меня,поэтому пошел он к следующему
//блоку и пусть ОН его обработает

case kIsSmaller:
myNext = myNext->Insert(theData);
return this;

}
return this; // успокоить MSC
}


Из вышеприведенного примера видно,что при помощи перечисления функция может
возвратить не просто одно значение,а одно значение из нескольких.
Например одно значение из 10 или даже одно из 100.
А затем при помощи опять же переключателя switch можем направить
работу программы по одному из 100 вариантов или русел в зависимости от того
какое значение вернула функция.

----------------------------------------------------------

21:40 01.04.2005

Нашел причину глюка в своей программе Romb30_01
Глюк находится в функции fn2()

Если эта функция не находит нужного слова для вывода на экран.
Его просто нет в массиве.
А команда вывода все равно остается же в этой функции,хотя
слово и не найдено.Вот тут то и сообщение идет во время исполнения
программы .Так называемый Run Time Error Ошибка во время исполнения
програмы.
Не знаю как с этим бороться.
Надо чтобы данные были,там где они должны быть.

9:21 02.04.2005

Наконец то дописал программу,которая составляет 30 -словный кроссворд
Romb30_01

В директории StructClass/Готовый Продукт

Ранее были написаны программы 24-словного кроссворда
Romb24_01 Romb24_02 и 18-словного кроссворда Romb18_01
в этой же директории

---------------------------------------------------------------

22:14 02.04.2005

Ни как не хочет работать у меня кириллица
Проекты Task4_1a и Task4_1b
Из учебника Павловской стр 153

Все время компилятор сообщает об ошибке.Как быть?
Без кириллицы нельзя же ведь в программах.
Не умею открывать несколько проектов в MSVC

8:03 03.04.2005

Ну вот и решена вчерашняя проблема!
Использовал компилятор MSVC версия 6.
Кириллица работает!
Действия были такими:
---------------------------------------------------------------

Создание нового проекта:

File->New
В открывшемся диалоговом окне выбрать вкладку Projects
- выберите тип Win32 Console Application;
-введите имя проекта в текстовом поле Project Name ,например First;
-введите имя каталога размещения файлов проекта (в текстовом поле
Location)Здесь чтобы программа компилировалась правильно мне надо
набирать такой путь C:\Program Files\Microsoft Visual Studio
-щелкните левой кнопкой мыши OK

После щелчка запускается мастер приложений Application Wizard,
который открывает диалоговое окно предлагая определиться какой
подтип консольного приложения вам требуется создать.
-выберите тип An empty project;
-щелкните на кнопке Finish

После щелчка появится New Project Information со спецификациями проекта
и информацией о каталоге,в котором будет размещен создаваемый проект.
-щелкните на кнопке OK

Далее перед вами откроется рабочее окно.(из трех окон)

Далее можете свернуть пока рабочее окно компилятора и посмотреть,
что в той директории, в какой мы указали образовалась новая папка
по имени First .Загляните в нее и вы увидите несколько файлов
и папку Debug. О назначении файлов можете прочитать на стр 215
Приложения 1 Павловской

Разверните обратно окно компилятора.Первое что мы видим, это то что
окно Project Workspace оживилось,в нем появились две вкладки -
Class View и File View. В структурных приложениях нет классов, поэтому
с первой вкладкой пока работать не будем, перейдем на вкладку File View.
Она предназначена для просмотра списка файлов проекта. Откроем список
First Files, щелкнув по значку +. Мы увидим Source Files, Header Files
Resourse Files. Так как в консольных приложениях файлы ресурсов не используются,
то про последнюю папку сразу забудем. Если заглянем в две другие папки,
то мы увидим что они пусты. Это потому, что мы выбрали пустой проект -An empty
project.

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

Добавление существующего файла

Если файлы у нас уже набраны в каком -либо редакторе(например файл first.cpp
и файл first.h) То надо делать следующее:
-скопируйте ваши файлы в папку рабочей области проекта (в данном случае это папка First
ее адрес C:\Program Files\Microsoft Visual Studio\First ) Эту операцию вы сделаете в
Windows Commander

-вернитесь к списку First files в окне Project Workspace вашего проекта и щелкните правой
кнопкой мыши на папке Sourse Files
-в появившемся контекстном меню щелчком мыши выберите команду добавления файлов
Add Files to Folder...
-в открывшемся диалоговом окне Insert Files выберите нужный файл(first.cpp)
и щелкните OK.

Добавление нового файла

. . .

Многофайловые проекты

Надо просто много раз поворить процедуру создания -добавления исходных файлов
описанную выше.В многофайловых проектах обычно присутствуют и заголовочные файлы
- они создаются-добавляются после щелчка правой кнопкой мыши на пиктограмме папки
Header Files в окне Project Workspace;при этом на вкладке Files диалогового окна New
выбирается тип файла C/C++Header File,а при вводе имени файла используется
расширение .h .

Компиляция,компоновка и выполнение проекта стр 218

-------------------------------------------------------------------------------------

9:35 03.04.2005

Итак оба проекта работают!!
Проекты Task4_1a и Task4_1b
Из учебника Павловской стр 153
смотри файлы D:\языкСи\кросв01\кириллица\Task4_1a,Task4_1b

Теперь можно подключать в свои программы заголовочный файл

#include"CyrIOS.h" и программы должны работать
Но надо еще подключать файл
#include"CyrIOS.cpp"

Проверь это!
Проверил .Работает
смотри файл D:\языкСи\кросв01\кириллица\рабочий

Пора использовать это новое качество-работа с кириллицей- в более интересной
программе.
Но сначала надо создать исходные файлы русских слов 5,7,9-буквенных
Чтобы создать массив русских слов для кроссворда,воспользуемся замечательной
программой LovitZZbukv02 только в ней подправим одну строку
goodChar="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
здесь должен быть русский алфавит!

9:52 05.04.05

Начал новый проект "Русский Кроссворд" смотри одноименную директорию.
Интересно что в программе LoviSlov02 в модуле LovitZZbukv02
есть строка if(-1==goodChar.find(curword[i]))
Здесь goodChar - объект типа string вызывает функцию find(curword[i])
с аргументом. В качестве аргумента здесь в функции стоит одиночный
символ и функция ищет есть ли такой символ в объекте goodChar.Если есть,
то возвращает true в противном случае false.А можно ли в качестве
аргумента этой функции поставить не одиночный символ,а допустим
какое-нибудь слово или сочетание символов.Было бы интересно,
если бы функция искала слово или сочетание символов в проверяемой
строке.Это можно было бы использовать в проверяемой работе.

Интересно что модуль 3 можно использовать для подсчета слов в
отсортированном по длине массиве слов.Проверь это!

8:43 06.04.2005

И так сегодня у меня есть программы с помощью которых я создаю
массив русских слов для кроссворда :
-----------------------------------------------------------------
Программа LovitSlov01
Эта программа вылавливает из текстового файла слова указанной
длины и выводит их в новый файл без повторов
Все буквы в словах в нижнем регистре

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

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

------------------------------------------------------------
Программа LovitSlov05
Эта умница программа.
Из входного файла infile1.txt убрала все
повторяющиеся слова

Программа состоит из двух модулей:
первый модуль сосчитал количество строк в файле infile1.txt,
а в данном случае это совпало с количеством слов.
Во втором модуле программа убрала из файла infile1.txt
все повторяющиеся слова и поместила новый массив
в файл outfile3.txt
Эта программа может использоваться только если в каждой строчке по
одному слову и массив слов отсортирован по длине
Можно ее переделать так чтобы в каждой строчке было по 4 слова
или по 8 слов ,тогда она тоже будет правильно считать количество слов
в файле а дальше уже тоже убирать повторы.
------------------------------------------------------------

Следует применить теперь сортировку по алфавиту
Сортировку по алфавиту применяю при помощи программ
Инициал01 и АльфаСорт01 , АльфаСорт02
Первая программа Инициал01 является вспомогательной для программ
сортировки АльфаСорт01 и АльфаСорт02 .
В програме Инициал01 массив слов одевается в кавычки -это необходимо
для правильной работы программ сортировки,которые написаны так, что
массив слов при исполнении будет помещаться в стек.

Директория Тексты -тексты,взятые из интернета, из которых черпается
база русских слов адрес из интернета текстов:

www.public-library.narod.ru
www.intirum.ru -периодические издания
www.rubricon.com -энциклопедии и словари
www.aonb.ru -областная библиотека

Отсортированнные слова находятся в директории База01

---------------------------------------------------------
12:31 11.04.05

Снова как в тупике при вопросе о чтении из текстового файла
в динамиескую память. Надо вызубрить все способы наизусть
и в Си и в Си++.

И так объявляем указатель *curword2 на тип string,затем
оператор new присваивает указателю адрес в динамической
памяти (адрес начале массива) и в квадратных скобках количество
ячеек способных каждая вместить один объект типа string.

string *curword2;
curword2 = new string[kolSlov];

Получается что у нас здесь в динамической памяти поместится
целый массив объектов типа string.Так ли это?

--------------------------------------------------------
Вот как инициализируется строка в куче по Павловской:
Для строк не определена операция присваивания,поскольку строка является
не основным типом данных, а массивом. Присваивание выполняется с помощью
функций стандартной библиотеки или посимвольно вручную
(что менее предпочтительно так как чревато ошибками). Например чтобы
присвоить строке p строку a, можно воспользоваться функциями strcpy()
и strncpy() :

char a[100] = "Never trouble trouble";
char *p = new char [m];
strcpy(p,a);
strncpy(p,a,strlen(a)+1);

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

Функция strcpy(p,a) копирует все символы строки,указанной вторым параметром
(a),включая завершающий 0 в строку,указанную первым параметром(p).

Функция strncpy(p,a,n) выполняет то же самое но не более n символов,
то есть числа символов ,указанного третьим параметром.Если нуль-символ
в исходной строке встретится раньше,копирование прекращается, а оставшиеся
до n символы строки p заполняются нуль-символвми.В противном случае
(если n меньше или равно длине строки a) завершающий нуль-символ в p
не добавляется.

Обе эти функции возвращают указатель на результирующую строку.Если
области памяти, занимаемые строкой-назначением и строкой источником
перекрываются, поведение программы не определено.
Функция strlen(a) возвращает фактическую длину строки a, не включая
нуль-символ.

Программист должен сам заботиться о том, чтобы в строке-приемнике
хватило места для строки-источника(в данном случае при выделении памяти
значение переменной m должно быть больше или равно 100), и о том,чтобы
строка всегда имела завершающий нуль-символ.
--------------------------------------------------------------------------
Выход за длину строки и отсутствие нуль-символа являются распространенными
причинами ошибок в программах обработки строк.
--------------------------------------------------------------------------
Еще по Павловской:
Следующая программа покажет вывод содержимого текстового файла на
экран.(Имя файла задается аргументом командной строки)

//MyCopy.cpp

#include <fstream.h>
#include <iostream.h>
using namespace std;

int main( int argc,char* argv[]) {

ifstream from1("text1");//открываем файл для считывания

if(!from1) {

cout<<"Vhodnoi fail ne naiden:" ;
char enterchar;
cout< cin>>enterchar;
return (1);
}
char buf[1024];

while (!from1.eof()) //пока не достигнут конец файла {

from1.getline(buf,sizeof(buf));
cout<
}


char enterchar;
cout< cin>>enterchar;

return 0;

}


* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

На основе вышеприведенного примера напрашивается сделать так,чтобы
массив buf[] стал бы двумерным массивом.И при каждой итерации
цикла чтобы инкременировать массив второго более высокого чем
символы уровня. Массив второго уровня - это строки,массив первого
уровны-это символы. Тогда весь текстовый файл состоящий из строк и из
символов вместится в этот двумерный массив строк.

char buf[100];
char *p = new char [m];

while (!from1.eof()) //пока не достигнут конец файла {

from1.getline(buf,sizeof(buf));
cout< strcpy(p,buf);
p++;
cout<<*p<
}


char enterchar;
cout< cin>>enterchar;

Что тут получилось?Полный кавардак в голове!

Или объявить двумерный массив типа char

char buf[1024];

char z[80][20];
//char *p = z;
int i=0;
while (!from1.eof()) //пока не достигнут конец файла {

from1.getline(buf,sizeof(buf));
cout< strcpy(z[i],buf);
cout< i++;
}


char enterchar;
cout< cin>>enterchar;

Что получится из этого кода?

В связи с этим материалом и функцией getline() повтори о посмотри
материал из школа\символьные массивы\kross1_04 и тд.
Здесь показано как инициализировать двумерный символьный массив
при помощи функции getline() и как потом обратиться к каждому
слову из этого массива а так же к каждому символу внутри слова.

Преобразуй те файлы,которые там написаны,но преобразуй их
так чтобы инициализировались двумерные символьные массивы
при помощи этой же функции но уже из текстового файла!

Затем остается объявить двумерный символьный массив в динамической
памяти и инициализировать его из текстового файла при помощи
этой же функции getline()

18:58 11.04.2005

Произведем исследовательскую работу в каталоге Школа\"Рабочий"

Пришлось вернуться к языку С и пособию С за 21 день.
День 16 работа с файлами.Листинг 16.1

20:44 14.04.2005

Наконец нашел программку с использованием двумерного
символьного массива Язык С из книги Освой сам С за 21 день

Программа 14.12 puts.c
Использование функции puts() для отображения строк

/* Demonstrates puts(). */

#include <stdio.h>

/* Declare and initialize an array of pointers. */

char *messages[5] = {

"This", "is", "a", "short", "message."
};

int main( void ) {

int x;

for (x=0; x<5; x++)
puts(messages[x]);

puts("And this is the end!");

return 0;

}


В этой программе объявляется массив указателей на строки.
До сих пор вы еще не работали с такими объектами
С помощью таких двумерных массивов и этой функции можно выводить на экран
слова подходящие для моих кроссвордов. При помощи этой функции можно
вывести и отдельные символы из подобного двумерного массива.
Надо попробовать и можно передалать несколько программ из ранее
написанных для С++.


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

Hosted by uCoz