Консультация # 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: Здравствуйте! Прошу помощи в следующем вопросе: Задание: Для решения различных задач используются методы Монте-Карло, предполагающие применение массивов
случайных чисел с большим количеством элементов. Размер массива становится известным во время выполнения про- граммы, т.е. ма...
Здравствуйте! Прошу помощи в следующем вопросе: Задание: Напишите универсальную функцию для нахождения среднего гео- метрического отрицательных элементов матриц с произвольным числом строк и столбцов. Напишите программу-тест с промежуточной конструкцией, позволяющей передавать в функцию двумерные массивы.
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, что это значит?
Здравствуйте, Посетитель - 399158! В функции meang мы сначала ищем произведение всех отрицательных элементов, одновременно считаем их количество затем находим корень степени, равной количеству элементов. Что и является средним геометрическим. При этом заменяем корень нечетной степени из отрицательного числа на корень из модуля числа, результат умножаем на -1.
**a - это адрес нашей матрицы, представленный, как адрес адреса, адрес массива элементов (строк), каждым элементом которого
являются адреса массивов (столбцов). Другими словами, наша матрица представлена как одномерный массив строк, каждым элементом которого являются адреса одномерных массивов столбцов.
Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 14.05.2016, 10:38
Здравствуйте! Уважаемые эксперты, помогите, пожалуйста! Нужно написать функцию SortIndex(A, N), формирующую для вещественного массива A размера N массив указателей на элементы массива A в том порядке, который соответствует возрастанию элементов массива A (сам массив A при этом не изменяется). Массив указателей является выходным параметром. С помощью этой функции создать массивы указателей для массивов A, B, C размера NA, NB, NC соответственно. Проблема возникла в следующем: функция, которая
была мною написана, ничего не меняет и не выполняет поставленной задачи. Вот мой код:
Здравствуйте, 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
Уважаемые эксперты! Пожалуйста, помогите! Возникли трудности касательно решения задачи: Даны строки S, S1 и S2. Заменить в строке S все вхождения строки S1 на строку S2. Заранее спасибо за помощь.
#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
Задание: Для решения различных задач используются методы Монте-Карло, предполагающие применение массивов случайных чисел с большим количеством элементов. Размер массива становится известным во время выполнения про- граммы, т.е. массив должен создаваться динамически. Создайте две функции для решения одной и той же задачи: динамическое создание и заполнение случайными
числами массива указанного размера. Первая функция должна использовать возвращаемое значение для передачи пользователю сгенерированного массива, а вторая должна передавать массив через один из своих аргументов. Стандартная библиотека Си содержит функции int rand() и void srand(unsigned) для генерации псевдослучайных чисел (прототипы в файле stdlib.h).
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) две звездочки?
Здравствуйте, Посетитель - 399158! Потому что нам надо изменить переменную, в которой должен находиться адрес массива. Для этого надо передать адрес этой переменной. Фактически адрес адреса массива целых. Поэтому и пишутся две звездочки.
Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 14.05.2016, 10:48
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались.
Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора -
для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение.
Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал,
который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом.
Заходите - у нас интересно!