Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 483
∙ повысить рейтинг »
D-mon55
Статус: 2-й класс
Рейтинг: 75
∙ повысить рейтинг »
Асмик Гаряка
Статус: Советник
Рейтинг: 68
∙ повысить рейтинг »

∙ С / С++

Номер выпуска:1862
Дата выхода:17.05.2016, 14:21
Администратор рассылки:Андрей Кузнецов aka Dr_Andrew (Старший модератор)
Подписчиков / экспертов:19 / 14
Вопросов / ответов:5 / 5

Консультация # 189340: Здравствуйте! Прошу помощи в следующем вопросе: Задание: Напишите универсальную функцию для нахождения среднего гео- метрического отрицательных элементов матриц с произвольным числом строк и столбцов. Напишите программу-тест с промежуточной конструкцией, позволяющей передавать в фун...
Консультация # 189341: Здравствуйте! Уважаемые эксперты, помогите, пожалуйста! Нужно написать функцию SortIndex(A, N), формирующую для вещественного массива A размера N массив указателей на элементы массива A в том порядке, который соответствует возрастанию элементов массива A (сам массив A при этом не изменяется). Массив указателей является выходным параметром. С ...
Консультация # 189342: Уважаемые эксперты! Пожалуйста, помогите! Возникли трудности касательно решения задачи: Даны строки S, S1 и S2. Заменить в строке S все вхождения строки S1 на строку S2. Заранее спасибо за помощь. ...
Консультация # 189344: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Задание: Написать функцию, которая меняет местами значения двух переменных x и y. #include "stdafx.h" #include <iostream> #include <conio.h> #include <windows.h> using namespace std; int change(int...
Консультация # 189345: Здравствуйте! Прошу помощи в следующем вопросе: Задание: Для решения различных задач используются методы Монте-Карло, предполагающие применение массивов случайных чисел с большим количеством элементов. Размер массива становится известным во время выполнения про- граммы, т.е. ма...

Консультация # 189340:

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

Программа:
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <cstdio>
#include <cmath>

using namespace std;

double meang(double **a, int n, int m)
{
double p = 1.;
int c = 0;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
if (a[i][j] < 0) p *= a[i][j], ++c;
if (p < 0) p = -pow(fabs(p), 1. / c);
else p = pow(p, 1. / c);
return p;
}

int main()
{
srand(time(0));
int n = 2, m = 3;
double **a = new double *[n];
double x[2][3] = { -1, -2, 3, -4, 5, 6 };
for (int i = 0; i < n; ++i)
a[i] = new double[m];
for (int i = 0; i < n; ++i) a[i] = x[i];
cout << meang(a, n, m) << endl;
system("pause");
return 0;
}

можете объяснить, что мы делаем в этой ф-ции: meang и для чего нам **a, что это значит?

Дата отправки: 11.05.2016, 14:08
Вопрос задал: Посетитель - 399158 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Посетитель - 399158!
В функции meang мы сначала ищем произведение всех отрицательных элементов, одновременно считаем их количество
затем находим корень степени, равной количеству элементов. Что и является средним геометрическим.
При этом заменяем корень нечетной степени из отрицательного числа на корень из модуля числа, результат умножаем на -1.

**a - это адрес нашей матрицы, представленный, как адрес адреса, адрес массива элементов (строк), каждым элементом которого являются адреса массивов (столбцов).
Другими словами, наша матрица представлена как одномерный массив строк, каждым элементом которого являются адреса одномерных массивов столбцов.

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 14.05.2016, 10:38
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 189341:

Здравствуйте! Уважаемые эксперты, помогите, пожалуйста!
Нужно написать функцию SortIndex(A, N), формирующую для вещественного массива A размера N массив указателей на элементы массива A в том порядке, который соответствует возрастанию элементов массива A (сам массив A при этом не изменяется). Массив указателей является выходным параметром. С помощью этой функции создать массивы указателей для массивов A, B, C размера NA, NB, NC соответственно.
Проблема возникла в следующем: функция, которая была мною написана, ничего не меняет и не выполняет поставленной задачи. Вот мой код:

Дата отправки: 11.05.2016, 14:35
Вопрос задал: user8351 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, user8351!
Посмотрите, как я сделал.
Комментарии не писал. Мне кажется, что Вы и сами разберетесь...
Впрочем, если будут вопросы - милости просим в мини-форум...

