Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Программирование в среде Visual C++ 6. Учебное пособие
.pdf
10.5
GetSeconds Считывает количество секунд
GetTotalYours () Считывает суммарное количество часов
GetTotalMinutes () Считывает суммарное количество минут
GetTotalSecomds () Считывает суммарное количество секунд
10.4. Символьные строки
Исходный язык вообще непредусматривает програм-
мирование работы стекстовыми массивами. Правда, в этом
языке введён тип переменных char, где элементы этого типа
представляет собой код определённого символа. Вэтом случае одномерный массив этого типа можно считать строкой
символов, есть даже константы под названием
. Но действия с такими символьными строками как
с объектами практически не выполняются. Можно такой
объект вывести наэкран монитора или записать вкакой-либо файл или извлечь его оттуда. Пожалуй, это все возможные
действия. Остальные операции можно производить только
над отдельными символами. Поэтому бытует мнение, что
ограниченность работы состроками символов является недостатком языка посравнению сPASCAL иBASIC.
При дальнейшем развитии вязыке ++ был введён тип переменной String. Каждому объекту этого типа отводится 256
байт памяти, где можно разместить до255 символов (последний символ в строке должен быть ‘\0’, который компилятор
ставит автоматически). Это удобнее, чем было ранее, нонового практически ничего недобавило, хотя появилась возможность создания класса этого типа иввести некоторые операции. Нодля этого программист должен ещё постараться.
— 101 —

В среду Visual C++ уже внедрён новый класс CString, кото-
рый посвоим возможностям неуступает ранее упомянутым
языкам PASCAL и BASIC. Втаблице 10.6 приведены опера-
ции— функции этого класса. Формирование объекта класса
CString выполняется стандартным способом, например:
CString str=”Это текстовая строка”;
где str— объект класса (любой доступный идентификатор).
Чтобы вызвать любую функцию, нужно сослаться наобъ-
ект класса, например:
str.MakeLower ();
Все символы встроке str окажутся только строчными.
Кроме того, некоторые арифметические операции перегружены навыполнение их состроками. Так, при выполнении операции:
CString str= “Привет” +str1;
объект str будет представлять строку, где к символьной
константе “Привет” добавятся справа символы объекта str1.
Оператор:
str.Compare (str1);
сравнит два объекта str иstr1 посимвольно. Этуже операцию совершит иоператор:
if (str==str1)
10.6
CString
Compare () Сравнивает две строки сучётом регистра символов
CompareNoCase () Сравнивает две строки без учёта регистра символов
Empty () Очищает строку
Find () Находит подстроку
Format () Преобразует данные других типов встроку
— 102 —

10.6
GetAt () Считывает символ данной позиции встроке
GetBuer () Возвращает указатель насодержание строки
GetLength () Определяет количество символов встроке
IsEmpty () Возвращает True, если встроке нет символов
Le () Возвращает левый отуказателя сегмент
MakeLower () Преобразует все символы встрочные
MakeEwverse () Меняет порядок символов наобратный
MakeUpper () Преобразует все символы напрописные
Mid () Возвращает фрагмент между двумя позициями
Rigth () Возвращает правый отуказателя сегмент
SetAt () Устанавливает символ взаданную позицию
TrimLe () Удаляет пробелы между символами
TrimRRigth () Удаляет хвостовые пробелы изстроки
Как видно, оператор сравнения == тоже перегружен сучё-
том действия над символьными строками.
Если будут необходимы другие функции над символьными строками, нужно создать новый класс, родительским которого является класс CString, итуда добавить новые членыфункции, которые разработать придётся уже самим.
— 103 —

Первый опыт создания приложения в среде программи-
рования Visual C++6 исведения о различных методах про-
граммирования тех или иных составляющих программного
продукта позволит читателю уже самостоятельно составлять
свои программы для решения своих задач. При возникновении затруднений всегда можно обратиться крассмотренной
выше задаче ивоспользоваться уже предложенными способами решения проблем. Естественно, нужно начинать программировать сболее простых задач, набирая определённый
опыт программирования. Однако полученных сведений уже
достаточно для программирования более сложных задач, нежели представленная вэтой публикации.
Однако со временем может появиться желание разнообразить интерфейс Вашей задачи. Здесь придётся обратиться
уже непосредственно кисточнику [3]. Так, в10 главе описаны возможности использования таких интерфейсных элементов, как линейный индикатор, линейный регулятор, инкрементный регулятор, изображения расширенных списков
изображения, втом числе идерево, дата, календарь идругие,
широко используемые всистеме Windows.
Дальнейшим развитием Visual C++ является появление
систем автоматического программирования Visual Studio
2008, Visual Studio 2010 [4] идр. Нопрограммные продукты
Microso начинают отступать отранее применяемого прин-
ципа, что программные продукты, составленные вболее ран-
— 104 —

