Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по программированию на C/С++

Автор: Nilivaiko
Дата сообщения: 25.11.2007 21:30
А ты через что реализовываешь матрицу?
Автор: ExtazY_13
Дата сообщения: 25.11.2007 22:43
просто ввожу элементы через for.
А как нужно???????
Автор: ItsJustMe
Дата сообщения: 28.11.2007 22:18
Подозреваю, что хохол спрашивал, как именно матрица представлена в твоей проге?
Собственно, задачка твоя решается весьма несложно: пробегаешь по всем строкам, столбцам и двум большим диагоналям твоей матрицы и складываешь все элементы. Если все суммы равны, то это - магический квадрат. И, если я не ошибаюсь, все элементы матрицы должны удовлетворять условию x >= 0.

хоть оффтоп, но любопытство распирает:
В чем преимущество публикации просьбы о решении задачи в теме "Вопросы по C++" вместо темы "Задачи по C++"? Раскройте мне глаза.
Автор: cornolio
Дата сообщения: 01.12.2007 09:25
возникла такая проблемка: после переезда на vs2008 динамическая библиотека стала компилироваться как-то через одно место.
библиотека используется для перехвата одной функции в хост-приложении. при запуске происходит патч памяти хост приложения с прыжком в функцию длл-ки(грубо говоря lea eax, offset dll_function; jmp eax). Беда в том, что перестал правильно определяться адрес функции в библиотеке и прыжок происходит в мусор.
Из-за чего так может быть? vs2005 все было правильно
Автор: talisman13
Дата сообщения: 01.12.2007 20:45
Есть массив данных (Buffer) равный 1 мб. Данные из массива выводятся в файл двумя способами.

Код: int output_size = 1 048 576;
BYTE *Buffer;
Buffer = new BYTE [output_size];

for(int i = 0; i < output_size; i++){
Buffer[i] = 0;
for(int j = 0; j < 8; j++){
BYTE tmp = rand() % 2;
Buffer[i] ^= tmp << j;
}
}

/*первый способ вывода в файл*/
TFileStream *F = new TFileStream ( "outF1.dat", fmCreate );
F->Write ( ( PVOID ) Buffer, output_size );
delete F;

/*второй способ вывода в файл*/
ofstream lrrout("outF2.dat", ios::out);
lrrout.write(Buffer,output_size);
lrrout.close();
Автор: Abs62
Дата сообщения: 01.12.2007 21:31

Цитата:
ofstream lrrout("outF2.dat", ios::out);

ios::out здесь лишнее, это подразумевается по умолчанию. А вот ios::binary указать следует.
Автор: leahov
Дата сообщения: 03.12.2007 13:34
помогите разобраться численные методы (Builder c++), решение нелинейных уравнений

вот листинг

Код:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include<math.h>

#include "urav.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
float f(float x)
{
// return x*x*x + 3*x - 2;
return x*x*x + x - 5;
}
float fdx(float x)
{// return 3*x*x +3;
return 3*x*x +1;
}
float fd2x(float x)
{
return 4*x;
}
float absolute(float x)
{ return x < 0 ? -x : x;
}
void chordes(float a, float b, float eps, TLabel* lbl3, TLabel* lbl4, TLabel* lbl5)
{
if(f(a)*f(b) < 0)
{
ShowMessage("Хорды: a и b неправильные");
return;
}
float x0 = a;
float xf = b;
if(f(a)*fd2x(a) > 0)
{
x0 = b;
xf = a;
}
int step = 1;
float x1 = x0 - f(x0)*(xf-x0)/(f(xf)-f(x0));
while(absolute(x1-x0) > eps)
{
x0 = x1;
x1 = x0 - f(x0)*(xf-x0)/(f(xf)-f(x0));
step = step + 1;
}
lbl3->Caption = x1;
lbl4->Caption = f(x1);
lbl5->Caption = step;
}
void __fastcall TForm1::sek(float a, float b, float eps)
{
if(f(a)*f(b) < 0)
{
ShowMessage("Секущие : a и b неправильные");
return;
}
float x0 = a;
float x1 = a + eps;
if(f(a)*fd2x(a) < 0)
{
x0 = b;
x1 = b - eps;
}
int step = 1;
float x = x1 - f(x1)*(x1 - x0)/(f(x1) - f(x0));
x0 = x1;
x1 = x;
while(absolute(x1-x0) > eps)
{
x = x1 - f(x1)*(x1 - x0)/(f(x1) - f(x0));
x0 = x1;
x1 = x;
step = step + 1;
}
Label11->Caption = x1;
Label12->Caption = f(x1);
Label13->Caption = step;
}

