Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2011, 15:09   #1
novak3
Пользователь
 
Регистрация: 05.05.2011
Сообщений: 33
По умолчанию Две функции

Подскажите, пожалуйста, как исправить ошибку.
Сам листинг изначально составлен был правильно- проверено.
1. Пользователь задает размеры матрицы (массив b[n][m])
2. Затем пользователь задает значения всех ячеек матрицы (массива b[n][m])
3. После введения команды пользователем (вводит 0) выдаются результаты средне арифметической суммы значений каждого столбца.
Но по заданию нужно, чтобы расчеты средне арифметического производились в подпрограмме, т.е. в другой функции (podproga()) которая должна вызываться в основную программу. Я это сделал, все переменные объявил глобальными, но массив b[n][m] не могу объявить глобальным, т.к. его размеры задаются в основной функции. Подскажите как быть.

Вот листинг, но в 28 строке sum +=b[j][i]; компилятор указывает на ошибку.

Код:
#include <stdio.h>
#include <stdlib.h>
int m,n,o,i, j;
float sum;
int main()
{
extern int m,n,o,i, j;
extern float sum;
printf("Vvod kol-va strok n=");
scanf("%d",&n);
printf("Vvod kol-va stolbov m=");
scanf("%d",&m);
float b[n][m];
for (i = 0; i < m; i++)
{printf("Vvod stolba N %d\n",i+1);
for (j = 0; j < n; j++)
scanf ("%f", &b[j][i]);}
 
printf("Vvod komandy\n");
scanf ("%d",&o);
if (o==0)
podproga();}
 
podproga()
{printf("Resultat:\n");
 for (i = 0; i < m; i++)
{for (j = 0,sum=0.0; j < n; j++)
 sum +=b[j][i];
printf ("%f\n", sum/n);}
}
novak3 вне форума Ответить с цитированием
Старый 06.05.2011, 15:38   #2
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Передача аргументов в функцию? Не, не слышал (с)

Зачем объявлять все переменные глобальными?
Передавай в функцию указатель на массив и номер столбца -- этого будет достаточно. Тебе же все объяснили в соседней теме.
И функция должна возвращать среднее арифметическое (или что там тебе надо).
И, кстати, так, как ты объявляешь массив -- так делать нельзя. Так можно объявлять только статические массивы, то есть те, размерность которых известна на момент компиляции. У тебя же размерность вводит пользователь. Используй силу, Люк ...*зачеркнуто*... динамические массивы.
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 06.05.2011, 16:34   #3
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Лови.
Код:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>                                               // Для "засева" функции srand()


/**  Объявление функции mean()
 * 
 * @param Array -- указатель на массив
 * @param column -- текущий столбец
 * @param rows -- количество строк в массиве
 * @return  среднее арифметическое
 */
float mean (int **Array, int column, int rows);


int main()
{
    
    int columns, rows;
    int **Array;
    printf("Введите количество строк:");
    scanf("%d", &rows);
    printf("Введите количество столбцов:");
    scanf("%d", &columns);
    
    // Выделяем память для массива
    Array = (int**)calloc(rows * sizeof(int), sizeof(int));
    for (int i = 0; i < columns; i++)
        Array[i] = (int*)calloc(columns * sizeof(int), sizeof(int));

    srand(time(NULL));                                          // "Засеваем" генератор псевдослучайных чисел
    
    // Заполняем массив...
    for (int i = 0; i < rows; i++)
        for (int j = 0; j < columns; j++)
            
    // ... числами от 0 до 99
            Array[i][j] = rand() % 99;              

    
    // Выводим массив на экран
    for (int i = 0; i < rows; i++)
    {
        for (int j = 0; j < columns; j++)
            printf("%d\t", Array[i][j]);
        printf("\n");
    }

    
    // Вот тут в цикле по столбцам вызывается функция, высчитывающая среднее арифметическое
    printf("\n");
    for (int i = 0; i < columns; i++)
        printf("%f\t", mean(Array, i, rows));
    
    // Память надо освободить
    for (int i = 0; i < columns; i++)
        free(Array[i]);
    free(Array);
    printf("\n");
}


// Описание функции mean()

float mean(int **Array, int column, int rows) 
{
    int summa = 0;
    for (int i = 0; i < rows; i++)
        summa += Array[i][column];
    return ((float)summa/(float)rows);
}
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062

Последний раз редактировалось Mandrivnyk; 06.05.2011 в 17:10.
Mandrivnyk вне форума Ответить с цитированием
Старый 06.05.2011, 16:49   #4
novak3
Пользователь
 
Регистрация: 05.05.2011
Сообщений: 33
По умолчанию

Здорово. Спасибо.
novak3 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Мини бэйсик:объявление функции, вызов функции , возврат. AL_LORD Помощь студентам 2 14.10.2010 17:48
Программа на СИ++, используя функции работы с файлами и функции <string.h> Аня Popova Фриланс 9 13.09.2010 15:52
Функции. Передача массива в качестве параметра функции. Wia Помощь студентам 2 17.03.2009 14:57
Сравнить две функции Sergey2 Помощь студентам 6 28.10.2008 22:11
помогите пожалуйста описать две функции номак Паскаль, Turbo Pascal, PascalABC.NET 5 08.01.2008 21:31