них версиях, будут работать всредах более поздних. Вновых
выше упомянутых продуктах серьёзным способом изменился интерфейс ивнутреннее формирование файловых систем.
Изменения коснулись ибиблиотеки функций. Так что эти системы придётся осваивать заново, но приобретённый опыт
программирования всреде Visual C++ 6 позволит достаточно
легко освоить иновые среды автоматического программирования.
— 105 —

Листинги элементов исходной программы Diur
1
- CDiurDoc
public:
double a1, a2, x0, xk, y0;
int n, nm;
2
- CDialogEdit
3
- CDiurView
protected:
double a1, a2, x0, xk, y0, xy [2] [40], h, xn, yn, fn, k1, k2, k3,
k4, dxx, dyy;
int n, i, xx, yy;
char s [40];
— 106 —

4
PreCreateWindow CMainFrame
BOOL CMainFrame:: PreCreateWindow (CREATESTRUCT&
cs)
{
if (! CFrameWnd:: PreCreateWindow (cs))
return FALSE;
// TODO: Modify the Window class or styles here by
modifying
// the CREATESTRUCT cs
cs.cx=1000;
cs.cy=800;
cs.x=00;
cs.y=00;
return TRUE;
}
5
OnNewDocument CDiurDoc
BOOL CDiurDoc:: OnNewDocument ()
{
if (! CDocument:: OnNewDocument ())
return FALSE;
a1=a2=y0=xk=1.0;
x0=0.0;
n=10;
nm=1;
// TODO: add reinitialization code here
// (SDI documents will reuse this document)
return TRUE;
}
— 107 —

6
OnDialog1 CDiurDoc
void CDiurDoc:: OnDialog1 ()
{
// TODO: Add your command handler code here
CDialogEdit dig;
nm=1;
while (dig.DoModal () ==IDOK)
{
switch (dig.m_com)
{
case 0:
a1=atof (dig.m_A1);
break;
case 1:
a2=atof (dig.m_A2);
break;
case 2:
x0=atof (dig.m_X0);
break;
case 3:
xk=atof (dig.m_XK);
break;
case 4:
y0=atof (dig.m_Y0);
break;
case 5:
n=atoi (dig.m_N);
}
UpdateAllViews (NULL);
}
— 108 —

7
OnPusk CDiurDoc
void CDiurDoc:: OnPusk ()
{
// TODO: Add your command handler code here
nm=0;
UpdateAllViews (NULL);
}
8
CDiurDoc
#include “stdafx.h”
#include “Diur.h”
#include “DiurDoc.h”
#include “DialogEdit.h”
9
OnDraw CDiurView
void CDiurView:: OnDraw (CDC*pDC)
{
CDiurDoc* pDoc = GetDocument ();
ASSERT_VALID (pDoc);
pDC->TextOut (50,20,»Интегрирование дифференци-
ального уравнения методом Рунге-Кутта»);
CPen pen (PS_SOLID,3, RGB (0,0,0));
CPen* oldPen=pDC->SelectObject (&pen);
pDC->MoveTo (50,45);
pDC->LineTo (540,45);
pDC->SelectObject (oldPen);
pDC->TextOut (50,60,”y’=a1*y*y*exp (x) +a2*y”);
a1=pDoc->a1;
— 109 —

a2=pDoc->a2;
x0=pDoc->x0;
xk=pDoc->xk;
y0=pDoc->y0;
n=pDoc->n;
sprintf (s,”a1=%4.2f,”, a1);
pDC->TextOut (50,80, s);
sprintf (s,”a2=%4.2f,”, a2);
pDC->TextOut (120,80, s);
sprintf (s,”%4.2f <=x<=%4.2f,”, x0, xk);
pDC->TextOut (50,100, s);
sprintf (s,”y0=%4.2f,”, y0);
pDC->TextOut (180,100, s);
sprintf (s,”n=%d.”, n);
pDC->TextOut (250,100, s);
if (pDoc->nm==0)
{
for (i=0; i<45; i++)
xy [0] [i] =xy [1] [i] =0.0;
pDC->MoveTo (900,5);
pDC->LineTo (900,450);
pDC->MoveTo (800,45);
pDC->LineTo (990,45);
pDC->TextOut (850,20,”x”);
pDC->TextOut (930,20,”y”);
xy [0] [0] =x0;
xy [1] [0] =y0;
h= (xk-x0) /n;
for (i=0; i<n; i++)
{
xn=xy [0] [i];
— 110 —
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
