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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.11.2011, 15:06   #21
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Во-первых. Функция у нас про какие-то 20 знать не знает, и ведать не ведает. Вообще, при написании кода функции очень полезно постараться забыть обо всём, кроме заявленного поведения функции (которое надо реализовать) и её входных аргументов.
По счастью, у нас есть аргумент maxLength и компилятор должен был выдать предупреждение о том, что переменная maxLength объявлена, но не использована. Если не выдал, советую покопаться в настройках компилятора, найти пункт "писать все предупреждения" и включить его. Внимательное чтение предупреждений (а не только сообщений об ошибках) компилятора способно спасти от многих неприятностей.
Что ж, мы сравниваем length с maxLength, если случилась фигня - выдаём сообщение об ошибке. А что дальше? Есть два варианта - либо по новой потребовать ввести длину, и так пока она нас не устроит (как это сделать?), либо как-то сообщить вызвавшему коду, что у нас случилась неприятность, массив не введён (а как Вы бы сделали это?).
Abstraction вне форума Ответить с цитированием
Старый 08.11.2011, 15:45   #22
(=Hello=)
Пользователь
 
Регистрация: 24.02.2011
Сообщений: 39
По умолчанию

О как) Ну тогда сравниваем length и maxlength, и если maxlength<length, то выдаём ошибку и выходим. Вот так:
Код:
if (length>maxlength)
{
printf("ошибка ввода!\n");
getch();
exit(0);
}
(=Hello=) вне форума Ответить с цитированием
Старый 08.11.2011, 15:54   #23
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Как вариант. Только сообщение лучше бы поинформативней: лично я бы на такую формулировку долго медитировал.

Есть ещё вариант с возвращаемым значением: вместо exit(0) return 0. В определённом смысле, это вполне логично: в массиве не случилось элементов. После этого в main можно или так и продолжить, или отдельно проверить, что возвращённое Input значение больше нуля.
Abstraction вне форума Ответить с цитированием
Старый 08.11.2011, 16:06   #24
(=Hello=)
Пользователь
 
Регистрация: 24.02.2011
Сообщений: 39
По умолчанию

А функция для произведения элементов такая?
Код:
float PrElementsOfArray(float* array, int length)
{
float prod;
int i;
for (prod=1,i=0;i<length;i++)
{
prod+=array[i];
}
return prod;
}
И главная функция
Код:
void main(void)
{
float x[20],prod;
int length=Input(x,20);
Output(x,length);
prod=PrElementsOfArray(x,length);
printf("\nпроизведение элементов:%4.0f",prod);
getch();
}
Но при вводе значений, он выводит произведение как сумма+1)
(=Hello=) вне форума Ответить с цитированием
Старый 08.11.2011, 16:14   #25
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

a+=b - это "прибавить b к a", a=a+b. "Домножить a на b" - это, соответственно, a*=b или a=a*b.
Abstraction вне форума Ответить с цитированием
Старый 08.11.2011, 16:17   #26
(=Hello=)
Пользователь
 
Регистрация: 24.02.2011
Сообщений: 39
По умолчанию

Ой блин)) Тупанул)
(=Hello=) вне форума Ответить с цитированием
Старый 08.11.2011, 16:18   #27
(=Hello=)
Пользователь
 
Регистрация: 24.02.2011
Сообщений: 39
По умолчанию

Спасибо большое.
(=Hello=) вне форума Ответить с цитированием
Старый 08.11.2011, 19:33   #28
(=Hello=)
Пользователь
 
Регистрация: 24.02.2011
Сообщений: 39
По умолчанию

Еще вопрос) Я ввожу какое-то количество элементов в группе и нахожу в ней сумму, но программа зацикливается и всё.
Код:
float SumElementsInGroup(float* array, int length)
{
int k,i;
float sumg;
printf("введите количество элементов в группе:\n");
scanf("%d",&k);
        for(i=0;i<length;i++)
  	 for (i=0;i<k-1;i++)
	    for (sumg=0,i=0;i<=k-1;i++)
		{
		sumg+=array[i];
		}
return 0;
}
//и вывод функции
void main(void)
{
int length;
float x[20],sumg;
length=Input(x,20);
sumg=SumElementsInGroup(x,length);
printf("\nсумма элементов в группе:%4.0f",sumg);
getch();
}

