среда, 17 ноября 2010 г.

Лекция по плюсам

Типа реферат
Содержание:
1.Форматирование кода........................................2
//============================================================
1. Форматирование кода.
Вопросы персонального вкуса, которые не влияют на корректность и
читаемость кода, не относятся к стандарту кодирования. Любой
профессиональный программист сможет легко прочесть и записать код,
форматирование которого немного отличается от того, которым он обычно
пользуется. Однако существует ряд договорённостей, которые необходимо
соблюдать при написании программного кода:
1.Используйте одно и то же форматирование в пределах одного
исходного файла или даже целого проекта, поскольку переход от одного
стиля форматирования к другому в пределах одного фрагмента исходного
текста достаточно сильно раздражает. Но не пытайтесь обеспечить одно и
то же форматирование в разных проектах или в целом по всей компании.
2.Не следует определять конкретный размер отступа, но следует
использовать отступы для подчеркивания структуры программы. Для отступа
используйте то количество символов, которое вам нравится, но это
количество должно быть одинаково, как минимум, в пределах файла.
3.Не определяйте конкретную длину строки, но она должна оставлять
текст удобочитаемым. Используйте ту длину строки, которая вам по душе,
но не злоупотребляйте ею. Исследования показали, что легче всего
воспринимается текст, в строке которого находится до десяти слов.
4.Имена вашим переменным и методам следует давать согласно
договоренности, что методы начинаются с заглавной буквы (__int16
Metod1();), а переменные - со строчной (char ch;). Очевидно, что код
будет лучше восприниматься, если переменные и функции будут отражать
сущность записанных в них значений и операций соответственно. Например,
запись типа
… bool a=0;
a=Funct1(b);

не говорит программисту о действиях, выполняемых функцией и смысла
булевой переменной. Приемлемее будет использовать запись типа
… bool formatted=0;
formatted=IsTextFormatted(text);

Из этой записи видно, что булева переменная будет хранить 1 в случае,
если некоторый текст отформатирован и 0 в ином случае. Так же очевидно,
что вызываемая функция проводит проверку текста на форматирование и
возвращает булево значение. А поскольку функция работает с текстом, то
можно сделать вывод, что переменная text скорее всего строкового типа.
Также принято давать имена функциям так, чтобы они начинались с
глаголов. Например, имя Size(param) не поясняет, что она делает с
размером параметра, а если записать ее в виде GetSize(param) или
SetSize(param), то становится ясно, что первая функция возвращает
размер, а вторая его задает.
Существуют и разбиение на 2 основных стиля именования переменных.
CamelCase — стиль, где все слова имени записываются без пробелов, а
первая буква каждого нового слова пишется заглавной. Названия
удобочитаемы и не вызывают вопросов о смысле переменной. Суть второго
стиля заключается в том, что запрет на использование пробелов в именах
компенсировали подчеркиванием. Здесь, как правило, все слова пишутся
строчными буквами (int students_count;).
Многие студенты в своих работах предпочитают использовать
комментарии к коду. Это, безусловно, хорошо, но вопрос в том, как они
комментируют. Зачастую запись типа
… bool formatted=0;
formatted=IsTextFormatted(text);

представлена следующим образом:
… int var1; //Переменная для …
int var2; //Переменная для …
int var3, var4; //Переменные для …
… int MyFunction();// Функция, которая...

Как видно из двух последних фрагментов кода, вторую запись вполне можно
было бы реализовать без комментариев, дав переменным и функциям
осмысленные имена. Название функции qwerty() говорит преподавателю о
ваших недостаточных знаниях в области программирования. Порой
комментарии пишутся практически к каждому оператору. Как правило, это
говорит о том, что либо у студента отключили интернет, либо программа
была написана другим человеком, а комментарии предназначены для того,
чтобы студент на защите смог хоть как-то сориентироваться в чужом коде.
Не стоит писать комментарии, которые повторяют код.
Венгерская запись. Запись, при которой информация о типе включается
в имя переменной, приносит пользу в языке программирования, небезопасном
с точки зрения типов (особенно в С); возможна, хотя и не приносит
никакой пользы (только недостатки) в объектно-ориентированных языках; и
невозможна в обобщенном программировании (int int_students_count;).
Таким образом, стандарт кодирования C++ не должен требовать
использования венгерской записи, более того, может потребовать ее
запрета.
Наряду с принятыми стандартами относительно названий и комментариев
есть некоторые негласные правила относительно операторных скобок.
Конечно, современные студии разработки будут стараться автоматически
привести ваш код к читабельному виду, однако правила эти знать
необходимо. Существует договоренность, по которой открывающая и
закрывающая операторные скобки должны распологаться на одинаковом
отступе (т.е. закрывающая под открывающей). Собственно, это видно при
первой работе с MS VS последних версий и GNU C++. Однако, есть и другие
стили форматирования.
Стиль Олмана
void f1(int i1)
{
if(i1==0)
{
printf("Hello, World");
}
}
Стиль Кернигана и Ричи
void f1(int i1) {
if(i1==0) {
printf("Hello, World");
}
}
Стиль Уайтсмита
void f1(int i1)
{
if(i1==0)
{
printf("Hello, World");
}
}
Стиль GNU
void f1(int i1)
{
if(i1==0)
{
printf("Hello, World");
}
}
Все профессиональные программисты могут легко читать и писать в каждом
из этих стилей без каких-либо сложностей. Но следует быть
последовательным. Не размещайте скобки как придется или так, что их
размещение будет скрывать вложенность областей видимости, и пытайтесь
следовать стилю, принятому в том или ином файле.
Пробелы или табуляция. В некоторых командах использование табуляции
запрещено на том основании, что размер табуляции варьируется от
редактора к редактору, а это приводит к тому, что отступы оказываются
слишком малы или слишком велики. В других командах табуляции разрешены.
Важно только быть последовательным. Если вы позволяете использовать
табуляцию, убедитесь, что такое решение не будет мешать ясности кода и
его удобочитаемости. Если использование табуляции не разрешено,
используйте пробелы (как правило, используют четное число пробелов на
отступ).
2.Использование данных различных типов
Зачастую студенты используют только основные типы данных (int,
char, string, bool, double). Но порой это невыгодно. Конечно, человеку,
у которого под клавиатурой 4 ядра на 2 гигагерца и 4 гигабайта
оперативной памяти, не приходится задумываться над тем, как сэкономить
пару байт в функции или переменная какого типа быстрее будет расчитана.
Однако в случае написания сетевого приложения, каждый клиент корого
запускает на сервере отдельный процесс, придется посидеть над
оптимизацие кода.
В случае с циклом for программисту известно количество повторений, и
исходя из этого значения можно подобрать более подходящий тип данных для
счетчика. Необходимо иметь под рукой таблицу предельных значений
различных типов (а еще лучше выучить ее).
Тип Байт Бит Минимум Максимум
char 1 8 -128 127
unsigned char 1 8 0 255
short 2 16 -32'768 32'767
unsigned short 2 16 0 65'535
int 2 16 -32'768 32'767
unsigned int 2 16 0 65'535
long 4 32 -2'147'483'648 2'147'483'647
unsigned long 4 32 0 4'294'967'295
В данной таблице типы int и short совпадают. Дело в том, что тип int
является зависимым типом. На машинах различной разрядности пределы и
размерность типа int изменяются. Если вы по какой-либо причине забыли
данные по необходимому целочисленному типу, вы всегда сможете объявить
его как int с префиксом «__» и указав число бит, занимаемых переменной
этого типа в оперативной памяти. Можно без затрунений расчитать
количество бит по формуле Хартли, а затем округлить вверх до ближайшего
кратного восьми значения. Если вам необходимо использовать, допустим,
тип __int16 для счетчика цикла, а параметр инициализации присваивает 0,
то выгоднее использовать unsigned __int8. Очевидно, что __int8 ничем не
будет отличаться от типа char в контексте данной задачи, поэтому в
качестве счетчика допустимо использовать переменную типа char. Так же с
использованием префикса unsigned для типа char упрощается доступ к
символам псевдографики. Можно рассмотреть использование char в счетчике
на примере программы, выводящей символы таблицы ASCII и ставящей ей в
соответствии номер символа.
#include <iostream>
using std::cout;
int main()
{
unsigned char ch=0;
__int16 i=0;
for (ch=0; ch<255; ch++,i++)
cout<<i<<" "<<ch<<'\n';
std::cin.get();
return 0;
}
Теперь рассмотрим размерности типов данных с плавающей запятой.
Тип Байт Бит Минимум Максимум
float 4 32 3.4E-38 3.4E+38
double 8 64 1.7E-308 1.7E+308
long double 10 80 3.4E-4932 3.4E+4932
Как известно, С-подобные языки позволяют производить бинарные операции
над переменными разных типов, но порой необходимо переводить данные из
одного типа в другой. Для этого в С++ существует функция static_cast.
Эта функция возвращает значение указанного типа. Например, в случае
целочисленной переменной int_var и плавающей float_var, строчка
float_var=static_cast<float>(int_var); переведет целочисленную
переменную в плавающую и присвоит полученный результат переменной
float_var. Эта запись служит примером явного преобразования типов. Мы
могли бы просто записать float_var=int_var и получить тот же результат,
переложив перевод типов на компилятор. Такое преобразование называется
неявным. У неявного преобразования есть одна отличительная черта —
результат получится старшего типа, т.е. типа, занимающего больше памяти.
Например, результат строчки rez=short_var*long_double_var; будет типа
long double.
/*
Добавить:
Объявление и определение функций
Библиотечные функции
Управляющие последовательности
*/

понедельник, 15 ноября 2010 г.

Р. Лафоре - ООП в С++ //тесты

Общие сведения
1. Языки Pascal, BASIC и C являются _______________ языками, в то время как С++ является _______________ языком.
2. В качестве образца по отношению к объекту выступает:
    а) метод
    б) класс
    в) операция
    г) значение
3. Двумя основными компонентами объекта являются __________ и функции, которые ____________.
4. В С++ функцию, входящую в состав класса, называют:
    а) функция-член класса
    б) оператор класса
    в) функция класса
    г) метод класса
5. Защита данных от несанкционированного доступа другими функциями называется ______________.
6. Какие из перечисленных ниже причин являются главными для использования объектно-ориентированных яхыков?
    а) возможность создания собственных типов данных
    б) простота операторов объектно-ориентированных языков по сравнению с процедурными языками
    в) наличие средств для автокоррекции ошибок в объектно-ориентированных языках
    г) объектно-ориентированные программы легче концептуализируются
7. ____________ отображает объекы реального мира точнее, чем функции.
8. Истинно ли утверждение: программа на С++ в целом схожа с программой на С за исключением некоторых различий в кодировании.
9. Объединение данных и функций называется _____________.
10. Если язык обеспечивает возможность создания пользовательских типов данных, то говорят, что язык называется:
    а) наследуемым
    б) инкапсулируемым
    в) перегруженным
    г) расширяемым
11. Истинно ли утверждение: достаточно двух операторов чтобы отличить программу на С от программы на С++.
12. Возможность выполнения оператором или функцией различных действий в зависимости от типа операндов называется ___________.
13. Операция, выполняющая заданные действия над пользовательским типом данных называется:
    а) полиморфической
    б) инкапсулированной
    в) классифицированной
    г) перегруженной
14. Запоминание новых терминов языка С++:
    а) является очень важным
    б) можно отложить "на потом"
    в) служит ключом к успеху и процветанию
    г) бессмысленно
15. Универсальный язык моделирования - это:
    а) программа для построения физических моделей
    б) средство визуализации организации программы
    в) результат объединения языков С++ и FORTRAN
    г) вспомогательное средство в разработке программного обеспечения

//Ответы:
1. процедурными | объектно-ориентированным
2. б
3. данные | совершают действия над ними
4. а
5. сокрытием данных
6. аг
7. объекты
8. ложно, организационные принципы различаются
9. инкапсуляция
10. г
11. ложно, большинство строк на кода на С++ ничем не отличается от кода на С
12. полиморфизмом
13. г
14. б
15. бг

воскресенье, 14 ноября 2010 г.

Код проекта "Плавающий алгоритм защиты"

//Отчет и пояснительная записка тут http://depositfiles.com/files/j2e6v2qp3
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
StdCtrls, ExtCtrls, MaskEdit, ComCtrls;

type

{ TMainForm }

TMainForm = class(TForm)
AcceptBtn: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
ProgressBar1: TProgressBar;
SecretLabel: TLabel;
MaskEdit1: TMaskEdit;
Memo1: TMemo;
Memo2: TMemo;
Memo3: TMemo;
Timer1: TTimer;
procedure AcceptBtnClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: boolean);
procedure FormCreate(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure SecretLabelClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
{==================================MyClass=====================================}
TMatrix=class(TObject)
Password:String; //Пароль
Matr:array[1..15,1..15] of integer; //Матрица Пароля
Constructor Create;
Destructor Destroy;
Function ChkPsswrd(pwd:string):boolean; //Проверка пароля
Procedure GenPass; //Генерация пароля
end;
{================================End of my class===============================}
var
MainForm: TMainForm;
CC:boolean; //переменная CanClose
MyMatrix:TMatrix; //Объект моего класса
implementation
{================================My class' methods=============================}
Constructor TMatrix.Create;
var
i,j:byte;
begin
Inherited Create; //Создание родительского объекта
Randomize;
For i:=1 to 15 do
For j:=1 to 15 do
Matr[i,j]:=random(9); //Случайное заполнение
end;

Destructor TMatrix.Destroy;
begin
inherited;
end;

Function TMatrix.ChkPsswrd(pwd:string):boolean;
begin
if pwd=password then ChkPsswrd:=true; //Проверка пароля
end;

Procedure TMatrix.GenPass;
begin
password:=''; //Ни разу не глупо
password:=IntToStr(Matr[10,11]);
password:=password+IntToStr(Matr[7,7]); //С миру по нитке...
password:=password+IntToStr(Matr[5,12]);
password:=password+IntToStr(Matr[11,2]);
end;
{========================End of my class' methods==============================}

{ TMainForm }

procedure TMainForm.AcceptBtnClick(Sender: TObject);
begin
if Maskedit1.Text=MyMatrix.password then
begin
cc:=true;
timer1.Enabled:=False;
end;
end;

procedure TMainForm.FormCloseQuery(Sender: TObject; var CanClose: boolean);
begin
CanClose:=CC;
If cc=true then TMyMatrix.Destroy;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
CC:= False;
end;

procedure TMainForm.FormShow(Sender: TObject);
var
i,j: byte;
LineBuffer: string;
begin
MyMatrix:=TMatrix.Create;
MyMatrix.GenPass;
Memo1.Lines.Clear;
linebuffer:='';
for i:=1 to 15 do
begin
for j := 1 to 15 do linebuffer:=LineBuffer+inttostr(MyMatrix.Matr[i,j])+' ';
Memo1.Lines.Add(linebuffer);
linebuffer:='';
end;
Timer1.Enabled:=True;
end;

procedure TMainForm.SecretLabelClick(Sender: TObject);
begin
SecretLabel.Caption:=MyMatrix.password;
end;

procedure TMainForm.Timer1Timer(Sender: TObject);
var
i,j: byte;
LineBuffer: string;
begin
ProgressBar1.Position:=ProgressBar1.Position-1;
if ProgressBar1.Position=0 then
begin
MyMatrix:=TMatrix.Create;
MyMatrix.GenPass;
Memo1.Lines.Clear;
linebuffer:=''; //так будет лучше для всех
for i:=1 to 15 do
begin
for j := 1 to 15 do linebuffer:=LineBuffer+inttostr(MyMatrix.Matr[i,j])+' ';
Memo1.Lines.Add(linebuffer);
linebuffer:='';
end;
ProgressBar1.Position:=30;
Timer1.Enabled:=True;
end;

end;

initialization
{$I unit1.lrs}

end.