65.43 e - 21
и вызовет синтаксическую ошибку.
Если вы хотите иметь константу с плавающей точкой типа float, вы можете определить ее так:
const float pi = 3.14159265;
2.1.3 Символьные Константы
Хотя в C++ и нет отдельного символьного типа данных, точнее, символ может храниться в целом типе, в нем для символов имеется специальная и удобная запись. Символьная константа - это символ, заключенный в одинарные кавычки; например, 'a' или '0'. Такие символьные константы в действительности являются символическими константами для целого значения символов в наборе символов той машины, на которой будет выполняться программа (который не обязательно совпадает с набором символов, применяемом на том компьютере, где программа компилируется). Поэтому, если вы выполняетесь на машине, использующей набор символов ASCII, то значением '0' будет 48, но если ваша машина использует EBCDIC, то оно будет 240. Употребление символьных констант вместо десятичной записи делает программу более переносимой. Несколько символов также имеют стандартные имена, в которых обратная косая \ используется как escape-символ:
'\b' | возврат назад |
'\f' | перевод формата |
'\n' | новая строка |
'\r' | возврат каретки |
'\t' | горизонтальная табуляция |
'\v' | вертикальная табуляция |
'\\' | обратная косая (обратный слэш) |
'\'' | одинарная кавычка |
'\"' | двойная кавычка |
'\0' | null, пустой символ, целое значение 0 |
Вопреки их внешнему виду каждое является одним символом. Можно также представлять символ одно-, дву- или трехзначным восьмеричным числом (символ \, за которым идут восьмеричные цифры), или одно-, дву- или трехзначным шестнадцатеричным числом (\x, за которым идут шестнадцатеричные цифры). Например:
'\6' '\x6' 6 ASCII ack
'\60' '\x30' 48 ASCII '0'
'\137' '\x05f' 95 ASCII '_'
Это позволяет представлять каждый символ из машинного набора символов, и в частности вставлять такие символы в символьные строки (см. следующий раздел). Применение числовой записи для символов делает программу непереносимой между машинами с различными наборами символов.
Строковая константа - это последовательность символов, заключенная в двойные кавычки:
"это строка"
Каждая строковая константа содержит на один символ больше, чем кажется; все они заканчиваются пустым символом '\0' со значением 0. Например:
sizeof("asdf")==5;
Строка имеет тип "вектор из соответствующего числа символов", поэтому "asdf" имеет тип char[5]. Пустая строка записывается "" (и имеет тип char[1]). Заметьте, что для каждой строки s strlen(s)==sizeof(s)-1, поскольку strlen() не учитывает завершающий 0. Соглашение о представлении неграфических символов с обратной косой можно использовать также и внутри строки. Это дает возможность представлять в строке двойные кавычки и escape-символ \. Самым обычным символом этого рода является, безусловно, символ новой строки '\n'. Например:
cout << "гудок в конце сообщения\007\n"
где 7 - значение ASKII символа bel (звонок). В строке невозможно иметь "настоящую" новую строку:
"это не строка,
а синтаксическая ошибка"
Однако в строке может стоять обратная косая, сразу после которой идет новая строка; и то, и другое будет проигнорировано. Например:
cout << "здесь все \
ok"
напечатает
здесь все ok
Новая строка, перед которой идет escape (обратная косая), не приводит к появлению в строке новой строки, это просто договоренность о записи. В строке можно иметь пустой символ, но большинство программ не будет предполагать, что есть символы после него. Например, строка "asdf\000hjkl" будет рассматриваться стандартными функциями, вроде strcpy() и strlen(), как "asdf".
Вставляя численную константу в строку с помощью восьмеричной или шестнадцатеричной записи благоразумно всегда использовать число из трех цифр. Читать запись достаточно трудно и без необходимости беспокоиться о том, является ли символ после константы цифрой или нет. Разберите эти примеры:
char v1[] = "a\x0fah\0129"; // 'a' '\xfa' 'h' '\12' '9'
char v2[] = "a\xfah\129"; // 'a' '\xfa' 'h' '\12' '9'
char v3[] = "a\xfad\127"; // 'a' '\xfad' '\127'
Имейте в виду, что двузначной шестнадцатеричной записи на машинах с 9-битовым байтом будет недостаточно.
Ноль (0) можно употреблять как константу любого целого, плавающего или указательного типа. Никакой объект не размещается по адресу 0. Тип нуля определяется контекстом. Обычно (но не обязательно) он представляется набором битов все-нули соответствующей длины.
2.1.6 ConstКлючевое слово const может добавляться к описанию объекта, чтобы сделать этот объект константой, а не переменной. Например:
const int model = 145;
const int v[] = { 1, 2, 3, 4 };
Поскольку константе ничего нельзя присвоить, она должна быть инициализирована. Описание чего-нибудь как const гарантирует, что его значение не изменится в области видимости:
model = 145; // ошибка
model++; // ошибка
Заметьте, что const изменяет тип, то есть ограничивает способ использования объекта, вместо того, чтобы задавать способ размещения константы. Поэтому например вполне разумно, а иногда и полезно, описывать функцию как возвращающую const:
const char* peek(int i)
{
return private[i];
}
Функцию вроде этой можно было бы использовать для того, чтобы давать кому-нибудь читать строку, которая не может быть затерта или переписана (этим кем-то). С другой стороны, компилятор может несколькими путями воспользоваться тем, что объект является константой (конечно, в зависимости от того, насколько он сообразителен). Самое очевидное - это то, что для константы не требуется выделять память, поскольку компилятор знает ее значение. Кроме того, инициализатор константы часто (но не всегда) является константным выражением, то есть он может быть вычислен на стадии компиляции. Однако для вектора констант обычно приходится выделять память, поскольку компилятор в общем случае не может вычислить, на какие элементы вектора сделаны ссылки в выражениях. Однако на многих машинах даже в этом случае может достигаться повышение эффективности путем размещения векторов констант в память, доступную только для чтения. Использование указателя вовлекает два объекта: сам указатель и указываемый объект. Снабжение описания указателя "префиксом" const делает объект, но не сам указатель, константой. Например:
const char* pc = "asdf"; // указатель на константу
pc[3] = 'a'; // ошибка
pc = "ghjk"; // ok
Чтобы описать сам указатель, а не указываемый объект, как константный, используется операция const*. Например:
char *const cp = "asdf"; // константный указатель
cp[3] = 'a'; // ok
cp = "ghjk"; // ошибка
Чтобы сделать константами оба объекта, их оба нужно описать const. Например:
const char *const cpc = "asdf"; // const указатель на const
cpc[3] = 'a'; // ошибка
cpc = "ghjk"; // ошибка
Объект, являющийся константой при доступе к нему через один указатель, может быть переменной, когда доступ осуществляется другими путями. Это в частности полезно для параметров функции. Посредством описания параметра указателя как const функции запрещается изменять объект, на который он указывает. Например:
char* strcpy(char* p, const char* q); // не может изменить q
Указателю на константу можно присваивать адрес переменной, поскольку никакого вреда от этого быть не может. Однако нельзя присвоить адрес константы указателю, на который не было наложено ограничение, поскольку это позволило бы изменить значение объекта. Например:
int a = 1;
const c = 2;
const* p1 = &c; // ok
const* p2 = &a; // ok
int* p3 = &c; // ошибка
*p3 = 7; // меняет значение c
Как обычно, если тип в описании опущен, то он предполагается int.
Есть другой метод определения целых констант, который иногда более удобен, чем применение const. Например:
enum { ASM, AUTO, BREAK };
определяет три целых константы, называемы перечислителями, и присваивает им значения. Поскольку значения перечислителей по умолчанию присваиваются начиная с 0 в порядке возрастания, это эквивалентно записи:
const ASM = 0;
const AUTO = 1;
const BREAK = 2;
Перечисление может быть именованным. Например:
enum keyword { ASM, AUTO, BREAK };
Имя перечисления становится синонимом int, а не новым типом. Описание переменной keyword, а не просто int, может дать как программисту, так и компилятору подсказку о том, что использование преднамеренное. Например:
keyword key;
switch (key) {
case ASM:
// что-то делает
break;
case BREAK:
// что-то делает
break;
}
побуждает компилятор выдать предупреждение, поскольку только два значения keyword из трех используются. Можно также задавать значения перечислителей явно. Например:
enum int16 {
sign=0100000, // знак
most_significant=040000, // самый значимый
least_significant=1 // наименее значимый
};
Такие значения не обязательно должны быть различными, возрастающими или положительными.
1. Герберт Шилдт, Самоучитель С++, 3-е издание: BHV – Санкт-Петербург, 1998. – 688 с.
2. Рубенкинг Н. Программирование в Delphi для «чайников». 2-е издание – К.: «Диалектика», 1996. – 368 с.
3. Фаронов В.В. Delphi 4. Учебный курс.-М.: «Нолидж», 1999.-464 с.
#include <vcl.h>
#pragma hdrstop
#include "About.h"
#include "AlexWord.h"
#include "LogoStrs.h"
const float RulerAdj = 4.0/3.0;
const int GutterWid = 6;
#pragma link "CGRID"
#pragma resource "*.dfm"
TForm1 *Form1;
__fastcall TForm1::TForm1(TComponent *Owner)
: TForm(Owner)
{
}
void __fastcall TForm1::RichEdit1SelectionChange(TObject *Sender)
{
char sizebuf[6];
try {
FUpdating = True;
ComboBox1->Text = RichEdit1->SelAttributes->Name;
FirstInd->Left = int(RichEdit1->Paragraph->FirstIndent*RulerAdj)-4+GutterWid;
LeftInd->Left = int((RichEdit1->Paragraph->LeftIndent+
RichEdit1->Paragraph->FirstIndent)*RulerAdj)-4+GutterWid;
RightInd->Left = Ruler->ClientWidth-6-int(
(RichEdit1->Paragraph->RightIndent+GutterWid)*RulerAdj);
if (CurrText()->Style==CurrText()->Style >> fsItalic)
ToolButton17->Down=false;
else ToolButton17->Down=true;
if (CurrText()->Style==CurrText()->Style >> fsBold)
ToolButton15->Down=false;
else ToolButton15->Down=true;
if (CurrText()->Style==CurrText()->Style >> fsUnderline)
ToolButton3->Down=false;
else ToolButton3->Down=true;
Edit2->Text = itoa(RichEdit1->SelAttributes->Size, sizebuf, 10);
if (RichEdit1->Paragraph->Alignment == taLeftJustify)
LeftAlign->Down=true;
else LeftAlign->Down=false;
if (RichEdit1->Paragraph->Alignment == taCenter)
CenterAlign->Down=true;
else CenterAlign->Down=false;
if (RichEdit1->Paragraph->Alignment == taRightJustify)
RightAlign->Down=true;
else RightAlign->Down=false;
if(RichEdit1->Paragraph->Numbering == TNumberingStyle(nsBullet))
ToolButton14->Down=true;
else ToolButton14->Down=false;
}
catch (...) {
FUpdating = False;
}
FUpdating = False;
}
TTextAttributes *__fastcall TForm1::CurrText(void)
{
return RichEdit1->SelAttributes;
}
void __fastcall TForm1::FileNew1Execute(TObject *Sender)
{
FFileName = LoadStr(sUntitled);
RichEdit1->Lines->Clear();
RichEdit1->Modified = false;
}
void __fastcall TForm1::FileOpen1Execute(TObject *Sender)
{
if (OpenDialog->Execute())
{
RichEdit1->Lines->LoadFromFile(OpenDialog->FileName);
FFileName = OpenDialog->FileName;
RichEdit1->SetFocus();
RichEdit1->Modified = false;
RichEdit1->ReadOnly = OpenDialog->Options.Contains(ofReadOnly);
Form1->Caption = OpenDialog->FileName;
}
}
void __fastcall TForm1::FileSave1Execute(TObject *Sender)
{
if (FFileName == LoadStr(sUntitled))
{
FileSaveAs1Execute(Sender);
Form1->Caption = SaveDialog->FileName; }
else
{
RichEdit1->Lines->SaveToFile(FFileName);
RichEdit1->Modified = false; }
}
void __fastcall TForm1::FileSaveAs1Execute(TObject *Sender)
{
String str;
TVarRec vrs[1];
if (SaveDialog->Execute())
{
if (FileExists(SaveDialog->FileName))
{
str = FmtLoadStr(sOverwrite, OPENARRAY(TVarRec, (SaveDialog->FileName)));
if (MessageDlg(str, mtConfirmation, TMsgDlgButtons() << mbYes << mbNo <<
mbCancel, 0) != IDYES)
return;
}
RichEdit1->Lines->SaveToFile(SaveDialog->FileName);
FFileName = SaveDialog->FileName;
RichEdit1->Modified = false;
}
}
void __fastcall TForm1::CheckFileSave(void)
{
if ( RichEdit1->Modified ) {
switch(MessageBox(Handle, "Save Changes?",
"Confirmation",MB_YESNOCANCEL | MB_ICONQUESTION))
{ case ID_YES : FileSave1Execute(this);
case ID_CANCEL : Abort();
}
}
}
void __fastcall TForm1::FileExit1Execute(TObject *Sender)
{
Close();
}
void __fastcall TForm1::HelpAbout1Execute(TObject *Sender)
{
AboutBox->ShowModal();
}
void __fastcall TForm1::UndoClick(TObject *Sender)
{
if ( RichEdit1->HandleAllocated() )
SendMessage(RichEdit1->Handle, EM_UNDO, 0, 0);
}
void __fastcall TForm1::PrintClick(TObject *Sender)
{
if (PrintDialog1->Execute()) RichEdit1->Print(OpenDialog->FileName);
}
void __fastcall TForm1::Print_SetupClick(TObject *Sender)
{
PrinterSetupDialog1->Execute();
}
void __fastcall TForm1::FindClick(TObject *Sender)
{
FindDialog1->FindText = RichEdit1->SelText;
FindDialog1->Execute();
}
void __fastcall TForm1::FindDialog1Find(TObject *Sender)
{
int FoundAt, StartPos, ToEnd;
if (RichEdit1->SelLength)
StartPos = RichEdit1->SelStart + RichEdit1->SelLength;
else
StartPos = 0;
ToEnd = RichEdit1->Text.Length() - StartPos;
FoundAt = RichEdit1->FindText(FindDialog1->FindText, StartPos, ToEnd, TSearchTypes()<< stMatchCase);
if (FoundAt != -1)
{
RichEdit1->SetFocus();
RichEdit1->SelStart = FoundAt;
RichEdit1->SelLength = FindDialog1->FindText.Length();
}
}
void __fastcall TForm1::ReplaceDialog1Replace(TObject *Sender)
{
if (RichEdit1->SelLength == 0)
FindDialog1Find(Sender);
else
{
RichEdit1->SelText = ReplaceDialog1->ReplaceText;
FindDialog1Find(Sender);
}
if (ReplaceDialog1->Options.Contains(frReplaceAll))
while (RichEdit1->SelLength !=0)
ReplaceDialog1Replace(Sender);
}
void __fastcall TForm1::ReplaceClick(TObject *Sender)
{
ReplaceDialog1->Execute();
}
void __fastcall TForm1::N5Click(TObject *Sender)
{
FontDialog1->Options << fdApplyButton;
FontDialog1->Execute();
}
void __fastcall TForm1::FontDialog1Apply(TObject *Sender, HWND Wnd)
{
if (ActiveControl->ClassNameIs("TEdit"))
((TEdit *)ActiveControl)->Font->Assign(FontDialog1->Font);
else if (ActiveControl->ClassNameIs("TRichEdit"))
((TRichEdit *)ActiveControl)->SelAttributes->Assign(FontDialog1->Font);
else
MessageBeep(0);
}
void __fastcall TForm1::prClick(TObject *Sender)
{
ToolButton8->Visible=false;
}
void __fastcall TForm1::rp1Click(TObject *Sender)
{
ToolButton8->Visible=true;
}
void __fastcall TForm1::CenterAlignClick(TObject *Sender)
{
RichEdit1->Paragraph->Alignment = taCenter;
}
void __fastcall TForm1::LeftAlignClick(TObject *Sender)
{
RichEdit1->Paragraph->Alignment = taLeftJustify;
}
void __fastcall TForm1::RightAlignClick(TObject *Sender)
{
RichEdit1->Paragraph->Alignment = taRightJustify;
}
void __fastcall TForm1::SetupRuler(void)
{ int iCtr = 1;
char sTmp[201];
while (iCtr < 200) {
sTmp[iCtr] = 9;
iCtr++;
sTmp[iCtr] = '|';
iCtr++;
}
Ruler->Caption = (AnsiString)sTmp;
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
OpenDialog->InitialDir = ExtractFilePath(ParamStr(0));
SaveDialog->InitialDir = OpenDialog->InitialDir;
SetupRuler();
for (int i = 0; i < Screen->Fonts->Count; i++)
ComboBox1->Items->Add(Screen->Fonts->Strings[i]);
RichEdit1->SelStart = 0;
}
void __fastcall TForm1::ToolButton14Click(TObject *Sender)
{
if(RichEdit1->Paragraph->Numbering == TNumberingStyle(nsBullet))
RichEdit1->Paragraph->Numbering = TNumberingStyle(nsNone);
else
RichEdit1->Paragraph->Numbering = TNumberingStyle(nsBullet);
}
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
TCharsetObject* ChasrsetObject;
if ( !FUpdating ){
ChasrsetObject = (TCharsetObject*)ComboBox1->Items->Objects[ComboBox1->ItemIndex];
CurrText()->Name = ComboBox1->Items->Strings[ComboBox1->ItemIndex];
}
}
void __fastcall TForm1::ToolButton15Click(TObject *Sender)
{
if (CurrText()->Style == CurrText()->Style >> fsBold)
CurrText()->Style = CurrText()->Style << fsBold;
else
CurrText()->Style = CurrText()->Style >> fsBold;
}
void __fastcall TForm1::ToolButton17Click(TObject *Sender)
{
if (CurrText()->Style ==CurrText()->Style >> fsItalic)
CurrText()->Style = CurrText()->Style << fsItalic;
else
CurrText()->Style = CurrText()->Style >> fsItalic;
}
void __fastcall TForm1::Edit2Change(TObject *Sender)
{
int fontsize = atoi(Edit2->Text.c_str());
if ((!FUpdating) && (fontsize))
{
CurrText()->Size = atoi(Edit2->Text.c_str());
}
}
void __fastcall TForm1::ToolButton3Click(TObject *Sender)
{
if (CurrText()->Style ==CurrText()->Style >> fsUnderline)
CurrText()->Style = CurrText()->Style << fsUnderline;
else
CurrText()->Style = CurrText()->Style >> fsUnderline;
}
void __fastcall TForm1::FirstIndMouseDown(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
TLabel * oTmpLabel = (TLabel *)Sender;
FDragOfs = oTmpLabel->Width / 2;
oTmpLabel->Left = oTmpLabel->Left+X-FDragOfs;
FDragging = True;
}
void __fastcall TForm1::FirstIndMouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
FDragging = False;
RichEdit1->Paragraph->FirstIndent = int((FirstInd->Left+FDragOfs-GutterWid) / RulerAdj);
LeftIndMouseUp(Sender, Button, Shift, X, Y);
}
void __fastcall TForm1::LeftIndMouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
FDragging = False;
RichEdit1->Paragraph->LeftIndent = int((LeftInd->Left+FDragOfs-GutterWid)/
RulerAdj)-RichEdit1->Paragraph->FirstIndent;
RichEdit1SelectionChange(Sender);
}
void __fastcall TForm1::FirstIndMouseMove(TObject *Sender,
TShiftState Shift, int X, int Y)
{
if (FDragging) {
TLabel * oTmpLabel = (TLabel *)Sender;
oTmpLabel->Left = oTmpLabel->Left+X-FDragOfs;
}
}
void __fastcall TForm1::RightIndMouseUp(TObject *Sender,
TMouseButton Button, TShiftState Shift, int X, int Y)
{
FDragging = False;
RichEdit1->Paragraph->RightIndent =
int((Ruler->ClientWidth-RightInd->Left+FDragOfs-2) /
RulerAdj)-2*GutterWid;
RichEdit1SelectionChange(Sender);
}
void __fastcall TForm1::RulerResize(TObject *Sender)
{
RulerLine->Width = (int)Ruler->ClientWidth - (RulerLine->Left*2);
}
void __fastcall TForm1::FormPaint(TObject *Sender)
{
TRect Rct = Rect(GutterWid, 0, RichEdit1->ClientWidth-GutterWid,
ClientHeight);
SendMessage(RichEdit1->Handle, EM_SETRECT, 0, long(&Rct));;
}
void __fastcall TForm1::FormResize(TObject *Sender)
{
RichEdit1SelectionChange(Sender);
}
void __fastcall TForm1::FormActivate(TObject *Sender)
{
FileNew1Execute(Sender);
RichEdit1->SetFocus();
}
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
try{
CheckFileSave();
}
catch (...) {
CanClose = False;
}
}
void __fastcall TForm1::NRulerClick(TObject *Sender)
{
if (Ruler->Visible==false)
{
Ruler->Visible=true;
NRuler->Checked=true;}
else {Ruler->Visible=false; NRuler->Checked=false;
}
}
void __fastcall TForm1::NPanelClick(TObject *Sender)
{
if (Panel1->Visible==false)
{
Panel1->Visible=true;
NPanel->Checked=true;
}
else {Panel1->Visible=false;
NPanel->Checked=false;
}
}
void __fastcall TForm1::NBarClick(TObject *Sender)
{
if (StatusBar->Visible==false)
{StatusBar->Visible=true;
NBar->Checked=true;}
else { StatusBar->Visible=false;
NBar->Checked=false;
}
}
... в виде небольших практических заданий, либо повторения изученного материала для написания тестов. Характер учебного материала. Учебный материал, используемый учителем при изучении такой темы как "Текстовый редактор Microsoft Word", носит комбинационный характер, так как включает в себя описательный, информационный, обобщающий и теоретический типы. Он преподает нам описание различных пунктов ...
... себя от случайного внесения изменений в файл во время сеанса редактирования. Чтобы воспользоваться опцией "только чтение", вызовите редактор следующим образом: view file<CR> 21.Другие текстовые редакторы Unix 21.1. Редактор ED. Редактор текстов ed является диалоговой (интерактивной) программой, которая позволяет добавлять, перемещать, удалять текст и извлекать его из ...
... том виде, в каком он выйдет из печати. Кроме того, он дает возможность отобразить сразу все страницы, что удобно для внесения изменений перед распечаткой. Специальные возможности текстовых редакторов: 1) редактирование текста · работа с участком текста - выделение - удаление - запись в буфер - копирование - запись в виде отдельного файла и т.д. · выравнивание текста - по краю ( ...
... b) сервис c) вставка Тест для проверки знаний учащихся может быть также оформлен в виде программы. Краткий сценарий программы Тест: 1) На экран выводится название программы – Тест, и тема – Текстовый редактор Word. Внизу надпись: “Нажмите любую клавишу”. 2) Затем на экран выводится инструкция по работе с программой. 3) После этого запускается сам тест. На экране появляется вопрос и 3 ...
0 комментариев