Последний раз редактировалось (=Hello=); 08.11.2011 в 19:35.
(=Hello=) вне форума Ответить с цитированием
Старый 08.11.2011, 21:46   #29
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Пожалуйста, привыкните писать комментарии. Мне вот так совершенно непонятно, какую мысль выражают эти три вложенных друг в друга цикла. Однако, если отметить комментариями состояния программы в определённые моменты, можно понять некоторые вещи.
Первое:
Код:
for(i=A; i<B; ++i){}
Если внутри тела цикла i не меняется и нет инструкций break, return и goto (а также прочих способов "выскакивать" из текущего места кода), а A не больше B, этот цикл прокрутится B-A раз. Что важно и достаточно очевидно, на выходе из цикла i будет равно B.
Код:
for(int i=A; i<B; ++i){}
Похожая форма, похожий смысл. Но на этот раз i - переменная, создаваемая "эксклюзивно" для цикла, за его пределами к ней нельзя будет обратиться. Что важно и уже не столь очевидно, если при этом в программе раньше уже была объявлена переменная i, она останется без изменений: при такой записи название i где угодно внутри цикла будет относиться к нашей "эксклюзивной" переменной, которая "затмевает" собой внешнюю. (Это общий принцип C++: если можно разрешить конфликт имён, он разрешается в пользу самой локальной переменной.)
Код:
for(X; Y; Z){A;}B;
Вообще, это означает: "Сделать X. Затем вычислить Y и если оно "ложно", перейти к B. Иначе же затем выполнить A, после чего Z, после чего снова вычислить Y и так далее..."
Это можно переписать следующим образом
Код:
X;
start_loop:
    if(Y) goto end_loop;//Если Y оказалось ложно сразу, A не выполнится ни единого раза.
    A;
    Z;//Обратите внимание на порядок! На этом иногда попадаются.
    goto start_loop;
end_loop: //Сюда мы попали только если Y оказалось ложно
B;
А теперь, в свете вышесказанного, смотрим код:
Код:
  for(i=0;i<length;i++){
    for (i=0;i<k-1;i++){
      for (sumg=0,i=0;i<=k-1;i++)
      {
        sumg+=array[i];
      }//Мы вышли отсюда - значит, i==k
      //Теперь во втором цикле i увеличится на 1 и сравнится с k-1
    }//Мы сразу из него и выйдем, i==k+1
    //Теперь i опять увеличится на 1 (i==k+2) и сравнится с length
    //Но если k+2<length, то мы снова уйдём на второй цикл, а в нём первым делом
    //i=0 и всё повторится! И ещё, и ещё - пока пользователю не надоест.
  }

Последний раз редактировалось Abstraction; 08.11.2011 в 21:48.
Abstraction вне форума Ответить с цитированием
Старый 09.11.2011, 15:27   #30
(=Hello=)
Пользователь
 
Регистрация: 24.02.2011
Сообщений: 39
По умолчанию

Ясно, и тут проблема, функция выводит исходный массив вместо конечного
Код:
float OutputArray(float* array, int length)
{
int i,k,sumg;
for (i>k+1;i<length;i++)  //от k+1 до length заменяем все элементы на 0
{
array[i]=0;
}
array[k]=sumg;      //значение array[k] равно сумме элементов в группе
printf("\nКонечный массив:");
for (i=0;i<length;i++)
{
printf("%4.0f",array[i]);
}
return 0;
}
(=Hello=) вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование функций в C++ из DLL. VintProg Общие вопросы C/C++ 5 04.09.2011 03:02
использование функций в качестве параметров других функций mono Помощь студентам 0 20.04.2009 18:25
Использование функций prikolist Общие вопросы C/C++ 15 06.04.2009 18:42
Использование логических функций Клубничка Microsoft Office Excel 52 15.01.2009 15:01
использование процедур и функций! ...Оленька... Паскаль, Turbo Pascal, PascalABC.NET 0 24.12.2008 15:33