void __fastcall TForm1::kasat(float a, float b, float eps)
{
if(f(a)*f(b) < 0)
{
ShowMessage("Касательные: a и b неправильные");
return;
}
float x0 = a;
if(f(a)*fd2x(a) < 0)
{
x0 = b;
}
int step = 1;
float x1 = x0 - f(x0)/fdx(x0);
while(absolute(x1-x0) > eps)
{
x0 = x1;
x1 = x0 - f(x0)/fdx(x0);
step = step + 1;
}
Label17->Caption = x1;
Label18->Caption = f(x1);
Label25->Caption = step;
}

void __fastcall TForm1::combi(float a, float b, float eps)
{
if ((abs(f(a)*fd2x(a)) == f(a)*fd2x(a)) &&
(abs(f(b)*fd2x(b)) == f(b)*fd2x(b)))
{
ShowMessage("Данные: a и b неправильные");
return;
}
float x0=a;
float t0=b;

if(f(a)*fd2x(a) > 0)
{
x0 = b;
t0 = a;
}

int step = 1;
float x = x0 - f(x0)*(t0-x0)/(f(t0)-f(x0));
float t = t0 - f(t0)/fdx(t0);
while (absolute(x0-t0) < eps)
{
x0 = (x0+t0)/2;
t0 = f((x0+t0)/2);
step = step + 1;
}
Label28->Caption = x0;
Label30->Caption = t0;
Label32->Caption = step;

}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
float a, b, eps;
// ShowMessage("Vvedite a, b, epsilon: ");
a = StrToFloat(Edit1->Text);
b = StrToFloat(Edit2->Text);
eps = StrToFloat(Edit3->Text);
chordes(a, b, eps, Label3, Label4, Label7);
sek(a, b, eps);
kasat(a, b, eps);
combi(a, b, eps);
}
//---------------------------------------------------------------------------

Автор: Abs62
Дата сообщения: 03.12.2007 19:24
leahov

Цитата:
if ((abs(f(a)*fd2x(a)) == f(a)*fd2x(a)) &&
(abs(f(b)*fd2x(b)) == f(b)*fd2x(b)))

Это соответствует условию

Код: if((f(a)*fd2x(a)>=0) && (f(b)*fd2x(b)>=0)) [/q]
Автор: Necto2004
Дата сообщения: 05.12.2007 23:52
всем, здравствуйте...нужна помощь с прогой... необходимо найти определитель двумерной матриы n*n по формуле [img]http:// [/img]
где:
выражение есть сумма членов,каждый из которых состоит из n сомножителей

количество слагаемых в сумме равно количеству перестановок n номеров,то есть , n!

номера строк и столбцов элементов,,выходящих в одно слагаемое, не повторяются

слагаемые входят в сумму либо с "+" ,либо с "-",в зависимости от чётности перестановки

слагаемое из элементов главной диагоналиматрицы(а11,а22.....аnn) входит с плюсом


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


ЗАРАНЕЕ БЛАГОДАРЮ!!!
Автор: veronica b
Дата сообщения: 08.12.2007 14:25
Necto2004

Цитата:
ЗАРАНЕЕ БЛАГОДАРЮ!!!

А я заранее могу вам сказать, в общем виде, то есть без конкретного и достаточно малого значения N, на языках C/C++ эту задачу не решишь.
Автор: Tanzilit
Дата сообщения: 08.12.2007 19:30
Здравствуйте товарищи программеры
тут такая ситуация
Есть уже написанная прога
Единственно в чем я вас прошу помочь:
1)Протестить прогу(я тестил на досовском с++ 3.1 и чет тупит, хотя в коде ошибок не заметил)
2)необходимо встроить в нее счетчик операций а увы не умею. Помогите плиз.Вам это должно быть не трудно а мне очнеь поможете!
Итак условие задачи:
Дан массив целых, положительных, ограниченных сверху чисел. Определить наиболее часто встречающуюся подряд тройку чисел
Решение:
#include<stdio.h>
#include<mem.h>
#include<stdlib.h>

