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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.06.2010, 17:26   #1
DenSyntax
Новичок
Джуниор
 
Регистрация: 22.06.2010
Сообщений: 1
Печаль Определить:формат последовательности параметров & способ размещения последовательности переменных

Нужен мощный саппорт

Задача 1

Определить способ размещения последовательности переменных в общей области памяти, которая читается или заполняется функцией (формат). Для вызова функции задайте набор глобальных переменных (транслятор размещает их в соответствии с последовательностью их определения) и передайте функции указатель на первую из них.

Пример оформления тестового задания

Код:
//--------------------------------------------------------102-06.cpp
double F(int *p)                                      // по умолчанию - извлекается int
{ double s=0;                                         // начальная сумма равна 0
while (*p!=0){                                         // пока не извлечен нулевой int
            int n=*p++;                                // очередной int - счетчик цикла
            double *q=*((double**)p)++;         // следующий за ним - double*
            while (n--!=0) s+=*q++;               // суммирование массива
            }                                               // указателем q
return s; }
double d1[]={1,2,3,4};
double d2[]={5,6};
int a1=4;                                               // размерность первого массива
double *q1=d1;                                      // указатель на первый массив double*
int a2=2;                                               // размерность второго массива
double *q2=d2;                                      // указатель на второй массив double*
int a3=0;                                               // ограничитель последовательности
void main(){
printf("%lf\n",F(&a1));                              // Должна вывести 21 - сумму d1 и d2
}
Функция работает с указателем p, извлекая из-под него целые переменные, пока не обнаружит 0. Очередная переменная запоминается в n и используется в дальнейшем в качестве счетчика повторения цикла, то есть определяет количество элементов в некотором массиве. В том же цикле суммируемые значения извлекаются из-под указателя q типа double*, то есть речь идет о массиве вещественных. Остается определить, как формируется q. Он извлекается из той же последовательности, что и целые переменные - с использованием p. Для этого последний преобразуется "на лету" в указатель на извлекаемый тип, то есть приводится к типу double**. Таким образом, последовательность представляет собой пары переменных - целая размерность массива и указатель на сам вещественный массив. Размерность, равная 0 - ограничитель последовательности.


А вот и сама функция:

Код:
 union x {int *pi; long *pl; double *pd;};
 double F6(int *p)
 { union x ptr;
 double dd=0;
 for (ptr.pi=p; *ptr.pi !=0; )
           switch (*ptr.pi++) {
 case 1: dd += *ptr.pi++; break;
 case 2: dd += *ptr.pl++; break;
 case 3: dd += *ptr.pd++; break;
            }
 return dd;}
/////////////////////////////////////////////////////////////////

Задача 2

Определите формат последовательности параметров функции и напишите ее вызов с фактическими параметрами – константами.
Пример оформления тестового задания.


Код:
//----------------------------------------------------92-08.cpp
double F(int a1,...)                                  // Первый параметр - счетчик цикла
{ int i,n;
double s,*q=(double*)(&a1+1);                 // Указатель на второй и последующие
for (s=0, n=a1; n!=0; n--)             // параметры - типа double*
s += *q++;                                // Сумма параметров, начиная
return s;}                                               // со второго
void main() { printf("%lf\n",F(3,1.5,2.5,3.5)); }
Указатель q типа double* ссылается на второй параметр функции (первый из переменного списка) - &a1+1 – указатель на область памяти, «следующую за…». Первый параметр используется в качестве счетчика повторений цикла, цикл суммирует значения, последовательно извлекаемые из-под указателя q. Результат – функция суммирует вещественные переменные из списка, предваренного целым счетчиком.

А вот и сама функция:
Код:
 union xx { int *pi; long *pl; double *pd; };
 double F8(int p,...)
 { union xx ptr;
 double dd=0;
 for (ptr.pi = &p; *ptr.pi != 0; )
            {
         switch(*ptr.pi++) {
  case 1: dd+= *ptr.pi++; break;
  case 2: dd+= *ptr.pl++; break;
  case 3: dd+= *ptr.pd++; break;
         }}
 return dd;}

Последний раз редактировалось DenSyntax; 22.06.2010 в 17:40.
DenSyntax вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Необходимо определить n-ый член последовательности (рекурсии) фибоначи. ulaza Помощь студентам 3 21.01.2010 20:22
последовательности Ленка Паскаль, Turbo Pascal, PascalABC.NET 1 28.05.2009 19:00
Определить k-ую цифру последовательности Фибоначчи и последовательности натуральных чисел. Med Помощь студентам 1 20.03.2009 11:40
Определить, сколько раз в последовательности меняется знак Siroga35 Паскаль, Turbo Pascal, PascalABC.NET 1 22.01.2009 12:25