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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.01.2010, 23:24   #1
frem-dag
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 23
По умолчанию Функция...

Здравствуйте, уважаемые форумчане. Тут проблема возникла с функцией... Я конечно понимаю, что за задача наверно из разряда элементарных, но всё же, не могу додуматься...
Массив 3x7x2. Функция вывода на экран элемента, если он не выходит за пределы массива.
Здесь на сколько я понимаю, основное в этой функции будет сначало проверка, а потом вывод...
Сначало объявляем функцию, например int output();
Потом в main заполняем массив.
И дальше сама функцию...
Код:
int output()   
{
    cin>>i;
    cin>>j;
    cin>>k;
    if(a[i][j][k])
      return cout<<a[i][j][k];
}
Может не совсем логично я тут делаю... Подскажите пожалуйста!

Последний раз редактировалось frem-dag; 09.01.2010 в 23:28.
frem-dag вне форума Ответить с цитированием
Старый 10.01.2010, 00:20   #2
Darth.Vader
Пользователь
 
Аватар для Darth.Vader
 
Регистрация: 04.12.2009
Сообщений: 63
По умолчанию

Во-первых, если ты делаешь функцию вывода, то зачем в ней делать и ввод? Ну, это идеологическая ошибка
А по поводу проверок:
Если ты делаешь так, как написал, то ты на истинность проверяешь элемент, с индексами i,j, и k. И, даже если ты выйдешь за пределы массива, там может оказаться ненулевой мусор... а вот внутри массива может быть и ноль, который не выведется....
Надо проверять каждый индекс по отдельности.
Код:
int output([какой-то тип] a[], int i, int j, int k)
{
    if(i>=IMAX){return -1;}
    if(j>=JMAX){return -1;}
    if(k>=KMAX){return -1;}
    cout << a[i][j][k];
    return 0;
}
Не тестил, из головы написал
Darth.Vader вне форума Ответить с цитированием
Старый 10.01.2010, 12:00   #3
frem-dag
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 23
По умолчанию

Да, действительно, ввод в функции вывода это глупо, не подумал
Вот только ещё вопрос по поводу возвращаемого значения... Почему в условиях возвращается -1? И разве не нужно заносить Kmax, Imax, Jmax в параметры функции? Или если мы их в main'е объявляем, то в этой функции уже не нужно?
frem-dag вне форума Ответить с цитированием
Старый 10.01.2010, 13:34   #4
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Цитата:
Сообщение от frem-dag Посмотреть сообщение
Да, действительно, ввод в функции вывода это глупо, не подумал
Вот только ещё вопрос по поводу возвращаемого значения... Почему в условиях возвращается -1? И разве не нужно заносить Kmax, Imax, Jmax в параметры функции? Или если мы их в main'е объявляем, то в этой функции уже не нужно?
-1 классически считается ошибочным завершением
Не ну ты конечно можешь окружить блок try - catch и выкидывать исключения, но это уж слишком для простенькой программки
Так что минус один - в самый раз! т.е. по завершению работы функции ты проверяешь - если она вернула -1 , то произошла ошибка, возможно вызов надо повторить с другими параметрами

Kmax, Imax, Jmax - скорее всего подразумевается, что это глобальные константы...
Если ты их объявишь в мейне - функция их не увидит
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 10.01.2010, 14:36   #5
frem-dag
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 23
По умолчанию

Т.е. если я правильно понял, описание этих глобальных переменных потребуется в списке аргументов функции вывода?))

Код:
int output(const int Imax, const int Jmax, const int Kmax, int i, int j, int k)
frem-dag вне форума Ответить с цитированием
Старый 10.01.2010, 15:33   #6
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Т.е. если я правильно понял, описание этих глобальных переменных потребуется в списке аргументов функции вывода?))
Если они глобальные, то их не надо передавать в качестве аргументов, вы и так может получить к ним прямой доступ в любом месте программы.


Что бы переменная была глобальной, ее надо объявить в самом верху программы, до всех функций.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 10.01.2010, 15:40   #7
Lunex.08
Форумчанин
 
Аватар для Lunex.08
 
Регистрация: 25.02.2009
Сообщений: 145
По умолчанию

Цитата:
Сообщение от frem-dag Посмотреть сообщение
Т.е. если я правильно понял, описание этих глобальных переменных потребуется в списке аргументов функции вывода?))

Код:
int output(const int Imax, const int Jmax, const int Kmax, int i, int j, int k)
Нет,глобальные функции объявляются вне какой-либо функции.Но это как я считаю нежелательно использовать,т.к.нарушается пространство имен.Вот пример глобальной функции:
Код:
#include <>
int global; //Глобальная переменная.
int main ()
{
return 0;
}
Эх,припоздал немного))
Компьютеры бесподобны: за несколько минут они могут совершить такую грандиозную ошибку, какую не в состоянии сделать множество людей за многие месяцы.
Lunex.08 вне форума Ответить с цитированием
Старый 10.01.2010, 16:01   #8
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Цитата:
Сообщение от frem-dag Посмотреть сообщение
Т.е. если я правильно понял, описание этих глобальных переменных потребуется в списке аргументов функции вывода?))

Код:
int output(const int Imax, const int Jmax, const int Kmax, int i, int j, int k)
Если ты так сделаешь, их тоже придется вводить, притом каждый раз,
Если не хочешь просто ВНЕ мейна и любой другой функции написать эти константы, т осделай их параметрами по умолчанию

int output(int i, int j, int k, int Imax=7, int Jmax=7, int Kmax=2 ) //или какие там у тебя цифры должны быть

тогда вызов может быть обычным, а размерности будут видны функции (естественно, это же ее параметры )

Вызов :

output(3,2,4); //например
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 10.01.2010, 16:08   #9
frem-dag
Пользователь
 
Регистрация: 29.11.2009
Сообщений: 23
По умолчанию

Ясно, спасибо большое, с этим разобрался
А если оформить это не в виде отдельной функции, тогда код примерно таким должен быть?

Код:
#include <iostream.h>

using namespace std;

int main()
{
    const Imax=3, Jmax=7, Kmax=2;
    int i,j,k;
    int a[Imax][Jmax][Kmax];
    for(i=0;i<Imax;i++) //вводим трёхмерный массив
      for(j=0;j<Jmax;j++)
        for(k=0;k<Kmax;k++)
          cin>>a[i][j];
    cin>>i; //пользователь вводит координаты нужного элемента
    cin>>j;
    cin>>k;
    if(i>=Imax) //проверка принадлежности к нужному массиву
      return -1;
    if(j>=Jmax)
      return -1;
    if(k>=Kmax)
      return -1;
    cout << a[i][j][k];
    return 0;
}
frem-dag вне форума Ответить с цитированием
Старый 10.01.2010, 16:48   #10
Darth.Vader
Пользователь
 
Аватар для Darth.Vader
 
Регистрация: 04.12.2009
Сообщений: 63
По умолчанию

А не легче не мудрить с глобальными \локальными переменными, а сделать всё, к примеру, так:
Код:
#define IMAX 5
#define JMAX 5
#define KMAX 5
Darth.Vader вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
функция golf Помощь студентам 4 14.11.2009 16:27
функция Dialon Помощь студентам 4 02.02.2009 23:15
Функция Kloun1 Паскаль, Turbo Pascal, PascalABC.NET 5 24.01.2009 19:56
функция Janette Помощь студентам 1 29.04.2008 20:10
одна функция потока, а другая функция - член класса запускающего этот поток Дмитрий_Ч Общие вопросы C/C++ 2 27.09.2007 08:50