#define MAX 8 //Ограничивающее число
#define MAXMS 1024 //Размер массива

void main()
{
int i, i1, i2, j, n1, n2, n3;
int ms[MAXMS], //Наш массив
kms[MAX][MAX][MAX]; //Массив под комбинации

//Обнуляем массив
memset( kms, 0, MAX * MAX * MAX * sizeof(int) );

//Заполняем массив случайным образом в указанных пределах
randomize( );
for( i = 0; i < MAXMS; i ++ )
ms[i] = random( MAX );

//Ищем кол-во каждой комбинации
for( i = 0; i < MAXMS; i += 3 ){
if( i + 2 > MAXMS ) break;
kms[ms[i]][ms[i + 1]][ms[i + 2]] ++;
}

//Ищем наиболие встречающуюся комбинацию
for( j = 0, i = 0; i < MAX; i ++ )
for( i1 = 0; i1 < MAX; i1 ++ )
for( i2 = 0; i2 < MAX; i2 ++ )
if( j < kms[i][i1][i2] ){
j = kms[i][i1][i2];
n1 = i;
n2 = i1;
n3 = i2;
}

//Теперь n1 n2 n3 - искомая тройка чисел встречается j раз
printf( "%d %d %d - %d", n1, n2, n3, j );
}

p.s.Еще раз повторюсь - Необходимо начертить таблицу по типу
размерность массива|колл-во операций
ну то бишь как от размерности массива изменяется колл-во операций
для этого надо встроить счетчик операций в прогу
Заранее благодарен!
Автор: AndryuhaT
Дата сообщения: 08.12.2007 21:07
Necto2004
Вот здесь посмотри - http://alglib.sources.ru/matrixops/general/det.php
Автор: Nastena cheese
Дата сообщения: 09.12.2007 14:10
Помогите пожалуйста составить программку в с++. Срочно нужно!!!
Значит дана прямоугольная целочисленная матрица А[N,M] нужно определить номера строк:
a)    все элементы 0
b)    все элементы одинаковы
c)    все четны
d)    элементы каждой из строк образуют монотонную последовательность возрастающую и убывающую
Автор: AndryuhaT
Дата сообщения: 09.12.2007 16:08
Nastena cheese
Ответил здесь.
Автор: Kidiam
Дата сообщения: 10.12.2007 15:26
Помогите кодом на С++ (или Delphi язык особо роли не играет) написать прокси-сервер на подобие ESproxy или др. прокси для http.
Дано соединение к Интернету (например модем или выделенная линия) на одном компьютере.
Необходима программная реализация задачи:
в Интернет может получить доступ и другой компьютер из локальной сети, а именно мог выполнять http запрос в броузере (указывая первый компьютер как прокси-сервер) и соответственно получать запрошенные данные.
Помогите кодом или примером кода.
Автор: Tanzilit
Дата сообщения: 10.12.2007 17:22
хмм в общем чет не пашет прога
но вот есть иной вариант проги(мне помогли сделать по новой)

Код: #include<stdio.h>
#include<stdlib.h>
#include<conio.h>

#define MAX 2
#define MAXMS 20

void main()
{
int i, i1, j, count, prevcount = 0,counter = 0;
int ms[MAXMS],
triplet[6];

randomize();
for(i=0;i<MAXMS;i++)
ms[i] = random(MAX);

for(i=0;i<MAXMS-2;i++)
{
for(i1=0;i1<3;i1++)
triplet[i1] = ms[i+i1];
count = 1;
for(j=i+1;j<MAXMS-2;j++)
if((triplet[0] == ms[j]) && (triplet[1] == ms[j+1]) && (triplet[2] == ms[j+2]))
count++;
if (count > prevcount)
{
prevcount = count;
for(i1=3;i1<6;i1++)
triplet[i1] = triplet[i1-3];
}
}

for( i = 0; i < MAXMS; i++ )
printf(" %d ", ms[i]);

printf( "\n\nThe triplet: %d %d %d\nCount %d",triplet[3],triplet[4],triplet[5],prevcount);
getch();
}
Автор: veronica b
Дата сообщения: 10.12.2007 18:52
AndryuhaT

Цитата:
Вот здесь посмотри

А вы внимательно читали условия задачи? А предлагаете совсем другой способ

Цитата:
LU-разложение имеет много различных применений, одним из которых является вычисление определителей.

К условию задачи не подходит.
Автор: AndryuhaT
Дата сообщения: 10.12.2007 19:00
veronica b
Да, я читал условие задачи. Что нам надо найти? Определитель квадратной матрицы. Читаем дальше на той же странице

Цитата:
Подпрограмма Determinant используется для вычисления определителя матрицы, LU-разложение которой ещё не проводилось. На входе вы задаете матрицу A, на выходе получаете определитель. Все операции, связанные с LU-разложением, спрятаны внутри подпрограммы и вызываются самостоятельно.

Не вижу никаких проблем..
Добавлено
Я не спорю, если имелось ввиду находить точно по формуле, то способ LU-разложения, конечно, не подходит.
Автор: Necto2004
Дата сообщения: 11.12.2007 03:12
AndryuhaT.. большое спасибо..но у мя новый вопрос ...

[code][/code]
#include<iostream>
#include<math.h>
#include<conio.h>

using namespace std;

struct Matrix{
int order; //matrix' order
double **pM; //the pointer to the array of pointers to 'order' arrays of doubl
};

void AllocMem(Matrix *M, int order){

M->order=order;
M->pM=new double* [order];
M->pM[0]=new double [order*order];

for(int i=1;i<order;i++)
M->pM[i]=M->pM[i-1]+order;

}

void FreeMem(Matrix *M){

delete[] M->pM[0];
delete[] M->pM;
}

void EnterM(Matrix* M){

int i=0,j=0;

for(i=0;i<M->order;i++)
for(j=0;j<M->order;j++){
cout<<"Enter ("<<i+1<<", "<<j+1<<") element of the matrix: ";
cin>>M->pM[i][j];
}

}

void GetMinor(Matrix* M, Matrix* minor, int row, int column){

AllocMem(minor,M->order-1);

int p=0,q;

for(int i=0;i<M->order;i++)
if(i!=row){
q=0;
for(int j=0;j<M->order;j++)
if(j!=column){
minor->pM[p][q]=M->pM[i][j];
q++;
}
p++;
}
}

double Det(Matrix* M){

double result=0.0;

Matrix minor;

if (M->order==1)
return M->pM[0][0];

for(int i=0;i<M->order;i++){
GetMinor(M, &minor, 0, i);
result+=pow(double(-1),i)*M->pM[0][i]*Det(&minor);
FreeMem(&minor);
}

return result;
}

void ShowMat(Matrix* M){

cout<<"\nThe matrix is \n";
for(int i=0;i<M->order;i++){
for(int j=0;j<M->order;j++)
cout<<M->pM[i][j]<<'\t';
cout<<endl;
}
}


void main(){

int MOrder;
cout<<"Enter the matrix' order: ";
cin>>MOrder;

Matrix M;

AllocMem(&M,MOrder); //allocate memory
EnterM(&M); //enter the matrix from the console
ShowMat(&M); //show the matrix

cout<<"The determinant is "<<Det(&M)<<endl;

cout<<"press any key";
while(!kbhit());
}



какие ограничения присутствуют в этом коде на размерность матрицы(допустим могу ли я посчитать матрицу 100 на 100 или 10 на 10 )т.е какие матрицы может считать эта программа и что такое 'order' ???
Автор: KChernov
Дата сообщения: 11.12.2007 15:48
Разбираюсь сейчас с кодом, в котором активно используются макросы и шаблоны и попал в ситуацию, из которой пока не вижу выхода
Есть такое объявление экземпляра класса:

Код: PreconditionerILU0<MT_SP<VSTFORMAT<VPRECISION> > > M( aa );
Автор: Abs62
Дата сообщения: 11.12.2007 18:02
KChernov

Цитата:
Почему исходное работает, а мое нет?

Надо полагать потому, что SomeClass M(aa) писать можно (это обычное объявление нового экземпляра класса), а SomeClass M=new SomeClass M(aa) - нельзя, ибо new возвращает указатель на класс. Можно писать SomeClass *M=new SomeClass M(aa) и дальше работать с M как с указателем.
Автор: Rpining
Дата сообщения: 11.12.2007 18:13
Помогите пожалуйста решить задачу!!!
Спроэктировать класс Men в качестве константы задоно день рождение человека, в качестве задачи посчитать прожитые дни. В качестве входного потока дата.
Автор: lakerdes
Дата сообщения: 11.12.2007 18:45
Ситуация:
Пишу shell под Slackware linux. Надо реализовать запуск процесса в фоновом режиме. Никак не могу понять как это сделать, если есть идеи - поделитесь. Заранее спасибо.
Автор: MFPSoftware
Дата сообщения: 11.12.2007 20:44
Подскажите, как решить.

Написал фунцию:

Код: int RandN(int a,int b)
{
    return (int) (a+(b-a)*rand()/double(RAND_MAX));
}
Автор: xdude
Дата сообщения: 11.12.2007 21:29
lakerdes
Хм... Пишешь свой shell, типа bash/sh? Или пишешь shell-скрипт под них? Если второе - то причём тут С++. А если первое - то зачем изобретать велосипед?
Вообще, чтоб процесс в демона превратить (запустить в бэкграунде), надо позакрывать его стандартные дескрипторы ввода/вывода (stdin/stdout/stderr), а потом открыть их по новой и перенаправить в /dev/null или в файл какой-нибудь (хотя, это вроде бы не обязательно). Я уже точно не помню, но когда-то я что-то подобное делал, и последовательность действий была приблизительнго такой:

Код:
...
pid_t pid=vfork();
if (pid==0)
{
close(0);
close(1);
close(2);
if (-1==execve(argv[1],&argv[1],NULL))
{
fprintf(stderr,"Error spawning process\n");
return -3;
};
};
...
Автор: lakerdes
Дата сообщения: 12.12.2007 09:47
xdude
Пишу свой на с++. Задание такое дали.
Вобщем, спасибо за ответ, но вопрос пока всё ещё открыт.
Автор: KChernov
Дата сообщения: 12.12.2007 10:18
Abs62

Цитата:
Надо полагать потому, что SomeClass M(aa) писать можно (это обычное объявление нового экземпляра класса), а SomeClass M=new SomeClass M(aa) - нельзя, ибо new возвращает указатель на класс. Можно писать SomeClass *M=new SomeClass M(aa) и дальше работать с M как с указателем.

Большое спасибо - теперь все заработало!
Совсем забыл про это с той кучей языков, которыми пользуюсь

Оффтопик:
А почему есть целых 2 темы: Вопросы по программированию на С++ и Задачи по С++ - которые на самом деле почти одинаковые: и там, и там и задачи рассматриваются, и на вопросы отвечают???
Почему бы их тогда не объединить?
Ну или, как в других темах бывает сделано, прикрепить первый пост и дать в нем ссылку на соседнюю тему - типа все вопросы туда и наоборот?
Автор: MFPSoftware
Дата сообщения: 12.12.2007 11:28
xdude
Вызываю функцию:

Код: srand ((unsigned) time(NULL));
cout << RandN(1, 10) << endl;
Автор: Rudia
Дата сообщения: 12.12.2007 14:50
MFPSoftware
time возвращает количество секунд, соответсвенно при вызове программы через секунду, rand() вернет число где-то на 10 больше, т.е. при вашей функции генерации числа от 1 до 10 начальное значение изменится только если вы вызовете вашу программу минут через 6 после предыдущего вызова.


Добавлено:
Рекомендую сделать так:

Цитата:
srand ((unsigned) time(NULL));
rand();
cout << RandN(1, 10) << endl;

Ибо у 2-го числа разброс значений будет уже большой.
Автор: KChernov
Дата сообщения: 12.12.2007 15:12
Как сделать, чтобы вывод в один поток приводил к выводу в несколько?
Конкретно нужно, чтобы все
Код: cout << ...;

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193

Предыдущая тема: не знаю как назвать тему :-)


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.