Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Попробуйте написать функцию сортировки массива вставками для целочисленных массивов

Попробуйте написать функцию сортировки массива вставками для целочисленных массивов. А затем перегрузить эту же функцию для массивов типа*double.
Ответ: Попробовал, не получилось.
В С нет перегрузки функций (внезапно).
Вопрос: Не ожидаемый результат после функции обрабатывающей массив

Привет.
Объясните как получается так, что функция printf() выдаёт отсортированный результат после вызова функции selection_sort_min(массив, размер). Я никак не могу понять этот результат, так как на сколько я знаю, в конце функции selection_sort_min() результат обработки стирается из памяти. Но тут, printf() выводит правильный результат. Как по мне, так он должен был вывести неотсортированный результат: 1, 5, 2, 4, 3.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <stdio.h>
#include <stdlib.h>
 
void swap(int *first, int *second);
void selection_sort_min(int array[], int size);
 
void swap(int *first, int *second)
{
    int tmp = *first;
    *first = *second;
    *second = tmp;
}
 
void selection_sort_min(int array[], int size)
{
    int i, j, min;
    for(i=0; i<size; i++)
    {
        min = i;
        for(j=i+1; j<size; j++)
        {
            if(array[j] < array[min])
                min = j;
        }
        swap(&array[i], &array[min]);
    }
}
 
 
int main(int argc, char *argv[])
{
    int array[5] = {1, 5, 2, 4, 3};
    selection_sort_min(array, 5);
 
    int i;
    for(i=0; i<5; i++)
        printf("%d ", array[i]);
    printf("\n");
}
Ответ: В Си просто не предусмотрено представление массива иначе чем через указатель. Когда вы его заворачиваете в структуру, вы именно это представление и создаете, после чего компилятор ведет себя с ним так же как с любым другим типом.
C
1
2
3
4
char x; //объект типа char - копируется sizeof(char) = 1 байт
char *x; //указатель на char - копируется sizeof(void*) = 4 байта
char x[10]; //указатель на char - копируется sizeof(void*) = 4 байта
struct SomeStr x; //объект типа SomeStr - копируется sizeof(SomeStr) байт
Вопрос: Функция возвращающая массив и построение графика

Вообще проблема как в заданной функции вернуть массив ... возвращает только одно значение.

И как по указанным параметрам функции, и полученным выходным значениям, которые еще надо вывести, построить график.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
 
Function Pract4(rg As Range)
 
 
Dim x() As Single
Dim p() As Single
Dim n As Single
 
n = rg.Columns.Count
 
 
ReDim x(1 To n)
ReDim p(1 To n)
 
For i = 1 To n
 
x(i) = Cells(1, i).Value
p(i) = (Sqr(x(i) + 2) / (x(i) * x(i) - 4))
 
Next
 
Pract4 = p
 
   'Charts.Add
    'ActiveChart.ChartType = xlLine
    'ActiveChart.SetSourceData Source:=Range(p), PlotBy:=xlColumns
 
    ' ActiveChart.Location WHERE:=xlLocationAsObject, Name:="Ëèñò1"
    'With ActiveChart
       'ActiveChart.HasTitle = True
       'ActiveChart.ChartTitle.Characters.Text = "ГѓГ°Г*ГґГЁГЄ äèГ*Г*ìèêè"
       'ActiveChart.Axes(xlCategory, xlPrimary).HasTitle = True
      ' ActiveChart.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = "t"
     '  ActiveChart.Axes(xlValue, xlPrimary).HasTitle = True
    '   ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Y(t)"
   'End With
   
   
End Function
Ответ: Указано именно с функцией работать? Вариант: вызвать функцию из Sub не подходит?
Вопрос: Функция: найти массив с максимальной суммой элементов и вывести эту сумму

Дано k массивов типа float. Организовать функцию, находящую массив с максимальной суммой элементов и вывести эту сумму.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <stdio.h>
#include <locale.h>
#include<conio.h>
#include <stdlib.h>
float fun(int k, ...)
{   int i; float sum, summax=0;
    float *p=&k;
    while (k--)
    {  p++; i=0; sum=0;
        while(*(p+i))
        {
            sum=sum+*(p+i);
            i++;
        }
        if (sum>summax)
        summax=sum;
        
    }
 
    return summax;
    
    
}
int main()
{
    int k=3, i ; float *ms1, *ms2, *ms3;
    ms1 = (float*) malloc(3*sizeof(float));
  if(!ms1)
    {
    
        printf("error");
        getch();
        return 0;
    }
    ms2 = (float*) malloc(3*sizeof(float));
  if(!ms2)
    {
        free(ms1);
        printf("error");
        getch();
        return 0;
    }
    ms3 = (float*) malloc(5*sizeof(float));
  if(!ms3)
    {
        free(ms1);
        free(ms2);
        printf("error");
        getch();
        return 0;
    }
 
for (i=0; i<3; i++)
{
    scanf("%f", (ms1+i));
}
for (i=0; i<3; i++)
{
    scanf("%f", (ms2+i));
}
for (i=0; i<5; i++)
{
    scanf("%f", (ms3+i));
}
 
    printf ("%f", fun(k, ms1, ms2, ms3));
    return 0;
}
Ответ: дело в том что в универе учили доступу к функции с переменным числом параметров так же через указатель(код писал по примеру), но действительно с va_list/va_start/va_arg все работает
Вопрос: Передача в функцию многомерного массива

Как передать в функцию многомерный массив при условии что он уже заранее известен и проинициализирован?
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    double A[][3] = 
    {
        {2.1,   3,    2},
        {  1,   0,  1.3},
        {  5,   0,  7.4}
    };
    double B[][4] = 
    {
        { 15,   7.1,      1,      0},
        { -4,   -10,    2.3,      1},
        {  2,     0,     -5,    1.7},
        {0.4,   1.5,      1,      3}
    };
    double C[][3] = 
    {
        {6,     3.1,    4.7},
        {-3,      7,      0},
        { 1,    5.2,     -8}
    };
Ответ:
Сообщение от Байт
"Фи, лейтенант! Рыбу - ножом?" (старинный анекдот)

Не по теме:

Это на самый крайняк..



Добавлено через 5 минут
Сообщение от Xadjee
Можно на конкретном примере, как мне 3 объявленных матрицы передать в функцию?
Обьявляем так :
C
1
double scalarProduct (double *matrix, int n)
как уже было замечено, вызываем так:
C
1
scalarProduct (*matrix, n)
в функции работаем через разыменование указателей.
Вопрос: Сортировка массива вставками с конца массива

Дано натуральное число N (1<=N<=100), целочисленный линейный массив a0, a1, …, aN-1. Эле-менты массива заполняются случайными целыми числами из диапазона [0, N]. Требуется отсортировать массив. Метод сортировки сортировка вставками «с конца массива. После сортировки произвести поиск в массиве введенного значения с помощью последовательного поиска с начала массива.
Ответ:
Вопрос: Инкрементирование элементов массива-счётчика

Здравствуйте.

К примеру, есть массив:
C++
1
2
3
4
5
6
7
8
const int stablePay = 200;                 // dollars
    const double rate = 0.09;                  // 9 %
 
    const int totalPaySize = 20;
    double totalPay[totalPaySize];
 
    for(int i = 0; i < totalPaySize; i++)
        totalPay[i] = round((25 + rand() % 10000) * rate + stablePay);
Забит случайными значениями (длина числа может быть любой).

Нужно создать массив-счётчик, который выведет диаграмму чисел в опр. диапазоне. Что-то типа:

200$ - 299$ = 4
300$ - 399$ = 7
400$ - 499$ = 8
500$ - 599$ = 1

Если бы я знал длину чисел элементов первого массива, было бы проще, а что делать в этом случае? Конечно, можно через if-ы сделать, но как-то громоздко, как мне кажется. Есть другие варианты?
Ответ: Там в классе баг был, не учитывался сдвиг. Теперь нормально, заодно переделал пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <random>
 
using namespace std;
 
class Ranger {
    std::vector<unsigned long> counts;
    double offset;
    double width;
    int count;
public:
    Ranger( double offset, double width, int count ) {
        this->offset = offset;
        this->width = width;
        this->count = count;
        for( int i = 0; i < count + 1; i++ ) {
            counts.push_back( 0 );
        }
    }
    vector<unsigned long>& getData() {
        return counts;
    }
    Ranger& operator<<( double value ) {
        int pos = int((value - offset) / this->width);
        if( pos > counts.size() - 1 ) {
            ++counts[counts.size() - 1];
        } else {
            ++counts[pos];
        }
        return *this;
    }
    void debugPrint() {
        for( int i = 0; i < counts.size(); i++ ) {
            double left = offset + width * i;
            double right = left + width;
            if(i+1 == counts.size()) {
                cout << left << "-inf" << ": " << counts[i] << endl;
            } else {
                cout << left << "-" << right << ": " << counts[i] << endl;
            }
        }
    }
};
 
int main() {
 
    Ranger table( 200.0, 100.0, 4 );
    
    table << 250 << 299 << 301 << 800 << 700 << 267 << 645 << 222 << 450;
 
    table.debugPrint();
 
    return 0;
 
}
Вопрос: Сортировка методом простых вставок четных элементов массива.

Нужно написать программу сортировки методом простых вставок четных элементов массива.
Ответ: Спасибо огромное
Вопрос: Написать функцию, сжимающую массив, удалив из него элементы в заданном интервале

Такой вот код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include<stdio.h>
#include<math.h>
#include<locale.h>
#define N 10
#define MIN "Номер минимального  элемента равен: "
#define AL printf("[%d]=",i)
#define SUM "Сумма модулей элементов массива после\
 1-ого отрицательного равна: "
#define SORTARR "Отсортированный массив"
 
// Создание функции, которая ищет номер мин. по модулю элемента
int searchMIN(float *array)
{
int number,i,j;
float min;
for(i=0,min=array[i],j=1,number=i;i<N&&j<N;i++,j++)
if(min>array[j])
{
min=(array[j]);
number=j;
}
return(number);
}
 
//создание функции подсчитывающую сумму модулей элементов после первого отрицательного элемента
int sum_after(float *array){
int i,ok=0;
float sum=0.0;
for(i=0;i<N;i++){
   if(array[i]<0 && !(ok))
    {
    ok=1;
    continue;
   }
    if(ok) sum+=fabs(array[i]);}
return(sum);
}
//функция сжатия массива в пределах заданной величины в пределах от b до a
void arraymsort(float *array, float b, float a, int size)
{
    int i,j;
for(i=0;i<size;i++)
{
  if(array[i]<=a && array[i]>=b) {
        for(j=i+1;j<size;j++)
            {
            array[i]=array[j];
            i++;
            if(i==(size-1)) array[i]=0;
            }}}
        for(i=0;i<size;i++)
            printf("[%d]=%2.0f\t",i,*(array+i));
}
 
 
int main(int argc, char* argv[])
{
    setlocale(LC_ALL,".1251");
float array[N], sum;
int i;
for(i=0;i<N;i++)
    {
AL;
scanf("%f",array+i);
}
printf("%s",MIN);
//переменная для определения номера минимального элемента массива
int h=searchMIN(array);
printf("%d\n",h);
//сумма модулей элементов массива после первого отрицательного элемента
printf("%s",SUM);
sum=sum_after(array);
printf("%2.2f\n",sum);
// сжатие массива в пределах заданной величины, освободившиеся в конце массива элементы заполнить нулями
printf("%s\n",SORTARR);
arraymsort(array,5,10,N);
return 0;
}
Проблема в том, что функция реагирует только на первое появление такой величины, на остальные она не реагирует.:с

Добавлено через 44 минуты
Всё, получилось.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include<stdio.h>
#include<math.h>
#include<locale.h>
#define N 10
#define MIN "Номер минимального  элемента равен: "
#define AL printf("[%d]=",i)
#define SUM "Сумма модулей элементов массива после\
до 1-ого отрицательного равна: "
#define SORTARR "Отсортированный массив"
 
// Создание функции, которая щет номер мин. по модулю элемента
int searchMIN(float *array)
{
int number,i,j;
float min;
for(i=0,min=array[i],j=1,number=i;i<N&&j<N;i++,j++)
if(min>array[j])
{
min=(array[j]);
number=j;
}
return(number);
}
 
//создание функции подсчитывающую сумму модулей элементов после первого отрицательного элемента
int sum_after(float *array){
int i,ok=0;
float sum=0.0;
for(i=0;i<N;i++){
   if(array[i]<0 && !(ok))
    {
    ok=1;
    continue;
   }
    if(ok) sum+=fabs(array[i]);}
return(sum);
}
//функция сжатия массива в пределах заданной величины в пределах от b до a
void arraymsort(float *array, float b, float a, int size)
{
    int i,j,k;
for(i=0;i<size;i++)
{
  if(array[i]<=a && array[i]>=b) {
            k=i;
        for(j=i+1;j<size;j++)
            {
            array[i]=array[j];
            i++;
            if(i==(size-1)) array[i]=0;
            }i=k-1;}}
        for(i=0;i<size;i++)
            printf("[%d]=%2.0f\t",i,*(array+i));
}
 
 
int main(int argc, char* argv[])
{
    setlocale(LC_ALL,".1251");
float array[N], sum;
int i;
for(i=0;i<N;i++)
    {
AL;
scanf("%f",array+i);
}
printf("%s",MIN);
//переменная для определения номера минимального элемента массива
int h=searchMIN(array);
printf("%d\n",h);
//сумма модулей элементов массива после первого отрицательного элемента
printf("%s",SUM);
sum=sum_after(array);
printf("%2.2f\n",sum);
// сжатие массива в пределах заданной величины, освободившиеся в конце массива элементы заполнить нулями
printf("%s\n",SORTARR);
arraymsort(array,5,10,N);
return 0;
}
Ответ:
Сообщение от Michail97
Комментариями я всё пояснил.
- это надо не комментариями пояснять, а писать в заголовке темы
Вопрос: Как в VBA сделать так, чтобы функция возвращала массив?

Задача: пусть есть числа a, b. Причем a < b. Создать массив, включающий числа из диапазона [a; b].
Ответ:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Function функция(a, b)
ReDim m(a To b)
For i = a To b
  m(i) = i
Next
функция = m
End Function
 
Sub main()
MsgBox Join(функция(7, 15)), , "чтобы функция возвращала массив?"
End Sub