Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Заказы "Сделайте все за меня"


Рекомендуемые сообщения

@Тролль

Тут я смешал всякие способы доступа

Да, Вы умеете удивлять! Некоторые способы я увидела впервые. Мы учили один, еще один я видела в примерах, все остальное - фантастика.

прикладываю первые попавшиеся скринсейверы, показывающие "Жизнь" на случайных исходных конфигурациях. Можно запускать просто двойным кликом на файлах

Архив распаковала, но оно не запустилось двойным кликом. Чем открыть можно?

Я тут решила, что самая умная и решила изучить классы. (Только не ругайтесь, пожалуйста! Очень хочется...) Изучаю самостоятельно, не все понятно. Есть private, public, protected. Мы можем в private записать функцию? в public написать реализацию любой функции, находящейся там? если да, то что лучше - описать функцию в классе или в файле реализации? конструктор/деструктор описываем в классе или в main? protected - от кого защищаем? Классы - те же структуры? Я не вижу разницы. Правда, еще не разбиралась с наследованием, полиморфизмом и инкапсуляцией. Описала маленький класс, программа даже работает. :) Хочу усложнить. Мы, когда изучали структуры, писали программу о студентах. Хочу ее переделать. Хотя интересней было бы создать большооой класс. Если классов несколько, как их лучше описывать? А если это дочерние классы, то они пишутся ниже родительского или без разницы?

P.S. Извиняюсь, что вопросы так разрознены. Как вспоминала, так и записывала.

Ссылка на комментарий
Поделиться на другие сайты

Serty

Какому ослу пришло в голову начинать обучение с C++? Это язык профессионалов, начинать с него обучение - то же, что учить первоклассников стенографии.

#include<iostream>#include<iomanip>using namespace std;main(){float a[10][10],b[10][10],c[10][10]; int n;cout<<"Enter the dimension: "; cin>>n;cout<<"Matrix A"<<endl;for(int i=0;i<n;i++){cout<<"Enter the elements of the line "<<i+1<<": "; for(int j=0;j<n;j++)cin>>a[i][j];}cout<<endl;cout<<"Matrix B"<<endl;for(int i=0;i<n;i++){cout<<"Enter the elements of the line "<<i+1<<": "; for(int j=0;j<n;j++)cin>>b[i][j];}cout<<endl;for(int i=0;i<n;i++){float max=b[i][0]; for(int j=0;j<n;j++)if(b[i][j]>max)max=b[i][j];  for(int j=0;j<n;j++)c[i][j]=max*a[i][j];}cout<<"Matrix C"<<endl;for(int i=0;i<n;i++){for(int j=0;j<n;j++){cout.setf(ios::fixed); cout<<setw(10)<<setprecision(2)<<c[i][j];}cout<<endl;}cin.get(); cin.get();}

#include<iostream>#include<iomanip>using namespace std;main(){float a[10][10],b[10][10],c[10][10]; int n;cout<<"Enter the dimension: "; cin>>n;cout<<"Matrix A"<<endl;for(int i=0;i<n;i++){cout<<"Enter the elements of the line "<<i+1<<": "; for(int j=0;j<n;j++)cin>>a[i][j];}cout<<endl;cout<<"Matrix B"<<endl;for(int i=0;i<n;i++){cout<<"Enter the elements of the line "<<i+1<<": "; for(int j=0;j<n;j++)cin>>b[i][j];}cout<<endl;for(int i=0;i<n;i++){float buf=1; for(int j=0;j<n;j++)buf*=b[i][j]; for(int j=0;j<n;j++)c[i][j]=a[i][j]+buf;}cout<<"Matrix C"<<endl;for(int i=0;i<n;i++){for(int j=0;j<n;j++){cout.setf(ios::fixed); cout<<setw(10)<<setprecision(2)<<c[i][j];}cout<<endl;}cin.get(); cin.get();}

#include<stdio.h>#include<string.h>main(){char str[255]; gets(str); printf("%d",strchr(str,',')-str+1); getchar();}

#include<stdio.h>#include<string.h>main(){char str[255]; gets(str); printf("%d",strrchr(str,',')-str+1); getchar();}

Циклы блок-схемы, если спросят, в 2а и 2б находятся прямо в функциях strchr и strrchr.

Иазяв

В С уже есть структуры - контейнеры для нескольких переменных, собранных вместе. Тогда можно оперировать, например, со структурой student, собранной из нескольких переменных (полей структуры), в которой собраны разные данные о студентах, как с одной переменной - присваивать, создавать из структур массивы и так далее.

Идея ООП заключается в том, чтобы в структуру включить и функции для обработки входящих в нее переменных (методы), и иметь возможность сделать некоторые поля и функции недоступными для обращения к ним снаружи (инкапсуляция). Это уменьшает возможность путаницы, все "кишки" упрятаны внутрь и забронированы. Это было сделано в C++, и такие структуры были названы классами. На самом деле излишеством было бы дублировать в каждом экземпляре класса (объекте) код функций, поэтому на самом деле компилятор размещает коды функций класса отдельно как общие для всех экземпляров класса, а в экземпляры класса фактически включает только ссылки на эти функции.

Поскольку обращаться к некоторым полям и методам класса извне все же нужно, перед ними можно ставить ограничитель доступа - public - такие поля и методы видны снаружи, к ним можно обращаться извне класса, и private - такие поля и методы могут быть вызваны методами только этого же класса. При этом, правда, сделали возможность делать исключения - другие классы и методы могут объявляться друзьями (friend) этого класса, им разрешается использовать закрытые поля и методы класса.

Кроме того, чтобы на основе других классов конструировать более сложные, была введена возможность расширять уже имеющиеся классы новыми полями и методами, это было названо наследованием. Потомки класса могут включать в себя поля и методы класса-предка. Тут появился еще ограничитель доступа protected - к таким полям и методам могут обращаться потомки этого класса и никто другой (за исключением, понятно, друзей класса ;) ).

Подумав, что бы тут еще можно было усовершенствовать (и усложнить), решили ввести в потомках возможность изменения методов (функций) работы с полями классами, чтобы в потомках методы с теми же именами могли выполнять расширенный арсенал действий - ведь могут появиться новые поля (поля, кстати, в потомках класса можно добавить, но нельзя исключить бывшие у предка поля). Это назвали полиморфизмом. Фактически полиморфизм есть и в С, например, операция "-" может работать и с целыми числами, и с вещественными, да еще как с одним операндом (унарный минус), так и с двумя. Но тут полиморфизм расширили на определяемые программистом функции, добавив правила, по которым C++ разбирается с несколькими одноименными функциями, существующими в классе, часть которых унаследована от предков класса. Операции тоже стали функциями с особой записью, так что в C++ можно доопределить ту же операцию "-" так, чтобы она могла работать не только с числами, но и с экземплярами классов. И не только "-", но и другие операции, даже квадратные скобки, например, стали просто операцией, то есть завуалированным вызовом функции, которую можно доопределить для того, чтобы она делала что-нибудь новенькое, если в этих скобках или рядом с ними находится что-нибудь, с чем раньше скобки не имели дела :).

Таким образом C++ стал фактически не только языком, но и метаязыком, то есть языком, на котором ты можешь описать собственный более сложный язык, введя новые типы данных и доопределив старые операции так, чтобы они работали и с новыми типами данных, по заданным тобой правилам.

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

Вот, собственно, и все о классах. Да, в программе потомки (у вас их, кажется, зовут дочерними классами, я предпочитаю использовать слово потомки - а то как-то странно - дочки мужского рода, мне немножко режет ухо ;) ) описываются, естественно, после предков, чтобы компилятор мог все сделать за один проход по тексту. То же с порядком описания разных классов.

Поскольку структуры С обобщили до классов C++, структуры, собственно, стали не нужны, но для совместимости C++ с С их объявление struct оставили, хотя на всякий случай сделали его синонимом объявления class, с одним отличием - в классах по умолчанию, если не стоит ограничитель доступа, объявления его членов считаются закрытыми для видимости снаружи (то есть к ним нельзя обращаться вызовами извне класса), то есть private, а в структурах члены класса по умолчанию считаются доступными извне экземпляра класса, то есть public. Строго говоря, это возымело некоторое действие на видимость в классах-наследниках классов, объявленных в структуре, но это уже очень тонкие тонкости ;). Практически объявлениями struct в C++ не пользуются, а если будешь все же их использовать, то достаточно помнить, что это тот же класс, только его члены по умолчанию (если перед ними не было никакого ограничителя доступа) открыты для доступа извне.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Serty

Ммм.. А не мог бы ты в будущем, если это случится, сразу говорить, что тебе надо? А то рубить хвост по кусочкам как-то утомительно...

#include<stdio.h>main(){float a[10][10],b[10][10],c[10][10],max; int n,i,j;printf("Enter the dimension: "); scanf("%d",&n);printf("Matrix A\n");for(i=0;i<n;i++){printf("Enter the elements of the line ",i+1,": "); for(j=0;j<n;j++)scanf("%f",&a[i][j]);}printf("\n");printf("Matrix B\n");for(i=0;i<n;i++){printf("Enter the elements of the line ",i+1,": "); for(j=0;j<n;j++)scanf("%f",&b[i][j]);}printf("\n");for(i=0;i<n;i++){max=b[i][0]; for(j=0;j<n;j++)if(b[i][j]>max)max=b[i][j]; for(j=0;j<n;j++)c[i][j]=max*a[i][j];}printf("Matrix C\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%10.2f",c[i][j]); printf("\n");} getchar(); getchar(); return 0;}

#include<stdio.h>main(){float a[10][10],b[10][10],c[10][10],buf; int n,i,j;printf("Enter the dimension: "); scanf("%d",&n);printf("Matrix A\n");for(i=0;i<n;i++){printf("Enter the elements of the line ",i+1,": "); for(j=0;j<n;j++)scanf("%f",&a[i][j]);}printf("\n");printf("Matrix B\n");for(i=0;i<n;i++){printf("Enter the elements of the line ",i+1,": "); for(j=0;j<n;j++)scanf("%f",&b[i][j]);}printf("\n");for(i=0;i<n;i++){buf=1; for(j=0;j<n;j++)buf*=b[i][j]; for(j=0;j<n;j++)c[i][j]=a[i][j]+buf;}printf("Matrix C\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%10.2f",c[i][j]); printf("\n");} getchar(); getchar(); return 0;}

2а и 2б пойдут и просто в С.

P.S. Да, в 2а и 2б надо перед завершающей фигурной скобкой вставить return 0; - иначе при компиляции в С будет предупреждение.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

А можно архив сразу с готовыми рабочими программами (.exe) ?

А то вставляю код, выдает ошибки...

На С++, пожалуйста...

Ссылка на комментарий
Поделиться на другие сайты

Всем привет!

Нужна помощь, есть на Pascale Шифр Цезаря:

program crypt;

{$APPTYPE CONSOLE}

uses

SysUtils;

var

str,sh:String;

j,i,len:Integer;

Begin

ReadLn(str);

len := length(str); //узнаем длину строки

for i:=1 to len do

Begin

sh := sh + chr(ord(str) + 3); //зашифровываем согласно формуле

end;

WriteLn('open text - '+str);

WriteLn('shifr - '+sh);

ReadLn;

end.

Напишите пожалуйста код как его на Pascal расшифровать.

Заранее благодарен.

Ссылка на комментарий
Поделиться на другие сайты

Riki_Tiki_Tavi

Ну, это не совсем код Цезаря - там буквы заменялись по кругу, а тут просто со сдвигом.

Кроме того, в программе есть одна ошибка - Pascal не гарантирует, что строка результата вначале пустая.

Шифр менять не буду, а код исходной программы чуть подправлю:

program crypt;{$APPTYPE CONSOLE}uses SysUtils;var str,sh:String; i:Integer;BeginReadLn(str); sh:='';for i:=1 to length(str) do sh:=sh+chr(ord(str[i])+3);WriteLn('open text - '+str);WriteLn('shifr - '+sh);ReadLnend.

Программа дешифровки:

program decrypt;{$APPTYPE CONSOLE}uses SysUtils;var str,sh:String; i:Integer;BeginReadLn(sh); str:='';for i:=1 to length(sh) do str:=str+chr(ord(sh[i])-3); WriteLn('shifr - '+sh);WriteLn('open text - '+str);ReadLnend.
Ссылка на комментарий
Поделиться на другие сайты

Всем привет!Есть вопрос, есть код по ООП на Delphi, поясните пожалуйста что тут делается(функции и тд)

program Project1;

{$APPTYPE CONSOLE}

uses

SysUtils,Unit1;

var p:TPoint; S:TSegmentLine; x,y,a,b,c,d,l,X1,Y1,X2,Y2,r,m,n,o,q:real;

begin

writeln('!! This is my 3rd project in OOP !!!');

writeln(' ');

//Class TPoint

p:=TPoint.Create;

p:=TPoint.Create(X,Y);

p:=TPoint.CreateRead;

p.Print;

writeln(' ');

writeln('Getx');

a:=p.GetX;

writeln(a);

writeln(' ');

writeln('GetY');

b:=p.GetY;

writeln(b);

writeln(' ');

writeln('Setx');

c:=p.SetX;

writeln©;

writeln(' ');

writeln('SetY');

d:=p.SetY;

writeln(d);

writeln(' ');

writeln('Lenght');

l:=p.GetLength;

writeln(l);

//Class TSegmentLine

s:=TSegmentLine.CreateRead;

s:=TSegmentLine.Create(X1,Y1,X2,Yф2);

s.Print;

Writeln('Set XEnd');

s.SetXend;

Writeln('Set YEnd');

s.SetYend;

writeln(' ');

writeln('GetXEnd');

r:=s.GetXend;

writeln®;

writeln(' ');

writeln('GetYEnd');

m:=s.GetYEnd;

writeln(m);

writeln(' ');

n:=s.GetLength;

writeln('GetLength ');

writeln(n);

{

writeln(' ');

writeln('GetName');

a:=TPoint.

writeln(a);

writeln(' ');

writeln('GetAuthor');

c:=b.GetAuthor;

writeln©;

writeln(' ');

writeln('GetCityHousePublishing');

d:=b.GetCityHousePublishing;

writeln(d);

writeln(' ');

writeln('GetPage');

y:=b.GetPage ;

writeln(y);

writeln(' ');

writeln('GetYear');

s:=b.GetYear;

writeln(s);

writeln(' ');

Writeln('Enter the text');

readln(text);

writeln('IsName');

writeln('chu e - ', b.IsName(text));

writeln(' ');

Writeln('Enter the lastname');

readln(lastname);

writeln('Isauthor');

writeln('chu e - ',b.IsAuthor(lastname));

writeln('!! New Card book !!!');

card:=TCardBook.Create;

Writeln(' ');

writeln('PrintOrder');

card.PrintOrder;

writeln(' ');

writeln('SetUser');

card.SetUser(x);

writeln(' ');

writeln('SetData');

card.SetData(e);

writeln(' ');

writeln('GetUser');

u:=card.GetUser;

writeln(u);

writeln(' ');

writeln('GetDataOrder');

e:=card.GetDataOrder;

Writeln('Day - ',card.Data.Day);

writeln('Month - ',card.Data.Month);

writeln('Year - ',card.Data.Year);

}

readln;

end.

Ссылка на комментарий
Поделиться на другие сайты

Всем привет!Есть вопрос, есть код по ООП на Delphi, поясните пожалуйста что тут делается(функции и тд)
Тут код просится в мусорную корзину ;) Это одна из частей программы неясного назначения, плохо написанной и скопированной с ошибками.
Ссылка на комментарий
Поделиться на другие сайты

@Тролль

Какой же Вы молодец! Столько всего знать, понимать и применять! Был у нас на неделе очередной срез знаний. Вы были правы, что я не понимаю массивы - споткнулась и растянулась во весь рост, еще и с учителем поспорила, что я знаю лучше... (Интересно, это только меня так клинит или все программисты будущие через такое проходят?) Плюс к этому кучу допматериала перекопала по классам. И теперь еще больше задалась вопросом , хочу ли я стать программистом по-настоящему.

Поняла, что такое инкапсуляция и полиморфизм. Изучаю наследование. Сделала простенькое наследование, которое даже работает. Можно я еще задам несколько вопросов?

1. Экземпляр класса, объект класса, член класса - одно и то же?

2.

public - такие поля и методы видны снаружи, к ним можно обращаться извне класса, и private - такие поля и методы могут быть вызваны методами только этого же класса

А если надо ввести значения каких-то переменных, которые описаны в private? Кстати, всегда ли есть этот private? Как мы определяем нужен ли он нам в классе? Как выглядит наследование private, если везде, где я читала, пишется, что наследуется public?

3. Родительский класс содержит общее для наследников. Существуют ли "внуки", "правнуки"? Если первое поколение это дети. Правнуки должны будут содержать в себе общее от прадедушки (класс - он мой ;) ), дедушки и папы? Если да, то мааасенький пример можно. Наследование себя оправдывает? Реально применимо в программировании?

4. Когда лучше делать класс в классе? Может все-таки их не вкладывать друг в друга, а отдельно описать?

5. Как должен писаться каждый класс как include? Есть какие-то правила?

6.

чтобы в потомках методы с теми же именами могли выполнять расширенный арсенал действий - ведь могут появиться новые поля (поля, кстати, в потомках класса можно добавить, но нельзя исключить бывшие у предка поля)

Как описать родительскую функцию в потомке с полями потомка?

7. Если класс = структура, то можно использовать указатели на классы. Как реализовать динамически созданный член класса? Можно ли делать указатель на конструктор? Как это все выглядит в main?

Надеюсь, что после своих вопросов не сильно упаду в Ваших глазах...

Ссылка на комментарий
Поделиться на другие сайты

Иазяв

Экземпляр класса, объект класса, член класса - одно и то же?

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

если надо ввести значения каких-то переменных, которые описаны в private? Кстати, всегда ли есть этот private? Как мы определяем нужен ли он нам в классе? Как выглядит наследование private, если везде, где я читала, пишется, что наследуется public?

private - переменные или функции для "внутреннего использования" в классе. Их значения можно изменять снаружи через методы этого класса или через "друзей" этого класса, которым разрешен этим классом доступ к его приватным членам. Ну а внутри этого класса (но не его потомков!) к ним можно обращаться как обычно.

Все, что можно, лучше определять как private. Это защита личной жизни экземпляра класса от постороннего вмешательства. Вся эта техника рассчитана на защиту сделанного одним программистом от вмешательства других программистов. Никакого наследования в смысле прямого доступа к этому наследству потомков у private нет. "Это мое и только мое - ну, может, еще для друзей, которых я сам выберу."

Родительский класс содержит общее для наследников. Существуют ли "внуки", "правнуки"?

Внуки, правнуки и даже какое-нибудь сто четырнадцатое поколение в больших программных проектах существуют. Наследование себя не то что оправдывает, это основа всей современной технологии создания программ. Даже сам базовый C++ сплошь и рядом его использует - на нем построены стандартные библиотеки классов. Но там цепочки классов просты и коротки. А вот Windows, к примеру, это как раз такая система, которая использует очень длинные цепочки наследования, в конце которых появляются такие классы, как классы текстовых редакторов или браузеров. Даже простое окно на экране, это - программно - довольно сложный объект, экземпляр класса окна, с входящими в него классами элементов, которые сами построены их других классов и так далее. "Волшебная палочка" на самом деле очень сложно устроена ;)

Пока программы состояли из сотен и даже тысяч строк кода, без классов можно было обойтись. Когда появились программы, состоящие из десятков тысяч, сотен тысяч и миллионов строк кода (а в Windows примерно сто миллионов строк программного кода, если его развернуть в обычные команды) без классов стало невозможно обойтись. Мы берем базовый объект и наращиваем его. Потом снова наращиваем и комбинируем с другими. И так далее. Смысл ООП - простое для использования наращивание кода. Обычную структуру, в смысле С, можно вложить в другую структуру, потом эту другую структуру в третью и так далее. Но в С к полям исходной структуры можно обратиться только указав всю цепочку входов из одной структуры в другую. А тут как бы просто расширяется исходная структура и не надо залезать куда-то вглубь новой структуры, чтобы добраться до полей старой - все поля. и новые и старые, так сказать, лежат в одной плоскости.

Когда лучше делать класс в классе? Может все-таки их не вкладывать друг в друга, а отдельно описать?

Класс в классе, то есть вложенный класс, обычно не нужен. Просто так иногда получается проще, по принципу "разделяй и властвуй". Какую-то часть внутренних действий в классе выделили в отдельный вложенный класс.

Как должен писаться каждый класс как include? Есть какие-то правила?

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

Есть какие-то правила?

Правило одно: делай как тебе удобно.

Как описать родительскую функцию в потомке с полями потомка?

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

Если класс = структура, то можно использовать указатели на классы. Как реализовать динамически созданный член класса? Можно ли делать указатель на конструктор? Как это все выглядит в main?

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

Указатели на конструкторы не существуют. Ну, строго говоря, конструктор как программный код для создания экземпляра класса создается компилятором, но указатели на него не предусмотрены, да и трудно себе представить, зачем они могли бы быть нужны. Разве что хакеру, который стал бы менять машинный код конструктора для подмены структуры класса на другую ;)

теперь еще больше задалась вопросом , хочу ли я стать программистом по-настоящему.

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

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Здравствуйте, нужна помощь!

Помогите, пожалуйста...

Сортировки

Задание:

1. Для размерностей массива в: 1, 2, 3, 4, 5, 10, 15, 20, 25, 30, 50, 75, 100 элементов провести по 100 экспериментов.
Для каждой из размерностей высчитать среднее значение количества сравнений и перестановок. Желательно сгенерировать лучший и худший варианты и получить значения для них.
2. Зависимость сравнений и перестановок от n ( n - количество элементов в массиве ) отобразить графически. Можно использовать Mathcad или Excel.
3. На той же плоскости отобразить зависимости: y= an; y=n log
2
n , y = n
2
; y = n
3
.
4. Сделать выводы о трудоемкости методов сортировки.
Алгоритм сортировки: Timsort
Язык программирования: С++
Заранее благодарен!
Если будет ещё архив с готовой программой, то буду благодарить и восхвалять тебя всю жизнь!
Ссылка на комментарий
Поделиться на другие сайты

Serty

Timsort - довольно сложный алгоритм сортировки, разработанный только недавно, со всякими взятыми из статистики сортировок переходами от одной стандартной сортировки к другой. Готовой реализации его на C++ мне не попадалось, и, насколько я понимаю, нужен еще отчет с результатами тестов в Excel с графиками. Это тянет как минимум на курсовой проект, и то довольно тяжелый. Так что тут помочь не смогу.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Если бы курсовой проект...

2-ое индивидуальное задание, без объяснений и все...

Как хоть вообще выглядит этот Timsort ?

Ссылка на комментарий
Поделиться на другие сайты

Как хоть вообще выглядит этот Timsort ?

http://ru.wikipedia....тировки_Timsort

Было бы на Делфи ...

Алгоритм интересный - упорядочение частично упорядоченных данных. Практический случай.

Изменено пользователем Teddy_Bear
Ссылка на комментарий
Поделиться на другие сайты

Никак оно не Delphi, во всяком случае в открытых источниках, не выглядит. На более близком к C++ языке Java оно есть по первой ссылке к упомянутой Teddy_Bear статьи в Википедии. Более понятное объяснение сути алгоритма есть тут. Однако как задание для программирования такой алгоритм никак не второе индивидуальное задание, если двигаться такими шагами, третьим будет, похоже, сам компилятор ;)

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

@Тролль

1. Почему ромбовидное наследование так проблематично? Я думаю, что не всегда.

2. Классы нужны для ООП. Всегда ли программа сведется к "родителю"? Или иногда "родителей" будет несколько? (Я имею в виду, что два основных класса, у каждого из которых будут свои потомки.)

3. Не пойму, зачем нам конструктор копирования? Нужен ли он при динамическом выделении памяти?

4. Как научится видеть/определять/выделять классы для наследования? Что этот класс - наследник, а этот просто параллельно существующий...

5. Во многих примерах пишут множественное наследование так : class D: A, public B, protected C. Это значит, что из A наследник возьмет все, из B все написанное в public, а из C то, что определенно как protected? Зачем нам указывать всех предков? Разве не достаточно указать каждый класс как наследник предыдущего? Компилятор должен вроде подняться до основного класса...

P.S. Спасибо за Пратчетта.

Ссылка на комментарий
Поделиться на другие сайты

Иазяв

1. Почему ромбовидное наследование так проблематично? Я думаю, что не всегда.

Конечно, не всегда. Иногда. Часто сначала все хорошо, а потом оказывается, что есть какой-то парадокс, для устранения которого надо выкручиваться. Так было с простым и ясным понятием множества, пока Рассел не придумал деревенского брадобрея, который брил всех, кто не брился сам, и спросил, кто брил этого брадобрея ;). От этого удара математика до сих пор не оправилась :)

Если унаследованные члены класса имеют одинаковые названия, то сохраняются оба, однако если члены класса заимствованы через поколения от одного предка, возникает дублирование. Решили оставить и возможность дублирования, и возможность оставить только один из одинаковых членов класса. Нормально они просто (самый простой путь) объединяются в один класс, и если их названия одинаковые, то надо при обращении квалифицировать, от кого заимствованные члены имеются в виду, иначе компилятор выдаст ошибку. А если классы, от которых заимствовали, обозначены как виртуальные, то компилятор должен проследить, не от одного ли класса они заимствованы, и если так, ему полагается оставить один из одинаковых заимствованных членов.

2. Классы нужны для ООП. Всегда ли программа сведется к "родителю"? Или иногда "родителей" будет несколько? (Я имею в виду, что два основных класса, у каждого из которых будут свои потомки.)

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

3. Не пойму, зачем нам конструктор копирования? Нужен ли он при динамическом выделении памяти?

Конструктор копирования нужен, когда нам нужна копия другого объекта с уже имеющимся в нем значениями. Простой конструктор (конструктор умолчания) создал бы "пустую" копию объекта, ну, может, с некоторыми данными конструктору начальными значениями.

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

Причем это может быть не так уж просто - если у копируемого объекта был, скажем, указатель, который ссылался на одно из его полей, то значение указателя надо не просто скопировать, а поменять на адрес в новом объекте. Но при автоматическом создании конструктора копирования этим занимается компилятор, если только мы не хотим взять на себя его работу ;)

4. Как научится видеть/определять/выделять классы для наследования? Что этот класс - наследник, а этот просто параллельно существующий...

В описании класса стоит, от кого он унаследован. Вообще тебя это не должно волновать, если используешь готовый класс. Как с ним работать, уже должно быть описано в документации к нему. А если придумывать иерархию самой, то по принципу "разделяй и властвуй". Если что-то относительно самостоятельно - выделяется в класс. Если в него можно взять много от прежних классов - можно наследовать от них. В конце концов классы вообще необязательны, писали и без классов, на чистом С. Нет единственно правильного решения, до какой оптимизации в отношении выделения отдельных частей "досообразишь", то и реализуешь. Класс - контейнер для готового достаточно автономного куска кода.

5. Во многих примерах пишут множественное наследование так : class D: A, public B, protected C. Это значит, что из A наследник возьмет все, из B все написанное в public, а из C то, что определенно как protected? Зачем нам указывать всех предков? Разве не достаточно указать каждый класс как наследник предыдущего? Компилятор должен вроде подняться до основного класса...

Просто все public и protected члены класса С станут в D protected. Из B то, что было public, останется public, а что было protected, останется protected. Если объявить квалификатор доступа как private, то все взятое, и public и protected, станет в этом классе private. Иначе говоря, квалификатор доступа к предку ограничивает возможности доступа к взятому от этого предка. А взять private члены предка себе вообще никакой наследник не может. К private членам предка доступ останется возможен только самому предку, наследник их не увидит и прямо использовать не может, только через доступные ему методы предка.

А твои классы A,B,C совершенно не обязаны быть цепочкой, обычно это просто три независимых класса, иначе получается нечто ромбовидного типа, да еще и запутанное сразу несколькими ромбами, да еще смотря с какими квалификаторами доступа кто от кого в этой цепочке наследовал. Вообще в C++ легко можно создать такие конструкции, в которых сам черт не разберется. Просто старайся не использовать того, что трудно понять, совсем немного людей понимают C++ до конца, а отдельным трюковым приемам посвящены целые книжки, но все это совсем не обязательно. Так же как с морскими узлами - их существует много, в том числе очень сложных, но моряки обычно обходятся простыми - чтобы быть хорошим моряком, не обязательно знать все узлы, достаточно знать необходимые.

А насчет А, который без квалификатора доступа - полагается всегда указывать квалификатор, если его нет, может быть, некоторые компиляторы и проглотят со значением public, но не обязаны.

P.S. Извиняюсь, перечитал - заметил, что в последней строке написал о public вместо private. На самом деле public при наследовании классов (но не структур) никакой компилятор C++ по умолчанию не сделает. Без квалификатора будет пониматься как private. В C++ public - умолчание только для структур, для классов private. Чтобы не путаться, лучше указывать, что можно, явно.

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Друзья, помогите пожалуйста: нужно 3 несложных( для вас) задачки решить на турбо паскале. буду ОЧЕНЬ благодарен:

1.Описать запись с именем NOTE, содержащую данные:

-Фамилия имя

-Номер телефона

Дата рождения(массив из трех чисел)

Написать программу, реализующую следующие действия:

-ввод с клавиатуры данных в массив, состоящий из элементов типа NOTE

-Вывод информации о людях, чьи дни рождения приходятся на месяц, значение которого было введенос клавиатуры

-Если таких людей нет, вывести соответствующее сообщение

2. В файле f записана по строкам действительная матрица а[1...m,1...n],

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

3.Вводится строка символов, разделители-:.,''&!)( заданы ввиде множества.

Слово-последовательность символов, ограниченная с одной или двух сторон разделителями. Удалить из строки все слова, состоящие только из букв и имеющие длину не более 3. Разделители сохранить. Вывести полученную строку.

Заранее спасибо.

Изменено пользователем lolka996
Ссылка на комментарий
Поделиться на другие сайты

1.

type NOTE=record NAME:string[30]; TELEFON:longint; DATE:array[1..3]of integer end;varperson:array[1..100]of NOTE; i,j,n,m:word; b:boolean;beginwrite('Всего людей: '); readln(n);for i:=1 to n do with person[i] dobeginwrite('Фамилия имя отчество: '); readln(NAME);write('Телефон: ');readln(TELEFON);write('Число месяц год рождения: '); for j:=1 to 3 do read(DATE[j]); readln; writeln;end;writeln; write('Номер месяца: '); readln(m);writeln('Родившихся в ',m,' месяце: '); b:=true;for i:=1 to n do with person[i] do begin if DATE[2]=m then begin b:=false; writeln(NAME,1,'':25-length(NAME),TELEFON:12,DATE[1]:10,'.',DATE[2],'.',DATE[3]) end end;if b then writeLn('нет таких людей'); readlnend.

2.

var a:array[1..20,1..20]of real; c:array[1..400]of real; i,j,m,n,k:integer; f,h:text; b:boolean;beginwrite('m n: ');  readln(m,n); k:=0; assign(f,'f.txt'); reset(f); assign(h,'h.txt'); rewrite(h);for i:=1 to m do for j:=1 to n do read(f,a[i,j]); close(f);for j:=1 to n do begin b:=true; for i:=1 to m do if a[i,j]<=0 then b:=false; if b then for i:=1 to m do begin k:=k+1; c[k]:=a[i,j] end end;for j:=1 to k do write(h,c[j]:0:3,' '); close(h);end.

Тут для удобства записи исходных данных и чтения результата я использовал файлы с именами не просто f и h, а f.txt и h.txt. Если надо именно f и h, то убери .txt

Изменено пользователем Тролль
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу



×
×
  • Создать...