/*
	Нужно написать функцию SortIndex(A, N), 
	формирующую для вещественного массива A размера N 
	массив указателей на элементы массива A в том порядке, 
	который соответствует возрастанию элементов массива A 
	(сам массив A при этом не изменяется). 
	Массив указателей является выходным параметром. 
	С помощью этой функции создать массивы указателей 
	для массивов A, B, C размера NA, NB, NC соответственно.
*/
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
///SortIndex(float A,int N);

int* SortIndex(double *A,int N)
{
    int* cpy = new int[N];
    int i, j;
	double temp;

    for (i=0;i<N;i++)
		cpy[i] = i;
    for (i=0;i<N-1;i++)
		for (j=i;j<N;j++)
		{
			if (A[cpy[i]] > A[cpy[j]])
			{
				temp = cpy[i];
				cpy[i]] = cpy[j];
				cpy[j] = temp;
			}
		}
   return cpy;
}

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
	
	int i,NA, NB, NC;
    
	printf ("Введите  NA: ");
    scanf ("%d",&NA);
    
	double* A = new double[NA];

    printf("Массив A:\n");
    for (i=0;i<NA;i++)
    {
        printf ("A[%d]=",i);
        scanf ("%lg",&A[i]);
    }
    for (i=0;i<NA;i++)
    {
        printf ("A[%d]=%.2f ",i,A[i]);
    }

	printf ("\nВведите  NB: ");
    scanf ("%d",&NB);
    
	double* B = new double[NB];

    printf("Массив B:\n");
    for (i=0;i<NB;i++)
    {
        printf ("B[%d]=",i);
        scanf ("%lg",&B[i]);
    }
    for (i=0;i<NB;i++)
    {
        printf ("B[%d]=%.2f ",i,B[i]);
    }

	printf ("\nВведите  NC: ");
    scanf ("%d",&NC);
    
	double* C = new double[NC];

    printf("Массив C:\n");
    for (i=0;i<NC;i++)
    {
        printf ("C[%d]=",i);
        scanf ("%lg",&C[i]);
    }
    for (i=0;i<NC;i++)
    {
        printf ("C[%d]=%.2f ",i,C[i]);
    }
    
	int *iA = SortIndex(A,NA);
    int *iB = SortIndex(B,NB);
    int *iC = SortIndex(C,NC);

    printf("\n\nОтсортированные массивы:\nA:");
    for (i=0;i<NA;i++)
        printf ("%.2f ",A[iA[i]]);
	printf("\nB:");
    for (i=0;i<NB;i++)
        printf ("%.2f ",B[iB[i]]);
	printf("\nC:");
    for (i=0;i<NC;i++)
        printf ("%.2f ",C[iC[i]]);
	printf("\n");

	delete [] A;
	delete [] B;
	delete [] C;
	delete [] iA;
	delete [] iB;
	delete [] iC;
	
	system("pause");
    return 0;
}

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 14.05.2016, 13:02
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 189342:

Уважаемые эксперты! Пожалуйста, помогите! Возникли трудности касательно решения задачи:
Даны строки S, S1 и S2. Заменить в строке S все вхождения строки S1 на строку S2.
Заранее спасибо за помощь.

Дата отправки: 11.05.2016, 15:14
Вопрос задал: user8351 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, user8351!
Решение без встроенных строковых функций:

#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
void main()
{
   SetConsoleCP(1251);
   SetConsoleOutputCP(1251);
   char s1[256], s2[256], s[256];
   int i, j, iStart;
   int s_len, s1_len, s2_len;

   printf("Введите строку s: ");
   gets(s);
   printf("Введите строку s1: ");
   gets(s1);
   printf("Введите строку s2: ");
   gets(s2);
   
   s_len = strlen(s);
   s1_len = strlen(s1);
   s2_len = strlen(s2);

   for(iStart=0; iStart<=s_len-s1_len; iStart++)	//ищем, пока есть возможность для подстроки s1
   {
		for(i=iStart,j=0; j<s1_len; i++,j++)	//ищем подстроку s1 в s, начиная с s[iStart]
		{
			if (s[i]!=s1[j])
				break;							//если есть хоть одно несовпадение, то выходим
		}
		if (j == s1_len)						//дошли до конца подстроки s1 - она найдена!
		{
			j = s2_len-s1_len;					//разность длин строк s1 и s2
			if (j > 0)							//если вставляемая строка больше найденной
			{
				for(i=s_len+j; i>iStart+j; i--)	//то освобождаем место для j символов перезаписью оставшейся части строки s в конец
					s[i] = s[i-j];
				s_len += j;						//корректируем и длину строки s
			}
			else if (j < 0)						//если вставляемая строка меньше найденной
			{
				for(i=iStart+s1_len+j; i<s_len; i++)//то копируем хвост строки на |j| символов к началу
					s[i] = s[i-j];
				s_len += j;						//корректируем и длину строки s (j<0 !!)
			}
												//если строки равны по длине, то дополнительные действия не требуются
			for(i=0; i<s2_len; i++,iStart++)	//осталось скопировать строку s2 в нужное место
				s[iStart] = s2[i];				//  одновременно корректируется и индекс iStart, с которого продолжится поиск вхождения строк
		}
   }
   printf("Полученная строка: %s\n", s);
   _getch();
}

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 11.05.2016, 19:05

5
нет комментария
-----
Дата оценки: 12.05.2016, 04:47

Рейтинг ответа:

НЕ одобряю +1 одобряю!

Консультация # 189344:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Задание:
Написать функцию, которая меняет местами значения двух
переменных x и y.

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <windows.h>



using namespace std;

int change(int &x, int &y)// получение адреса
{
x = x + y;
y = x - y;
x = x - y;

return x, y;
}

int main()
{
setlocale(LC_ALL, "Russian");
int x, y;
cout << "Введите X: " << endl;
cin >> x;
cout << "Введите Y: " << endl;
cin >> y;
cout << "До обмена X: " << x << endl;
cout << "До обмена Y: " << y << endl;
change(x, y);
cout << "После обмена X: " << x << " После обмена Y: " << y << endl;
system ("pause");
}



как сделать это через УКАЗАТЕЛИ?

Дата отправки: 11.05.2016, 16:56
Вопрос задал: Посетитель - 399158 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Посетитель - 399158!
Реализация через указатели:

void change(int *x, int *y)
{
*x = *x + *y;
*y = *x - *y;
*x = *x - *y;
}

Вызов:
change(&x, &y);


Обратите внимание, в исходной подпрограмме ошибка. Надо:
void change(int &x, int &y)// получение адреса
{
x = x + y;
y = x - y;
x = x - y;
}

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 14.05.2016, 10:44
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 189345:

Здравствуйте! Прошу помощи в следующем вопросе:

Задание:
Для решения различных задач используются методы Монте-Карло,
предполагающие применение массивов случайных чисел с большим количеством
элементов. Размер массива становится известным во время выполнения про-
граммы, т.е. массив должен создаваться динамически. Создайте две функции для
решения одной и той же задачи: динамическое создание и заполнение случайными
числами массива указанного размера. Первая функция должна использовать
возвращаемое значение для передачи пользователю сгенерированного массива, а
вторая должна передавать массив через один из своих аргументов. Стандартная
библиотека Си содержит функции int rand() и void srand(unsigned) для генерации
псевдослучайных чисел (прототипы в файле stdlib.h).


#include "stdafx.h"
#include <iostre am>
#include <iomanip>
#include <ctime>

using namespace std;

int *mas_ret(int n)
{
int *mas = new int[n];
srand(time(NULL));
for (int i = 0; i < n; i++)
{
mas[i] = rand() % 100;
}
return mas;
}

void mas_var(int **mas, int n)
{
*mas = new int[n];
srand(time(NULL));
for (int i = 0; i < n; i++)
{
*(*mas + i) = rand() % 100;
}
}


void printArray(int *mas, int n)
{
cout << endl;
for (int i = 0; i < n; i++)
{
cout << setw(4) << *mas++;
}
cout << endl;
}


int main()
{
setlocale(LC_ALL, "Rus");

int *mas1 = NULL;
int *mas2 = NULL;
int n;

cout << "Введите размер массива" << endl;
cin >> n;
if (n > 0)
{
mas1 = mas_ret(n);//Первая функция должна использовать возвращаемое значение для передачи пользователю сгене рированного массива
mas_var(&mas2, n);//Вторая должна передавать массив через один из своих аргументов
printArray(mas1, n);
printArray(mas2, n);
delete[] mas1;
delete[] mas2;
}
else
{
cout << "Размер массива не может быть отрицательным!" << endl;
}

system("pause");
return 0;
}



Почему у нас тут:
void mas_var(int **mas, int n) две звездочки?

Дата отправки: 11.05.2016, 18:09
Вопрос задал: Посетитель - 399158 (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Лысков Игорь Витальевич (Старший модератор):

Здравствуйте, Посетитель - 399158!
Потому что нам надо изменить переменную, в которой должен находиться адрес массива.
Для этого надо передать адрес этой переменной. Фактически адрес адреса массива целых.
Поэтому и пишутся две звездочки.

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 14.05.2016, 10:48
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное