Форматцевт Опубликовано 27 февраля, 2012 Жалоба Поделиться Опубликовано 27 февраля, 2012 (изменено) reclearerr 1. Стандарт ECMA-262, 3я редакция 2. Справочник по JavaScript Думаю этого хватит, там всё очень подробно(относительно конечно) и просто написано. Могу дать chm-файлы на русском и на англ. языках. Если не нашёл.... Объект Date имеет диапазон значений от -100,000,000 до 100,000,000 дней в обе стороны от 01 января 1970 года UTC (Всемирного Времени).Для создания Date-объекта: dateObjectName = new Date([parameters]) где dateObjectName это имя создаваемого Date-объекта; это может быть новый объект или свойство существующего объекта. Параметры/parameters в этом синтаксисе могут быть: пустыми: вводятся текущие время и дата. Например, today = new Date(); строкой, представляющей дату в следующем формате: "месяц день, год час:минуты:секунды." Например, Xmas95 = new Date("December 25, 1995 13:30:00"). Если Вы пропустите часы, минуты или секунды, значение будет установлено в нуль. набором целочисленных значений для года, месяца и дня. Например, Xmas95 = new Date(1995,11,25). Набором значений для года, месяца, дня, часов, минут и секунд. Например, Xmas95 = new Date(1995,11,25,9,30,0). Таймер-секундомер на JS <html><head></head><body><table border="0"><tr><td align="center"><font face="Arial"><strong>You havevisited my page for:</strong></font></td><td align="center"><form name="d"><p><input type="text" size="8" name="d2"></p></form></td><td align="center"><font face="Arial"><strong>seconds!</strong></font></td></tr></table><script><!--/*By George Chiang. (WA's ultimate JavaScript tutorial and free JavaScripts site!)http://www.wsabstract.comCredit MUST stay intact for use*/var milisec=0var seconds=0document.d.d2.value='0'function display(){if (milisec>=9){milisec=0seconds+=1}elsemilisec+=1document.d.d2.value=seconds+"."+milisecsetTimeout("display()",100)}display()//--></script></body></head></html> И ещё, от туда же - Справочик-подборка JS Ну просто погугли... примеров вагон. А как обрабатывать рестарт компа это вторая часть вопроса. Изменено 27 февраля, 2012 пользователем Indomito Ссылка на комментарий Поделиться на другие сайты Поделиться
Форматцевт Опубликовано 27 февраля, 2012 Жалоба Поделиться Опубликовано 27 февраля, 2012 С рестартом решил по другому. На Windows можно просто создать ярлык и вместо пути написать "shutdown.exe -r -t <время, через которое компьютер выключится>", затем занести сей ярлык в автозагрузку. т.е. проблему-задачу свою решил? С кодом на JS разобрался? Таймер реализуй через this. Вот опрос по событию таймера буфера обмена, думаю поможет: /*Initialization Code*///+++++++++++++++++++++++++++++++++++++++++++++++++++++++++// Блок инициализации глоб. переменных и функций// срок существования - один сеанс браузера//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++//bbBBCodeStat=true // разрешить/включить BBCodewindow.arycb_BBCodeClipboardStrings = this.clipboardStrings = []; // Массив буфера обмена////********************************************************//--------Общие функции для вставки BBCode----------------//*********************************************************//++++++++++++++++++BEGIN DEF++++++++++++++++++++++++++++++//--------------------------------------------------------// Функция lb_BBCodePrim // [bbCode]выделенный[/bbCode]// по умолчанию от ЛКМ)lb_BBCodePrim = function (open,close){var theBox = document.commandDispatcher.focusedElement;var startPos = theBox.selectionStart;var endPos = theBox.selectionEnd;var oPosition = theBox.scrollTop;var oHeight = theBox.scrollHeight;var text=theBox.value.substring(0,startPos);text +=open+theBox.value.substring(startPos, endPos)+close;text +=theBox.value.substring(endPos, theBox.value.length);theBox.value = text;var nHeight = theBox.scrollHeight - oHeight;theBox.scrollTop = oPosition + nHeight;};//---------------------------------------------------------// Функция mb_BBCodePrim // Резерв// по умолчанию от CКМmb_BBCodePrim = function (open,close) {};// -------------------------------------------------------// Функция rb_BBCodePrim // [bbCode]параметр PASTE по умолчанию из буфер обмена[/bbCode]// по умолчанию от ПКМrb_BBCodePrim = function (open,close,paste){if (paste == undefined) { open +=close;} //буфер обмена пуст else { open +=paste+close;}var theBox = document.commandDispatcher.focusedElement;var startPos = theBox.selectionStart;var endPos = theBox.selectionEnd;var selectionLen = endPos - startPosvar oPosition = theBox.scrollTop;var oHeight = theBox.scrollHeight;var text=theBox.value.substring(0,startPos); var nHeight = theBox.scrollHeight - oHeight;text +=open;text +=theBox.value.substring(endPos, theBox.value.length);theBox.value = text; theBox.selectionStart = endPos + open.length;theBox.selectionEnd = endPos + open.length - selectionLen;theBox.scrollTop = oPosition + nHeight;};// -------------------------------------------------------// Функция fHLD_Get_ListClipboardPrim // получить список сохранёного буфера обмена//fnHLD_Get_ListClipboardPrim = function (){var cs = arycb_BBCodeClipboardStrings; return (cs.slice(0)); }; //++++++++++++++++++END DEF+++++++++++++++++++++++++++++++++++//Список сохранёного буфера обмена//Не вызываем это, обработка по таймеру или по событию ЛКМ//-----Обработчики буфера обменаthis.MAX_ENTRIES = 16; //Максимальное число записей 16this.CHECK_INTERVAL = 1000; //Время опроса буфера 1000 миллисекундthis.type = "menu";this.orient = "horizontal";this._menupopup = this.appendChild(document.createElement("menupopup"));this._menupopup.setAttribute("oncommand", "this.parentNode.handleCommand(event.target);");this.checkClipboard = function() { var clipStr = readFromClipboard(); if(clipStr && this.clipboardStrings.indexOf(clipStr) == -1) this.storeString(clipStr);};this.storeString = function(str) { var cs = this.clipboardStrings; cs.push(str); while(cs.length > this.MAX_ENTRIES) cs.shift(); var mi = document.createElement("menuitem"); mi.setAttribute("label", str); this._menupopup.appendChild(mi); while(this._menupopup.childNodes.length > this.MAX_ENTRIES) this._menupopup.removeChild(this._menupopup.firstChild);};this.handleCommand = function(mi) { var indx = Array.indexOf(mi.parentNode.childNodes, mi); if(indx != -1) this.insertText(this.clipboardStrings[indx]);};this.insertText = function(str) { var cmd = "cmd_insertText"; var controller = document.commandDispatcher.getControllerForCommand(cmd); if(controller && controller.isCommandEnabled(cmd)) { controller = controller.QueryInterface(Components.interfaces.nsICommandController); var params = Components.classes["@mozilla.org/embedcomp/command-params;1"] .createInstance(Components.interfaces.nsICommandParams); params.setStringValue("state_data", str); controller.doCommandWithParams(cmd, params); }};setInterval(function(button) { button.checkClipboard();}, this.CHECK_INTERVAL, this);this.setAttribute("onpopupshowing", "this.checkClipboard();"); reclearerr мне сложно написать нечто готовое без общего скрипта, но я дал достаточно много данных для написания самостоятельно, на мой взгляд задача тривиальная... вроде бы :rolleyes: Ссылка на комментарий Поделиться на другие сайты Поделиться
Иазяв Опубликовано 1 марта, 2012 Жалоба Поделиться Опубликовано 1 марта, 2012 Тролль ...но не могу так объявить непрямоугольный массив, у которого в первой строке 4 элемента, во второй 5, а третьей 8. А с указателями я так могу - массив из трех указателей, каждый из которых указывает на свой одномерный массив. Или, при динамическом создании (во время работы программы) - указатель на массив из трех указателя, каждый из которых указывает на свой одномерный массив. А можно пример, как это выглядит в коде? Indomito Рекомендую не путать себя жуткими конструкциями и максимально комментировать, иначе... Честно сознаюсь, что комментировала только задачи, которые решала самостоятельно. Редко (и преподаватель ругается что так) в домашних заданиях. Многое говорит имя переменной, функции и т.д., поэтому стараюсь выбирать названия отражающие суть вопроса (глянул - и понял, что есть в программе). К этому пришла позже, а до этого было "иначе"... Ссылка на комментарий Поделиться на другие сайты Поделиться
Riki_Tiki_Tavi Опубликовано 2 марта, 2012 Жалоба Поделиться Опубликовано 2 марта, 2012 Всем привет! Помогите написать программу по теме(Объектно-ориентированное программирование. Классы. Инкапсуляция.) Описать классы по приведенным ниже протоколами. Сохранить описания каждого класса в отдельном модуле. Написать программу для демонстрации всех методов описанных классов. type / / ----------------------------------------- Вспомогательные описания ----- ---------------------------- / / Тип комплексного числа TNumber = record Re, Im: Real; / / соответственно действительная и мнимая части комплексного числа end; / / --------------------------------- Описание класса комплексных чисел TComplex ---------- ----------------------- TComplex = class / / ------------------------- Атрибуты ---------------------- -------------------------------------------------- ---- Number: TNumber; / / значение комплексного числа / / ------------------------- Методы - конструкторы -------------------- --------------------------------------- constructor Create; overload; / / создается число (0; 0) constructor Create (R, I: Real) overload; / / создается число (R; I) constructor CreateRead; / / значение действительной и мнимой части комплексного числа / / Вводимые с клавиатуры / / ------------------------- Методы ---------------------- -------------------------------------------------- ---- procedure SetValue (A: TNumber) / / задать комплексное число procedure Print; / / вывести на экран комплексное число в виде (Re; Im) procedure Copy (A: TNumber) / / число принимает значение другого числа procedure Add (A: TNumber) / / в число добавляется другое комплексное число procedure Decrease (A: TNumber) / / от числа вычитается другое комплексное число procedure Multiply (A: TNumber) / / число умножается на другое комплексное число procedure Divide (A: TNumber) / / число делится на другое комплексное число function GetReal: Real; / / выделить действительную часть комплексного числа function GetImaginary: Real; / / выделить мнимую часть комплексного числа function GetModule: Real; / / найти модуль комплексного числа function GetArgument: Real; / / найти аргумент комплексного числа End; Заранее очень благодарен. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 2 марта, 2012 Жалоба Поделиться Опубликовано 2 марта, 2012 (изменено) Riki_Tiki_Tavi Неясно, какой это язык. PascalABC, PascalABC.NET, FreePascal, Lazarus, Delphi? Но в любом случае писать четырнадцать даже простеньких процедур и функций и демонстрационную программу с их вызовами и распечаткой результатов чересчур скучно Никаких трюков тут не надо, просто слегка переделать пример из конспекта. Иазяв непрямоугольный массив, у которого в первой строке 4 элемента, во второй 5, а третьей 8. А можно пример, как это выглядит в коде? #include <iostream>using namespace std;int main(){int n[]={4,5,8}, m=sizeof(n)/sizeof(int); int** mas2d=new int*[m];for(int j=0;j<m;j++)mas2d[j]=new int[n[j]]; for(int j=0;j<m;j++)for(int k=0;k<n[j];k++)mas2d[j][k]=10*j+k;for(int j=0;j<m;j++){for(int k=0;k<n[j];k++)cout<<"mas2d["<<j<<"]["<<k<<"]="<<mas2d[j][k]<<endl; cout<<endl;}for(int j=0;j<n[j];j++)delete[]mas2d[j]; delete[]mas2d; cin.get();} Тут в n задано количество элементов в строках нашего массива. Их три, можно написать их другое количество и изменить значения. Я представляю себе наш массив как сшитый из полосок разной длины флаг. К древку флага - "указателю на указатели" цепляем цепочку m указателей на целые ("зажимов"). Затем к каждому из этих указателей цепляем цепочку целых, то есть одномерный массив, заданной нами длины. Затем в созданные нами массивы заносим числа 10*j+k для последующей тестовой распечатки. Делаем эту распечатку и распарываем обратно наш флаг, отдавая освобожденную материю флага - память - обратно операционной системе, сначала каждого одномерного массива, а потом и массива указателей на начала бывших одномерных массивов. Ну, в качестве еще одного примера пользы указателей: элементы массивов в С и C++ обычно нумеруются всегда от нуля. Это бывает неудобно - или формула задана с нумерацией от 1, или мы переписываем программу с Паскаля или Бейсика, где такого ограничения нет. Но это можно изменить, присвоив указателю в качестве адреса нулевого элемента массива не адрес начала массива, а адрес какого-либо другого его элемента, который и будет тогда считаться нулевым. Можно даже несуществующего элемента - ведь мы будем обращаться к элементам массива по их индексам, которые будут суммироваться со значением адреса в указателе, важно только, чтобы эта сумма всегда соответствовала адресу реально существующего элемента массива. Для примера возьмем обычный массив m с элементами с индексами от 0 до 4 и переделаем нумерацию массива так, чтобы его индексы шли с 1 или с -4. Это будет все тот же массив, только мы ему дадим еще пару имен - с именем m1 он будет иметь индексы элементов от 1 до 5, а с именем m2 - от -4 до 0 (отрицательные значения индексов в С не запрещены - адресная арифметика прекрасно работает и с отрицательными числами :) ). #include <iostream>using namespace std;int main(){int m[5]={0,1,2,3,4}; int* m1=&m[-1]; for(int i=1;i<=5;i++)cout<<m1[i]<<endl; cout<<endl;int* m2=&m[4]; for(int i=-4;i<=0;i++)cout<<m2[i]<<endl; cout<<endl; cin.get();} Изменено 2 марта, 2012 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
Riki_Tiki_Tavi Опубликовано 3 марта, 2012 Жалоба Поделиться Опубликовано 3 марта, 2012 Всем привет! Помогите написать программу по теме(Объектно-ориентированное программирование. Классы. Инкапсуляция.) Описать классы по приведенным ниже протоколами. Сохранить описания каждого класса в отдельном модуле. Написать программу для демонстрации всех методов описанных классов. type / / ----------------------------------------- Вспомогательные описания ----- ---------------------------- / / Тип комплексного числа TNumber = record Re, Im: Real; / / соответственно действительная и мнимая части комплексного числа end; / / --------------------------------- Описание класса комплексных чисел TComplex ---------- ----------------------- TComplex = class / / ------------------------- Атрибуты ---------------------- -------------------------------------------------- ---- Number: TNumber; / / значение комплексного числа / / ------------------------- Методы - конструкторы -------------------- --------------------------------------- constructor Create; overload; / / создается число (0; 0) constructor Create (R, I: Real) overload; / / создается число (R; I) constructor CreateRead; / / значение действительной и мнимой части комплексного числа / / Вводимые с клавиатуры / / ------------------------- Методы ---------------------- -------------------------------------------------- ---- procedure SetValue (A: TNumber) / / задать комплексное число procedure Print; / / вывести на экран комплексное число в виде (Re; Im) procedure Copy (A: TNumber) / / число принимает значение другого числа procedure Add (A: TNumber) / / в число добавляется другое комплексное число procedure Decrease (A: TNumber) / / от числа вычитается другое комплексное число procedure Multiply (A: TNumber) / / число умножается на другое комплексное число procedure Divide (A: TNumber) / / число делится на другое комплексное число function GetReal: Real; / / выделить действительную часть комплексного числа function GetImaginary: Real; / / выделить мнимую часть комплексного числа function GetModule: Real; / / найти модуль комплексного числа function GetArgument: Real; / / найти аргумент комплексного числа End; Заранее очень благодарен. На delphi. Ссылка на комментарий Поделиться на другие сайты Поделиться
Форматцевт Опубликовано 3 марта, 2012 Жалоба Поделиться Опубликовано 3 марта, 2012 Riki_Tiki_Tavi а не проще найти готовый/готовые реализации в интернете? Я правда не искал, но уверен 5-15-30 минут поиска и будет результат, уж больно типовая задача. Ссылка на комментарий Поделиться на другие сайты Поделиться
denmakar1990 Опубликовано 4 марта, 2012 Жалоба Поделиться Опубликовано 4 марта, 2012 Друзья!!!!Горит дипломная работа!!!Не работает почему-то программа.Если есть шарящие в Delphi,объясните где ошибка.Должна вылетать картинка с расчётом диаграммы направленности цилиндрической ФАР.Вот текст программы: unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, ExtCtrls, Buttons; type TForm1 = class(TForm) Label1: TLabel; UpDown1: TUpDown; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; UpDown2: TUpDown; UpDown3: TUpDown; BitBtn1: TBitBtn; Button1: TButton; Panel1: TPanel; Image1: TImage; Image2: TImage; Image3: TImage; procedure UpDown1Click(Sender: TObject; Button: TUDBtnType); procedure UpDown2Click(Sender: TObject; Button: TUDBtnType); procedure UpDown3Click(Sender: TObject; Button: TUDBtnType); procedure Button1Click(Sender: TObject); procedure FormActivate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; Lequ, Lam, b05, b2, koef : single; j : integer; implementation {$R *.DFM} procedure TForm1.UpDown1Click(Sender: TObject; Button: TUDBtnType); begin Form1.Label2.Caption := FloatToStr(UpDown1.Position/10)+'`'; j := j+1; end; procedure TForm1.UpDown2Click(Sender: TObject; Button: TUDBtnType); begin Form1.Label4.Caption := FloatToStr(UpDown2.Position)+'см'; j := j+1; end; procedure TForm1.UpDown3Click(Sender: TObject; Button: TUDBtnType); begin Form1.Label7.Caption := FloatToStr(UpDown3.Position)+'`'; j := j+1; end; procedure TForm1.Button1Click(Sender: TObject); var u : single; i : ShortInt; begin if j < 3 then MessageDlg('Не ведены параметры.', mtInformation, [mbOk], 0) else begin Lam := UpDown2.Position; b05 := UpDown1.Position/10; Lequ := 50.5*Lam/b05; koef := (pi/Lam)*Lequ; with Form1.Image1.Canvas do begin MoveTo(20,410); LineTo(620,410); LineTo(617,408); LineTo(617,412); LineTo(620,410); MoveTo(320,410); LineTo(320,0); LineTo(318,3); LineTo(322,3); LineTo(320,0); for i := 1 to 40 do if i mod 2 = 0 then begin MoveTo(20+i*15,413); LineTo(20+i*15,407); if i <> 40 then TextOut(18+i*15,415,IntToStr(i div 2-10)) else TextOut(18+i*15,415,'I'); end else begin MoveTo(20+i*15,411); LineTo(20+i*15,409); end; TextOut(280,0,'F(k)'); for i := 1 to 10 do begin MoveTo(318,410-i*40); LineTo(322,410-i*40); if i <> 10 then TextOut(300,410-i*40,'0.'+IntToStr(i)); end; MoveTo(20,410); for i := -60 to 60 do if i <> 0 then begin u := koef*sin((i/6)*(pi/180)); LineTo(20+(i+60)*5,410-abs(Trunc(400*(sin(u)/u)))); MoveTo(20+(i+60)*5,410-abs(Trunc(400*(sin(u)/u)))); end; end; end; end; procedure TForm1.FormActivate(Sender: TObject); begin j := 0; end; end. Ответить можете здесь или на мыло- <censored> За ранее всем спасибо!!! ! Предупреждение: Перечитайте Правила Форума, пожалуйста. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 4 марта, 2012 Жалоба Поделиться Опубликовано 4 марта, 2012 Riki_Tiki_Tavi У меня сейчас Delphi, к сожалению, не установлен. Ссылка на комментарий Поделиться на другие сайты Поделиться
Riki_Tiki_Tavi Опубликовано 4 марта, 2012 Жалоба Поделиться Опубликовано 4 марта, 2012 Riki_Tiki_Tavi У меня сейчас Delphi, к сожалению, не установлен. Жаль Ссылка на комментарий Поделиться на другие сайты Поделиться
Иазяв Опубликовано 5 марта, 2012 Жалоба Поделиться Опубликовано 5 марта, 2012 Нашла задачу, чтобы проработать тему указателей. Если я не ошибаюсь, то там должен быть указатель на указатель. Функция добавления в двумерный массив строки или столбца. Уже весь инет облазила, поисправляла все, что могла. Она так и не заработала. Может, объясните, что не так. Пожалуйста. void addRowArray (int **&pArray, int &row, int &col, int index){int **tmp = new int *[++row];for(int i = 0; i < row; i++){ int k = 0; tmp [i] = new int [col]; for (int j = 0; j < col; j++) { if (i == index) { k = 1; tmp [index][j] = 2012; } tmp [i + k][j] = pArray [i][j]; }}for (int i = 0; i < row; i++) delete [] pArray [i];delete [] pArray;pArray = tmp;} Это функция добавления строки. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 6 марта, 2012 Жалоба Поделиться Опубликовано 6 марта, 2012 (изменено) Иазяв Не делай одним махом то, что можно разбить на части. Например, сначала создай массив, а потом копируй в него, и отдельно вписывай новую строку, а не все вместе переплетением. Если бы ты так сделала, то сразу заметила бы, что i ты перебираешь до нового значения row, а в массиве tmp еще на единицу больше, а этих значений в массивах нет. Возможно, комбинация из i и k сбила тебя с толку. Трюки с k возможны, но понятнее было делать сначала до строки с индексом index, потом для строки с индексом index, а потом для строки с индексом больше index, без всяких k. Старайся делать сначала максимально просто и по возможности не смешивая разные задачи. Вот когда все заработает, можешь объединять действия до тех пор, пока не получится то, на что на следующее утро ты уже сама будешь смотреть как баран на новые ворота ;) Я перепишу твою программу в работающий вид, убрав трюк с k. Если захочешь, можешь снова сделать c k, хотя k делает программу непонятнее. #include<iostream>#include<iomanip>using namespace std;void addRowArray(int **&pArray, int &row, int &col, int index){int **tmp=new int*[++row];for(int i=0;i<row;i++)tmp[i]=new int[col];for(int i=0;i<index;i++) for(int j=0;j<col;j++)tmp[i][j]=pArray[i][j];for(int j=0;j<col;j++)tmp[index][j]=1012;for(int i=index+1;i<row;i++)for(int j=0;j<col;j++)tmp[i][j]=pArray[i-1][j];for (int i=0;i<row-1;i++)delete [] pArray[i];delete []pArray;pArray=tmp;}int main(){int row=3, col=4, index=1;int **ar=new int*[row];for(int i=0;i<row;i++)ar[i]=new int[col];for(int i=0;i<row;i++)for(int j=0;j<col;j++)ar[i][j]=10*i+j;for(int i=0;i<row;i++){for(int j=0;j<col;j++)cout<<setw(7)<<ar[i][j]; cout<<endl;}addRowArray(ar,row,col,index); cout<<endl;for(int i=0;i<row;i++){for(int j=0;j<col;j++)cout<<setw(7)<<ar[i][j]; cout<<endl;}cin.get();} P.S. Кстати говоря, зачем было городить огород с переписыванием всего массива? Если надо добавить грядку, не надо переносить весь огород на новое место. Не все ли равно, где у нас расположены грядки? Достаточно было создать просто новый массив указателей на одномерные массивы и присвоить этим указателям по порядку адреса старых строк до вставляемой строки, потом создать новую строку для указателя index, а потом остальным новым указателям присвоить адреса дальнейших старых строк. И уничтожить только старые указатели, а не весь старый огород :) Вот с добавлением столбца действительно так не получилось бы - для удлинения грядок пришлось бы их переносить на новое место. Это потому что наш массив хранится набором раскиданных в памяти строк, а не столбцов. Новую строку легко добавить, а вот изменить размеры каждой строки так не получится. Изменено 6 марта, 2012 пользователем Тролль 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Иазяв Опубликовано 6 марта, 2012 Жалоба Поделиться Опубликовано 6 марта, 2012 Тролль Старайся делать сначала максимально просто и по возможности не смешивая разные задачи. Вот когда все заработает, можешь объединять действия до тех пор, пока не получится то, на что на следующее утро ты уже сама будешь смотреть как баран на новые ворота ;) Я так и делала. Логика решения совпадала с Вашей - до индекса, индекс, после индекса. Но вчера когда моя функция не заработала, впала в панику. Мне казалось, что я стала понимать указатели... Полезла в инет, может, хоть оттуда функция заработает. То, что я привела как свою функцию, на самом деле скачанная из инета и исправленная мною по возможности. Тоже не работала. Хуже стало потом, когда я написала сюда, а причину обнаружила через 10-15 минут - лишний пробел в другой функции... Может, у меня все бы и заработало в начале. Мечты, мечты... Очень было приятно почитать Ваш код. Всегда им восхищаюсь. Его читаешь как книгу на родном языке. Все понятно, все по полочкам. Вот с добавлением столбца действительно так не получилось бы Решила сделать. Добавить в код еще и такую функцию - добавление столбца по индексу. Получилось, добавляет, только при выводе мусор добавляется. А как правильно удалить теперь этот массив? void addColArray (int **&pArray, int &row, int &col, int index){int **tmp = new int *[row];for (int i = 0; i < row; i++) tmp [i] = new int [++col];for (int i = 0; i < row; i++){ for (int j = 0; j < index; j++) { tmp [i][j] = pArray [i][j]; } tmp [i][index] = 2012; // индекс for (int j = index + 1; j < col; j++) { tmp [i][j] = pArray [i][j-1]; }}for (int i = 0; i < row; i++) delete [] pArray [i];delete [] pArray;pArray = tmp;} Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 6 марта, 2012 Жалоба Поделиться Опубликовано 6 марта, 2012 (изменено) Иазяв С указателями ты, по-моему, вполне разобралась. Ничего в них сложного нет. Переменная с адресом другой переменной внутри, вот и все. Единственная сложность - это их объявление, это в C++ сделано удобно для компилятора, а не для человека. А ошибки у тебя другие, просто из-за попыток писать скорописью при недостатке опыта. for (int i = 0; i < row; i++) tmp [i] = new int [++col]; В этом цикле col будет увеличиваться каждый раз. Вытащи ++col из цикла, и все пойдет правильно. Это C++. В Pascal, например, нет операции ++ и такие ошибки невозможны. ++ очень удобное сокращение для стенографии, но это одна из наиболее опасных возможностей C++. А удаляется массив pArray правильно. P.S. И я не понимаю, разве for (int j = 0; j < index; j++) { tmp [i][j] = pArray [i][j]; } действительно понятнее, чем for (int j = 0; j < index; j++) tmp [i][j] = pArray [i][j]; ? Мне гораздо удобнее скользить глазами по горизонтали, чем по вертикали... P.P.S. Для развлечения о ++: http://lurkmore.to/++i_+_++i Это хорошо показывает, почему C++ столь сложен. По сравнению с другими плацдармами написания программ он напоминает минное поле. Поэтому я бы давал его изучать только после простого языка. Вообще C++ хорошо подходит под рекламу "Волшебной лавки" из одноименного рассказа Уэллса: "Купи и удивляй друзей" ;) Изменено 6 марта, 2012 пользователем Тролль 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Иазяв Опубликовано 6 марта, 2012 Жалоба Поделиться Опубликовано 6 марта, 2012 Тролль С указателями ты, по-моему, вполне разобралась. Когда прочитала, где у меня ошибка спряталась, поняла, что еще работать с ними и работать. Чтобы не делать таких глупых ошибок. Особенно, когда указатель на указатель. Хотела спросить, а как добавить строку и столбец одновременно? По очереди? И если я захочу добавить строку в нескольких местах (index = 1,3,5 и т.д.), то цикл делать в main или лучше написать функцию, принимающую начальный индекс и шаг? Осталось еще три задачи на указатели. Вроде легкие, но подвох чувствуется. Если их разберу, может пойму высший смысл указателей. И еще один вопрос... Я тут с одним мальчиком (уже программист, но неработающий по специальности) поспорила, кто из нас лучше морской бой напишет. Чувствую, что у него есть программка еще с института. Бог с ним! У меня вопрос: можно ли в консоле нарисовать поле как в игре "сапер"? стоит ли мучаться с обозначениями раненых и убитых? Я думала, достаточно того, чтобы где есть корабли поставить единицы, а где их нет нули. Т.е. первоначально поле представлено, например, #, а по мере ходов открываются 0 и 1. Только я еще не придумала, как открывать - скорее всего переписывать матрицу с учетом хода. Если единицы будут окружены нулями, то эти нули тоже высветить, потому что корабль убит и рядом с ним нельзя поставить корабль.В последнее время ловлю себя на косноязычии... Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 6 марта, 2012 Жалоба Поделиться Опубликовано 6 марта, 2012 (изменено) С указателями ты, по-моему, вполне разобралась.Когда прочитала, где у меня ошибка спряталась, поняла, что еще работать с ними и работать.Опять поп свое, черт свое :) Ну при чем тут указатели? У тебя с ними ни одной ошибки, все ошибки с инкрементом. Они были бы, даже если бы указатели и рядом не пробегали ;)Ошибки вовсе не глупые. Это типичные ошибки. Их делали и делают даже профессионалы, да и кто угодно. Сконцентрировался на другом и написал дважды четыре восемнадцать... Это не от непонимания, а просто от принципов работы мозга. Как добавить и строку и столбец? По очереди. Разделяй и властвуй. Объединение может уменьшить размер кода, но резко повысит время разработки и сложность программы. Обрати внимание, что программу для вставки строки можно сделать в сотни раз более быстродействующей, чем для вставки столбца - в ней, я раньше это отметил, можно просто добавить строку без переписывания исходного массива. Так стоит ли в одной программе объединять такие разные алгоритмы? Как добавить сразу несколько строк и столбцов? Практически это никогда не надо, но если, паче чаяния, это понадобится, вызови несколько раз функцию для вставки по одному. Или сделай дополнительную функцию, которая несколько раз будет вызывать функцию для вставки строки или столбца. Универсальная программа с редко используемыми возможностями неудобна в обращении, в простых случаях часто работает намного дольше и чревата ошибками. Даже в самом С, например, есть куча функций для работы со строками, и никто не делал одну универсальную для всех возможных вариантов - неудобно и неоптимально. Программу, которой передаются массивы номеров для вставки строк и столбцов, гораздо неудобнее вызывать, чем простую с одним номером. Конечно, в С есть и можно применить и функции с переменным числом аргументов - предела усложнениям нет, но кому это нужно? Насчет спора с мальчиком - мне казалось, тебе и так хватает, что делать. Признай лучше сходу свое поражение и не ввязывайся в ненужные дела. Помни, что любое дело занимает в 3,14 раза больше времени, чем планируется. Это эмпирически подмеченная мной закономерность, можешь назвать ее законом Тролля ;) Если все же немного подумать об этом, то поле "морского боя" - это двумерный квадратный массив символов. Достаточно переписывать только то, что меняется. Можно потом заново вывести матрицу на экран, а можно поменять на экране только символы в нужных позициях, это сложнее и я выбрал бы первый способ. И уж сам Бог велел использовать разные цвета... Хоть в Библии и не сказано "Да будет цвет", но это очень приятная особенность нашего зрения. В принципе на нерусифицированных компьютерах имелась масса символов псевдографики, но в русифицированных эти символы заменили рисунками русских букв, так что лучше обходиться тем, что есть на клавиатуре. Но еще раз советую, не трать на это время. Изменено 6 марта, 2012 пользователем Тролль 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Иазяв Опубликовано 7 марта, 2012 Жалоба Поделиться Опубликовано 7 марта, 2012 Тролль ...можно просто добавить строку без переписывания исходного массива. Почему? Размер задает пользователь. Или в программе предусматривать сразу увеличение размера, а потом выводить реально заполненное? Насчет спора с мальчиком... не трать на это время. Не буду, но мне интересно. :blush2: Я потом все равно вернусь к морскому бою. Хочется посмотреть, получится или нет. На летних каникулах. Мне гораздо удобнее скользить глазами по горизонтали, чем по вертикали... С моими пробелами строчка растянется на весь экран. Тяжко будет выискивать нужное. Особенно, когда к каждой строчке пишется комментарий, который выйдет за пределы поля. Я так пишу, чтобы сильно не напрягать свои глаза. Забыла исправить на Ваш стиль. P.P.S. Для развлечения о ++ Понравилось. Напомнило, как нам сказали изучить функции gets, puts - и что о них писали программисты в инете. Немного походила по луркоморью и натолкнулась на "выстрелить себе в ногу". Задача, решаемая на разных языках программирования... Весело описано. Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 7 марта, 2012 Жалоба Поделиться Опубликовано 7 марта, 2012 Иазяв ...можно просто добавить строку без переписывания исходного массива.Почему? Размер задает пользователь. Или в программе предусматривать сразу увеличение размера, а потом выводить реально заполненное? Не понял. Функция у тебя увеличивает массив еще на одну строку - любой динамически созданный (вообще-то существуют четыре разных типа массивов, динамический созданный - это название одного из этих типов) массив, переданный функции. Делается это добавление строки путем создания нового массива, на одну строку больше старого, в него переписывается старый массив плюс новая строка (у тебя она сразу с числами 2012). Но совсем не обязательно создавать новый массив и уничтожать старый, достаточно вставить новую строку в старый массив.Я потом все равно вернусь к морскому бою. Хочется посмотреть, получится или нет. А как может не получиться? Лучше уж сделать что-то более оригинальное, например, "Жизнь" Конуэя.Я так пишу, чтобы сильно не напрягать свои глаза. Забыла исправить на Ваш стиль.Не надо для меня исправлять. Я отлично читаю и с пробелами :) 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Иазяв Опубликовано 13 марта, 2012 Жалоба Поделиться Опубликовано 13 марта, 2012 @Тролль, Не понял.Но совсем не обязательно создавать новый массив и уничтожать старый Я это поняла недавно, когда писала программку-фильтр. Только по мне понятным причинам произошла ассоциация. :rolleyes: Здесь как-то на форуме эта программка всплывала. Только мне ее раскритиковали, сказав, что делать надо было через битовые поля. Зачем спрашивается, если так легче? И где сказано, что пользователь выбирает фильтр??? Все суета сует и томление духа... Я отказалась переделывать, тем более это было дополнительным заданием (лично для меня, по моему же желанию). Сама не пойму, зачем ищу, а затем решаю разные задачи? Многие олимпиадные задачи школьников решить не могу, не знаю как. А иногда что-то находит и строчу алгоритмы, потому что уже лень писать всю программу. /*Создать программу,фильтрующую текст,введённый с клавиатуры. Задача программы заключается в считывании текста и отображении егона экране,используя замену заданного набора символов на пробелы. Программа должна предлагать следующие варианты наборов символовдля фильтрации:-Символы латинского алфавита-Символы кириллицы-Символы пунктуации-ЦифрыФильтры могут накладываться последовательно. При повторной установке существующего фильтра данный фильтр должен сниматься.*/#include <iostream>using namespace std;unsigned char LAT = 1; // глобальные переменные (цифры компьютер прочтет в битах)unsigned char KYR = 2;unsigned char PNC = 4;unsigned char DGT = 8;void touch (unsigned char *flags, unsigned char symbol) // изменяем фильтр{*flags = (*flags & symbol) ? *flags - symbol : *flags + symbol; // добавляем или убираем символ из флага}bool filter (unsigned char *flags, unsigned char symbol) // фильтруем по ASC-таблице{unsigned char st = 0;if ((symbol >= 65) && (symbol <= 90) || (symbol >= 97) && (symbol <= 122)){ st = LAT;}else if ( // кодировка в DOS (symbol >= 0x80) && (symbol <= 0xAF) || (symbol >= 0xE0) && (symbol <= 0xEF) || (symbol == 0xF0) || (symbol == 0xF1)){ st = KYR;}else if ((symbol >= 48) && (symbol <= 57)){ st = DGT;}else // знаки пунктуации разбросаны по таблице, решила все оставшиеся знаки посчитать как пунктационные{ st = PNC;}return (*flags & st) > 0; // побитовое И - будет вкл/выкл какой-то фильтр}int main(){char *User = new char [256];cout << "Vvedite stroku :\n";cin.getline (User, 256);unsigned char flags = LAT | KYR; // устанавливаем флаги - заменяем латиницу и кириллицу пробеламиcout << endl;for (int i = 0; i < strlen (User); i++){ cout << ((filter (&flags, User[i])) ? ' ' : User[i]);}touch (&flags, KYR); // снимаем кириллицуcout << endl;for (int i = 0; i < strlen (User); i++){ cout << ((filter (&flags, User[i])) ? ' ' : User[i]);}touch (&flags, DGT); // добавляем к фильтру цифры cout << endl;for (int i = 0; i < strlen (User); i++){ cout << ((filter (&flags, User[i])) ? ' ' : User[i]);}touch (&flags, PNC); // знаки пунктуацииcout << endl;for (int i = 0; i < strlen (User); i++){ cout << ((filter (&flags, User[i])) ? ' ' : User[i]);}delete [] User;return 0;} Это код моей программки. Для ассоциации... :) P.S. Вы много раз писали о DevC++. Что это за зверь? RAD Studio в сравнении с ней лучше? Ссылка на комментарий Поделиться на другие сайты Поделиться
Иазяв Опубликовано 14 марта, 2012 Жалоба Поделиться Опубликовано 14 марта, 2012 Хочу узнать, можно ли проинициализировать массив указателей, вбив вручную значения? Как обратиться к элементам двумерного массива (массив указателей), если нужно обратиться к определенной ячейке? Приблизительный пример моих попыток: bool CheckData (int **Data){ bool result = true; for (int i = 0; result && (i < 3); i++) {result &= (*Data[0][i] + *Data[1][i] + *Data[2][i] == 6); } result &= (*Data[0][0] + *Data[1][1] + *Data[2][2] == 6); result &= (*Data[0][2] + *Data[1][1] + *Data[2][0] == 6); return result;} Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 14 марта, 2012 Жалоба Поделиться Опубликовано 14 марта, 2012 (изменено) Иазяв DevC++. Что это за зверь? RAD Studio в сравнении с ней лучше? Dev-C++ просто очень простая и компактная (10-16 мегабайт) среда программирования для разработки консольных приложений на C++. Конечно, RAD Studio имеет в десятки раз больше возможностей, но Dev-C++ удобна как легкая, так сказать, "карманная", среда для изучения собственно C++. У нее есть портабельная редакция, так что даже устанавливать, по сути, не надо - один раз распаковал хоть на флешку и повсюду можешь носить с собой. Исходный проект был законсервирован лет пять назад, но затем началась разработка к нему библиотек для оконных приложений под названием wxDev-C++. Можно сказать, основной ствол перестал расти, зато очень бурно пошла в рост боковая ветвь. Однако в конце прошлого года и исходный Dev-C++ после пятилетней спячки вдруг ожил и стал выдавать новые версии.Хочу узнать, можно ли проинициализировать массив указателей, вбив вручную значения? Как обратиться к элементам двумерного массива (массив указателей), если нужно обратиться к определенной ячейке? Вручную адреса? А откуда они будут известны "рукам"? Память программа запрашивает у операционной системы, какие будут конкретно адреса, никто не знает. Если ты дашь адрес "от себя", он скорее всего попадет в место, выделенное для других данных, или кода, или, еще хуже, в места, где располагаются данные и коды самой Windows.Как обратиться в функции к определенной ячейке переданного ей массива? Как обычно. Например, вот пример ;) , дважды печатается содержимое тестового массива, при этом функция func1 использует для обращения к элементам массива индексы, а функция func2 - указатели. #include<iostream>#include<iomanip>using namespace std;void func1(int** a, int r, int c) {for(int i=0;i<r;i++){for(int j=0;j<c;j++)cout<<setw(7)<<a[i][j]; cout<<endl;}}void func2(int** a, int r, int c) {for(int i=0;i<r;i++){for(int j=0;j<c;j++)cout<<setw(7)<<*(*(a+i)+j); cout<<endl;}}int main(){int row=3, col=4, **ar=new int*[row];for(int i=0;i<row;i++)ar[i]=new int[col];for(int i=0;i<row;i++)for(int j=0;j<col;j++)ar[i][j]=10*i+j;func1(ar,row,col); cout<<endl;func2(ar,row,col); cout<<endl;cin.get();} Изменено 14 марта, 2012 пользователем Тролль Ссылка на комментарий Поделиться на другие сайты Поделиться
Иазяв Опубликовано 14 марта, 2012 Жалоба Поделиться Опубликовано 14 марта, 2012 @Тролль Вы обращаетесь к элементам в цикле, а я выборочно. for(int i=0;i<r;i++){for(int j=0;j<c;j++)cout<<setw(7)<<a[i][j]; *Data[0][i] + *Data[1][i] + *Data[2][i]*Data[0][0] + *Data[1][1] + *Data[2][2] Так можно обращаться? Мне надо из статического двумерного массива переписать в динамический двумерный определенные данные и проверить их по условию. Просто я поняла, что двумерный динамический массив - это массив указателей. В любом случае, если мы создаем динамический двумерный массив, он будет называться массивом указателей. P.S. Огромнейшее спасибо, что Вы возитесь со мной! Если надоем глупыми вопросами, скажите. А то на неделе был срез знаний. Дали распечатанные небольшие программки, надо было найти ошибки в них или написать, что будет на экране после отработки. Задачи на указатели на 90 % неправильно решила, а в других - ошибку нахожу правильно, но неверно ее объясняю. Стала колебаться (в очередной раз), что программирование не мое... P.P.S. Об игре "Жизнь". Не уловила интерес игрушки. Все делает компьютер. Делаем через двумерный массив, перезаписывая его и проверяя несколько условий. Не могу понять, сколько задается в начале клеток. Ведь если создадутся четыре клетки в виде массива 2*2, то игра прекратиться - бесконечный цикл из-за верного условия для всех клеток. Признаюсь, что в википедии прочитала об этой игре по диагонали только один раз, поэтому возможно, что-то не дочитала... Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 15 марта, 2012 Жалоба Поделиться Опубликовано 15 марта, 2012 (изменено) Иазяв Вы обращаетесь к элементам в цикле, а я выборочно.Нет никакой разницы. Обращение то же самое. Однако как вы яхту назовете, так она и поплывет ;)*Data[0] Так можно обращаться? К элементам двумерного массива нельзя. Смешивать указатели и индексы можно, но Data[0] уже конечный пункт, элемент нашего двумерного массива, его нельзя разыменовывать.Просто я поняла, что двумерный динамический массив - это массив указателей. В любом случае, если мы создаем динамический двумерный массив, он будет называться массивом указателей. Двумерный динамически созданный массив - это НЕ массив указателей. Это массив, созданный в процессе работы программы с помощью функций выделения памяти, для доступа к строкам которого используется также динамически созданный вспомогательный массив указателей.Немного (если удастся :) ) об указателях и индексах. С указателями все просто. Не надо пытаться понять скрытые тайны указателей, которых в них нет. Указатели примитивнейшая вещь, нет в никаких тайн. Их можно объяснить за полминуты. Не надо подражать античным мыслителям и искать тайны, скрытые в числе два или в указателе. Есть ячейки памяти с числами. Адрес ячейки памяти с числом можно поместить в другую переменную. Она будет называться указателем. Все! Нельзя запоминать частные случаи - запутаешься. Больше ничего помнить не надо. У тебя нет проблем с указателями. У тебя проблема с пониманием массивов. Указатели - это просто средство доступа к элементам массивов. Для удобства, чтобы не писать выражения типа *(*(a+i)+j), в С и C++ разрешено пользоваться обычными для математики обозначениями индексов, то есть a[j], что читается, конечно, намного легче. Квадратные скобки в C++ - это на самом деле просто специальное обозначение операции, которая "загоняет под ковер" явную работу с указателями. Если ты используешь индексные обозначения, компилятор автоматически преобразует индексы в нужные указатели "под ковром". Кстати, если p - указатель, а i - целое, то адресная арифметика указателей допускает, естественно, как p+i, так и i+p c тем же результатом. Поэтому аналогично и со скобками - для массива a и i[a] дают одинаковые результаты. Это из серии "купи и удивляй друзей" ;) Фактически левая квадратная скобка осуществляет операцию сложения и разыменования суммы, а правая ограничивает правый операнд. #include<iostream>using namespace std;int main(){int ar[]={6,7,8,9};cout<<ar[2]<<endl;cout<<2[ar]<<endl;cin.get();} Будет дважды напечатано 8. О массивах. Одномерный массив - это просто ряд данных одинакового типа. Двумерный массив - это массив одномерных массивов, таблица. Трехмерный - это массив двухмерных массивов, трехмерная таблица, кубик, в котором слои - двухмерные массивы. Можно и продолжить, я как-то использовал четырехмерные массивы... Есть несколько способов располагать данные массивов в памяти, поэтому в C++ есть несколько типов массивов, точнее, четыре - статические массивы, динамически создаваемые массивы, динамические массивы и VLA (variable length array) Я забыл сейчас, как название этого типа переводится на русский язык, его редко переводят. Статические массивы - это массивы, которые объявляются прямо объявлением массива, например, int a[3][4]; Компилятор отводит в памяти подряд 12 мест для целых переменных. Когда надо обратиться к элементу массива, он прямо вычисляет адрес этого элемента. Указатели на строки и элементы фактически не создаются, но можно обращаться к элементам массива так, будто адрес всего массива и адреса строк указатели. Например, напечатаем cout<<*(*a+5) - это будет элемент a[1][1] (тут *a даст адрес начального элемента начальной строки, его тип будет указателем на целое, добавим к нему 5, чтобы продвинуться по массиву, окажемся на втором по счету элементе второй по счету строки, то есть a[1][1], разыменуем этот адрес, получим значение этого элемента). Вот несколько вариантов обращения к элементам статического двумерного массива разыменованием адреса массива и передачи двумерного статического массива в функцию, работающую с ним как с одномерным. Смысл - с одномерным компьютеру работается быстрее. #include<iostream>using namespace std;void func(int p[]){cout<<p[5]<<endl;}int main(){int ar[3][4];for(int i=0;i<3;i++)for(int j=0;j<4;j++)ar[i][j]=10*i+j;cout<<*(*ar+5)<<endl;cout<<(*ar)[5]<<endl;func(*ar);func(ar[0]);func(&ar[0][0]);func((int*)ar);cin.get();} Это все показываю, чтобы было понятнее - "96 дорог есть, чтоб песнь сложить ты мог, и любая правильна, поверь" :) С построен на том, что программист представляет себе, что кроется за операциями, которые он применяет - в отличие от, например, Паскаля. Впрочем, можно и без всего этого. Кроликов можно вытаскивать и не из шляпы, а из клетки, но вас будут мучить требованиями понимания, как вытащить кролика из шляпы, потому что хороший C++ программист обычно немного фокусник. У меня такое впечатление, что C++ и создавался отчасти для того, чтобы удивить коллег остроумием решений. Динамически создаваемые массивы создаются явным выделением памяти в процессе выполнения программы, при этом операция выделения памяти new выдает адрес выделенной памяти. Чтобы к этой памяти можно было потом обратиться, этот адрес надо присвоить указателю. Двумерный массив тогда организуют созданием массива указателей на одномерные массивы данных, память которым выделяется в цикле. Это то, что ты называешь динамическим массивом, хотя правильное название для этого в программировании - динамически создаваемый массив. Так как память под массив выделяется циклом отдельных запросов на память, строки такого массива могут быть разбросаны по памяти (в статическом массиве весь массив всегда занимает непрерывный кусок памяти). Обращение к элементам таких массивов по индексам совершенно обычное. #include<iostream>#include<iomanip>using namespace std;int main(){int row=3, col=4, **ar=new int*[row];for(int i=0;i<row;i++)ar[i]=new int[col];for(int i=0;i<row;i++)for(int j=0;j<col;j++)ar[i][j]=10*i+j;for(int i=0;i<row;i++){for(int j=0;j<col;j++)cout<<setw(7)<<ar[i][j]; cout<<endl;}cout<<endl;for(int i=0;i<row;i++){for(int j=0;j<col;j++)cout<<setw(7)<<i[ar][j]; cout<<endl;}cout<<endl;for(int i=0;i<row;i++){for(int j=0;j<col;j++)cout<<setw(7)<<j[i[ar]]; cout<<endl;}cout<<endl;for(int i=0;i<row;i++){for(int j=0;j<col;j++)cout<<setw(7)<<*(*(ar+i)+j); cout<<endl;}cout<<endl;for(int i=0;i<row;i++){for(int j=0;j<col;j++)cout<<setw(7)<<(*(ar+i))[j]; cout<<endl;}cout<<endl;for(int i=0;i<row;i++){for(int j=0;j<col;j++)cout<<setw(7)<<j[*(ar+i)]; cout<<endl;}cout<<endl;for(int i=0;i<row;i++){for(int j=0;j<col;j++)cout<<setw(7)<<*(ar[i]+j); cout<<endl;}cout<<endl;cin.get();} Тут я смешал всякие способы доступа - и по индексам, и по указателям, и по их комбинациям. Хотя еще раз - если к цели ведут 96 дорог, выбирай ту, которую знаешь :) Динамический массив - это массив, размеры которого могут меняться в ходе выполнения программы. В C++ такие массивы реализуются классом vector. Механизмы изменения размера массива упрятаны "под ковер". Иногда динамическими массивами называют и динамически создаваемые массивы, хотя, строго говоря, это неправильно. VLA массивы не поддерживаются стандартом (точнее, они есть в последних стандартах С, но в стандарте C++ так и не появились), но многие компиляторы их разрешают. Они очень похожи на статические, но их размеры могут задаваться во время выполнения программы, то есть можно писать int m,n; cin>>m>>n; int a[m][n]; Об игре "Жизнь". Не уловила интерес игрушки. Все делает компьютер. "Жизнь" - это вообще-то не игра, во всяком случае для двоих. Это колония клеточных автоматов различных конфигураций. Эти автоматы, то есть группы клеток, эволюционируют. В процессе эволюции клеточный автомат, в зависимости от начальной конфигурации, может исчезнуть, может превратиться в устойчивую стационарную или пульсирующую конфигурацию, а может и превратиться (или с самого начала быть таким) в конфигурацию, перемещающуюся по экрану или периодически отпочковывающую от себя дочерние конфигурации, пускающиеся путешествовать по экрану. Налетая на другие конфигурации, все эти конфигурации могут преобразовываться в другие.Как игра, "Жизнь", собственно, заключается в придумывании исходных конфигураций, дающих чем-то интересные картины эволюции. Чтобы долго не искать, прикладываю первые попавшиеся скринсейверы, показывающие "Жизнь" на случайных исходных конфигурациях. Можно запускать просто двойным кликом на файлах. В скринсейвере Life забыли, похоже, вставить отключение по нажатию клавиши, так что его приходится отключать через диспетчер задач (Ctrl+Alt+Shift), но картинка неплохая, поэтому я его оставил - посмотреть. life.zip life.zip Изменено 15 марта, 2012 пользователем Тролль 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Serty Опубликовано 20 марта, 2012 Жалоба Поделиться Опубликовано 20 марта, 2012 Здравствуйте! Помогите, пожалуйста. Составить программы по блок-схемам 1. Даны две действительные квадратные матрицы порядка n. Получить новую матрицу: а) умножением элементов каждой строки первой матрицы на наибольшее из значений элементов соответствующей строки второй матрицы; б) прибавлением к элементам каждого столбца первой матрицы произведения элементов соответствующих строк второй матрицы. 2. Даны натуральное число n, символы s1,...,sn. Известно, что срeди s1,...,sn есть по крайней мере одна запятая. Найти такое натуральное i, что: а) si-первая по порядку запятая; б) si-последняя по порядку запятая. Заранее благодарен!=)) Если можно с комментариями, пожалуйста... Блок-схемы.doc Блок-схемы.doc Ссылка на комментарий Поделиться на другие сайты Поделиться
Тролль Опубликовано 20 марта, 2012 Жалоба Поделиться Опубликовано 20 марта, 2012 Serty Надо уточнять, на каком языке и в какой среде. Turbo Pascal, скажем, одно, PascalABC.NET - уже несколько другое. Примерно соответствовать блок-схемам на Turbo Pascal будут такие коды (точно не получится, потому что там есть некоторые отклонения от принятой в Паскале нумерации). 1а var a,b,c:array[1..10,1..10]of real; i,j,n:integer; max:real; {объявили переменные}beginwrite('Enter the dimension: '); readln(n);writeln('Matrix A');for i:=1 to n do begin write('Enter the elements of the line ',i,': '); for j:=1 to n do read(a[i,j]) end;readln; writeln; {ввели матрицу А}writeln('Matrix B');for i:=1 to n do begin write('Enter the elements of the line ',i,': '); for j:=1 to n do read(b[i,j]) end;readln; writeln; {ввели матрицу В}for i:=1 to n do begin max:=b[i,1]; for j:=2 to n do if b[i,j]>max then max:=b[i,j]; for j:=1 to n do c[i,j]:=max*a[i,j]; end; {посчитали матрицу С}writeln('Matrix C');for i:=1 to n do begin for j:=1 to n do write(c[i,j]:10:2); writeln end; {вывели матрицу С}readlnend. 1б var a,b,c:array[1..10,1..10]of real; i,j,n:integer; buf:real; {объявили переменные}beginwrite('Enter the dimension: '); readln(n); writeln;writeln('Matrix A');for i:=1 to n do begin write('Enter the elements of the line ',i,': '); for j:=1 to n do read(a[i,j]) end;readln; writeln; {ввели матрицу А}writeln('Matrix B');for i:=1 to n do begin write('Enter the elements of the line ',i,': '); for j:=1 to n do read(b[i,j]) end;readln; writeln; {ввели матрицу B}for i:=1 to n do begin buf:=1; for j:=1 to n do buf:=buf*b[i,j]; for j:=1 to n do c[i,j]:=a[i,j]+buf end; {посчитали матрицу С}writeln('Matrix C');for i:=1 to n do begin for j:=1 to n do write(c[i,j]:10:2); writeln end; {вывели матрицу С}readlnend. 2а var i,n:integer; str:string; {объявили переменные}begin readln(str); n:=length(str); for i:=1 to n do if str[i]=',' then break; writeln(i); readln end. 2б var i,n:integer; str:string; {объявили переменные}begin readln(str); n:=length(str); for i:=n downto 1 do if str[i]=',' then break; writeln(i); readln end. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти