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

Помогите с C++


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

daff9000:

C++ по сути - метаязык, "язык языков". Сам он довольно примитивен, его операции и операторы ближе к тому, что делает машина, чем у других языков высокого уровня. Операции и встроенные типы данных тоже весьма примитивны. Поэтому он очень эффективен. Но почти все его элементы - типы данных, квадратные и круглые скобки, операции =, +, -, *, new и так далее - переопределяемые (точнее, доопределяемые) средствами самого языка. Язык рассчитан на то, на его основе программисты будут строить собственные языки гораздо более высокого уровня.

Ты можешь ввести в нем, например, собственный класс целых чисел, которые пишутся "задом наперед" и для которых операция + означает "умножить", а - - взять факториал. Конечно, такой класс целых чисел никому не понадобится, это просто как пример степени гибкости языка. Но можно придумать и объекты с описаниями во много тысяч строк "космическая станция" и "космический корабль" и определить для них операцию + как стыковку. Это опять же в качестве примера.

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

P.S. Более конкретно, надо определить в классе нашего массива операции =, +, * так, чтобы можно было в программе писать выражения типа c=2*a+b*5, где a, b, c - массивы (фактически объекты класса, описывающего наш вид массива и возможные операции для объектов этого класса).

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

  • Ответов 169
  • Создана
  • Последний ответ

Топ авторов темы

Топ авторов темы

Изображения в теме

Да. Иначе пришлось бы использовать, например, моделирование двумерного массива одномерным с соответствующим пересчетом индексов.

P.S. Собственно, а зачем ее транспонировать? "Как вы яхту назовете, так она и поплывет". Если мы будем обращаться к столбцам вместо строк и наоборот, это то же, что обращаться к транспонированной матрице. Например, если в моем примере заменить тело функции fun на такое

for (int j=0; j<m; j++) {for (int i=0; i<n; i++){cout.width(7); cout<<b[j];} cout<<endl;}

то функция fun будет выводить не прямую, а транспонированную матрицу.

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

Да. Иначе пришлось бы использовать, например, моделирование двумерного массива одномерным с соответствующим пересчетом индексов.

P.S. Собственно, а зачем ее транспонировать? "Как вы яхту назовете, так она и поплывет". Если мы будем обращаться к столбцам вместо строк и наоборот, это то же, что обращаться к транспонированной матрице. Например, если в моем примере заменить тело функции fun на такое

for (int j=0; j<m; j++) {for (int i=0; i<n; i++){cout.width(7); cout<<b[j];} cout<<endl;}

то функция fun будет выводить не прямую, а транспонированную матрицу.

Задание такое:

Написать программу, выполняющую в матрице размерностью н*м перестановку строк и столбцов. Написать функции:

1. заполнение двумер. массива случ. числами

2. вывод массива на экран

3. перестановка строк и столбцов

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

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

Условие сформулировано нечетко. Под перестановкой строк и столбцов чаще понимается не транспонирование, а перестановка порядка следования тех или других. Такие операции часто применяются, например, при решении системы уравнений в матричной форме. Но в данном случае, мне кажется, имелось в виду именно транспонирование.

Вывод на печать в транспонированном виде я бы не рассматривал как истинное транспонирование. Транспонирование матрицы n*m даст матрицу другой размерности - m*n. Поэтому я бы создал новый массив (что нам стоит дом построить? Нарисуем, будем жить :) ), а не пытался переопределить границы старого. Вообще исходные данные всегда лучше сохранять в неприкосновенности.

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

  • 2 недели спустя...

Здравствуйте Тролль =) Поздаровался я потому, что на мой вопрос, ответите как всегда Вы :)

Помогите пожалуйста уточникть следующую ситуацию: Мы знаем, что Объекты не имеют прямого доступа к закрытым данным класса.

Если же я хочу перегрузить оператор сложения (для матриц), то мне нужно в качестве единственного параметра передать ссылку на массив, который будет прибавляться к первому. Тогда при реализации перегрузки оператора, я задаю условие (которое проверяет равенство размерностей матриц), и к размерности второго массива обращаюсь так: Mas.n, Mas.m (где Mas - ссылка на матрицу)... Если не совсем понятно, то код ниже.


Matrix Matrix::operator+ (Matrix &Mas)

{

if (n==Mas.n && m==Mas.m)

{

Matrix Sum;

for (int i=0; i<n; i++)

{

for(int j=0; j<m; j++)

{

Sum.pMatrix[j] = pMatrix[j] + Mat.pMatrix[j];

}

}

return Sum;

}

else

{

cout << "Error!";

retern *this;

}

}

[/cpde]

Но разве, Mas.n - это не прямое ображения к закрытому члену n ? Или здесь подводные камни заключается в том, что к n обращается

функция, перегружающая операцию сложения ?

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

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

на мой вопрос, ответите как всегда Вы :)
C++ не инкапсулирован в класс троллей :) . Кто поспел, тот и съел ответил.
Ссылка на комментарий
Поделиться на другие сайты

Всем доброго времени суток! :no: Надеюсь на вашу помощь, так как в программировании не особо силен, а если точнее, то не силен вообще. :g: Необходимо решить пару задачек по С++, но я никак не могу въехать, как это осуществить. :g: Начало и конец проги, это понятно как сделать, функцию тоже, но вот как считать уравнения и ряд с "n" я не могу осилить. Собственно текст задания:

1. Составьте программу вычисления значения суммы sum.jpg и функции fun.jpg в диапазоне от 0 до 1 с шагом h=0.2. Вычисление суммы ряда Тейлора производите с погрешностью, не превышающей 0.000001. Заданная точность обеспечивается суммированием членов ряда вплоть до слагаемого, абсолютное значение которого меньше 0.000001. Вывести на экран значение суммы и номер (N) последнего слагаемого. При вычислении значения очередного члена ряда используйте значение предыдущего члена.

2. Напишите программу для вычисления у по формуле: for.jpg

Натуральное значение n введите с клавиатуры. Обеспечьте возможность, не завершая программу, вычислить y для нескольких значений n и выведите на экран значения промежуточных результатов при n равном 3, 5 и 10. Обеспечьте необходимую точность вычислений и точность представления результатов.

Заранее спасибо :g:

post-28203-1223312126_thumb.jpg

post-28203-1223312132_thumb.jpg

post-28203-1223312154_thumb.jpg

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

Platinum-msk:

Первая задача:

#include <iostream>#include <math.h>using namespace std;main(){int n; float x,s,t,y;for(x=0;x<1.1;x+=0.2){s=t=x*x*x;  for(n=1; fabs(t)>=1e-6; n++){t=-t*x*x*(2*n-1)/(2*n+1); s+=t;}y=x*x*atan(x);cout<<"x="<<x<<"   s="<<s<<"  n="<<n<<"  y="<<y<<endl;}getchar(); }

Вторая задача, кроме вывода промежуточных результатов при n=3,5,10:

#include <iostream>#include <math.h>using namespace std;main(){int i,n; float y;do{cout<<"n= "; cin>>n; y=0; for(i=n; i>=0; i--)y=sqrt(2*i+1+y); cout<<"y="<<y<<endl;}while(n);cout<<endl; getchar(); }

Тут выполнение заканчивается при вводе n, равного 0.

Насчета вывода промежуточных результатов при n=3, 5, 10 я не понял, это отдельная дополнительная задача или их надо выводить, когда введено такое n, поэтому проигнорировал. В любом случае просто внутрь цикла добавляется вывод y, если n равно 3, 5 или 10.

P.S. Убрал двоеточие в самом начале первой программы (попало туда от слов "первая задача:" )

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

  • 2 недели спустя...

Опять надеюсь на помощь Троля...

Необходимо организовать ввод-чтение матриц из файла и в файл (та задача которую я с сентября тут тру :doh: )

Для этого нужно сначала перегрузить операторы вводы-вывода... Читаю Либерти, но пока не могу понять систему вввода-вывода С++... Что там должно быть в получаемых параметрах, в возвращаемых и т.д. Короче, болото у меня с этим ((( Что там в этой иерархии классов iostream ?

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

насколько я понял, нужно сделать считку и запись при помощи iostream..

считка:

CString str_er("Ошибка при открытии файла!");std::ifstream infile(filename);if(!infile){	MessageBox(0,str_er,(LPCTSTR)"Ошибка!!!",0);	exit(1);}	infile>>Row;	infile>>Col;	Matr = new int* [Row]; 	for(int i=0; i<Row;i++){  Matr[i] = new int[Col];}		while(infile){	for(int i(0);i<Row;i++)	{		for(int j(0);j<Col;j++)		{			infile>>Matr[i][j];		}	}		}	infile.close();	

запись:

std::ofstream myFile(nameFile, std::ios_base::out);	for(int i=0;i<Col;i++){							for(int j=0;j<Col;j++)	{			   myFile<<Matr[i][j]<<" ";	}					myFile<<"\n";}	myFile.close();	

все это работает на VS2005

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

В книге встретил слежующее описание:

"Как объект cin возвращает значение

Возвращаемым значением объекта cin является ссылка на объект istream. "

Как может объект возвращать значение, когда это не функция ?

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

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

Не слишком удачное выражение, но допустимое. В стиле "Белый Дом возвратил на повторное рассмотрение..."

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

  • 3 недели спустя...

Не могу понять назначение такой штуки как stream.

Вот скажем есть перегрузка оператора ввода из файла, а какую роль играет stream понять не могу :)

ifstream & operator >>(ifstream & stream, Cmatrix & obj){//obj.~Cmatrix();int m1,n1;stream>>n1>>m1;obj.n=n1;obj.m=m1;obj.mat = new int* [obj.n];for (int i=0;i<obj.n;i++) 	obj.mat[i]=new int[obj.m];	for (i=0; i<obj.n; i++)for (int j=0; j<obj.m; j++)	stream>>obj.mat[i][j];return stream;}
Ссылка на комментарий
Поделиться на другие сайты

stream - имя ссылки на поток, то есть, в более простых словах, имя автоматически разыменовываемого при использовании указателя на "умный" буфер вводимых-выводимых данных типа ifstream.

P.S. В целом это работает так: оператор >> должен заполнить матрицу вводимыми из буфера файла элементами записанной в файле матрицы и выдать снова буфер содержания файла уже без этих данных. Значки использования ссылок служат для того, чтобы эта работа велась бы непосредственно над данными, а не над их копиями. А stream просто имя формального параметра (ссылки на экземпляр класса буфера, называемый в C++ потоком) в функции, реализующей операцию >>.

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

Подскажыте пожалуйста, можно ли в BCPP из одной exe'шки вызывать експортные функции другой exe'шки?

И как проще ето зделать?

С DLL'ками, кажится разобрался (там достаточно к проекту добавить нужный *.lib)... а вот, как заставить линкер понимать функции експортировиные с exe'шки?

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

  • 1 месяц спустя...

Доброго времени суток!

На странице 3 был приведен пример запуска процесса через функцию system();

Как я понял, это функция интерпретирует командную строку...

Существует несколько функций, для запуска процессов (ShallExecute(); WinExec(); LoadModule() и, наверное, прочие), но все они, по сути, уже устарели, используются для совместимости и работают через CreatProcess(), плюсы которой и в том, что она не только запускает процесс, но и позволяет им управлять... Соответственно вопрос:

Как запустить колькулятор через CreateProcess(); :blink:

Пробовал, не получилось, не могу разобраться с параметрами сей функции, их там куча. Помогите примером plz.

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

xekcem:

#include "windows.h"#include "iostream.h"main(){STARTUPINFO cif;ZeroMemory(&cif,sizeof(STARTUPINFO)); PROCESS_INFORMATION pi;if(CreateProcess("c:\\windows\\system32\\calc.exe",0,0,0,FALSE,0,0,0,&cif,π)==TRUE) {Sleep(3000); TerminateProcess(pi.hProcess,NO_ERROR);}}

Запускает калькулятор и через 3 с закрывает его. Проверял на DEv-C++.

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

xekcem:

#include "windows.h"#include "iostream.h"main(){STARTUPINFO cif;ZeroMemory(&cif,sizeof(STARTUPINFO)); PROCESS_INFORMATION pi;if(CreateProcess("c:\\windows\\system32\\calc.exe",0,0,0,FALSE,0,0,0,&cif,π)==TRUE) {Sleep(3000); TerminateProcess(pi.hProcess,NO_ERROR);}}

Запускает калькулятор и через 3 с закрывает его. Проверял на DEv-C++.

Спасибо Тролль! Работает... Но я не совсем понял реализацию... Не мог бы подробней по строкам объяснить, еще раз спасибо...

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

xekcem:

Нули в CreateProcess соответствуют использованию значений параметров по умолчанию, мы эти параметры не используем (FALSE тоже ноль, только по-другому обозначенный, вместо него можно было написать тоже 0, как и в соседних параметрах) и разбираться с ними нет никакой нужды. Первый параметр в вызове CreateProcess - путь к вызываемой программе - тоже ясен. Последние два параметра в вызове - адреса двух служебных структур, первая для задания размера окна и связанных с ним вещей, если в ней нули, все берется по умолчанию. Вторая структура заполняется самой Windows данными о том, что же она все-таки создала, нам она не особенно нужна, но чтобы Windows была довольна, ей нужно дать адрес такой структуры. Первую структуру мы создаем и обнуляем двумя первыми операторами функции main, вторую структуру - третьим, четвертый оператор - сам вызов CreateProcess внутри if и, если все в порядке, принудительное завершение созданного процесса через 3000 мс, для чего используется идентификатор этого процесса, взятый из второй структуры (все же пригодилась :blushing:).

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

опять нуждаюсь в помощи! скажи мне где у меня ошибка почему моя программа не работает !

задание: в однородном массиве, состоящем из n элементов вычислить:

1.Минимальный по модулю элемент массива.

2.Сумму модулей элементов массива,расположенных после первого элемента, равного нулю.

3.Преобразовать масив таким образом , чтобы в первой половине его распологались элементы, стоящие в четных позициях, а во второй половине-элементы стоящие в нечетных позициях.

программа:

#include<stdio.h>

#include<math.h>

#include<conio.h>

#include<stdlib.h>

#include<time.h>

#include<iomanip.h>

void main()

{ clrscr();

int n, i, j;

printf("\n vvedite kol-vo ele-tov macciva\n,n=");

scanf("%d",&n);

int *A=new int [n];

randomize();

for(i=0;i<n;i++)

A=random(99)-50;

FILE*rez;

rez =fopen("F:\\lab4.txt","w");

printf("\n isxodni macciv A\[%d\]:\n",n);

for(i=0;i<n;i++)

{printf("%4d",A);

fprintf(rez,"%4d",A);}

int min=0,imin=0;

for(i=0;i<n;i++)

if(min<abs(A));

{min=abs(A);

imin=i+1;}

printf("\n\n min modul elementa A\[%d\]=%d\n",imin,min);

fprintf(rez,"\n\n min modul elementa A\[%d\]=%d\n",imin,min);

for(i=0;i<n;i++)

if(A==0) {j=i;break;}

int sum=0;

for(i=j+1;i<n;i++)

sum=sum+abs(A);

printf("\n sum mod ele-ta=%d\n",sum);

fprintf(rez,"\n sum mod ele-ta=%d\n",sum);

int*B=new int[n]; int nach=0,kon=n-1;

for(i=0;i<n;i++)

if(i%2) {B[kon]=A;kon--;}

{B[nach]=A;nach++;}

{printf("%4d",B);

fprintf(rez,"%4d",B);}

getch();}

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

Глупышка:

скажи мне где у меня ошибка почему моя программа не работает !
Разберем по косточкам - комментарии мои:

#include<stdio.h>

#include<math.h>

#include<conio.h>

#include<stdlib.h>

#include<time.h>

#include<iomanip.h> //не нужен

void main()

{ clrscr();

int n, i, j;

printf("\n vvedite kol-vo ele-tov macciva\n,n="); // запятая после перевода строки явно не на месте

scanf("%d",&n);

int *A=new int [n];

randomize(); // это из Паскаля, в C++ не работает; надо srand(time(NULL));

for(i=0;i<n;i++)

A=random(99)-50; // это опять из Паскаля; надо A=rand()%100-50;

FILE*rez; rez =fopen("F:\\lab4.txt","w"); // зачем файл? в задании ничего о файлах не было; и компьютер с диском F, на который предписано записывать файл, еще поискать надо; у меня нормальные диски только C и D, поэтому лучше диск вообще не указывать или указать C, он-то всегда есть

printf("\n isxodni macciv A\[%d\]:\n",n); // не знаю, как у тебя на Borland, а у меня \ перед квадратными скобками будут только мешать; впрочем, это зависит от компилятора

for(i=0;i<n;i++){printf("%4d",A); fprintf(rez,"%4d",A);}

int min=0,imin=0; // надо min=abs(A[0]), и притом отдельным оператором: чтобы найти минимум, надо сначала задать его значение достаточно большим или равным первому элементу, а потом уменьшать каждый раз, как встретится меньшее значение, а от нуля ехать вниз по модулю уже некуда, min так и останется нулем в любом случае

for(i=0;i<n;i++) if(min<abs(A)); // ошибка: не должно быть ";", иначе на этом оператор if и закончится

{min=abs(A); imin=i+1;} // это найдет максимальный элемент, а не минимальный; запоминаем почему-то индекс следующего элемента, это, видимо, для вывода его порядкового номера, я бы там и выводил imin+1, а то путает - пойди потом вспомни, что для элемента min в imin хранится индекс следующего элемента

printf("\n\n min modul elementa A\[%d\]=%d\n",imin,min);

fprintf(rez,"\n\n min modul elementa A\[%d\]=%d\n",imin,min);

for(i=0;i<n;i++) if(A==0) {j=i;break;} // в j должен быть индекс первого нулевого элемента; а если нулевого элемента в массиве не встретилось? тогда в j будет неизвестно что, а ведь мы его потом используем; я бы присвоил j перед циклом значение n, тогда, если нулевого элемента в массиве нет, дальнейший цикл не выполнится ни разу

int sum=0;

for(i=j+1;i<n;i++)sum=sum+abs(A);

printf("\n sum mod ele-ta=%d\n",sum);

fprintf(rez,"\n sum mod ele-ta=%d\n",sum);

int*B=new int[n]; int nach=0,kon=n-1;

for(i=0;i<n;i++)

if(i%2) {B[kon]=A;kon--;} // это проще было записать как if(i%2) B[kon--]=A;

{B[nach]=A;nach++;} // else перед открывающей фигурной скобкой забыто; также можно было записать вместо двух операторов один B[nach++]=A;

{printf("%4d",B); //оператор цикла перед открывающей фигурной скобкой забыт

fprintf(rez,"%4d",B);}

getch();}

Если не будет получаться, могу просто откорректировать программу, это быстрее, чем отмечать ошибки

Интересно, где ты учишься? Начинать изучение программирования с С++ - примерно то же, что начинать обучение вождению с горной дороги. Это язык для профессионалов, если сравнивать с русским, то он ближе к стенографии.

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

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

Здравствуйте, ;) , помогите, пожалуйста! нужно написать две программки в среде Visual C++, у меня экзамен в январе, а ещё 7 программ нужно написать, чтобы быть допущенным :)

1. Создать класс координат (double). Определить унарный оператор ++ как

дружественную функцию.Определить бинарный оператор +, как функцию-член. Сложить

координаты с друг другом и с числом. Присвоить координаты(=).

2. Создать класс типа очередь, которая хранит вещественные числа. Перегрузить

оператор ++ как функцию член и -- как дружественную функцию. ++ добавляет элемент в

очередь, -- вытаскивает элемент из очереди. Перегрузить бинарный оператор + как

функцию-член и * как дружественную функцию. + складывает элемент в очереди с

числом, * умножает элемент в очереди на число

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

xekcem:

#include "windows.h"#include "iostream.h"main(){STARTUPINFO cif;ZeroMemory(&cif,sizeof(STARTUPINFO)); PROCESS_INFORMATION pi;if(CreateProcess("c:\\windows\\system32\\calc.exe",0,0,0,FALSE,0,0,0,&cif,π)==TRUE) {Sleep(3000); TerminateProcess(pi.hProcess,NO_ERROR);}}

Запускает калькулятор и через 3 с закрывает его. Проверял на DEv-C++.

Я так понял, что если два процессы запущены, то обмениваться данными между творцом и творением можно только через функцию int main(...) творения (и то только после завершения его работы)???

Или все же есть возможность обмениваться данными через произвольную функцию творения?

Заранее благодарен за ответ :blush2:

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

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

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

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

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

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

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

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

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

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

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



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