0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 10
1

Передача значений двух переменных в основную функцию

06.03.2013, 23:34. Показов 1682. Ответов 12
Метки нет (Все метки)

Доброго дня!

Господа, поставлена задача: передать в функцию массив, найти минимальное и максимальное значение среди цифр его элеменов.
С этим я справился.
Но как потом оба эти значения использовать в main, чтобы передавать в другие функции? Если быть более точным, то нужно в другой функции дописать эти цифры к элементам массива. Я пробовал объявить эти значения как глобальные переменные, но функция не возвращает их измененными, а показывает их нулевыми (проверял через printf в main).
Помогите, пожалуйста. За плохой код не судите строго - я новичок.
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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
#include<math.h>
#include<time.h>
//здесь еще куча прототипов
void tsif (int *, int);
//void dopis (int *, int);
int min1, max1;
void main()
{
int *mas,*m1,*m2,*m21,*m3,*ob,m,buf;
 
    srand(time(NULL));  
    printf("Vvedite razmer massiva\n");
    scanf("%d",&m); 
    mas=(int*)malloc(m*sizeof(int));
    if(!mas)
{
    printf("Нет места!!!\n");
    exit(1);
}
        m1=(int*)malloc(m*sizeof(int));
    if(!m1)
{
    printf("Нет места!!!\n");
    exit(1);
}
        m2=(int*)malloc(m*sizeof(int));
    if(!m2)
{
    printf("Нет места!!!\n");
    exit(1);
}
        m21=(int*)malloc(m*sizeof(int));
    if(!m21)
{
    printf("Нет места!!!\n");
    exit(1);
}
    
    m3=(int*)malloc(m*sizeof(int));
    if(!m3)
{
    printf("Нет места!!!\n");
    exit(1);
}
    for(int i=0;i<m;i++)
    {
        mas[i]=rand()%1000;
        m1[i]=mas[i];//отсортирован
        m2[i]=mas[i];//заполнен перевертышами
        m3[i]=mas[i];//разница
        printf("mas[%d]=%d\n",i,mas[i]);
    }
sort (m1, m);
sumkol (m1, m);
chet (m1, m);
maxmin (m1, m);
prost (m1, m);
obrmas (m2, m);
for(int i=0;i<m;i++)
m21[i]=m2[i];//резевная копия массива с перевертышами
ubiv (m2, m);
maxmin1 (m2, m);
prost1 (m2, m);
razn (m21, m3, m);
plmin (m21, m);
tsif (m21, m);
    getch();
}
//здесь удалена куча функций, все работают исправно, несмотря на чехарду с массивами. Нужно было просто возвращать массивы в main через указатель, но хорошая мысля...
void tsif (int *arr, int k, int min1, int max1)
{
    //int max1, min1;
    int *min, *max;
    min=(int*)malloc(k*sizeof(int));
    if(!min)
    {
    printf("Нет места!!!\n");
    exit(1);
    }
    max=(int*)malloc(k*sizeof(int));
    if(!max)
    {
    printf("Нет места!!!\n");
    exit(1);
    }
    for(int i=0;i<k;i++)
        {
        min[i]=abs(arr[i]%10);
        max[i]=abs(arr[i]%10);
    while(arr[i])
            {
        if (min[i]>abs(arr[i]%10))
            min[i]=abs(arr[i]%10);
        if (max[i]<abs(arr[i]%10))
            max[i]=abs(arr[i]%10);
            arr[i]/=10;
            }
        }
    min1=min[0];
    max1=max[0];
    for(int i=0;i<k;i++)
        {
        if(max[i]>max1)
            max1=max[i];
        if(min[i]<min1)
            min1=min[i];
        }
    printf("\nMin: %d\n",min1);
    printf("\nMax: %d\n",max1);
}
Добавлено через 7 минут
На одном из форумов прочитал:
Есть такая штука в С++, как передача параметров по ссылке. Этот способ в числе прочих преимуществ, о которых здесь пока говорить не будем, дает и такое: появляется возможность изменения значения переменной, объявленной в программе, внутри некоторой функции. Таким образом, появляется возможность определить у функции СКОЛЬКО УГОДНО много возвращаемых значений. Единственное, что отличает этот способ от обычного возврата значения функцией, что это делается не обычной семантикой типа y=f(x), а подругому.
Но как эту мудрую мысль воплотить в моем коде - не понял.
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2013, 23:34
Ответы с готовыми решениями:

Передача переменных в функцию
У меня в программе компилятор жалуется что не столько указателей я передаю как это исправить...

Передача значений в функцию
Здрасьте! Есть необходимость передать из main(); значение переменной, которое должно будет перейти...

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

Составить функцию сортировки значений трех переменных а, b, с в порядке возрастания
Составить функцию сортировки значений трех переменных а, b, с в порядке возрастания. Использовать...

12
...
1802 / 1267 / 934
Регистрация: 12.02.2013
Сообщений: 2,061
07.03.2013, 05:59 2
Есть такая штука в С++, как передача параметров по ссылке ...
Да, есть, но не в C. Зато есть указатели.

Я пробовал объявить эти значения как глобальные переменные
Использование глобальных переменных не желательна.

Задания я вашего не знаю. Поэтому решил написать небольшую демонстрационную программу. Она просто инициализирует массив заданного размера, забивает его случайными числами и находит максимальный и минимальный элементы. Обратите внимание на функции GetMaxMin и GetMaxMinPair, они и есть ответ на ваш вопрос. Либо вы передаёте функции адрес переменной, в которую и будут заноситься значения, либо получаете от функции результирующую структуру со всем результирующими значениями.

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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
 
typedef struct
{
   int max;
   int min;
}  TMaxMin;
 
//----------------------------------------------//
int* Random(int* array, size_t size, int mod)
{
   size_t i;
   for (i = 0; i < size; ++i)
   {
      array[i] = rand() % mod;
   }
 
   return array;
}
//----------------------------------------------//
void Print(int* array, size_t size)
{
   size_t i;
   for (i = 0; i < size; ++i)
   {
      printf("%d ", array[i]);
   }
   printf("\n");
}
//----------------------------------------------//
int GetMaxMin(int* array, size_t size, int* max, int* min)
{
   *max = -1;
   *min = -1;
 
   size_t i;
   for (i = 0; i < size; ++i)
   {
      if ((*max == -1) || (array[*max] < array[i]))
      {
         *max = i;
      }
 
      if ((*min == -1) || (array[*min] > array[i]))
      {
         *min = i;
      }
   }
 
   return (*max != -1) && (*min != 1);
}
//----------------------------------------------//
TMaxMin GetMaxMinPair(int* array, size_t size)
{
   TMaxMin mm;
   GetMaxMin(array, size, &mm.max, &mm.min);
 
   return mm;
}
//----------------------------------------------//
 
int main()
{
   srand(time(NULL));
 
   printf("input size of array: ");
 
   size_t size;
   scanf("%u", &size);
 
   int* array = (int*) malloc(size * sizeof(int));
 
   Random(array, size, 100);
   Print(array, size);
 
   int min, max;
   GetMaxMin(array, size, &max, &min);
 
   TMaxMin mm = GetMaxMinPair(array, size);
 
   printf("\n");
   printf("max: index = %d, value = %d\n", max+1, array[max]);
   printf("min: index = %d, value = %d\n", min+1, array[min]);
   printf("\n");
   printf("TMaxMin.max: index = %d, value = %d\n", mm.max+1, array[max]);
   printf("TMaxMin.min: index = %d, value = %d\n", mm.min+1, array[min]);
 
 
   free(array);
 
   system("pause");
 
   return 0;
}
Передача значений двух переменных в основную функцию


Бинарник + исходник: program.7z
1
419 / 418 / 167
Регистрация: 28.11.2010
Сообщений: 1,183
07.03.2013, 12:15 3
Или
1. void minmax (int * mas, int siza, int *min, int *max);
Или
2. int min (int *mas, int size)
int max (int *mas, int size)
1
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 10
08.03.2013, 23:20  [ТС] 4
Решил выбрать вариант со ссылками. Но есть проблемы.
Создал прототип:
C
1
int tsif (int *, int, int &, int &);
Далее в main:
C
1
2
int max1, min1; // объявил
tsif (m21, m, &max1, &min1);//m21 - массив, m - размер, далее идут ссылки на переменные.
В самой функции принимаем массив, размер и ссылки:
C
1
int tsif (int *arr, int k, int *max1, int *min1)
Компилятор пишет:
Error 3 error C2664: 'tsif' : cannot convert parameter 3 from 'int *' to 'int &'
И далее (что, скорее всего, связано с проблемой выше):
Error 5 error C2065: 'min' : undeclared identifier
Error 6 error C2065: 'max' : undeclared identifier
0
481 / 473 / 63
Регистрация: 26.01.2011
Сообщений: 2,033
08.03.2013, 23:36 5
Цитата Сообщение от s_grooz Посмотреть сообщение
Решил выбрать вариант со ссылками
и что и как вы будете работать со сылками ?
0
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 10
08.03.2013, 23:59  [ТС] 6
Ну, вот описал выше, в общем-то. Очевидно, где-то ошибаюсь.
0
216 / 63 / 16
Регистрация: 26.02.2012
Сообщений: 114
09.03.2013, 00:17 7
Если так хочется мешать ссылки и указатели, то одно к другому приводится в стиле:
C++
1
2
3
4
5
6
7
8
    int  i  = 0;
    int *pi = &i;
 
    // int* -> int&
    int &ri = *pi;
 
    // int& -> int*
        pi  = &ri;
1
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 10
09.03.2013, 00:24  [ТС] 8
Возможно, я имел в виду указатели на переменные. Прошу прощения.
0
216 / 63 / 16
Регистрация: 26.02.2012
Сообщений: 114
09.03.2013, 00:34 9
Я бы вообще не стал с этим заморачиваться и сделал в стиле (что и Вам предлагаю):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct MinMax
{
    int     iMin;
    int     iMax;
};
 
/*...*/
 
MinMax tsif(int *arr, int k)
{
    MinMax      sRV;
    
    /*...*/
 
    sRV.iMin = ...;
    sRV.iMax = ...;
    
    return sRV;
}
0
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 10
09.03.2013, 01:21  [ТС] 10
1. До main объявил структурную переменную:
C
1
2
3
4
5
struct minmax
{
    int  imin;
    int  imax;
};
2. После этого - прототип:
C
1
minmax tsif (int *, int);
3. В main - вызвал:
C
1
minmax tsif (m21, m);
- здесь указывает ошибку
Error 3 error C2078: too many initializers
4. В функции поиска мин/макс:
C
1
2
3
4
5
6
7
minmax tsif (int *arr, int k)
{
    minmax srv;
...
    srv.imin =min1;
    srv.imax =max1;
    return (srv);
Что не так?
0
216 / 63 / 16
Регистрация: 26.02.2012
Сообщений: 114
09.03.2013, 01:33 11
Цитата Сообщение от s_grooz Посмотреть сообщение
3. В main - вызвал:
Должно быть так:
C++
1
minmax sMM = tsif (m21, m);
Объявляете переменную (структуру в данном случае) и присваиваете ей значение, которое возвращает ф-я.
1
0 / 0 / 0
Регистрация: 20.01.2013
Сообщений: 10
09.03.2013, 02:04  [ТС] 12
Все, огромное спасибо за понимание и терпение.

Добавлено через 7 минут
Только, если можно, еще вопрос общего характера о передаче массивов в функции.
Функция производит манипуляции с массивом и все изменения в этом массиве сохраняются. Для того, чтобы получить доступ к изначальному массиву, я в main делаю его копию и отправляю в функцию ее. Но иногда этих копий приходится делать целую кучу, под каждую динамически выделить память, объявить и т.д.
Мне кажется, есть более элегантный способ, как Вы считаете?
0
216 / 63 / 16
Регистрация: 26.02.2012
Сообщений: 114
09.03.2013, 10:54 13
Либо делать временный массив внутри функции, копировать в него тот, что является входным параметром, а затем работать с этой копией, либо же (что, мне кажется, лучше) переработать сам алгоритм так, чтобы не надо было менять изначальный массив вообще.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.03.2013, 10:54
Помогаю со студенческими работами здесь

Передача значения массива в основную функцию
Программа написана через задницу, но прошу помочь лишь с одной ошибкой: Написать функцию, которая...

Передача значений переменных или ссылок, неконтролируемое изменение переменных
// заголовок класса ObservableCollection&lt;LineDom&gt; Method1; Method1 = new...

Передача значений переменных
Доброго времени суток! Народ допустим у меня есть переменная в JS, как передать это значение в...

Передача значений переменных
Здравствуйте. Модель такая: main.php ... &lt;img src='cap.php'&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru